App-FuguVM

 view release on metacpan or  search on metacpan

share/fuguvm/expect/install.exp  view on Meta::CPAN

#!/usr/bin/expect -f
#
# Automated OpenBSD installation over the serial console
#
# Usage: install.exp <host> <port> <root_password> <proxy_url> <arch> <verify>
#

# Use FUGUVM_TIMEOUT from the environment when it exceeds the
# script default. Slow hosts need this, for example under TCG
# emulation in CI.
proc env_timeout {default} {
    global env
    if {[info exists env(FUGUVM_TIMEOUT)] && $env(FUGUVM_TIMEOUT) > $default} {
        return $env(FUGUVM_TIMEOUT)
    }
    return $default
}

set timeout [env_timeout 300]

set usage "Usage: install.exp <host> <port> <root_password> <proxy_url> <arch> <verify>"

if {[llength $argv] != 6} {
    puts stderr $usage
    exit 1
}

set host [lindex $argv 0]
set port [lindex $argv 1]
set root_password [lindex $argv 2]
set proxy_url [lindex $argv 3]
set arch [lindex $argv 4]
set verify [lindex $argv 5]

if {$root_password eq ""} {
    set root_password "openbsd"
}

if {$proxy_url eq ""} {
    set proxy_url "none"
}

# The configuration loader of fuguvm validates the value, so this
# exit guards a manual run only.
if {$arch ne "amd64" && $arch ne "arm64"} {
    puts stderr $usage
    exit 1
}

# The configuration loader also normalizes the verify switch.
if {$verify ne "yes" && $verify ne "no"} {
    puts stderr $usage
    exit 1
}

log_user 1

# Helper proc to send a response after a match
proc respond {response} {
    sleep 0.5
    send "$response\r"
}

# Connect to console
spawn telnet $host $port

# Wait for the console connection. telnet prints "Connected to <host>"
# on success. Match on the host-independent prefix, because the host
# can be an IP address. An eof means telnet could not connect at all,
# because the console port does not listen. Fail fast rather than hang
# to the full timeout.
expect {
    "Connected to" {
        # Send an empty line to trigger the prompt if the console
        # already shows the installer
        sleep 0.5
        send "\r"
    }
    "Escape character" {
        sleep 0.5
        send "\r"
    }
    eof {
        send_user "\n==> ERROR: telnet could not connect to the VM console\n"
        exit 1
    }
    timeout {
        send_user "\n==> ERROR: Failed to connect to VM console\n"
        exit 1
    }
}

sleep 0.5

expect {
    "(I)nstall" {
        send "i\r"
    }
    "Welcome to the OpenBSD" {
        # Wait a bit more for the menu to appear
        exp_continue
    }
    "boot>" {
        # The arm64 machine has no display adapter, so its loader
        # already writes to the serial port. The amd64 machine has
        # one, so its loader must move the console to com0 before it
        # boots the kernel.
        if {$arch eq "amd64"} {
            send "stty com0 115200\r"
            expect "boot>"
            send "set tty com0\r"
            expect "boot>"



( run in 0.560 second using v1.01-cache-2.11-cpan-5c0b1e786e0 )