move pipe mgr to seperate files

This commit is contained in:
Boshi Lian 2019-01-07 01:57:55 -08:00
parent 1b9ad2dac4
commit c0ae381d48
5 changed files with 157 additions and 141 deletions

View file

@ -0,0 +1,75 @@
package database
import (
"fmt"
"github.com/jinzhu/gorm"
upstreamprovider "github.com/tg123/sshpiper/sshpiperd/upstream"
)
func (p *plugin) ListPipe() ([]upstreamprovider.Pipe, error) {
db := p.db
downstreams := make([]downstream, 0)
err := db.Set("gorm:auto_preload", true).Find(&downstreams).Error
if err != nil {
return nil, err
}
pipes := make([]upstreamprovider.Pipe, 0, len(downstreams))
for _, d := range downstreams {
host, port, err := upstreamprovider.SplitHostPortForSSH(d.Upstream.Server.Address)
if err != nil {
continue
}
upuser := d.Upstream.Username
if upuser == "" {
upuser = d.Username
}
pipes = append(pipes, upstreamprovider.Pipe{
Host: host,
Port: port,
Username: d.Username,
UpstreamUsername: upuser,
})
}
return pipes, nil
}
func (p *plugin) CreatePipe(opt upstreamprovider.CreatePipeOption) error {
db := p.db
return db.Create(&downstream{
Username: opt.Username,
Upstream: upstream{
Username: opt.UpstreamUsername,
AuthMapType: authMapTypeNone,
Server: server{
Address: fmt.Sprintf("%v:%v", opt.Host, opt.Port),
IgnoreHostKey: true,
},
},
}).Error
}
func (p *plugin) RemovePipe(name string) error {
db := p.db
d, err := lookupDownstream(db, name)
if err != nil {
if gorm.IsRecordNotFoundError(err) {
return nil
}
return err
}
return db.Unscoped().Delete(d).Error
}

View file

@ -1,7 +1,6 @@
package database
import (
"fmt"
"log"
"github.com/jinzhu/gorm"
@ -21,72 +20,6 @@ type plugin struct {
db *gorm.DB
}
func (p *plugin) ListPipe() ([]upstreamprovider.Pipe, error) {
db := p.db
downstreams := make([]downstream, 0)
err := db.Set("gorm:auto_preload", true).Find(&downstreams).Error
if err != nil {
return nil, err
}
pipes := make([]upstreamprovider.Pipe, 0, len(downstreams))
for _, d := range downstreams {
host, port, err := upstreamprovider.SplitHostPortForSSH(d.Upstream.Server.Address)
if err != nil {
continue
}
upuser := d.Upstream.Username
if upuser == "" {
upuser = d.Username
}
pipes = append(pipes, upstreamprovider.Pipe{
Host: host,
Port: port,
Username: d.Username,
UpstreamUsername: upuser,
})
}
return pipes, nil
}
func (p *plugin) CreatePipe(opt upstreamprovider.CreatePipeOption) error {
db := p.db
return db.Create(&downstream{
Username: opt.Username,
Upstream: upstream{
Username: opt.UpstreamUsername,
AuthMapType: authMapTypeNone,
Server: server{
Address: fmt.Sprintf("%v:%v", opt.Host, opt.Port),
IgnoreHostKey: true,
},
},
}).Error
}
func (p *plugin) RemovePipe(name string) error {
db := p.db
d, err := lookupDownstream(db, name)
if err != nil {
if gorm.IsRecordNotFoundError(err) {
return nil
}
return err
}
return db.Unscoped().Delete(d).Error
}
func (p *plugin) GetHandler() upstreamprovider.Handler {
return p.findUpstream
}

View file

@ -30,12 +30,7 @@ type Pipe struct {
Port int
}
// Provider is a factory for Upstream Provider
type Provider interface {
registry.Plugin
GetHandler() Handler
type PipeManager interface {
ListPipe() ([]Pipe, error)
CreatePipe(opt CreatePipeOption) error
@ -43,6 +38,14 @@ type Provider interface {
RemovePipe(name string) error
}
// Provider is a factory for Upstream Provider
type Provider interface {
registry.Plugin
PipeManager
GetHandler() Handler
}
var (
drivers = registry.NewRegistry()
)

View file

@ -0,0 +1,72 @@
package workingdir
import (
"fmt"
"io/ioutil"
"os"
"github.com/tg123/sshpiper/sshpiperd/upstream"
)
func (p *plugin) ListPipe() ([]upstream.Pipe, error) {
files, err := ioutil.ReadDir(config.WorkingDir)
if err != nil {
return nil, err
}
pipes := make([]upstream.Pipe, 0, len(files))
for _, file := range files {
if !file.IsDir() {
continue
}
data, err := userUpstreamFile.read(file.Name())
if err != nil {
continue
}
host, port, mappedUser, err := parseUpstreamFile(string(data))
pipes = append(pipes, upstream.Pipe{
Host: host,
Port: port,
Username: file.Name(),
UpstreamUsername: mappedUser,
})
}
return pipes, nil
}
func (p *plugin) CreatePipe(opt upstream.CreatePipeOption) error {
err := os.MkdirAll(config.WorkingDir+"/"+opt.Username, 0775)
if err != nil {
return err
}
path := userUpstreamFile.realPath(opt.Username)
if _, err := os.Stat(path); os.IsNotExist(err) {
upuser := opt.UpstreamUsername
if len(upuser) == 0 {
upuser = opt.Username
}
content := fmt.Sprintf("%v@%v:%v", upuser, opt.Host, opt.Port)
return ioutil.WriteFile(path, []byte(content), 0600)
} else if err != nil {
return err
}
return fmt.Errorf("upstream file of [%v] alreay exists", opt.Username)
}
func (p *plugin) RemovePipe(name string) error {
path := userUpstreamFile.realPath(name)
if _, err := os.Stat(path); os.IsNotExist(err) {
return nil
}
return os.Remove(path)
}

View file

@ -1,12 +1,8 @@
package workingdir
import (
"fmt"
"io/ioutil"
"log"
"os"
"github.com/tg123/sshpiper/sshpiperd/upstream"
"log"
)
var logger *log.Logger
@ -14,69 +10,6 @@ var logger *log.Logger
type plugin struct {
}
func (p *plugin) ListPipe() ([]upstream.Pipe, error) {
files, err := ioutil.ReadDir(config.WorkingDir)
if err != nil {
return nil, err
}
pipes := make([]upstream.Pipe, 0, len(files))
for _, file := range files {
if !file.IsDir() {
continue
}
data, err := userUpstreamFile.read(file.Name())
if err != nil {
continue
}
host, port, mappedUser, err := parseUpstreamFile(string(data))
pipes = append(pipes, upstream.Pipe{
Host: host,
Port: port,
Username: file.Name(),
UpstreamUsername: mappedUser,
})
}
return pipes, nil
}
func (p *plugin) CreatePipe(opt upstream.CreatePipeOption) error {
err := os.MkdirAll(config.WorkingDir+"/"+opt.Username, 0775)
if err != nil {
return err
}
path := userUpstreamFile.realPath(opt.Username)
if _, err := os.Stat(path); os.IsNotExist(err) {
upuser := opt.UpstreamUsername
if len(upuser) == 0 {
upuser = opt.Username
}
content := fmt.Sprintf("%v@%v:%v", upuser, opt.Host, opt.Port)
return ioutil.WriteFile(path, []byte(content), 0600)
} else if err != nil {
return err
}
return fmt.Errorf("upstream file of [%v] alreay exists", opt.Username)
}
func (p *plugin) RemovePipe(name string) error {
path := userUpstreamFile.realPath(name)
if _, err := os.Stat(path); os.IsNotExist(err) {
return nil
}
return os.Remove(path)
}
func (p *plugin) GetName() string {
return "workingdir"
}