#cloud-config

{{if http_proxy}}
apt_proxy: {{http_proxy}}
{{elif server_host}}
apt_proxy: http://{{server_host}}:8000/
{{endif}}

misc_bucket:
 - &maas_enlist |
   ####  IPMI setup  ######
   # If IPMI network settings have been configured statically, you can
   # make them DHCP. If 'true', the IPMI network source will be changed
   # to DHCP.
   IPMI_CHANGE_STATIC_TO_DHCP="false"

   # In certain hardware, the parameters for the ipmi_si kernel module
   # might need to be specified. If you wish to send parameters, uncomment
   # the following line.
   #IPMI_SI_PARAMS="type=kcs ports=0xca2"

   TEMP_D=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXX")
   IPMI_CONFIG_D="${TEMP_D}/ipmi.d"
   BIN_D="${TEMP_D}/bin"
   OUT_D="${TEMP_D}/out"
   PATH="$BIN_D:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

   mkdir -p "$BIN_D" "$OUT_D" "$IPMI_CONFIG_D"

   load_modules() {
      modprobe ipmi_msghandler
      modprobe ipmi_devintf
      modprobe ipmi_si ${IPMI_SI_PARAMS}
      udevadm settle
   }

   add_bin() {
      cat > "${BIN_D}/$1"
      chmod "${2:-755}" "${BIN_D}/$1"
   }
   add_ipmi_config() {
      cat > "${IPMI_CONFIG_D}/$1"
      chmod "${2:-644}" "${IPMI_CONFIG_D}/$1"
   }

   # Example config: enable BMC remote access (on some systems.)
   #add_ipmi_config "02-global-config.ipmi" <<"END_IPMI_CONFIG"
   #Section Lan_Channel
   #     Volatile_Access_Mode                    Always_Available
   #     Volatile_Enable_User_Level_Auth         Yes
   #     Volatile_Channel_Privilege_Limit        Administrator
   #     Non_Volatile_Access_Mode                Always_Available
   #     Non_Volatile_Enable_User_Level_Auth     Yes
   #     Non_Volatile_Channel_Privilege_Limit    Administrator
   #EndSection
   #END_IPMI_CONFIG

   add_bin "maas-ipmi-autodetect-tool" <<"END_MAAS_IPMI_AUTODETECT_TOOL"
   {{for line in maas_ipmi_autodetect_tool_py.splitlines()}}
   {{line}}
   {{endfor}}
   END_MAAS_IPMI_AUTODETECT_TOOL

   add_bin "maas-ipmi-autodetect" <<"END_MAAS_IPMI_AUTODETECT"
   {{for line in maas_ipmi_autodetect_py.splitlines()}}
   {{line}}
   {{endfor}}
   END_MAAS_IPMI_AUTODETECT

   add_bin "maas-moonshot-autodetect" <<"END_MAAS_MOONSHOT_AUTODETECT"
   {{for line in maas_moonshot_autodetect_py.splitlines()}}
   {{line}}
   {{endfor}}
   END_MAAS_MOONSHOT_AUTODETECT

   add_bin "maas-enlist" <<"END_MAAS_ENLIST"
   {{for line in maas_enlist_sh.splitlines()}}
   {{line}}
   {{endfor}}
   END_MAAS_ENLIST

   # we could obtain the interface that booted from the kernel cmdline
   # thanks to 'IPAPPEND' (http://www.syslinux.org/wiki/index.php/SYSLINUX)
   url="{{server_url}}"
   host=""
   ip=$(ifconfig eth0 | awk '$1 == "inet" { sub("addr:","",$2); print $2; }') &&
     [ -n "${ip}" ] && host=$(dig +short -x $ip)  && host=${host%.}
   # load ipmi modules
   load_modules
   pargs=""
   if $IPMI_CHANGE_STATIC_TO_DHCP; then
      pargs="--dhcp-if-static"
   fi
   power_type=$(maas-ipmi-autodetect-tool)
   case "$power_type" in
       ipmi)
           power_params=$(maas-ipmi-autodetect --configdir "$IPMI_CONFIG_D" ${pargs} --commission-creds) &&
             [ -n "${power_params}" ] && power_params=${power_params%.}
           ;;
       moonshot)
           power_params=$(maas-moonshot-autodetect --commission-creds) &&
             [ -n "${power_params}" ] && power_params=${power_params%.}
           ;;
   esac
   # Try maas-enlist without power parameters on failure for older versions of
   # maas-enlist without power parameter support
   maas-enlist --serverurl "$url" ${host:+--hostname "${host}"} ${power_params:+--power-params "${power_params}" --power-type "${power_type}"}>/tmp/enlist.out ||\
      maas-enlist --serverurl "$url" ${host:+--hostname "${host}"} >/tmp/enlist.out
   if [ $? -eq 0 ]; then
      msg="successfully enlisted to '$url'"
      [ -n "$host" ] && msg="$msg with hostname '$host'" ||
         msg="$msg without hostname"
      echo
      echo "=== $(date -R): $msg"
      cat  /tmp/enlist.out
      echo =============================================
      sleep 10
   else
      user="ubuntu"
      pass="ubuntu"

      echo "$user:$pass" | chpasswd
      bfile="/tmp/block-poweroff"
      { echo "#!/bin/sh"; echo "touch $bfile"; } > /etc/profile.d/A01-block.sh
      chmod 755 /etc/profile.d/A01-block.sh
      echo
      echo =============================================
      echo "failed to enlist system maas server '$host'"
      echo "sleeping 60 seconds then poweroff"
      echo
      echo "login with '$user:$pass' to debug and disable poweroff"
      echo 
      cat /tmp/enlist.out
      echo =============================================
      sleep 60
      [ -e $bfile ] && exit 0
   fi
 - &write_poweroff_job |
   cat >/etc/init/maas-poweroff.conf <<EOF
   description "poweroff when maas task is done"
   start on stopped cloud-final
   console output
   task
   script
     [ ! -e /tmp/block-poweroff ] || exit 0
     poweroff
   end script
   EOF
   # reload required due to lack of inotify in overlayfs (LP: #882147)
   initctl reload-configuration


packages: [ freeipmi-tools, openipmi, ipmitool ]
output: {all: '| tee -a /var/log/cloud-init-output.log'}
runcmd:
 - [ sh, -c, *maas_enlist ]
 - [ sh, -c, *write_poweroff_job ]
