侠义书生 3 năm trước cách đây
mục cha
commit
37969756f9
1 tập tin đã thay đổi với 103 bổ sung60 xóa
  1. 103 60
      debootstrap/apt_list/my_debootstrap2.sh

+ 103 - 60
debootstrap/apt_list/my_debootstrap2.sh

@@ -65,7 +65,7 @@ function without2() {
 # 查找依赖 pkgname 的包
 function find_who_depend() {
     pkgname="bash"
-    result=$(awk -v SEARCH_STR="${pkgname}" -f depends.awk ${TARGET_DIR}/172.29.220.242/mirror/kylin/dists/v101/main/binary-amd64/Packages)
+    result=$(awk -v SEARCH_STR="${pkgname}" -f depends.awk ${path_to_package_file})
     echo "${result}"
 }
 
@@ -87,13 +87,13 @@ function get_deps() {
 function get_pkg_deps() {
     . analysis.sh
     pkgname="libpam-runtime"
-    analysis_sigle_file2 ${TARGET_DIR}/172.29.220.242/mirror/kylin/dists/v101/main/binary-amd64/Packages ${pkgname} |
+    analysis_sigle_file2 ${path_to_package_file} ${pkgname} |
         grep -E "^Depends:|^Pre-Depends" | sed 's/^.*Depends://' |
         tr ',' '\n' | sed 's/|.*//' | sed 's#(.*)##g' | xargs | tr ' ' '\n' | sort | uniq
 }
 
 # bash包依赖
-# resolve_deps bash
+# resolve_deps2 bash
 
 ########## functions ##########
 
@@ -116,11 +116,17 @@ function config_my() {
     SUITES="v101"
     COMPONENTS="main"
     ARCH="amd64"
+    TARGET_DIR="/var/tmp/download"
+    if [ ! -d "${TARGET_DIR}" ]; then
+        mkdir -p "${TARGET_DIR}"
+    fi
     TARGET="/var/tmp/rootfs"
+    if [ ! -d "${TARGET}" ]; then
+        sudo mkdir -p "${TARGET}"
+    fi
 }
 
 function download_indices() {
-    # ${MIRRORS%% *}
     for m in ${MIRRORS}; do
         for s in ${SUITES}; do
             sInRelease="${m}/dists/${s}/InRelease"
@@ -131,42 +137,56 @@ function download_indices() {
             wgetfile ${sRelease}
             wgetfile ${sRelease_gpg}
 
+            package_urls=""
             for c in ${COMPONENTS}; do
-                path="${m}/dists/$s/$c/binary-$ARCH/Packages.gz"
-                # echo ${path}
-                wgetfile ${path}
+                url="${m}/dists/$s/$c/binary-$ARCH/Packages.gz"
+                # echo ${url}
+                package_urls="${url} ${package_urls}"
+                wgetfile ${url}
             done
         done
     done
 }
 
-function resolve_deps() {
+function url_to_path() {
+    filepath="${TARGET_DIR}/${1#*//}"
+    echo ${filepath%.*}
+}
+
+function resolve_deps2() {
     local PKGS="$*"
     local ALLPKGS="$PKGS"
     local ALLPKGS2=""
+
     while [ "$PKGS" != "" ]; do
         # 查找依赖包
-        local NEWPKGS=""
-        NEWPKGS=$(echo "${PKGS}" | tr ' ' '\n' | xargs -i analysis.sh --repo "${TARGET_DIR}/172.29.220.242/mirror/kylin/dists" --pkg {} |
-            grep -E "^Depends:|^Pre-Depends" | sed 's/^.*Depends://' |
-            tr ',' '\n' | sed 's/|.*//' | sed 's#(.*)##g' | xargs | tr ' ' '\n' | sort | uniq)
-
+        local NEWPKGS=$(
+            for p in ${package_urls}; do
+                for i in $(echo "${PKGS}" | tr ' ' '\n'); do
+                    match="Package: ${i}"
+                    if grep -q "^${match}$" "$(url_to_path ${p})"; then
+                        sed -n "/^${match}$/,/^$/p" "$(url_to_path ${p})"
+                    fi
+                done
+            done | grep -E "^Depends:|^Pre-Depends" | sed 's/^.*Depends://' | tr ',' '\n' | sed 's/|.*//' | sed 's#(.*)##g' | xargs | tr ' ' '\n' | sort | uniq
+        )
         mylog "newpkgs.txt2" "$(echo ${NEWPKGS} | xargs | tr ' ' '\n')"
 
         PKGS=$(echo "$PKGS $NEWPKGS" | tr ' ' '\n' | sort | uniq)
 
         # 真实的包
         local REALPKGS=""
-        p="${TARGET_DIR}/172.29.220.242/mirror/kylin/dists/v101/main/binary-amd64/Packages"
-        for i in $PKGS; do
-            if grep -q "^Package: ${i}$" ${p}; then
-                # echo ${i}
-                if [ -n "${REALPKGS}" ]; then
-                    REALPKGS="${REALPKGS} ${i}"
-                else
-                    REALPKGS="${i}"
+        for p in ${package_urls}; do
+            for i in $PKGS; do
+                if grep -q "^Package: ${i}$" "$(url_to_path ${p})"; then
+                    # echo ${i}
+                    if [ -n "${REALPKGS}" ]; then
+                        REALPKGS="${REALPKGS} ${i}"
+                    else
+                        REALPKGS="${i}"
+                    fi
                 fi
-            fi
+            done
         done
 
         mylog "realpkgs.txt2" "$(echo ${REALPKGS} | xargs | tr ' ' '\n')"
@@ -182,17 +202,23 @@ function resolve_deps() {
 
 function work_out_debs() {
     PRIO="required"
-    required=$(awk -v SEARCH_STR="${PRIO}" -f ${SHELL_DIR}/analysis.awk ${TARGET_DIR}/172.29.220.242/mirror/kylin/dists/v101/main/binary-amd64/Packages)
+    required=$(
+        for p in ${package_urls}; do
+            awk -v SEARCH_STR="${PRIO}" -f ${SHELL_DIR}/analysis.awk "$(url_to_path ${p})"
+        done
+    )
     mylog "01-required.txt2" "${required}"
-
-    required_deps=$(resolve_deps "${required}")
+    required_deps=$(resolve_deps2 "${required}")
     mylog "01-required@deps.txt2" "$(echo ${required_deps} | xargs | tr ' ' '\n')"
 
     PRIO="important"
-    important=$(awk -v SEARCH_STR="${PRIO}" -f ${SHELL_DIR}/analysis.awk ${TARGET_DIR}/172.29.220.242/mirror/kylin/dists/v101/main/binary-amd64/Packages)
+    important=$(
+        for p in ${package_urls}; do
+            awk -v SEARCH_STR="${PRIO}" -f ${SHELL_DIR}/analysis.awk "$(url_to_path ${p})"
+        done
+    )
     mylog "02-important.txt2" "${important}"
-
-    important_deps=$(resolve_deps "${important}")
+    important_deps=$(resolve_deps2 "${important}")
     mylog "02-important@deps.txt2" "$(echo ${important_deps} | xargs | tr ' ' '\n')"
     important_deps=$(without "$important_deps" "$required_deps")
     mylog "02-important@deps@without@required.txt2" "$(echo ${important_deps} | xargs | tr ' ' '\n')"
@@ -201,17 +227,29 @@ function work_out_debs() {
 function download_debs() {
     ALL_PKGS="$*"
     MIRROR=${MIRRORS%% *}
-    for p in ${ALL_PKGS}; do
-        filename="${MIRROR}/$(analysis.sh --repo ${TARGET_DIR}/172.29.220.242/mirror/kylin/dists --pkg $p | grep '^Filename: ' | awk '{print $2}')"
-        echo "$p $filename"
-        wgetfile $filename
+    for p in ${package_urls}; do
+        for i in ${ALL_PKGS}; do
+            match="Package: ${i}"
+            filename=$(
+                if grep -q "^${match}$" "$(url_to_path ${p})"; then
+                    sed -n "/^${match}$/,/^$/p" "$(url_to_path ${p})"
+                fi | grep '^Filename: ' | awk '{print $2}'
+            )
+            # filename="${MIRROR}/$(analysis.sh --repo ${TARGET_DIR}/172.29.220.242/mirror/kylin/dists --pkg $i | grep '^Filename: ' | awk '{print $2}')"
+            echo "$i $filename"
+            wgetfile ${MIRROR}/$filename
+        done
     done | column -t >${TARGET_DIR}/deb.list
 }
 
-debfor() {
-    for p in "$@"; do
-        local filename=$(grep "^${p} " ${TARGET_DIR}/deb.list | awk '{print $2}')
-        echo "${TARGET_DIR}/${filename#*//}"
+debfor2() {
+    for p in ${package_urls}; do
+        p=${p#*//}
+        p=${p%dists*}
+        for i in "$@"; do
+            local filename=$(grep "^${i} " ${TARGET_DIR}/deb.list | awk '{print $2}')
+            echo "${TARGET_DIR}/${p}/${filename}"
+        done
     done
 }
 
@@ -281,7 +319,7 @@ function my_first_stage_install() {
 
     setup_merged_usr
 
-    debfor $required_deps | xargs -i bash -c "dpkg-deb --fsys-tarfile {} | tar -k -xvf - -C $TARGET"
+    debfor2 $required_deps | xargs -i bash -c "dpkg-deb --fsys-tarfile {} | tar -k -xvf - -C $TARGET"
 
     mkdir -p "$TARGET/var/lib/dpkg"
     : >"$TARGET/var/lib/dpkg/status"
@@ -307,7 +345,7 @@ function my_first_stage_install() {
 
 function my_second_stage_install() {
     # 拷贝deb到rootfs
-    [ -d $TARGET/var/tmp/172.29.220.242 ] || sudo cp -rf /var/tmp/172.29.220.242 $TARGET/var/tmp
+    [ -d $TARGET/var/tmp/download ] || sudo cp -rf ${TARGET_DIR} $TARGET/var/tmp
 
     in_target() {
         sudo chroot $TARGET $*
@@ -315,7 +353,7 @@ function my_second_stage_install() {
 
     x_feign_install() {
         local pkg="$1"
-        local deb="$(debfor $pkg)"
+        local deb="$(debfor2 $pkg)"
         local ver="$(in_target dpkg-deb -f "$deb" Version)"
 
         echo "Package: $pkg
@@ -330,8 +368,8 @@ Status: install ok installed
     x_feign_install dpkg
 
     x_core_install() {
-        mylog2 in_target dpkg --force-depends --install $(debfor "$@")
-        yes | in_target dpkg --force-depends --install $(debfor "$@")
+        mylog2 in_target dpkg --force-depends --install $(debfor2 "$@")
+        yes | in_target dpkg --force-depends --install $(debfor2 "$@")
     }
 
     p() {
@@ -374,8 +412,8 @@ Status: install ok installed
 
     # TODO: repeat some times
     # exec 7>&1
-    # yes | in_target in_targetdpkg --status-fd 8 --force-depends --unpack $(debfor $required_deps) 8>&1 1>&7
-    yes | in_target dpkg --force-depends --unpack $(debfor $required_deps)
+    # yes | in_target in_targetdpkg --status-fd 8 --force-depends --unpack $(debfor2 $required_deps) 8>&1 1>&7
+    yes | in_target dpkg --force-depends --unpack $(debfor2 $required_deps)
 
     echo "Configuring required packages..."
 
@@ -400,8 +438,10 @@ Status: install ok installed
     echo "Unpacking the base system..."
 
     # setup_available
-    for p in ${required_deps} ${important_deps}; do
-        sed -n "/^Package: ${p}$/,/^$/p" ${TARGET_DIR}/172.29.220.242/mirror/kylin/dists/v101/main/binary-amd64/Packages
+    for p in ${package_urls}; do
+        for i in ${required_deps} ${important_deps}; do
+            sed -n "/^Package: ${i}$/,/^$/p" "$(url_to_path ${p})"
+        done
     done >"$TARGET/var/lib/dpkg/available"
 
     get_next_predep() {
@@ -413,15 +453,15 @@ Status: install ok installed
     done_predeps=
     while predep=$(get_next_predep); do
         # We have to resolve dependencies of pre-dependencies manually because dpkg --predep-package doesn't handle this.
-        predep=$(without "$(without "$(resolve_deps $predep)" "$required")" "$done_predeps")
-        yes | in_target dpkg --force-overwrite --force-confold --skip-same-version --install $(debfor $predep)
+        predep=$(without "$(without "$(resolve_deps2 $predep)" "$required")" "$done_predeps")
+        yes | in_target dpkg --force-overwrite --force-confold --skip-same-version --install $(debfor2 $predep)
         base=$(without "$base" "$predep")
         done_predeps="$done_predeps $predep"
     done
 
     if [ -n "$base" ]; then
-        # yes | in_target dpkg --status-fd 8 --force-overwrite --force-confold --skip-same-version --unpack $(debfor $base) 8>&1 1>&7
-        yes | in_target dpkg --force-overwrite --force-confold --skip-same-version --unpack $(debfor $base)
+        # yes | in_target dpkg --status-fd 8 --force-overwrite --force-confold --skip-same-version --unpack $(debfor2 $base) 8>&1 1>&7
+        yes | in_target dpkg --force-overwrite --force-confold --skip-same-version --unpack $(debfor2 $base)
 
         echo "Configuring the base system..."
 
@@ -434,34 +474,37 @@ Status: install ok installed
 
     echo "Configuring base system"
     echo "Base system installed successfully."
+
+    # rm -rf $TARGET/var/tmp/download
 }
 
-TARGET_DIR="/var/tmp"
-if [ ! -d "${TARGET_DIR}" ]; then
-    mkdir -p "${TARGET_DIR}"
-fi
 SHELL_DIR=$(dirname $(readlink -f $0))
 
 trap "exit_function" 0
 
 exit_function() {
-    mountpoint -q $TARGET/proc && sudo umount $TARGET/proc
-    mountpoint -q $TARGET/sys && sudo umount $TARGET/sys
+    if mountpoint -q $TARGET/proc; then
+        sudo umount $TARGET/proc
+    fi
+
+    if mountpoint -q $TARGET/sys; then
+        sudo umount $TARGET/sys
+    fi
+    echo "exit_function" >/dev/null
 }
 
 # config_ubuntu
 # config_kylin
 config_my
 
-# download_indices
-
+download_indices
 # work_out_debs
 # all_debs=$(echo "${required_deps} ${important_deps}" | xargs | tr ' ' '\n' | sort | uniq)
 # # echo "${all_debs}"
-
 # download_debs "${all_debs}"
 
-required_deps="$(cat ${TARGET_DIR}/01-required@deps.txt2)"
-important_deps="$(cat ${TARGET_DIR}/02-important@deps@without@required.txt2)"
+required_deps="$(cat /var/tmp/01-required@deps.txt2)"
+important_deps="$(cat /var/tmp/02-important@deps@without@required.txt2)"
+
 my_first_stage_install
 my_second_stage_install