51
51
os .getenv ("SENSE_COLLECTOR_DEVICE_LOOKUP_DELAY_SECONDS" , 0.5 )
52
52
)
53
53
54
+ # Token renewal interval in seconds (default is 12 hours)
55
+ token_renew_interval = int (
56
+ os .getenv ("SENSE_COLLECTOR_API_TOKEN_RENEW" , 43200 )
57
+ ) # 43200 seconds = 12 hours
58
+
54
59
55
60
# Configure logging based on environment variables
56
61
@@ -133,6 +138,41 @@ def __init__(self, monitor_id, token, influxdb_storage, user_id):
133
138
self .semaphore = asyncio .Semaphore (device_max_concurrent_lookups )
134
139
self .session = None
135
140
141
+ async def renew_token (self ):
142
+ url = SenseAPIEndpoints .AUTHENTICATE
143
+ headers = {"Content-Type" : "application/x-www-form-urlencoded" }
144
+ data = {
145
+ "email" : os .environ ["SENSE_COLLECTOR_API_USERNAME" ],
146
+ "password" : os .environ ["SENSE_COLLECTOR_API_PASSWORD" ],
147
+ }
148
+ async with aiohttp .ClientSession () as session :
149
+ async with session .post (url , headers = headers , data = data ) as resp :
150
+ if resp .status == 200 :
151
+ data = await resp .json ()
152
+ self .token = data ["access_token" ]
153
+ self .headers ["Authorization" ] = f"bearer { self .token } "
154
+ api_logger .info ("Token renewed successfully." )
155
+ else :
156
+ api_logger .error (f"Failed to renew token: { resp .status } " )
157
+
158
+ async def periodic_token_renewal (self ):
159
+ api_logger .info ("Starting periodic token renewal task." )
160
+ next_renewal_time = datetime .now () + timedelta (seconds = token_renew_interval )
161
+ api_logger .info (
162
+ f"Initial token renewal scheduled in { token_renew_interval } seconds at { next_renewal_time .strftime ('%Y-%m-%d %H:%M:%S' )} ."
163
+ )
164
+ while True :
165
+ api_logger .info (
166
+ f"Sleeping for { token_renew_interval } seconds before renewing token."
167
+ )
168
+ await asyncio .sleep (token_renew_interval ) # Sleep for the renewal interval
169
+ api_logger .info ("Renewing token now." )
170
+ await self .renew_token ()
171
+ next_renewal_time = datetime .now () + timedelta (seconds = token_renew_interval )
172
+ api_logger .info (
173
+ f"Token renewed. Next renewal in { token_renew_interval } seconds at { next_renewal_time .strftime ('%Y-%m-%d %H:%M:%S' )} ."
174
+ )
175
+
136
176
async def start_session (self ):
137
177
self .session = aiohttp .ClientSession ()
138
178
@@ -722,6 +762,7 @@ def obfuscate_sensitive_data(data, visible_chars=4):
722
762
723
763
724
764
async def main ():
765
+ logger .info ("Starting main function." )
725
766
current_time = datetime .now ().strftime ("%Y-%m-%d %H:%M:%S" )
726
767
logger .info (f"Welcome to Sense Collector! Current time: { current_time } " )
727
768
@@ -746,6 +787,7 @@ async def main():
746
787
"SENSE_COLLECTOR_CACHE_EXPIRY_SECONDS" : "120" ,
747
788
"SENSE_COLLECTOR_MAX_CONCURRENT_LOOKUPS" : "4" ,
748
789
"SENSE_COLLECTOR_LOOKUP_DELAY_SECONDS" : "0.5" ,
790
+ "SENSE_COLLECTOR_API_TOKEN_RENEW" : "43200" ,
749
791
}
750
792
751
793
def obscure_value (value ):
@@ -760,14 +802,11 @@ def bold(value):
760
802
logger .info ("Environment Variable Settings:" )
761
803
for var , default in env_vars_defaults .items ():
762
804
value = os .environ .get (var , default )
805
+ logger .debug (f"Retrieved environment variable { var } with value: { value } " )
763
806
# Ensure case-insensitive comparison for boolean values
764
- is_default = (
765
- value .lower () == str (default ).lower ()
766
- if isinstance (default , str )
767
- else value == default
768
- )
807
+ is_default = str (value ).lower () == str (default ).lower ()
769
808
default_indicator = "(default)" if is_default else "(custom)"
770
- if "PASSWORD" in var or "TOKEN " in var :
809
+ if "PASSWORD" in var or "INFLUXDB_TOKEN " in var :
771
810
value_to_print = obscure_value (value )
772
811
else :
773
812
value_to_print = bold (value ) if not is_default else value
@@ -782,13 +821,18 @@ def bold(value):
782
821
sys .exit (1 )
783
822
784
823
try :
824
+ logger .info ("Attempting to authenticate with Sense API." )
785
825
auth_response = await authenticate_with_sense (
786
826
os .environ ["SENSE_COLLECTOR_API_USERNAME" ],
787
827
os .environ ["SENSE_COLLECTOR_API_PASSWORD" ],
788
828
)
829
+ logger .debug (f"Authentication response: { auth_response } " )
789
830
monitor_id = str (auth_response ["monitors" ][0 ]["id" ])
790
831
token = auth_response ["access_token" ]
791
832
user_id = auth_response ["user_id" ]
833
+ logger .info (
834
+ f"Successfully authenticated. Monitor ID: { monitor_id } , User ID: { user_id } "
835
+ )
792
836
except Exception as e :
793
837
logger .error (f"Authentication failed: { e } " )
794
838
sys .exit (1 )
@@ -799,22 +843,28 @@ def bold(value):
799
843
"org" : os .environ .get ("SENSE_COLLECTOR_INFLUXDB_ORG" ),
800
844
"bucket" : os .environ .get ("SENSE_COLLECTOR_INFLUXDB_BUCKET" ),
801
845
}
846
+ logger .debug (f"InfluxDB parameters: { influxdb_params } " )
802
847
803
848
influxdb_storage = InfluxDBStorage (influxdb_params )
804
849
805
850
collector = SenseCollector (monitor_id , token , influxdb_storage , user_id )
851
+ logger .info ("Starting session for SenseCollector." )
806
852
await collector .start_session ()
807
853
808
854
try :
855
+ logger .info ("Starting all Sense Collector tasks." )
809
856
await asyncio .gather (
810
857
collector .api_worker (),
811
858
collector .receive_data (),
812
859
collector .fetch_monitor_status (),
813
860
collector .fetch_devices (),
861
+ collector .periodic_token_renewal (),
814
862
)
815
863
finally :
864
+ logger .info ("Closing session for SenseCollector." )
816
865
await collector .close_session ()
817
866
818
867
819
868
if __name__ == "__main__" :
869
+ logger .info ("Starting Sense Collector script." )
820
870
asyncio .run (main ())
0 commit comments