IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an email to s dot adaszewski at gmail dot com. User accounts are meant only to report issues and/or generate pull requests. This is a purpose-specific Git hosting for ADARED projects. Thank you for your understanding!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

255 lines
10KB

  1. #
  2. # Copyright (C) Stanislaw Adaszewski, 2020
  3. # License: GNU General Public License v3.0
  4. # URL: https://github.com/sadaszewski/focker
  5. # URL: https://adared.ch/focker
  6. #
  7. from argparse import ArgumentParser
  8. import argparse
  9. import yaml
  10. import os
  11. from functools import reduce
  12. # from weir import zfs, process
  13. from .image import command_image_build, \
  14. command_image_tag, \
  15. command_image_untag, \
  16. command_image_list, \
  17. command_image_prune, \
  18. command_image_remove
  19. from .volume import command_volume_create, \
  20. command_volume_prune, \
  21. command_volume_list, \
  22. command_volume_tag, \
  23. command_volume_untag, \
  24. command_volume_remove, \
  25. command_volume_set, \
  26. command_volume_get, \
  27. command_volume_protect, \
  28. command_volume_unprotect
  29. import sys
  30. from .zfs import zfs_init
  31. from .jail import command_jail_create, \
  32. command_jail_start, \
  33. command_jail_stop, \
  34. command_jail_remove, \
  35. command_jail_exec, \
  36. command_jail_oneshot, \
  37. command_jail_list, \
  38. command_jail_tag, \
  39. command_jail_untag, \
  40. command_jail_prune
  41. from .compose import \
  42. command_compose_build, \
  43. command_compose_run
  44. from .bootstrap import command_bootstrap
  45. from .misc import focker_lock
  46. class ListForwarderFunctor(object):
  47. def __init__(self, lst):
  48. self.lst = lst
  49. def __call__(self, *args, **kwargs):
  50. res = []
  51. for elem in self.lst:
  52. res.append(elem(*args, **kwargs))
  53. return ListForwarder(res)
  54. class ListForwarder(object):
  55. def __init__(self, lst):
  56. self.lst = lst
  57. def __getattr__(self, name):
  58. return ListForwarderFunctor(list(map(lambda a: getattr(a, name), self.lst)))
  59. def __setattr__(self, name, value):
  60. if name == 'lst':
  61. super().__setattr__(name, value)
  62. return
  63. # print('setattr(), name:', name, 'value:', value)
  64. for elem in self.lst:
  65. setattr(elem, name, value)
  66. def create_parser():
  67. parser_top = ArgumentParser()
  68. subparsers_top = parser_top.add_subparsers(dest='L1_command')
  69. subparsers_top.required = True
  70. parser = ListForwarder([subparsers_top.add_parser(cmd) for cmd in ['bootstrap', 'boot', 'bs']])
  71. parser.set_defaults(func=command_bootstrap)
  72. parser.add_argument('--tags', '-t', type=str, nargs='+', default=None)
  73. parser.add_argument('--empty', '-e', action='store_true')
  74. parser.add_argument('--non-interactive', '-ni', action='store_true')
  75. # image
  76. subparsers = ListForwarder([ subparsers_top.add_parser(cmd).add_subparsers(dest='L2_command') \
  77. for cmd in ['image', 'ima', 'img', 'im', 'i'] ])
  78. subparsers.required = True
  79. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['build', 'bld', 'b']])
  80. parser.set_defaults(func=command_image_build)
  81. parser.add_argument('focker_dir', type=str)
  82. parser.add_argument('--tags', '-t', type=str, nargs='+', default=[])
  83. parser.add_argument('--squeeze', '-s', action='store_true')
  84. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['tag', 't']])
  85. parser.set_defaults(func=command_image_tag)
  86. parser.add_argument('reference', type=str)
  87. parser.add_argument('tags', type=str, nargs='+')
  88. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['untag', 'u']])
  89. parser.set_defaults(func=command_image_untag)
  90. parser.add_argument('tags', type=str, nargs='+', default=[])
  91. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['list', 'ls', 'l']])
  92. parser.set_defaults(func=command_image_list)
  93. parser.add_argument('--full-sha256', '-f', action='store_true')
  94. parser.add_argument('--tagged-only', '-t', action='store_true')
  95. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['prune', 'pru', 'p']])
  96. parser.set_defaults(func=command_image_prune)
  97. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['remove', 'rem', 'rm', 'r']])
  98. parser.set_defaults(func=command_image_remove)
  99. parser.add_argument('reference', type=str)
  100. # parser.add_argument('--remove-children', '-r', action='store_true')
  101. parser.add_argument('--remove-dependents', '-R', action='store_true')
  102. parser.add_argument('--force', '-f', action='store_true')
  103. # jail
  104. subparsers = ListForwarder([ subparsers_top.add_parser(cmd).add_subparsers(dest='L2_command') \
  105. for cmd in ['jail', 'j'] ])
  106. subparsers.required = True
  107. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['create', 'creat', 'cre', 'c']])
  108. parser.set_defaults(func=command_jail_create)
  109. parser.add_argument('image', type=str)
  110. parser.add_argument('--command', '-c', type=str, default='/bin/sh')
  111. parser.add_argument('--tags', '-t', type=str, nargs='+', default=[])
  112. parser.add_argument('--env', '-e', type=str, nargs='+', default=[])
  113. parser.add_argument('--mounts', '-m', type=str, nargs='+', default=[])
  114. parser.add_argument('--hostname', '-n', type=str)
  115. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['start', 'sta', 's']])
  116. parser.set_defaults(func=command_jail_start)
  117. parser.add_argument('reference', type=str)
  118. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['stop', 'sto', 'S']])
  119. parser.set_defaults(func=command_jail_stop)
  120. parser.add_argument('reference', type=str)
  121. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['remove', 'rem', 'rm', 'r']])
  122. parser.set_defaults(func=command_jail_remove)
  123. parser.add_argument('reference', type=str)
  124. parser.add_argument('--force', '-f', action='store_true')
  125. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['exec', 'exe', 'e']])
  126. parser.set_defaults(func=command_jail_exec)
  127. parser.add_argument('reference', type=str)
  128. parser.add_argument('command', type=str, nargs=argparse.REMAINDER, default=['/bin/sh'])
  129. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['oneshot', 'one', 'o']])
  130. parser.set_defaults(func=command_jail_oneshot)
  131. parser.add_argument('image', type=str)
  132. parser.add_argument('--env', '-e', type=str, nargs='+', default=[])
  133. parser.add_argument('--mounts', '-m', type=str, nargs='+', default=[])
  134. parser.add_argument('command', type=str, nargs=argparse.REMAINDER, default=['/bin/sh'])
  135. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['list', 'ls', 'l']])
  136. parser.set_defaults(func=command_jail_list)
  137. parser.add_argument('--full-sha256', '-f', action='store_true')
  138. parser.add_argument('--images', '-i', action='store_true')
  139. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['tag', 't']])
  140. parser.set_defaults(func=command_jail_tag)
  141. parser.add_argument('reference', type=str)
  142. parser.add_argument('tags', type=str, nargs='+')
  143. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['untag', 'u']])
  144. parser.set_defaults(func=command_jail_untag)
  145. parser.add_argument('tags', type=str, nargs='+')
  146. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['prune', 'pru', 'p']])
  147. parser.set_defaults(func=command_jail_prune)
  148. parser.add_argument('--force', '-f', action='store_true')
  149. # volume
  150. subparsers = ListForwarder([ subparsers_top.add_parser(cmd).add_subparsers(dest='L2_command') \
  151. for cmd in ['volume', 'vol', 'v'] ])
  152. subparsers.required = True
  153. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['create', 'creat', 'cre', 'c']])
  154. parser.set_defaults(func=command_volume_create)
  155. parser.add_argument('--tags', '-t', type=str, nargs='+', default=[])
  156. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['prune', 'pru', 'p']])
  157. parser.set_defaults(func=command_volume_prune)
  158. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['list', 'ls', 'l']])
  159. parser.set_defaults(func=command_volume_list)
  160. parser.add_argument('--full-sha256', '-f', action='store_true')
  161. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['tag', 't']])
  162. parser.set_defaults(func=command_volume_tag)
  163. parser.add_argument('reference', type=str)
  164. parser.add_argument('tags', type=str, nargs='+')
  165. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['untag', 'u']])
  166. parser.set_defaults(func=command_volume_untag)
  167. parser.add_argument('tags', type=str, nargs='+')
  168. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['remove', 'rm', 'r']])
  169. parser.set_defaults(func=command_volume_remove)
  170. parser.add_argument('references', type=str, nargs='+')
  171. parser.add_argument('--force', '-f', action='store_true')
  172. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['set', 's']])
  173. parser.set_defaults(func=command_volume_set)
  174. parser.add_argument('reference', type=str)
  175. parser.add_argument('properties', type=str, nargs=argparse.REMAINDER)
  176. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['get', 'g']])
  177. parser.set_defaults(func=command_volume_get)
  178. parser.add_argument('reference', type=str)
  179. parser.add_argument('properties', type=str, nargs=argparse.REMAINDER)
  180. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['protect']])
  181. parser.set_defaults(func=command_volume_protect)
  182. parser.add_argument('references', type=str, nargs='+')
  183. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['unprotect']])
  184. parser.set_defaults(func=command_volume_unprotect)
  185. parser.add_argument('references', type=str, nargs='+')
  186. # compose
  187. subparsers = ListForwarder([ subparsers_top.add_parser(cmd).add_subparsers(dest='L2_command') \
  188. for cmd in ['compose', 'comp', 'c'] ])
  189. subparsers.required = True
  190. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['build', 'bld', 'b']])
  191. parser.set_defaults(func=command_compose_build)
  192. parser.add_argument('filename', type=str)
  193. parser.add_argument('--squeeze', '-s', action='store_true')
  194. parser = ListForwarder([subparsers.add_parser(cmd) for cmd in ['run', 'r']])
  195. parser.set_defaults(func=command_compose_run)
  196. parser.add_argument('filename', type=str)
  197. parser.add_argument('command', type=str)
  198. return parser_top
  199. def main():
  200. focker_lock()
  201. zfs_init()
  202. parser = create_parser()
  203. args = parser.parse_args()
  204. if not hasattr(args, 'func'):
  205. parser.print_usage()
  206. sys.exit('You must choose a mode')
  207. args.func(args)
  208. if __name__ == '__main__':
  209. main()