8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / cmd / tsol / misc / txzonemgr.sh
blob179a0e8170c59209ad8a42d225880b71faac0b68
1 #!/bin/ksh
3 # CDDL HEADER START
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.
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.
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]
20 # CDDL HEADER END
22 # Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23 # Copyright 2014 Garrett D'Amore
27 # This script provides a simple GUI for managing labeled zones.
28 # It provides contextual menus which provide appropriate choices.
29 # It must be run in the global zone as root.
31 # These arguments are accepted, and will result in non-interactive
32 # (text-only) mode:
34 # txzonemgr [-c | -d[f]]
36 # -c create default zones
37 # -d destroy all zones; prompts for confirmation unless
38 # the -f flag is also specified
39 # -f force
42 # DISP - use GUI (otherwise use non-interactive mode)
43 DISP=1
44 # CREATEDEF - make default zones (non-interactive)
45 CREATEDEF=0
46 # DESTROYZONES - tear down all zones (non-interactive)
47 DESTROYZONES=0
48 # FORCE - force
49 FORCE=0
51 NSCD_PER_LABEL=0
52 NSCD_INDICATOR=/var/tsol/doors/nscd_per_label
53 if [ -f $NSCD_INDICATOR ] ; then
54 NSCD_PER_LABEL=1
57 myname=$(basename $0)
59 TXTMP=/tmp/txzonemgr
60 TNRHTP=/etc/security/tsol/tnrhtp
61 TNRHDB=/etc/security/tsol/tnrhdb
62 TNZONECFG=/etc/security/tsol/tnzonecfg
63 PUBZONE=public
64 INTZONE=internal
66 PATH=/usr/bin:/usr/sbin:/usr/lib export PATH
67 title="Labeled Zone Manager 2.1"
69 msg_defzones=$(gettext "Create default zones using default settings?")
70 msg_confirmkill=$(gettext "OK to destroy all zones?")
71 msg_continue=$(gettext "(exit to resume $(basename $0) when ready)")
72 msg_getlabel=$(gettext "Select a label for the")
73 msg_getremote=$(gettext "Select a remote host or network from the list below:")
74 msg_getnet=$(gettext "Select a network configuration for the")
75 msg_getzone=$(gettext "Select a zone from the list below:
76 (select global for zone creation and shared settings)")
77 msg_getcmd=$(gettext "Select a command from the list below:")
78 msg_inuse=$(gettext "That label is already assigned\nto the")
79 msg_getmin=$(gettext "Select the minimum network label for the")
80 msg_getmax=$(gettext "Select the maximum network label for the")
81 msg_badip=$(gettext " is not a valid IP address")
84 process_options()
86 typeset opt optlist
88 optlist='cdf'
90 while getopts ":$optlist" opt
92 case $opt in
93 c) CREATEDEF=1
94 DISP=0
96 d) DESTROYZONES=1
97 DISP=0
99 f) FORCE=1
101 *) gettext "invalid option -$OPTARG\n"
102 usage
103 return 2
105 esac
106 done
108 if [ $CREATEDEF -eq 1 -a $DESTROYZONES -eq 1 ] ; then
109 gettext "cannot combine options -c and -d\n"
110 usage
111 return 2
113 if [ $CREATEDEF -eq 1 -a $FORCE -eq 1 ] ; then
114 gettext "option -f not allowed with -c\n"
115 usage
116 return 2
118 if [ $FORCE -eq 1 -a $CREATEDEF -eq 0 -a $DESTROYZONES -eq 0 ] ; then
119 gettext "option -f specified without any other options\n"
120 usage
121 return 2
124 shift $((OPTIND - 1))
125 if [ "x$1" != "x" ] ; then
126 usage
127 return 2
130 return 0
133 usage() {
134 gettext "usage: $myname [-c | -d[f]]\n"
137 consoleCheck() {
138 if [ $zonename != global ] ; then
139 zconsole=$(pgrep -f "zlogin -C $zonename")
140 if [ $? != 0 ] ; then
141 console="Zone Console...\n"
146 labelCheck() {
147 hexlabel=$(grep "^$zonename:" $TNZONECFG|cut -d : -f2);
148 if [[ $hexlabel ]] ; then
149 label=
150 if [ $zonename = global ] ; then
151 template="admin_low"
152 addcipsohost="Add Multilevel Access to Remote Host...\n"
153 removecipsohost="Remove Multilevel Access to Remote Host...\n"
154 setmlps="Configure Multilevel Ports...\n"
155 else
156 template=${zonename}_unlab
157 addcipsohost=
158 removecipsohost=
159 setmlps=
161 net=$(zonecfg -z $zonename info net)
162 if [[ -n $net ]] ; then
163 setmlps="Configure Multilevel Ports...\n"
164 elif [ $zonestate = configured ] ; then
165 addnet="Configure Network Interfaces...\n"
168 addremotehost="Add Single-level Access to Remote Host...\n"
169 remotes=$(grep -v "^#" $TNRHDB|grep $template)
170 if [ $? = 0 ] ; then
171 removeremotehost="Remove Single-level Access to Remote Host...\n"
172 else
173 removeremotehost=
175 else
176 label="Select Label...\n"
177 addremotehost=
178 removeremotehost=
179 addcipsohost=
180 removecipsohost=
181 setmlps=
185 cloneCheck() {
186 set -A zonelist
187 integer clone_cnt=0
188 for p in $(zoneadm list -ip) ; do
189 z=$(echo "$p"|cut -d : -f2)
190 s=$(echo "$p"|cut -d : -f3)
191 if [ $z = $zonename ] ; then
192 continue
193 elif [ $s = "installed" ] ; then
194 zonelist[clone_cnt]=$z
195 clone_cnt+=1
197 done
198 if [ $clone_cnt -gt 0 ] ; then
199 clone="Clone...\n"; \
203 relabelCheck() {
204 macstate=$(zonecfg -z $zonename info|grep win_mac_write)
205 if [[ -n $macstate ]] ; then
206 permitrelabel="Deny Relabeling\n"
207 else
208 permitrelabel="Permit Relabeling\n"
212 autobootCheck() {
213 bootmode=$(zonecfg -z $zonename info autoboot)
214 if [[ $bootmode == 'autoboot: true' ]] ; then
215 autoboot="Set Manual Booting\n"
216 else
217 autoboot="Set Automatic Booting\n"
221 newZone() {
222 if [[ ! -n $zonename ]] ; then
223 zonename=$(zenity --entry \
224 --title="$title" \
225 --width=330 \
226 --entry-text="" \
227 --text="Enter Zone Name: ")
229 if [[ ! -n $zonename ]] ; then
230 zonename=global
231 return
234 zonecfg -z $zonename "create -t SUNWtsoldef;\
235 set zonepath=/zone/$zonename"
238 removeZoneBEs() {
239 delopt=$*
241 zfs list -H $ZDSET/$zonename 1>/dev/null 2>&1
242 if [ $? = 0 ] ; then
243 for zbe in $(zfs list -rHo name $ZDSET/$zonename|grep ROOT/zbe) ; do
244 zfs destroy $delopt $zbe
245 done
249 updateTemplate () {
250 if [ $hostType = cipso ] ; then
251 template=${zonename}_cipso
252 deflabel=
253 else
254 template=${zonename}_unlab
255 deflabel="def_label=${hexlabel};"
258 tnzone=$(grep "^${template}:" $TNRHTP 2>/dev/null)
259 if [ $? -eq 0 ] ; then
260 sed -e "/^${template}/d" $TNRHTP > $TXTMP/tnrhtp.$$ 2>/dev/null
261 mv $TXTMP/tnrhtp.$$ $TNRHTP
263 print "${template}:host_type=${hostType};doi=1;min_sl=${minlabel};max_sl=${maxlabel};$deflabel" >> $TNRHTP
264 tnctl -t $template
267 setTNdata () {
268 tnzline="$zonename:${hexlabel}:0::"
269 grep "^$tnzline" $TNZONECFG 1>/dev/null 2>&1
270 if [ $? -eq 1 ] ; then
271 print "$tnzline" >> $TNZONECFG
275 # Add matching entries in tnrhtp if necessary
277 minlabel=admin_low
278 maxlabel=admin_high
279 hostType=cipso
280 updateTemplate
282 hostType=unlabeled
283 updateTemplate
286 selectLabel() {
287 hexlabel=$(tgnome-selectlabel \
288 --title="$title" \
289 --text="$msg_getlabel $zonename zone:" \
290 --min="${DEFAULTLABEL}" \
291 --default="${DEFAULTLABEL}" \
292 --max=$(chk_encodings -X) \
293 --accredcheck=yes \
294 --mode=sensitivity \
295 --format=internal)
296 if [ $? = 0 ] ; then
297 x=$(grep -i :{$hexlabel}: $TNZONECFG)
298 if [ $? = 0 ] ; then
299 z=$(print $x|cut -d : -f1)
300 x=$(zenity --error \
301 --title="$title" \
302 --text="$msg_inuse $z zone.")
303 else
304 setTNdata
309 getLabelRange() {
310 deflabel=$(hextoalabel $hexlabel)
311 minlabel=$(tgnome-selectlabel \
312 --title="$title" \
313 --text="$msg_getmin $zonename zone:" \
314 --min="${DEFAULTLABEL}" \
315 --max="$deflabel" \
316 --default="$hexlabel" \
317 --accredcheck=no \
318 --mode=sensitivity \
319 --format=internal)
320 [ $? != 0 ] && return
322 maxlabel=$(tgnome-selectlabel \
323 --title="$title" \
324 --text="$msg_getmax $zonename zone:" \
325 --min="$deflabel" \
326 --max=$(chk_encodings -X) \
327 --default="$hexlabel" \
328 --accredcheck=no \
329 --mode=sensitivity \
330 --format=internal)
331 [ $? != 0 ] && return
333 hostType=cipso
334 updateTemplate
338 encryptionValues() {
339 echo $(zfs get 2>&1 | grep encryption | sed -e s/^.*YES// -e s/\|//g)
342 getPassphrase() {
343 pass1=$(zenity --entry --title="$title" --text="Enter passphrase:" \
344 --width=330 --hide-text)
345 pass2=$(zenity --entry --title="$title" --text="Re-enter passphrase:" \
346 --width=330 --hide-text)
347 if [[ "$pass1" != "$pass2" ]]; then
348 zenity --error --title="$title" \
349 --text="Passphrases do not match"
350 return ""
352 file=$(mktemp)
353 echo "$pass1" > $file
354 echo "$file"
357 createZDSET() {
358 options=$1
359 pool=${2%%/*}
361 # First check if ZFS encrytption support is available
362 pversion=$(zpool list -H -o version $pool)
363 cversion=$(zpool upgrade -v | grep Crypto | awk '{ print $1 }')
364 if (( cversion == 0 || pversion < cversion )); then
365 zfs create $options $ZDSET
366 return
369 encryption=$(zenity --list --title="$title" --height=320 \
370 --text="Select cipher for encryption of all labels:" \
371 --column="encryption" $(encryptionValues))
373 if [[ $? != 0 || $encryption == "off" ]]; then
374 zfs create $options $ZDSET
375 return
378 format=$(zenity --list --title="$title" \
379 --text "Select encryption key source:" \
380 --column="Key format and location" \
381 "Passphrase" "Generate Key in file")
382 [ $? != 0 ] && exit
384 if [[ $format == "Passphrase" ]]; then
385 file=$(getPassphrase)
386 if [[ $file == "" ]]; then
387 exit
389 keysource="passphrase,file://$file"
390 removefile=1;
391 elif [[ $format == "Generate Key in file" ]]; then
392 file=$(zenity --file-selection \
393 --title="$title: Location of key file" \
394 --save --confirm-overwrite)
395 [ $? != 0 ] && exit
396 if [[ $encryption == "on" ]]; then
397 keylen=128
398 else
399 t=${encryption#aes-} && keylen=${t%%-*}
401 pktool genkey keystore=file keytype=aes \
402 keylen=$keylen outkey=$file
403 keysource="raw,file:///$file"
406 options="$options -o encryption=$encryption -o keysource=$keysource"
407 zfs create $options $ZDSET
408 if (( removefile == 1 )); then
409 zfs set keysource=passphrase,prompt $ZDSET
410 rm $file
415 initialize() {
416 zonepath=$(zoneadm -z $zonename list -p|cut -d : -f4)
417 ZONE_ETC_DIR=$zonepath/root/etc
418 SYSIDCFG=${ZONE_ETC_DIR}/sysidcfg
420 if [ -f /var/ldap/ldap_client_file ] ; then
421 ldapaddress=$(ldapclient list | \
422 grep "^NS_LDAP_SERVERS" | cut -d " " -f2)
423 print "name_service=LDAP {" > ${SYSIDCFG}
424 domain=$(domainname)
425 print "domain_name=$domain" >> ${SYSIDCFG}
426 profName=$(ldapclient list | \
427 grep "^NS_LDAP_PROFILE" | cut -d " " -f2)
428 proxyPwd=$(ldapclient list | \
429 grep "^NS_LDAP_BINDPASSWD" | cut -d " " -f2)
430 proxyDN=$(ldapclient list | \
431 grep "^NS_LDAP_BINDDN" | cut -d " " -f 2)
432 if [ "$proxyDN" ] ; then
433 print "proxy_dn=\"$proxyDN\"" >> ${SYSIDCFG}
434 print "proxy_password=\"$proxyPwd\"" >> ${SYSIDCFG}
436 print "profile=$profName" >> ${SYSIDCFG}
437 print "profile_server=$ldapaddress }" >> ${SYSIDCFG}
438 cp /etc/nsswitch.conf $ZONE_ETC_DIR/nsswitch.ldap
439 else
440 print "name_service=NONE" > ${SYSIDCFG}
442 print "security_policy=NONE" >> ${SYSIDCFG}
443 locale=$(locale|grep LANG | cut -d "=" -f2)
444 if [[ -z $locale ]] ; then
445 locale="C"
447 print "system_locale=$locale" >> ${SYSIDCFG}
448 timezone=$(grep "^TZ" /etc/default/init|cut -d "=" -f2)
449 print "timezone=$timezone" >> ${SYSIDCFG}
450 print "terminal=vt100" >> ${SYSIDCFG}
451 rootpwd=$(grep "^root:" /etc/shadow|cut -d : -f2)
453 # There are two problems with setting the root password:
454 # The zone's shadow file may be read-only
455 # The password contains unparsable characters
456 # so the following line is commented out until this is resolved.
458 #print "root_password=$rootpwd" >> ${SYSIDCFG}
459 print "nfs4_domain=dynamic" >> ${SYSIDCFG}
460 print "network_interface=PRIMARY {" >> ${SYSIDCFG}
462 net=$(zonecfg -z $zonename info net)
463 ipType=$(zonecfg -z $zonename info ip-type|cut -d" " -f2)
464 if [ $ipType = exclusive ] ; then
465 hostname=$(zenity --entry \
466 --title="$title" \
467 --width=330 \
468 --text="${zonename}0: Enter Hostname or dhcp: ")
469 [ $? != 0 ] && return
471 if [ $hostname = dhcp ] ; then
472 print "dhcp" >> ${SYSIDCFG}
473 else
474 print "hostname=$hostname" >> ${SYSIDCFG}
475 ipaddr=$(getent hosts $hostname|cut -f1)
476 if [ $? != 0 ] ; then
477 ipaddr=$(zenity --entry \
478 --title="$title" \
479 --text="$nic: Enter IP address: " \
480 --entry-text a.b.c.d)
481 [ $? != 0 ] && return
483 validateIPaddr
484 if [[ -z $ipaddr ]] ; then
485 return
488 print "ip_address=$ipaddr" >> ${SYSIDCFG}
489 getNetmask
490 print "netmask=$nm" >> ${SYSIDCFG}
491 print "default_route=none" >> ${SYSIDCFG}
492 template=${zonename}_cipso
493 cidr=32
494 updateTnrhdb
496 elif [[ -n $net ]] ; then
497 hostname=$(hostname)
498 hostname=$(zenity --entry \
499 --title="$title" \
500 --width=330 \
501 --text="Enter Hostname: " \
502 --entry-text $hostname)
503 [ $? != 0 ] && return
505 print "hostname=$hostname" >> ${SYSIDCFG}
506 ipaddr=$(getent hosts $hostname|cut -f1)
507 if [ $? = 0 ] ; then
508 print "ip_address=$ipaddr" >> ${SYSIDCFG}
510 else
511 getAllZoneNICs
512 for i in ${aznics[*]} ; do
513 ipaddr=$(ifconfig $i|grep inet|cut -d " " -f2)
514 done
515 print "hostname=$(hostname)" >> ${SYSIDCFG}
516 print "ip_address=$ipaddr" >> ${SYSIDCFG}
519 print "protocol_ipv6=no }" >> ${SYSIDCFG}
520 cp /etc/default/nfs ${ZONE_ETC_DIR}/default/nfs
521 touch ${ZONE_ETC_DIR}/.NFS4inst_state.domain
524 clone() {
525 image=$1
526 if [[ -z $image ]] ; then
527 msg_clone=$(gettext "Clone the $zonename zone using a
528 snapshot of one of the following halted zones:")
529 image=$(zenity --list \
530 --title="$title" \
531 --text="$msg_clone" \
532 --height=300 \
533 --width=330 \
534 --column="Installed Zones" ${zonelist[*]})
537 if [[ -n $image ]] ; then
538 removeZoneBEs
539 zoneadm -z $zonename clone $image
541 if [ $NSCD_PER_LABEL = 0 ] ; then
542 sharePasswd $zonename
543 else
544 unsharePasswd $zonename
547 ipType=$(zonecfg -z $zonename info ip-type|cut -d" " -f2)
548 if [ $ipType = exclusive ] ; then
549 zoneadm -z $zonename ready
550 zonepath=$(zoneadm -z $zonename list -p|cut -d : -f4)
551 sys-unconfig -R $zonepath/root 2>/dev/null
552 initialize
553 zoneadm -z $zonename halt
558 install() {
559 removeZoneBEs
560 if [ $DISP -eq 0 ] ; then
561 gettext "installing zone $zonename ...\n"
562 zoneadm -z $zonename install
563 else
564 # sleep is needed here to avoid occasional timing
565 # problem with gnome-terminal display...
566 sleep 2
567 gnome-terminal \
568 --title="$title: Installing $zonename zone" \
569 --command "zoneadm -z $zonename install" \
570 --disable-factory \
571 --hide-menubar
574 zonestate=$(zoneadm -z $zonename list -p | cut -d : -f 3)
575 if [ $zonestate != installed ] ; then
576 gettext "error installing zone $zonename.\n"
577 return 1
580 if [ $NSCD_PER_LABEL = 0 ] ; then
581 sharePasswd $zonename
582 else
583 unsharePasswd $zonename
586 zoneadm -z $zonename ready
587 zonestate=$(zoneadm -z $zonename list -p | cut -d : -f 3)
588 if [ $zonestate != ready ] ; then
589 gettext "error making zone $zonename ready.\n"
590 return 1
593 initialize
594 zoneadm -z $zonename halt
597 delete() {
598 delopt=$*
600 # if there is an entry for this zone in tnzonecfg, remove it
601 # before deleting the zone.
603 tnzone=$(grep "^$zonename:" $TNZONECFG 2>/dev/null)
604 if [ -n "${tnzone}" ] ; then
605 sed -e "/^$zonename:/d" $TNZONECFG > \
606 $TXTMP/tnzonefg.$$ 2>/dev/null
607 mv $TXTMP/tnzonefg.$$ $TNZONECFG
610 for tnzone in $(grep ":${zonename}_unlab" $TNRHDB 2>/dev/null) ; do
611 tnctl -dh "$tnzone"
612 sed -e "/:${zonename}_unlab/d" $TNRHDB > \
613 $TXTMP/tnrhdb.$$ 2>/dev/null
614 mv $TXTMP/tnrhdb.$$ $TNRHDB
615 done
617 for tnzone in $(grep "^${zonename}_unlab:" $TNRHTP 2>/dev/null) ; do
618 tnctl -dt ${zonename}_unlab
619 sed -e "/^${zonename}_unlab:/d" $TNRHTP > \
620 $TXTMP/tnrhtp.$$ 2>/dev/null
621 mv $TXTMP/tnrhtp.$$ $TNRHTP
622 done
624 for tnzone in $(grep ":${zonename}_cipso" $TNRHDB 2>/dev/null) ; do
625 tnctl -dh "$tnzone"
626 sed -e "/:${zonename}_cipso/d" $TNRHDB > \
627 $TXTMP/tnrhdb.$$ 2>/dev/null
628 mv $TXTMP/tnrhdb.$$ $TNRHDB
629 done
631 for tnzone in $(grep "^${zonename}_cipso:" $TNRHTP 2>/dev/null) ; do
632 tnctl -dt ${zonename}_cipso
633 sed -e "/^${zonename}_cipso:/d" $TNRHTP > \
634 $TXTMP/tnrhtp.$$ 2>/dev/null
635 mv $TXTMP/tnrhtp.$$ $TNRHTP
636 done
638 zonecfg -z $zonename delete -F
640 removeZoneBEs $delopt
641 for snap in $(zfs list -Ho name -t snapshot|grep "\@${zonename}_snap") ; do
642 zfs destroy -R $snap
643 done
646 validateIPaddr () {
647 OLDIFS=$IFS
648 IFS=.
649 integer octet_cnt=0
650 integer dummy
651 set -A octets $ipaddr
652 IFS=$OLDIFS
653 if [ ${#octets[*]} == 4 ] ; then
654 while (( octet_cnt < ${#octets[*]} )); do
655 dummy=${octets[octet_cnt]}
656 if [ $dummy = ${octets[octet_cnt]} ] ; then
657 if (( dummy >= 0 && \
658 dummy < 256 )) ; then
659 octet_cnt+=1
660 continue
662 else
663 x=$(zenity --error \
664 --title="$title" \
665 --text="$ipaddr $msg_badip")
666 ipaddr=
667 return
669 done
670 else
671 x=$(zenity --error \
672 --title="$title" \
673 --text="$ipaddr $msg_badip")
674 ipaddr=
678 getAllZoneNICs(){
679 integer count=0
680 for i in $(ifconfig -a4|grep "^[a-z].*:")
682 print "$i" |grep "^[a-z].*:" >/dev/null 2>&1
683 [ $? -eq 1 ] && continue
685 i=${i%:} # Remove colon after interface name
686 for j in $(ifconfig $i)
688 case $j in
689 all-zones)
690 aznics[count]=$i
691 count+=1
693 esac
694 done
695 done
698 getNetmask() {
699 cidr=
700 nm=$(zenity --entry \
701 --title="$title" \
702 --width=330 \
703 --text="$ipaddr: Enter netmask: " \
704 --entry-text 255.255.255.0)
705 [ $? != 0 ] && return;
707 cidr=$(perl -e 'use Socket; print unpack("%32b*",inet_aton($ARGV[0])), "\n";' $nm)
710 addNet() {
711 getIPaddr
712 if [[ -z $ipaddr ]] ; then
713 return;
715 getNetmask
716 if [[ -z $cidr ]] ; then
717 return;
719 zonecfg -z $zonename "add net; \
720 set address=${ipaddr}/${cidr}; \
721 set physical=$nic; \
722 end"
723 template=${zonename}_cipso
724 cidr=32
725 updateTnrhdb
728 getAttrs() {
729 zone=global
730 type=ignore
731 for j in $(ifconfig $nic)
733 case $j in
734 inet) type=$j;;
735 zone) type=$j;;
736 all-zones) zone=all-zones;;
737 flags*) flags=$j;;
738 *) case $type in
739 inet) ipaddr=$j ;;
740 zone) zone=$j ;;
741 *) continue ;;
742 esac;
743 type=ignore;;
744 esac
745 done
746 if [[ $flags == ~(E).UP, ]] ; then
747 updown=Up
748 else
749 updown=Down
751 if [[ $nic == ~(E).: ]] ; then
752 linktype=logical
753 else
754 vnic=$(dladm show-vnic -po link $nic 2>/dev/null)
755 if [[ -n $vnic ]] ; then
756 linktype=virtual
757 else
758 linktype=physical
761 if [ $ipaddr != 0.0.0.0 ] ; then
762 x=$(grep "^${ipaddr}[^0-9]" $TNRHDB)
763 if [ $? = 1 ] ; then
764 template=cipso
765 cidr=32
766 updateTnrhdb
767 else
768 template=$(print "$x"|cut -d : -f2)
770 else
771 template="..."
772 ipaddr="..."
775 deleteTnrhdbEntry() {
776 remote=$(grep "^${ipaddr}[^0-9]" $TNRHDB)
777 if [ $? = 0 ] ; then
778 ip=$(print $remote|cut -d "/" -f1)
779 if [[ $remote == ~(E)./ ]] ; then
780 pr=$(print $remote|cut -d "/" -f2)
781 remote="$ip\\/$pr"
783 sed -e "/^${remote}/d" $TNRHDB > /tmp/tnrhdb.$$ 2>/dev/null
784 mv /tmp/tnrhdb.$$ $TNRHDB
788 updateTnrhdb() {
789 deleteTnrhdbEntry
790 if [[ -n $cidr ]] ; then
791 print "${ipaddr}/$cidr:$template" >> $TNRHDB
792 tnctl -h ${ipaddr}/$cidr:$template
793 else
794 print "${ipaddr}:$template" >> $TNRHDB
795 tnctl -h ${ipaddr}:$template
799 getIPaddr() {
800 hostname=$(zenity --entry \
801 --title="$title" \
802 --width=330 \
803 --text="$nic: Enter Hostname: ")
805 [ $? != 0 ] && return
807 ipaddr=$(getent hosts $hostname|cut -f1)
808 if [[ -z $ipaddr ]] ; then
809 ipaddr=$(zenity --entry \
810 --title="$title" \
811 --text="$nic: Enter IP address: " \
812 --entry-text a.b.c.d)
813 [ $? != 0 ] && return
814 validateIPaddr
819 addHost() {
820 # Update hosts
821 if [[ -z $ipaddr ]] ; then
822 return;
824 grep "^${ipaddr}[^0-9]" /etc/inet/hosts >/dev/null
825 if [ $? -eq 1 ] ; then
826 print "$ipaddr\t$hostname" >> /etc/inet/hosts
829 template=cipso
830 cidr=32
831 updateTnrhdb
833 ifconfig $nic $ipaddr netmask + broadcast +
835 # TODO: better integration with nwam
836 # TODO: get/set netmask for IP address
838 print $hostname > /etc/hostname.$nic
841 createInterface() {
842 msg=$(ifconfig $nic addif 0.0.0.0)
843 $(zenity --info \
844 --title="$title" \
845 --text="$msg" )
846 nic=$(print "$msg"|cut -d" " -f5)
850 createVNIC() {
851 if [ $zonename != global ] ; then
852 vnicname=${zonename}0
853 else
854 vnicname=$(zenity --entry \
855 --title="$title" \
856 --width=330 \
857 --entry-text="" \
858 --text="Enter VNIC Name: ")
860 if [[ ! -n $vnicname ]] ; then
861 return
864 x=$(dladm show-vnic|grep "^$vnicname " )
865 if [[ ! -n $x ]] ; then
866 dladm create-vnic -l $nic $vnicname
868 if [ $zonename = global ] ; then
869 ifconfig $vnicname plumb
870 else
871 zonecfg -z $zonename "add net; \
872 set physical=$vnicname; \
873 end"
875 nic=$vnicname
878 shareInterface() {
880 # TODO: better integration with nwam
882 ifconfig $nic all-zones;\
883 if_file=/etc/hostname.$nic
884 sed q | sed -e "s/$/ all-zones/" < $if_file >$TXTMP/txnetmgr.$$
885 mv $TXTMP/txnetmgr.$$ $if_file
888 unshareInterface() {
890 # TODO: better integration with nwam
892 ifconfig $nic -zone;\
893 if_file=/etc/hostname.$nic
894 sed q | sed -e "s/all-zones/ /" < $if_file >$TXTMP/txnetmgr.$$
895 mv $TXTMP/txnetmgr.$$ $if_file
898 addTnrhdb() {
899 ipaddr=$(zenity --entry \
900 --title="$title" \
901 --width=330 \
902 --text="Zone:$zonename. Enter IP address of remote host or network: " \
903 --entry-text a.b.c.d)
904 [ $? != 0 ] && return
905 validateIPaddr
906 if [[ -z $ipaddr ]] ; then
907 return;
909 if [ ${octets[3]} = 0 ] ; then
910 nic="$ipaddr"
911 getNetmask
912 if [[ -z $cidr ]] ; then
913 return;
915 else
916 cidr=32
918 print "${ipaddr}/$cidr:$template" > $TXTMP/tnrhdb_new.$$
919 x=$(tnchkdb -h $TXTMP/tnrhdb_new.$$ 2>$TXTMP/syntax_error.$$)
920 if [ $? = 0 ] ; then
921 updateTnrhdb
922 else
923 syntax=$(cat $TXTMP/syntax_error.$$)
924 x=$(zenity --error \
925 --title="$title" \
926 --text="$syntax")
928 rm $TXTMP/tnrhdb_new.$$
929 rm $TXTMP/syntax_error.$$
932 removeTnrhdb() {
933 while (( 1 )) do
934 remotes=$(grep "^[^#][0-9.]" $TNRHDB|grep ":$template"|cut -d : -f1-2|tr : " ")
935 if [ $template = cipso ] ; then
936 templateHeading="from All Zones":
937 else
938 templateHeading="from this Zone":
940 if [[ -n $remotes ]] ; then
941 ipaddr=$(zenity --list \
942 --title="$title" \
943 --text="$msg_getremote" \
944 --height=250 \
945 --width=300 \
946 --column="Remove Access to:" \
947 --column="$templateHeading" \
948 $remotes)
950 if [[ -n $ipaddr ]] ; then
951 deleteTnrhdbEntry
952 tnctl -dh ${ip}:$template
953 else
954 return
956 else
957 return
959 done
962 setMLPs() {
963 tnzone=$(grep "^$zonename:" $TNZONECFG 2>/dev/null)
964 zoneMLPs=:$(print "$tnzone"|cut -d : -f4)
965 sharedMLPs=:$(print "$tnzone"|cut -d : -f5)
966 attrs="Private Interfaces$zoneMLPs\nShared Interfaces$sharedMLPs"
967 ports=$(print "$attrs"|zenity --list \
968 --title="$title" \
969 --height=200 \
970 --width=450 \
971 --text="Zone: $zonename\nClick once to select, twice to edit.\nShift-click to select both rows." \
972 --column="Multilevel Ports (example: 80-81/tcp;111/udp;)" \
973 --editable \
974 --multiple
977 if [[ -z $ports ]] ; then
978 return
981 # getopts needs another a blank and another dash
982 ports=--$(print "$ports"|sed 's/ //g'|sed 's/|/ --/g'|sed 's/Interfaces:/ :/g')
984 OPTIND=1
985 while getopts "z:(Private)s:(Shared)" opt $ports ; do
986 case $opt in
987 z) zoneMLPs=$OPTARG ;;
988 s) sharedMLPs=$OPTARG ;;
989 esac
990 done
992 sed -e "/^$zonename:*/d" $TNZONECFG > $TXTMP/tnzonecfg.$$ 2>/dev/null
993 tnzone=$(print "$tnzone"|cut -d : -f1-3)
994 echo "${tnzone}${zoneMLPs}${sharedMLPs}" >> $TXTMP/tnzonecfg.$$
996 x=$(tnchkdb -z $TXTMP/tnzonecfg.$$ 2>$TXTMP/syntax_error.$$)
998 if [ $? = 0 ] ; then
999 mv $TXTMP/tnzonecfg.$$ $TNZONECFG
1000 zenity --info \
1001 --title="$title" \
1002 --text="Multilevel ports for the $zonename zone\nwill be interpreted on next reboot."
1003 if [ $zonename != global ] ; then
1004 getLabelRange
1006 else
1007 syntax=$(cat $TXTMP/syntax_error.$$)
1008 x=$(zenity --error \
1009 --title="$title" \
1010 --text="$syntax")
1011 rm $TXTMP/tnzonecfg.$$
1013 rm $TXTMP/syntax_error.$$
1016 enableAuthentication() {
1017 integer file_cnt=0
1019 zonepath=$(zoneadm -z $1 list -p|cut -d : -f4)
1020 ZONE_ETC_DIR=$zonepath/root/etc
1022 # If the zone's shadow file was previously read-only
1023 # there may be no root password entry for this zone.
1024 # If so, replace the root password entry with the global zone's.
1026 entry=$(grep ^root:: $ZONE_ETC_DIR/shadow)
1027 if [ $? -eq 0 ] ; then
1028 grep ^root: /etc/shadow > $TXTMP/shadow.$$
1029 sed -e "/^root::/d" $ZONE_ETC_DIR/shadow >> \
1030 $TXTMP/shadow.$$ 2>/dev/null
1031 mv $TXTMP/shadow.$$ $ZONE_ETC_DIR/shadow
1032 chmod 400 $ZONE_ETC_DIR/shadow
1035 if [ $LOGNAME = "root" ]; then
1036 return
1039 file[0]="passwd"
1040 file[1]="shadow"
1041 file[2]="user_attr"
1043 # Add the user who assumed the root role to each installed zone
1045 while (( file_cnt < ${#file[*]} )); do
1046 exists=$(grep "^${LOGNAME}:" \
1047 $ZONE_ETC_DIR/${file[file_cnt]} >/dev/null)
1048 if [ $? -ne 0 ] ; then
1049 entry=$(grep "^${LOGNAME}:" \
1050 /etc/${file[file_cnt]})
1051 if [ $? -eq 0 ] ; then
1052 print "$entry" >> \
1053 $ZONE_ETC_DIR/${file[file_cnt]}
1056 file_cnt+=1
1057 done
1058 chmod 400 $ZONE_ETC_DIR/shadow
1061 unsharePasswd() {
1062 zonecfg -z $1 remove fs dir=/etc/passwd >/dev/null 2>&1 | grep -v such
1063 zonecfg -z $1 remove fs dir=/etc/shadow >/dev/null 2>&1 | grep -v such
1064 zoneadm -z $1 ready >/dev/null 2>&1
1065 if [ $? -eq 0 ] ; then
1066 enableAuthentication $1
1067 zoneadm -z $1 halt >/dev/null 2>&1
1068 else
1069 echo Skipping $1
1073 sharePasswd() {
1074 passwd=$(zonecfg -z $1 info|grep /etc/passwd)
1075 if [ $? -eq 1 ] ; then
1076 zonecfg -z $1 "add fs; \
1077 set special=/etc/passwd; \
1078 set dir=/etc/passwd; \
1079 set type=lofs; \
1080 add options ro; \
1081 end; \
1082 add fs; \
1083 set special=/etc/shadow; \
1084 set dir=/etc/shadow; \
1085 set type=lofs; \
1086 add options ro; \
1087 end"
1089 zoneadm -z $1 halt >/dev/null 2>&1
1092 # This routine is a toggle -- if we find it configured for global nscd,
1093 # change to nscd-per-label and vice-versa.
1095 # The user was presented with only the choice to CHANGE the existing
1096 # configuration.
1098 manageNscd() {
1099 if [ $NSCD_PER_LABEL -eq 0 ] ; then
1100 # this MUST be a regular file for svc-nscd to detect
1101 touch $NSCD_INDICATOR
1102 NSCD_OPT="Unconfigure per-zone name service"
1103 NSCD_PER_LABEL=1
1104 for i in $(zoneadm list -i | grep -v global) ; do
1105 zoneadm -z $i halt >/dev/null 2>&1
1106 unsharePasswd $i
1107 done
1108 else
1109 rm -f $NSCD_INDICATOR
1110 NSCD_OPT="Configure per-zone name service"
1111 NSCD_PER_LABEL=0
1112 for i in $(zoneadm list -i | grep -v global) ; do
1113 zoneadm -z $i halt >/dev/null 2>&1
1114 sharePasswd $i
1115 done
1119 manageZoneNets () {
1120 ncmds[0]="Only use all-zones interfaces"
1121 ncmds[1]="Add a logical interface"
1122 ncmds[2]="Add a virtual interface (VNIC)"
1124 stacks[0]="Shared Stack"
1125 stacks[1]="Exclusive Stack"
1127 getAllZoneNICs
1128 netOps[0]="1\n${ncmds[0]}\nShared Stack\n${aznics[*]}"
1130 integer nic_cnt=0
1131 integer netOp_cnt=2
1133 set -A nics $(dladm show-phys|grep -v LINK|cut -f1 -d " ")
1135 while (( nic_cnt < ${#nics[*]} )); do
1136 netOps[netOp_cnt - 1]="\n$netOp_cnt\n${ncmds[1]}\n${stacks[0]}\n${nics[nic_cnt]}"
1137 netOp_cnt+=1
1138 netOps[netOp_cnt - 1]="\n$netOp_cnt\n${ncmds[2]}\n${stacks[1]}\n${nics[nic_cnt]}"
1139 netOp_cnt+=1
1140 nic_cnt+=1
1141 done
1143 netOp=$(print "${netOps[*]}"|zenity --list \
1144 --title="$title" \
1145 --text="$msg_getnet $zonename zone:" \
1146 --height=300 \
1147 --width=500 \
1148 --column="#" \
1149 --column="Network Configuration " \
1150 --column="IP Type" \
1151 --column="Available Interfaces" \
1152 --hide-column=1
1155 # User picked cancel or no selection
1156 if [[ -z $netOp ]] ; then
1157 return
1160 # All-zones is the default, so just return
1161 if [ $netOp = 1 ] ; then
1162 return
1165 cmd=$(print "${netOps[$netOp - 1]}"|tr '\n' ';' |cut -d';' -f 3)
1166 nic=$(print "${netOps[$netOp - 1]}"|tr '\n' ';' |cut -d';' -f 5)
1167 case $cmd in
1168 ${ncmds[1]} )
1169 addNet;
1171 ${ncmds[2]} )
1172 zonecfg -z $zonename set ip-type=exclusive
1173 createVNIC
1175 esac
1178 manageInterface () {
1179 while (( 1 )) do
1180 getAttrs
1182 # Clear list of commands
1184 share=
1185 setipaddr=
1186 newlogical=
1187 newvnic=
1188 unplumb=
1189 bringup=
1190 bringdown=
1192 if [ $updown = Down ] ; then
1193 bringup="Bring Up\n"
1194 else
1195 bringdown="Bring Down\n"
1198 case $linktype in
1199 physical )
1200 newlogical="Create Logical Interface...\n";
1201 newvnic="Create Virtual Interface (VNIC)...\n";
1203 logical )
1204 unplumb="Remove Logical Interface\n"
1206 virtual )
1207 newlogical="Create Logical Interface...\n";
1208 unplumb="Remove Virtual Interface\n" ;
1210 esac
1212 if [ $ipaddr = "..." ] ; then
1213 setipaddr="Set IP address...\n"
1214 elif [ $zone != all-zones ] ; then
1215 share="Share with Shared-IP Zones\n"
1216 else
1217 share="Remove from Shared-IP Zones\n"
1220 command=$(print ""\
1221 $share \
1222 $setipaddr \
1223 $newlogical \
1224 $newvnic \
1225 $unplumb \
1226 $bringup \
1227 $bringdown \
1228 | zenity --list \
1229 --title="$title" \
1230 --text="Select a command from the list below:" \
1231 --height=300 \
1232 --column "Interface: $nic" )
1234 case $command in
1235 " Create Logical Interface...")
1236 createInterface;;
1237 " Create Virtual Interface (VNIC)...")
1238 createVNIC ;;
1239 " Set IP address...")
1240 getIPaddr
1241 addHost;;
1242 " Share with Shared-IP Zones")
1243 shareInterface;;
1244 " Remove from Shared-IP Zones")
1245 unshareInterface;;
1246 " Remove Logical Interface")
1247 ifconfig $nic unplumb
1248 rm -f /etc/hostname.$nic
1249 return;;
1250 " Remove Virtual Interface")
1251 ifconfig $nic unplumb
1252 dladm delete-vnic $nic
1253 rm -f /etc/hostname.$nic
1254 return;;
1255 " Bring Up")
1256 ifconfig $nic up;;
1257 " Bring Down")
1258 ifconfig $nic down;;
1259 *) return;;
1260 esac
1261 done
1264 sharePrimaryNic() {
1265 set -A ip $(getent hosts $(cat /etc/nodename))
1266 for i in $(ifconfig -au4|grep "^[a-z].*:" |grep -v LOOPBACK)
1268 print "$i" |grep "^[a-z].*:" >/dev/null 2>&1
1269 [ $? -eq 1 ] && continue
1271 nic=${i%:} # Remove colon after interface name
1272 getAttrs
1273 if [ ${ip[0]} = $ipaddr ]; then
1274 shareInterface
1275 break
1277 done
1280 manageNets() {
1281 while (( 1 )) do
1282 attrs=
1283 for i in $(ifconfig -a4|grep "^[a-z].*:" |grep -v LOOPBACK)
1285 print "$i" |grep "^[a-z].*:" >/dev/null 2>&1
1286 [ $? -eq 1 ] && continue
1288 nic=${i%:} # Remove colon after interface name
1289 getAttrs
1290 attrs="$nic $linktype $zone $ipaddr $template $updown $attrs"
1291 done
1293 nic=$(zenity --list \
1294 --title="$title" \
1295 --text="Select an interface from the list below:" \
1296 --height=300 \
1297 --width=500 \
1298 --column="Interface" \
1299 --column="Type" \
1300 --column="Zone Name" \
1301 --column="IP Address" \
1302 --column="Template" \
1303 --column="State" \
1304 $attrs)
1306 if [[ -z $nic ]] ; then
1307 return
1309 manageInterface
1310 done
1313 createLDAPclient() {
1314 ldaptitle="$title: Create LDAP Client"
1315 ldapdomain=$(zenity --entry \
1316 --width=400 \
1317 --title="$ldaptitle" \
1318 --text="Enter Domain Name: ")
1319 if [[ -n $ldapdomain ]] ; then
1320 ldapserver=$(zenity --entry \
1321 --width=400 \
1322 --title="$ldaptitle" \
1323 --text="Enter Hostname of LDAP Server: ")
1324 else
1325 return
1327 if [[ -n $ldapserver ]] ; then
1328 ldapserveraddr=$(zenity --entry \
1329 --width=400 \
1330 --title="$ldaptitle" \
1331 --text="Enter IP adddress of LDAP Server $ldapserver: ")
1332 else
1333 return
1335 ldappassword=""
1336 while [[ -z ${ldappassword} || "x$ldappassword" != "x$ldappasswordconfirm" ]] ; do
1337 ldappassword=$(zenity --entry \
1338 --width=400 \
1339 --title="$ldaptitle" \
1340 --hide-text \
1341 --text="Enter LDAP Proxy Password:")
1342 ldappasswordconfirm=$(zenity --entry \
1343 --width=400 \
1344 --title="$ldaptitle" \
1345 --hide-text \
1346 --text="Confirm LDAP Proxy Password:")
1347 done
1348 ldapprofile=$(zenity --entry \
1349 --width=400 \
1350 --title="$ldaptitle" \
1351 --text="Enter LDAP Profile Name: ")
1352 whatnext=$(zenity --list \
1353 --width=400 \
1354 --height=250 \
1355 --title="$ldaptitle" \
1356 --text="Proceed to create LDAP Client?" \
1357 --column=Parameter --column=Value \
1358 "Domain Name" "$ldapdomain" \
1359 "Hostname" "$ldapserver" \
1360 "IP Address" "$ldapserveraddr" \
1361 "Password" "$(print "$ldappassword" | sed 's/./*/g')" \
1362 "Profile" "$ldapprofile")
1363 [ $? != 0 ] && return
1365 grep "^${ldapserveraddr}[^0-9]" /etc/hosts > /dev/null
1366 if [ $? -eq 1 ] ; then
1367 print "$ldapserveraddr $ldapserver" >> /etc/hosts
1370 grep "${ldapserver}:" $TNRHDB > /dev/null
1371 if [ $? -eq 1 ] ; then
1372 print "# ${ldapserver} - ldap server" \
1373 >> $TNRHDB
1374 print "${ldapserveraddr}:cipso" \
1375 >> $TNRHDB
1376 tnctl -h "${ldapserveraddr}:cipso"
1379 proxyDN=$(print $ldapdomain|awk -F"." \
1380 "{ ORS = \"\" } { for (i = 1; i < NF; i++) print \"dc=\"\\\$i\",\" }{ print \"dc=\"\\\$NF }")
1382 zenity --info \
1383 --title="$ldaptitle" \
1384 --width=500 \
1385 --text="global zone will be LDAP client of $ldapserver"
1387 ldapout=$TXTMP/ldapclient.$$
1389 ldapclient init -a profileName="$ldapprofile" \
1390 -a domainName="$ldapdomain" \
1391 -a proxyDN"=cn=proxyagent,ou=profile,$proxyDN" \
1392 -a proxyPassword="$ldappassword" \
1393 "$ldapserveraddr" >$ldapout 2>&1
1395 if [ $? -eq 0 ] ; then
1396 ldapstatus=Success
1397 else
1398 ldapstatus=Error
1401 zenity --text-info \
1402 --width=700 \
1403 --height=300 \
1404 --title="$ldaptitle: $ldapstatus" \
1405 --filename=$ldapout
1407 rm -f $ldapout
1412 tearDownZones() {
1413 if [ $DISP -eq 0 ] ; then
1414 if [ $FORCE -eq 0 ] ; then
1415 gettext "OK to destroy all zones [y|N]? "
1416 read ans
1417 printf "%s\n" "$ans" \
1418 | /usr/xpg4/bin/grep -Eq "$(locale yesexpr)"
1419 if [ $? -ne 0 ] ; then
1420 gettext "canceled.\n"
1421 return 1
1424 gettext "destroying all zones ...\n"
1425 else
1426 killall=$(zenity --question \
1427 --title="$title" \
1428 --width=330 \
1429 --text="$msg_confirmkill")
1430 if [[ $? != 0 ]]; then
1431 return
1435 for p in $(zoneadm list -cp|grep -v global:) ; do
1436 zonename=$(echo "$p"|cut -d : -f2)
1437 if [ $DISP -eq 0 ] ; then
1438 gettext "destroying zone $zonename ...\n"
1440 zoneadm -z $zonename halt 1>/dev/null 2>&1
1441 zoneadm -z $zonename uninstall -F 1>/dev/null 2>&1
1442 delete -rRf
1443 done
1444 zonename=global
1447 createDefaultZones() {
1448 # If GUI display is not used, skip the dialog
1449 if [ $DISP -eq 0 ] ; then
1450 createDefaultPublic
1451 if [ $? -ne 0 ] ; then
1452 return 1
1454 createDefaultInternal
1455 return
1458 msg_choose1=$(gettext "Choose one:")
1459 defpub=$(gettext "$PUBZONE zone only")
1460 defboth=$(gettext "$PUBZONE and $INTZONE zones")
1461 defskip=$(gettext "Main Menu...")
1462 command=$(echo ""\
1463 "$defpub\n" \
1464 "$defboth\n" \
1465 "$defskip\n" \
1466 | zenity --list \
1467 --title="$title" \
1468 --text="$msg_defzones" \
1469 --column="$msg_choose1" \
1470 --height=400 \
1471 --width=330 )
1473 case $command in
1474 " $defpub")
1475 createDefaultPublic ;;
1477 " $defboth")
1478 createDefaultPublic
1479 if [ $? -ne 0 ] ; then
1480 return 1
1482 createDefaultInternal ;;
1485 return;;
1486 esac
1489 createDefaultPublic() {
1490 zonename=$PUBZONE
1491 if [ $DISP -eq 0 ] ; then
1492 gettext "creating default $zonename zone ...\n"
1494 newZone
1495 zone_cnt+=1
1496 hexlabel=$DEFAULTLABEL
1497 setTNdata
1498 sharePrimaryNic
1500 install
1501 if [ $? -ne 0 ] ; then
1502 return 1
1505 if [ $DISP -eq 0 ] ; then
1506 gettext "booting zone $zonename ...\n"
1507 zoneadm -z $zonename boot
1508 else
1509 zoneadm -z $zonename boot &
1510 gnome-terminal \
1511 --disable-factory \
1512 --title="Zone Console: $zonename $msg_continue" \
1513 --command "zlogin -C $zonename"
1517 createDefaultInternal() {
1518 zoneadm -z $PUBZONE halt
1520 zonename=snapshot
1521 newZone
1522 zone_cnt+=1
1523 zonecfg -z $zonename set autoboot=false
1525 clone $PUBZONE
1526 zoneadm -z $PUBZONE boot &
1528 zonename=$INTZONE
1529 if [ $DISP -eq 0 ] ; then
1530 gettext "creating default $zonename zone ...\n"
1532 newZone
1533 zone_cnt+=1
1535 hexlabel=$INTLABEL
1536 x=$(grep -i :{$hexlabel}: $TNZONECFG)
1537 if [ $? = 0 ] ; then
1538 z=$(print $x|cut -d : -f1)
1539 echo "$msg_inuse $z zone."
1540 else
1541 setTNdata
1544 clone snapshot
1545 if [ $DISP -eq 0 ] ; then
1546 gettext "booting zone $zonename ...\n"
1547 else
1548 gnome-terminal \
1549 --title="Zone Console: $zonename" \
1550 --command "zlogin -C $zonename" &
1552 zoneadm -z $zonename boot &
1555 selectZone() {
1556 set -A zonelist "global\nrunning\nADMIN_HIGH"
1557 integer zone_cnt=1
1559 for p in $(zoneadm list -cp|grep -v global:) ; do
1560 zone_cnt+=1
1561 done
1562 if [ $zone_cnt == 1 ] ; then
1563 createDefaultZones
1565 if [ $zone_cnt == 1 ] ; then
1566 zonename=global
1567 singleZone
1568 return
1571 zone_cnt=1
1572 for p in $(zoneadm list -cp|grep -v global:) ; do
1573 zonename=$(echo "$p"|cut -d : -f2)
1574 state=$(echo "$p"|cut -d : -f3)
1575 hexlabel=$(grep "^$zonename:" $TNZONECFG|cut -d : -f2)
1576 if [[ $hexlabel ]] ; then
1577 curlabel=$(hextoalabel $hexlabel)
1578 else
1579 curlabel=...
1581 zonelist[zone_cnt]="\n$zonename\n$state\n$curlabel"
1582 zone_cnt+=1
1583 done
1584 zonename=$(print "${zonelist[*]}"|zenity --list \
1585 --title="$title" \
1586 --text="$msg_getzone" \
1587 --height=300 \
1588 --width=500 \
1589 --column="Zone Name" \
1590 --column="Status" \
1591 --column="Sensitivity Label" \
1594 # if the menu choice was a zonename, pop up zone menu
1595 if [[ -n $zonename ]] ; then
1596 singleZone
1597 else
1598 exit
1602 # Loop for single-zone menu
1603 singleZone() {
1605 while (( 1 )) do
1606 # Clear list of commands
1608 console=
1609 label=
1610 start=
1611 reboot=
1612 stop=
1613 clone=
1614 install=
1615 ready=
1616 uninstall=
1617 autoboot=
1618 delete=
1619 deletenet=
1620 permitrelabel=
1622 if [ $zone_cnt -gt 1 ] ; then
1623 killZones="Destroy all zones...\n"
1624 xit="Select another zone..."
1625 else
1626 killZones=
1627 xit="Exit"
1629 if [ $zonename = global ] ; then
1630 ldapClient="Create LDAP Client...\n"
1631 nscdOpt="$NSCD_OPT\n"
1632 createZone="Create a new zone...\n"
1633 addnet="Configure Network Interfaces...\n"
1634 else
1635 ldapClient=
1636 nscdOpt=
1637 createZone=
1638 addnet=
1639 killZones=
1642 zonestate=$(zoneadm -z $zonename list -p | cut -d : -f 3)
1644 consoleCheck;
1645 labelCheck;
1646 delay=0
1648 if [ $zonename != global ] ; then
1649 case $zonestate in
1650 running)
1651 ready="Ready\n"
1652 reboot="Reboot\n"
1653 stop="Halt\n"
1655 ready)
1656 start="Boot\n"
1657 stop="Halt\n"
1659 installed)
1660 if [[ -z $label ]] ; then
1661 ready="Ready\n"
1662 start="Boot\n"
1664 uninstall="Uninstall\n"
1665 relabelCheck
1666 autobootCheck
1668 configured)
1669 install="Install...\n"
1670 cloneCheck
1671 delete="Delete\n"
1672 console=
1674 incomplete)
1675 uninstall="Uninstall\n"
1679 esac
1682 command=$(echo ""\
1683 $createZone \
1684 $console \
1685 $label \
1686 $start \
1687 $reboot \
1688 $stop \
1689 $clone \
1690 $install \
1691 $ready \
1692 $uninstall \
1693 $delete \
1694 $addnet \
1695 $deletenet \
1696 $addremotehost \
1697 $addcipsohost \
1698 $removeremotehost \
1699 $removecipsohost \
1700 $setmlps \
1701 $permitrelabel \
1702 $autoboot \
1703 $ldapClient \
1704 $nscdOpt \
1705 $killZones \
1706 $xit \
1707 | zenity --list \
1708 --title="$title" \
1709 --text="$msg_getcmd" \
1710 --height=400 \
1711 --width=330 \
1712 --column "Zone: $zonename Status: $zonestate" )
1714 case $command in
1715 " Create a new zone...")
1716 zonename=
1717 newZone ;;
1719 " Zone Console...")
1720 delay=2
1721 gnome-terminal \
1722 --title="Zone Console: $zonename" \
1723 --command "zlogin -C $zonename" & ;;
1725 " Select Label...")
1726 selectLabel;;
1728 " Ready")
1729 zoneadm -z $zonename ready ;;
1731 " Boot")
1732 zoneadm -z $zonename boot ;;
1734 " Halt")
1735 zoneadm -z $zonename halt ;;
1737 " Reboot")
1738 zoneadm -z $zonename reboot ;;
1740 " Install...")
1741 install;;
1743 " Clone...")
1744 clone ;;
1746 " Uninstall")
1747 zoneadm -z $zonename uninstall -F;;
1749 " Delete")
1750 delete
1751 return ;;
1753 " Configure Network Interfaces...")
1754 if [ $zonename = global ] ; then
1755 manageNets
1756 else
1757 manageZoneNets
1758 fi;;
1760 " Add Single-level Access to Remote Host...")
1761 addTnrhdb ;;
1763 " Add Multilevel Access to Remote Host...")
1764 template=cipso
1765 addTnrhdb ;;
1767 " Remove Single-level Access to Remote Host...")
1768 removeTnrhdb ;;
1770 " Remove Multilevel Access to Remote Host...")
1771 template=cipso
1772 removeTnrhdb ;;
1774 " Configure Multilevel Ports...")
1775 setMLPs;;
1777 " Permit Relabeling")
1778 zonecfg -z $zonename set limitpriv=default,\
1779 win_mac_read,win_mac_write,win_selection,win_dac_read,win_dac_write,\
1780 file_downgrade_sl,file_upgrade_sl,sys_trans_label ;;
1782 " Deny Relabeling")
1783 zonecfg -z $zonename set limitpriv=default ;;
1785 " Set Automatic Booting")
1786 zonecfg -z $zonename set autoboot=true ;;
1788 " Set Manual Booting")
1789 zonecfg -z $zonename set autoboot=false ;;
1791 " Create LDAP Client...")
1792 createLDAPclient ;;
1794 " Configure per-zone name service")
1795 manageNscd ;;
1797 " Unconfigure per-zone name service")
1798 manageNscd ;;
1800 " Destroy all zones...")
1801 tearDownZones
1802 return ;;
1805 if [ $zone_cnt == 1 ] ; then
1806 exit
1807 else
1808 return
1809 fi;;
1810 esac
1811 sleep $delay;
1812 done
1815 # Main loop for top-level window
1818 /usr/bin/plabel $$ 1>/dev/null 2>&1
1819 if [ $? != 0 ] ; then
1820 gettext "$0 : Trusted Extensions must be enabled.\n"
1821 exit 1
1824 myzone=$(/sbin/zonename)
1825 if [ $myzone != "global" ] ; then
1826 gettext "$0 : must be in global zone to run.\n"
1827 exit 1
1831 process_options "$@" || exit
1833 mkdir $TXTMP 2>/dev/null
1834 deflabel=$(chk_encodings -a|grep "Default User Sensitivity"|\
1835 sed 's/= /=/'|sed 's/"/'''/g|cut -d"=" -f2)
1836 DEFAULTLABEL=$(atohexlabel ${deflabel})
1837 intlabel=$(chk_encodings -a|grep "Default User Clearance"|\
1838 sed 's/= /=/'|sed 's/"/'''/g|cut -d"=" -f2)
1839 INTLABEL=$(atohexlabel -c "${intlabel}")
1841 # are there any zfs pools?
1842 ZDSET=none
1843 zpool iostat 1>/dev/null 2>&1
1844 if [ $? = 0 ] ; then
1845 # is there a zfs pool named "zone"?
1846 zpool list -H zone 1>/dev/null 2>&1
1847 if [ $? = 0 ] ; then
1848 # yes
1849 ZDSET=zone
1850 else
1851 # no, but is there a root pool?
1852 rootfs=$(df -n / | awk '{print $3}')
1853 if [ $rootfs = "zfs" ] ; then
1854 # yes, use it
1855 ZDSET=$(zfs list -Ho name / | cut -d/ -f 1)/zones
1856 zfs list -H $ZDSET 1>/dev/null 2>&1
1857 if [ $? = 1 ] ; then
1858 createZDSET "-o mountpoint=/zone" $ZDSET
1864 if [ $DISP -eq 0 ] ; then
1865 gettext "non-interactive mode ...\n"
1867 if [ $DESTROYZONES -eq 1 ] ; then
1868 tearDownZones
1871 if [ $CREATEDEF -eq 1 ] ; then
1872 if [[ $(zoneadm list -c) == global ]] ; then
1873 createDefaultZones
1874 else
1875 gettext "cannot create default zones because there are existing zones.\n"
1879 exit
1882 if [ $NSCD_PER_LABEL -eq 0 ] ; then
1883 NSCD_OPT="Configure per-zone name service"
1884 else
1885 NSCD_OPT="Unconfigure per-zone name service"
1889 while (( 1 )) do
1890 selectZone
1891 done