main.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import time
  2. import datetime
  3. import os
  4. import sys
  5. import logging
  6. from enum import Enum
  7. from influxdb_client import InfluxDBClient, Point
  8. from influxdb_client.client.write_api import SYNCHRONOUS
  9. from pihole import PiHole
  10. logger = logging.Logger('pihole-to-influxdb')
  11. logger.addHandler(logging.StreamHandler(sys.stdout))
  12. class AppMode(Enum):
  13. Live = 1
  14. Totals = 2
  15. Raw = 3
  16. try:
  17. # optional Logger Settings
  18. logging.basicConfig(level=os.getenv("LOG_LEVEL", "DEBUG"))
  19. # InfluxDB Settings
  20. DB_URL = os.environ['INFLUX_DB_URL']
  21. DB_ORG = os.environ['INFLUX_DB_ORG']
  22. DB_TOKEN = os.environ['INFLUX_DB_TOKEN']
  23. DB_BUCKET = os.environ['INFLUX_DB_BUCKET']
  24. # PiHole Settings
  25. PIHOLE_URL = str(os.environ['PIHOLE_URL'])
  26. QUERY_INTERVAL = int(os.environ['PIHOLE_INTERVAL'])
  27. # optional Pi-hole authentication
  28. PASSWORD = os.environ['PIHOLE_AUTHENTICATION']
  29. except KeyError as e:
  30. logger.fatal('Missing environment variable: {}'.format(e))
  31. sys.exit(1)
  32. try:
  33. # optional App Mode
  34. APP_MODE = AppMode[os.getenv('APP_MODE', 'Totals')]
  35. except KeyError as e:
  36. logger.fatal('{} is not a valid AppMode'.format(e))
  37. sys.exit(1)
  38. influxdb_client = InfluxDBClient(DB_URL, DB_TOKEN, org=DB_ORG)
  39. pihole = PiHole(PIHOLE_URL, PASSWORD)
  40. def main():
  41. write_api = influxdb_client.write_api(write_options=SYNCHRONOUS)
  42. next_update = time.monotonic()
  43. logger.info('Starting PiHole Data Logger to InfluxDB')
  44. logger.info('AppMode: {}'.format(APP_MODE.name))
  45. # Test Pi-hole connection
  46. try:
  47. pihole.request_summary()
  48. except Exception as e:
  49. logger.fatal('Unable to connect to Pi-hole: {}'.format(e))
  50. sys.exit(1)
  51. while True:
  52. try:
  53. timestamp = datetime.datetime.now()
  54. if APP_MODE == AppMode.Live:
  55. data = list(pihole.get_queries_for_influxdb(timestamp, QUERY_INTERVAL))
  56. elif APP_MODE == AppMode.Totals:
  57. data = list(pihole.get_totals_for_influxdb())
  58. elif APP_MODE == AppMode.Raw:
  59. data = list(pihole.get_query_logs_for_influxdb(timestamp, QUERY_INTERVAL))
  60. logger.debug('Writing {} points to InfluxDB'.format(len(data)))
  61. write_api.write(bucket=DB_BUCKET, record=data)
  62. sleep_duration = QUERY_INTERVAL
  63. except Exception as e:
  64. logger.exception('Failed to get data from Pi-Hole to InfluxDB')
  65. # Sleep at most two minutes
  66. sleep_duration = min(QUERY_INTERVAL, 120)
  67. next_update = next_update + sleep_duration
  68. logger.debug("Now sleeping for {}".format(datetime.timedelta(seconds=sleep_duration)))
  69. time.sleep(max(0, next_update - time.monotonic()))
  70. if __name__ == '__main__':
  71. main()