#!/usr/bin/expect -f

# argv 0 local user name
# argv 1 remote user name
# argv 2 remote hostname
# argv 3 remote login password
# argv 4 test flag (true for test only, false otherwise)
# argv 5 key type (rsa or dsa)
# argv 6 public key (optional)

# return code 0: normal exit
# return code 1: no need to send ssh key over. (only when test flag is true)
# return code 2: do need to send ssh key over. (only when test flag is true)
# return code 3: wrong password was provided. 
# return code 4: RSA host key has been changed. (only when test flag is true)
# return code 5: ssh may not be enabled on the remote server (only when test flag is true)
# return code 255: target host not found.

set timeout 10
if {[llength $argv] < 5} {
    puts "Usage: $argv0 localUserName remoteUserName remoteHostName remotePassword testFlag keyType [pubKey]"
    exit 1
}

spawn ssh [lindex $argv 1]@[lindex $argv 2] -i /home/[lindex $argv 0]/.ssh/ccfw/id_[lindex $argv 5] whoami

while 1 {
 expect -re "yes/no" {
      send  "yes\r"
  } -re "assword:" {
      puts "Got password prompt."
      if {[lindex $argv 4] == "true"} {
	      exit 2
      }
      send  "[lindex $argv 3]\r"
      break
  } -re [lindex $argv 1] {
      if {[lindex $argv 4] == "true"} {
          exit 1
      }
      break
  } -re "service not known" {
      exit 255
  } -re "failures for [lindex $argv 1]" {
      exit 3
  } -re "verification failed." {
      exit 4
  } -re "Connection refused" {
      puts "ssh may not enabled on the remote server."
      exit 5
  }
}
expect eof

puts "To perform the key exchange now."
spawn ssh [lindex $argv 1]@[lindex $argv 2] mkauthkeys -a "\"[lindex $argv 6]\""
while 1 {
 expect -re "yes/no" {
      send  "yes\r"
  } -re "assword:" {
      send  "[lindex $argv 3]\r"
      break
  } -re "service not known" {
      exit 255
  } -re "failures for [lindex $argv 1]" {
      exit 3
  } -re "'s password:" {
      exit 3
  }
}
expect eof
exit 0
