# Copyright (C) 2025 James Brotosky, Brandon Wickline # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . #TODO Continue implementing logger #TODO Add input sanitation and CSV injection prevention #TODO Continue OTP and Local approval rewrites #TODO Explore pywin32 #TODO Fix Requirements.txt #TODO Create Generic system_config.json for gitea import logging import os import dotenv import urllib3 from Server.scheduler_async import start_scheduler, register_function, recurring_job, reload_jobs from services.API import AirlockAPIWrapper from services.security import getAPI from utils.setup import setup import flows.localApproval as la from services.policyhandler import updateAuditPoliciesFromEnforcementPolices urllib3.disable_warnings( urllib3.exceptions.InsecureRequestWarning ) def main(): #Determine working directory, setup directory, configure logging, sent env, get API and URL if not already stored working_dir = setup() logger = logging.getLogger(__name__) dotenv.load_dotenv(dotenv_path=working_dir / ".env") try: url = os.getenv("URL") username = os.getenv("USERNAME") if not url: raise ValueError("Missing URL in environment variables.") if not username: raise ValueError("Missing USERNAME in environment variables.") logger.debug(f"Retrieved URL: {url}") logger.debug(f"Retrieved Username: {username}") except ValueError as e: logger.error(f"Configuration error: {e}", exc_info=True) raise api = AirlockAPIWrapper( base_url=str(os.getenv("URL")), api_key = getAPI(username, "AirlockTools"), ) logger.info("Running non-interactively to start monitoring Airlock Changes") register_function("monitorLA", la.scheduleAddingLAHashes) register_function("updateAuditPolicies", updateAuditPoliciesFromEnforcementPolices) if not os.path.exists("scheduling\\jobs.json"): recurring_job("monitorLA", "monitorLA", interval=50, unit="seconds", args=[api]) recurring_job("updateAuditPolicies", "updateAudit", interval=5, unit="minutes", args=[api]) else: reload_jobs() start_scheduler() if __name__ == "__main__": main()