xref: /titanic_52/usr/src/tools/scripts/onu.sh.in (revision 2fb4439d628ad2df0775287be1abd1ed95e7d267)
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