Compare commits
2 Commits
v0.0.1
...
fix/resolv
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
95ade15103 | ||
|
|
02b6ec7785 |
@@ -4,7 +4,7 @@
|
||||
#set -e
|
||||
|
||||
# install dependencies
|
||||
opkg update && opkg install lsblk curl
|
||||
opkg update && opkg install lsblk curl rsync
|
||||
|
||||
# Set mount point for second OpenWrt installation
|
||||
mount_pt=/tmp/mnt
|
||||
@@ -99,6 +99,77 @@ done
|
||||
n_logged=$(wc -l < $package_list)
|
||||
printf 'Done, logged %d of %d entries\n' "$n_logged" "$examined"
|
||||
|
||||
# Image Builder merges profile defaults with our package list. If a user package
|
||||
# Conflicts: with a default (e.g. dnsmasq-full vs dnsmasq, wpad-* variants,
|
||||
# libustream-openssl vs libustream-mbedtls), the solver fails unless we pass
|
||||
# -packagename to drop the default. We use the *target* release profiles.json
|
||||
# plus Conflicts: from the running system's opkg control files.
|
||||
asu_profiles_json=/tmp/openwrt-asu-profiles-$$.json
|
||||
asu_profile_pkgs=/tmp/openwrt-asu-profile-pkgs-$$.txt
|
||||
asu_user_pkgs=/tmp/openwrt-asu-user-pkgs-$$.txt
|
||||
asu_removals=/tmp/openwrt-asu-removals-$$.txt
|
||||
asu_one_conflicts=/tmp/openwrt-asu-one-conflicts-$$.txt
|
||||
asu_profiles_url="https://downloads.openwrt.org/releases/${new_release}/targets/x86/64/profiles.json"
|
||||
# profiles.generic must match \"profile\": \"generic\" in the JSON request below.
|
||||
|
||||
rm -f "$asu_profile_pkgs" "$asu_removals"
|
||||
if wget -qO "$asu_profiles_json" "$asu_profiles_url"; then
|
||||
jsonfilter -i "$asu_profiles_json" -e '@.default_packages[*]' >>"$asu_profile_pkgs" 2>/dev/null
|
||||
jsonfilter -i "$asu_profiles_json" -e '@.profiles.generic.device_packages[*]' >>"$asu_profile_pkgs" 2>/dev/null
|
||||
sort -u "$asu_profile_pkgs" -o "$asu_profile_pkgs"
|
||||
fi
|
||||
|
||||
if [ -s "$asu_profile_pkgs" ]; then
|
||||
awk '!/^-/ { print $1 }' "$package_list" | sort -u >"$asu_user_pkgs"
|
||||
while read -r pkg; do
|
||||
[ -n "$pkg" ] || continue
|
||||
ctl="/usr/lib/opkg/info/${pkg}.control"
|
||||
[ -f "$ctl" ] || continue
|
||||
awk '
|
||||
/^Conflicts:/ {
|
||||
sub(/^Conflicts:[ \t]+/, "")
|
||||
gsub(/ *\([^)]*\)/, "")
|
||||
n = split($0, a, ",")
|
||||
for (i = 1; i <= n; i++) {
|
||||
nm = a[i]
|
||||
sub(/^[ \t]+/, "", nm)
|
||||
sub(/[ \t]+$/, "", nm)
|
||||
if (nm != "") print nm
|
||||
}
|
||||
}
|
||||
' "$ctl" >"$asu_one_conflicts"
|
||||
while read -r confl; do
|
||||
[ -n "$confl" ] || continue
|
||||
grep -qFx "$confl" "$asu_profile_pkgs" || continue
|
||||
grep -qFx "$confl" "$asu_user_pkgs" && continue
|
||||
printf '%s\n' "$confl" >>"$asu_removals"
|
||||
done <"$asu_one_conflicts"
|
||||
done <"$asu_user_pkgs"
|
||||
|
||||
if [ -s "$asu_removals" ]; then
|
||||
sort -u "$asu_removals" -o "$asu_removals"
|
||||
printf 'Prepending -pkg removals for profile defaults that conflict with your selection: '
|
||||
tr '\n' ' ' <"$asu_removals"
|
||||
printf '\n'
|
||||
: >"${package_list}.new"
|
||||
while read -r r; do
|
||||
[ -n "$r" ] || continue
|
||||
grep -q "^-${r}" "$package_list" && continue
|
||||
printf '%s\t%s\n' "-${r}" '' >>"${package_list}.new"
|
||||
done <"$asu_removals"
|
||||
cat "$package_list" >>"${package_list}.new"
|
||||
mv "${package_list}.new" "$package_list"
|
||||
fi
|
||||
else
|
||||
printf 'Warning: could not get default package list from %s\n' "$asu_profiles_url"
|
||||
printf ' (network or jsonfilter). Skipping automatic -pkg conflict fixes.\n'
|
||||
if grep -q '^dnsmasq-full' "$package_list" && ! grep -q '^-dnsmasq' "$package_list"; then
|
||||
printf 'Applying dnsmasq-only fallback (-dnsmasq).\n'
|
||||
{ printf '%s\t%s\n' '-dnsmasq' ''; cat "$package_list"; } > "${package_list}.new" && mv "${package_list}.new" "$package_list"
|
||||
fi
|
||||
fi
|
||||
rm -f "$asu_profiles_json" "$asu_profile_pkgs" "$asu_user_pkgs" "$asu_removals" "$asu_one_conflicts"
|
||||
|
||||
####################################################################
|
||||
|
||||
# Build json for Image Builder request
|
||||
@@ -249,8 +320,8 @@ sed -i '1,/failsafe/{/failsafe/{N;N;d}}' /tmp/boot/boot/grub/grub.cfg
|
||||
# Since we used awk to replace the file, restore original permissions
|
||||
chmod 755 /tmp/boot/boot/grub/grub.cfg
|
||||
|
||||
echo "---Copying configs to new OpenWRT---"
|
||||
cp -au /etc/. /tmp/mnt/etc
|
||||
echo "---Copying /etc files to new OpenWRT---"
|
||||
rsync -aAXP --exclude banner* --exclude openwrt_* --exclude opkg/ --exclude os_release /etc/. /tmp/mnt/etc
|
||||
|
||||
echo "---Copying files in sysupgrade.conf---"
|
||||
for file in $(awk '!/^[ \t]*#/&&NF' /etc/sysupgrade.conf); do
|
||||
@@ -258,7 +329,7 @@ for file in $(awk '!/^[ \t]*#/&&NF' /etc/sysupgrade.conf); do
|
||||
if [ ! -d $directory ]; then
|
||||
mkdir -p "/tmp/mnt${directory}"
|
||||
fi
|
||||
cp -a $file /tmp/mnt$file
|
||||
rsync -aAXP $file /tmp/mnt$file
|
||||
done
|
||||
|
||||
echo "---Finished!---"
|
||||
|
||||
Reference in New Issue
Block a user