139 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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'))
 |