xref: /titanic_50/usr/src/tools/scripts/onu.sh.in (revision 24bb1048b1197ebc9afe761e4098573aeedfe8c9)
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