summaryrefslogblamecommitdiff
path: root/adelie-build-txz
blob: f249480fd2ae692d9c2fc003528267554dd42e51 (plain) (tree)
















































                                                                                    
                                                                                  















                                                                                               


                               













































                                                                                           






                                                                                                     


































































                                                                                                
                                                                                       
























                                                                     
#!/bin/sh

def_arch=$(uname -m)
def_ver="1.0-beta1"
declare -r PROGNAME=$(basename $0)


warn() {
    printf '>>> '
    printf '\033[01;33mWARNING\033[00;39m '
    printf '>>> '
    printf '\033[01;33mWARNING\033[00;39m '
    printf '>>> '
    printf '\033[01;33mWARNING\033[00;39m '
    printf '>>> '
    printf '\033[01;33mWARNING\033[00;39m '
    printf '>>>\n'
}


fatal() {
    printf '>>> '
    printf '\033[01;31mERROR\033[00;39m '
    printf '>>> '
    printf '\033[01;31mERROR\033[00;39m '
    printf '>>> '
    printf '\033[01;31mERROR\033[00;39m '
    printf '>>> '
    printf '\033[01;31mERROR\033[00;39m '
    printf '>>>\n'
}


ensure_commands() {
    if ! type apk>/dev/null 2>/dev/null; then
        fatal
        printf 'You must have apk installed.  On Gentoo, see sys-devel/apk-tools.\n'
        exit -1
    fi

    if ! type tar>/dev/null 2>/dev/null; then
        fatal
        printf 'You must have tar installed.\n'
        exit -1
    fi
}


usage() {
    printf 'usage: %s [-a ARCH] [--mini] [-s] [-v VERSION] [--help]\n\n' $PROGNAME
    printf 'Create an Adélie Linux root FS tarball (.TXZ) using the specified parameters.\n\n'
    printf 'Default ARCH: %s\n' $def_arch
    printf 'Default VERSION: %s\n' $def_ver
}


while [ -n "$1" ]; do
    case $1 in
        -a | --arch)
            shift
            declare -r MY_ARCH=$1
            ;;
        -h | --help)
            usage
            exit
            ;;
	--mini)
	    declare -r MINI=yes
	    ;;
        -s | --sign)
            declare -r SIGN=yes
            ;;
        -v | --version)
            shift
            declare -r MY_VER=$1
            ;;
        *)
            usage >&2
            exit -1
            ;;
    esac
    shift
done

set -a
declare -r ARCH=${MY_ARCH:-$def_arch}
declare -r LDARCH=${LDARCH:-$ARCH}
declare -r PHASE=${MY_PHASE:-all}
declare -r VERSION=${MY_VER:-$def_ver}
declare -r URL=${MY_URL:-https://distfiles.adelielinux.org/adelie/$VERSION/}
set +a

ensure_commands

header() {
	printf '\033[01;32m * \033[37m%s\033[00;39m\n' "$1"
}

header 'Adélie Linux Root FS Tarball Creation Tool'
printf '\n'

clean_dirs() {
	warn
	printf 'This will erase all files at the directories %s/rootfs-%s.\n\n' `pwd` $ARCH
	printf 'When you are ready, press RETURN.  To cancel, press Ctrl-C.\n'
	read

	rm -rf rootfs-$ARCH
	mkdir rootfs-$ARCH
	mkdir -p out
}

install_pkgs() {
	header "Installing base system to tar root..."

	if test -n "${MINI+mini}"; then
		declare -r PACKAGES="adelie-base-posix bash-binsh ssmtp"
		declare -r ARCH_PKGS=""
	else
		declare -r PACKAGES=$(cat packages 2>/dev/null || fatal 'No core packages specified')
		declare -r ARCH_PKGS=$(cat packages-$ARCH 2>/dev/null || echo '')
	fi

	mkdir -p rootfs-$ARCH/etc/apk/keys
	cp 'packages@adelielinux.org.pub' rootfs-$ARCH/etc/apk/keys/
	# XXX: Handle pre-install scripts.
	mkdir -p rootfs-$ARCH/dev
	mknod rootfs-$ARCH/dev/urandom c 1 9
	mkdir -p rootfs-$ARCH/usr/sbin
	cp addgroup adduser rootfs-$ARCH/usr/sbin/
	apk --arch $ARCH \
		-X "$URL/system/$EXTRA_MIRROR" \
		-X "$URL/user/$EXTRA_MIRROR" \
		-U --root rootfs-$ARCH --initdb add $PACKAGES $ARCH_PKGS
}

make_structure() {
	mkdir -p rootfs-$ARCH/etc/runlevels/{sysinit,boot,default,shutdown}

	echo 'adelie-root' > rootfs-$ARCH/etc/hostname
	echo 'mtab_is_file=no' > rootfs-$ARCH/etc/conf.d/mtab

	for siservice in udev udev-trigger lvmetad; do
		ln -s /etc/init.d/$siservice \
		   rootfs-$ARCH/etc/runlevels/sysinit/$siservice
	done

	for bootservice in root binfmt bootmisc fsck hostname hwclock keymaps \
	    localmount loopback modules mtab procfs sysctl sysfsconf termencoding \
	    tmpfiles.setup urandom; do
		ln -s /etc/init.d/$bootservice \
		   rootfs-$ARCH/etc/runlevels/boot/$bootservice
	done

	cat >rootfs-$ARCH/etc/fstab <<- FSTAB
		# Welcome to Adélie Linux.
		# This fstab(5) is for the live media only.  Edit for use for your installation.

		tmpfs	/tmp		tmpfs	defaults	0	1
		proc	/proc		proc	defaults	0	1
	FSTAB

	cat >rootfs-$ARCH/etc/shells <<- SHELLS
		/bin/bash
		/bin/zsh
	SHELLS

	cat >rootfs-$ARCH/etc/resolv.conf <<- RESOLVE
		nameserver 84.200.69.80
		nameserver 2001:1608:10:25::1c04:b12f
	RESOLVE

	cat >rootfs-$ARCH/etc/apk/repositories <<-REPOS
		https://distfiles.adelielinux.org/adelie/$VERSION/system/$EXTRA_MIRROR
		https://distfiles.adelielinux.org/adelie/$VERSION/user/$EXTRA_MIRROR
	REPOS

	cp AdelieTux.icns rootfs-$ARCH/.VolumeIcon.icns

	# Put a copy of the kernel(s) in the kernels-$ARCH/ directory, so that
	# users may download them for netbooting or such.
	mkdir -p out/kernels/$ARCH
	cp rootfs-$ARCH/boot/* out/kernels/$ARCH/
}

tar_it() {
	header 'Creating compressed file system image...'

	cd rootfs-$ARCH
	tar -cJf ../out/adelie-rootfs-${MINI+mini-}$ARCH-$VERSION-$(date +%Y%m%d).txz .
}

# in case we want to add phase support like adelie-build-cd has later
case $PHASE in
	clean)
		clean_dirs
		;;
	install)
		install_pkgs
		make_structure
		;;
	tar)
		tar_it
		;;
	*)
		clean_dirs
		install_pkgs
		make_structure
		tar_it
		;;
#	*)
#		fatal
#		printf 'Unknown phase %s.  Stop.\n' $PHASE
#		;;
esac