Print this page
    
Modernize CDDL license text and copyrights for OmniTI-original code.
Factor out SetKeyboardLayout so a PXE server-side config can call it out.
Fix PXE regressions.
Do better on keyboard selection, plus save it in installed image.
Also, pv(1) output for install doesn't scroll anymore.
Kayak for ISO checkpoint 1
Initial foray into Kayak for ISO
    
      
        | Split | 
	Close | 
      
      | Expand all | 
      | Collapse all | 
    
    
          --- old/install_help.sh
          +++ new/install_help.sh
   1    1  #!/usr/bin/bash
        2 +
   2    3  #
   3      -# CDDL HEADER START
        4 +# This file and its contents are supplied under the terms of the
        5 +# Common Development and Distribution License ("CDDL"), version 1.0.
        6 +# You may only use this file in accordance with the terms of version
        7 +# 1.0 of the CDDL.
   4    8  #
   5      -# The contents of this file are subject to the terms of the
   6      -# Common Development and Distribution License, Version 1.0 only
   7      -# (the "License").  You may not use this file except in compliance
   8      -# with the License.
        9 +# A full copy of the text of the CDDL should have accompanied this
       10 +# source.  A copy of the CDDL is also available via the Internet at
       11 +# http://www.illumos.org/license/CDDL.
   9   12  #
  10      -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  11      -# or http://www.opensolaris.org/os/licensing.
  12      -# See the License for the specific language governing permissions
  13      -# and limitations under the License.
       13 +
  14   14  #
  15      -# When distributing Covered Code, include this CDDL HEADER in each
  16      -# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  17      -# If applicable, add the following below this CDDL HEADER, with the
  18      -# fields enclosed by brackets "[]" replaced with your own identifying
  19      -# information: Portions Copyright [yyyy] [name of copyright owner]
       15 +# Copyright 2017 OmniTI Computer Consulting, Inc.  All rights reserved.
  20   16  #
  21      -# CDDL HEADER END
  22      -#
  23      -#
  24      -# Copyright 2012 OmniTI Computer Consulting, Inc.  All rights reserved.
  25      -# Use is subject to license terms.
  26      -#
       17 +
  27   18  LOG_SETUP=0
  28   19  
  29   20  ConsoleLog(){
  30   21    exec 4>/dev/console
  31   22    exec 1>>${1}
  32   23    exec 2>>${1}
  33   24    INSTALL_LOG=${1}
  34   25    LOG_SETUP=1
  35   26  }
  36   27  CopyInstallLog(){
  37   28    if [[ -n "$INSTALL_LOG" ]]; then
  38   29      cp $INSTALL_LOG $ALTROOT/var/log/install/kayak.log
  39   30    fi
  40   31  }
  41   32  SendInstallLog(){
  42   33    PUTURL=`echo $CONFIG | sed -e 's%/kayak/%/kayaklog/%g;'`
  43   34    PUTURL=`echo $PUTURL | sed -e 's%/kayak$%/kayaklog%g;'`
  44   35    curl -T $INSTALL_LOG $PUTURL/$ETHER
  45   36  }
  46   37  OutputLog(){
  47   38    if [[ "$LOG_SETUP" -eq "0" ]]; then
  48   39      exec 4>/dev/null
  49   40      LOG_SETUP=1
  50   41    fi
  51   42  }
  52   43  log() {
  53   44    OutputLog
  54   45    TS=`date +%Y/%m/%d-%H:%M:%S`
  55   46    echo "[$TS] $*" 1>&4
  56   47    echo "[$TS] $*"
  57   48  }
  58   49  bomb() {
  59   50    log
  60   51    log ======================================================
  61   52    log "$*"
  62   53    log ======================================================
  63   54    if [[ -n "$INSTALL_LOG" ]]; then
  64   55    log "For more information, check $INSTALL_LOG"
  65   56    log ======================================================
  66   57    fi
  67   58    exit 1
  68   59  }
  69   60  
  70   61  . /kayak/net_help.sh
  71   62  . /kayak/disk_help.sh
  72   63  
  73   64  ICFILE=/tmp/_install_config
  74   65  getvar(){
  75   66    prtconf -v /devices | sed -n '/'$1'/{;n;p;}' | cut -f2 -d\'
  76   67  }
  77   68  
  78   69  # Blank
  79   70  ROOTPW='$5$kr1VgdIt$OUiUAyZCDogH/uaxH71rMeQxvpDEY2yX.x0ZQRnmeb9'
  80   71  RootPW(){
  81   72    ROOTPW="$1"
  82   73  }
  83   74  SetRootPW(){
  84   75    sed -i -e 's%^root::%root:'$ROOTPW':%' $ALTROOT/etc/shadow
  85   76  }
  86   77  ForceDHCP(){
  87   78    log "Forcing all interfaces into DHCP..."
  88   79    /sbin/ifconfig -a plumb 2> /dev/null
  89   80    # for the logs
  90   81    for iface in `/sbin/dladm show-phys -o device -p` ; do
  91   82      /sbin/ifconfig $iface dhcp &
  92   83    done
  
    | 
      ↓ open down ↓ | 
    56 lines elided | 
    
      ↑ open up ↑ | 
  
  93   84    while [[ -z $(/sbin/dhcpinfo BootSrvA) ]]; do
  94   85      log "Waiting for dhcpinfo..."
  95   86      sleep 1
  96   87    done
  97   88    BOOTSRVA=`/sbin/dhcpinfo BootSrvA`
  98   89    log "Next server: $BOOTSRVA"
  99   90    sleep 1
 100   91  }
 101   92  
 102   93  BuildBE() {
 103      -  BOOTSRVA=`/sbin/dhcpinfo BootSrvA`
 104      -  MEDIA=`getvar install_media`
 105      -  MEDIA=`echo $MEDIA | sed -e "s%//\:%//$BOOTSRVA\:%g;"`
 106      -  MEDIA=`echo $MEDIA | sed -e "s%///%//$BOOTSRVA/%g;"`
 107      -  zfs set compression=on rpool
 108      -  zfs create rpool/ROOT
 109      -  zfs set canmount=off rpool/ROOT
 110      -  zfs set mountpoint=legacy rpool/ROOT
       94 +  RPOOL=${1:-rpool}
       95 +  if [[ -z $2 ]]; then
       96 +      BOOTSRVA=`/sbin/dhcpinfo BootSrvA`
       97 +      MEDIA=`getvar install_media`
       98 +      MEDIA=`echo $MEDIA | sed -e "s%//\:%//$BOOTSRVA\:%g;"`
       99 +      MEDIA=`echo $MEDIA | sed -e "s%///%//$BOOTSRVA/%g;"`
      100 +      DECOMP="bzip2 -dc"
      101 +      GRAB="curl -s"
      102 +  else
      103 +      # ASSUME $2 is a file path.  TODO: Parse the URL...
      104 +      MEDIA=$2
      105 +      # TODO: make switch statement based on $MEDIA's extension.
      106 +      # e.g. "bz2" ==> "bzip -dc", "7z" ==> 
      107 +      DECOMP="bzip2 -dc"
      108 +      GRAB=cat
      109 +  fi
      110 +  zfs set compression=on $RPOOL
      111 +  zfs create $RPOOL/ROOT
      112 +  zfs set canmount=off $RPOOL/ROOT
      113 +  zfs set mountpoint=legacy $RPOOL/ROOT
 111  114    log "Receiving image: $MEDIA"
 112      -  curl -s $MEDIA | pv -B 128m | bzip2 -dc | zfs receive -u rpool/ROOT/omnios
 113      -  zfs set canmount=noauto rpool/ROOT/omnios
 114      -  zfs set mountpoint=legacy rpool/ROOT/omnios
      115 +  $GRAB $MEDIA | pv -B 128m -w 78 | $DECOMP | zfs receive -u $RPOOL/ROOT/omnios
      116 +  zfs set canmount=noauto $RPOOL/ROOT/omnios
      117 +  zfs set mountpoint=legacy $RPOOL/ROOT/omnios
 115  118    log "Cleaning up boot environment"
 116  119    beadm mount omnios /mnt
 117  120    ALTROOT=/mnt
 118  121    cp $ALTROOT/lib/svc/seed/global.db $ALTROOT/etc/svc/repository.db
 119  122    chmod 0600 $ALTROOT/etc/svc/repository.db
 120  123    chown root:sys $ALTROOT/etc/svc/repository.db
 121  124    /usr/sbin/devfsadm -r /mnt
 122  125    [[ -L $ALTROOT/dev/msglog ]] || \
 123  126      ln -s ../devices/pseudo/sysmsg@0:msglog $ALTROOT/dev/msglog
 124  127    MakeSwapDump
 125      -  zfs destroy rpool/ROOT/omnios@kayak
      128 +  zfs destroy $RPOOL/ROOT/omnios@kayak
 126  129  }
 127  130  
 128  131  FetchConfig(){
 129  132    ETHER=`Ether`
 130  133    BOOTSRVA=`/sbin/dhcpinfo BootSrvA`
 131  134    CONFIG=`getvar install_config`
 132  135    CONFIG=`echo $CONFIG | sed -e "s%//\:%//$BOOTSRVA\:%g;"`
 133  136    CONFIG=`echo $CONFIG | sed -e "s%///%//$BOOTSRVA/%g;"`
 134  137    L=${#ETHER}
 135  138    while [[ "$L" -gt "0" ]]; do
 136  139      URL="$CONFIG/${ETHER:0:$L}"
 137  140      log "... trying $URL"
 138  141      /bin/curl -s -o $ICFILE $URL
 139  142      if [[ -f $ICFILE ]]; then
 140  143        if [[ -n $(grep BuildRpool $ICFILE) ]]; then
 141  144          log "fetched config."
  
    | 
      ↓ open down ↓ | 
    6 lines elided | 
    
      ↑ open up ↑ | 
  
 142  145          return 0
 143  146        fi
 144  147        rm -f $ICFILE
 145  148      fi
 146  149      L=$(($L - 1))
 147  150    done
 148  151    return 1
 149  152  }
 150  153  
 151  154  MakeBootable(){
      155 +  RPOOL=${1:-rpool}
 152  156    log "Making boot environment bootable"
 153      -  zpool set bootfs=rpool/ROOT/omnios rpool
      157 +  zpool set bootfs=$RPOOL/ROOT/omnios rpool
 154  158    # Must do beadm activate first on the off chance we're bootstrapping from
 155  159    # GRUB.
 156      -  beadm activate omnios
      160 +  beadm activate omnios || return 1
 157  161  
      162 +  if [[ ! -z $1 ]]; then
      163 +      # Generate kayak-disk-list from zpool status.
      164 +      # NOTE: If this is something on non-s0 slices, the installboot below
      165 +      # will fail most likely, which is possibly a desired result.
      166 +      zpool list -v $RPOOL | egrep -v "NAME|rpool|mirror" | \
      167 +          awk '{print $1}' | sed -E 's/s0$//g' > /tmp/kayak-disk-list
      168 +  fi
      169 +
 158  170    # NOTE:  This installboot loop assumes we're doing GPT whole-disk rpools.
 159  171    for i in `cat /tmp/kayak-disk-list`
 160  172    do
 161      -    installboot -mf /boot/pmbr /boot/gptzfsboot /dev/rdsk/${i}s0
      173 +      installboot -mfF /boot/pmbr /boot/gptzfsboot /dev/rdsk/${i}s0 || return 1
 162  174    done
 163  175  
 164      -  bootadm update-archive -R $ALTROOT
      176 +  bootadm update-archive -R $ALTROOT || return 1
 165  177    return 0
 166  178  }
 167  179  
 168  180  SetHostname()
 169  181  {
 170  182    log "Setting hostname: ${1}"
 171  183    /bin/hostname "$1"
 172  184    echo "$1" > $ALTROOT/etc/nodename
 173  185    head -n 26 $ALTROOT/etc/hosts > /tmp/hosts
 174  186    echo "::1\t\t$1" >> /tmp/hosts
 175  187    echo "127.0.0.1\t$1" >> /tmp/hosts
 176  188    cat /tmp/hosts > $ALTROOT/etc/hosts
 177  189  }
 178  190  
 179  191  AutoHostname() {
 180  192    suffix=$1
 181  193    macadr=`/sbin/ifconfig -a | \
 182  194            /usr/bin/awk '/UP/{if($2 !~ /LOOPBACK/){iface=$1;}} /ether/{if(iface){print $2; exit;}}' | \
 183  195            /bin/tr '[:upper:]' '[:lower:]' | \
 184  196            /bin/sed -e 's/^/ 0/g;s/:/-0/g; s/0\([0-9a-f][0-9a-f]\)/\1/g; s/ //g;'`
 185  197    [ -z $suffix ] && suffix=omnios
  
    | 
      ↓ open down ↓ | 
    11 lines elided | 
    
      ↑ open up ↑ | 
  
 186  198    [ "$suffix" == "-" ] && suffix= || suffix=-$suffix
 187  199    SetHostname $macadr$suffix
 188  200  }
 189  201  
 190  202  SetTimezone()
 191  203  {
 192  204    log "Setting timezone: ${1}"
 193  205    sed -i -e "s:^TZ=.*:TZ=${1}:" $ALTROOT/etc/default/init
 194  206  }
 195  207  
      208 +SetLang()
      209 +{
      210 +  log "Setting language: ${1}"
      211 +  sed -i -e "s:^LANG=.*:LANG=${1}:" $ALTROOT/etc/default/init
      212 +}
      213 +
      214 +SetKeyboardLayout()
      215 +{
      216 +      # Put the new keyboard layout ($1) in
      217 +      # "setprop keyboard-layout <foo>" in the newly-installed root's
      218 +      # /boot/solaris/bootenv.rc (aka. eeprom(1M) storage for amd64/i386).
      219 +      layout=$1
      220 +      sed "s/keyboard-layout Unknown/keyboard-layout $layout/g" \
      221 +          < $ALTROOT/boot/solaris/bootenv.rc > /tmp/bootenv.rc
      222 +      mv /tmp/bootenv.rc $ALTROOT/boot/solaris/bootenv.rc
      223 +      # Also modify the SMF manifest, assuming US-English was set by default.
      224 +      sed "s/US-English/$layout/g" \
      225 +         < $ALTROOT/lib/svc/manifest/system/keymap.xml > /tmp/keymap.xml
      226 +      cp -f /tmp/keymap.xml $ALTROOT/lib/svc/manifest/system/keymap.xml
      227 +}
      228 +
 196  229  ApplyChanges(){
 197  230    SetRootPW
 198  231    [[ -L $ALTROOT/etc/svc/profile/generic.xml ]] || \
 199  232      ln -s generic_limited_net.xml $ALTROOT/etc/svc/profile/generic.xml
 200  233    [[ -L $ALTROOT/etc/svc/profile/name_service.xml ]] || \
 201  234      ln -s ns_dns.xml $ALTROOT/etc/svc/profile/name_service.xml
      235 +
      236 +  # Extras from interactive ISO/USB install...
      237 +  # arg1 == hostname
      238 +  if [[ ! -z $1 ]]; then
      239 +      SetHostname $1
      240 +  fi
      241 +
      242 +  # arg2 == timezone
      243 +  if [[ ! -z $2 ]]; then
      244 +      SetTimezone $2
      245 +  fi
      246 +
      247 +  # arg3 == Language
      248 +  if [[ ! -z $3 ]]; then
      249 +      SetLang $3
      250 +  fi
      251 +
      252 +  # arg4 == Keyboard layout
      253 +  if [[ ! -z $4 ]]; then
      254 +      SetKeyboardLayout $4
      255 +  fi
      256 +
 202  257    return 0
 203  258  }
 204  259  
 205  260  Postboot() {
 206  261    [[ -f $ALTROOT/.initialboot ]] || touch $ALTROOT/.initialboot
 207  262    echo "$*" >> $ALTROOT/.initialboot
 208  263  }
 209  264  
 210  265  Reboot() {
 211  266    # This is an awful hack... we already setup bootadm
 212  267    # and we've likely deleted enough of the userspace that this
 213  268    # can't run successfully... The easiest way to skip it is to
 214  269    # remove the binary
 215  270    rm -f /sbin/bootadm
 216  271    svccfg -s "system/boot-config:default" setprop config/fastreboot_default=false
 217  272    svcadm refresh svc:/system/boot-config:default
 218  273    reboot
 219  274  }
 220  275  
 221  276  RunInstall(){
 222      -  FetchConfig || bomb "Could not fecth kayak config for target"
      277 +  FetchConfig || bomb "Could not fetch kayak config for target"
      278 +  # Set RPOOL if it wasn't done so already. We need it set.
      279 +  RPOOL=${RPOOL:-rpool}
 223  280    . $ICFILE
 224  281    Postboot 'exit $SMF_EXIT_OK'
 225  282    ApplyChanges || bomb "Could not apply all configuration changes"
 226  283    MakeBootable || bomb "Could not make new BE bootable"
 227  284    log "Install complete"
 228  285    return 0
 229  286  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX