drone-ssh/main.go
2015-10-21 12:34:42 -07:00

79 lines
1.5 KiB
Go

package main
import (
"fmt"
"net"
"os"
"strconv"
"strings"
"github.com/drone/drone-plugin-go/plugin"
"golang.org/x/crypto/ssh"
)
// Params stores the git clone parameters used to
// configure and customzie the git clone behavior.
type Params struct {
Commands []string `json:"commands"`
Login string `json:"user"`
Port int `json:"port"`
Host string `json:"host"`
}
func main() {
v := new(Params)
w := new(plugin.Workspace)
plugin.Param("workspace", w)
plugin.Param("vargs", &v)
plugin.MustParse()
err := run(w.Keys, v)
if err != nil {
os.Exit(1)
}
}
func run(keys *plugin.Keypair, params *Params) error {
// if no username is provided assume root
if len(params.Login) == 0 {
params.Login = "root"
}
// if no username is provided assume root
if params.Port == 0 {
params.Port = 22
}
// join the host and port if necessary
host := net.JoinHostPort(
params.Host,
strconv.Itoa(params.Port),
)
signer, err := ssh.ParsePrivateKey([]byte(keys.Private))
if err != nil {
return fmt.Errorf("Error parsing private key. %s.", err)
}
config := &ssh.ClientConfig{
User: params.Login,
Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)},
}
client, err := ssh.Dial("tcp", host, config)
if err != nil {
return fmt.Errorf("Error dialing server. %s.", err)
}
session, err := client.NewSession()
if err != nil {
return fmt.Errorf("Error starting ssh session. %s.", err)
}
defer session.Close()
session.Stdout = os.Stdout
session.Stderr = os.Stderr
return session.Run(strings.Join(params.Commands, "\n"))
}