OSDN Git Service

add ubuntuになる問題の修正
[alterlinux/LUBS.git] / lubs
diff --git a/lubs b/lubs
index cce1a79..034c400 100755 (executable)
--- a/lubs
+++ b/lubs
@@ -28,13 +28,35 @@ iso_filename="${iso_name}-${iso_version}-${arch}.iso"
 channel_name="serene"
 
 debug=false
+cache_only=false
 
 
+start_time="$(date +%s)"
+
+_msg_common() {
+    if [[ "${debug}" = true ]]; then
+        local _current_time="$(date +%s)"
+        local _time
+
+        _time="$(("${_current_time}"-"${start_time}"))"
+
+        if [[ "${_time}" -ge 3600 ]]; then
+            echo "[$(date -d @${_time} +%H:%M.%S)]$("${script_path}/echo_color" -t 6 "[LUBS Core]")"
+        elif [[ "${_time}" -ge 60 ]]; then
+            echo "[00:$(date -d @${_time} +%M.%S)]$("${script_path}/echo_color" -t 6 "[LUBS Core]")"
+        else
+            echo "[00:00.$(date -d @${_time} +%S)] $("${script_path}/echo_color" -t 6 "[LUBS Core]")"
+        fi
+    else
+        "${script_path}/echo_color" -t 6 "[LUBS Core]"
+    fi
+}
+
 # Show an INFO message
 # _msg_info <message>
 _msg_info() {
     local _msg="${@}"
-    echo "$("${script_path}/echo_color" -t 6 "[LUBS Core]")  $("${script_path}/echo_color" -t 2 "Info:") ${_msg}"
+    echo "$(_msg_common)  $("${script_path}/echo_color" -t 2 "Info:") ${_msg}"
 }
 
 # Show an debug message
@@ -42,7 +64,7 @@ _msg_info() {
 _msg_debug() {
     if [[ "${debug}" = true ]]; then
         local _msg="${@}"
-        echo "$("${script_path}/echo_color" -t 6 "[LUBS Core]")  $("${script_path}/echo_color" -t 3 "Debug:") ${_msg}"
+        echo "$(_msg_common)  $("${script_path}/echo_color" -t 3 "Debug:") ${_msg}"
     fi
 }
 
@@ -51,15 +73,25 @@ _msg_debug() {
 _msg_error() {
     local _msg="${1}"
     local _error=${2}
-    echo "$("${script_path}/echo_color" -t 6 "[LUBS Core]")  $("${script_path}/echo_color" -t 1 "Error:") ${_msg}"
+    echo "$(_msg_common)  $("${script_path}/echo_color" -t 1 "Error:") ${_msg}"
     if [[ ! ${_error} = 0 ]]; then
         exit ${_error}
     fi
 }
 
+# Unmount chroot dir
+umount_chroot () {
+    local mount
+    for mount in $(mount | awk '{print $3}' | grep $(realpath ${work_dir}) | sort -r); do
+        [[ "${1}" == debug ]] && _msg_debug "Unmounting ${mount}" || _msg_info "Unmounting ${mount}"
+        umount -fl "${mount}"
+    done
+}
+
 # Helper function to run make_*() only one time.
 run_once() {
     local name
+    umount_chroot
 
     if [[ "run_bootfiles" == "$1" ]]; then
         name="$2"
@@ -82,7 +114,13 @@ run_once() {
 }
 
 run_cmd() {
-    arch-chroot "${work_dir}/airootfs" "${@}"
+    for mount in "dev" "dev/pts" "proc" "sys" "run/systemd/resolve/stub-resolv.conf"; do
+        _msg_debug "Mounting  ${work_dir}/airootfs/${mount}"
+        [[ "${mount}" == "run/systemd/resolve/stub-resolv.conf" ]] && mount --bind /etc/resolv.conf "${work_dir}/airootfs/${mount}" || mount --bind /${mount} "${work_dir}/airootfs/${mount}"
+    done
+
+    chroot "${work_dir}/airootfs" "${@}"
+    umount_chroot debug
 }
 
 run_bootfiles() {
@@ -134,6 +172,29 @@ _usage () {
     echo "    -d | --debug           "
     echo "    -h | --help            This help message and exit"
     echo
+    echo "You can switch between installed packages, files included in images, etc. by channel."
+    echo
+    echo " Channel:"
+    local _channel
+    local channel_list
+    local description
+    for _channel in $(ls -l "${channels_dir}" | awk '$1 ~ /d/ {print $9 }'); do
+        if [[ -n $(ls "${channels_dir}/${_channel}") ]] && [[ ! "${_channel}" = "share" ]]; then
+            channel_list="${channel_list[@]} ${_channel}"
+        fi
+    done
+    for _channel in ${channel_list[@]}; do
+        if [[ -f "${channels_dir}/${_channel}/description.txt" ]]; then
+            description=$(cat "${channels_dir}/${_channel}/description.txt")
+        else
+            description="This channel does not have a description.txt."
+        fi
+        echo -ne "    ${_channel}"
+        for i in $( seq 1 $(( 23 - ${#_channel} )) ); do
+            echo -ne " "
+        done
+        echo -ne "${description}\n"
+    done
 }
 
 
@@ -145,11 +206,7 @@ prepare_build() {
     [[ ! -d "${work_dir}" ]] && mkdir -p "${work_dir}"
     [[ ! -d "${out_dir}" ]] && mkdir -p "${out_dir}"
 
-    local mount
-    for mount in $(mount | awk '{print $3}' | grep $(realpath ${work_dir}) | sort -r); do
-        _msg_info "Unmounting ${mount}"
-        umount "${mount}"
-    done
+    umount_chroot 
 
     # Check codename
     if [[ -z $(grep -h -v ^'#' ${channels_dir}/${channel_name}/codename.${arch} | grep -x ${codename}) ]]; then
@@ -160,18 +217,34 @@ prepare_build() {
 
 
 make_basefs() {
-    if [[ ! -d "${cache_dir}/${codename}" ]]; then
-        _msg_info "Installing Ubuntu to '${cache_dir}/${codename}'..."
-        mkdir -p "${cache_dir}/${codename}"
-        debootstrap --arch=${arch} --include=linux-image-generic  --verbose --merged-usr "${codename}" "${cache_dir}/${codename}" ${mirror}
-        _msg_info "${codename} installed successfully!"
-    else
+    local debootstrap_status
+    statusfile="${cache_dir}/${codename}/status"
+
+    debootstrap_status() {
+        if [[ ! -d "$(dirname ${statusfile})" ]]; then
+            mkdir -p "$(dirname ${statusfile})"
+        fi
+        echo "${1}" > "${statusfile}"
+    }
+
+    if [[ -f "${statusfile}" ]] && [[ $(cat "${statusfile}" 2> /dev/null) = "Done" ]]; then
         _msg_info "${codename} cache is found."
+    else
+        remove "${cache_dir}/${codename}"
+        debootstrap_status "Running"
+        _msg_info "Installing Ubuntu to '${cache_dir}/${codename}/airootfs'..."
+        mkdir -p "${cache_dir}/${codename}/airootfs"
+        debootstrap --arch=${arch} --include=linux-image-generic  --verbose --merged-usr "${codename}" "${cache_dir}/${codename}/airootfs" ${mirror}
+        _msg_info "${codename} installed successfully!"
+        debootstrap_status "Done"
+    fi
+    if [[ "${cache_only}" = true ]]; then
+        exit 0
     fi
     
     rm -rf "${work_dir}/airootfs" && mkdir -p "${work_dir}/airootfs"
-    _msg_info "copy base files from '${cache_dir}/${codename}' to '${work_dir}/airootfs'..."
-    rsync  -au "${cache_dir}/${codename}/" "${work_dir}/airootfs"
+    _msg_info "copy base files from '${cache_dir}/${codename}/airootfs' to '${work_dir}/airootfs'..."
+    rsync  -au "${cache_dir}/${codename}/airootfs/" "${work_dir}/airootfs"
     echo 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PATH}' >> "${work_dir}/airootfs/etc/bash.bashrc"
     run_cmd apt-get update
     # run_cmd apt-get upgrade
@@ -185,18 +258,18 @@ make_sourcelist() {
         _apt_install gnupg
 
         for repo in $(find ${channels_dir}/*/repo -name *.list); do
-            key="$(dirname $repo)/$(basename $repo | sed "s/list/key/")"
+            key="$(dirname ${repo})/$(basename ${repo} | sed "s/list/key/")"
             
-            if [[ -f "$key" ]]; then
-                if $(file $key | grep -q "PGP/GPG key"); then
-                    cp $key ${work_dir}/airootfs/$(basename $key)
+            if [[ -f "${key}" ]]; then
+                if $(file ${key} | grep -q "PGP/GPG key"); then
+                    cp ${key} ${work_dir}/airootfs/$(basename ${key})
                 else
-                    wget -q -O ${work_dir}/airootfs/$(basename $key) $(cat $key)
+                    wget -q -O ${work_dir}/airootfs/$(basename ${key}) $(cat ${key})
                 fi
 
-                run_cmd apt-key add $(basename $key)
-                rm ${work_dir}/airootfs/$(basename $key)
-                cp $repo ${work_dir}/airootfs/etc/apt/sources.list.d
+                run_cmd apt-key add $(basename ${key})
+                rm ${work_dir}/airootfs/$(basename ${key})
+                cp ${repo} ${work_dir}/airootfs/etc/apt/sources.list.d
             fi
         done
 
@@ -225,18 +298,35 @@ make_systemd() {
     run_cmd ln -fs /etc/machine-id /var/lib/dbus/machine-id
 }
 
-make_packages() {
-    remove "${work_dir}/airootfs/installpkglist"
+make_apt_packages() {
+    remove "${work_dir}/airootfs/aptpkglist"
 
     if [[ -f "${channels_dir}/share/packages.${arch}" ]]; then
-        grep -h -v ^'#' "${channels_dir}/share/packages.${arch}" | grep -v "^$" >> "${work_dir}/airootfs/installpkglist"
+        grep -h -v ^'#' "${channels_dir}/share/packages.${arch}" | grep -v "^$" >> "${work_dir}/airootfs/aptpkglist"
     fi
     if [[ -f "${channels_dir}/${channel_name}/packages.${arch}" ]]; then
-        grep -h -v ^'#' "${channels_dir}/${channel_name}/packages.${arch}" | grep -v "^$" >> "${work_dir}/airootfs/installpkglist"
+        grep -h -v ^'#' "${channels_dir}/${channel_name}/packages.${arch}" | grep -v "^$" >> "${work_dir}/airootfs/aptpkglist"
+    fi
+    if [[ -n "$(echo $(<"${work_dir}/airootfs/aptpkglist"))" ]]; then
+        run_cmd env -i bash -c 'DEBIAN_FRONTEND=noninteractive apt-get --no-install-recommends --yes install $(echo $(<aptpkglist))'
+    fi
+    remove "${work_dir}/airootfs/aptpkglist"
+}
+
+make_snap_packages() {
+    remove "${work_dir}/airootfs/snappkglist"
+
+    if [[ -f "${channels_dir}/share/snap-packages.${arch}" ]]; then
+        grep -h -v ^'#' "${channels_dir}/share/snap-packages.${arch}" | grep -v "^$" >> "${work_dir}/airootfs/snappkglist"
+    fi
+    if [[ -f "${channels_dir}/${channel_name}/snap-packages.${arch}" ]]; then
+        grep -h -v ^'#' "${channels_dir}/${channel_name}/snap-packages.${arch}" | grep -v "^$" >> "${work_dir}/airootfs/snappkglist"
     fi
-    if [[ -n "$(echo $(<"${work_dir}/airootfs/installpkglist"))" ]]; then
-        run_cmd env -i bash -c 'DEBIAN_FRONTEND=noninteractive apt-get --no-install-recommends --yes install $(echo $(<installpkglist))'
+    if [[ -n "$(echo $(<"${work_dir}/airootfs/snappkglist"))" ]]; then
+        _apt_install snapd
+        run_cmd env -i bash -c 'snap install $(echo $(<snappkglist))'
     fi
+    remove "${work_dir}/airootfs/snappkglist"
 }
 
 make_config() {
@@ -287,7 +377,7 @@ make_clean() {
 }
 
 make_bootfiles() {
-    run_cmd update-initramfs -c -k all
+    run_cmd env -i bash -c 'update-initramfs -c -k all'
     _apt_install memtest86+
     [[ -d "${bootfiles_dir}" ]] && rm -r "${bootfiles_dir}"
     mkdir -p ${bootfiles_dir}/{casper,isolinux,install}
@@ -352,6 +442,7 @@ make_isolinux() {
         --modules="linux16 linux normal iso9660 biosdisk search" \
         --locales="" \
         --fonts="" \
+        --themes="" \
         "boot/grub/grub.cfg=isolinux/grub.cfg"
     cat /usr/lib/grub/i386-pc/cdboot.img isolinux/core.img > isolinux/bios.img
 }
@@ -402,7 +493,7 @@ make_checksum() {
 # 参考記事:https://0e0.pw/ci83 https://0e0.pw/VJlg
 
 _opt_short="w:o:ha:-:m:c:d"
-_opt_long="help,arch:,codename:,debug,help,mirror:,out:,work"
+_opt_long="help,arch:,codename:,debug,help,mirror:,out:,work,cache-only"
 OPT=$(getopt -o ${_opt_short} -l ${_opt_long} -- "${@}")
 if [[ ${?} != 0 ]]; then
     exit 1
@@ -449,8 +540,6 @@ while :; do
             if [[ -z ${2} ]]; then
                 _msg_error "Please specify the out dir."
                 exit 1
-            else
-                out_dir="${2}"
             fi
             shift 2
             ;;
@@ -463,6 +552,10 @@ while :; do
             fi
             shift 2
             ;;
+        --cache-only)
+            cache_only=true
+            shift 1
+            ;;
         --)
             shift
             break
@@ -475,13 +568,43 @@ while :; do
 done
 
 bootfiles_dir="${work_dir}/bootfiles"
+trap  umount_chroot 0 2 15
+
+if [[ -n "${1}" ]]; then
+    channel_name="${1}"
+
+    check_channel() {
+        local channel_list
+        local i
+        channel_list=()
+        for _channel in $(ls -l "${channels_dir}" | awk '$1 ~ /d/ {print $9 }'); do
+            if [[ -n $(ls "${channels_dir}/${_channel}") ]] && [[ ! "${_channel}" = "share" ]]; then
+                channel_list="${channel_list[@]} ${_channel}"
+            fi
+        done
+        for i in ${channel_list[@]}; do
+            if [[ "${i}" = "${channel_name}" ]]; then
+                echo -n "true"
+                return 0
+            fi
+        done
+        echo -n "false"
+        return 1
+    }
+
+    if [[ $(check_channel ${channel_name}) = false ]]; then
+        _msg_error "Invalid channel ${channel_name}"
+        exit 1
+    fi
+fi
 
 
 prepare_build
 run_once make_basefs
 run_once make_sourcelist
 run_once make_systemd
-run_once make_packages
+run_once make_apt_packages
+#run_once make_snap_packages
 run_once make_config
 run_once make_customize_airootfs
 run_once make_clean