#!/usr/bin/env python3 """ Module for backend talk with Jenkins executed by the web/CGI """ from argparse import ArgumentParser from subprocess import run import html from config import (jarargs, jobpath) def add_job(jobname): """ Function for adding a job to Jenkins. """ info = jobname.split('-') desc = 'WebSDK build for: %s\nStarted: %s' % (info[0], info[2]) sdk = info[1].split('_')[0] arch = info[1].split('_')[1] blendfile = '%s/%s/Dockerfile' % (jobpath, jobname) if sdk == 'arm': board = info[1].split('_')[2] zshcmd = 'load devuan %s %s' % (board, blendfile) elif sdk == 'live': zshcmd = 'load devuan %s %s' % (arch, blendfile) elif sdk == 'vm': zshcmd = 'load devuan %s' % (blendfile) command = "zsh -f -c 'source sdk && %s && build_image_dist'" % zshcmd command = html.escape(command) replacements = [('DESC', desc), ('SDK', sdk), ('ARCH', arch), ('COMMAND', command)] sdk_job = open('toasterbuild.xml', encoding='utf-8').read() for i in replacements: sdk_job = sdk_job.replace('{{{%s}}}' % i[0], i[1]) jarargs.append('create-job') jarargs.append(jobname.replace('@', 'AT')) return run(jarargs, input=sdk_job.encode()) def del_job(jobname): """ Function for deleting a Jenkins job. """ jarargs.append('delete-job') jarargs.append(jobname.replace('@', 'AT')) return run(jarargs) def run_job(jobname): """ Function for running a Jenkins job. """ jarargs.append('build') jarargs.append(jobname.replace('@', 'AT')) return run(jarargs) def main(): """ Main routine. """ parser = ArgumentParser() parser.add_argument('-a', '--add', action='store_true') parser.add_argument('-d', '--delete', action='store_true') parser.add_argument('-n', '--dryrun', action='store_true') parser.add_argument('-r', '--run', action='store_true') parser.add_argument('jobname') # NOTE: jobname should be email-arch-date, and a predefined directory # somewhere on the filesystem. e.g.: # - parazyd@dyne.org-vm_amd64-198374198 # - parazyd@dyne.org-arm_armhf_raspi2-2198361991 args = parser.parse_args() if args.add: if args.dryrun: print('Would add:', args.jobname) return print('Adding job:', args.jobname) add_job(args.jobname) elif args.delete: if args.dryrun: print('Would remove:', args.jobname) return print('Removing job:', args.jobname) del_job(args.jobname) elif args.run: if args.dryrun: print('Would build:', args.jobname) return print('Building job:', args.jobname) run_job(args.jobname) if __name__ == '__main__': main()