diff --git a/.gitignore b/.gitignore index 5ac2c2d..6bdb7c6 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ __pycache__ /example/gitea/x .pytest_cache/ .coverage +/scripts/jail +/scripts/focker-bsdinstall.not-needed diff --git a/focker/bootstrap.py b/focker/bootstrap.py index 58c5400..d2f06c9 100644 --- a/focker/bootstrap.py +++ b/focker/bootstrap.py @@ -7,6 +7,8 @@ from .zfs import zfs_poolname, \ def command_bootstrap(args): + if args.empty and args.non_interactive: + raise ValueError('--empty and --non-interactive are mutually exclusive') version = subprocess.check_output(['freebsd-version']).decode('utf-8') print('FreeBSD version:', version) tags = args.tags or [ 'freebsd-' + version.split('-')[0], 'freebsd-latest' ] @@ -15,10 +17,13 @@ def command_bootstrap(args): name = find_prefix(poolname + '/focker/images/', sha256) subprocess.check_output(['zfs', 'create', '-o', 'focker:sha256=' + sha256, name]) zfs_tag(name, tags) - if not args.empty: + res = None + if args.non_interactive: + res = subprocess.run(['focker-bsdinstall', zfs_mountpoint(name)]) + elif not args.empty: res = subprocess.run(['bsdinstall', 'jail', zfs_mountpoint(name)]) - if res.returncode != 0: - zfs_run(['zfs', 'destroy', '-r', '-f', name]) - raise ValueError('bsdinstall failed') + if res is not None and res.returncode != 0: + zfs_run(['zfs', 'destroy', '-r', '-f', name]) + raise ValueError('bsdinstall failed') subprocess.check_output(['zfs', 'set', 'rdonly=on', name]) subprocess.check_output(['zfs', 'snapshot', name + '@1']) diff --git a/focker/focker.py b/focker/focker.py index f1dae3e..a8b85fa 100644 --- a/focker/focker.py +++ b/focker/focker.py @@ -82,6 +82,7 @@ def create_parser(): parser.set_defaults(func=command_bootstrap) parser.add_argument('--tags', '-t', type=str, nargs='+', default=None) parser.add_argument('--empty', '-e', action='store_true') + parser.add_argument('--non-interactive', '-ni', action='store_true') # image subparsers = ListForwarder([ subparsers_top.add_parser(cmd).add_subparsers(dest='L2_command') \ diff --git a/scripts/focker-bsdinstall b/scripts/focker-bsdinstall new file mode 100644 index 0000000..6a2f664 --- /dev/null +++ b/scripts/focker-bsdinstall @@ -0,0 +1,68 @@ +#!/bin/sh + +if [ -z "$1" ]; then + echo "Usage: focker-bsdinstall chroot_dir" + exit 1 +fi + +BSDCFG_SHARE="/usr/share/bsdconfig" +. $BSDCFG_SHARE/common.subr || exit 1 + +: ${BSDINSTALL_TMPETC="/tmp/bsdinstall_etc"}; export BSDINSTALL_TMPETC +: ${BSDINSTALL_TMPBOOT="/tmp/bsdinstall_boot"}; export BSDINSTALL_TMPBOOT +: ${PATH_FSTAB="$BSDINSTALL_TMPETC/fstab"}; export PATH_FSTAB +: ${BSDINSTALL_DISTDIR="/usr/freebsd-dist"}; export BSDINSTALL_DISTDIR +: ${BSDINSTALL_CHROOT="/mnt"}; export BSDINSTALL_CHROOT + +echo "Began Installation at" "$( date )" +export BSDINSTALL_CHROOT=$1 + +error() { + if [ -n "$1" ]; then + echo "$1" >&2 + fi + exit $FAILURE +} + +rm -rf $BSDINSTALL_TMPETC +mkdir $BSDINSTALL_TMPETC +mkdir -p $1 || error "mkdir failed for $1" + +test ! -d $BSDINSTALL_DISTDIR && mkdir -p $BSDINSTALL_DISTDIR + +# echo "BSDINSTALL_DISTDIR: $BSDINSTALL_DISTDIR" +# exit + +export DISTRIBUTIONS="base.txz" + +FETCH_DISTRIBUTIONS="" +for dist in $DISTRIBUTIONS; do + if [ ! -f $BSDINSTALL_DISTDIR/$dist ]; then + FETCH_DISTRIBUTIONS="$FETCH_DISTRIBUTIONS $dist" + fi +done +FETCH_DISTRIBUTIONS=`echo $FETCH_DISTRIBUTIONS` # Trim white space + +if [ -n "$FETCH_DISTRIBUTIONS" -a -z "$BSDINSTALL_DISTSITE" ]; then + BSDINSTALL_DISTSITE=`focker-mirrorselect` + export BSDINSTALL_DISTSITE +fi + +if [ ! -z "$FETCH_DISTRIBUTIONS" ]; then + bsdinstall distfetch || error "Failed to fetch distribution" +fi + +bsdinstall checksum || error "Distribution checksum failed" +bsdinstall distextract || error "Distribution extract failed" +# bsdinstall rootpass || error "Could not set root password" +echo "Setting random root password ..." +openssl rand -base64 8 | md5 | head -c32 | chroot "$BSDINSTALL_CHROOT" pw user mod root -h 0 + +bsdinstall config || error "Failed to save config" +cp /etc/resolv.conf $1/etc +cp /etc/localtime $1/etc + +bsdinstall entropy + +echo "Installation Completed at" "$(date)" +exit $SUCCESS diff --git a/scripts/focker-mirrorselect b/scripts/focker-mirrorselect new file mode 100644 index 0000000..30254fe --- /dev/null +++ b/scripts/focker-mirrorselect @@ -0,0 +1,139 @@ +#!/bin/sh + +MIRROR1=ftp://ftp.freebsd.org +MIRROR2=ftp://ftp.freebsd.org +MIRROR3=ftp://ftp3.ie.freebsd.org +MIRROR4=ftp://ftp2.jp.freebsd.org +MIRROR5=ftp://ftp4.se.freebsd.org +MIRROR6=ftp://ftp4.us.freebsd.org +MIRROR7=ftp://ftp2.tr.freebsd.org +MIRROR8=ftp://ftp1.freebsd.org +MIRROR9=ftp://ftp2.freebsd.org +MIRROR10=ftp://ftp3.freebsd.org +MIRROR11=ftp://ftp4.freebsd.org +MIRROR12=ftp://ftp5.freebsd.org +MIRROR13=ftp://ftp6.freebsd.org +MIRROR14=ftp://ftp7.freebsd.org +MIRROR15=ftp://ftp10.freebsd.org +MIRROR16=ftp://ftp11.freebsd.org +MIRROR17=ftp://ftp12.freebsd.org +MIRROR18=ftp://ftp13.freebsd.org +MIRROR19=ftp://ftp14.freebsd.org +MIRROR20=ftp://ftp1.am.freebsd.org +MIRROR21=ftp://ftp.au.freebsd.org +MIRROR22=ftp://ftp2.au.freebsd.org +MIRROR23=ftp://ftp3.au.freebsd.org +MIRROR24=ftp://ftp.at.freebsd.org +MIRROR25=ftp://ftp2.br.freebsd.org +MIRROR26=ftp://ftp3.br.freebsd.org +MIRROR27=ftp://ftp4.br.freebsd.org +MIRROR28=ftp://ftp.ca.freebsd.org +MIRROR29=ftp://ftp.cn.freebsd.org +MIRROR30=ftp://ftp.cz.freebsd.org +MIRROR31=ftp://ftp.dk.freebsd.org +MIRROR32=ftp://ftp.ee.freebsd.org +MIRROR33=ftp://ftp.fi.freebsd.org +MIRROR34=ftp://ftp.fr.freebsd.org +MIRROR35=ftp://ftp3.fr.freebsd.org +MIRROR36=ftp://ftp4.fr.freebsd.org +MIRROR37=ftp://ftp5.fr.freebsd.org +MIRROR38=ftp://ftp6.fr.freebsd.org +MIRROR39=ftp://ftp7.fr.freebsd.org +MIRROR40=ftp://ftp8.fr.freebsd.org +MIRROR41=ftp://ftp.de.freebsd.org +MIRROR42=ftp://ftp2.de.freebsd.org +MIRROR43=ftp://ftp4.de.freebsd.org +MIRROR44=ftp://ftp5.de.freebsd.org +MIRROR45=ftp://ftp6.de.freebsd.org +MIRROR46=ftp://ftp7.de.freebsd.org +MIRROR47=ftp://ftp8.de.freebsd.org +MIRROR48=ftp://ftp.gr.freebsd.org +MIRROR49=ftp://ftp2.gr.freebsd.org +MIRROR50=ftp://ftp3.ie.freebsd.org +MIRROR51=ftp://ftp.il.freebsd.org +MIRROR52=ftp://ftp.it.freebsd.org +MIRROR53=ftp://ftp.jp.freebsd.org +MIRROR54=ftp://ftp2.jp.freebsd.org +MIRROR55=ftp://ftp3.jp.freebsd.org +MIRROR56=ftp://ftp4.jp.freebsd.org +MIRROR57=ftp://ftp5.jp.freebsd.org +MIRROR58=ftp://ftp6.jp.freebsd.org +MIRROR59=ftp://ftp7.jp.freebsd.org +MIRROR60=ftp://ftp8.jp.freebsd.org +MIRROR61=ftp://ftp9.jp.freebsd.org +MIRROR62=ftp://ftp.kr.freebsd.org +MIRROR63=ftp://ftp2.kr.freebsd.org +MIRROR64=ftp://ftp.lv.freebsd.org +MIRROR65=ftp://ftp.lt.freebsd.org +MIRROR66=ftp://ftp.nl.freebsd.org +MIRROR67=ftp://ftp2.nl.freebsd.org +MIRROR68=ftp://ftp.nz.freebsd.org +MIRROR69=ftp://ftp.no.freebsd.org +MIRROR70=ftp://ftp.pl.freebsd.org +MIRROR71=ftp://ftp2.pl.freebsd.org +MIRROR72=ftp://ftp.ru.freebsd.org +MIRROR73=ftp://ftp2.ru.freebsd.org +MIRROR74=ftp://ftp4.ru.freebsd.org +MIRROR75=ftp://ftp5.ru.freebsd.org +MIRROR76=ftp://ftp6.ru.freebsd.org +MIRROR77=ftp://ftp.sk.freebsd.org +MIRROR78=ftp://ftp2.sk.freebsd.org +MIRROR79=ftp://ftp.si.freebsd.org +MIRROR80=ftp://ftp.za.freebsd.org +MIRROR81=ftp://ftp2.za.freebsd.org +MIRROR82=ftp://ftp4.za.freebsd.org +MIRROR83=ftp://ftp.es.freebsd.org +MIRROR84=ftp://ftp3.es.freebsd.org +MIRROR85=ftp://ftp.se.freebsd.org +MIRROR86=ftp://ftp2.se.freebsd.org +MIRROR87=ftp://ftp3.se.freebsd.org +MIRROR88=ftp://ftp4.se.freebsd.org +MIRROR89=ftp://ftp6.se.freebsd.org +MIRROR90=ftp://ftp.ch.freebsd.org +MIRROR91=ftp://ftp.tw.freebsd.org +MIRROR92=ftp://ftp2.tw.freebsd.org +MIRROR93=ftp://ftp3.tw.freebsd.org +MIRROR94=ftp://ftp4.tw.freebsd.org +MIRROR95=ftp://ftp6.tw.freebsd.org +MIRROR96=ftp://ftp11.tw.freebsd.org +MIRROR97=ftp://ftp.uk.freebsd.org +MIRROR98=ftp://ftp2.uk.freebsd.org +MIRROR99=ftp://ftp3.uk.freebsd.org +MIRROR100=ftp://ftp4.uk.freebsd.org +MIRROR101=ftp://ftp5.uk.freebsd.org +MIRROR102=ftp://ftp.ua.freebsd.org +MIRROR103=ftp://ftp7.ua.freebsd.org +MIRROR104=ftp://ftp1.us.freebsd.org +MIRROR105=ftp://ftp2.us.freebsd.org +MIRROR106=ftp://ftp3.us.freebsd.org +MIRROR107=ftp://ftp4.us.freebsd.org +MIRROR108=ftp://ftp5.us.freebsd.org +MIRROR109=ftp://ftp6.us.freebsd.org +MIRROR110=ftp://ftp8.us.freebsd.org +MIRROR111=ftp://ftp10.us.freebsd.org +MIRROR112=ftp://ftp11.us.freebsd.org +MIRROR113=ftp://ftp13.us.freebsd.org +MIRROR114=ftp://ftp14.us.freebsd.org +MIRROR115=ftp://ftp15.us.freebsd.org + +x=`jot -r 1 1 115` +# echo $x +x=MIRROR${x} +eval MIRROR=\$${x} + +_UNAME_R=`uname -r` +_UNAME_R=${_UNAME_R%-p*} + +case ${_UNAME_R} in + *-CURRENT|*-STABLE|*-PRERELEASE) + RELDIR="snapshots" + ;; + *) + RELDIR="releases" + ;; +esac + +BSDINSTALL_DISTSITE="$MIRROR/pub/FreeBSD/${RELDIR}/`uname -m`/`uname -p`/${_UNAME_R}" +export BSDINSTALL_DISTSITE + +echo $BSDINSTALL_DISTSITE diff --git a/setup.py b/setup.py index 8f296cb..9a1d89e 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from distutils.core import setup setup( name='focker', - version='0.91', + version='0.95', author='Stanislaw Adaszewski', author_email='s.adaszewski@gmail.com', url='https://github.com/sadaszewski/focker', @@ -10,7 +10,7 @@ setup( license='The GNU General Public License v3.0', description='Focker is a FreeBSD image orchestration tool in the vein of Docker.', long_description='Focker is a FreeBSD image orchestration tool in the vein of Docker.', - scripts=['scripts/focker'], + scripts=['scripts/focker', 'scripts/focker-bsdinstall', 'scripts/focker-mirrorselect'], install_requires=[ "tabulate", "jailconf",