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