From da26d2a3b88d180b41af96b16a1db344e728650e Mon Sep 17 00:00:00 2001 From: Nigel Sim Date: Tue, 6 Jan 2015 13:33:53 +1000 Subject: [PATCH 1/8] added inital command line interface with list and upload --- easywebdav/__main__.py | 81 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 easywebdav/__main__.py diff --git a/easywebdav/__main__.py b/easywebdav/__main__.py new file mode 100644 index 0000000..36d1081 --- /dev/null +++ b/easywebdav/__main__.py @@ -0,0 +1,81 @@ +import sys +import os +import getopt +import urlparse +import easywebdav + +def print_help(): + print """ + %(cmd)s [args] + + commands: + upload uploads the file or folder + list list the remote folder + ls list the remote folder + """%{'cmd':sys.argv[0]} + +def connect(url): + """Connect to the remote server and return the Client object""" + parts = urlparse.urlparse(url) + + return easywebdav.connect(parts.hostname, username=parts.username, password=parts.password, protocol=parts.scheme, path=parts.path) + +def do_list(remote): + """Perform a listing of a folder""" + con = connect(remote) + for item in con.ls(): + print item + +def do_upload(local, remote): + """Upload a file or directory to a remote location""" + con = connect(remote) + if os.path.isfile(local): + try: + client.upload(local, os.path.basename(local)) + print "Uploaded OK: " + local + except: + print "Upload failed: " + local + raise + else: + # Uploading a directory + os.path.walk(local, _do_upload_dir, (client, local)) + +def _do_upload_dir(args, dirname, files): + """Callback for walking the directory tree and uploading files and folders. + This overwrites any existing files""" + con, basepath = args + relpath = os.path.relpath(dirname, basepath) + if not relpath.endswith('/'): + relpath += '/' + if not con.exists(relpath): + con.mkdirs(relpath) + for f_name in files: + try: + con.upload(os.path.join(basepath, relpath, f_name), relpath + f_name) + print "Uploaded OK: " + (relpath + f_name) + except: + print "Upload failed: " + (relpath + f_name) + raise + +if __name__ == '__main__': + opts, args = getopt.getopt(sys.argv[1:], 'r') + recursive = False + + for k, v in opts: + if k == '-r': + recursive = bool(v) + + if len(args) == 0: + print_help() + sys.exit(1) + + cmd = args.pop(0) + + if cmd in ('ls', 'list'): + do_list(*args) + elif cmd in ('upload'): + do_upload(*args) + else: + print "Unknown command: %s"%(cmd,) + print_help() + sys.exit(1) From 0794ce7254886e1d4b5b852fb66cbc1b63ab22d6 Mon Sep 17 00:00:00 2001 From: Nigel Sim Date: Tue, 6 Jan 2015 13:47:13 +1000 Subject: [PATCH 2/8] added the entrypoint script\ncleaned up unused opts --- easywebdav/__main__.py | 11 +++++------ setup.py | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/easywebdav/__main__.py b/easywebdav/__main__.py index 36d1081..9ca3a57 100644 --- a/easywebdav/__main__.py +++ b/easywebdav/__main__.py @@ -57,13 +57,9 @@ def _do_upload_dir(args, dirname, files): print "Upload failed: " + (relpath + f_name) raise -if __name__ == '__main__': - opts, args = getopt.getopt(sys.argv[1:], 'r') - recursive = False - for k, v in opts: - if k == '-r': - recursive = bool(v) +def main(): + opts, args = getopt.getopt(sys.argv[1:], '') if len(args) == 0: print_help() @@ -79,3 +75,6 @@ def _do_upload_dir(args, dirname, files): print "Unknown command: %s"%(cmd,) print_help() sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/setup.py b/setup.py index a2c8a3c..b598517 100644 --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ "requests", ], entry_points=dict( - console_scripts=[], + console_scripts=['easywebdav = easywebdav.__main__:main'], ), ) @@ -38,4 +38,4 @@ "PyWebDAV", )) -setup(**properties) \ No newline at end of file +setup(**properties) From ce28255ca16cbecb363c97b1a292ca402e927759 Mon Sep 17 00:00:00 2001 From: Nigel Sim Date: Tue, 6 Jan 2015 14:18:38 +1000 Subject: [PATCH 3/8] fixed invalid variable name --- easywebdav/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easywebdav/__main__.py b/easywebdav/__main__.py index 9ca3a57..359f9bd 100644 --- a/easywebdav/__main__.py +++ b/easywebdav/__main__.py @@ -38,7 +38,7 @@ def do_upload(local, remote): raise else: # Uploading a directory - os.path.walk(local, _do_upload_dir, (client, local)) + os.path.walk(local, _do_upload_dir, (con, local)) def _do_upload_dir(args, dirname, files): """Callback for walking the directory tree and uploading files and folders. From 872f792be26604e9eb01619860b1272a40fce671 Mon Sep 17 00:00:00 2001 From: Nigel Sim Date: Tue, 6 Jan 2015 14:23:37 +1000 Subject: [PATCH 4/8] added option to disable ssl verification --- easywebdav/__main__.py | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/easywebdav/__main__.py b/easywebdav/__main__.py index 359f9bd..1a54bc7 100644 --- a/easywebdav/__main__.py +++ b/easywebdav/__main__.py @@ -8,27 +8,32 @@ def print_help(): print """ %(cmd)s [args] + ops: + -i disable verifing SSL (insecure) + commands: upload uploads the file or folder list list the remote folder ls list the remote folder """%{'cmd':sys.argv[0]} -def connect(url): +def connect(url, verify_ssl=True): """Connect to the remote server and return the Client object""" parts = urlparse.urlparse(url) - return easywebdav.connect(parts.hostname, username=parts.username, password=parts.password, protocol=parts.scheme, path=parts.path) + return easywebdav.connect(parts.hostname, username=parts.username, \ + password=parts.password, protocol=parts.scheme, \ + path=parts.path, verify_ssl=verify_ssl) -def do_list(remote): +def do_list(remote, verify_ssl): """Perform a listing of a folder""" - con = connect(remote) + con = connect(remote, verify_ssl) for item in con.ls(): print item -def do_upload(local, remote): +def do_upload(local, remote, verify_ssl): """Upload a file or directory to a remote location""" - con = connect(remote) + con = connect(remote, verify_ssl) if os.path.isfile(local): try: client.upload(local, os.path.basename(local)) @@ -59,7 +64,12 @@ def _do_upload_dir(args, dirname, files): def main(): - opts, args = getopt.getopt(sys.argv[1:], '') + opts, args = getopt.getopt(sys.argv[1:], 'i') + + verify_ssl = True + for k,v in opts: + if k == '-s': + verify_ssl = False if len(args) == 0: print_help() @@ -68,9 +78,9 @@ def main(): cmd = args.pop(0) if cmd in ('ls', 'list'): - do_list(*args) + do_list(*args, verify_ssl=verify_ssl) elif cmd in ('upload'): - do_upload(*args) + do_upload(*args, verify_ssl=verify_ssl) else: print "Unknown command: %s"%(cmd,) print_help() From a042b259924229ca3bbeeb0dcb06ed0ae263c09d Mon Sep 17 00:00:00 2001 From: Nigel Sim Date: Tue, 6 Jan 2015 14:30:40 +1000 Subject: [PATCH 5/8] fixed wrong opt value\nfixed bad variable reference --- easywebdav/__main__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/easywebdav/__main__.py b/easywebdav/__main__.py index 1a54bc7..5f6e4fd 100644 --- a/easywebdav/__main__.py +++ b/easywebdav/__main__.py @@ -36,7 +36,7 @@ def do_upload(local, remote, verify_ssl): con = connect(remote, verify_ssl) if os.path.isfile(local): try: - client.upload(local, os.path.basename(local)) + con.upload(local, os.path.basename(local)) print "Uploaded OK: " + local except: print "Upload failed: " + local @@ -68,7 +68,7 @@ def main(): verify_ssl = True for k,v in opts: - if k == '-s': + if k == '-i': verify_ssl = False if len(args) == 0: From 2680d1ad277dff342d3aac848a0c463d1660be51 Mon Sep 17 00:00:00 2001 From: Nigel Sim Date: Tue, 6 Jan 2015 14:44:34 +1000 Subject: [PATCH 6/8] fix issue with nested directories --- easywebdav/__main__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/easywebdav/__main__.py b/easywebdav/__main__.py index 5f6e4fd..6572040 100644 --- a/easywebdav/__main__.py +++ b/easywebdav/__main__.py @@ -55,8 +55,11 @@ def _do_upload_dir(args, dirname, files): if not con.exists(relpath): con.mkdirs(relpath) for f_name in files: + f_path = os.path.join(basepath, relpath, f_name) + if not os.path.isfile(f_path): + continue try: - con.upload(os.path.join(basepath, relpath, f_name), relpath + f_name) + con.upload(f_path, relpath + f_name) print "Uploaded OK: " + (relpath + f_name) except: print "Upload failed: " + (relpath + f_name) From 4e0f550f41ee1b93dfb03a626bcf28b0c518ae02 Mon Sep 17 00:00:00 2001 From: Nigel Sim Date: Tue, 6 Jan 2015 14:58:05 +1000 Subject: [PATCH 7/8] added README docs and fixed up help screen --- README.md | 26 ++++++++++++++++++++++++++ easywebdav/__main__.py | 7 +++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 92304a6..e983f34 100644 --- a/README.md +++ b/README.md @@ -80,3 +80,29 @@ Running the tests: Running the tests with WebDAV server logs: WEBDAV_LOGS=1 nosetests --with-yanc --nologcapture --nocapture -v tests + +Command Line Usage +------------------ + +You can invoke the command line client either by calling teh easywebdav module: + + python -m easywebdav [opts] [args] + +or by using the entry point script that will be created when you install the library: + + easywebdav [opts] [args] + +CLI usage is as follows: + + easywebdav [opts] [args] + + ops: + -i disable verifing SSL (insecure) + + commands: + upload uploads the file or folder + list list the remote folder + ls list the remote folder + + Examples: + easywebdav -i list https://username:password@myserver.com/path diff --git a/easywebdav/__main__.py b/easywebdav/__main__.py index 6572040..aa140ac 100644 --- a/easywebdav/__main__.py +++ b/easywebdav/__main__.py @@ -6,15 +6,18 @@ def print_help(): print """ - %(cmd)s [args] + %(cmd)s [opts] [args] - ops: + opts: -i disable verifing SSL (insecure) commands: upload uploads the file or folder list list the remote folder ls list the remote folder + + Examples: + %(cmd)s -i list https://username:password@myserver.com/path """%{'cmd':sys.argv[0]} def connect(url, verify_ssl=True): From 48b62ef8debb9ca610de5c46bca9dfd56c7d8d23 Mon Sep 17 00:00:00 2001 From: Nigel Sim Date: Mon, 25 Jan 2016 12:34:05 +1000 Subject: [PATCH 8/8] Switched to argparse added mkdir/rmdir refactored code into __init__.py --- easywebdav/__init__.py | 108 ++++++++++++++++++++++++++++++++++++++++- easywebdav/__main__.py | 92 +---------------------------------- setup.py | 2 +- 3 files changed, 109 insertions(+), 93 deletions(-) diff --git a/easywebdav/__init__.py b/easywebdav/__init__.py index 4cf9bae..eeb9bce 100644 --- a/easywebdav/__init__.py +++ b/easywebdav/__init__.py @@ -1,5 +1,111 @@ -from .client import * +import sys +import os +import argparse +import urlparse +from easywebdav.client import Client + def connect(*args, **kwargs): """connect(host, port=0, auth=None, username=None, password=None, protocol='http', path="/")""" return Client(*args, **kwargs) + + +def cmd_connect(url, verify_ssl=True): + """Connect to the remote server and return the Client object""" + parts = urlparse.urlparse(url) + + return connect(parts.hostname, username=parts.username, + password=parts.password, protocol=parts.scheme, + path=parts.path, verify_ssl=verify_ssl), parts + + +def do_list(remote, verify_ssl): + """Perform a listing of a folder""" + con, parts = cmd_connect(remote, verify_ssl) + for item in con.ls(): + print item + + +def do_mkdir(remote, verify_ssl): + con, parts = cmd_connect(remote, verify_ssl) + con.mkdir('/') + print "Made", remote + + +def do_rmdir(remote, verify_ssl): + con, parts = cmd_connect(remote, verify_ssl) + con.rmdir('/') + print "Deleted", remote + + +def do_upload(local, remote, verify_ssl): + """Upload a file or directory to a remote location""" + con, parts = cmd_connect(remote, verify_ssl) + if os.path.isfile(local): + try: + con.upload(local, os.path.basename(local)) + print "Uploaded OK: " + local + except: + print "Upload failed: " + local + raise + else: + # Uploading a directory + os.path.walk(local, _do_upload_dir, (con, local)) + + +def _do_upload_dir(args, dirname, files): + """Callback for walking the directory tree and uploading files and folders. + This overwrites any existing files""" + con, basepath = args + relpath = os.path.relpath(dirname, basepath) + if not relpath.endswith('/'): + relpath += '/' + if not con.exists(relpath): + con.mkdirs(relpath) + for f_name in files: + f_path = os.path.join(basepath, relpath, f_name) + if not os.path.isfile(f_path): + continue + try: + con.upload(f_path, relpath + f_name) + print "Uploaded OK: " + (relpath + f_name) + except: + print "Upload failed: " + (relpath + f_name) + raise + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('-i', help="ignore SSL errors") + subparsers = parser.add_subparsers(dest='action') + + cmd_list = subparsers.add_parser('list') + cmd_list.add_argument('url', help="remote URL") + + cmd_upload = subparsers.add_parser('upload') + cmd_upload.add_argument('file', help="local file") + cmd_upload.add_argument('url', help="remote directory URL") + + cmd_delete = subparsers.add_parser('delete') + cmd_delete.add_argument('url', help="remote file URL") + + cmd_mkdir = subparsers.add_parser('mkdir') + cmd_mkdir.add_argument('url', help="URL to create") + + cmd_rmdir = subparsers.add_parser('rmdir') + cmd_rmdir.add_argument('url', help="remote dir URL to delete") + + args = parser.parse_args() + + if args.action == 'list': + do_list(args.url, verify_ssl=args.i) + elif args.action == 'upload': + do_upload(args.file, args.url, verify_ssl=args.i) + elif args.action == 'mkdir': + do_mkdir(args.url, verify_ssl=args.i) + elif args.action == 'rmdir': + do_rmdir(args.url, verify_ssl=args.i) + return 0 + +if __name__ == '__main__': + sys.exit(main()) diff --git a/easywebdav/__main__.py b/easywebdav/__main__.py index aa140ac..2869480 100644 --- a/easywebdav/__main__.py +++ b/easywebdav/__main__.py @@ -1,96 +1,6 @@ import sys -import os -import getopt -import urlparse import easywebdav -def print_help(): - print """ - %(cmd)s [opts] [args] - - opts: - -i disable verifing SSL (insecure) - - commands: - upload uploads the file or folder - list list the remote folder - ls list the remote folder - - Examples: - %(cmd)s -i list https://username:password@myserver.com/path - """%{'cmd':sys.argv[0]} - -def connect(url, verify_ssl=True): - """Connect to the remote server and return the Client object""" - parts = urlparse.urlparse(url) - - return easywebdav.connect(parts.hostname, username=parts.username, \ - password=parts.password, protocol=parts.scheme, \ - path=parts.path, verify_ssl=verify_ssl) - -def do_list(remote, verify_ssl): - """Perform a listing of a folder""" - con = connect(remote, verify_ssl) - for item in con.ls(): - print item - -def do_upload(local, remote, verify_ssl): - """Upload a file or directory to a remote location""" - con = connect(remote, verify_ssl) - if os.path.isfile(local): - try: - con.upload(local, os.path.basename(local)) - print "Uploaded OK: " + local - except: - print "Upload failed: " + local - raise - else: - # Uploading a directory - os.path.walk(local, _do_upload_dir, (con, local)) - -def _do_upload_dir(args, dirname, files): - """Callback for walking the directory tree and uploading files and folders. - This overwrites any existing files""" - con, basepath = args - relpath = os.path.relpath(dirname, basepath) - if not relpath.endswith('/'): - relpath += '/' - if not con.exists(relpath): - con.mkdirs(relpath) - for f_name in files: - f_path = os.path.join(basepath, relpath, f_name) - if not os.path.isfile(f_path): - continue - try: - con.upload(f_path, relpath + f_name) - print "Uploaded OK: " + (relpath + f_name) - except: - print "Upload failed: " + (relpath + f_name) - raise - - -def main(): - opts, args = getopt.getopt(sys.argv[1:], 'i') - - verify_ssl = True - for k,v in opts: - if k == '-i': - verify_ssl = False - - if len(args) == 0: - print_help() - sys.exit(1) - - cmd = args.pop(0) - - if cmd in ('ls', 'list'): - do_list(*args, verify_ssl=verify_ssl) - elif cmd in ('upload'): - do_upload(*args, verify_ssl=verify_ssl) - else: - print "Unknown command: %s"%(cmd,) - print_help() - sys.exit(1) if __name__ == '__main__': - main() + sys.exit(easywebdav.main()) diff --git a/setup.py b/setup.py index b598517..8745f99 100644 --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ "requests", ], entry_points=dict( - console_scripts=['easywebdav = easywebdav.__main__:main'], + console_scripts=['easywebdav = easywebdav:main'], ), )