xref: /titanic_41/usr/src/tools/scripts/onu.sh (revision c9a6ea2e938727c95af7108c5e00eee4c890c7ae)
1#!/bin/ksh93 -p
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or http://www.opensolaris.org/os/licensing.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22
23#
24# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
25#
26
27PATH=/usr/bin:/usr/sbin
28export PATH
29
30DEFAULTONURI="http://ipkg.sfbay/on-nightly"
31DEFAULTONPUB="on-nightly"
32DEFAULTONEXTRAURI="http://ipkg.sfbay/on-extra"
33DEFAULTONEXTRAPUB="on-extra"
34
35usage()
36{
37	echo "usage: $0 [opts] [-s beName] -t beName"
38	echo "usage: $0 [opts] -r"
39	echo
40	echo "\t-d repodir : directory for repositories"
41	echo "\t-e uri : origin URI for extra repository"
42	echo "\t-E prefix : prefix for extra repository"
43	echo "\t-O : open mode, no extra repository will be used"
44	echo "\t-r : start repository servers only"
45	echo "\t-s : source BE to clone"
46	echo "\t-t : new BE name"
47	echo "\t-u uri : origin URI for redist repository"
48	echo "\t-U prefix:  prefix for redist repository"
49	echo "\t-v : verbose"
50	echo "\t-Z : skip updating zones"
51	echo
52	echo "Update to an ON build:"
53	echo "\tonu -t newbe -d /path/to/my/ws/packages/\`uname -p\`/nightly"
54	echo
55	echo "Update to the nightly build:"
56	echo "\tonu -t newbe"
57	echo
58	echo "Re-enable the publishers, and start any pkg.depotd servers"
59	echo "necessary in the current BE:"
60	echo "\tonu -r -d /path/to/my/ws/packages/\`uname -p\`/nightly"
61	exit 1
62}
63
64exit_error()
65{
66	echo $*
67	cleanup
68	exit 2
69}
70
71cleanup()
72{
73	[ $redistpid -gt 0 ] && kill $redistpid
74	[ $extrapid -gt 0 ] && kill $extrapid
75	[ -d /tmp/redist.$$ ] && /bin/rm -rf /tmp/redist.$$
76	[ -d /tmp/extra.$$ ] && /bin/rm -rf /tmp/extra.$$
77}
78
79do_cmd()
80{
81	[ $verbose -gt 0 ] && echo $*
82	$*
83	exit_code=$?
84	[ $exit_code -eq 0 ] && return
85	# pkg(1) returns 4 if "nothing to do", which is safe to ignore
86	[ $1 = "pkg" -a $exit_code -eq 4 ] && return
87	exit_error "$*" failed: exit code $exit_code
88}
89
90configure_publishers()
91{
92	root=$1
93
94	do_cmd pkg -R $root set-publisher --no-refresh --non-sticky opensolaris.org
95	do_cmd pkg -R $root set-publisher -e --no-refresh -P -O $uri $redistpub
96	[ $open -eq 0 ] && {
97		do_cmd pkg -R $root set-publisher -e \
98		    --no-refresh -O $extrauri $extrapub
99	}
100	do_cmd pkg -R $root refresh --full
101}
102
103#
104# If we're working from a repodir, disable the new publishers in the new
105# BE; they won't work without further configuration, in which case the
106# -r option should be used.
107#
108unconfigure_publishers()
109{
110	root=$1
111
112	if [ -n "$repodir" ]; then
113		do_cmd pkg -R $root set-publisher -P opensolaris.org
114		do_cmd pkg -R $root set-publisher -d $redistpub
115		[ $open -eq 0 ] && {
116			do_cmd pkg -R $root set-publisher -d $extrapub
117		}
118	fi
119}
120
121update()
122{
123	root=$1
124
125	pkg -R $root list entire > /dev/null 2>&1
126	[ $? -eq 0 ] && do_cmd pkg -R $root uninstall entire
127
128	configure_publishers $root
129
130	do_cmd pkg -R $root image-update
131
132	unconfigure_publishers $root
133}
134
135update_zone()
136{
137	zone=$1
138
139	name=`echo $zone | cut -d: -f 2`
140	if [ $name = "global" ]; then
141		return
142	fi
143
144	brand=`echo $zone | cut -d: -f 6`
145	if [ $brand != "ipkg" ]; then
146		return
147	fi
148
149	if [ "$zone_warned" = 0 ]; then
150		echo "WARNING: Use of onu(1) will prevent use of zone attach in the new BE" >&2
151		echo "See onu(1)" >&2
152		zone_warned=1
153	fi
154
155	state=`echo $zone | cut -d: -f 3`
156
157	case "$state" in
158	configured|incomplete)
159		return
160		;;
161	esac
162
163	zoneroot=`echo $zone | cut -d: -f 4`
164
165	echo "Updating zone $name"
166	update $zoneroot/root
167}
168
169sourcebe=""
170targetbe=""
171uri=""
172extrauri=""
173repodir=""
174verbose=0
175open=0
176redistpid=0
177extrapid=0
178redistport=13000
179extraport=13001
180no_zones=0
181zone_warned=0
182reposonly=0
183
184trap cleanup 1 2 3 15
185
186while getopts :d:E:e:Ors:t:U:u:vZ i ; do
187	case $i in
188	d)
189		repodir=$OPTARG
190		;;
191	E)
192		extrapub=$OPTARG
193		;;
194	e)
195		extrauri=$OPTARG
196		;;
197	O)
198		open=1
199		;;
200	r)
201		reposonly=1
202		;;
203	s)
204		sourcebe=$OPTARG
205		;;
206	t)
207		targetbe=$OPTARG
208		;;
209	U)
210		redistpub=$OPTARG
211		;;
212	u)
213		uri=$OPTARG
214		;;
215	v)
216		verbose=1
217		;;
218	Z)
219		no_zones=1
220		;;
221	*)
222		usage
223	esac
224done
225shift `expr $OPTIND - 1`
226
227[ -n "$1" ] && usage
228
229if [ "$reposonly" -eq 1 ]; then
230	[ -n "$sourcebe" ] && usage
231	[ -n "$targetbe" ] && usage
232	[ "$no_zones" -eq 1 ] && usage
233else
234	[ -z "$targetbe" ] && usage
235fi
236[ -z "$uri" ] && uri=$ONURI
237[ -z "$uri" ] && uri=$DEFAULTONURI
238[ -z "$redistpub" ] && redistpub=$ONPUB
239[ -z "$redistpub" ] && redistpub=$DEFAULTONPUB
240[ -z "$extrauri" ] && extrauri=$ONEXTRAURI
241[ -z "$extrauri" ] && extrauri=$DEFAULTONEXTRAURI
242[ -z "$extrapub" ] && extrapub=$ONEXTRAPUB
243[ -z "$extrapub" ] && extrapub=$DEFAULTONEXTRAPUB
244
245if [ -n "$repodir" ]; then
246	redistdir=$repodir/repo.redist
247	[ -d $redistdir ] || exit_error "$redistdir not found"
248	redistpub=$(python2.6 <<# EOF
249		import ConfigParser
250		p = ConfigParser.SafeConfigParser()
251		p.read("$redistdir/cfg_cache")
252		pp = p.get("publisher", "prefix")
253		print "%s" % pp
254		EOF)
255	[ $verbose -gt 0 ] && echo "starting pkg.depotd -d $redistdir -p $redistport"
256	ARGS="--readonly --writable-root"
257	mkdir /tmp/redist.$$
258	/usr/lib/pkg.depotd -d $redistdir -p $redistport $ARGS /tmp/redist.$$ >/dev/null &
259	redistpid=$!
260	uri="http://localhost:$redistport/"
261	if [ $open -eq 0 ]; then
262		extradir=$repodir/repo.extra
263		[ -d $extradir ] || exit_error "$extradir not found"
264		extrapub=$(python2.6 <<# EOF
265			import ConfigParser
266			p = ConfigParser.SafeConfigParser()
267			p.read("$extradir/cfg_cache")
268			pp = p.get("publisher", "prefix")
269			print "%s" % pp
270			EOF)
271		[ $verbose -gt 0 ] && echo "starting pkg.depotd -d $extradir -p $extraport"
272		mkdir /tmp/extra.$$
273		/usr/lib/pkg.depotd -d $extradir -p $extraport $ARGS /tmp/extra.$$ >/dev/null &
274		extrapid=$!
275		extrauri="http://localhost:$extraport/"
276	fi
277fi
278
279if [ "$reposonly" -eq 1 ]; then
280	configure_publishers /
281	if [ "$redistpid" -ne 0 ]; then
282		echo "$redistpub pkg.depotd running with pid $redistpid"
283	fi
284	if [ "$extrapid" -ne 0 ]; then
285		echo "$extrapub pkg.depotd running with pid $extrapid"
286	fi
287	exit 0
288fi
289
290createargs=""
291[ -n "$sourcebe" ] && createargs="-e $sourcebe"
292
293# ksh seems to have its own mktemp with slightly different semantics
294tmpdir=`/usr/bin/mktemp -d /tmp/onu.XXXXXX`
295[ -z "$tmpdir" ] && exit_error "mktemp failed"
296
297do_cmd beadm create $createargs $targetbe
298do_cmd beadm mount $targetbe $tmpdir
299update $tmpdir
300do_cmd beadm activate $targetbe
301
302if [ "$no_zones" != 1 ]; then
303	for zone in `do_cmd zoneadm -R $tmpdir list -cip`; do
304		update_zone $zone
305	done
306fi
307
308cleanup
309exit 0
310