2013-02-03 11:05:20 +08:00
#!/usr/bin/env python
2013-10-31 10:50:03 +08:00
# pylint: disable=E1121
2013-02-03 11:05:20 +08:00
'''
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
2017-04-29 09:25:31 +08:00
init: create config files for seafile client
start: start and run seafile client as daemon
stop: stop seafile client
list: list local liraries
status: show syncing status
download: download a library from seafile server
(using libary id)
download-by-name: download a library from seafile server
(using library name)
sync: synchronize an existing folder with a library in
seafile server
desync: desynchronize a library with seafile server
create: create a new library
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
2017-04-29 09:25:31 +08:00
Download by id
2013-02-19 11:52:48 +08:00
--------
2017-04-29 09:25:31 +08:00
Download a library from seafile server (using library id)
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
2017-04-29 09:25:31 +08:00
Download by name
--------
Download a library from seafile server (using library name)
seaf-cli download -L <library-name> -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
2013-07-06 13:59:07 +08:00
create
------
Create a new library
seaf-cli create -s <seahub-server-url> -n <library-name> -u <username> -p <password> -t <description> [-e <library-password>]
2013-02-03 11:05:20 +08:00
'''
import argparse
2013-02-13 12:57:02 +08:00
import os
2014-07-09 19:42:50 +08:00
import 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
2014-12-15 17:40:14 +08:00
from urlparse import urlparse
2013-02-03 11:05:20 +08:00
import ccnet
import seafile
2014-10-27 07:49:52 +08:00
if 'HOME' in os.environ:
DEFAULT_CONF_DIR = "%s/.ccnet" % os.environ['HOME']
else:
DEFAULT_CONF_DIR = None
2013-02-13 12:57:02 +08:00
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
2016-04-27 06:26:35 +08:00
2016-05-27 14:03:06 +08:00
def _conf_dir(args):
2016-04-27 06:26:35 +08:00
''' Determine and return the value of conf_dir '''
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):
print "Invalid config directory"
sys.exit(1)
else:
return conf_dir
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()
2014-04-30 14:39:03 +08:00
SEAF_CLI_VERSION = ""
def get_peer_id(conf_dir):
pool = ccnet.ClientPool(conf_dir)
ccnet_rpc = ccnet.CcnetRpcClient(pool)
info = ccnet_rpc.get_session_info()
return info.id
def get_token(url, username, password, conf_dir):
platform = 'linux'
device_id = get_peer_id(conf_dir)
device_name = 'terminal-' + os.uname()[1]
client_version = SEAF_CLI_VERSION
platform_version = ''
data = {
'username': username,
'password': password,
'platform': platform,
'device_id': device_id,
'device_name': device_name,
'client_version': client_version,
'platform_version': platform_version,
}
2013-03-11 11:18:14 +08:00
token_json = urlopen("%s/api2/auth-token/" % url, data=data)
tmp = json.loads(token_json)
token = tmp['token']
return token
2016-04-21 15:39:09 +08:00
def get_repo_download_info(url, token):
2013-03-11 11:18:14 +08:00
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):
2016-04-27 05:59:01 +08:00
''' Initialize config directories'''
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):
2016-04-27 06:07:02 +08:00
print "%s already exists" % 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:
2016-04-27 05:59:01 +08:00
print "Failed to init ccnet"
2013-03-11 11:18:14 +08:00
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):
2016-04-27 05:59:01 +08:00
''' Start ccnet and seafile daemon '''
2013-02-03 11:05:20 +08:00
seaf_start_ccnet(args)
# wait ccnet process
time.sleep(1)
seaf_start_seafile(args)
def seaf_start_ccnet(args):
2016-04-27 05:59:01 +08:00
''' Start ccnet daemon '''
2013-02-03 11:05:20 +08:00
2016-05-27 14:03:06 +08:00
conf_dir = _conf_dir(args)
2013-02-03 11:05:20 +08:00
2016-04-27 05:59:01 +08:00
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:
2016-04-27 05:59:01 +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 '''
2016-05-27 14:03:06 +08:00
conf_dir = _conf_dir(args)
2013-02-03 11:05:20 +08:00
2016-04-27 05:59:01 +08:00
print "Starting seafile daemon ..."
2013-10-31 10:50:03 +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):
2016-04-27 05:59:01 +08:00
'''Stop seafile daemon '''
2013-02-19 11:52:48 +08:00
2016-05-27 14:03:06 +08:00
conf_dir = _conf_dir(args)
2013-02-19 11:52:48 +08:00
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'''
2016-05-27 14:03:06 +08:00
conf_dir = _conf_dir(args)
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)
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
2016-03-12 08:02:40 +08:00
def seaf_list_remote(args):
'''List remote libraries'''
2016-05-27 14:03:06 +08:00
conf_dir = _conf_dir(args)
2016-03-12 08:02:40 +08:00
url = args.server
if not url:
print "Seafile server url need to be presented"
sys.exit(1)
pool = ccnet.ClientPool(conf_dir)
seafile_rpc = seafile.RpcClient(pool, req_pool=False)
username = args.username
if not username:
username = raw_input("Enter username: ")
password = args.password
if not password:
password = getpass.getpass("Enter password for user %s : " % username)
# curl -d 'username=<USERNAME>&password=<PASSWORD>' http://127.0.0.1:8000/api2/auth-token
token = get_token(url, username, password, conf_dir)
2016-04-21 15:39:09 +08:00
repos = get_repo_download_info("%s/api2/repos/" % (url), token)
printed = {}
2016-03-12 08:02:40 +08:00
print "Name\tID"
for repo in repos:
2016-04-21 15:39:09 +08:00
if repo['id'] in printed:
continue
printed[repo['id']] = repo['id']
2016-03-12 08:02:40 +08:00
print repo['name'], repo['id']
2014-12-15 17:40:14 +08:00
def get_base_url(url):
parse_result = urlparse(url)
scheme = parse_result.scheme
netloc = parse_result.netloc
if scheme and netloc:
return '%s://%s' % (scheme, netloc)
return None
2013-02-16 21:34:07 +08:00
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
2016-05-27 14:03:06 +08:00
conf_dir = _conf_dir(args)
2013-02-03 11:05:20 +08:00
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-10-31 10:50:03 +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
2014-04-30 14:39:03 +08:00
token = get_token(url, username, password, conf_dir)
2013-02-03 11:05:20 +08:00
2016-04-21 15:39:09 +08:00
tmp = get_repo_download_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-10-31 10:50:03 +08:00
magic = tmp.get('magic', None)
enc_version = tmp.get('enc_version', None)
random_key = tmp.get('random_key', None)
2013-02-03 11:05:20 +08:00
clone_token = tmp['token']
relay_id = tmp['relay_id']
relay_addr = tmp['relay_addr']
2015-07-28 19:59:25 +08:00
relay_port = str(tmp['relay_port'])
2013-02-03 11:05:20 +08:00
email = tmp['email']
repo_name = tmp['repo_name']
2014-04-21 19:11:35 +08:00
version = tmp.get('repo_version', 0)
2013-02-03 11:05:20 +08:00
2014-12-15 17:40:14 +08:00
more_info = None
2015-07-06 16:40:51 +08:00
base_url = get_base_url(url)
if base_url:
more_info = json.dumps({'server_url': base_url})
2014-12-15 17:40:14 +08:00
2013-10-31 10:50:03 +08:00
print "Starting to download ..."
2013-02-13 12:57:02 +08:00
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-10-31 10:50:03 +08:00
2013-02-13 12:57:02 +08:00
seafile_rpc.download(repo,
2014-04-21 19:11:35 +08:00
version,
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,
2014-12-15 17:40:14 +08:00
email, random_key, enc_version, more_info)
2013-10-31 10:50:03 +08:00
2013-02-03 11:05:20 +08:00
2016-03-12 08:02:40 +08:00
def seaf_download_by_name(args):
'''Download a library defined by name from seafile server'''
id = None
2016-05-27 14:03:06 +08:00
conf_dir = _conf_dir(args)
2016-03-12 08:02:40 +08:00
libraryname = args.libraryname
if not libraryname:
print "Library name is required"
sys.exit(1)
url = args.server
if not url:
print "Seafile server url need to be presented"
sys.exit(1)
pool = ccnet.ClientPool(conf_dir)
seafile_rpc = seafile.RpcClient(pool, req_pool=False)
username = args.username
if not username:
username = raw_input("Enter username: ")
args.username = username
password = args.password
if not password:
password = getpass.getpass("Enter password for user %s : " % username)
args.password = password
# curl -d 'username=<USERNAME>&password=<PASSWORD>' http://127.0.0.1:8000/api2/auth-token
token = get_token(url, username, password, conf_dir)
2016-04-21 15:39:09 +08:00
tmp = get_repo_download_info("%s/api2/repos/" % (url), token)
2016-03-12 08:02:40 +08:00
for i in tmp:
if libraryname == i['name']:
id = i['id']
if not id:
print "Defined library name not found"
sys.exit(1)
args.library = id
seaf_download(args)
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
2016-05-27 14:03:06 +08:00
conf_dir = _conf_dir(args)
2013-02-03 11:05:20 +08:00
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"
2013-10-31 10:50:03 +08:00
sys.exit(1)
2013-02-16 21:34:07 +08:00
folder = os.path.abspath(folder)
if not os.path.exists(folder):
print "The local directory does not exists"
2013-10-31 10:50:03 +08:00
sys.exit(1)
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-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:
2013-10-31 10:50:03 +08:00
password = getpass.getpass("Enter password for user %s : " % username)
2013-02-16 21:34:07 +08:00
2014-04-30 14:39:03 +08:00
token = get_token(url, username, password, conf_dir)
2016-04-21 15:39:09 +08:00
tmp = get_repo_download_info("%s/api2/repos/%s/download-info/" % (url, repo), token)
2013-02-16 21:34:07 +08:00
encrypted = tmp['encrypted']
2013-10-31 10:50:03 +08:00
magic = tmp.get('magic', None)
enc_version = tmp.get('enc_version', None)
random_key = tmp.get('random_key', None)
2013-02-16 21:34:07 +08:00
clone_token = tmp['token']
relay_id = tmp['relay_id']
relay_addr = tmp['relay_addr']
2015-07-28 19:59:25 +08:00
relay_port = str(tmp['relay_port'])
2013-02-16 21:34:07 +08:00
email = tmp['email']
repo_name = tmp['repo_name']
2014-04-21 19:11:35 +08:00
version = tmp.get('repo_version', 0)
2013-02-16 21:34:07 +08:00
2014-12-15 17:40:14 +08:00
more_info = None
2015-07-06 16:40:51 +08:00
base_url = get_base_url(url)
if base_url:
more_info = json.dumps({'server_url': base_url})
2014-12-15 17:40:14 +08:00
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,
2014-04-21 19:11:35 +08:00
version,
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,
2014-12-15 17:40:14 +08:00
email, random_key, enc_version, more_info)
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
2016-05-27 14:03:06 +08:00
conf_dir = _conf_dir(args)
2013-02-03 11:05:20 +08:00
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
2014-11-03 08:06:40 +08:00
def seaf_config(args):
'''Configure the seafile client'''
2016-05-27 14:03:06 +08:00
conf_dir = _conf_dir(args)
2014-11-03 08:06:40 +08:00
config_key = args.key
if not config_key:
print "Must specify configuration key"
sys.exit(1)
config_value = args.value
pool = ccnet.ClientPool(conf_dir)
seafile_rpc = seafile.RpcClient(pool, req_pool=False)
if config_value:
# set configuration key
seafile_rpc.seafile_set_config(config_key, config_value)
else:
# print configuration key
val = seafile_rpc.seafile_get_config(config_key)
print "%s = %s" % (config_key, val)
2013-02-17 15:49:53 +08:00
def seaf_status(args):
'''Show status'''
2013-02-18 11:21:11 +08:00
2016-05-27 14:03:06 +08:00
conf_dir = _conf_dir(args)
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-04-11 14:27:14 +08:00
auto_sync_enabled = seafile_rpc.is_auto_sync_enabled()
if not auto_sync_enabled or not repo.auto_sync:
2013-02-18 11:21:11 +08:00
print "%s\t%s" % (repo.name, "auto sync disabled")
continue
2013-02-17 15:49:53 +08:00
t = seafile_rpc.get_repo_sync_task(repo.id)
2015-08-20 15:38:31 +08:00
if not t:
print "%s\twaiting for sync" % repo.name
elif t.state == "error":
2015-07-06 16:40:51 +08:00
print "%s\t%s" % (repo.name, t.error)
2013-02-17 15:49:53 +08:00
else:
2015-07-06 16:40:51 +08:00
print "%s\t%s" % (repo.name, t.state)
2013-07-06 13:59:07 +08:00
def create_repo(url, token, args):
headers = { 'Authorization': 'Token %s' % token }
data = {
'name': args.name,
'desc': args.desc,
}
2013-12-03 21:21:57 +08:00
if args.libpasswd:
data['passwd'] = args.libpasswd
repo_info_json = urlopen(url, data=data, headers=headers)
repo_info = json.loads(repo_info_json)
return repo_info['repo_id']
2013-07-06 13:59:07 +08:00
def seaf_create(args):
'''Create a library'''
2014-04-30 14:39:03 +08:00
conf_dir = DEFAULT_CONF_DIR
if args.confdir:
conf_dir = args.confdir
conf_dir = os.path.abspath(conf_dir)
2013-07-06 13:59:07 +08:00
# check username and password
username = args.username
if not username:
username = raw_input("Enter username: ")
password = args.password
if not password:
password = getpass.getpass("Enter password for user %s " % username)
# check url
url = args.server
if not url:
print "Seafile server url need to be presented"
sys.exit(1)
# curl -d 'username=<USERNAME>&password=<PASSWORD>' http://127.0.0.1:8000/api2/auth-token
2014-04-30 14:39:03 +08:00
token = get_token(url, username, password, conf_dir)
2013-07-06 13:59:07 +08:00
2013-12-03 21:21:57 +08:00
repo_id = create_repo("%s/api2/repos/" % (url), token, args)
print repo_id
2013-07-06 13:59:07 +08:00
2013-02-03 11:05:20 +08:00
def main():
''' Main entry '''
_check_seafile()
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(title='subcommands', description='')
2014-10-27 07:49:52 +08:00
confdir_required = DEFAULT_CONF_DIR is None
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)
2014-10-27 07:49:52 +08:00
parser_init.add_argument('-c', '--confdir', help='the config directory', type=str, required=confdir_required)
2013-02-13 12:57:02 +08:00
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)
2014-10-27 07:49:52 +08:00
parser_start.add_argument('-c', '--confdir', help='the config directory', type=str, required=confdir_required)
2013-02-13 12:57:02 +08:00
2013-02-19 11:52:48 +08:00
# stop
parser_stop = subparsers.add_parser('stop',
2014-08-10 17:32:11 +08:00
help='Stop ccnet and seafile daemon')
2013-02-19 11:52:48 +08:00
parser_stop.set_defaults(func=seaf_stop)
2014-10-27 07:49:52 +08:00
parser_stop.add_argument('-c', '--confdir', help='the config directory', type=str, required=confdir_required)
2013-02-16 21:34:07 +08:00
# list
2014-08-10 17:32:11 +08:00
parser_list = subparsers.add_parser('list', help='List local libraries')
2013-02-16 21:34:07 +08:00
parser_list.set_defaults(func=seaf_list)
2014-10-27 07:49:52 +08:00
parser_list.add_argument('-c', '--confdir', help='the config directory', type=str, required=confdir_required)
2013-02-18 11:21:11 +08:00
2016-03-12 08:02:40 +08:00
# list-remote
parser_download = subparsers.add_parser('list-remote', help='List remote libraries')
parser_download.set_defaults(func=seaf_list_remote)
parser_download.add_argument('-c', '--confdir', help='the config directory', type=str, required=confdir_required)
parser_download.add_argument('-s', '--server', help='URL for seafile server', type=str)
parser_download.add_argument('-u', '--username', help='username', type=str)
parser_download.add_argument('-p', '--password', help='password', type=str)
2013-02-17 15:49:53 +08:00
# status
2014-08-10 17:32:11 +08:00
parser_status = subparsers.add_parser('status', help='Show syncing status')
2013-02-17 15:49:53 +08:00
parser_status.set_defaults(func=seaf_status)
2014-10-27 07:49:52 +08:00
parser_status.add_argument('-c', '--confdir', help='the config directory', type=str, required=confdir_required)
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)
2014-10-27 07:49:52 +08:00
parser_download.add_argument('-c', '--confdir', help='the config directory', type=str, required=confdir_required)
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
2016-03-12 08:02:40 +08:00
# download-by-name
parser_download = subparsers.add_parser('download-by-name',
help='Download a library defined by name from seafile server')
parser_download.set_defaults(func=seaf_download_by_name)
parser_download.add_argument('-c', '--confdir', help='the config directory', type=str, required=confdir_required)
parser_download.add_argument('-L', '--libraryname', help='library name', type=str)
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)
parser_download.add_argument('-u', '--username', help='username', type=str)
parser_download.add_argument('-p', '--password', help='password', type=str)
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)
2014-10-27 07:49:52 +08:00
parser_sync.add_argument('-c', '--confdir', help='the config directory', type=str, required=confdir_required)
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)
2014-10-27 07:49:52 +08:00
parser_desync.add_argument('-c', '--confdir', help='the config directory', type=str, required=confdir_required)
2013-02-13 12:57:02 +08:00
parser_desync.add_argument('-d', '--folder', help='the local folder', type=str)
2013-02-03 11:05:20 +08:00
2013-07-06 13:59:07 +08:00
# create
parser_create = subparsers.add_parser('create',
help='Create a library')
parser_create.set_defaults(func=seaf_create)
parser_create.add_argument('-n', '--name', help='library name', type=str)
parser_create.add_argument('-t', '--desc', help='library description', type=str)
parser_create.add_argument('-e', '--libpasswd', help='library password', type=str)
parser_create.add_argument('-s', '--server', help='URL for seafile server', type=str)
parser_create.add_argument('-u', '--username', help='username', type=str)
parser_create.add_argument('-p', '--password', help='password', type=str)
2014-10-27 07:49:52 +08:00
parser_create.add_argument('-c', '--confdir', help='the config directory', type=str, required=confdir_required)
2013-07-06 13:59:07 +08:00
2014-11-03 08:06:40 +08:00
# config
2014-11-03 08:12:34 +08:00
parser_config = subparsers.add_parser('config',
2014-11-03 08:06:40 +08:00
help='Configure seafile client')
2014-11-03 08:12:34 +08:00
parser_config.set_defaults(func=seaf_config)
parser_config.add_argument('-c', '--confdir', help='the config directory', type=str, required=confdir_required)
parser_config.add_argument('-k', '--key', help='configuration key', type=str)
parser_config.add_argument('-v', '--value', help='configuration value (if provided, key is set to this value)', type=str, required=False)
2014-11-03 08:06:40 +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()