Skip to content

Commit 6cb2e11

Browse files
authored
Merge pull request #19 from lux4rd0/v2.0.07
V2.0.07 - Token Refresh
2 parents 63195c8 + 2e0593e commit 6cb2e11

File tree

3 files changed

+57
-7
lines changed

3 files changed

+57
-7
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ The project is deployed as a Docker container.
2323

2424
Use the following [Docker container](https://hub.docker.com/r/lux4rd0/sense-collector):
2525

26-
lux4rd0/sense-collector:2.0.06
26+
lux4rd0/sense-collector:2.0.07
2727
lux4rd0/sense-collector:latest
2828

2929
Correct environmental variables are required for the container to function.

sense-collector.py renamed to src/sense-collector.py

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@
5151
os.getenv("SENSE_COLLECTOR_DEVICE_LOOKUP_DELAY_SECONDS", 0.5)
5252
)
5353

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+
5459

5560
# Configure logging based on environment variables
5661

@@ -133,6 +138,41 @@ def __init__(self, monitor_id, token, influxdb_storage, user_id):
133138
self.semaphore = asyncio.Semaphore(device_max_concurrent_lookups)
134139
self.session = None
135140

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+
136176
async def start_session(self):
137177
self.session = aiohttp.ClientSession()
138178

@@ -722,6 +762,7 @@ def obfuscate_sensitive_data(data, visible_chars=4):
722762

723763

724764
async def main():
765+
logger.info("Starting main function.")
725766
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
726767
logger.info(f"Welcome to Sense Collector! Current time: {current_time}")
727768

@@ -746,6 +787,7 @@ async def main():
746787
"SENSE_COLLECTOR_CACHE_EXPIRY_SECONDS": "120",
747788
"SENSE_COLLECTOR_MAX_CONCURRENT_LOOKUPS": "4",
748789
"SENSE_COLLECTOR_LOOKUP_DELAY_SECONDS": "0.5",
790+
"SENSE_COLLECTOR_API_TOKEN_RENEW": "43200",
749791
}
750792

751793
def obscure_value(value):
@@ -760,14 +802,11 @@ def bold(value):
760802
logger.info("Environment Variable Settings:")
761803
for var, default in env_vars_defaults.items():
762804
value = os.environ.get(var, default)
805+
logger.debug(f"Retrieved environment variable {var} with value: {value}")
763806
# 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()
769808
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:
771810
value_to_print = obscure_value(value)
772811
else:
773812
value_to_print = bold(value) if not is_default else value
@@ -782,13 +821,18 @@ def bold(value):
782821
sys.exit(1)
783822

784823
try:
824+
logger.info("Attempting to authenticate with Sense API.")
785825
auth_response = await authenticate_with_sense(
786826
os.environ["SENSE_COLLECTOR_API_USERNAME"],
787827
os.environ["SENSE_COLLECTOR_API_PASSWORD"],
788828
)
829+
logger.debug(f"Authentication response: {auth_response}")
789830
monitor_id = str(auth_response["monitors"][0]["id"])
790831
token = auth_response["access_token"]
791832
user_id = auth_response["user_id"]
833+
logger.info(
834+
f"Successfully authenticated. Monitor ID: {monitor_id}, User ID: {user_id}"
835+
)
792836
except Exception as e:
793837
logger.error(f"Authentication failed: {e}")
794838
sys.exit(1)
@@ -799,22 +843,28 @@ def bold(value):
799843
"org": os.environ.get("SENSE_COLLECTOR_INFLUXDB_ORG"),
800844
"bucket": os.environ.get("SENSE_COLLECTOR_INFLUXDB_BUCKET"),
801845
}
846+
logger.debug(f"InfluxDB parameters: {influxdb_params}")
802847

803848
influxdb_storage = InfluxDBStorage(influxdb_params)
804849

805850
collector = SenseCollector(monitor_id, token, influxdb_storage, user_id)
851+
logger.info("Starting session for SenseCollector.")
806852
await collector.start_session()
807853

808854
try:
855+
logger.info("Starting all Sense Collector tasks.")
809856
await asyncio.gather(
810857
collector.api_worker(),
811858
collector.receive_data(),
812859
collector.fetch_monitor_status(),
813860
collector.fetch_devices(),
861+
collector.periodic_token_renewal(),
814862
)
815863
finally:
864+
logger.info("Closing session for SenseCollector.")
816865
await collector.close_session()
817866

818867

819868
if __name__ == "__main__":
869+
logger.info("Starting Sense Collector script.")
820870
asyncio.run(main())
File renamed without changes.

0 commit comments

Comments
 (0)