|
@@ -9,6 +9,7 @@ package test
|
|
|
// functional test harness for unix.
|
|
// functional test harness for unix.
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
|
+ "bytes"
|
|
|
"crypto"
|
|
"crypto"
|
|
|
"crypto/dsa"
|
|
"crypto/dsa"
|
|
|
"crypto/rsa"
|
|
"crypto/rsa"
|
|
@@ -40,7 +41,7 @@ Pidfile {{.Dir}}/sshd.pid
|
|
|
KeyRegenerationInterval 3600
|
|
KeyRegenerationInterval 3600
|
|
|
ServerKeyBits 768
|
|
ServerKeyBits 768
|
|
|
SyslogFacility AUTH
|
|
SyslogFacility AUTH
|
|
|
-LogLevel INFO
|
|
|
|
|
|
|
+LogLevel DEBUG2
|
|
|
LoginGraceTime 120
|
|
LoginGraceTime 120
|
|
|
PermitRootLogin no
|
|
PermitRootLogin no
|
|
|
StrictModes no
|
|
StrictModes no
|
|
@@ -146,9 +147,26 @@ type server struct {
|
|
|
cleanup func() // executed during Shutdown
|
|
cleanup func() // executed during Shutdown
|
|
|
configfile string
|
|
configfile string
|
|
|
cmd *exec.Cmd
|
|
cmd *exec.Cmd
|
|
|
|
|
+ output bytes.Buffer // holds stderr from sshd process
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (s *server) Dial() *ssh.ClientConn {
|
|
|
|
|
|
|
+func clientConfig() *ssh.ClientConfig {
|
|
|
|
|
+ user, err := user.Current()
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ panic(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ kc := new(keychain)
|
|
|
|
|
+ kc.keys = append(kc.keys, rsakey)
|
|
|
|
|
+ config := &ssh.ClientConfig{
|
|
|
|
|
+ User: user.Username,
|
|
|
|
|
+ Auth: []ssh.ClientAuth{
|
|
|
|
|
+ ssh.ClientAuthKeyring(kc),
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+ return config
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (s *server) Dial(config *ssh.ClientConfig) *ssh.ClientConn {
|
|
|
s.cmd = exec.Command("sshd", "-f", s.configfile, "-i")
|
|
s.cmd = exec.Command("sshd", "-f", s.configfile, "-i")
|
|
|
stdin, err := s.cmd.StdinPipe()
|
|
stdin, err := s.cmd.StdinPipe()
|
|
|
if err != nil {
|
|
if err != nil {
|
|
@@ -158,28 +176,16 @@ func (s *server) Dial() *ssh.ClientConn {
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
s.t.Fatal(err)
|
|
s.t.Fatal(err)
|
|
|
}
|
|
}
|
|
|
- s.cmd.Stderr = os.Stderr
|
|
|
|
|
|
|
+ s.cmd.Stderr = os.Stderr // &s.output
|
|
|
err = s.cmd.Start()
|
|
err = s.cmd.Start()
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
|
|
+ s.t.FailNow()
|
|
|
s.Shutdown()
|
|
s.Shutdown()
|
|
|
s.t.Fatal(err)
|
|
s.t.Fatal(err)
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- user, err := user.Current()
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- s.Shutdown()
|
|
|
|
|
- s.t.Fatal(err)
|
|
|
|
|
- }
|
|
|
|
|
- kc := new(keychain)
|
|
|
|
|
- kc.keys = append(kc.keys, rsakey)
|
|
|
|
|
- config := &ssh.ClientConfig{
|
|
|
|
|
- User: user.Username,
|
|
|
|
|
- Auth: []ssh.ClientAuth{
|
|
|
|
|
- ssh.ClientAuthKeyring(kc),
|
|
|
|
|
- },
|
|
|
|
|
- }
|
|
|
|
|
conn, err := ssh.Client(&client{stdin, stdout}, config)
|
|
conn, err := ssh.Client(&client{stdin, stdout}, config)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
|
|
+ s.t.FailNow()
|
|
|
s.Shutdown()
|
|
s.Shutdown()
|
|
|
s.t.Fatal(err)
|
|
s.t.Fatal(err)
|
|
|
}
|
|
}
|
|
@@ -190,6 +196,10 @@ func (s *server) Shutdown() {
|
|
|
if err := s.cmd.Process.Kill(); err != nil {
|
|
if err := s.cmd.Process.Kill(); err != nil {
|
|
|
s.t.Error(err)
|
|
s.t.Error(err)
|
|
|
}
|
|
}
|
|
|
|
|
+ if s.t.Failed() {
|
|
|
|
|
+ // log any output from sshd process
|
|
|
|
|
+ s.t.Log(s.output.String())
|
|
|
|
|
+ }
|
|
|
s.cleanup()
|
|
s.cleanup()
|
|
|
}
|
|
}
|
|
|
|
|
|