xref: /titanic_44/usr/src/tools/scripts/onu.sh (revision 4358e1df62b102cc81c84284b79bc01cfb1b7f2c)
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