1*24bb1048SAlexander Pyhalov#!/bin/ksh93 -p 2*24bb1048SAlexander Pyhalov# 3*24bb1048SAlexander Pyhalov# CDDL HEADER START 4*24bb1048SAlexander Pyhalov# 5*24bb1048SAlexander Pyhalov# The contents of this file are subject to the terms of the 6*24bb1048SAlexander Pyhalov# Common Development and Distribution License (the "License"). 7*24bb1048SAlexander Pyhalov# You may not use this file except in compliance with the License. 8*24bb1048SAlexander Pyhalov# 9*24bb1048SAlexander Pyhalov# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*24bb1048SAlexander Pyhalov# or http://www.opensolaris.org/os/licensing. 11*24bb1048SAlexander Pyhalov# See the License for the specific language governing permissions 12*24bb1048SAlexander Pyhalov# and limitations under the License. 13*24bb1048SAlexander Pyhalov# 14*24bb1048SAlexander Pyhalov# When distributing Covered Code, include this CDDL HEADER in each 15*24bb1048SAlexander Pyhalov# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*24bb1048SAlexander Pyhalov# If applicable, add the following below this CDDL HEADER, with the 17*24bb1048SAlexander Pyhalov# fields enclosed by brackets "[]" replaced with your own identifying 18*24bb1048SAlexander Pyhalov# information: Portions Copyright [yyyy] [name of copyright owner] 19*24bb1048SAlexander Pyhalov# 20*24bb1048SAlexander Pyhalov# CDDL HEADER END 21*24bb1048SAlexander Pyhalov# 22*24bb1048SAlexander Pyhalov 23*24bb1048SAlexander Pyhalov# 24*24bb1048SAlexander Pyhalov# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 25*24bb1048SAlexander Pyhalov# Copyright 2010, Richard Lowe 26*24bb1048SAlexander Pyhalov# 27*24bb1048SAlexander Pyhalov 28*24bb1048SAlexander PyhalovPATH=/usr/bin:/usr/sbin 29*24bb1048SAlexander Pyhalovexport PATH 30*24bb1048SAlexander Pyhalov 31*24bb1048SAlexander PyhalovDEFAULTONURI="http://ipkg.sfbay/on-nightly" 32*24bb1048SAlexander PyhalovDEFAULTONPUB="on-nightly" 33*24bb1048SAlexander Pyhalov 34*24bb1048SAlexander Pyhalovusage() 35*24bb1048SAlexander Pyhalov{ 36*24bb1048SAlexander Pyhalov echo "usage: $0 [opts] [-s beName] -t beName" 37*24bb1048SAlexander Pyhalov echo "usage: $0 [opts] -r" 38*24bb1048SAlexander Pyhalov echo 39*24bb1048SAlexander Pyhalov echo "\t-c consolidation : consolidation being upgraded" 40*24bb1048SAlexander Pyhalov echo "\t-d repodir : directory for repositories" 41*24bb1048SAlexander Pyhalov echo "\t-r : configure publisher only" 42*24bb1048SAlexander Pyhalov echo "\t-s : source BE to clone" 43*24bb1048SAlexander Pyhalov echo "\t-t : new BE name" 44*24bb1048SAlexander Pyhalov echo "\t-u uri : origin URI for redist repository" 45*24bb1048SAlexander Pyhalov echo "\t-U prefix: prefix for redist repository" 46*24bb1048SAlexander Pyhalov echo "\t-v : verbose" 47*24bb1048SAlexander Pyhalov echo "\t-Z : skip updating zones" 48*24bb1048SAlexander Pyhalov echo 49*24bb1048SAlexander Pyhalov echo "Update to an ON build:" 50*24bb1048SAlexander Pyhalov echo "\tonu -t newbe -d /path/to/my/ws/packages/\`uname -p\`/nightly" 51*24bb1048SAlexander Pyhalov echo 52*24bb1048SAlexander Pyhalov echo "Update to the nightly build:" 53*24bb1048SAlexander Pyhalov echo "\tonu -t newbe" 54*24bb1048SAlexander Pyhalov echo 55*24bb1048SAlexander Pyhalov echo "Re-enable the publishers in the current BE:" 56*24bb1048SAlexander Pyhalov echo "\tonu -r -d /path/to/my/ws/packages/\`uname -p\`/nightly" 57*24bb1048SAlexander Pyhalov exit 1 58*24bb1048SAlexander Pyhalov} 59*24bb1048SAlexander Pyhalov 60*24bb1048SAlexander Pyhalovexit_error() 61*24bb1048SAlexander Pyhalov{ 62*24bb1048SAlexander Pyhalov echo $* 63*24bb1048SAlexander Pyhalov exit 2 64*24bb1048SAlexander Pyhalov} 65*24bb1048SAlexander Pyhalov 66*24bb1048SAlexander Pyhalovdo_cmd() 67*24bb1048SAlexander Pyhalov{ 68*24bb1048SAlexander Pyhalov [ $verbose -gt 0 ] && echo $* 69*24bb1048SAlexander Pyhalov $* 70*24bb1048SAlexander Pyhalov exit_code=$? 71*24bb1048SAlexander Pyhalov [ $exit_code -eq 0 ] && return 72*24bb1048SAlexander Pyhalov # pkg(1) returns 4 if "nothing to do", which is safe to ignore 73*24bb1048SAlexander Pyhalov [ $1 = "pkg" -a $exit_code -eq 4 ] && return 74*24bb1048SAlexander Pyhalov exit_error "$*" failed: exit code $exit_code 75*24bb1048SAlexander Pyhalov} 76*24bb1048SAlexander Pyhalov 77*24bb1048SAlexander Pyhalovconfigure_publishers() 78*24bb1048SAlexander Pyhalov{ 79*24bb1048SAlexander Pyhalov root=$1 80*24bb1048SAlexander Pyhalov 81*24bb1048SAlexander Pyhalov # 82*24bb1048SAlexander Pyhalov # Get the publisher name from the 'list -v' output. It may seem we 83*24bb1048SAlexander Pyhalov # could do this more tidily using 'info', but that is 84*24bb1048SAlexander Pyhalov # internationalized. 85*24bb1048SAlexander Pyhalov # 86*24bb1048SAlexander Pyhalov typeset on_publisher=$(pkg -R $root list -Hv \ 87*24bb1048SAlexander Pyhalov "${consolidation}-incorporation" | cut -d/ -f3) 88*24bb1048SAlexander Pyhalov 89*24bb1048SAlexander Pyhalov if [[ "$on_publisher" != "$redistpub" ]]; then 90*24bb1048SAlexander Pyhalov do_cmd pkg -R $root set-publisher --no-refresh \ 91*24bb1048SAlexander Pyhalov --non-sticky $on_publisher 92*24bb1048SAlexander Pyhalov fi 93*24bb1048SAlexander Pyhalov do_cmd pkg -R $root set-publisher -e --no-refresh -P -O $uri $redistpub 94*24bb1048SAlexander Pyhalov do_cmd pkg -R $root refresh --full 95*24bb1048SAlexander Pyhalov} 96*24bb1048SAlexander Pyhalov 97*24bb1048SAlexander Pyhalovupdate() 98*24bb1048SAlexander Pyhalov{ 99*24bb1048SAlexander Pyhalov root=$1 100*24bb1048SAlexander Pyhalov 101*24bb1048SAlexander Pyhalov pkg -R $root list entire > /dev/null 2>&1 102*24bb1048SAlexander Pyhalov [ $? -eq 0 ] && do_cmd pkg -R $root uninstall entire 103*24bb1048SAlexander Pyhalov 104*24bb1048SAlexander Pyhalov configure_publishers $root 105*24bb1048SAlexander Pyhalov 106*24bb1048SAlexander Pyhalov do_cmd pkg -R $root image-update 107*24bb1048SAlexander Pyhalov} 108*24bb1048SAlexander Pyhalov 109*24bb1048SAlexander Pyhalovupdate_zone() 110*24bb1048SAlexander Pyhalov{ 111*24bb1048SAlexander Pyhalov zone=$1 112*24bb1048SAlexander Pyhalov 113*24bb1048SAlexander Pyhalov name=`echo $zone | cut -d: -f 2` 114*24bb1048SAlexander Pyhalov if [ $name = "global" ]; then 115*24bb1048SAlexander Pyhalov return 116*24bb1048SAlexander Pyhalov fi 117*24bb1048SAlexander Pyhalov 118*24bb1048SAlexander Pyhalov brand=`echo $zone | cut -d: -f 6` 119*24bb1048SAlexander Pyhalov if [ $brand != "ipkg" ]; then 120*24bb1048SAlexander Pyhalov return 121*24bb1048SAlexander Pyhalov fi 122*24bb1048SAlexander Pyhalov 123*24bb1048SAlexander Pyhalov if [ "$zone_warned" = 0 ]; then 124*24bb1048SAlexander Pyhalov echo "WARNING: Use of onu(1) will prevent use of zone attach in the new BE" >&2 125*24bb1048SAlexander Pyhalov echo "See onu(1)" >&2 126*24bb1048SAlexander Pyhalov zone_warned=1 127*24bb1048SAlexander Pyhalov fi 128*24bb1048SAlexander Pyhalov 129*24bb1048SAlexander Pyhalov state=`echo $zone | cut -d: -f 3` 130*24bb1048SAlexander Pyhalov 131*24bb1048SAlexander Pyhalov case "$state" in 132*24bb1048SAlexander Pyhalov configured|incomplete) 133*24bb1048SAlexander Pyhalov return 134*24bb1048SAlexander Pyhalov ;; 135*24bb1048SAlexander Pyhalov esac 136*24bb1048SAlexander Pyhalov 137*24bb1048SAlexander Pyhalov zoneroot=`echo $zone | cut -d: -f 4` 138*24bb1048SAlexander Pyhalov 139*24bb1048SAlexander Pyhalov echo "Updating zone $name" 140*24bb1048SAlexander Pyhalov update $zoneroot/root 141*24bb1048SAlexander Pyhalov} 142*24bb1048SAlexander Pyhalov 143*24bb1048SAlexander Pyhalovsourcebe="" 144*24bb1048SAlexander Pyhalovtargetbe="" 145*24bb1048SAlexander Pyhalovuri="" 146*24bb1048SAlexander Pyhalovrepodir="" 147*24bb1048SAlexander Pyhalovconsolidation="osnet" 148*24bb1048SAlexander Pyhalovverbose=0 149*24bb1048SAlexander Pyhalovno_zones=0 150*24bb1048SAlexander Pyhalovzone_warned=0 151*24bb1048SAlexander Pyhalovreposonly=0 152*24bb1048SAlexander Pyhalov 153*24bb1048SAlexander Pyhalovwhile getopts :c:d:Ors:t:U:u:vZ i ; do 154*24bb1048SAlexander Pyhalov case $i in 155*24bb1048SAlexander Pyhalov c) 156*24bb1048SAlexander Pyhalov consolidation=$OPTARG 157*24bb1048SAlexander Pyhalov ;; 158*24bb1048SAlexander Pyhalov d) 159*24bb1048SAlexander Pyhalov repodir=$OPTARG 160*24bb1048SAlexander Pyhalov ;; 161*24bb1048SAlexander Pyhalov O) # no-op, compatibility with recommended use 162*24bb1048SAlexander Pyhalov ;; 163*24bb1048SAlexander Pyhalov r) 164*24bb1048SAlexander Pyhalov reposonly=1 165*24bb1048SAlexander Pyhalov ;; 166*24bb1048SAlexander Pyhalov s) 167*24bb1048SAlexander Pyhalov sourcebe=$OPTARG 168*24bb1048SAlexander Pyhalov ;; 169*24bb1048SAlexander Pyhalov t) 170*24bb1048SAlexander Pyhalov targetbe=$OPTARG 171*24bb1048SAlexander Pyhalov ;; 172*24bb1048SAlexander Pyhalov U) 173*24bb1048SAlexander Pyhalov redistpub=$OPTARG 174*24bb1048SAlexander Pyhalov ;; 175*24bb1048SAlexander Pyhalov u) 176*24bb1048SAlexander Pyhalov uri=$OPTARG 177*24bb1048SAlexander Pyhalov ;; 178*24bb1048SAlexander Pyhalov v) 179*24bb1048SAlexander Pyhalov verbose=1 180*24bb1048SAlexander Pyhalov ;; 181*24bb1048SAlexander Pyhalov Z) 182*24bb1048SAlexander Pyhalov no_zones=1 183*24bb1048SAlexander Pyhalov ;; 184*24bb1048SAlexander Pyhalov *) 185*24bb1048SAlexander Pyhalov usage 186*24bb1048SAlexander Pyhalov esac 187*24bb1048SAlexander Pyhalovdone 188*24bb1048SAlexander Pyhalovshift `expr $OPTIND - 1` 189*24bb1048SAlexander Pyhalov 190*24bb1048SAlexander Pyhalov[ -n "$1" ] && usage 191*24bb1048SAlexander Pyhalov 192*24bb1048SAlexander Pyhalovif [ "$reposonly" -eq 1 ]; then 193*24bb1048SAlexander Pyhalov [ -n "$sourcebe" ] && usage 194*24bb1048SAlexander Pyhalov [ -n "$targetbe" ] && usage 195*24bb1048SAlexander Pyhalov [ "$no_zones" -eq 1 ] && usage 196*24bb1048SAlexander Pyhalovelse 197*24bb1048SAlexander Pyhalov [ -z "$targetbe" ] && usage 198*24bb1048SAlexander Pyhalovfi 199*24bb1048SAlexander Pyhalov[ -z "$uri" ] && uri=$ONURI 200*24bb1048SAlexander Pyhalov[ -z "$uri" ] && uri=$DEFAULTONURI 201*24bb1048SAlexander Pyhalov[ -z "$redistpub" ] && redistpub=$ONPUB 202*24bb1048SAlexander Pyhalov[ -z "$redistpub" ] && redistpub=$DEFAULTONPUB 203*24bb1048SAlexander Pyhalov 204*24bb1048SAlexander Pyhalovif [ -n "$repodir" ]; then 205*24bb1048SAlexander Pyhalov redistdir=$repodir/repo.redist 206*24bb1048SAlexander Pyhalov [ -d $redistdir ] || exit_error "$redistdir not found" 207*24bb1048SAlexander Pyhalov typeset cfgfile=$redistdir/cfg_cache 208*24bb1048SAlexander Pyhalov [[ ! -e $cfgfile ]] && cfgfile=$redistdir/pkg5.repository 209*24bb1048SAlexander Pyhalov # need an absolute path 210*24bb1048SAlexander Pyhalov [[ $redistdir == /* ]] || redistdir=$PWD/$redistdir 211*24bb1048SAlexander Pyhalov redistpub=$(python@PYTHON_VERSION@ <<# EOF 212*24bb1048SAlexander Pyhalov import ConfigParser 213*24bb1048SAlexander Pyhalov p = ConfigParser.SafeConfigParser() 214*24bb1048SAlexander Pyhalov p.read("$cfgfile") 215*24bb1048SAlexander Pyhalov pp = p.get("publisher", "prefix") 216*24bb1048SAlexander Pyhalov print "%s" % pp 217*24bb1048SAlexander Pyhalov EOF) || exit_error "Cannot determine publisher prefix" 218*24bb1048SAlexander Pyhalov [[ -n "$redistpub" ]] || exit_error "Repository has no publisher prefix" 219*24bb1048SAlexander Pyhalov uri="file://$redistdir" 220*24bb1048SAlexander Pyhalovfi 221*24bb1048SAlexander Pyhalov 222*24bb1048SAlexander Pyhalovif [ "$reposonly" -eq 1 ]; then 223*24bb1048SAlexander Pyhalov configure_publishers / 224*24bb1048SAlexander Pyhalov exit 0 225*24bb1048SAlexander Pyhalovfi 226*24bb1048SAlexander Pyhalov 227*24bb1048SAlexander Pyhalovcreateargs="" 228*24bb1048SAlexander Pyhalov[ -n "$sourcebe" ] && createargs="-e $sourcebe" 229*24bb1048SAlexander Pyhalov 230*24bb1048SAlexander Pyhalov# ksh seems to have its own mktemp with slightly different semantics 231*24bb1048SAlexander Pyhalovtmpdir=`/usr/bin/mktemp -d /tmp/onu.XXXXXX` 232*24bb1048SAlexander Pyhalov[ -z "$tmpdir" ] && exit_error "mktemp failed" 233*24bb1048SAlexander Pyhalov 234*24bb1048SAlexander Pyhalovdo_cmd beadm create $createargs $targetbe 235*24bb1048SAlexander Pyhalovdo_cmd beadm mount $targetbe $tmpdir 236*24bb1048SAlexander Pyhalovupdate $tmpdir 237*24bb1048SAlexander Pyhalovdo_cmd beadm activate $targetbe 238*24bb1048SAlexander Pyhalov 239*24bb1048SAlexander Pyhalovif [ "$no_zones" != 1 ]; then 240*24bb1048SAlexander Pyhalov for zone in `do_cmd zoneadm -R $tmpdir list -cip`; do 241*24bb1048SAlexander Pyhalov update_zone $zone 242*24bb1048SAlexander Pyhalov done 243*24bb1048SAlexander Pyhalovfi 244*24bb1048SAlexander Pyhalov 245*24bb1048SAlexander Pyhalovexit 0 246