2022-04-09 21:53:37 +08:00
|
|
|
// Copyright 2022 The Goploy Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a GPLv3-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
2022-02-24 09:14:50 +08:00
|
|
|
package model
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
sq "github.com/Masterminds/squirrel"
|
|
|
|
)
|
|
|
|
|
|
|
|
const terminalLogTable = "`terminal_log`"
|
|
|
|
|
|
|
|
type TerminalLog struct {
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
NamespaceID int64 `json:"namespaceID"`
|
|
|
|
UserID int64 `json:"userID"`
|
|
|
|
Username string `json:"username"`
|
|
|
|
ServerID int64 `json:"serverID"`
|
|
|
|
ServerName string `json:"serverName"`
|
|
|
|
RemoteAddr string `json:"remoteAddr"`
|
|
|
|
UserAgent string `json:"userAgent"`
|
|
|
|
StartTime string `json:"startTime"`
|
|
|
|
EndTime string `json:"endTime"`
|
|
|
|
InsertTime string `json:"insertTime"`
|
|
|
|
UpdateTime string `json:"updateTime"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type TerminalLogs []TerminalLog
|
|
|
|
|
|
|
|
func (tl TerminalLog) GetData() (TerminalLog, error) {
|
|
|
|
var terminalLog TerminalLog
|
|
|
|
err := sq.
|
|
|
|
Select(
|
|
|
|
"id",
|
|
|
|
"namespace_id",
|
|
|
|
"user_id",
|
|
|
|
"server_id",
|
|
|
|
"remote_addr",
|
|
|
|
"user_agent",
|
|
|
|
"start_time",
|
|
|
|
"end_time",
|
|
|
|
).
|
|
|
|
From(terminalLogTable).
|
|
|
|
Where(sq.Eq{"id": tl.ID}).
|
|
|
|
OrderBy("id DESC").
|
|
|
|
RunWith(DB).
|
|
|
|
QueryRow().
|
|
|
|
Scan(&terminalLog.ID,
|
|
|
|
&terminalLog.NamespaceID,
|
|
|
|
&terminalLog.UserID,
|
|
|
|
&terminalLog.ServerID,
|
|
|
|
&terminalLog.RemoteAddr,
|
|
|
|
&terminalLog.UserAgent,
|
|
|
|
&terminalLog.StartTime,
|
|
|
|
&terminalLog.EndTime,
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return terminalLog, err
|
|
|
|
}
|
|
|
|
return terminalLog, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (tl TerminalLog) GetList(page, limit uint64) (TerminalLogs, error) {
|
|
|
|
builder := sq.
|
|
|
|
Select(
|
|
|
|
terminalLogTable+".id",
|
|
|
|
terminalLogTable+".namespace_id",
|
|
|
|
terminalLogTable+".user_id",
|
|
|
|
userTable+".name",
|
|
|
|
terminalLogTable+".server_id",
|
|
|
|
fmt.Sprintf("IFNULL(%s.name, '')", serverTable),
|
|
|
|
terminalLogTable+".remote_addr",
|
|
|
|
terminalLogTable+".user_agent",
|
|
|
|
terminalLogTable+".start_time",
|
|
|
|
terminalLogTable+".end_time",
|
|
|
|
).
|
|
|
|
From(terminalLogTable).
|
|
|
|
LeftJoin(fmt.Sprintf("%s ON %[1]s.id = %s.user_id", userTable, terminalLogTable)).
|
|
|
|
LeftJoin(fmt.Sprintf("%s ON %[1]s.id = %s.server_id", serverTable, terminalLogTable))
|
|
|
|
|
|
|
|
if tl.NamespaceID > 0 {
|
|
|
|
builder = builder.Where(sq.Eq{terminalLogTable + ".namespace_id": tl.NamespaceID})
|
|
|
|
}
|
|
|
|
if tl.Username != "" {
|
|
|
|
builder = builder.Where(sq.Eq{userTable + ".name": tl.Username})
|
|
|
|
}
|
|
|
|
if tl.ServerName != "" {
|
|
|
|
builder = builder.Where(sq.Eq{serverTable + ".name": tl.ServerName})
|
|
|
|
}
|
|
|
|
|
|
|
|
rows, err := builder.Limit(limit).Offset((page - 1) * limit).OrderBy("id DESC").
|
|
|
|
RunWith(DB).Query()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
terminalLogs := TerminalLogs{}
|
|
|
|
for rows.Next() {
|
|
|
|
var terminalLog TerminalLog
|
|
|
|
if err := rows.Scan(
|
|
|
|
&terminalLog.ID,
|
|
|
|
&terminalLog.NamespaceID,
|
|
|
|
&terminalLog.UserID,
|
|
|
|
&terminalLog.Username,
|
|
|
|
&terminalLog.ServerID,
|
|
|
|
&terminalLog.ServerName,
|
|
|
|
&terminalLog.RemoteAddr,
|
|
|
|
&terminalLog.UserAgent,
|
|
|
|
&terminalLog.StartTime,
|
|
|
|
&terminalLog.EndTime,
|
|
|
|
); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
terminalLogs = append(terminalLogs, terminalLog)
|
|
|
|
}
|
|
|
|
|
|
|
|
return terminalLogs, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (tl TerminalLog) GetTotal() (int64, error) {
|
|
|
|
var total int64
|
|
|
|
builder := sq.Select("COUNT(*) AS count").From(terminalLogTable)
|
|
|
|
|
|
|
|
if tl.NamespaceID > 0 {
|
|
|
|
builder = builder.Where(sq.Eq{terminalLogTable + ".namespace_id": tl.NamespaceID})
|
|
|
|
}
|
|
|
|
if tl.Username != "" {
|
|
|
|
builder = builder.
|
|
|
|
LeftJoin(fmt.Sprintf("%s ON %[1]s.id = %s.user_id", userTable, terminalLogTable)).
|
|
|
|
Where(sq.Eq{userTable + ".name": tl.Username})
|
|
|
|
}
|
|
|
|
if tl.ServerName != "" {
|
|
|
|
builder = builder.
|
|
|
|
LeftJoin(fmt.Sprintf("%s ON %[1]s.id = %s.server_id", serverTable, terminalLogTable)).
|
|
|
|
Where(sq.Eq{serverTable + ".name": tl.ServerName})
|
|
|
|
}
|
|
|
|
err := builder.RunWith(DB).QueryRow().Scan(&total)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return 0, err
|
|
|
|
}
|
|
|
|
return total, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (tl TerminalLog) AddRow() (int64, error) {
|
|
|
|
result, err := sq.
|
|
|
|
Insert(terminalLogTable).
|
|
|
|
Columns("namespace_id", "user_id", "server_id", "remote_addr", "user_agent", "start_time").
|
|
|
|
Values(tl.NamespaceID, tl.UserID, tl.ServerID, tl.RemoteAddr, tl.UserAgent, tl.StartTime).
|
|
|
|
RunWith(DB).
|
|
|
|
Exec()
|
|
|
|
if err != nil {
|
|
|
|
return 0, err
|
|
|
|
}
|
|
|
|
id, err := result.LastInsertId()
|
|
|
|
return id, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (tl TerminalLog) EditRow() error {
|
|
|
|
_, err := sq.
|
|
|
|
Update(terminalLogTable).
|
|
|
|
SetMap(sq.Eq{
|
|
|
|
"end_time": tl.EndTime,
|
|
|
|
}).
|
|
|
|
Where(sq.Eq{"id": tl.ID}).
|
|
|
|
RunWith(DB).
|
|
|
|
Exec()
|
|
|
|
return err
|
|
|
|
}
|