server.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from flask import Flask
  2. from flask_restful import Resource, Api
  3. from flask import jsonify
  4. from threading import Thread
  5. import docker
  6. import signal
  7. import time
  8. docker_client = docker.DockerClient(base_url='unix://var/run/docker.sock')
  9. app = Flask(__name__)
  10. api = Api(app)
  11. class containers_get(Resource):
  12. def get(self):
  13. containers = {}
  14. for container in docker_client.containers.list(all=True):
  15. containers.update({container.attrs['Id']: container.attrs})
  16. return containers
  17. class container_get(Resource):
  18. def get(self, container_id):
  19. if container_id and container_id.isalnum():
  20. for container in docker_client.containers.list(all=True, filters={"id": container_id}):
  21. return container.attrs
  22. else:
  23. return jsonify(message='No or invalid id defined')
  24. class container_post(Resource):
  25. def post(self, container_id, post_action):
  26. if container_id and container_id.isalnum() and post_action:
  27. if post_action == 'stop':
  28. try:
  29. for container in docker_client.containers.list(all=True, filters={"id": container_id}):
  30. container.stop()
  31. except:
  32. return 'Error'
  33. else:
  34. return 'OK'
  35. elif post_action == 'start':
  36. try:
  37. for container in docker_client.containers.list(all=True, filters={"id": container_id}):
  38. container.start()
  39. except:
  40. return 'Error'
  41. else:
  42. return 'OK'
  43. elif post_action == 'restart':
  44. try:
  45. for container in docker_client.containers.list(all=True, filters={"id": container_id}):
  46. container.restart()
  47. except:
  48. return 'Error'
  49. else:
  50. return 'OK'
  51. else:
  52. return jsonify(message='Invalid action')
  53. else:
  54. return jsonify(message='Invalid container id or missing action')
  55. class GracefulKiller:
  56. kill_now = False
  57. def __init__(self):
  58. signal.signal(signal.SIGINT, self.exit_gracefully)
  59. signal.signal(signal.SIGTERM, self.exit_gracefully)
  60. def exit_gracefully(self,signum, frame):
  61. self.kill_now = True
  62. def startFlaskAPI():
  63. app.run(debug=False, host='0.0.0.0', port='8080', threaded=True)
  64. api.add_resource(containers_get, '/containers/json')
  65. api.add_resource(container_get, '/containers/<string:container_id>/json')
  66. api.add_resource(container_post, '/containers/<string:container_id>/<string:post_action>')
  67. if __name__ == '__main__':
  68. api_thread = Thread(target=startFlaskAPI)
  69. api_thread.daemon = True
  70. api_thread.start()
  71. killer = GracefulKiller()
  72. while True:
  73. time.sleep(1)
  74. if killer.kill_now:
  75. break
  76. print "Stopping dockerapi-mailcow"