2013-02-03 11:05:20 +08:00
#!/usr/bin/env python
'''
2013-02-13 12:57:02 +08:00
seaf-cli is command line interface for seafile client.
2013-02-03 11:05:20 +08:00
Subcommands:
2013-02-18 10:47:18 +08:00
2013-02-13 12:57:02 +08:00
init: create config files for seafile client
start: start and run seafile client as daemon
stop: stop seafile client
2013-02-18 10:47:18 +08:00
list: list local liraries
status: show syncing status
2013-02-13 12:57:02 +08:00
download: download a library from seafile server
2013-02-18 11:21:11 +08:00
sync: synchronize an existing folder with a library in
2013-02-13 12:57:02 +08:00
seafile server
desync: desynchronize a library with seafile server
2013-02-03 11:05:20 +08:00
2013-02-18 10:47:18 +08:00
Detail
======
Seafile client stores all its configure information in a config dir. The default location is `~/.ccnet`. All the commands below accept an option `-c <config-dir>`.
2013-02-03 11:05:20 +08:00
init
----
2013-02-18 11:21:11 +08:00
Initialize seafile client. This command initializes the config dir. It also creates sub-directories `seafile-data` and `seafile` under `parent-dir`. `seafile-data` is used to store internal data, while `seafile` is used as the default location put downloaded libraries.
2013-02-03 11:05:20 +08:00
2013-02-18 10:47:18 +08:00
seaf-cli init [-c <config-dir>] -d <parent-dir>
2013-02-03 11:05:20 +08:00
start
-----
2013-02-13 12:57:02 +08:00
Start seafile client. This command start `ccnet` and `seaf-daemon`, `ccnet` is the network part of seafile client, `seaf-daemon` manages the files.
2013-02-03 11:05:20 +08:00
2013-02-18 10:47:18 +08:00
seaf-cli start [-c <config-dir>]
2013-02-03 11:05:20 +08:00
2013-02-13 12:57:02 +08:00
stop
----
Stop seafile client.
2013-02-03 11:05:20 +08:00
2013-02-18 10:47:18 +08:00
seaf-cli stop [-c <config-dir>]
2013-02-16 21:34:07 +08:00
2013-02-19 11:52:48 +08:00
Download
--------
Download a library from seafile server
2013-02-13 12:57:02 +08:00
2013-02-19 11:52:48 +08:00
seaf-cli download -l <library-id> -s <seahub-server-url> -d <parent-directory> -u <username> -p <password>
2013-02-03 11:05:20 +08:00
sync
----
2013-02-13 12:57:02 +08:00
Synchronize a library with an existing folder.
2013-02-03 11:05:20 +08:00
2013-02-19 11:52:48 +08:00
seaf-cli sync -l <library-id> -s <seahub-server-url> -d <existing-folder> -u <username> -p <password>
2013-02-03 11:05:20 +08:00
desync
------
2013-02-13 12:57:02 +08:00
Desynchronize a library from seafile server
2013-02-03 11:05:20 +08:00
2013-02-18 10:47:18 +08:00
seaf-cli desync -d <existing-folder>
2013-02-03 11:05:20 +08:00
'''
import argparse
2013-02-13 12:57:02 +08:00
import os
import simplejson as json
2013-02-03 11:05:20 +08:00
import subprocess
2013-02-13 12:57:02 +08:00
import sys
2013-02-03 11:05:20 +08:00
import time
2013-02-20 15:13:47 +08:00
import getpass
2013-03-11 11:18:14 +08:00
import urllib
import urllib2
2013-02-03 11:05:20 +08:00
import ccnet
import seafile
2013-02-13 12:57:02 +08:00
DEFAULT_CONF_DIR = "%s/.ccnet" % os.environ['HOME']
seafile_datadir = None
seafile_worktree = None
2013-02-03 11:05:20 +08:00
def _check_seafile():
''' Check ccnet and seafile have been installed '''
dirs = os.environ['PATH'].split(':')
def exist_in_path(prog):
''' Check whether 'prog' exists in system path '''
for d in dirs:
if d == '':
2013-02-13 12:57:02 +08:00
continue
path = os.path.join(d, prog)
if os.path.exists(path):
return True
2013-02-03 11:05:20 +08:00
progs = [ 'ccnet', 'ccnet-init', 'seaf-daemon' ]
for prog in progs:
if not exist_in_path(prog):
2013-02-13 12:57:02 +08:00
print "%s not found in PATH. Have you installed seafile?" % prog
2013-02-03 11:05:20 +08:00
sys.exit(1)
def _config_valid(conf):
2013-02-16 21:34:07 +08:00
''' Check config directory valid '''
2013-02-03 11:05:20 +08:00
if not os.path.exists(conf) or not os.path.isdir(conf):
2013-02-13 12:57:02 +08:00
print "%s not exists" % conf
2013-02-03 11:05:20 +08:00
return False
config_conf = conf + "/ccnet.conf"
seafile_ini = conf + "/seafile.ini"
2013-02-13 12:57:02 +08:00
if not os.path.exists(config_conf):
2013-04-02 11:46:18 +08:00
print "Could not load %s" % config_conf
2013-02-13 12:57:02 +08:00
return False
if not os.path.exists(seafile_ini):
2013-04-02 11:46:18 +08:00
print "Could not load %s" % seafile_ini
2013-02-03 11:05:20 +08:00
return False
2013-02-13 12:57:02 +08:00
with open(seafile_ini) as f:
for line in f:
global seafile_datadir, seafile_worktree
seafile_datadir = line.strip()
seafile_worktree = os.path.join(
os.path.dirname(seafile_datadir), "seafile")
break
if not seafile_datadir or not seafile_worktree:
2013-04-02 11:46:18 +08:00
print "Could not load seafile_datadir and seafile_worktree"
2013-02-13 12:57:02 +08:00
return False
2013-02-03 11:05:20 +08:00
return True
2013-03-11 11:18:14 +08:00
def run_argv(argv, cwd=None, env=None, suppress_stdout=False, suppress_stderr=False):
'''Run a program and wait it to finish, and return its exit code. The
standard output of this program is supressed.
'''
with open(os.devnull, 'w') as devnull:
if suppress_stdout:
stdout = devnull
else:
stdout = sys.stdout
if suppress_stderr:
stderr = devnull
else:
stderr = sys.stderr
proc = subprocess.Popen(argv,
cwd=cwd,
stdout=stdout,
stderr=stderr,
env=env)
return proc.wait()
def get_env():
env = dict(os.environ)
ld_library_path = os.environ.get('SEAFILE_LD_LIBRARY_PATH', '')
if ld_library_path:
env['LD_LIBRARY_PATH'] = ld_library_path
return env
def urlopen(url, data=None, headers=None):
if data:
data = urllib.urlencode(data)
headers = headers or {}
req = urllib2.Request(url, data=data, headers=headers)
resp = urllib2.urlopen(req)
return resp.read()
def get_token(url, username, password):
data = { 'username': username, 'password': password }
token_json = urlopen("%s/api2/auth-token/" % url, data=data)
tmp = json.loads(token_json)
token = tmp['token']
return token
def get_repo_downlod_info(url, token):
headers = { 'Authorization': 'Token %s' % token }
repo_info = urlopen(url, headers=headers)
return json.loads(repo_info)
2013-02-03 11:05:20 +08:00
2013-02-13 12:57:02 +08:00
def seaf_init(args):
2013-02-16 21:34:07 +08:00
''' initialize config directorys'''
2013-02-03 11:05:20 +08:00
2013-02-13 12:57:02 +08:00
ccnet_conf_dir = DEFAULT_CONF_DIR
if args.confdir:
ccnet_conf_dir = args.confdir
if args.dir:
seafile_path = args.dir
2013-02-27 20:14:27 +08:00
else:
print "Must specify the parent path for put seafile-data"
sys.exit(0)
2013-02-13 12:57:02 +08:00
seafile_path = os.path.abspath(seafile_path)
2013-02-03 11:05:20 +08:00
2013-02-13 12:57:02 +08:00
if os.path.exists(ccnet_conf_dir):
2013-02-21 14:43:07 +08:00
print "%s already existed" % ccnet_conf_dir
2013-02-03 11:05:20 +08:00
sys.exit(0)
2013-02-27 20:14:27 +08:00
cmd = [ "ccnet-init", "-c", ccnet_conf_dir, "-n", "anonymous" ]
2013-03-11 11:18:14 +08:00
if run_argv(cmd, env=get_env()) != 0:
print 'failed to init ccnet'
sys.exit(1)
2013-02-03 11:05:20 +08:00
2013-02-13 12:57:02 +08:00
if not os.path.exists(seafile_path):
print "%s not exists" % seafile_path
sys.exit(0)
seafile_ini = ccnet_conf_dir + "/seafile.ini"
seafile_data = seafile_path + "/seafile-data"
2013-02-03 11:05:20 +08:00
fp = open(seafile_ini, 'w')
fp.write(seafile_data)
fp.close()
2013-02-13 12:57:02 +08:00
print "Writen seafile data directory %s to %s" % (seafile_data, seafile_ini)
2013-02-03 11:05:20 +08:00
def seaf_start_all(args):
''' start ccnet and seafile daemon '''
seaf_start_ccnet(args)
# wait ccnet process
time.sleep(1)
seaf_start_seafile(args)
def seaf_start_ccnet(args):
''' start ccnet daemon '''
2013-02-13 12:57:02 +08:00
conf_dir = DEFAULT_CONF_DIR
if args.confdir:
conf_dir = args.confdir
conf_dir = os.path.abspath(conf_dir)
2013-02-03 11:05:20 +08:00
2013-02-13 12:57:02 +08:00
if not _config_valid(conf_dir):
2013-04-02 23:39:32 +08:00
print "Invalid config directory"
2013-02-03 11:05:20 +08:00
sys.exit(1)
print "starting ccnet daemon ..."
2013-03-11 11:18:14 +08:00
2013-02-13 12:57:02 +08:00
cmd = [ "ccnet", "--daemon", "-c", conf_dir ]
2013-03-11 11:18:14 +08:00
if run_argv(cmd, env=get_env()) != 0:
2013-04-02 11:46:18 +08:00
print 'CCNet daemon failed to start.'
2013-03-11 11:18:14 +08:00
sys.exit(1)
2013-02-03 11:05:20 +08:00
2013-04-02 11:46:18 +08:00
print "Started: ccnet daemon ..."
2013-02-03 11:05:20 +08:00
def seaf_start_seafile(args):
''' start seafile daemon '''
2013-02-13 12:57:02 +08:00
conf_dir = DEFAULT_CONF_DIR
if args.confdir:
conf_dir = args.confdir
conf_dir = os.path.abspath(conf_dir)
2013-02-03 11:05:20 +08:00
2013-02-13 12:57:02 +08:00
if not _config_valid(conf_dir):
2013-04-02 11:46:18 +08:00
print "Invalid config directory"
2013-02-03 11:05:20 +08:00
sys.exit(1)
print "starting seafile daemon ..."
2013-03-11 11:18:14 +08:00
2013-02-13 12:57:02 +08:00
cmd = [ "seaf-daemon", "--daemon", "-c", conf_dir, "-d", seafile_datadir,
"-w", seafile_worktree ]
2013-03-11 11:18:14 +08:00
if run_argv(cmd, env=get_env()) != 0:
2013-04-02 11:46:18 +08:00
print 'Failed to start seafile daemon'
2013-03-11 11:18:14 +08:00
sys.exit(1)
2013-04-02 11:46:18 +08:00
print "Started: seafile daemon ..."
2013-02-03 11:05:20 +08:00
2013-02-19 11:52:48 +08:00
def seaf_stop(args):
'''stop seafile daemon '''
conf_dir = DEFAULT_CONF_DIR
if args.confdir:
conf_dir = args.confdir
conf_dir = os.path.abspath(conf_dir)
if not _config_valid(conf_dir):
2013-04-02 11:46:18 +08:00
print "Invalid config directory"
2013-02-19 11:52:48 +08:00
sys.exit(1)
pool = ccnet.ClientPool(conf_dir)
client = pool.get_client()
try:
client.send_cmd("shutdown")
except:
# ignore NetworkError("Failed to read from socket")
pass
2013-02-03 11:05:20 +08:00
2013-02-16 21:34:07 +08:00
def seaf_list(args):
'''List local libraries'''
conf_dir = DEFAULT_CONF_DIR
if args.confdir:
conf_dir = args.confdir
conf_dir = os.path.abspath(conf_dir)
if not _config_valid(conf_dir):
2013-04-02 11:46:18 +08:00
print "Invalid config directory"
2013-02-16 21:34:07 +08:00
sys.exit(1)
pool = ccnet.ClientPool(conf_dir)
2013-04-06 21:21:48 +08:00
seafile_rpc = seafile.RpcClient(pool, req_pool=False)
2013-02-18 11:21:11 +08:00
2013-02-16 21:34:07 +08:00
repos = seafile_rpc.get_repo_list(-1, -1)
2013-02-17 15:49:53 +08:00
print "Name\tID\tPath"
2013-02-16 21:34:07 +08:00
for repo in repos:
print repo.name, repo.id, repo.worktree
2013-02-13 12:57:02 +08:00
def seaf_download(args):
'''Download a library from seafile server '''
2013-02-03 11:05:20 +08:00
2013-02-13 12:57:02 +08:00
conf_dir = DEFAULT_CONF_DIR
if args.confdir:
conf_dir = args.confdir
conf_dir = os.path.abspath(conf_dir)
2013-02-03 11:05:20 +08:00
2013-02-13 12:57:02 +08:00
if not _config_valid(conf_dir):
2013-04-02 11:46:18 +08:00
print "Invalid config directory"
2013-02-03 11:05:20 +08:00
sys.exit(1)
2013-02-13 12:57:02 +08:00
repo = args.library
2013-02-03 11:05:20 +08:00
if not repo:
2013-02-16 21:34:07 +08:00
print "Library id is required"
2013-02-03 11:05:20 +08:00
sys.exit(1)
2013-02-13 12:57:02 +08:00
url = args.server
2013-02-03 11:05:20 +08:00
if not url:
2013-02-13 12:57:02 +08:00
print "Seafile server url need to be presented"
2013-02-03 11:05:20 +08:00
sys.exit(1)
2013-02-13 12:57:02 +08:00
download_dir = seafile_worktree
if args.dir:
download_dir = os.path.abspath(args.dir)
2013-02-03 11:05:20 +08:00
2013-02-13 12:57:02 +08:00
pool = ccnet.ClientPool(conf_dir)
2013-04-06 21:21:48 +08:00
seafile_rpc = seafile.RpcClient(pool, req_pool=False)
2013-02-03 11:05:20 +08:00
2013-02-19 11:52:48 +08:00
username = args.username
2013-02-03 11:05:20 +08:00
if not username:
username = raw_input("Enter username: ")
password = args.password
if not password:
2013-02-13 12:57:02 +08:00
password = getpass.getpass("Enter password for user %s " % username)
2013-02-03 11:05:20 +08:00
2013-02-20 15:13:47 +08:00
# curl -d 'username=<USERNAME>&password=<PASSWORD>' http://127.0.0.1:8000/api2/auth-token
2013-03-11 11:18:14 +08:00
token = get_token("%s/api2/auth-token/" % url, username, password)
2013-02-03 11:05:20 +08:00
2013-03-11 11:18:14 +08:00
tmp = get_repo_downlod_info("%s/api2/repos/%s/download-info/" % (url, repo), token)
2013-02-20 10:52:55 +08:00
2013-02-03 11:05:20 +08:00
encrypted = tmp['encrypted']
2013-02-20 10:52:55 +08:00
magic = None
if encrypted == 1:
magic = tmp['magic']
2013-02-03 11:05:20 +08:00
clone_token = tmp['token']
relay_id = tmp['relay_id']
relay_addr = tmp['relay_addr']
relay_port = tmp['relay_port']
email = tmp['email']
repo_name = tmp['repo_name']
2013-02-13 12:57:02 +08:00
print "starting to download ..."
print "Library %s will be downloaded to %s" % (repo, download_dir)
2013-02-20 10:52:55 +08:00
if encrypted == 1:
repo_passwd = getpass.getpass("Enter password for the library: ")
else:
repo_passwd = None
2013-02-13 12:57:02 +08:00
seafile_rpc.download(repo,
2013-02-18 11:21:11 +08:00
relay_id,
2013-02-13 12:57:02 +08:00
repo_name.encode('utf-8'),
download_dir.encode('utf-8'),
clone_token,
2013-02-20 10:52:55 +08:00
repo_passwd, magic,
2013-02-13 12:57:02 +08:00
relay_addr,
relay_port,
email)
2013-02-03 11:05:20 +08:00
def seaf_sync(args):
2013-02-13 12:57:02 +08:00
''' synchronize a library from seafile server '''
2013-02-03 11:05:20 +08:00
2013-02-13 12:57:02 +08:00
conf_dir = DEFAULT_CONF_DIR
if args.confdir:
2013-02-16 21:34:07 +08:00
conf_dir = args.confdir
2013-02-13 12:57:02 +08:00
conf_dir = os.path.abspath(conf_dir)
2013-02-03 11:05:20 +08:00
2013-02-13 12:57:02 +08:00
if not _config_valid(conf_dir):
2013-04-02 11:46:18 +08:00
print "Invalid config directory"
2013-02-03 11:05:20 +08:00
sys.exit(1)
2013-02-16 21:34:07 +08:00
repo = args.library
2013-02-03 11:05:20 +08:00
if not repo:
2013-02-16 21:34:07 +08:00
print "Library id is required"
sys.exit(1)
url = args.server
if not url:
print "Seafile server url is required"
2013-02-03 11:05:20 +08:00
sys.exit(1)
2013-02-16 21:34:07 +08:00
folder = args.folder
if not folder:
print "The local directory is required"
folder = os.path.abspath(folder)
if not os.path.exists(folder):
print "The local directory does not exists"
pool = ccnet.ClientPool(conf_dir)
2013-04-06 21:21:48 +08:00
seafile_rpc = seafile.RpcClient(pool, req_pool=False)
2013-02-03 11:05:20 +08:00
2013-02-19 11:52:48 +08:00
username = args.username
2013-02-16 21:34:07 +08:00
if not username:
username = raw_input("Enter username: ")
password = args.password
if not password:
password = getpass.getpass("Enter password for user %s " % username)
2013-03-11 11:18:14 +08:00
token = get_token(url, username, password)
tmp = get_repo_downlod_info("%s/api2/repos/%s/download-info/" % (url, repo), token)
2013-02-16 21:34:07 +08:00
encrypted = tmp['encrypted']
2013-02-20 10:52:55 +08:00
magic = None
if encrypted == 1:
magic = tmp['magic']
2013-02-16 21:34:07 +08:00
clone_token = tmp['token']
relay_id = tmp['relay_id']
relay_addr = tmp['relay_addr']
relay_port = tmp['relay_port']
email = tmp['email']
repo_name = tmp['repo_name']
2013-04-02 11:46:18 +08:00
print "Starting to download ..."
2013-02-20 10:52:55 +08:00
if encrypted == 1:
repo_passwd = getpass.getpass("Enter password for the library: ")
else:
repo_passwd = None
2013-02-16 21:34:07 +08:00
seafile_rpc.clone(repo,
2013-02-18 11:21:11 +08:00
relay_id,
2013-02-16 21:34:07 +08:00
repo_name.encode('utf-8'),
2013-02-20 10:52:55 +08:00
folder,
2013-02-16 21:34:07 +08:00
clone_token,
2013-02-20 10:52:55 +08:00
repo_passwd, magic,
2013-02-16 21:34:07 +08:00
relay_addr,
relay_port,
email)
2013-02-03 11:05:20 +08:00
def seaf_desync(args):
2013-02-16 21:34:07 +08:00
'''Desynchronize a library from seafile server'''
2013-02-03 11:05:20 +08:00
2013-02-13 12:57:02 +08:00
conf_dir = DEFAULT_CONF_DIR
if args.confdir:
conf_dir = args.confdir
conf_dir = os.path.abspath(conf_dir)
2013-02-03 11:05:20 +08:00
2013-02-13 12:57:02 +08:00
if not _config_valid(conf_dir):
2013-04-02 11:46:18 +08:00
print "Invalid config directory"
2013-02-03 11:05:20 +08:00
sys.exit(1)
2013-02-16 21:34:07 +08:00
repo_path = args.folder
if not repo_path:
print "Must specify the local path of the library"
2013-02-03 11:05:20 +08:00
sys.exit(1)
2013-02-16 21:34:07 +08:00
repo_path = os.path.abspath(repo_path)
2013-02-03 11:05:20 +08:00
2013-02-16 21:34:07 +08:00
pool = ccnet.ClientPool(conf_dir)
2013-04-06 21:21:48 +08:00
seafile_rpc = seafile.RpcClient(pool, req_pool=False)
2013-02-18 11:21:11 +08:00
2013-02-16 21:34:07 +08:00
repos = seafile_rpc.get_repo_list(-1, -1)
repo = None
for r in repos:
2013-02-20 10:52:55 +08:00
if r.worktree == repo_path.decode('utf-8'):
2013-02-16 21:34:07 +08:00
repo = r
break
2013-02-03 11:05:20 +08:00
2013-02-16 21:34:07 +08:00
if repo:
print "Desynchronize %s" % repo.name
seafile_rpc.remove_repo(repo.id)
else:
print "%s is not a library" % args.folder
2013-02-03 11:05:20 +08:00
2013-02-17 15:49:53 +08:00
def seaf_status(args):
'''Show status'''
2013-02-18 11:21:11 +08:00
2013-02-17 15:49:53 +08:00
conf_dir = DEFAULT_CONF_DIR
if args.confdir:
conf_dir = args.confdir
conf_dir = os.path.abspath(conf_dir)
if not _config_valid(conf_dir):
2013-04-02 11:46:18 +08:00
print "Invalid config directory"
2013-02-17 15:49:53 +08:00
sys.exit(1)
2013-02-18 11:21:11 +08:00
2013-02-17 15:49:53 +08:00
pool = ccnet.ClientPool(conf_dir)
2013-04-06 21:21:48 +08:00
ccnet_rpc = ccnet.CcnetRpcClient(pool, req_pool=False)
seafile_rpc = seafile.RpcClient(pool, req_pool=False)
2013-02-17 15:49:53 +08:00
tasks = seafile_rpc.get_clone_tasks()
print "# Name\tStatus\tProgress"
for task in tasks:
if task.state == "fetch":
tx_task = seafile_rpc.find_transfer_task(task.repo_id)
2013-02-18 11:21:11 +08:00
print "%s\t%s\t%d/%d, %.1fKB/s" % (task.repo_name, "downloading",
2013-02-17 15:49:53 +08:00
tx_task.block_done, tx_task.block_total,
tx_task.rate/1024.0)
elif task.state == "checkout":
checkout_task = seafile_rpc.get_checkout_task(task.repo_id)
2013-02-18 11:21:11 +08:00
print "%s\t%s\t%d/%d" % (task.repo_name, "checkout",
2013-02-17 15:49:53 +08:00
checkout_task.finished_files,
checkout_task.total_files)
elif task.state == "error":
tx_task = seafile_rpc.find_transfer_task(task.repo_id)
2013-02-18 11:21:11 +08:00
if tx_task:
err = tx_task.error_str
else:
err = task.error_str
print "%s\t%s\t%s" % (task.repo_name, "error", err)
2013-02-21 14:43:07 +08:00
elif task.state == 'done':
2013-02-18 11:21:11 +08:00
# will be shown in repo status
pass
2013-02-17 15:49:53 +08:00
else:
print "%s\t%s" % (task.repo_name, "unknown")
# show repo status
print ""
print "# Name\tStatus"
repos = seafile_rpc.get_repo_list(-1, -1)
for repo in repos:
2013-02-18 11:21:11 +08:00
if not repo.auto_sync:
print "%s\t%s" % (repo.name, "auto sync disabled")
continue
2013-02-17 15:49:53 +08:00
relay = ccnet_rpc.get_peer(repo.props.relay_id)
t = seafile_rpc.get_repo_sync_task(repo.id)
if not relay.is_ready:
print "%s\t%s" % (repo.name, "connecting server")
else:
2013-02-20 15:13:47 +08:00
if not t:
# Relay is ready, but the sync task is not scheduled yet
# (shortly after seaf-daemon is started)
print "%s\t%s" % (repo.name, "initializing")
elif t.state == "error":
2013-02-17 15:49:53 +08:00
print "%s\t%s" % (repo.name, t.error)
else:
print "%s\t%s" % (repo.name, t.state)
2013-02-03 11:05:20 +08:00
def main():
''' Main entry '''
_check_seafile()
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(title='subcommands', description='')
2013-02-16 21:34:07 +08:00
# init
parser_init = subparsers.add_parser('init', help='Initialize config directory')
2013-02-13 12:57:02 +08:00
parser_init.set_defaults(func=seaf_init)
parser_init.add_argument('-c', '--confdir', help='the config directory', type=str)
parser_init.add_argument('-d', '--dir', help='the parent directory to put seafile-data', type=str)
2013-02-03 11:05:20 +08:00
2013-02-16 21:34:07 +08:00
# start
2013-02-03 11:05:20 +08:00
parser_start = subparsers.add_parser('start',
help='Start ccnet and seafile daemon')
parser_start.set_defaults(func=seaf_start_all)
2013-02-13 12:57:02 +08:00
parser_start.add_argument('-c', '--confdir', help='the config directory', type=str)
2013-02-19 11:52:48 +08:00
# stop
parser_stop = subparsers.add_parser('stop',
2013-02-16 21:34:07 +08:00
help='Start ccnet and seafile daemon')
2013-02-19 11:52:48 +08:00
parser_stop.set_defaults(func=seaf_stop)
parser_stop.add_argument('-c', '--confdir', help='the config directory', type=str)
2013-02-16 21:34:07 +08:00
# list
parser_list = subparsers.add_parser('list', help='list local libraries')
parser_list.set_defaults(func=seaf_list)
parser_list.add_argument('-c', '--confdir', help='the config directory', type=str)
2013-02-18 11:21:11 +08:00
2013-02-17 15:49:53 +08:00
# status
parser_status = subparsers.add_parser('status', help='show syncing status')
parser_status.set_defaults(func=seaf_status)
parser_status.add_argument('-c', '--confdir', help='the config directory', type=str)
2013-02-16 21:34:07 +08:00
# download
2013-02-13 12:57:02 +08:00
parser_download = subparsers.add_parser('download',
help='Download a library from seafile server')
parser_download.set_defaults(func=seaf_download)
parser_download.add_argument('-c', '--confdir', help='the config directory', type=str)
2013-02-17 15:49:53 +08:00
parser_download.add_argument('-l', '--library', help='library id', type=str)
2013-02-13 12:57:02 +08:00
parser_download.add_argument('-s', '--server', help='URL for seafile server', type=str)
parser_download.add_argument('-d', '--dir', help='the directory to put the library', type=str)
2013-02-19 11:52:48 +08:00
parser_download.add_argument('-u', '--username', help='username', type=str)
2013-02-13 12:57:02 +08:00
parser_download.add_argument('-p', '--password', help='password', type=str)
2013-02-03 11:05:20 +08:00
2013-02-16 21:34:07 +08:00
# sync
2013-02-03 11:05:20 +08:00
parser_sync = subparsers.add_parser('sync',
2013-02-13 12:57:02 +08:00
help='Sync a library with an existing foler')
2013-02-03 11:05:20 +08:00
parser_sync.set_defaults(func=seaf_sync)
2013-02-13 12:57:02 +08:00
parser_sync.add_argument('-c', '--confdir', help='the config directory', type=str)
2013-02-17 15:49:53 +08:00
parser_sync.add_argument('-l', '--library', help='library id', type=str)
2013-02-13 12:57:02 +08:00
parser_sync.add_argument('-s', '--server', help='URL for seafile server', type=str)
2013-02-19 11:52:48 +08:00
parser_sync.add_argument('-u', '--username', help='username', type=str)
2013-02-13 12:57:02 +08:00
parser_sync.add_argument('-p', '--password', help='password', type=str)
parser_sync.add_argument('-d', '--folder', help='the existing local folder', type=str)
2013-02-03 11:05:20 +08:00
2013-02-16 21:34:07 +08:00
# desync
2013-02-03 11:05:20 +08:00
parser_desync = subparsers.add_parser('desync',
2013-02-13 12:57:02 +08:00
help='Desync a library with seafile server')
2013-02-03 11:05:20 +08:00
parser_desync.set_defaults(func=seaf_desync)
2013-02-13 12:57:02 +08:00
parser_desync.add_argument('-c', '--confdir', help='the config directory', type=str)
parser_desync.add_argument('-d', '--folder', help='the local folder', type=str)
2013-02-03 11:05:20 +08:00
2013-03-08 11:14:36 +08:00
if len(sys.argv) == 1:
print parser.format_help()
return
2013-02-03 11:05:20 +08:00
args = parser.parse_args()
args.func(args)
if __name__ == '__main__':
main()