5 from dataclasses import dataclass
6 from typing import Callable, Optional
8 # Note: this module is fairly early loaded. Be aware of dependencies.
10 from type.locations import Location
12 logger = logging.getLogger(__name__)
14 args = config.add_commandline_args(
15 f'Global Site Config ({__file__})',
16 'Args related to global site-specific configuration',
19 '--site_config_override_location',
23 choices=['HOUSE', 'CABIN', 'NONE'],
24 help='Where are we, HOUSE, CABIN? Overrides standard detection code.',
29 class SiteConfig(object):
34 network_router_ip: str
35 presence_location: Location
36 is_anyone_present: Callable
37 arper_minimum_device_count: int
41 def get_location_name():
45 >>> location = get_location_name()
46 >>> location == 'HOUSE' or location == 'CABIN'
50 return get_config().location_name
55 Returns location as an enum instead of a string.
57 >>> from type.locations import Location
58 >>> location = get_location()
59 >>> location == Location.HOUSE or location == Location.CABIN
63 return get_config().location
66 def is_anyone_present_wrapper(location: Location):
69 p = base_presence.PresenceDetection()
70 return p.is_anyone_in_location_now(location)
73 def other_location() -> str:
75 Returns the location where this program is _NOT_ running.
77 >>> x = other_location()
78 >>> x in set(['HOUSE', 'CABIN'])
82 hostname = platform.node()
83 if '.house' in hostname:
85 elif '.cabin' in hostname:
88 raise Exception(f"{hostname} doesn't help me know where I'm running?!")
92 def this_location() -> str:
94 Returns the location where this program _IS_ running.
96 >>> x = this_location()
97 >>> x in set(['HOUSE', 'CABIN'])
101 hostname = platform.node()
102 if '.house' in hostname:
104 elif '.cabin' in hostname:
107 raise Exception(f"{hostname} doesn't help me know where I'm running?!")
111 def effective_location(location_override: Optional[str] = None) -> str:
112 """Detects and returns a location taking into account two override
115 >>> x = effective_location()
116 >>> x in set(['HOUSE', 'CABIN'])
119 >>> effective_location('HOUSE')
123 if location_override is None:
125 location_override = config.config['site_config_override_location']
127 location_override = None
129 if location_override is None or location_override == 'NONE':
130 location = this_location()
132 logger.debug(f'site_config\'s location_override was set to: {location_override}')
133 location = location_override
137 def get_config(location_override: Optional[str] = None):
139 Get a configuration dataclass with information that is
140 site-specific including the current running location.
142 >>> cfg = get_config()
143 >>> cfg.location_name == 'HOUSE' or cfg.location_name == 'CABIN'
147 location = effective_location(location_override)
148 if location == 'HOUSE':
150 location_name='HOUSE',
151 location=Location.HOUSE,
152 network='10.0.0.0/24',
153 network_netmask='255.255.255.0',
154 network_router_ip='10.0.0.1',
155 presence_location=Location.HOUSE,
156 is_anyone_present=lambda x=Location.HOUSE: is_anyone_present_wrapper(x),
157 arper_minimum_device_count=50,
158 arper_cache_file='/home/scott/cache/.arp_table_cache_house',
160 elif location == 'CABIN':
162 location_name='CABIN',
163 location=Location.CABIN,
164 network='192.168.0.0/24',
165 network_netmask='255.255.255.0',
166 network_router_ip='192.168.0.1',
167 presence_location=Location.CABIN,
168 is_anyone_present=lambda x=Location.CABIN: is_anyone_present_wrapper(x),
169 arper_minimum_device_count=15,
170 arper_cache_file='/home/scott/cache/.arp_table_cache_cabin',
173 raise Exception(f'Unknown site location: {location}')
176 if __name__ == '__main__':