22from datetime import datetime , timezone
33import io
44import json
5+ import logging
56import platform
67import sys
78import tarfile
@@ -10,9 +11,13 @@ from urllib.request import urlopen
1011from urllib .error import HTTPError , URLError
1112
1213
14+ logging .basicConfig (level = logging .INFO )
15+ logger = logging .getLogger (__name__ )
16+
1317BACKOFF_TIME = 5 # in seconds
1418MAX_RETRIES = 5
1519
20+
1621def download_and_extract (url ):
1722 try :
1823 with urlopen (url ) as request :
@@ -22,15 +27,15 @@ def download_and_extract(url):
2227 status = err .code
2328 response = err .reason
2429 except URLError as err :
25- print (err .reason )
30+ logger . error (err .reason )
2631 time .sleep (BACKOFF_TIME )
2732 return False
2833 if status >= 400 :
29- print (f"Unexpected { status } status from download server. " )
34+ logger . error (f"Unexpected { status } status from download server: { response } " )
3035 time .sleep (BACKOFF_TIME )
3136 return False
3237
33- print ("extracting..." )
38+ logger . info ("extracting..." )
3439 with tarfile .open (fileobj = io .BytesIO (response ), mode = "r:*" ) as file :
3540 file .extractall (path = "bin/" )
3641 return True
@@ -62,11 +67,11 @@ def fetch_configlet():
6267 headers = err .headers
6368 response = err .reason
6469 except URLError as err :
65- print (err . reason )
70+ logger . exception (err )
6671 time .sleep (BACKOFF_TIME )
6772 return 1
6873 if status >= 500 :
69- print (f"Sleeping due to { status } response from API. " )
74+ logger . info (f"Sleeping due to { status } response from API: { response } " )
7075 time .sleep (BACKOFF_TIME )
7176 return 1
7277 if status == 403 :
@@ -76,18 +81,19 @@ def fetch_configlet():
7681 delta = wait_until - datetime .now (timezone .utc )
7782 seconds = delta .total_seconds ()
7883 wait = seconds + 5 if seconds > BACKOFF_TIME else BACKOFF_TIME
79- print (f"Rate limited, sleeping { wait } seconds." )
84+ logger . info (f"Rate limited, sleeping { wait } seconds." )
8085 time .sleep (wait )
8186 return 1
8287 if status >= 400 :
83- sys .exit (f"Received unexpected { status } response from API." )
88+ logger .error (f"Received unexpected { status } response from API: { response } " )
89+ return 1
8490 data = json .loads (response .decode ("utf-8" ))
8591 version = data ["tag_name" ]
8692 machine_info = f"{ get_os ()} -{ get_arch ()} "
8793 name = f"configlet-{ machine_info } .tgz"
8894 for asset in data ["assets" ]:
8995 if asset ["name" ] == name :
90- print (f"Downloading configlet { version } for { machine_info } " )
96+ logger . info (f"Downloading configlet { version } for { machine_info } " )
9197 for _ in range (MAX_RETRIES ):
9298 if download_and_extract (asset ["browser_download_url" ]):
9399 return 0
0 commit comments