Package bootlegger :: Module cli
[hide private]
[frames] | no frames]

Source Code for Module bootlegger.cli

  1  import os 
  2  import sys 
  3  from .api import BootLegger 
  4  from ConfigParser import SafeConfigParser as ConfigParser 
  5  import json 
  6  import getpass 
  7  from .cryptfile import encrypt_file, decrypt_file 
  8  from Crypto import Random 
  9  from argparse import ArgumentParser 
 10   
 11  DEFAULT_HOST = 'localhost' 
 12   
13 -def perform_action(host, username, password, pubkey, privkey, args):
14 if args.subcommand == 'addkey': 15 bl = BootLegger(username, pubkey, privkey, host, password, False) 16 bl.add_pubkey() 17 sys.exit(0) 18 19 bl = BootLegger(username, pubkey, privkey, host, password) 20 21 if args.subcommand == 'upload': 22 if len(args.subargs) == 0: 23 return "no files to upload" 24 for fname in args.subargs: 25 if args.prefix: 26 rname = args.prefix + '_' + fname 27 else: rname = fname 28 29 bl.upload(fname, rname) 30 31 elif args.subcommand == 'download': 32 if len(args.subargs) == 0: 33 return "no files to download" 34 for fname in args.subargs: 35 lname = fname 36 37 if args.prefix: 38 fname = args.prefix + '_' + fname 39 40 if args.directory: 41 lname = os.path.join(args.directory, lname) 42 43 bl.download(fname, lname) 44 45 elif args.subcommand == 'list': 46 if len(args.subargs) > 0: 47 flist = bl.list_files(args.subargs[0]) 48 else: 49 flist = bl.list_files() 50 51 for fname in flist: 52 print fname 53 54 elif args.subcommand == 'info': 55 if len(args.subargs) == 0: 56 return "Must provide filename" 57 58 finfo = bl.get_info(args.subargs[0]) 59 60 for key in finfo: 61 print(key + ': ' + str(finfo[key])) 62 63 elif args.subcommand == 'share': 64 if len(args.subargs) < 2: 65 return "Must provide recipient and filenames" 66 recipient = args.subargs[0] 67 filenames = args.subargs[1:] 68 69 for fname in filenames: 70 bl.share(fname, recipient) 71 72 elif args.subcommand == 'versions': 73 if len(args.subargs) == 0: 74 return "must provide filename" 75 fname = args.subargs[0] 76 77 dates = bl.versions(fname) 78 79 for d in dates: 80 print(d) 81 82 elif args.subcommand == 'delete': 83 if len(args.subargs) == 0: 84 return "must provide filenames" 85 for fname in args.subargs: 86 bl.delete(fname)
87
88 -def main():
89 conf = ConfigParser() 90 conf.read([os.path.expanduser('~/.bootlegger/bootlegger.conf')]) 91 92 if len(sys.argv) < 2: 93 print "Usage: " + sys.argv[0] + " subcommand [args ... ]" 94 exit(1) 95 96 host = conf.get('speakeasy', 'host') or DEFAULT_HOST 97 username = conf.get('speakeasy', 'username') or getpass.getuser() 98 99 parser = ArgumentParser(description='interact with speakeasy') 100 parser.add_argument('subcommand', help='one of list, upload, download, share, addkey, versions') 101 parser.add_argument('subargs', nargs='*', help='arguments for subcommand') 102 parser.add_argument('--host', dest='host', 103 help='the host on which speakeasy is running') 104 parser.add_argument('--username', dest='username', 105 help='username to use when authenticating') 106 parser.add_argument('-p', '--prefix', dest='prefix', 107 help='the prefix you wish to use for all uploaded files') 108 parser.add_argument('-d', '--directory', dest='directory', 109 help='the directory to which files should be downloaded') 110 111 args = parser.parse_args() 112 113 if args.username: username = args.username 114 if args.host: host = args.host 115 116 pubkeyfname = '~/.bootlegger/' + username + '_public.pem' 117 privkeyfname = '~/.bootlegger/' + username + '_private.pem' 118 119 pubkey = open(os.path.expanduser(pubkeyfname)).read() 120 privkey = open(os.path.expanduser(privkeyfname)).read() 121 122 if 'ENCRYPTED' in privkey: 123 password = getpass.getpass('Password: ') 124 else: 125 password = '' 126 127 errmsg = perform_action(host, username, password, pubkey, privkey, args) 128 129 if errmsg: 130 print(errmsg) 131 sys.exit(1)
132 133
134 -def blencrypt():
135 if len(sys.argv) < 3: 136 print 'Usage: ' + sys.argv[0] + ' infile keyfile' 137 exit(1) 138 139 infname = sys.argv[1] 140 outfname = sys.argv[1] + '.bootleg' 141 142 with open(sys.argv[2], 'rb') as f: 143 key = f.read() 144 145 encrypt_file(infname, outfname, key)
146
147 -def bldecrypt():
148 if len(sys.argv) < 3: 149 print 'Usage: ' + sys.argv[0] + ' infile keyfile' 150 exit(1) 151 152 infname = sys.argv[1] 153 outfname, suffix = os.path.splitext(infname) 154 155 if suffix != '.bootleg': 156 print 'Input must be a .bootleg file' 157 exit(1) 158 159 with open(sys.argv[2], 'rb') as f: 160 key = f.read() 161 162 decrypt_file(infname, outfname, key)
163
164 -def blgenaeskey():
165 if len(sys.argv) < 2: 166 f = sys.stdout 167 else: 168 f = open(sys.argv[1], 'wb') 169 170 key = Random.new().read(32) 171 f.write(key) 172 173 f.close()
174