1ead1f93eSLiane Praza#!/bin/ksh93 -p 2ead1f93eSLiane Praza# 3ead1f93eSLiane Praza# CDDL HEADER START 4ead1f93eSLiane Praza# 5ead1f93eSLiane Praza# The contents of this file are subject to the terms of the 6ead1f93eSLiane Praza# Common Development and Distribution License (the "License"). 7ead1f93eSLiane Praza# You may not use this file except in compliance with the License. 8ead1f93eSLiane Praza# 9ead1f93eSLiane Praza# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10ead1f93eSLiane Praza# or http://www.opensolaris.org/os/licensing. 11ead1f93eSLiane Praza# See the License for the specific language governing permissions 12ead1f93eSLiane Praza# and limitations under the License. 13ead1f93eSLiane Praza# 14ead1f93eSLiane Praza# When distributing Covered Code, include this CDDL HEADER in each 15ead1f93eSLiane Praza# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16ead1f93eSLiane Praza# If applicable, add the following below this CDDL HEADER, with the 17ead1f93eSLiane Praza# fields enclosed by brackets "[]" replaced with your own identifying 18ead1f93eSLiane Praza# information: Portions Copyright [yyyy] [name of copyright owner] 19ead1f93eSLiane Praza# 20ead1f93eSLiane Praza# CDDL HEADER END 21ead1f93eSLiane Praza# 22ead1f93eSLiane Praza 23ead1f93eSLiane Praza# 2467274386SJohn Levon# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 25*4358e1dfSRichard Lowe# Copyright 2010, Richard Lowe 26ead1f93eSLiane Praza# 27ead1f93eSLiane Praza 28ead1f93eSLiane PrazaPATH=/usr/bin:/usr/sbin 29ead1f93eSLiane Prazaexport PATH 30ead1f93eSLiane Praza 31ead1f93eSLiane PrazaDEFAULTONURI="http://ipkg.sfbay/on-nightly" 32ead1f93eSLiane PrazaDEFAULTONPUB="on-nightly" 33ead1f93eSLiane Praza 34ead1f93eSLiane Prazausage() 35ead1f93eSLiane Praza{ 3667274386SJohn Levon echo "usage: $0 [opts] [-s beName] -t beName" 3767274386SJohn Levon echo "usage: $0 [opts] -r" 3867274386SJohn Levon echo 39*4358e1dfSRichard Lowe echo "\t-c consolidation : consolidation being upgraded" 4067274386SJohn Levon echo "\t-d repodir : directory for repositories" 41*4358e1dfSRichard Lowe echo "\t-r : configure publisher only" 4267274386SJohn Levon echo "\t-s : source BE to clone" 4367274386SJohn Levon echo "\t-t : new BE name" 4467274386SJohn Levon echo "\t-u uri : origin URI for redist repository" 4567274386SJohn Levon echo "\t-U prefix: prefix for redist repository" 4667274386SJohn Levon echo "\t-v : verbose" 4767274386SJohn Levon echo "\t-Z : skip updating zones" 4867274386SJohn Levon echo 4967274386SJohn Levon echo "Update to an ON build:" 5067274386SJohn Levon echo "\tonu -t newbe -d /path/to/my/ws/packages/\`uname -p\`/nightly" 5167274386SJohn Levon echo 5267274386SJohn Levon echo "Update to the nightly build:" 5367274386SJohn Levon echo "\tonu -t newbe" 5467274386SJohn Levon echo 55*4358e1dfSRichard Lowe echo "Re-enable the publishers in the current BE:" 5667274386SJohn Levon echo "\tonu -r -d /path/to/my/ws/packages/\`uname -p\`/nightly" 57ead1f93eSLiane Praza exit 1 58ead1f93eSLiane Praza} 59ead1f93eSLiane Praza 60ead1f93eSLiane Prazaexit_error() 61ead1f93eSLiane Praza{ 62ead1f93eSLiane Praza echo $* 63ead1f93eSLiane Praza exit 2 64ead1f93eSLiane Praza} 65ead1f93eSLiane Praza 66ead1f93eSLiane Prazado_cmd() 67ead1f93eSLiane Praza{ 68ead1f93eSLiane Praza [ $verbose -gt 0 ] && echo $* 69ead1f93eSLiane Praza $* 70ead1f93eSLiane Praza exit_code=$? 71ead1f93eSLiane Praza [ $exit_code -eq 0 ] && return 72ead1f93eSLiane Praza # pkg(1) returns 4 if "nothing to do", which is safe to ignore 73ead1f93eSLiane Praza [ $1 = "pkg" -a $exit_code -eq 4 ] && return 74ead1f93eSLiane Praza exit_error "$*" failed: exit code $exit_code 75ead1f93eSLiane Praza} 76ead1f93eSLiane Praza 7767274386SJohn Levonconfigure_publishers() 7867274386SJohn Levon{ 7967274386SJohn Levon root=$1 8067274386SJohn Levon 8167274386SJohn Levon # 82*4358e1dfSRichard Lowe # Get the publisher name from the 'list -v' output. It may seem we 83*4358e1dfSRichard Lowe # could do this more tidily using 'info', but that is 84*4358e1dfSRichard Lowe # internationalized. 8567274386SJohn Levon # 86*4358e1dfSRichard Lowe typeset on_publisher=$(pkg -R $root list -Hv \ 87*4358e1dfSRichard Lowe "${consolidation}-incorporation" | cut -d/ -f3) 8867274386SJohn Levon 89*4358e1dfSRichard Lowe if [[ "$on_publisher" != "$redistpub" ]]; then 90*4358e1dfSRichard Lowe do_cmd pkg -R $root set-publisher --no-refresh \ 91*4358e1dfSRichard Lowe --non-sticky $on_publisher 9267274386SJohn Levon fi 93*4358e1dfSRichard Lowe do_cmd pkg -R $root set-publisher -e --no-refresh -P -O $uri $redistpub 94*4358e1dfSRichard Lowe do_cmd pkg -R $root refresh --full 9567274386SJohn Levon} 9667274386SJohn Levon 97639a4b99SJohn Levonupdate() 98639a4b99SJohn Levon{ 9967274386SJohn Levon root=$1 100639a4b99SJohn Levon 10167274386SJohn Levon pkg -R $root list entire > /dev/null 2>&1 10267274386SJohn Levon [ $? -eq 0 ] && do_cmd pkg -R $root uninstall entire 10367274386SJohn Levon 10467274386SJohn Levon configure_publishers $root 10567274386SJohn Levon 10667274386SJohn Levon do_cmd pkg -R $root image-update 107639a4b99SJohn Levon} 108639a4b99SJohn Levon 109639a4b99SJohn Levonupdate_zone() 110639a4b99SJohn Levon{ 111639a4b99SJohn Levon zone=$1 112639a4b99SJohn Levon 113639a4b99SJohn Levon name=`echo $zone | cut -d: -f 2` 114639a4b99SJohn Levon if [ $name = "global" ]; then 115639a4b99SJohn Levon return 116639a4b99SJohn Levon fi 117639a4b99SJohn Levon 118639a4b99SJohn Levon brand=`echo $zone | cut -d: -f 6` 119639a4b99SJohn Levon if [ $brand != "ipkg" ]; then 120639a4b99SJohn Levon return 121639a4b99SJohn Levon fi 122639a4b99SJohn Levon 123639a4b99SJohn Levon if [ "$zone_warned" = 0 ]; then 124639a4b99SJohn Levon echo "WARNING: Use of onu(1) will prevent use of zone attach in the new BE" >&2 125639a4b99SJohn Levon echo "See onu(1)" >&2 126639a4b99SJohn Levon zone_warned=1 127639a4b99SJohn Levon fi 128639a4b99SJohn Levon 129639a4b99SJohn Levon state=`echo $zone | cut -d: -f 3` 130639a4b99SJohn Levon 131639a4b99SJohn Levon case "$state" in 132639a4b99SJohn Levon configured|incomplete) 133639a4b99SJohn Levon return 134639a4b99SJohn Levon ;; 135639a4b99SJohn Levon esac 136639a4b99SJohn Levon 137639a4b99SJohn Levon zoneroot=`echo $zone | cut -d: -f 4` 138639a4b99SJohn Levon 139639a4b99SJohn Levon echo "Updating zone $name" 140639a4b99SJohn Levon update $zoneroot/root 141639a4b99SJohn Levon} 142639a4b99SJohn Levon 143ead1f93eSLiane Prazasourcebe="" 144ead1f93eSLiane Prazatargetbe="" 145ead1f93eSLiane Prazauri="" 146ead1f93eSLiane Prazarepodir="" 147*4358e1dfSRichard Loweconsolidation="osnet" 148ead1f93eSLiane Prazaverbose=0 149639a4b99SJohn Levonno_zones=0 150639a4b99SJohn Levonzone_warned=0 15167274386SJohn Levonreposonly=0 152ead1f93eSLiane Praza 153*4358e1dfSRichard Lowewhile getopts :c:d:Ors:t:U:u:vZ i ; do 154ead1f93eSLiane Praza case $i in 155*4358e1dfSRichard Lowe c) 156*4358e1dfSRichard Lowe consolidation=$OPTARG 157*4358e1dfSRichard Lowe ;; 158ead1f93eSLiane Praza d) 159ead1f93eSLiane Praza repodir=$OPTARG 160ead1f93eSLiane Praza ;; 161*4358e1dfSRichard Lowe O) # no-op, compatibility with recommended use 162ead1f93eSLiane Praza ;; 16367274386SJohn Levon r) 16467274386SJohn Levon reposonly=1 16567274386SJohn Levon ;; 166ead1f93eSLiane Praza s) 167ead1f93eSLiane Praza sourcebe=$OPTARG 168ead1f93eSLiane Praza ;; 169ead1f93eSLiane Praza t) 170ead1f93eSLiane Praza targetbe=$OPTARG 171ead1f93eSLiane Praza ;; 172ead1f93eSLiane Praza U) 173ead1f93eSLiane Praza redistpub=$OPTARG 174ead1f93eSLiane Praza ;; 175ead1f93eSLiane Praza u) 176ead1f93eSLiane Praza uri=$OPTARG 177ead1f93eSLiane Praza ;; 178ead1f93eSLiane Praza v) 179ead1f93eSLiane Praza verbose=1 180ead1f93eSLiane Praza ;; 181639a4b99SJohn Levon Z) 182639a4b99SJohn Levon no_zones=1 183639a4b99SJohn Levon ;; 184ead1f93eSLiane Praza *) 185ead1f93eSLiane Praza usage 186ead1f93eSLiane Praza esac 187ead1f93eSLiane Prazadone 188ead1f93eSLiane Prazashift `expr $OPTIND - 1` 189ead1f93eSLiane Praza 19067274386SJohn Levon[ -n "$1" ] && usage 19167274386SJohn Levon 19267274386SJohn Levonif [ "$reposonly" -eq 1 ]; then 19367274386SJohn Levon [ -n "$sourcebe" ] && usage 19467274386SJohn Levon [ -n "$targetbe" ] && usage 19567274386SJohn Levon [ "$no_zones" -eq 1 ] && usage 19667274386SJohn Levonelse 197ead1f93eSLiane Praza [ -z "$targetbe" ] && usage 19867274386SJohn Levonfi 199ead1f93eSLiane Praza[ -z "$uri" ] && uri=$ONURI 200ead1f93eSLiane Praza[ -z "$uri" ] && uri=$DEFAULTONURI 201ead1f93eSLiane Praza[ -z "$redistpub" ] && redistpub=$ONPUB 202ead1f93eSLiane Praza[ -z "$redistpub" ] && redistpub=$DEFAULTONPUB 203ead1f93eSLiane Praza 204ead1f93eSLiane Prazaif [ -n "$repodir" ]; then 205ead1f93eSLiane Praza redistdir=$repodir/repo.redist 206ead1f93eSLiane Praza [ -d $redistdir ] || exit_error "$redistdir not found" 207*4358e1dfSRichard Lowe typeset cfgfile=$redistdir/cfg_cache 208*4358e1dfSRichard Lowe [[ ! -e $cfgfile ]] && cfgfile=$redistdir/pkg5.repository 209*4358e1dfSRichard Lowe # need an absolute path 210*4358e1dfSRichard Lowe [[ $redistdir == /* ]] || redistdir=$PWD/$redistdir 211ead1f93eSLiane Praza redistpub=$(python2.6 <<# EOF 212ead1f93eSLiane Praza import ConfigParser 213ead1f93eSLiane Praza p = ConfigParser.SafeConfigParser() 214*4358e1dfSRichard Lowe p.read("$cfgfile") 215ead1f93eSLiane Praza pp = p.get("publisher", "prefix") 216ead1f93eSLiane Praza print "%s" % pp 217*4358e1dfSRichard Lowe EOF) || exit_error "Cannot determine publisher prefix" 218*4358e1dfSRichard Lowe [[ -n "$redistpub" ]] || exit_error "Repository has no publisher prefix" 219*4358e1dfSRichard Lowe uri="file://$redistdir" 220ead1f93eSLiane Prazafi 221ead1f93eSLiane Praza 22267274386SJohn Levonif [ "$reposonly" -eq 1 ]; then 22367274386SJohn Levon configure_publishers / 22467274386SJohn Levon exit 0 22567274386SJohn Levonfi 22667274386SJohn Levon 227ead1f93eSLiane Prazacreateargs="" 228ead1f93eSLiane Praza[ -n "$sourcebe" ] && createargs="-e $sourcebe" 229ead1f93eSLiane Praza 230ead1f93eSLiane Praza# ksh seems to have its own mktemp with slightly different semantics 231ead1f93eSLiane Prazatmpdir=`/usr/bin/mktemp -d /tmp/onu.XXXXXX` 232ead1f93eSLiane Praza[ -z "$tmpdir" ] && exit_error "mktemp failed" 233ead1f93eSLiane Praza 234ead1f93eSLiane Prazado_cmd beadm create $createargs $targetbe 235ead1f93eSLiane Prazado_cmd beadm mount $targetbe $tmpdir 236639a4b99SJohn Levonupdate $tmpdir 237ead1f93eSLiane Prazado_cmd beadm activate $targetbe 238ead1f93eSLiane Praza 239639a4b99SJohn Levonif [ "$no_zones" != 1 ]; then 240639a4b99SJohn Levon for zone in `do_cmd zoneadm -R $tmpdir list -cip`; do 241639a4b99SJohn Levon update_zone $zone 242639a4b99SJohn Levon done 243639a4b99SJohn Levonfi 244ead1f93eSLiane Praza 245ead1f93eSLiane Prazaexit 0 246