summaryrefslogblamecommitdiff
path: root/adelie-build-txz
blob: 7776527e0ce1c76b7ceae1e94b910f2e26267558 (plain) (tree)
1
2
3
4


                    
                   












































                                                                                    
                                                                                  















                                                                                               


                               













































                                                                                           
                                       
                                                            




                                                                                                     






                                                                    






                                                                        







                                                                                   
 



                                                                        
 





                                                                                           
 






                                                                                      








                                                                                                
                                                     


                                          





                                                                                      


          
                                                

                       
                                                                                       
























                                                                     
#!/bin/sh

def_arch=$(uname -m)
def_ver="1.0-beta4"
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-core dash-binsh"
		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
	apk --arch $ARCH \
		-X "$URL/system/$EXTRA_MIRROR" \
		-X "$URL/user/$EXTRA_MIRROR" \
		-U --root rootfs-$ARCH --initdb add $PACKAGES $ARCH_PKGS
}

make_structure() {
	if test -n "${MINI+mini}"; then
		echo 'adelie-mini' > rootfs-$ARCH/etc/hostname
	else
		echo 'adelie-root' > rootfs-$ARCH/etc/hostname

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

		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

		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 -r rootfs-$ARCH/boot/* out/kernels/$ARCH/
	fi

	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/resolv.conf <<- RESOLVE
		nameserver 2620:fe::fe
		nameserver 9.9.9.9
		nameserver 149.112.112.112
	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
}

tar_it() {
	header 'Creating file system archive...'

	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