Add database

This commit is contained in:
Manfred Touron 2017-10-30 16:48:14 +01:00
parent 84e8352338
commit b2701e2024
4 changed files with 78 additions and 10 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
*.db

View file

@ -1,9 +1,10 @@
package main
import (
"os"
"fmt"
"github.com/gliderlabs/ssh"
"github.com/jinzhu/gorm"
gossh "golang.org/x/crypto/ssh"
)
@ -12,18 +13,25 @@ type Config struct {
remoteAddr string
}
func getConfig(s ssh.Session) (*Config, error) {
// TODO: get the config from a database
func getConfig(s ssh.Session, db *gorm.DB) (*Config, error) {
var host Host
db.Where("name = ?", s.User()).Find(&host)
if host.Name == "" {
// FIXME: add available hosts
return nil, fmt.Errorf("No such target: %q", s.User())
}
config := Config{
remoteAddr: os.Getenv("SSH_ADDR"),
remoteAddr: host.Addr,
clientConfig: &gossh.ClientConfig{
User: os.Getenv("SSH_USERNAME"),
HostKeyCallback: gossh.InsecureIgnoreHostKey(), // TODO: show the remote host to the client + store it in db if approved
Auth: []gossh.AuthMethod{
gossh.Password(os.Getenv("SSH_PASSWORD")),
},
User: host.User,
HostKeyCallback: gossh.InsecureIgnoreHostKey(),
Auth: []gossh.AuthMethod{},
},
}
if host.Password != "" {
config.clientConfig.Auth = append(config.clientConfig.Auth, gossh.Password(host.Password))
}
return &config, nil
}

35
db.go Normal file
View file

@ -0,0 +1,35 @@
package main
import "github.com/jinzhu/gorm"
type Key struct {
gorm.Model
}
type Host struct {
gorm.Model
Name string
Addr string
User string
Password string
Key Key
}
type User struct {
gorm.Model
Keys []Key
}
func dbInit(db *gorm.DB) error {
db.LogMode(true)
db.AutoMigrate(&User{})
db.AutoMigrate(&Key{})
db.AutoMigrate(&Host{})
return nil
}
func dbDemo(db *gorm.DB) error {
var host Host
db.FirstOrCreate(&host, &Host{Name: "sdf", Addr: "sdf.org:22", User: "new"})
return nil
}

26
main.go
View file

@ -9,6 +9,8 @@ import (
"path"
"github.com/gliderlabs/ssh"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
"github.com/urfave/cli"
)
@ -37,6 +39,14 @@ func main() {
Name: "demo",
Usage: "*unsafe* - demo mode: accept all connections",
},
cli.StringFlag{
Name: "db-driver",
Value: "sqlite3",
},
cli.StringFlag{
Name: "db-conn",
Value: "./sshportal.db",
},
// TODO: add verbose mode
// TODO: add web server
}
@ -45,6 +55,20 @@ func main() {
}
func server(c *cli.Context) error {
db, err := gorm.Open(c.String("db-driver"), c.String("db-conn"))
if err != nil {
return err
}
defer db.Close()
if err := dbInit(db); err != nil {
return err
}
if c.Bool("demo") {
if err := dbDemo(db); err != nil {
return err
}
}
ssh.Handle(func(s ssh.Session) {
log.Printf("New connection: user=%q remote=%q local=%q command=%q", s.User(), s.RemoteAddr(), s.LocalAddr(), s.Command())
@ -53,7 +77,7 @@ func server(c *cli.Context) error {
io.WriteString(s, banner)
io.WriteString(s, "Configuration menu not yet implemented.\n\n")
default:
config, err := getConfig(s)
config, err := getConfig(s, db)
if err != nil {
io.WriteString(s, fmt.Sprintf("error: %v\n", err))
// FIXME: drop a menu shell?