import os from termcolor import colored import git from datetime import datetime from crontab import CronTab docks_dir = os.environ['DOCS_DIRECTORY'] modules = os.environ['ADD_MODULES'] repo = os.environ['GIT_REPO'] git_branch = os.environ['GIT_BRANCH'] auto_update = os.environ['AUTO_UPDATE'] interval = int(os.environ['UPDATE_INTERVAL']) def start(): """ Start mkdocs server :return: """ if modules != 'false': _install_modules(modules) if repo != 'false': _clone_repo(repo) _check_previous_installation() print('Starting MKDocs') os.chdir(docks_dir) if "DEV_ADDR" in os.environ: _dev_addr = os.environ['DEV_ADDR'] else: _dev_addr = '0.0.0.0:8000' os.system(f'mkdocs serve -a {_dev_addr} {_live_reload()} {_fast_mode()}') def _install_modules(modules): """ Install Additional Modules :param modules: str - List of modules to install :return: """ print(colored(f'Installing python modules: {modules}', 'green')) os.system(f'pip install -q {modules}') print(colored(f'Modules installed.', 'green')) def _check_previous_installation(): """ Check if previous installation present Creates empty documentation if none detected :return: """ if not os.path.exists(docks_dir + '/mkdocs.yml'): print(colored( f'No documentation found in ({docks_dir}). Creating new one.', 'yellow')) if not os.path.exists(docks_dir): os.mkdir(docks_dir) print(colored(f'Starting fresh installation', 'green')) os.system(f'mkdocs new {docks_dir}/') else: print( colored(f'Detected previous installation in ({docks_dir}).', 'green')) def _live_reload(): """ Live Reload Auto Reload on file change :return: """ if os.environ['LIVE_RELOAD_SUPPORT'] == 'false': print(colored(f'LIVE RELOAD - [ DISABLED ]', 'red')) reload = '--no-livereload' else: print(colored(f'LIVE RELOAD - [ ENABLED ]', 'green')) reload = '' return reload def _fast_mode(): """ Fast Mode Enables/Disables fast reload. Enabled: build only files that got changed Disabled: builds all files regardless of changes :return: """ if os.environ['FAST_MODE'] == 'false': print(colored(f'FAST_MODE - [ DISABLED ]', 'red')) fast = '' else: print(colored(f'FAST_MODE - [ ENABLED ]', 'green')) fast = '--dirtyreload' return fast def _set_auto_update(interval): """ Creates cron job for auto updating repository :param interval: (every x minutes) :return: """ os.system(f'crond') cron = CronTab(user='root') cron.remove_all() job = cron.new(command='bootstrap update', comment='update') job.minute.every(interval) cron.write() def _clone_repo(repo): """ Clone Documentation Code from git repository :return: """ if not os.path.exists(docks_dir + '/mkdocs.yml'): print(colored(f'Getting documentation from: {repo}', 'green')) git.Repo.clone_from(repo, docks_dir, branch=git_branch) if auto_update == 'true': print(colored(f'AUTO_UPDATE - [ ENABLED ]', 'green')) print( colored(f'UPDATE_INTERVAL set to every {interval} minute/s', 'green')) _set_auto_update(interval) def update_repo(): """ Fetching latest changes :return: """ repo = git.Repo(docks_dir) for remote in repo.remotes: remote.fetch() remote.pull() headcommit = repo.head.commit commit_date = datetime.fromtimestamp(headcommit.authored_date) print(colored( f'Pulled branch: {git_branch} \nCommit: {headcommit.hexsha} \nCommit Message: {headcommit.message}Date: {commit_date} \nAuthor: {headcommit.committer.name}', 'green'))