Search
j0ke.net Open Build Service
>
Projects
>
home:jg
>
yup
> switch-enterprise-nu-mirror
Sign Up
|
Log In
Username
Password
Cancel
Overview
Repositories
Revisions
Requests
Users
Advanced
Attributes
Meta
File switch-enterprise-nu-mirror of Package yup
#!/bin/bash export LANG=C # Script to upgrade a host, which is subscribed to an enterprise-internal # mirror of the Novell update service, to SLE?10 SP1. # It is assumed that the update tree has the structure that yup builds. # 05 Jul 2007 Andreas Taschner # # Changelog : # 01 Aug 2007 : Fixed typos in info messages # More informational messages in log about progress # Eliminate "...failed" messages on console when shutting down ZMD # Proactively kill zen-updater desktop task as it sometimes gets # confused and abends # 03 Aug 2007 : Add support for SDK # 30 Aug 2007 : Add explicit installation of product-sdk10-sp1 patch to # to ensure the product verion of SDK gets updated # 31 Aug 2007 : Unsubscribe from the SLE?10-SP1-Online catalog after upgrade, # but keep it in the list to preserve virtual SP1 installation source # 05 Sep 2007 : Minimized the need for manual intervention to customize the script # Add extra restart of ZMD after stage 4 # 06 Sep 2007 : Syntax-check of $UPDATE_ROOT # 19 Sep 2007 : v0.28 # Change the way we check if zmd has settled (Bug 309861). Now we # check for pending services rather than # of available updates, since an # up-to-date system would fail the first of these checks. # Added more checks on whether zmd has settled. Misc cosmetics. # Improved handling of rug errors in stage 5 and 6 # 02 Oct 2007 : v0.33 # By default update the SDK if it is installed unless $UPDATE_SDK = NO # Verify existence of the various repositories (currently only # checks for nfs and http based repos) and exit on errors # prior to adding services. Misc cosmetics. # # !!!!! M A N U A L I N T E R V E N T I O N R E Q U I R E D !!!!! # # Change at least the UPDATE_ROOT parameter below to fit the setup in your environment # echo "ADAPT THE CONFIGURATION BELOW THEN DELETE THIS AND THE NEXT LINE" exit 1 # Specify the URL of the top of your update repository tree, # eg. http://your.server.example.com/SLE10-YUP/ # Remember the trailing slash ! UPDATE_ROOT="" # If architecture is different from i586 or x86_64, you must set $ARCH ARCH="" # This script will check if the SLE 10 SDK is installed and upgrade it # assuming that updates for the SLE-10-SDK-* are also mirrored with # yup and exist in the update repo tree of SLE (for naming reasons). # If you for some reason do NOT want to upgrade the SDK along with the OS # (not having the SDK at the same level as the OS can lead to problems) # you must change # UPDATE_SDK to NO. UPDATE_SDK="YES" ############################################################################# # No need to change anything below this line # ############################################################################# if [ `id -u` != 0 ]; then echo "You need to be root to run this script" exit 7 fi # Log file exec >> /var/log/YaST2/switchUpdateServer.log # Functions start is_anything_pending () { # Check if ZMD has any services in pending state i=0 SOMETHING_IS_PENDING="YES" while [[ $i -lt 6 ]] ; do if ! [[ `rug sl | grep -i Pending` ]] ; then SOMETHING_IS_PENDING="NO" break else echo "Waiting for services to get out of pending state" sleep 30 fi ((i++)) done if [[ $SOMETHING_IS_PENDING = "YES" ]] ; then echo "ZMD does not settle from pending state - exiting..." exit 2 fi } restart_zmd_firmly () { # It is a cumbersome process to choke ZMD completely ... ZMD_STILL_RUNNING="YES" /usr/sbin/rczmd stop 2>&1 i=0 while [[ $i -lt 10 ]] ; do /usr/sbin/rczmd status if [[ $? -eq 3 ]] ; then ZMD_STILL_RUNNING="NO" break else echo "Waiting for ZMD to terminate properly" sleep 20 rczmd stop 2>&1 fi ((i++)) done if [[ $ZMD_STILL_RUNNING = "YES" ]] ; then echo "Pulling the plug on ZMD" killall -9 zmd sleep 10 fi # Since we may get "An instance of ZMD is already running" although # /etc/init.d/zmd status reports it as unused, we add yet another delay sleep 30 echo "Restarting ZMD" rczmd start # Wait for ZMD to calm down sleep 60 is_anything_pending } time_stamp () { # Create time stamp in log file echo "------------------------------------------------------------------- " date echo "------------------------------------------------------------------- " } check_if_repo_exists () { # If the file repodata/repomd.xml file exists in a service URL # we consider the repository to be existing # Unfortunately we currently only support this check for http-based # repository access if [[ $REPO_PROTOCOL == "http" ]] ; then curl -f -o /dev/null $REPO"repodata/repomd.xml" 1>/dev/null 2>&1 if [ $? != 0 ] ;then repo_error exit 5 fi elif [[ $REPO_PROTOCOL = "nfs" ]] ; then REPO_SHARE=`echo $REPO | awk -F ":" '{print $2}' \ | sed -e "s/\/\///g" | sed -e "s/^$REPO_HOST//g"` mount -t nfs -o ro $REPO_HOST":"$REPO_SHARE $TMPDIR MOUNT_RC=$? if [ $MOUNT_RC != 0 ] ;then repo_error exit 5 fi if ! test -r $TMPDIR"/repodata/repomd.xml" ; then repo_error umount $TMPDIR exit 5 fi umount $TMPDIR elif [[ $REPO_PROTOCOL = "https" ]] ; then # Feel free to implement checks for this protocol echo "Repo existence not implemented for $REPO_PROTOCOL" fi } repo_error () { echo "The following repository does not exist or is inconsistent :" echo "The following repository does not exist or is inconsistent :" >&2 echo ">>>>> "$REPO "<<<<<" echo ">>>>> "$REPO "<<<<<" >&2 echo ; echo "Aborting execution ..." echo ; echo "Aborting execution ..." >&2 } # Functions end time_stamp # Initialize variable(s) SDK_10_0_INSTALLED="NO" SCRIPTNAME=`basename $0` TMPDIR=/tmp/$SCRIPTNAME.$$ # Detect product (SLES/SLED) if grep -i "suse linux enterprise desktop" /etc/SuSE-release >/dev/null 2>&1 ; then PRODUCT="sled" PRODUCT_CAPS="SLED" else PRODUCT="sles" PRODUCT_CAPS="SLES" fi # Detect architechture (i586 or x86_64 unless specified in $ARCH) if [[ $ARCH = "" ]]; then if grep -i "i586" /etc/SuSE-release >/dev/null 2>&1 ; then ARCH="i586" elif grep -i "x86_64" /etc/SuSE-release >/dev/null 2>&1 ; then ARCH="x86_64" fi fi # Construct the service URLs and names # Add trailing slash to $UPDATE_ROOT in case forgotten if ! echo $UPDATE_ROOT| grep \/$ >/dev/null 2>&1 ; then UPDATE_ROOT=$UPDATE_ROOT"/" fi OLD_UPDATES_SERVICE_URL=$UPDATE_ROOT$PRODUCT_CAPS"10-Updates/"$PRODUCT"-10-"$ARCH"/" NEW_SP_ONLINE_URL=$UPDATE_ROOT$PRODUCT_CAPS"10-SP1-Online/"$PRODUCT"-10-"$ARCH"/" NEW_SP_ONLINE_NAME=$PRODUCT_CAPS"10-SP1-Online" NEW_SP_UPDATES_URL=$UPDATE_ROOT$PRODUCT_CAPS"10-SP1-Updates/"$PRODUCT"-10-"$ARCH"/" NEW_SP_UPDATES_NAME=$PRODUCT_CAPS"10-SP1-Updates" # Determine access protocol to update repository case `echo $UPDATE_ROOT | awk -F ":" '{print $1}'` in http ) REPO_PROTOCOL="http" ;; https ) REPO_PROTOCOL="https" ;; nfs ) REPO_PROTOCOL="nfs" REPO_HOST=`echo $UPDATE_ROOT | awk -F ":" '{print $2}' \ | awk -F "/" '{print $3}'` test -w $TMPDIR || mkdir $TMPDIR ;; esac # Verify existence of the repositories REPO=$OLD_UPDATES_SERVICE_URL check_if_repo_exists REPO=$NEW_SP_ONLINE_URL check_if_repo_exists REPO=$NEW_SP_UPDATES_URL check_if_repo_exists # Check if the machine is indeed already subscribed to $OLD_UPDATES_SERVICE_URL # If not, then we do it SERVICE_OR_CAT_CHANGED="NO" SUBSCRIBED_TO_OLD_SERVICE="NO" i=0 while [[ $i -lt 4 ]] ; do OLD_CATALOG='' # Handle missing trailing slash in existing service URL TMP_OLD_URL=`echo $OLD_UPDATES_SERVICE_URL | sed -e "s/\/$//g"` OLD_CATALOG=$(rug --no-abbrev sl |grep -i -F "active" | grep -F "$TMP_OLD_URL" | \ awk -F "|" '{print $4}' | sed 's/ //g') if [[ $OLD_CATALOG != '' ]] ; then rug ca |grep -i "yes" | grep -F "$OLD_CATALOG" if [ $? -eq 0 ] ; then SUBSCRIBED_TO_OLD_SERVICE="YES" break else echo "Not subscribed to the old update service catalog - subscribing ..." SERVICE_OR_CAT_CHANGED="YES" rug sub $OLD_CATALOG fi else echo "Old update service not in the service list - adding it ..." SERVICE_OR_CAT_CHANGED="YES" rug sa -t zypp $OLD_UPDATES_SERVICE_URL SLEx10-Updates fi ((i++)) done if [[ $SUBSCRIBED_TO_OLD_SERVICE = "NO" ]] ; then echo "Not able to subscribe to old update service - exiting" exit 3 fi # SDK if [[ $UPDATE_SDK = "YES" ]] ; then # Check if the SDK product is installed QUERYPOOL="/usr/lib/zmd/query-pool" if [ ! -x $QUERYPOOL ]; then QUERYPOOL="/usr/lib64/zmd/query-pool" if [ ! -x $QUERYPOOL ]; then # query-pool not found echo "query-pool command not found" >&2 echo "query-pool command not found" exit 6; fi fi if [[ `/usr/lib/zmd/query-pool products @system \ | grep "SUSE-Linux-Enterprise-SDK" | grep "10-0"` ]] ; then SDK_10_0_INSTALLED="YES" fi if [[ $SDK_10_0_INSTALLED = "YES" ]] ; then # Construct the service URLs and names OLD_SDK_SERVICE_URL=$UPDATE_ROOT"SLE10-SDK-Updates/sles-10-"$ARCH"/" NEW_SDK_SP_ONLINE_URL=$UPDATE_ROOT"SLE10-SDK-SP1-Online/sles-10-"$ARCH"/" NEW_SDK_SP_ONLINE_NAME="SLE10-SDK-SP1-Online" NEW_SDK_SP_UPDATES_URL=$UPDATE_ROOT"SLE10-SDK-SP1-Updates/sles-10-"$ARCH"/" NEW_SDK_SP_UPDATES_NAME="SLE10-SDK-SP1-Updates" # Verify existence of the repositories REPO=$OLD_SDK_SERVICE_URL check_if_repo_exists REPO=$NEW_SDK_SP_ONLINE_URL check_if_repo_exists REPO=$NEW_SDK_SP_UPDATES_URL check_if_repo_exists # Check if the machine is indeed already subscribed to $OLD_SDK_SERVICE_URL # If not, then we do it SUBSCRIBED_TO_OLD_SERVICE="NO" i=0 while [[ $i -lt 4 ]] ; do OLD_SDK_CATALOG='' # Handle missing trailing slash in existing service URL TMP_OLD_URL=`echo $OLD_SDK_SERVICE_URL | sed -e "s/\/$//g"` OLD_SDK_CATALOG=$(rug --no-abbrev sl |grep -i -F "active" | grep -F "$TMP_OLD_URL" | \ awk -F "|" '{print $4}' | sed 's/ //g') if [[ $OLD_SDK_CATALOG != '' ]] ; then rug ca |grep -i "yes" | grep -F "$OLD_SDK_CATALOG" if [ $? -eq 0 ] ; then SUBSCRIBED_TO_OLD_SERVICE="YES" break else echo "Not subscribed to the old SDK update service catalog - subscribing ..." SERVICE_OR_CAT_CHANGED="YES" rug sub $OLD_SDK_CATALOG fi else echo "Old SDK update service not in the service list - adding it ..." SERVICE_OR_CAT_CHANGED="YES" rug sa -t zypp $OLD_SDK_SERVICE_URL SDK10-Updates fi ((i++)) done if [[ $SUBSCRIBED_TO_OLD_SERVICE = "NO" ]] ; then echo "Not able to subscribe to old SDK update service - exiting" exit 4 fi fi fi # SDK end time_stamp # Kill zen-updater to prevent ugly pop-ups on desktop when it abends killall -9 zen-updater # In case we added a service - check if we are cool if [[ $SERVICE_OR_CAT_CHANGED == 'YES' ]] ; then is_anything_pending fi echo "Adding SP migration updates service" echo "Adding $NEW_SP_ONLINE_NAME service" rug service-add -t ZYPP $NEW_SP_ONLINE_URL $NEW_SP_ONLINE_NAME echo "Subscribing to the catalog..." rug subscribe $NEW_SP_ONLINE_NAME # SDK if [[ $UPDATE_SDK = "YES" ]] && [[ $SDK_10_0_INSTALLED = "YES" ]] ; then sleep 15 echo "Adding SDK SP migration updates service" rug service-add -t ZYPP $NEW_SDK_SP_ONLINE_URL $NEW_SDK_SP_ONLINE_NAME echo "Subscribing to the catalog..." rug subscribe $NEW_SDK_SP_ONLINE_NAME fi # SDK end # wait for settle sleep 15 is_anything_pending echo "Installing updates - stage 1 of 6 - "$PRODUCT"p1o-liby2util-devel" rug in -y -t patch ${PRODUCT}p1o-liby2util-devel # The above patch requires zmd to be restarted restart_zmd_firmly time_stamp # Perform update to SP1 and then add the SP1 product into /var/lib/zypp echo "Installing the GA - SP1 migration updates." if [ $PRODUCT == "sled" ] ; then # To force upgrade of gnomeeting to ekiga echo "Replacing gnomemeeting with ekiga" rug in -y -t patch ${PRODUCT}p1o-ekiga fi echo "Installing updates - stage 2 of 6" rug up -y --agree-to-third-party-licences time_stamp echo "Installing updates - stage 3 of 6 - Updating product record(s)" rug in -y --agree-to-third-party-licences -t patch product-${PRODUCT}10-sp1 time_stamp # SDK if [[ $UPDATE_SDK = "YES" ]] && [[ $SDK_10_0_INSTALLED = "YES" ]] ; then rug in -y -t patch product-sdk10-sp1 fi # SDK end # Disable suse_register at every boot test -d /var/lib/suseRegister || mkdir /var/lib/suseRegister touch /var/lib/suseRegister/neverRegisterOnBoot # Clean up services and catalogs echo "Deleting old updates service" rug service-delete $OLD_UPDATES_SERVICE_URL echo "Unsubscribing from SP migration updates catalog" # We still need the $NEW_SP_ONLINE_NAME catalog for the inst source, # so we only unsubscribe rug unsubscribe $NEW_SP_ONLINE_NAME echo "Adding $NEW_SP_UPDATE_NAME service" rug service-add -t ZYPP $NEW_SP_UPDATES_URL $NEW_SP_UPDATES_NAME echo "Subscribing to the catalog..." rug subscribe $NEW_SP_UPDATES_NAME # SDK if [[ $UPDATE_SDK = "YES" ]] && [[ $SDK_10_0_INSTALLED = "YES" ]] ; then sleep 60 echo "Deleting old SDK updates service" rug service-delete $OLD_SDK_SERVICE_URL echo "Unsubscribing from SDK SP migration updates catalog" # We still need the $NEW_SDK_SP_ONLINE_NAME catalog for the inst source, # so we only unsubscribe rug unsubscribe $NEW_SDK_SP_ONLINE_NAME echo "Adding $NEW_SDK_SP_UPDATES_NAME service" rug service-add -t ZYPP $NEW_SDK_SP_UPDATES_URL $NEW_SDK_SP_UPDATES_NAME echo "Subscribing to the catalog..." rug subscribe $NEW_SDK_SP_UPDATES_NAME fi # SDK end # Wait for ZMD to calm down sleep 60 is_anything_pending # These are post-sp1 but still necessary for some fixes... echo "Installing updates - stage 4 of 6 - ${PRODUCT}p1-yast2-online-update" rug in -y -t patch ${PRODUCT}p1-yast2-online-update # Since zmd periodically chokes here we need to restart and wait for # a really long time for it to get sober restart_zmd_firmly time_stamp sleep 240 is_anything_pending echo "Installing updates - stage 5 of 6 - ${PRODUCT}p1-perl-Bootloader" rug in -y -t patch ${PRODUCT}p1-perl-Bootloader # Sometimes rug fails with weird errors at this point, so we # need to check on the returncode and restart zmd if it is non-zero # Sorry about the clumsy coding if [ $? -ne 0 ] ; then echo "Stage 5 failed so we restart zmd and try once more - only once" restart_zmd_firmly time_stamp sleep 300 is_anything_pending echo "Installing updates - stage 5 of 6 - ${PRODUCT}p1-perl-Bootloader - second try..." rug in -y -t patch ${PRODUCT}p1-perl-Bootloader fi echo "Installing updates - stage 6 of 6 - post-SP1 updates" rug up -y --agree-to-third-party-licences # Sometimes rug fails with weird errors at this point, so we # need to check on the returncode and restart zmd if it is non-zero # Sorry about the clumsy coding if [ $? -ne 0 ] ; then echo "Stage 6 failed so we restart zmd and try once more - only once" restart_zmd_firmly time_stamp sleep 300 is_anything_pending echo "Installing updates - stage 6 of 6 - post-SP1 updates - second try..." rug up -y --agree-to-third-party-licences fi echo "Done." echo "You should reboot the machine now since the kernel has been updated." time_stamp # Clean up test -w $TMPDIR && rm -r $TMPDIR ; # reboot