ssh_key.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from flask import Blueprint
  4. from flask import request
  5. import json
  6. import jimit as ji
  7. from api.base import Base
  8. from models import SSHKey
  9. from models import SSHKeyGuestMapping
  10. from models import Guest
  11. from models import Utils
  12. from models import Rules
  13. __author__ = 'James Iter'
  14. __date__ = '2018/2/26'
  15. __contact__ = 'james.iter.cn@gmail.com'
  16. __copyright__ = '(c) 2018 by James Iter.'
  17. blueprint = Blueprint(
  18. 'api_ssh_key',
  19. __name__,
  20. url_prefix='/api/ssh_key'
  21. )
  22. blueprints = Blueprint(
  23. 'api_ssh_keys',
  24. __name__,
  25. url_prefix='/api/ssh_keys'
  26. )
  27. ssh_key_base = Base(the_class=SSHKey, the_blueprint=blueprint, the_blueprints=blueprints)
  28. guest_base = Base(the_class=Guest, the_blueprint=blueprint, the_blueprints=blueprints)
  29. @Utils.dumps2response
  30. def r_create():
  31. args_rules = [
  32. Rules.LABEL.value,
  33. Rules.PUBLIC_KEY.value
  34. ]
  35. try:
  36. ret = dict()
  37. ret['state'] = ji.Common.exchange_state(20000)
  38. ji.Check.previewing(args_rules, request.json)
  39. ssh_key = SSHKey()
  40. ssh_key.label = request.json.get('label')
  41. ssh_key.public_key = request.json.get('public_key')
  42. if ssh_key.exist_by('public_key'):
  43. ret['state'] = ji.Common.exchange_state(40901)
  44. ret['state']['sub']['zh-cn'] = ''.join([ret['state']['sub']['zh-cn'], ': ', ssh_key.public_key])
  45. return ret
  46. ssh_key.create()
  47. return ret
  48. except ji.PreviewingError, e:
  49. return json.loads(e.message)
  50. @Utils.dumps2response
  51. def r_update(_id):
  52. ssh_key = SSHKey()
  53. args_rules = [
  54. Rules.ID.value
  55. ]
  56. if 'label' in request.json:
  57. args_rules.append(
  58. Rules.LABEL.value,
  59. )
  60. if 'public_key' in request.json:
  61. args_rules.append(
  62. Rules.PUBLIC_KEY.value,
  63. )
  64. if args_rules.__len__() < 2:
  65. ret = dict()
  66. ret['state'] = ji.Common.exchange_state(20000)
  67. return ret
  68. request.json['id'] = _id
  69. try:
  70. ji.Check.previewing(args_rules, request.json)
  71. ssh_key.id = request.json.get('id')
  72. ssh_key.get()
  73. ssh_key.label = request.json.get('label', ssh_key.label)
  74. ssh_key.public_key = request.json.get('public_key', ssh_key.public_key)
  75. ssh_key.update()
  76. ssh_key.get()
  77. ret = dict()
  78. ret['state'] = ji.Common.exchange_state(20000)
  79. ret['data'] = ssh_key.__dict__
  80. return ret
  81. except ji.PreviewingError, e:
  82. return json.loads(e.message)
  83. @Utils.dumps2response
  84. def r_get(ids):
  85. return ssh_key_base.get(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
  86. @Utils.dumps2response
  87. def r_get_by_filter():
  88. return ssh_key_base.get_by_filter()
  89. @Utils.dumps2response
  90. def r_content_search():
  91. return ssh_key_base.content_search()
  92. @Utils.dumps2response
  93. def r_delete(ids):
  94. return ssh_key_base.delete(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
  95. @Utils.dumps2response
  96. def r_bound(ssh_key_id):
  97. args_rules = [
  98. Rules.SSH_KEY_ID_EXT.value,
  99. ]
  100. try:
  101. ji.Check.previewing(args_rules, {'ssh_key_id': ssh_key_id})
  102. rows, _ = SSHKeyGuestMapping.get_by_filter(filter_str=':'.join(['ssh_key_id', 'eq', ssh_key_id]))
  103. guests_uuid = list()
  104. for row in rows:
  105. guests_uuid.append(row['guest_uuid'])
  106. request.args['filter_str'] = ':'.join(['uuid', 'in', ','.join(guests_uuid)])
  107. return guest_base.get_by_filter()
  108. except ji.PreviewingError, e:
  109. return json.loads(e.message)
  110. @Utils.dumps2response
  111. def r_unbound(ssh_key_id):
  112. args_rules = [
  113. Rules.SSH_KEY_ID_EXT.value,
  114. ]
  115. try:
  116. ji.Check.previewing(args_rules, {'ssh_key_id': ssh_key_id})
  117. rows, _ = SSHKeyGuestMapping.get_by_filter(filter_str=':'.join(['ssh_key_id', 'eq', ssh_key_id]))
  118. guests_uuid = list()
  119. for row in rows:
  120. guests_uuid.append(row['guest_uuid'])
  121. from werkzeug.datastructures import ImmutableMultiDict
  122. request.__setattr__('args', ImmutableMultiDict([
  123. ('filter', ':'.join(['uuid', 'notin', ','.join(guests_uuid)])),
  124. ('page_size', 10000)
  125. ]))
  126. x = guest_base.get_by_filter()
  127. return guest_base.get_by_filter()
  128. except ji.PreviewingError, e:
  129. return json.loads(e.message)
  130. @Utils.dumps2response
  131. def r_bind(ssh_key_id, uuids):
  132. args_rules = [
  133. Rules.SSH_KEY_ID_EXT.value,
  134. Rules.UUIDS.value
  135. ]
  136. try:
  137. ji.Check.previewing(args_rules, {'ssh_key_id': ssh_key_id, 'uuids': uuids})
  138. ret = dict()
  139. ret['state'] = ji.Common.exchange_state(20000)
  140. ssh_key = SSHKey()
  141. ssh_key.id = ssh_key_id
  142. # 判断 ssh_key id 为 ssh_key_id 的对象是否存在
  143. if not ssh_key.exist():
  144. ret['state'] = ji.Common.exchange_state(40401)
  145. ret['state']['sub']['zh-cn'] = ''.join([ret['state']['sub']['zh-cn'], ': ssh_key_id: ', ssh_key_id])
  146. return ret
  147. # 获取已经和该 ssh_key 绑定过的 guest uuid 集合,用于判断是否已经绑定过该 ssh_key,避免重复绑定
  148. rows, _ = SSHKeyGuestMapping.get_by_filter(filter_str=':'.join(['ssh_key_id', 'eq', ssh_key_id]))
  149. guests_uuid = list()
  150. for row in rows:
  151. guests_uuid.append(row['guest_uuid'])
  152. ssh_key_guest_mapping = SSHKeyGuestMapping()
  153. for uuid in uuids.split(','):
  154. # 如果已经绑定过,则忽略
  155. if uuid in guests_uuid:
  156. continue
  157. ssh_key_guest_mapping.ssh_key_id = ssh_key_id
  158. ssh_key_guest_mapping.guest_uuid = uuid
  159. ssh_key_guest_mapping.create()
  160. # 返回执行结果
  161. rows, _ = SSHKeyGuestMapping.get_by_filter(filter_str=':'.join(['ssh_key_id', 'eq', ssh_key_id]))
  162. guests_uuid = list()
  163. for row in rows:
  164. guests_uuid.append(row['guest_uuid'])
  165. request.args['filter_str'] = ':'.join(['uuid', 'in', ','.join(guests_uuid)])
  166. request.args['page_size'] = 10000
  167. return guest_base.get_by_filter()
  168. except ji.PreviewingError, e:
  169. return json.loads(e.message)
  170. @Utils.dumps2response
  171. def r_unbind(ssh_key_id, uuids):
  172. args_rules = [
  173. Rules.SSH_KEY_ID_EXT.value,
  174. Rules.UUIDS.value
  175. ]
  176. try:
  177. ji.Check.previewing(args_rules, {'ssh_key_id': ssh_key_id, 'uuids': uuids})
  178. ret = dict()
  179. ret['state'] = ji.Common.exchange_state(20000)
  180. # 获取已经和该 ssh_key 绑定过的映射集合,从中获取映射 id,用于解绑操作
  181. rows, _ = SSHKeyGuestMapping.get_by_filter(filter_str=':'.join(['ssh_key_id', 'eq', ssh_key_id]))
  182. guests_uuid = uuids.split(',')
  183. ssh_key_guest_mapping = SSHKeyGuestMapping()
  184. for row in rows:
  185. # 解除已经绑定过的 guest
  186. if row['guest_uuid'] in guests_uuid:
  187. ssh_key_guest_mapping.id = row['id']
  188. ssh_key_guest_mapping.delete()
  189. # 返回执行结果
  190. rows, _ = SSHKeyGuestMapping.get_by_filter(filter_str=':'.join(['ssh_key_id', 'eq', ssh_key_id]))
  191. guests_uuid = list()
  192. for row in rows:
  193. guests_uuid.append(row['guest_uuid'])
  194. request.args['filter_str'] = ':'.join(['uuid', 'in', ','.join(guests_uuid)])
  195. request.args['page_size'] = 10000
  196. return guest_base.get_by_filter()
  197. except ji.PreviewingError, e:
  198. return json.loads(e.message)