xref: /illumos-gate/usr/src/tools/scripts/onu.sh.in (revision b934d23b)
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.
254358e1dfSRichard Lowe# Copyright 2010, Richard Lowe
26b3013b70SAndy Fiddaman# Copyright 2021 OmniOS Community Edition (OmniOSce) Association.
279f923083SAlexander Pyhalov#
28ead1f93eSLiane Praza
29ead1f93eSLiane PrazaPATH=/usr/bin:/usr/sbin
30ead1f93eSLiane Prazaexport PATH
31ead1f93eSLiane Praza
32ead1f93eSLiane PrazaDEFAULTONURI="http://ipkg.sfbay/on-nightly"
33ead1f93eSLiane PrazaDEFAULTONPUB="on-nightly"
34ead1f93eSLiane Praza
35ead1f93eSLiane Prazausage()
36ead1f93eSLiane Praza{
3767274386SJohn Levon	echo "usage: $0 [opts] [-s beName] -t beName"
3867274386SJohn Levon	echo "usage: $0 [opts] -r"
3967274386SJohn Levon	echo
404358e1dfSRichard Lowe	echo "\t-c consolidation : consolidation being upgraded"
4167274386SJohn Levon	echo "\t-d repodir : directory for repositories"
424358e1dfSRichard Lowe	echo "\t-r : configure publisher only"
4367274386SJohn Levon	echo "\t-s : source BE to clone"
4467274386SJohn Levon	echo "\t-t : new BE name"
4567274386SJohn Levon	echo "\t-u uri : origin URI for redist repository"
4667274386SJohn Levon	echo "\t-U prefix:  prefix for redist repository"
4767274386SJohn Levon	echo "\t-v : verbose"
4867274386SJohn Levon	echo "\t-Z : skip updating zones"
4967274386SJohn Levon	echo
5067274386SJohn Levon	echo "Update to an ON build:"
5167274386SJohn Levon	echo "\tonu -t newbe -d /path/to/my/ws/packages/\`uname -p\`/nightly"
5267274386SJohn Levon	echo
5367274386SJohn Levon	echo "Update to the nightly build:"
5467274386SJohn Levon	echo "\tonu -t newbe"
5567274386SJohn Levon	echo
564358e1dfSRichard Lowe	echo "Re-enable the publishers in the current BE:"
5767274386SJohn Levon	echo "\tonu -r -d /path/to/my/ws/packages/\`uname -p\`/nightly"
58ead1f93eSLiane Praza	exit 1
59ead1f93eSLiane Praza}
60ead1f93eSLiane Praza
61ead1f93eSLiane Prazaexit_error()
62ead1f93eSLiane Praza{
63ead1f93eSLiane Praza	echo $*
64ead1f93eSLiane Praza	exit 2
65ead1f93eSLiane Praza}
66ead1f93eSLiane Praza
67ead1f93eSLiane Prazado_cmd()
68ead1f93eSLiane Praza{
69ead1f93eSLiane Praza	[ $verbose -gt 0 ] && echo $*
70ead1f93eSLiane Praza	$*
71ead1f93eSLiane Praza	exit_code=$?
72ead1f93eSLiane Praza	[ $exit_code -eq 0 ] && return
73ead1f93eSLiane Praza	# pkg(1) returns 4 if "nothing to do", which is safe to ignore
74ead1f93eSLiane Praza	[ $1 = "pkg" -a $exit_code -eq 4 ] && return
75ead1f93eSLiane Praza	exit_error "$*" failed: exit code $exit_code
76ead1f93eSLiane Praza}
77ead1f93eSLiane Praza
7867274386SJohn Levonconfigure_publishers()
7967274386SJohn Levon{
8067274386SJohn Levon	root=$1
8167274386SJohn Levon
824358e1dfSRichard Lowe	#
834358e1dfSRichard Lowe	# Get the publisher name from the 'list -v' output.  It may seem we
844358e1dfSRichard Lowe	# could do this more tidily using 'info', but that is
854358e1dfSRichard Lowe	# internationalized.
864358e1dfSRichard Lowe	#
874358e1dfSRichard Lowe	typeset on_publisher=$(pkg -R $root list -Hv \
884358e1dfSRichard Lowe	    "${consolidation}-incorporation" | cut -d/ -f3)
894358e1dfSRichard Lowe
90b3013b70SAndy Fiddaman	if [[ "$on_publisher" != "$redistpub" ]]; then
91b3013b70SAndy Fiddaman		do_cmd pkg -R $root set-publisher -r --no-refresh \
92b3013b70SAndy Fiddaman		    --set-property signature-policy=verify \
93b3013b70SAndy Fiddaman		    --non-sticky $on_publisher
94b3013b70SAndy Fiddaman	fi
95b3013b70SAndy Fiddaman
96b3013b70SAndy Fiddaman	do_cmd pkg -R $root set-publisher -r -e --no-refresh -P \
97b3013b70SAndy Fiddaman	    --set-property signature-policy=verify -O $uri $redistpub
98b3013b70SAndy Fiddaman
9967274386SJohn Levon	do_cmd pkg -R $root refresh --full
10067274386SJohn Levon}
10167274386SJohn Levon
102b3013b70SAndy Fiddamanprepare_image()
103b3013b70SAndy Fiddaman{
104b3013b70SAndy Fiddaman	print "**\n** Preparing for ONU from $distribution\n**"
105b3013b70SAndy Fiddaman
106b3013b70SAndy Fiddaman	case $distribution in
1074772ec9fSJoshua M. Clulow	    omnios|helios)
108b3013b70SAndy Fiddaman		# This removes files from the image that cause conflicts with
109b3013b70SAndy Fiddaman		# stock illumos-gate, and removes omnios-only kernel drivers
110b3013b70SAndy Fiddaman		# etc.
111b3013b70SAndy Fiddaman		do_cmd pkg -R $root change-facet -r onu.ooceonly=false
112b3013b70SAndy Fiddaman		;;
113b3013b70SAndy Fiddaman	esac
114b3013b70SAndy Fiddaman}
115b3013b70SAndy Fiddaman
116639a4b99SJohn Levonupdate()
117639a4b99SJohn Levon{
11867274386SJohn Levon	root=$1
11967274386SJohn Levon
120b3013b70SAndy Fiddaman	pkg -R $root list -q entire && do_cmd pkg -R $root uninstall entire
12167274386SJohn Levon
12267274386SJohn Levon	configure_publishers $root
12367274386SJohn Levon
124b3013b70SAndy Fiddaman	prepare_image
125b3013b70SAndy Fiddaman
126*b934d23bSHans Rosenfeld	do_cmd pkg -R $root image-update $update_args
127639a4b99SJohn Levon}
128639a4b99SJohn Levon
129639a4b99SJohn Levonupdate_zone()
130639a4b99SJohn Levon{
131b3013b70SAndy Fiddaman	OIFS="$IFS"
132b3013b70SAndy Fiddaman	IFS=":"
133b3013b70SAndy Fiddaman	set -- $1
134b3013b70SAndy Fiddaman	zone=$2; state=$3; path=$4; brand=$6
135b3013b70SAndy Fiddaman	IFS="$OIFS"
136639a4b99SJohn Levon
137b3013b70SAndy Fiddaman	[[ "$zone" == "global" ]] && return
138b3013b70SAndy Fiddaman	[[ "$state" == "incomplete" ]] && return
139b3013b70SAndy Fiddaman	[[ "$state" == "configured" ]] && return
140b3013b70SAndy Fiddaman	[[ "$brand" == "$nlbrand" ]] || return
141639a4b99SJohn Levon
142639a4b99SJohn Levon	if [ "$zone_warned" = 0 ]; then
143639a4b99SJohn Levon		echo "WARNING: Use of onu(1) will prevent use of zone attach in the new BE" >&2
144639a4b99SJohn Levon		echo "See onu(1)" >&2
145639a4b99SJohn Levon		zone_warned=1
146639a4b99SJohn Levon	fi
147639a4b99SJohn Levon
148b3013b70SAndy Fiddaman	print "**\n** Updating zone $zone (brand $brand)\n**"
149b3013b70SAndy Fiddaman	update "$path/root"
150b3013b70SAndy Fiddaman}
151639a4b99SJohn Levon
152b3013b70SAndy Fiddamantypeset -l distribution
153b3013b70SAndy Fiddamanif [[ -r /etc/os-release ]]; then
154b3013b70SAndy Fiddaman	distribution=$(awk -F= '$1 == "ID" { print $2 }' /etc/os-release)
155b3013b70SAndy Fiddamanelif [[ -r /etc/release ]]; then
156b3013b70SAndy Fiddaman	distribution=$(awk 'NR == 1 { print $1 }' /etc/release)
157b3013b70SAndy Fiddamanelse
158b3013b70SAndy Fiddaman	distribution=unknown
159b3013b70SAndy Fiddamanfi
160639a4b99SJohn Levon
161b3013b70SAndy Fiddamancase $distribution in
162b3013b70SAndy Fiddaman    openindiana)
163b3013b70SAndy Fiddaman	nlbrand=nlipkg
164b3013b70SAndy Fiddaman	;;
1654772ec9fSJoshua M. Clulow    omnios|helios)
166b3013b70SAndy Fiddaman	nlbrand=ipkg
167b3013b70SAndy Fiddaman	;;
168b3013b70SAndy Fiddaman    *)
169b3013b70SAndy Fiddaman	nlbrand=unknown
170b3013b70SAndy Fiddaman	;;
171b3013b70SAndy Fiddamanesac
172639a4b99SJohn Levon
173ead1f93eSLiane Prazasourcebe=""
174ead1f93eSLiane Prazatargetbe=""
175ead1f93eSLiane Prazauri=""
176ead1f93eSLiane Prazarepodir=""
1774358e1dfSRichard Loweconsolidation="osnet"
178ead1f93eSLiane Prazaverbose=0
179639a4b99SJohn Levonno_zones=0
180639a4b99SJohn Levonzone_warned=0
18167274386SJohn Levonreposonly=0
182*b934d23bSHans Rosenfeldupdate_args=""
183ead1f93eSLiane Praza
1844358e1dfSRichard Lowewhile getopts :c:d:Ors:t:U:u:vZ i ; do
185ead1f93eSLiane Praza	case $i in
1864358e1dfSRichard Lowe	c)
1874358e1dfSRichard Lowe		consolidation=$OPTARG
1884358e1dfSRichard Lowe		;;
189ead1f93eSLiane Praza	d)
190ead1f93eSLiane Praza		repodir=$OPTARG
191ead1f93eSLiane Praza		;;
1924358e1dfSRichard Lowe	O)			# no-op, compatibility with recommended use
193ead1f93eSLiane Praza		;;
19467274386SJohn Levon	r)
19567274386SJohn Levon		reposonly=1
19667274386SJohn Levon		;;
197ead1f93eSLiane Praza	s)
198ead1f93eSLiane Praza		sourcebe=$OPTARG
199ead1f93eSLiane Praza		;;
200ead1f93eSLiane Praza	t)
201ead1f93eSLiane Praza		targetbe=$OPTARG
202ead1f93eSLiane Praza		;;
203ead1f93eSLiane Praza	U)
204ead1f93eSLiane Praza		redistpub=$OPTARG
205ead1f93eSLiane Praza		;;
206ead1f93eSLiane Praza	u)
207ead1f93eSLiane Praza		uri=$OPTARG
208ead1f93eSLiane Praza		;;
209ead1f93eSLiane Praza	v)
210ead1f93eSLiane Praza		verbose=1
211ead1f93eSLiane Praza		;;
212639a4b99SJohn Levon	Z)
213639a4b99SJohn Levon		no_zones=1
214639a4b99SJohn Levon		;;
215ead1f93eSLiane Praza	*)
216ead1f93eSLiane Praza		usage
217ead1f93eSLiane Praza	esac
218ead1f93eSLiane Prazadone
219ead1f93eSLiane Prazashift `expr $OPTIND - 1`
220ead1f93eSLiane Praza
221*b934d23bSHans Rosenfeld# Pass remaining arguments to pkg update.
222*b934d23bSHans Rosenfeldif [ -n "$1" ]; then
223*b934d23bSHans Rosenfeld	update_args="$*"
224*b934d23bSHans Rosenfeldfi
22567274386SJohn Levon
22667274386SJohn Levonif [ "$reposonly" -eq 1 ]; then
22767274386SJohn Levon	[ -n "$sourcebe" ] && usage
22867274386SJohn Levon	[ -n "$targetbe" ] && usage
22967274386SJohn Levon	[ "$no_zones" -eq 1 ] && usage
23067274386SJohn Levonelse
23167274386SJohn Levon	[ -z "$targetbe" ] && usage
23267274386SJohn Levonfi
233ead1f93eSLiane Praza[ -z "$uri" ] && uri=$ONURI
234ead1f93eSLiane Praza[ -z "$uri" ] && uri=$DEFAULTONURI
235ead1f93eSLiane Praza[ -z "$redistpub" ] && redistpub=$ONPUB
236ead1f93eSLiane Praza[ -z "$redistpub" ] && redistpub=$DEFAULTONPUB
237ead1f93eSLiane Praza
238ead1f93eSLiane Prazaif [ -n "$repodir" ]; then
239ead1f93eSLiane Praza	redistdir=$repodir/repo.redist
240ead1f93eSLiane Praza	[ -d $redistdir ] || exit_error "$redistdir not found"
2414358e1dfSRichard Lowe	typeset cfgfile=$redistdir/cfg_cache
2424358e1dfSRichard Lowe	[[ ! -e $cfgfile ]] && cfgfile=$redistdir/pkg5.repository
2434358e1dfSRichard Lowe	# need an absolute path
2444358e1dfSRichard Lowe	[[ $redistdir == /* ]] || redistdir=$PWD/$redistdir
2459f923083SAlexander Pyhalov	redistpub=$(python@PYTHON_VERSION@ <<# EOF
246b3013b70SAndy Fiddaman		try:	# python3
247b3013b70SAndy Fiddaman			import configparser
248b3013b70SAndy Fiddaman			p = configparser.ConfigParser()
249b3013b70SAndy Fiddaman		except:	# python2
250b3013b70SAndy Fiddaman			import ConfigParser
251b3013b70SAndy Fiddaman			p = ConfigParser.SafeConfigParser()
2524358e1dfSRichard Lowe		p.read("$cfgfile")
253ead1f93eSLiane Praza		pp = p.get("publisher", "prefix")
254b3013b70SAndy Fiddaman		print("{}".format(pp))
2554358e1dfSRichard Lowe		EOF) || exit_error "Cannot determine publisher prefix"
2564358e1dfSRichard Lowe	[[ -n "$redistpub" ]] || exit_error "Repository has no publisher prefix"
2574358e1dfSRichard Lowe	uri="file://$redistdir"
258ead1f93eSLiane Prazafi
259ead1f93eSLiane Praza
26067274386SJohn Levonif [ "$reposonly" -eq 1 ]; then
26167274386SJohn Levon	configure_publishers /
26267274386SJohn Levon	exit 0
26367274386SJohn Levonfi
26467274386SJohn Levon
265ead1f93eSLiane Prazacreateargs=""
266ead1f93eSLiane Praza[ -n "$sourcebe" ] && createargs="-e $sourcebe"
267ead1f93eSLiane Praza
268ead1f93eSLiane Praza# ksh seems to have its own mktemp with slightly different semantics
269ead1f93eSLiane Prazatmpdir=`/usr/bin/mktemp -d /tmp/onu.XXXXXX`
270ead1f93eSLiane Praza[ -z "$tmpdir" ] && exit_error "mktemp failed"
271ead1f93eSLiane Praza
272ead1f93eSLiane Prazado_cmd beadm create $createargs $targetbe
273ead1f93eSLiane Prazado_cmd beadm mount $targetbe $tmpdir
274639a4b99SJohn Levonupdate $tmpdir
275ead1f93eSLiane Prazado_cmd beadm activate $targetbe
276ead1f93eSLiane Praza
277639a4b99SJohn Levonif [ "$no_zones" != 1 ]; then
278639a4b99SJohn Levon	for zone in `do_cmd zoneadm -R $tmpdir list -cip`; do
279639a4b99SJohn Levon		update_zone $zone
280639a4b99SJohn Levon	done
281639a4b99SJohn Levonfi
282ead1f93eSLiane Praza
283ead1f93eSLiane Prazaexit 0
284