Guest User

Untitled

a guest
Dec 19th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.72 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. from __future__ import absolute_import, division, print_function
  5.  
  6. __author__ = "Sebastian Kroczek"
  7. __copyright__ = "Copyright 2018"
  8. __credits__ = ["Sebastian Kroczek"]
  9. __license__ = "MIT"
  10. __email__ = "me@xbug.de"
  11. __status__ = "Prototype"
  12.  
  13.  
  14. import io
  15. import os
  16.  
  17. from configobj import ConfigObj
  18. from ansible.module_utils.basic import AnsibleModule
  19.  
  20.  
  21. def cmp(d1, d2):
  22. if d1 == d2:
  23. return True
  24. if not isinstance(d1, dict) and not isinstance(d2, dict):
  25. return False
  26. for k in d1.keys():
  27. if k not in d2.keys():
  28. return False
  29. elif isinstance(d1[k], dict):
  30. if not cmp(d1[k], d2[k]):
  31. return False
  32. elif d1[k] != d2[k]:
  33. return False
  34. return True
  35.  
  36.  
  37. def find(key, cfg):
  38. parts = key.split(".", 1)
  39. if len(parts) > 1:
  40. if isinstance(cfg[parts[0]], dict):
  41. return find(parts[1], cfg[parts[0]])
  42. else:
  43. return None
  44. return cfg[parts[0]]
  45.  
  46.  
  47. def delete(key, cfg):
  48. parts = key.split(".", 1)
  49. if len(parts) > 1:
  50. delete(parts[1], cfg[parts[0]])
  51. return
  52. del (cfg[parts[0]])
  53.  
  54.  
  55. def set_value(key, value, cfg):
  56. parts = key.split(".", 1)
  57. if len(parts) > 1:
  58. try:
  59. ncfg = cfg[parts[0]]
  60. except KeyError:
  61. ncfg = cfg[parts[0]] = {}
  62. set_value(parts[1], value, ncfg)
  63. return
  64. cfg[parts[0]] = value
  65.  
  66.  
  67. def main():
  68. arg_spec = dict(
  69. path=dict(required=True, type='path'),
  70. state=dict(default='present', choices=['present', 'absent', 'read']),
  71. key=dict(required=True),
  72. section=dict(type='dict'),
  73. value=dict(),
  74. )
  75.  
  76. module = AnsibleModule(argument_spec=arg_spec, supports_check_mode=True)
  77.  
  78. path = str(os.path.expanduser(module.params['path']))
  79. key = module.params['key']
  80. state = module.params['state']
  81. section = module.params['section']
  82. value = module.params['value']
  83.  
  84. if 'present' == state and not section and not value:
  85. module.fail_json(msg="On state 'present' either section or value is required.")
  86.  
  87. if 'present' == state and section and value:
  88. module.fail_json(msg="On state 'present' either section or value must be set, not both.")
  89.  
  90. value = value or section
  91.  
  92. # create = module.params['create']
  93. check_mode = module.check_mode
  94.  
  95. diff = {'before': '',
  96. 'after': '',
  97. 'before_header': '%s (content)' % path,
  98. 'after_header': '%s (content)' % path}
  99.  
  100. cfg = ConfigObj(path)
  101.  
  102. before = io.BytesIO()
  103. cfg.write(before)
  104. diff['before'] = before.getvalue()
  105. before.close()
  106.  
  107. try:
  108. cvalue = find(key, cfg=cfg)
  109. except KeyError:
  110. if 'read' == state:
  111. module.fail_json(msg="Key %s do not exist." % key)
  112. elif "absent" == state:
  113. module.exit_json(changed=False)
  114. else:
  115. cvalue = float('nan')
  116.  
  117. if 'read' == state:
  118. module.exit_json(value=cvalue, changed=False)
  119.  
  120. if "absent" == state:
  121. delete(key, cfg)
  122. if not check_mode:
  123. cfg.write()
  124.  
  125. after = io.BytesIO()
  126. cfg.write(after)
  127. diff['after'] = after.getvalue()
  128. after.close()
  129. module.exit_json(changed=True, diff=diff)
  130.  
  131. if 'present' == state:
  132. if cmp(cvalue, value):
  133. module.exit_json(changed=False)
  134. set_value(key, value, cfg)
  135. if not check_mode:
  136. cfg.write()
  137.  
  138. after = io.BytesIO()
  139. cfg.write(after)
  140. diff['after'] = after.getvalue()
  141. after.close()
  142.  
  143. module.exit_json(changed=True, diff=diff)
  144.  
  145. module.fail_json(msg="Unknown state %s. Known states are: read, present and absent." % state, changed=False)
  146.  
  147.  
  148. if __name__ == '__main__':
  149. main()
Add Comment
Please, Sign In to add comment