Browse Source

file upload draft

boyska 4 years ago
parent
commit
14249c61b1
1 changed files with 82 additions and 0 deletions
  1. 82 0
      cli.py

+ 82 - 0
cli.py

@@ -1,8 +1,11 @@
 #!/usr/bin/env python3
 import sys
+import time
+import uuid
 from pprint import pprint
 import requests
 import argparse
+import os.path
 
 try:
     from colors import color
@@ -11,6 +14,14 @@ except ImportError:
     def color(text, *args, **kwargs):
         return text
 
+try:
+    from fsdb import Fsdb
+except ImportError:
+    Fsdb = None
+
+
+def err(msg):
+    print(color(msg, fg='red', style='bold'))
 
 def is_group_subscribed(mSubscribeFlags):
     return bool(mSubscribeFlags & 4)
@@ -165,6 +176,65 @@ def main_channel_post(args):
     return main_channel_post_v1(args)
 
 
+def _file_publish(args, fnames):
+    if Fsdb is None:
+        raise Exception('ERROR: library Fsdb is needed for file publishing')
+    store_dir = os.path.expanduser('~/.config/rscli/store/default')
+    fsdb = Fsdb(store_dir, fmode='660')
+
+    virtualname_path = os.path.join(store_dir, 'virtualname.txt')
+    if os.path.exists(virtualname_path):
+        virtualname = open(virtualname_path).read().strip()
+    else:
+        virtualname = 'rscli-%s' % uuid.uuid4()
+        open(virtualname_path, 'w').write(virtualname)
+    r = req(args, '/rsFiles/getSharedDirectories')
+    if virtualname not in [shared['virtualname'] for shared in r.json()['dirs']]:
+        r = req(args, '/rsFiles/addSharedDirectory', {'dir':{ 'filename': store_dir,
+                                                      'virtualname': virtualname
+                                                     }})
+        if not r.json()['retval']:
+            raise Exception("Error: could not create shared dir for default store")
+    r = req(args, '/rsFiles/getSharedDirectories')
+    dir_filename = [d['filename']
+                    for d in r.json()['dirs']
+                    if d['virtualname'] == virtualname][0]
+    r = req(args, '/rsFiles/requestDirDetails', { 'handle': 0 })
+    children = [c for c in r.json()['details']['children']
+                if c['name'] != '[Extra List]']
+    for possibile_root in children:
+        r = req(args, '/rsFiles/requestDirDetails',
+                { 'handle': possibile_root['handle'] })
+        found = [c for c in r.json()['details']['children']
+                 if c['name'] == dir_filename]
+        if not found:
+            raise Exception ('Error: could not find shared file in RS')
+        handle = found[0]['handle']
+
+    for fname in fnames:
+        digest = fsdb.add(fname)
+        r = req(args, '/rsFiles/ForceDirectoryCheck')
+        time.sleep(5)
+        # mo lo ricerchiamo va
+        looking_for = os.path.relpath(fsdb.get_file_path(digest),
+                                      store_dir).split(os.path.sep)
+        for next_component in looking_for:
+            r = req(args, '/rsFiles/requestDirDetails', { 'handle': handle })
+            found = [c for c in r.json()['details']['children']
+                     if c['name'] == next_component]
+            if not found:
+                raise Exception('Error: could not find shared file in RS')
+            handle = found[0]['handle']
+        r = req(args, '/rsFiles/requestDirDetails', { 'handle': handle })
+        filehash = r.json()['details']['hash']
+        yield filehash
+
+
+def main_file_publish(args):
+    ret = _file_publish(args, args.fnames)
+    for filehash, fname in zip(ret, args.fnames):
+        print(color(filehash, fg='green') + ' \t%s' % fname)
+
 def get_parser():
     p = argparse.ArgumentParser()
     p.add_argument("--endpoint", default="http://127.0.0.1:9092")
@@ -214,6 +284,18 @@ def get_parser():
     forum_read.add_argument("--num-posts", type=int, default=10)
     forum_read.set_defaults(mainfunc=main_forum_read)
 
+    files = p_sub.add_parser("file")
+    files_sub = files.add_subparsers()
+    files_list = files_sub.add_parser("publish")
+    files_list.add_argument(
+        "--fname",
+        nargs="+",
+        required=True,
+        dest='fnames'
+    )
+    files_list.set_defaults(mainfunc=main_file_publish)
+
+
     # TODO: channel rss -> read and convert to rss
 
     return p