1 #!/bin/ksh 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 # Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 23 # Copyright 2014 Garrett D'Amore 24 # 25 # 26 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. 30 31 # These arguments are accepted, and will result in non-interactive 32 # (text-only) mode: 33 # 34 # txzonemgr [-c | -d[f]] 35 # 36 # -c create default zones 37 # -d destroy all zones; prompts for confirmation unless 38 # the -f flag is also specified 39 # -f force 40 # 41 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 50 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 55 fi 56 57 myname=$(basename $0) 58 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 65 66 PATH=/usr/bin:/usr/sbin:/usr/lib export PATH 67 title="Labeled Zone Manager 2.1" 68 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") 82 83 84 process_options() 85 { 86 typeset opt optlist 87 88 optlist='cdf' 89 90 while getopts ":$optlist" opt 91 do 92 case $opt in 93 c) CREATEDEF=1 94 DISP=0 95 ;; 96 d) DESTROYZONES=1 97 DISP=0 98 ;; 99 f) FORCE=1 100 ;; 101 *) gettext "invalid option -$OPTARG\n" 102 usage 103 return 2 104 ;; 105 esac 106 done 107 108 if [ $CREATEDEF -eq 1 -a $DESTROYZONES -eq 1 ] ; then 109 gettext "cannot combine options -c and -d\n" 110 usage 111 return 2 112 fi 113 if [ $CREATEDEF -eq 1 -a $FORCE -eq 1 ] ; then 114 gettext "option -f not allowed with -c\n" 115 usage 116 return 2 117 fi 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 122 fi 123 124 shift $((OPTIND - 1)) 125 if [ "x$1" != "x" ] ; then 126 usage 127 return 2 128 fi 129 130 return 0 131 } 132 133 usage() { 134 gettext "usage: $myname [-c | -d[f]]\n" 135 } 136 137 consoleCheck() { 138 if [ $zonename != global ] ; then 139 zconsole=$(pgrep -f "zlogin -C $zonename") 140 if [ $? != 0 ] ; then 141 console="Zone Console...\n" 142 fi 143 fi 144 } 145 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= 160 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" 166 fi 167 fi 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= 174 fi 175 else 176 label="Select Label...\n" 177 addremotehost= 178 removeremotehost= 179 addcipsohost= 180 removecipsohost= 181 setmlps= 182 fi 183 } 184 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 196 fi 197 done 198 if [ $clone_cnt -gt 0 ] ; then 199 clone="Clone...\n"; \ 200 fi 201 } 202 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" 209 fi 210 } 211 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" 218 fi 219 } 220 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: ") 228 229 if [[ ! -n $zonename ]] ; then 230 zonename=global 231 return 232 fi 233 fi 234 zonecfg -z $zonename "create -t SUNWtsoldef;\ 235 set zonepath=/zone/$zonename" 236 } 237 238 removeZoneBEs() { 239 delopt=$* 240 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 246 fi 247 } 248 249 updateTemplate () { 250 if [ $hostType = cipso ] ; then 251 template=${zonename}_cipso 252 deflabel= 253 else 254 template=${zonename}_unlab 255 deflabel="def_label=${hexlabel};" 256 fi 257 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 262 fi 263 print "${template}:host_type=${hostType};doi=1;min_sl=${minlabel};max_sl=${maxlabel};$deflabel" >> $TNRHTP 264 tnctl -t $template 265 } 266 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 272 fi 273 274 # 275 # Add matching entries in tnrhtp if necessary 276 # 277 minlabel=admin_low 278 maxlabel=admin_high 279 hostType=cipso 280 updateTemplate 281 282 hostType=unlabeled 283 updateTemplate 284 } 285 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 305 fi 306 fi 307 } 308 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 321 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 332 333 hostType=cipso 334 updateTemplate 335 } 336 337 338 encryptionValues() { 339 echo $(zfs get 2>&1 | grep encryption | sed -e s/^.*YES// -e s/\|//g) 340 } 341 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 "" 351 fi 352 file=$(mktemp) 353 echo "$pass1" > $file 354 echo "$file" 355 } 356 357 createZDSET() { 358 options=$1 359 pool=${2%%/*} 360 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 367 fi 368 369 encryption=$(zenity --list --title="$title" --height=320 \ 370 --text="Select cipher for encryption of all labels:" \ 371 --column="encryption" $(encryptionValues)) 372 373 if [[ $? != 0 || $encryption == "off" ]]; then 374 zfs create $options $ZDSET 375 return 376 fi 377 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 383 384 if [[ $format == "Passphrase" ]]; then 385 file=$(getPassphrase) 386 if [[ $file == "" ]]; then 387 exit 388 fi 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%%-*} 400 fi 401 pktool genkey keystore=file keytype=aes \ 402 keylen=$keylen outkey=$file 403 keysource="raw,file:///$file" 404 fi 405 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 411 fi 412 } 413 414 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 419 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} 435 fi 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} 441 fi 442 print "security_policy=NONE" >> ${SYSIDCFG} 443 locale=$(locale|grep LANG | cut -d "=" -f2) 444 if [[ -z $locale ]] ; then 445 locale="C" 446 fi 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) 452 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. 457 458 #print "root_password=$rootpwd" >> ${SYSIDCFG} 459 print "nfs4_domain=dynamic" >> ${SYSIDCFG} 460 print "network_interface=PRIMARY {" >> ${SYSIDCFG} 461 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 470 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 482 483 validateIPaddr 484 if [[ -z $ipaddr ]] ; then 485 return 486 fi 487 fi 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 495 fi 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 504 505 print "hostname=$hostname" >> ${SYSIDCFG} 506 ipaddr=$(getent hosts $hostname|cut -f1) 507 if [ $? = 0 ] ; then 508 print "ip_address=$ipaddr" >> ${SYSIDCFG} 509 fi 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} 517 fi 518 519 print "protocol_ipv6=no }" >> ${SYSIDCFG} 520 cp /etc/default/nfs ${ZONE_ETC_DIR}/default/nfs 521 touch ${ZONE_ETC_DIR}/.NFS4inst_state.domain 522 } 523 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[*]}) 535 fi 536 537 if [[ -n $image ]] ; then 538 removeZoneBEs 539 zoneadm -z $zonename clone $image 540 541 if [ $NSCD_PER_LABEL = 0 ] ; then 542 sharePasswd $zonename 543 else 544 unsharePasswd $zonename 545 fi 546 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 554 fi 555 fi 556 } 557 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 572 fi 573 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 578 fi 579 580 if [ $NSCD_PER_LABEL = 0 ] ; then 581 sharePasswd $zonename 582 else 583 unsharePasswd $zonename 584 fi 585 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 591 fi 592 593 initialize 594 zoneadm -z $zonename halt 595 } 596 597 delete() { 598 delopt=$* 599 600 # if there is an entry for this zone in tnzonecfg, remove it 601 # before deleting the zone. 602 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 608 fi 609 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 616 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 623 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 630 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 637 638 zonecfg -z $zonename delete -F 639 640 removeZoneBEs $delopt 641 for snap in $(zfs list -Ho name -t snapshot|grep "\@${zonename}_snap") ; do 642 zfs destroy -R $snap 643 done 644 } 645 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 661 fi 662 else 663 x=$(zenity --error \ 664 --title="$title" \ 665 --text="$ipaddr $msg_badip") 666 ipaddr= 667 return 668 fi 669 done 670 else 671 x=$(zenity --error \ 672 --title="$title" \ 673 --text="$ipaddr $msg_badip") 674 ipaddr= 675 fi 676 } 677 678 getAllZoneNICs(){ 679 integer count=0 680 for i in $(ifconfig -a4|grep "^[a-z].*:") 681 do 682 print "$i" |grep "^[a-z].*:" >/dev/null 2>&1 683 [ $? -eq 1 ] && continue 684 685 i=${i%:} # Remove colon after interface name 686 for j in $(ifconfig $i) 687 do 688 case $j in 689 all-zones) 690 aznics[count]=$i 691 count+=1 692 ;; 693 esac 694 done 695 done 696 } 697 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; 706 707 cidr=$(perl -e 'use Socket; print unpack("%32b*",inet_aton($ARGV[0])), "\n";' $nm) 708 } 709 710 addNet() { 711 getIPaddr 712 if [[ -z $ipaddr ]] ; then 713 return; 714 fi 715 getNetmask 716 if [[ -z $cidr ]] ; then 717 return; 718 fi 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 726 } 727 728 getAttrs() { 729 zone=global 730 type=ignore 731 for j in $(ifconfig $nic) 732 do 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 750 fi 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 759 fi 760 fi 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) 769 fi 770 else 771 template="..." 772 ipaddr="..." 773 fi 774 } 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" 782 fi 783 sed -e "/^${remote}/d" $TNRHDB > /tmp/tnrhdb.$$ 2>/dev/null 784 mv /tmp/tnrhdb.$$ $TNRHDB 785 fi 786 } 787 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 796 fi 797 } 798 799 getIPaddr() { 800 hostname=$(zenity --entry \ 801 --title="$title" \ 802 --width=330 \ 803 --text="$nic: Enter Hostname: ") 804 805 [ $? != 0 ] && return 806 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 815 fi 816 817 } 818 819 addHost() { 820 # Update hosts 821 if [[ -z $ipaddr ]] ; then 822 return; 823 fi 824 grep "^${ipaddr}[^0-9]" /etc/inet/hosts >/dev/null 825 if [ $? -eq 1 ] ; then 826 print "$ipaddr\t$hostname" >> /etc/inet/hosts 827 fi 828 829 template=cipso 830 cidr=32 831 updateTnrhdb 832 833 ifconfig $nic $ipaddr netmask + broadcast + 834 # 835 # TODO: better integration with nwam 836 # TODO: get/set netmask for IP address 837 # 838 print $hostname > /etc/hostname.$nic 839 } 840 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) 847 848 } 849 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: ") 859 860 if [[ ! -n $vnicname ]] ; then 861 return 862 fi 863 fi 864 x=$(dladm show-vnic|grep "^$vnicname " ) 865 if [[ ! -n $x ]] ; then 866 dladm create-vnic -l $nic $vnicname 867 fi 868 if [ $zonename = global ] ; then 869 ifconfig $vnicname plumb 870 else 871 zonecfg -z $zonename "add net; \ 872 set physical=$vnicname; \ 873 end" 874 fi 875 nic=$vnicname 876 } 877 878 shareInterface() { 879 # 880 # TODO: better integration with nwam 881 # 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 886 } 887 888 unshareInterface() { 889 # 890 # TODO: better integration with nwam 891 # 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 896 } 897 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; 908 fi 909 if [ ${octets[3]} = 0 ] ; then 910 nic="$ipaddr" 911 getNetmask 912 if [[ -z $cidr ]] ; then 913 return; 914 fi 915 else 916 cidr=32 917 fi 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") 927 fi 928 rm $TXTMP/tnrhdb_new.$$ 929 rm $TXTMP/syntax_error.$$ 930 } 931 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": 939 fi 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) 949 950 if [[ -n $ipaddr ]] ; then 951 deleteTnrhdbEntry 952 tnctl -dh ${ip}:$template 953 else 954 return 955 fi 956 else 957 return 958 fi 959 done 960 } 961 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 975 ) 976 977 if [[ -z $ports ]] ; then 978 return 979 fi 980 981 # getopts needs another a blank and another dash 982 ports=--$(print "$ports"|sed 's/ //g'|sed 's/|/ --/g'|sed 's/Interfaces:/ :/g') 983 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 991 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.$$ 995 996 x=$(tnchkdb -z $TXTMP/tnzonecfg.$$ 2>$TXTMP/syntax_error.$$) 997 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 1005 fi 1006 else 1007 syntax=$(cat $TXTMP/syntax_error.$$) 1008 x=$(zenity --error \ 1009 --title="$title" \ 1010 --text="$syntax") 1011 rm $TXTMP/tnzonecfg.$$ 1012 fi 1013 rm $TXTMP/syntax_error.$$ 1014 } 1015 1016 enableAuthentication() { 1017 integer file_cnt=0 1018 1019 zonepath=$(zoneadm -z $1 list -p|cut -d : -f4) 1020 ZONE_ETC_DIR=$zonepath/root/etc 1021 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. 1025 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 1033 fi 1034 1035 if [ $LOGNAME = "root" ]; then 1036 return 1037 fi 1038 1039 file[0]="passwd" 1040 file[1]="shadow" 1041 file[2]="user_attr" 1042 # 1043 # Add the user who assumed the root role to each installed zone 1044 # 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]} 1054 fi 1055 fi 1056 file_cnt+=1 1057 done 1058 chmod 400 $ZONE_ETC_DIR/shadow 1059 } 1060 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 1070 fi 1071 } 1072 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" 1088 fi 1089 zoneadm -z $1 halt >/dev/null 2>&1 1090 } 1091 1092 # This routine is a toggle -- if we find it configured for global nscd, 1093 # change to nscd-per-label and vice-versa. 1094 # 1095 # The user was presented with only the choice to CHANGE the existing 1096 # configuration. 1097 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 1116 fi 1117 } 1118 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)" 1123 1124 stacks[0]="Shared Stack" 1125 stacks[1]="Exclusive Stack" 1126 1127 getAllZoneNICs 1128 netOps[0]="1\n${ncmds[0]}\nShared Stack\n${aznics[*]}" 1129 1130 integer nic_cnt=0 1131 integer netOp_cnt=2 1132 1133 set -A nics $(dladm show-phys|grep -v LINK|cut -f1 -d " ") 1134 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 1142 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 1153 ) 1154 1155 # User picked cancel or no selection 1156 if [[ -z $netOp ]] ; then 1157 return 1158 fi 1159 1160 # All-zones is the default, so just return 1161 if [ $netOp = 1 ] ; then 1162 return 1163 fi 1164 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; 1170 ;; 1171 ${ncmds[2]} ) 1172 zonecfg -z $zonename set ip-type=exclusive 1173 createVNIC 1174 ;; 1175 esac 1176 } 1177 1178 manageInterface () { 1179 while (( 1 )) do 1180 getAttrs 1181 1182 # Clear list of commands 1183 1184 share= 1185 setipaddr= 1186 newlogical= 1187 newvnic= 1188 unplumb= 1189 bringup= 1190 bringdown= 1191 1192 if [ $updown = Down ] ; then 1193 bringup="Bring Up\n" 1194 else 1195 bringdown="Bring Down\n" 1196 fi 1197 1198 case $linktype in 1199 physical ) 1200 newlogical="Create Logical Interface...\n"; 1201 newvnic="Create Virtual Interface (VNIC)...\n"; 1202 ;; 1203 logical ) 1204 unplumb="Remove Logical Interface\n" 1205 ;; 1206 virtual ) 1207 newlogical="Create Logical Interface...\n"; 1208 unplumb="Remove Virtual Interface\n" ; 1209 ;; 1210 esac 1211 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" 1218 fi 1219 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" ) 1233 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 1262 } 1263 1264 sharePrimaryNic() { 1265 set -A ip $(getent hosts $(cat /etc/nodename)) 1266 for i in $(ifconfig -au4|grep "^[a-z].*:" |grep -v LOOPBACK) 1267 do 1268 print "$i" |grep "^[a-z].*:" >/dev/null 2>&1 1269 [ $? -eq 1 ] && continue 1270 1271 nic=${i%:} # Remove colon after interface name 1272 getAttrs 1273 if [ ${ip[0]} = $ipaddr ]; then 1274 shareInterface 1275 break 1276 fi 1277 done 1278 } 1279 1280 manageNets() { 1281 while (( 1 )) do 1282 attrs= 1283 for i in $(ifconfig -a4|grep "^[a-z].*:" |grep -v LOOPBACK) 1284 do 1285 print "$i" |grep "^[a-z].*:" >/dev/null 2>&1 1286 [ $? -eq 1 ] && continue 1287 1288 nic=${i%:} # Remove colon after interface name 1289 getAttrs 1290 attrs="$nic $linktype $zone $ipaddr $template $updown $attrs" 1291 done 1292 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) 1305 1306 if [[ -z $nic ]] ; then 1307 return 1308 fi 1309 manageInterface 1310 done 1311 } 1312 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 1326 fi 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 1334 fi 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 1364 1365 grep "^${ldapserveraddr}[^0-9]" /etc/hosts > /dev/null 1366 if [ $? -eq 1 ] ; then 1367 print "$ldapserveraddr $ldapserver" >> /etc/hosts 1368 fi 1369 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" 1377 fi 1378 1379 proxyDN=$(print $ldapdomain|awk -F"." \ 1380 "{ ORS = \"\" } { for (i = 1; i < NF; i++) print \"dc=\"\\\$i\",\" }{ print \"dc=\"\\\$NF }") 1381 1382 zenity --info \ 1383 --title="$ldaptitle" \ 1384 --width=500 \ 1385 --text="global zone will be LDAP client of $ldapserver" 1386 1387 ldapout=$TXTMP/ldapclient.$$ 1388 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 1394 1395 if [ $? -eq 0 ] ; then 1396 ldapstatus=Success 1397 else 1398 ldapstatus=Error 1399 fi 1400 1401 zenity --text-info \ 1402 --width=700 \ 1403 --height=300 \ 1404 --title="$ldaptitle: $ldapstatus" \ 1405 --filename=$ldapout 1406 1407 rm -f $ldapout 1408 1409 1410 } 1411 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 1422 fi 1423 fi 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 1432 fi 1433 fi 1434 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" 1439 fi 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 1445 } 1446 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 1453 fi 1454 createDefaultInternal 1455 return 1456 fi 1457 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 ) 1472 1473 case $command in 1474 " $defpub") 1475 createDefaultPublic ;; 1476 1477 " $defboth") 1478 createDefaultPublic 1479 if [ $? -ne 0 ] ; then 1480 return 1 1481 fi 1482 createDefaultInternal ;; 1483 1484 *) 1485 return;; 1486 esac 1487 } 1488 1489 createDefaultPublic() { 1490 zonename=$PUBZONE 1491 if [ $DISP -eq 0 ] ; then 1492 gettext "creating default $zonename zone ...\n" 1493 fi 1494 newZone 1495 zone_cnt+=1 1496 hexlabel=$DEFAULTLABEL 1497 setTNdata 1498 sharePrimaryNic 1499 1500 install 1501 if [ $? -ne 0 ] ; then 1502 return 1 1503 fi 1504 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" 1514 fi 1515 } 1516 1517 createDefaultInternal() { 1518 zoneadm -z $PUBZONE halt 1519 1520 zonename=snapshot 1521 newZone 1522 zone_cnt+=1 1523 zonecfg -z $zonename set autoboot=false 1524 1525 clone $PUBZONE 1526 zoneadm -z $PUBZONE boot & 1527 1528 zonename=$INTZONE 1529 if [ $DISP -eq 0 ] ; then 1530 gettext "creating default $zonename zone ...\n" 1531 fi 1532 newZone 1533 zone_cnt+=1 1534 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 1542 fi 1543 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" & 1551 fi 1552 zoneadm -z $zonename boot & 1553 } 1554 1555 selectZone() { 1556 set -A zonelist "global\nrunning\nADMIN_HIGH" 1557 integer zone_cnt=1 1558 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 1564 fi 1565 if [ $zone_cnt == 1 ] ; then 1566 zonename=global 1567 singleZone 1568 return 1569 fi 1570 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=... 1580 fi 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" \ 1592 ) 1593 1594 # if the menu choice was a zonename, pop up zone menu 1595 if [[ -n $zonename ]] ; then 1596 singleZone 1597 else 1598 exit 1599 fi 1600 } 1601 1602 # Loop for single-zone menu 1603 singleZone() { 1604 1605 while (( 1 )) do 1606 # Clear list of commands 1607 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= 1621 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" 1628 fi 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= 1640 fi 1641 1642 zonestate=$(zoneadm -z $zonename list -p | cut -d : -f 3) 1643 1644 consoleCheck; 1645 labelCheck; 1646 delay=0 1647 1648 if [ $zonename != global ] ; then 1649 case $zonestate in 1650 running) 1651 ready="Ready\n" 1652 reboot="Reboot\n" 1653 stop="Halt\n" 1654 ;; 1655 ready) 1656 start="Boot\n" 1657 stop="Halt\n" 1658 ;; 1659 installed) 1660 if [[ -z $label ]] ; then 1661 ready="Ready\n" 1662 start="Boot\n" 1663 fi 1664 uninstall="Uninstall\n" 1665 relabelCheck 1666 autobootCheck 1667 ;; 1668 configured) 1669 install="Install...\n" 1670 cloneCheck 1671 delete="Delete\n" 1672 console= 1673 ;; 1674 incomplete) 1675 uninstall="Uninstall\n" 1676 ;; 1677 *) 1678 ;; 1679 esac 1680 fi 1681 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" ) 1713 1714 case $command in 1715 " Create a new zone...") 1716 zonename= 1717 newZone ;; 1718 1719 " Zone Console...") 1720 delay=2 1721 gnome-terminal \ 1722 --title="Zone Console: $zonename" \ 1723 --command "zlogin -C $zonename" & ;; 1724 1725 " Select Label...") 1726 selectLabel;; 1727 1728 " Ready") 1729 zoneadm -z $zonename ready ;; 1730 1731 " Boot") 1732 zoneadm -z $zonename boot ;; 1733 1734 " Halt") 1735 zoneadm -z $zonename halt ;; 1736 1737 " Reboot") 1738 zoneadm -z $zonename reboot ;; 1739 1740 " Install...") 1741 install;; 1742 1743 " Clone...") 1744 clone ;; 1745 1746 " Uninstall") 1747 zoneadm -z $zonename uninstall -F;; 1748 1749 " Delete") 1750 delete 1751 return ;; 1752 1753 " Configure Network Interfaces...") 1754 if [ $zonename = global ] ; then 1755 manageNets 1756 else 1757 manageZoneNets 1758 fi;; 1759 1760 " Add Single-level Access to Remote Host...") 1761 addTnrhdb ;; 1762 1763 " Add Multilevel Access to Remote Host...") 1764 template=cipso 1765 addTnrhdb ;; 1766 1767 " Remove Single-level Access to Remote Host...") 1768 removeTnrhdb ;; 1769 1770 " Remove Multilevel Access to Remote Host...") 1771 template=cipso 1772 removeTnrhdb ;; 1773 1774 " Configure Multilevel Ports...") 1775 setMLPs;; 1776 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 ;; 1781 1782 " Deny Relabeling") 1783 zonecfg -z $zonename set limitpriv=default ;; 1784 1785 " Set Automatic Booting") 1786 zonecfg -z $zonename set autoboot=true ;; 1787 1788 " Set Manual Booting") 1789 zonecfg -z $zonename set autoboot=false ;; 1790 1791 " Create LDAP Client...") 1792 createLDAPclient ;; 1793 1794 " Configure per-zone name service") 1795 manageNscd ;; 1796 1797 " Unconfigure per-zone name service") 1798 manageNscd ;; 1799 1800 " Destroy all zones...") 1801 tearDownZones 1802 return ;; 1803 1804 *) 1805 if [ $zone_cnt == 1 ] ; then 1806 exit 1807 else 1808 return 1809 fi;; 1810 esac 1811 sleep $delay; 1812 done 1813 } 1814 1815 # Main loop for top-level window 1816 # 1817 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 1822 fi 1823 1824 myzone=$(/sbin/zonename) 1825 if [ $myzone != "global" ] ; then 1826 gettext "$0 : must be in global zone to run.\n" 1827 exit 1 1828 fi 1829 1830 1831 process_options "$@" || exit 1832 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}") 1840 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 1859 fi 1860 fi 1861 fi 1862 fi 1863 1864 if [ $DISP -eq 0 ] ; then 1865 gettext "non-interactive mode ...\n" 1866 1867 if [ $DESTROYZONES -eq 1 ] ; then 1868 tearDownZones 1869 fi 1870 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" 1876 fi 1877 fi 1878 1879 exit 1880 fi 1881 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" 1886 fi 1887 1888 1889 while (( 1 )) do 1890 selectZone 1891 done