Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.16 KB | None | 0 0
  1. MANUAL_MODE_NAME = "manual"
  2. AUTO_MODE_NAME = "auto"
  3.  
  4. def check_prometheus_ready():
  5.     try:
  6.         r = requests.get(settings.PROMETHEUS_URL)
  7.         r.raise_for_status()
  8.     except requests.HTTPError:
  9.         logging.error("Got HTTP error, probably Prometheus is not yet ready, throwing exception and exiting...")
  10.         raise
  11.     logging.info("Prometheus responded with HTTP OK, probably ready to serve requests")
  12.  
  13. def get_prometheus_value(query):  # TODO: copied form mqtt-importer-prometheus, probably should be extracted to separate module
  14.     r = requests.get("{}/api/v1/query?query={}".format(settings.PROMETHEUS_URL, query))
  15.     if r.status_code == requests.codes.ok:
  16.         try:
  17.             timestamp, query_result = r.json()['data']['result'][0]['value']
  18.             logging.info("Got values from Prometheus: [{}] {}".format(timestamp, query_result))
  19.         except (KeyError, ValueError):
  20.             logging.error("Got unexpected response from Prometheus (HTTP {}): {}".format(r.status_code, r.text))
  21.             return
  22.         except IndexError:
  23.             logging.error("There are no values for query {}".format(query))
  24.             return
  25.     else:
  26.         logging.error("HTTP error {} when querying Prometheus".format(r.status_code))
  27.         return
  28.     return query_result
  29.  
  30. @app.route('/')
  31. def hello():
  32.     try:
  33.         current_value_low = get_prometheus_value(settings.LOW_TEMP_METRIC)
  34.         current_value_high = get_prometheus_value(settings.HIGH_TEMP_METRIC)
  35.         current_value_mode = int(get_prometheus_value(settings.MODE_METRIC))
  36.         current_engine_mode = int(get_prometheus_value(settings.ENGINE_MODE_METRIC))
  37.     except Exception:  # TODO: catch more meaningful exception, not all
  38.         return "ERROR: Prometheus returned unexpected value!"
  39.  
  40.     # TODO: Move next lines to a template (i zjebana ifologia xD, ogolnie to jest chujowo napisane w huj xD)
  41.     return f"""
  42.            <form action="/set_params" method="GET">
  43.                <div>
  44.                    <label for="value_low">Low</label>
  45.                    <input name="value_low" id="value_low" value="{current_value_low}">
  46.                </div>
  47.                <div>
  48.                    <label for="value_high">High</label>
  49.                    <input name="value_high" id="value_high" value="{current_value_high}">
  50.                </div>
  51.                <div>
  52.                    <label for="mode">Mode</label>
  53.                    <select name="mode">
  54.                        <option value="manual" {'selected' if current_value_mode == 0 else ''}>Manual</option>
  55.                        <option value="auto" {'selected' if current_value_mode == 1 else ''}>Auto</option>
  56.                    </select>
  57.                </div>
  58.                <div>
  59.                    <label for="engine_mode">Engine mode</label>
  60.                    <select name="engine_mode">
  61.                        <option value="0" {'selected' if current_engine_mode == 0 else ''}>Closed</pption>
  62.                        <option value="1" {'selected' if current_engine_mode == 1 else ''}>Open</option>
  63.                    </select>
  64.                </div>
  65.                <div>
  66.                    <button>Send</button>
  67.                </div>
  68.            </form>
  69.        """
  70.  
  71. def set_mode(mode):
  72.     if mode not in (MANUAL_MODE_NAME, AUTO_MODE_NAME):
  73.         return f"Mode must be '{MANUAL_MODE_NAME}' or '{AUTO_MODE_NAME}'"
  74.     automat = 0 if mode == MANUAL_MODE_NAME else 1
  75.     publish.single(settings.MODE_TOPIC, automat, hostname=settings.MQTT_BROKER_HOST, port=settings.MQTT_BROKER_PORT)
  76.     return
  77.  
  78. def set_temp(value, topic):
  79.     if not value:
  80.         return "Temp value invalid"
  81.     try:
  82.         float(value)
  83.     except ValueError:
  84.         return "Value must be a number!"
  85.     publish.single(topic, value, hostname=settings.MQTT_BROKER_HOST, port=settings.MQTT_BROKER_PORT)
  86.     return
  87.  
  88. def set_engine_mode(mode, desired_mode):
  89.     error_message = "Engine mode must be 0 or 1!"
  90.     try:
  91.         desired_mode = int(desired_mode)
  92.     except ValueError:
  93.         return error_message
  94.     if not desired_mode in (0, 1):
  95.         return error_message
  96.     if mode == MANUAL_MODE_NAME:
  97.         publish.single(settings.ENGINE_MODE_TOPIC, desired_mode, hostname=settings.MQTT_BROKER_HOST, port=settings.MQTT_BROKER_PORT)
  98.  
  99. @app.route('/set_params')
  100. def set_params():    
  101.     # TODO: refactor this function!
  102.     mode_set = set_mode(request.args.get("mode").lower())
  103.     if mode_set:
  104.         return mode_set
  105.  
  106.     low_temp_set = set_temp(request.args.get("value_low"), settings.LOW_TEMP_PROMETHEUS)
  107.     if low_temp_set:
  108.         return low_temp_set
  109.  
  110.     high_temp_set = set_temp(request.args.get("value_high"), settings.HIGH_TEMP_PROMETHEUS)
  111.     if high_temp_set:
  112.         return high_temp_set
  113.    
  114.     engine_mode_set = set_engine_mode(request.args.get("mode").lower(), request.args.get("engine_mode"))
  115.     if engine_mode_set:
  116.         return engine_mode_set
  117.  
  118.     return "OK</br><a href='/'>Powrot</a>"
  119.  
  120. if __name__ == "__main__":
  121.     check_prometheus_ready()
  122.     logging.info(f"Starting flask server on {settings.FLASK_IP}:{settings.FLASK_PORT}")
  123.     app.run(host=settings.FLASK_IP, port=settings.FLASK_PORT)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement