Saltstack Official UFW Formula
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

ufw.py 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. from salt.exceptions import CommandExecutionError, CommandNotFoundError
  2. import re
  3. import socket
  4. def _unchanged(name, msg):
  5. return {'name': name, 'result': True, 'comment': msg, 'changes': {}}
  6. def _test(name, msg):
  7. return {'name': name, 'result': None, 'comment': msg, 'changes': {}}
  8. def _error(name, msg):
  9. return {'name': name, 'result': False, 'comment': msg, 'changes': {}}
  10. def _changed(name, msg, **changes):
  11. return {'name': name, 'result': True, 'comment': msg, 'changes': changes}
  12. def _resolve(host):
  13. # let's just see if it starts with a number or a colon, for simplicity
  14. if re.match(r'^[0-9:]', host):
  15. return
  16. return socket.gethostbyname(host)
  17. def _as_rule(method, app, interface, protocol, from_addr, from_port, to_addr, to_port):
  18. cmd = [method]
  19. if app is not None:
  20. cmd.append(app)
  21. elif interface is not None:
  22. cmd.append("in")
  23. cmd.append("on")
  24. cmd.append(interface)
  25. else:
  26. if protocol is not None:
  27. cmd.append("proto")
  28. cmd.append(protocol)
  29. cmd.append("from")
  30. if from_addr is not None:
  31. cmd.append(_resolve(from_addr))
  32. else:
  33. cmd.append("any")
  34. if from_port is not None:
  35. cmd.append("port")
  36. cmd.append(_resolve(from_port))
  37. cmd.append("to")
  38. if to_addr is not None:
  39. cmd.append(to_addr)
  40. else:
  41. cmd.append("any")
  42. if to_port is not None:
  43. cmd.append("port")
  44. cmd.append(to_port)
  45. real_cmd = ' '.join(cmd)
  46. return real_cmd
  47. def enabled(name, **kwargs):
  48. if __salt__['ufw.is_enabled']():
  49. return _unchanged(name, "UFW is already enabled")
  50. if __opts__['test']:
  51. return _test(name, "UFW will be enabled")
  52. try:
  53. __salt__['ufw.set_enabled'](True)
  54. except (CommandExecutionError, CommandNotFoundError) as e:
  55. return _error(name, e.message)
  56. return _changed(name, "UFW is enabled", enabled=True)
  57. def default_incoming(name, default):
  58. rule = "default {0} incoming".format(default)
  59. if __opts__['test']:
  60. return _test(name, "{0}: {1}".format(name, rule))
  61. current = __salt__['ufw.get_default_incoming']()
  62. if default != current:
  63. try:
  64. out = __salt__['ufw.add_rule'](rule)
  65. except (CommandExecutionError, CommandNotFoundError) as e:
  66. return _error(name, e.message)
  67. for line in out.split('\n'):
  68. if line.startswith("Default incoming policy changed to"):
  69. return _changed(name, "{0} set to {1}".format(name, default), rule=rule)
  70. return _error(name, line)
  71. return _unchanged(name, "{0} was already set to {1}".format(name, default))
  72. def default_outgoing(name, default):
  73. rule = "default {0} outgoing".format(default)
  74. if __opts__['test']:
  75. return _test(name, "{0}: {1}".format(name, rule))
  76. current = __salt__['ufw.get_default_outgoing']()
  77. if default != current:
  78. try:
  79. out = __salt__['ufw.add_rule'](rule)
  80. except (CommandExecutionError, CommandNotFoundError) as e:
  81. return _error(name, e.message)
  82. for line in out.split('\n'):
  83. if line.startswith("Default outgoing policy changed to"):
  84. return _changed(name, "{0} set to {1}".format(name, default), rule=rule)
  85. return _error(name, line)
  86. return _unchanged(name, "{0} was already set to {1}".format(name, default))
  87. def allowed(name, app=None, interface=None, protocol=None,
  88. from_addr=None, from_port=None, to_addr=None, to_port=None):
  89. rule = _as_rule("allow", app=app, interface=interface, protocol=protocol,
  90. from_addr=from_addr, from_port=from_port, to_addr=to_addr, to_port=to_port)
  91. if __opts__['test']:
  92. return _test(name, "{0}: {1}".format(name, rule))
  93. try:
  94. out = __salt__['ufw.add_rule'](rule)
  95. except (CommandExecutionError, CommandNotFoundError) as e:
  96. return _error(name, e.message)
  97. changes = False
  98. for line in out.split('\n'):
  99. if line.startswith("Skipping"):
  100. continue
  101. if line.startswith("Rule added") or line.startswith("Rules updated"):
  102. changes = True
  103. break
  104. return _error(name, line)
  105. if changes:
  106. return _changed(name, "{0} allowed".format(name), rule=rule)
  107. else:
  108. return _unchanged(name, "{0} was already allowed".format(name))