Compare commits
	
		
			10 Commits
		
	
	
		
			f1bab6bc60
			...
			53f92032a4
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 53f92032a4 | |||
| b160b4a1e1 | |||
| 1690518197 | |||
| 732cc47405 | |||
| be668b1bdc | |||
| 53ed730957 | |||
| 9a89ce4f75 | |||
| 3cb68406ed | |||
| 33966071ce | |||
| 4e734330da | 
							
								
								
									
										151
									
								
								setup.sh
									
									
									
									
									
								
							
							
						
						
									
										151
									
								
								setup.sh
									
									
									
									
									
								
							@@ -461,14 +461,44 @@ function set_locale () {
 | 
				
			|||||||
    printf -- '%s\n' 'LANG=en_US.UTF-8' > '/mnt/etc/locale.conf'
 | 
					    printf -- '%s\n' 'LANG=en_US.UTF-8' > '/mnt/etc/locale.conf'
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function in_file_in_array_insert_n_before_m () {
 | 
				
			||||||
 | 
					    local arg_file arg_array arg_string arg_precede
 | 
				
			||||||
 | 
					    arg_file="${1:?}"
 | 
				
			||||||
 | 
					    arg_array="${2:?}"
 | 
				
			||||||
 | 
					    arg_string="${3:?}"
 | 
				
			||||||
 | 
					    arg_precede="${4:?}"
 | 
				
			||||||
 | 
					    sed -ri \
 | 
				
			||||||
 | 
					        -e 's'$'\x1''('"${arg_array}"'=)(.*?[( ])('"${arg_precede}"')([) ][^\r\n\f]*)'$'\x1''\1\2'"${arg_string}"' \3\4'$'\x1''g' \
 | 
				
			||||||
 | 
					        "${arg_file}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function in_file_in_array_insert_n_at_the_end () {
 | 
				
			||||||
 | 
					    local arg_file arg_array arg_string
 | 
				
			||||||
 | 
					    arg_file="${1:?}"
 | 
				
			||||||
 | 
					    arg_array="${2:?}"
 | 
				
			||||||
 | 
					    arg_string="${3:?}"
 | 
				
			||||||
 | 
					    sed -ri \
 | 
				
			||||||
 | 
					        -e 's'$'\x1''('"${arg_array}"'=)([^)]*)(\)[^\r\n\f]*)'$'\x1''\1\2 '"${arg_string}"'\3'$'\x1''g' \
 | 
				
			||||||
 | 
					        "${arg_file}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function in_file_in_array_remove_n () {
 | 
				
			||||||
 | 
					    local arg_file arg_array arg_string
 | 
				
			||||||
 | 
					    arg_file="${1:?}"
 | 
				
			||||||
 | 
					    arg_array="${2:?}"
 | 
				
			||||||
 | 
					    arg_string="${3:?}"
 | 
				
			||||||
 | 
					    sed -ri \
 | 
				
			||||||
 | 
					        -e 's'$'\x1''((\()('"${arg_string}"')(\)))'$'\x1''\2\4'$'\x1''g' \
 | 
				
			||||||
 | 
					        -e 's'$'\x1''('"${arg_array}"'=.*?)([[:space:]]+'"${arg_string}"')([[:space:]]+|\))'$'\x1''\1\3'$'\x1''g' \
 | 
				
			||||||
 | 
					        -e 's'$'\x1''('"${arg_array}"'=.*?)([[:space:]]+|\()('"${arg_string}"'[[:space:]]+)'$'\x1''\1\2'$'\x1''g' \
 | 
				
			||||||
 | 
					        "${arg_file}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function add_zfs_hook_to_initramfs () {
 | 
					function add_zfs_hook_to_initramfs () {
 | 
				
			||||||
    #1.16
 | 
					    #1.16
 | 
				
			||||||
    # Add zfs hook, remove fsck hook from initramfs.
 | 
					    # Add zfs hook, remove fsck hook from initramfs.
 | 
				
			||||||
    sed -ri \
 | 
					    in_file_in_array_insert_n_before_m '/mnt/etc/mkinitcpio.conf' 'HOOKS' 'zfs' 'filesystems'
 | 
				
			||||||
        -e 's'$'\x1''(HOOKS=)(.*?[( ])(filesystems)([) ][^\r\n\f]*)'$'\x1''\1\2zfs \3\4'$'\x1''g' \
 | 
					    in_file_in_array_remove_n '/mnt/etc/mkinitcpio.conf' 'HOOKS' 'fsck'
 | 
				
			||||||
        -e 's'$'\x1''((\()(fsck)(\)))'$'\x1''\2\4'$'\x1''g' \
 | 
					 | 
				
			||||||
        -e 's'$'\x1''(([[:space:]]+)(fsck)|(fsck)([[:space:]]+))'$'\x1'''$'\x1''g' \
 | 
					 | 
				
			||||||
        '/mnt/etc/mkinitcpio.conf'
 | 
					 | 
				
			||||||
    # Also unless encryption's unwanted add plain text key file into
 | 
					    # Also unless encryption's unwanted add plain text key file into
 | 
				
			||||||
    # initramfs since it's living inside an encrypted pool anyway.
 | 
					    # initramfs since it's living inside an encrypted pool anyway.
 | 
				
			||||||
    [[ ! "${ARCHZBM_ZFSPROPS_NO_ENCRYPTION}" ]] && sed -ri \
 | 
					    [[ ! "${ARCHZBM_ZFSPROPS_NO_ENCRYPTION}" ]] && sed -ri \
 | 
				
			||||||
@@ -674,6 +704,7 @@ EOF
 | 
				
			|||||||
function configure_zfsbootmenu () {
 | 
					function configure_zfsbootmenu () {
 | 
				
			||||||
    #2.9
 | 
					    #2.9
 | 
				
			||||||
    paru_install 'zfsbootmenu'
 | 
					    paru_install 'zfsbootmenu'
 | 
				
			||||||
 | 
					    in_file_in_array_remove_n '/etc/mkinitcpio.conf' 'HOOKS' 'zfsbootmenu'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if [[ "${part_schema}" = 'gpt' ]]; then
 | 
					    if [[ "${part_schema}" = 'gpt' ]]; then
 | 
				
			||||||
        cat > '/etc/zfsbootmenu/config.yaml' <<EOF
 | 
					        cat > '/etc/zfsbootmenu/config.yaml' <<EOF
 | 
				
			||||||
@@ -704,6 +735,7 @@ Components:
 | 
				
			|||||||
  Versions: false
 | 
					  Versions: false
 | 
				
			||||||
  ImageDir: /boot/syslinux/zfsbootmenu
 | 
					  ImageDir: /boot/syslinux/zfsbootmenu
 | 
				
			||||||
Kernel:
 | 
					Kernel:
 | 
				
			||||||
 | 
					  CommandLine: ro loglevel=0 zbm.import_policy=hostid
 | 
				
			||||||
  Prefix: vmlinuz
 | 
					  Prefix: vmlinuz
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
@@ -716,6 +748,112 @@ EOF
 | 
				
			|||||||
    zfs set org.zfsbootmenu:commandline='rw nowatchdog rd.vconsole.keymap=de-latin1' "${zpool_name}"'/root/'"${zfs_arch_dataset_name}"
 | 
					    zfs set org.zfsbootmenu:commandline='rw nowatchdog rd.vconsole.keymap=de-latin1' "${zpool_name}"'/root/'"${zfs_arch_dataset_name}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_dropbear_hooks () {
 | 
				
			||||||
 | 
					    mkdir -p '/opt/git/quico.space/quico-os-setup/mkinitcpio-dropbear-pacman-hook/branches/main'
 | 
				
			||||||
 | 
					    git -C '/opt/git/quico.space/quico-os-setup/mkinitcpio-dropbear-pacman-hook/branches/main' clone 'https://quico.space/quico-os-setup/mkinitcpio-dropbear-pacman-hook.git' .
 | 
				
			||||||
 | 
					    ln -s '/opt/git/quico.space/quico-os-setup/mkinitcpio-dropbear-pacman-hook/branches/main/pacman-mkinitcpio-dropbear-hook.hook' '/usr/share/libalpm/hooks/pacman-mkinitcpio-dropbear-hook.hook'
 | 
				
			||||||
 | 
					    ln -s '/opt/git/quico.space/quico-os-setup/mkinitcpio-dropbear-pacman-hook/branches/main/pacman-mkinitcpio-dropbear-install.hook' '/usr/share/libalpm/hooks/pacman-mkinitcpio-dropbear-install.hook'
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function customize_dropbear_hooks () {
 | 
				
			||||||
 | 
					    local env_archzbm_ssh_port env_archzbm_ssh_keepalive_intvl
 | 
				
			||||||
 | 
					    env_archzbm_ssh_port="${ARCHZBM_SSH_PORT:-22}"
 | 
				
			||||||
 | 
					    env_archzbm_ssh_keepalive_intvl="${ARCHZBM_SSH_KEEPALIVE_INTVL:-1}"
 | 
				
			||||||
 | 
					    if [[ "${env_archzbm_ssh_port}" -ne '22' ]] || [[ "${env_archzbm_ssh_keepalive_intvl}" -ne '1' ]]; then
 | 
				
			||||||
 | 
					        paru_install 'rsync'
 | 
				
			||||||
 | 
					        rsync -av '/opt/git/quico.space/quico-os-setup/mkinitcpio-dropbear-pacman-hook/branches/main/dropbear_hook'{,'.override'}'.patch'
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if [[ "${env_archzbm_ssh_port}" -ne '22' ]]; then
 | 
				
			||||||
 | 
					        sed -ri -e 's'$'\x1''-p [[:digit:]]+'$'\x1''-p '"${env_archzbm_ssh_port}"''$'\x1''g' '/opt/git/quico.space/quico-os-setup/mkinitcpio-dropbear-pacman-hook/branches/main/dropbear_hook.override.patch'
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if [[ "${env_archzbm_ssh_keepalive_intvl}" -ne '1' ]]; then
 | 
				
			||||||
 | 
					        sed -ri -e 's'$'\x1''-K [[:digit:]]+'$'\x1''-K '"${env_archzbm_ssh_keepalive_intvl}"''$'\x1''g' '/opt/git/quico.space/quico-os-setup/mkinitcpio-dropbear-pacman-hook/branches/main/dropbear_hook.override.patch'
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function ensure_ip_in_kcl () {
 | 
				
			||||||
 | 
					    local zbm_config kcl_length kcl_string default_ip ip_addr_found new_kcl first_kcl_elem
 | 
				
			||||||
 | 
					    local -a kcl
 | 
				
			||||||
 | 
					    paru_install 'go-yq'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    zbm_config='/etc/zfsbootmenu/config.yaml'
 | 
				
			||||||
 | 
					    kcl_length="$(yq '.Kernel.CommandLine | length' "${zbm_config}")"
 | 
				
			||||||
 | 
					    if [[ "${kcl_length}" -eq '0' ]]; then
 | 
				
			||||||
 | 
					        >&3 printf -- '%s\n' \
 | 
				
			||||||
 | 
					            'No .Kernel.CommandLine YAML element with content found in '"${zbm_config}"'. Exiting ...'
 | 
				
			||||||
 | 
					        exit 77
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        kcl_string="$(yq '.Kernel.CommandLine' "${zbm_config}")"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    default_ip='ip='"${ARCHZBM_NET_CLIENT_IP}"':'"${ARCHZBM_NET_SERVER_IP}"':'"${ARCHZBM_NET_GATEWAY_IP}"':'"${ARCHZBM_NET_NETMASK}"':'"${ARCHZBM_NET_HOSTNAME}"':'"${ARCHZBM_NET_DEVICE}"':'"${ARCHZBM_NET_AUTOCONF}"
 | 
				
			||||||
 | 
					    mapfile -t kcl < <(<<<"${kcl_string}" tr ' ' '\n' | sed '/^$/d')
 | 
				
			||||||
 | 
					    for kcl_elem in "${!kcl[@]}"; do
 | 
				
			||||||
 | 
					        if grep -Piq -- 'ip=' <<<"${kcl[$kcl_elem]}"; then
 | 
				
			||||||
 | 
					            ip_addr_found='true'
 | 
				
			||||||
 | 
					            kcl["${kcl_elem}"]="${default_ip}"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    if [[ ! "${ip_addr_found}" ]]; then
 | 
				
			||||||
 | 
					        kcl+=("${default_ip}")
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    new_kcl=''
 | 
				
			||||||
 | 
					    first_kcl_elem='true'
 | 
				
			||||||
 | 
					    for kcl_elem in "${kcl[@]}"; do
 | 
				
			||||||
 | 
					        if [[ ! "${first_kcl_elem}" ]]; then
 | 
				
			||||||
 | 
					            new_kcl+=' '"${kcl_elem}"
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            new_kcl+="${kcl_elem}"
 | 
				
			||||||
 | 
					            unset -v first_kcl_elem
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    yq -i '.Kernel.CommandLine = "'"${new_kcl}"'"' "${zbm_config}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function set_pub_keys () {
 | 
				
			||||||
 | 
					    local authorized_keys_file raw_pub_keys
 | 
				
			||||||
 | 
					    authorized_keys_file="${1:?}"
 | 
				
			||||||
 | 
					    raw_pub_keys="${2:?}"
 | 
				
			||||||
 | 
					    :> "${authorized_keys_file}"
 | 
				
			||||||
 | 
					    while IFS= read -r pub_key_line; do
 | 
				
			||||||
 | 
					        printf -- '%s\n' "${pub_key_line}" >> "${authorized_keys_file}"
 | 
				
			||||||
 | 
					    done < <(<<<"${raw_pub_keys}" sed -r -e 's/,,/\n/g')
 | 
				
			||||||
 | 
					    sed -i '/^$/d' "${authorized_keys_file}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function we_want_ssh () {
 | 
				
			||||||
 | 
					    #2.10
 | 
				
			||||||
 | 
					    if  [[ "${ARCHZBM_NET_CLIENT_IP}" ]]       || \
 | 
				
			||||||
 | 
					        [[ "${ARCHZBM_NET_SERVER_IP}" ]]       || \
 | 
				
			||||||
 | 
					        [[ "${ARCHZBM_NET_GATEWAY_IP}" ]]      || \
 | 
				
			||||||
 | 
					        [[ "${ARCHZBM_NET_NETMASK}" ]]         || \
 | 
				
			||||||
 | 
					        [[ "${ARCHZBM_NET_HOSTNAME}" ]]        || \
 | 
				
			||||||
 | 
					        [[ "${ARCHZBM_NET_DEVICE}" ]]          || \
 | 
				
			||||||
 | 
					        [[ "${ARCHZBM_NET_AUTOCONF}" ]]        || \
 | 
				
			||||||
 | 
					        [[ "${ARCHZBM_SSH_PORT}" ]]            || \
 | 
				
			||||||
 | 
					        [[ "${ARCHZBM_SSH_KEEPALIVE_INTVL}" ]] || \
 | 
				
			||||||
 | 
					        [[ "${ARCHZBM_SSH_AUTH_KEYS}" ]]; then
 | 
				
			||||||
 | 
					        >&3 printf -- '%s\n' 'Installing SSH in ZFSBootMenu'
 | 
				
			||||||
 | 
					        return 0
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    >&3 printf -- '%s\n' 'Not installing SSH in ZFSBootMenu'
 | 
				
			||||||
 | 
					    return 1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function configure_ssh_in_zbm () {
 | 
				
			||||||
 | 
					    #2.11
 | 
				
			||||||
 | 
					    get_dropbear_hooks
 | 
				
			||||||
 | 
					    customize_dropbear_hooks
 | 
				
			||||||
 | 
					    paru_install 'mkinitcpio-nfs-utils' 'dropbear' 'mkinitcpio-dropbear'
 | 
				
			||||||
 | 
					    in_file_in_array_insert_n_at_the_end '/etc/zfsbootmenu/mkinitcpio.conf' 'HOOKS' 'net'
 | 
				
			||||||
 | 
					    in_file_in_array_insert_n_at_the_end '/etc/zfsbootmenu/mkinitcpio.conf' 'HOOKS' 'dropbear'
 | 
				
			||||||
 | 
					    for key_type in 'dss' 'ecdsa' 'ed25519' 'rsa'; do
 | 
				
			||||||
 | 
					        dropbearkey -t "${key_type}" -f '/etc/dropbear/dropbear_'"${key_type}"'_host_key'
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    set_pub_keys '/etc/dropbear/root_key' "${ARCHZBM_SSH_AUTH_KEYS}"
 | 
				
			||||||
 | 
					    ensure_ip_in_kcl
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function add_syslinux_pacman_hook () {
 | 
					function add_syslinux_pacman_hook () {
 | 
				
			||||||
    mkdir -p '/opt/git/quico.space/quico-os-setup/zbm-syslinux-pacman-hook/branches/main'
 | 
					    mkdir -p '/opt/git/quico.space/quico-os-setup/zbm-syslinux-pacman-hook/branches/main'
 | 
				
			||||||
    git -C '/opt/git/quico.space/quico-os-setup/zbm-syslinux-pacman-hook/branches/main' clone 'https://quico.space/quico-os-setup/zbm-syslinux-pacman-hook.git' .
 | 
					    git -C '/opt/git/quico.space/quico-os-setup/zbm-syslinux-pacman-hook/branches/main' clone 'https://quico.space/quico-os-setup/zbm-syslinux-pacman-hook.git' .
 | 
				
			||||||
@@ -769,6 +907,9 @@ function install_os_in_chroot () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # Install ZFSBootMenu image
 | 
					    # Install ZFSBootMenu image
 | 
				
			||||||
    configure_zfsbootmenu                       #2.9
 | 
					    configure_zfsbootmenu                       #2.9
 | 
				
			||||||
 | 
					    if we_want_ssh; then                        #2.10
 | 
				
			||||||
 | 
					        configure_ssh_in_zbm                    #2.11
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
    generate-zbm
 | 
					    generate-zbm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Yes, we do this twice so we immediately get a functional backup file
 | 
					    # Yes, we do this twice so we immediately get a functional backup file
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user