mirror of
https://github.com/veops/oneterm.git
synced 2025-10-07 08:10:57 +08:00
feat: add ssh server
This commit is contained in:
105
backend/pkg/proto/ssh/api/audit.go
Normal file
105
backend/pkg/proto/ssh/api/audit.go
Normal file
@@ -0,0 +1,105 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/go-resty/resty/v2"
|
||||
"go.uber.org/zap"
|
||||
|
||||
"github.com/veops/oneterm/pkg/logger"
|
||||
cfg "github.com/veops/oneterm/pkg/proto/ssh/config"
|
||||
"github.com/veops/oneterm/pkg/server/controller"
|
||||
"github.com/veops/oneterm/pkg/util"
|
||||
)
|
||||
|
||||
type AuditCore struct {
|
||||
Api string
|
||||
XToken string
|
||||
}
|
||||
|
||||
func NewAuditServer(Api, token string) *Auth {
|
||||
return &Auth{
|
||||
Api: Api,
|
||||
XToken: token,
|
||||
}
|
||||
}
|
||||
|
||||
type CommandLevel int
|
||||
|
||||
const (
|
||||
CommandLevelNormal = iota + 1
|
||||
CommandLevelReject
|
||||
)
|
||||
|
||||
func (a *AuditCore) NewSession(data any) error {
|
||||
_, err := request(resty.MethodPost,
|
||||
fmt.Sprintf("%s%s", strings.TrimSuffix(cfg.SSHConfig.Api, "/"), sessionUrl),
|
||||
map[string]string{
|
||||
"X-Token": cfg.SSHConfig.Token,
|
||||
}, nil, data)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (a *AuditCore) AddCommand(data any) {
|
||||
_, err := request(resty.MethodPost,
|
||||
fmt.Sprintf("%s%s", strings.TrimSuffix(cfg.SSHConfig.Api, "/"), sessionCmdUrl),
|
||||
map[string]string{
|
||||
"X-Token": cfg.SSHConfig.Token,
|
||||
"Content-Type": "application/json",
|
||||
}, nil, data)
|
||||
if err != nil {
|
||||
logger.L.Error(err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func AddReplay(sessionId string, data any) error {
|
||||
_, err := request(resty.MethodPost,
|
||||
fmt.Sprintf("%s%s/%s", strings.TrimSuffix(cfg.SSHConfig.Api, "/"), replayUrl, sessionId),
|
||||
map[string]string{
|
||||
"X-Token": cfg.SSHConfig.Token,
|
||||
}, nil, data)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func AddReplayFile(sessionId, filePath string) (err error) {
|
||||
var response *controller.HttpResponse
|
||||
r, er := resty.New().R().SetFile("replay.cast", filePath).
|
||||
SetHeader("X-Token", cfg.SSHConfig.Token).
|
||||
SetHeader("Content-Type", "application/json").
|
||||
SetBody(map[string]any{
|
||||
"session_id": sessionId,
|
||||
"body": "",
|
||||
}).SetResult(&response).Post(fmt.Sprintf("%s%s/%s", strings.TrimSuffix(cfg.SSHConfig.Api, "/"), replayFileUrl, sessionId))
|
||||
if er != nil {
|
||||
err = er
|
||||
return err
|
||||
}
|
||||
if r.StatusCode() != 200 {
|
||||
err = fmt.Errorf("auth code: %d: %s", r.StatusCode(), r.String())
|
||||
return
|
||||
}
|
||||
if response.Code != 0 {
|
||||
err = fmt.Errorf(response.Message)
|
||||
return
|
||||
}
|
||||
err = util.DecodeStruct(&response, response.Data)
|
||||
return err
|
||||
}
|
||||
|
||||
func GetCommandLevel(command string, commands []string) CommandLevel {
|
||||
for _, v := range commands {
|
||||
pattern, err := regexp.Compile(v)
|
||||
if err != nil {
|
||||
logger.L.Warn(err.Error(), zap.String("module", ""))
|
||||
continue
|
||||
}
|
||||
if pattern.MatchString(command) {
|
||||
return CommandLevelReject
|
||||
}
|
||||
}
|
||||
return CommandLevelNormal
|
||||
}
|
Reference in New Issue
Block a user