2023-04-30 22:13:02 +00:00
|
|
|
|
2023-05-01 00:46:08 +00:00
|
|
|
import os
|
2023-04-30 22:13:02 +00:00
|
|
|
import json
|
|
|
|
import logging
|
2023-05-01 00:46:08 +00:00
|
|
|
import toml
|
2023-05-01 01:58:02 +00:00
|
|
|
import getpass
|
|
|
|
|
|
|
|
import contentapi
|
2023-05-01 01:03:03 +00:00
|
|
|
import myutils
|
2023-05-01 00:46:08 +00:00
|
|
|
|
|
|
|
CONFIGFILE="config.toml"
|
2023-04-30 22:13:02 +00:00
|
|
|
|
|
|
|
# The entire config object with all defaults
|
|
|
|
config = {
|
2023-04-30 22:49:30 +00:00
|
|
|
"api" : "https://oboy.smilebasicsource.com/api",
|
2023-05-01 01:12:14 +00:00
|
|
|
"default_loglevel" : "WARNING",
|
2023-05-01 01:03:03 +00:00
|
|
|
"expire_seconds" : 31536000, # 365 days in seconds, expiration for token
|
2023-04-30 22:49:30 +00:00
|
|
|
"tokenfile" : ".qcstoken"
|
2023-04-30 22:13:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
def main():
|
|
|
|
print("Program start")
|
2023-05-01 00:46:08 +00:00
|
|
|
load_or_create_global_config()
|
2023-05-01 01:12:14 +00:00
|
|
|
logging.info("Config: " + json.dumps(config, indent = 2))
|
2023-04-30 22:57:50 +00:00
|
|
|
context = contentapi.ApiContext(config["api"], logging)
|
2023-05-01 01:58:02 +00:00
|
|
|
logging.info("Testing connection to API at " + config["api"])
|
|
|
|
logging.debug(json.dumps(context.api_status(), indent = 2))
|
|
|
|
authenticate(config, context)
|
2023-04-30 22:18:25 +00:00
|
|
|
print("Program end")
|
|
|
|
|
2023-05-01 00:46:08 +00:00
|
|
|
# Loads the config from file into the global config var. If the file
|
|
|
|
# doesn't exist, the file is created from the defaults in config.
|
|
|
|
# The function returns nothing
|
|
|
|
def load_or_create_global_config():
|
|
|
|
global config
|
|
|
|
# Check if the config file exists
|
2023-05-01 01:58:02 +00:00
|
|
|
if os.path.isfile(CONFIGFILE):
|
2023-05-01 00:46:08 +00:00
|
|
|
# Read and deserialize the config file
|
|
|
|
with open(CONFIGFILE, 'r', encoding='utf-8') as f:
|
2023-05-01 01:12:14 +00:00
|
|
|
temp_config = toml.load(f)
|
|
|
|
myutils.merge_dictionary(temp_config, config)
|
2023-05-01 00:46:08 +00:00
|
|
|
else:
|
|
|
|
# Serialize and write the config dictionary to the config file
|
|
|
|
logging.warn("No config found at " + CONFIGFILE + ", creating now")
|
|
|
|
with open(CONFIGFILE, 'w', encoding='utf-8') as f:
|
|
|
|
toml.dump(config, f)
|
|
|
|
|
2023-05-01 01:12:14 +00:00
|
|
|
myutils.set_logging_level(config["default_loglevel"])
|
|
|
|
|
2023-05-01 00:46:08 +00:00
|
|
|
|
2023-05-01 01:58:02 +00:00
|
|
|
# Either pull the token from a file, or get the login from the command
|
|
|
|
# line if that doesn't work. WILL test your token against the real API
|
|
|
|
# even if it's pulled from file!
|
|
|
|
def authenticate(config, context: contentapi.ApiContext):
|
|
|
|
message = "No token file found"
|
|
|
|
if os.path.isfile(config["tokenfile"]):
|
|
|
|
with open(config["tokenfile"], 'r') as f:
|
|
|
|
token = f.read()
|
2023-05-01 02:08:00 +00:00
|
|
|
logging.debug("Token from file: " + token)
|
|
|
|
if context.is_token_valid(token):
|
2023-05-01 01:58:02 +00:00
|
|
|
context.token = token
|
|
|
|
logging.info("Logged in using token file " + config["tokenfile"])
|
|
|
|
return
|
|
|
|
else:
|
|
|
|
message = "Token file expired"
|
|
|
|
|
2023-05-01 02:08:00 +00:00
|
|
|
message += ", Please enter login for " + config["api"]
|
|
|
|
|
2023-05-01 01:58:02 +00:00
|
|
|
while True:
|
2023-05-01 02:08:00 +00:00
|
|
|
print(message)
|
2023-05-01 01:58:02 +00:00
|
|
|
username = input("Username: ")
|
|
|
|
password = getpass.getpass("Password: ")
|
|
|
|
try:
|
|
|
|
token = context.login(username, password, config["expire_seconds"])
|
|
|
|
with open(config["tokenfile"], 'w') as f:
|
|
|
|
f.write(token)
|
|
|
|
logging.info("Token accepted, written to " + config["tokenfile"])
|
|
|
|
context.token = token
|
2023-05-01 02:08:00 +00:00
|
|
|
return
|
2023-05-01 01:58:02 +00:00
|
|
|
except Exception as ex:
|
2023-05-01 02:08:00 +00:00
|
|
|
print("ERROR: %s" % ex)
|
|
|
|
message = "Please try logging in again:"
|
2023-05-01 01:58:02 +00:00
|
|
|
|
|
|
|
|
2023-04-30 22:18:25 +00:00
|
|
|
# Because python reasons
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|