LazyShpee

blih

Mar 27th, 2015
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.51 KB | None | 0 0
  1. #!/usr/bin/env python3.3
  2.  
  3. #-
  4. # Copyright 2013-2014 Emmanuel Vadot <[email protected]>
  5. # All rights reserved
  6. #
  7. # Redistribution and use in source and binary forms, with or without
  8. # modification, are permitted providing that the following conditions
  9. # are met:
  10. # 1. Redistributions of source code must retain the above copyright
  11. # notice, this list of conditions and the following disclaimer.
  12. # 2. Redistributions in binary form must reproduce the above copyright
  13. # notice, this list of conditions and the following disclaimer in the
  14. # documentation and/or other materials provided with the distribution.
  15. #
  16. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  17. # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  18. # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  19. # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  20. # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  22. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  23. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  24. # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  25. # IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  26. # POSSIBILITY OF SUCH DAMAGE.
  27.  
  28. import os
  29. import sys
  30. import getopt
  31. import hmac
  32. import hashlib
  33. import urllib.request
  34. import urllib.parse
  35. import json
  36. import getpass
  37.  
  38. version = 1.7
  39.  
  40. class blih:
  41. def __init__(self, baseurl='https://blih.epitech.eu/', user=None, token=None, verbose=False, user_agent='blih-' + str(version)):
  42. self._baseurl = baseurl
  43. if token:
  44. self._token = token
  45. else:
  46. self.token_calc()
  47. if user == None:
  48. self._user = getpass.getuser()
  49. else:
  50. self._user = user
  51. self._verbose = verbose
  52. self._useragent = user_agent
  53.  
  54. def token_get(self):
  55. return self._token
  56.  
  57. def token_set(self, token):
  58. self._token = token
  59.  
  60. token = property(token_get, token_set)
  61.  
  62. def token_calc(self):
  63. self._token = bytes(hashlib.sha512(bytes(getpass.getpass(), 'utf8')).hexdigest(), 'utf8')
  64.  
  65. def sign_data(self, data=None):
  66. signature = hmac.new(self._token, msg=bytes(self._user, 'utf8'), digestmod=hashlib.sha512)
  67. if data:
  68. signature.update(bytes(json.dumps(data, sort_keys=True, indent=4, separators=(',', ': ')), 'utf8'))
  69.  
  70. signed_data = {'user' : self._user, 'signature' : signature.hexdigest()}
  71. if data != None:
  72. signed_data['data'] = data
  73.  
  74. return signed_data
  75.  
  76. def request(self, resource, method='GET', content_type='application/json', data=None, url=None):
  77. signed_data = self.sign_data(data)
  78.  
  79. if url:
  80. req = urllib.request.Request(url=url, method=method, data=bytes(json.dumps(signed_data), 'utf8'))
  81. else:
  82. req = urllib.request.Request(url=self._baseurl + resource, method=method, data=bytes(json.dumps(signed_data), 'utf8'))
  83. req.add_header('Content-Type', content_type)
  84. req.add_header('User-Agent', self._useragent)
  85.  
  86. try:
  87. f = urllib.request.urlopen(req)
  88. except urllib.error.HTTPError as e:
  89. print ('HTTP Error ' + str(e.code))
  90. data = json.loads(e.read().decode('utf8'))
  91. print ("Error message : '" + data['error'] + "'")
  92. sys.exit(1)
  93.  
  94. if f.status == 200:
  95. try:
  96. data = json.loads(f.read().decode('utf8'))
  97. except:
  98. print ("Can't decode data, aborting")
  99. sys.exit(1)
  100. return (f.status, f.reason, f.info(), data)
  101.  
  102. print ('Unknown error')
  103. sys.exit(1)
  104.  
  105. def repo_create(self, name, type='git', description=None):
  106. data = {'name' : name, 'type' : type}
  107. if description:
  108. data['description'] = description
  109. status, reason, headers, data = self.request('/repositories', method='POST', data=data)
  110. print (data['message'])
  111.  
  112. def repo_list(self):
  113. status, reason, headers, data = self.request('/repositories', method='GET')
  114. for i in data['repositories']:
  115. print (i)
  116.  
  117. def repo_delete(self, name):
  118. status, reason, headers, data = self.request('/repository/' + name, method='DELETE')
  119. print (data['message'])
  120.  
  121. def repo_info(self, name):
  122. status, reason, headers, data = self.request('/repository/' + name, method='GET')
  123. print (data['message'])
  124.  
  125. def repo_setacl(self, name, acluser, acl):
  126. data = {'user' : acluser, 'acl' : acl}
  127. status, reason, headers, data = self.request('/repository/' + name + '/acls', method='POST', data=data)
  128. print (data['message'])
  129.  
  130. def repo_getacl(self, name):
  131. status, reason, headers, data = self.request('/repository/' + name + '/acls', method='GET')
  132. for i in data.keys():
  133. print (i + ':' + data[i])
  134.  
  135. def sshkey_upload(self, keyfile):
  136. try:
  137. f = open(keyfile, 'r')
  138. except (PermissionError, FileNotFoundError):
  139. print ("Can't open file : " + keyfile)
  140. return
  141. key = urllib.parse.quote(f.read().strip('\n'))
  142. f.close()
  143. data = {'sshkey' : key}
  144. status, reason, headers, data = self.request('/sshkeys', method='POST', data=data)
  145. print (data['message'])
  146.  
  147. def sshkey_delete(self, sshkey):
  148. status, reason, headers, data = self.request('/sshkey/' + sshkey, method='DELETE')
  149. print (data['message'])
  150.  
  151. def sshkey_list(self):
  152. status, reason, headers, data = self.request('/sshkeys', method='GET')
  153. for i in data.keys():
  154. print (data[i] + ' ' + i)
  155.  
  156. def whoami(self):
  157. status, reason, headers, data = self.request('/whoami', method='GET')
  158. print (data['message'])
  159.  
  160. def usage_repository():
  161. print ('Usage: ' + sys.argv[0] + ' [options] repository command ...')
  162. print ()
  163. print ('Commands :')
  164. print ('\tcreate repo\t\t\t-- Create a repository named "repo"')
  165. print ('\tinfo repo\t\t\t-- Get the repository metadata')
  166. print ('\tgetacl repo\t\t\t-- Get the acls set for the repository')
  167. print ('\tlist\t\t\t\t-- List the repositories created')
  168. print ('\tsetacl repo user [acl]\t\t-- Set (or remove) an acl for "user" on "repo"')
  169. print ('\t\t\t\t\tACL format:')
  170. print ('\t\t\t\t\tr for read')
  171. print ('\t\t\t\t\tw for write')
  172. print ('\t\t\t\t\ta for admin')
  173. sys.exit(1)
  174.  
  175. def repository(args, baseurl, user, token, verbose, user_agent):
  176. if len(args) == 0:
  177. usage_repository()
  178. if args[0] == 'create':
  179. if len(args) != 2:
  180. usage_repository()
  181. handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent)
  182. handle.repo_create(args[1])
  183. elif args[0] == 'list':
  184. if len(args) != 1:
  185. usage_repository()
  186. handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent)
  187. handle.repo_list()
  188. elif args[0] == 'info':
  189. if len(args) != 2:
  190. usage_repository()
  191. handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent)
  192. handle.repo_info(args[1])
  193. elif args[0] == 'delete':
  194. if len(args) != 2:
  195. usage_repository()
  196. handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent)
  197. handle.repo_delete(args[1])
  198. elif args[0] == 'setacl':
  199. if len(args) != 4 and len(args) != 3:
  200. usage_repository()
  201. if len(args) == 3:
  202. acl = ''
  203. else:
  204. acl = args[3]
  205. handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent)
  206. handle.repo_setacl(args[1], args[2], acl)
  207. elif args[0] == 'getacl':
  208. if len(args) != 2:
  209. usage_repository()
  210. handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent)
  211. handle.repo_getacl(args[1])
  212. else:
  213. usage_repository()
  214.  
  215. def usage_sshkey():
  216. print ('Usage: ' + sys.argv[0] + ' [options] sshkey command ...')
  217. print ()
  218. print ('Commands :')
  219. print ('\tupload [file]\t\t\t-- Upload a new ssh-key')
  220. print ('\tlist\t\t\t\t-- List the ssh-keys')
  221. print ('\tdelete <sshkey>\t\t\t-- Delete the sshkey with comment <sshkey>')
  222. sys.exit(1)
  223.  
  224. def sshkey(args, baseurl, user, token, verbose, user_agent):
  225. if len(args) == 0:
  226. usage_sshkey()
  227. if args[0] == 'list':
  228. handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent)
  229. handle.sshkey_list()
  230. elif args[0] == 'upload':
  231. key = None
  232. if len(args) == 1:
  233. key = os.getenv('HOME') + '/.ssh/id_rsa.pub'
  234. elif len(args) == 2:
  235. key = args[1]
  236. else:
  237. usage_sshkey()
  238. handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent)
  239. handle.sshkey_upload(key)
  240. elif args[0] == 'delete':
  241. if len(args) != 2:
  242. usage_sshkey()
  243. handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent)
  244. handle.sshkey_delete(args[1])
  245. else:
  246. usage_sshkey()
  247.  
  248. def whoami(args, baseurl, user, token, verbose, user_agent):
  249. handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent)
  250. handle.whoami()
  251.  
  252. def usage():
  253. print ('Usage: ' + sys.argv[0] + ' [options] command ...')
  254. print ()
  255. print ('Global Options :')
  256. print ('\t-u user | --user=user\t\t-- Run as user')
  257. print ('\t-v | --verbose\t\t\t-- Verbose')
  258. print ('\t-b url | --baseurl=url\t\t-- Base URL for BLIH')
  259. print ('\t-t | --token\t\t\t-- Specify token in the cmdline')
  260. print ()
  261. print ('Commands :')
  262. print ('\trepository\t\t\t-- Repository management')
  263. print ('\tsshkey\t\t\t\t-- SSH-KEYS management')
  264. print ('\twhoami\t\t\t\t-- Print who you are')
  265. sys.exit(1)
  266.  
  267. if __name__ == "__main__":
  268. try:
  269. opts, args = getopt.getopt(sys.argv[1:], 'hvu:b:t:VU:', ['help', 'verbose', 'user=', 'baseurl=', 'token=', 'version', 'useragent='])
  270. except getopt.GetoptError as e:
  271. print (e)
  272. usage()
  273.  
  274. verbose = False
  275. user = None
  276. baseurl = 'https://blih.epitech.eu/'
  277. token = None
  278. user_agent = 'blih-' + str(version)
  279.  
  280. for o, a in opts:
  281. if o in ('-h', '--help'):
  282. usage()
  283. elif o in ('-v', '--verbose'):
  284. verbose = True
  285. elif o in ('-u', '--user'):
  286. user = a
  287. elif o in ('-b', '--baseurl'):
  288. baseurl = a
  289. elif o in ('-t', '--token'):
  290. token = bytes(a, 'utf8')
  291. elif o in ('-V', '--version'):
  292. print ('blih version ' + str(version))
  293. sys.exit(0)
  294. elif o in ('-U', '--useragent'):
  295. user_agent = a
  296. else:
  297. usage()
  298.  
  299. if len(args) == 0:
  300. usage()
  301.  
  302. if args[0] == 'repository':
  303. repository(args[1:], baseurl, user, token, verbose, user_agent)
  304. elif args[0] == 'sshkey':
  305. sshkey(args[1:], baseurl, user, token, verbose, user_agent)
  306. elif args[0] == 'whoami':
  307. whoami(args[1:], baseurl, user, token, verbose, user_agent)
  308. else:
  309. usage()
Advertisement
Add Comment
Please, Sign In to add comment