Make presence detection work from cabin or house and deal with a
[python_utils.git] / site_config.py
1 #!/usr/bin/env python3
2
3 from dataclasses import dataclass
4 import logging
5 import platform
6 from typing import Callable
7
8 # Note: this module is fairly early loaded.  Be aware of dependencies.
9 import config
10 from locations import Location
11
12 logger = logging.getLogger(__name__)
13
14 args = config.add_commandline_args(
15     f'({__file__})',
16     'Args related to __file__'
17 )
18 args.add_argument(
19     '--site_config_override_location',
20     default='NONE',
21     const='NONE',
22     nargs='?',
23     choices=('HOUSE', 'CABIN', 'NONE'),
24     help='Where are we, HOUSE, CABIN?',
25 )
26
27
28 @dataclass
29 class SiteConfig(object):
30     location_name: str
31     location: Location
32     network: str
33     network_netmask: str
34     network_router_ip: str
35     presence_location: Location
36     is_anyone_present: Callable[None, bool]
37     arper_minimum_device_count: int
38
39
40 def get_location_name():
41     """
42     Where are we?
43
44     >>> location = get_location_name()
45     >>> location == 'HOUSE' or location == 'CABIN'
46     True
47
48     """
49     return get_config().location_name
50
51
52 def get_location():
53     """
54     Returns location as an enum instead of a string.
55
56     >>> from locations import Location
57     >>> location = get_location()
58     >>> location == Location.HOUSE or location == Location.CABIN
59     True
60
61     """
62     return get_config().location
63
64
65 def is_anyone_present_wrapper(location: Location):
66     import presence
67     p = presence.PresenceDetection()
68     return p.is_anyone_in_location_now(location)
69
70
71 def get_config():
72     """
73     Get a configuration dataclass with information that is
74     site-specific including the current running location.
75
76     >>> cfg = get_config()
77     >>> cfg.location_name == 'HOUSE' or cfg.location_name == 'CABIN'
78     True
79
80     """
81     hostname = platform.node()
82     try:
83         location_override = config.config['site_config_override_location']
84     except KeyError:
85         location_override = 'NONE'
86     if location_override == 'NONE':
87         if '.house' in hostname:
88             location = 'HOUSE'
89         elif '.cabin' in hostname:
90             location = 'CABIN'
91     if location == 'HOUSE':
92         return SiteConfig(
93             location_name = 'HOUSE',
94             location = Location.HOUSE,
95             network = '10.0.0.0/24',
96             network_netmask = '255.255.255.0',
97             network_router_ip = '10.0.0.1',
98             presence_location = Location.HOUSE,
99             is_anyone_present = lambda x=Location.HOUSE: is_anyone_present_wrapper(x),
100             arper_minimum_device_count = 50,
101         )
102     elif location == 'CABIN':
103         return SiteConfig(
104             location_name = 'CABIN',
105             location = Location.CABIN,
106             network = '192.168.0.0/24',
107             network_netmask = '255.255.255.0',
108             network_router_ip = '192.168.0.1',
109             presence_location = Location.CABIN,
110             is_anyone_present = lambda x=Location.CABIN: is_anyone_present_wrapper(x),
111             arper_minimum_device_count = 15,
112         )
113     else:
114         raise Exception(f'Unknown site location: {location}')
115
116
117 if __name__ == '__main__':
118     import doctest
119     doctest.testmod()