Odyssey
generate_analog_map.py
1 #!/usr/bin/env python
2 '''Generate map.txt for analog stats parsing'''
3 
4 import os
5 from urllib.parse import urlparse
6 import logging
7 import pwd
8 # pylint: disable=import-error
9 import psycopg2
10 from funcy import compose
11 from funcy import partial
12 
13 LOGGER = logging.getLogger(__name__)
14 LOGGER.setLevel(logging.DEBUG)
15 LOGGER.addHandler(logging.StreamHandler())
16 
17 DATABASE_HOST = os.environ['DATABASE_HOST']
18 DATABASE_PORT = os.environ['DATABASE_PORT']
19 DATABASE_NAME = os.environ['DATABASE_NAME']
20 DATABASE_USER = os.environ['DATABASE_USER']
21 DATABASE_PASSWORD = os.environ['DATABASE_PASSWORD']
22 
23 DB_URL = 'postgresql://%s:%s@%s:%s/%s' % (DATABASE_USER,
24  DATABASE_PASSWORD,
25  DATABASE_HOST,
26  DATABASE_PORT,
27  DATABASE_NAME)
28 
29 MAP_DIR = os.environ.get('ANALOG_MAP_DIR', '/home/httpd/homecu/stats')
30 
31 
33  '''Query DB and create analog map.txt'''
34  if not os.path.exists(MAP_DIR):
35  os.makedirs(MAP_DIR)
36  map_filename = os.path.join(MAP_DIR, 'map.txt')
37  with __create_conn__() as conn:
38  compose(partial(__write_analog_map_rows__, map_filename),
39  __query_cu_info__)(conn)
40 
41 
43  '''Create Database connection'''
44  return psycopg2.connect(DB_URL)
45 
46 
48  '''Query cuinfo for username and urls'''
49  assert conn
50  with conn.cursor() as cur:
51  cur.execute('SELECT user_name, web_host FROM cuinfo;')
52  return cur.fetchall()
53 
54 
55 def __write_analog_map_rows__(filename, rows):
56  '''Write map.txt with provided rows'''
57  with open(filename, 'w') as map_file:
58  for (user_name, web_host) in rows:
59  map_file.write('%s:%s %s' % (user_name.upper(),
60  user_name.lower(),
61  urlparse(web_host).hostname))
62  # write EOF \n
63  map_file.write(os.linesep)
64  return filename
65 
66 if __name__ == '__main__':
67  UID = pwd.getpwnam('www-data').pw_uid
68  os.seteuid(UID)
69  LOGGER.info("Starting analog map.txt generation ...")
71  LOGGER.info("Done.")
def __write_analog_map_rows__(filename, rows)