diff options
author | Renato Botelho <renato@netgate.com> | 2016-09-16 16:31:05 -0300 |
---|---|---|
committer | Renato Botelho <renato@netgate.com> | 2016-09-16 16:31:19 -0300 |
commit | a5e6c252738ae5af21460eb03be771ffef57ba67 (patch) | |
tree | 6cfcb2648bf36a22ac858dcb4ce86de3f7d84a5a /src | |
parent | 3a4bae522fe391655ab3068e7a1635e004a728bb (diff) | |
download | pfsense-a5e6c252738ae5af21460eb03be771ffef57ba67.zip pfsense-a5e6c252738ae5af21460eb03be771ffef57ba67.tar.gz |
Prepare pfSense-upgrade to work with new major OS upgrade
Diffstat (limited to 'src')
-rwxr-xr-x | src/usr/local/sbin/pfSense-upgrade | 93 |
1 files changed, 90 insertions, 3 deletions
diff --git a/src/usr/local/sbin/pfSense-upgrade b/src/usr/local/sbin/pfSense-upgrade index 0a5d68f..dc88ae8 100755 --- a/src/usr/local/sbin/pfSense-upgrade +++ b/src/usr/local/sbin/pfSense-upgrade @@ -255,6 +255,50 @@ pkg_unlock() { done } +abi_setup() { + local _freebsd_version=$(uname -r) + local _pkg_repo_conf="/usr/local/etc/pkg/repos/${product}.conf" + + local _arch=$(uname -p) + + CUR_ABI="FreeBSD:${_freebsd_version%%.*}:${_arch}" + + if [ "${_arch}" == "armv6" ]; then + CUR_ALTABI="freebsd:${_freebsd_version%%.*}:${_arch}:32:el:eabi:hardfp" + elif [ "${_arch}" == "i386" ]; then + CUR_ALTABI="freebsd:${_freebsd_version%%.*}:x86:32" + else + CUR_ALTABI="freebsd:${_freebsd_version%%.*}:x86:64" + fi + + if [ ! -e ${_pkg_repo_conf} ]; then + validate_repo_conf + fi + + local _repo_abi_file=$(readlink ${_pkg_repo_conf}) + + if [ -f ${_repo_abi_file%%.conf}.abi ]; then + ABI=$(cat ${_repo_abi_file%%.conf}.abi) + else + ABI=${CUR_ABI} + fi + + if [ -f ${_repo_abi_file%%.conf}.altabi ]; then + ALTABI=$(cat ${_repo_abi_file%%.conf}.altabi) + else + ALTABI=${CUR_ALTABI} + fi + + if [ "${CUR_ABI}" = "${ABI}" -o "${CUR_ABI}" = "${ALTABI}" ] ; then + NEW_MAJOR="" + else + NEW_MAJOR=1 + ABI="${ALTABI}" + fi + + export CUR_ABI CUR_ALTABI ABI ALTABI NEW_MAJOR +} + pkg_update() { local _run_update=1 @@ -263,6 +307,8 @@ pkg_update() { _force=" -f" fi + abi_setup + _exec "pkg ${pkg_chroot} update${_force}" "Updating repositories metadata" } @@ -276,6 +322,7 @@ pkg_upgrade() { fi export next_stage=$(pkg annotate -q -S ${kernel_pkg} next_stage) + export is_pkg_locked=$(pkg annotate -q -S ${kernel_pkg} new_major) if [ -n "${next_stage}" -a -n "${booting}" -a -n "${boot_stage}" ]; then if [ ${boot_stage} != ${next_stage} ]; then @@ -297,7 +344,7 @@ pkg_upgrade() { pkg_update - if [ "$(compare_pkg_version pkg)" = "<" ]; then + if [ -z "${NEW_MAJOR}" -a "$(compare_pkg_version pkg)" = "<" ]; then _exec "pkg upgrade pkg" "Upgrading pkg" mute pkg_update force fi @@ -315,7 +362,7 @@ pkg_upgrade() { pkg_update force fi - if [ "$(compare_pkg_version ${_repo_pkg})" = "<" ]; then + if [ -z "${NEW_MAJOR}" -a "$(compare_pkg_version ${_repo_pkg})" = "<" ]; then cp /usr/local/etc/pkg/repos/${product}.conf \ /tmp/${product}.conf.copy _exec "pkg upgrade ${_repo_pkg}" "Upgrading ${_repo_pkg}" mute @@ -324,7 +371,7 @@ pkg_upgrade() { pkg_update force # New repo may contain newer pkg - if [ "$(compare_pkg_version pkg)" = "<" ]; then + if [ -z "${NEW_MAJOR}" -a "$(compare_pkg_version pkg)" = "<" ]; then _exec "pkg upgrade pkg" "Upgrading pkg" mute pkg_update force fi @@ -395,9 +442,17 @@ pkg_upgrade() { fetch_upgrade_packages if [ $(pkg ${pkg_chroot} upgrade -nq ${kernel_pkg} | wc -l) -gt 1 ]; then + # Lock pkg to avoid having pkg binary for version N+1 installed on N + if [ -n "${NEW_MAJOR}" ]; then + pkg_lock pkg + fi _exec "pkg ${pkg_chroot} upgrade ${kernel_pkg}" "Upgrading ${product} kernel" fi + if [ -n "${NEW_MAJOR}" ]; then + pkg ${pkg_chroot} annotate -q -M ${kernel_pkg} new_major 1 + fi + pkg ${pkg_chroot} annotate -q -M ${kernel_pkg} next_stage 2 next_stage=2 @@ -431,6 +486,22 @@ pkg_upgrade() { if [ $(pkg ${pkg_chroot} upgrade -nq | wc -l) -gt 1 ]; then delete_annotation=1 + if [ -n "${is_pkg_locked}" ]; then + # Upgrade pkg + pkg_unlock pkg + pkg ${pkg_chroot} annotate -q -D \ + ${kernel_pkg} new_major + _exec "pkg-static install -f pkg" \ + "Reinstalling pkg due to ABI change" + + # Upgrade base packages using pkg-static + _exec "pkg-static ${pkg_chroot} upgrade -r ${product}-core" \ + "Upgrading necessary core packages" + + # Make sure PHP setup is fine + /etc/rc.php_ini_setup >/dev/null 2>&1 + fi + _exec "pkg ${pkg_chroot} upgrade" "Upgrading necessary packages" delete_annotation="" fi @@ -451,6 +522,13 @@ pkg_upgrade() { _exit 0 fi + # 2nd reboot during new major version upgrade + if [ -n "${is_pkg_locked}" ]; then + # Reboot immediately + do_reboot now + _exit 0 + fi + if [ -n "${booting}" ]; then _exit 0 fi @@ -953,6 +1031,15 @@ if [ -e "${progress_file}" ]; then rm -f ${progress_file} fi +abi_setup + +if [ -n "${NEW_MAJOR}" -a "${action}" = "install" ]; then + _echo "WARNING: Current pkg repository has a new OS major version." + _echo " ${product} should be upgraded before doing any other" + _echo " operation" + _exit 1 +fi + case "${action}" in check) check_upgrade |