|
@@ -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
|