with '#' will be ignored, and an empty message aborts the commit. Author: Ethan Alicea <64653625+Tech-Gamer@users.noreply.github.com> On branch develop Your branch is up to date with 'origin/develop'. Changes to be committed: modified: .github/workflows/push.yaml modified: .github/workflows/release.yaml modified: CHANGELOG.md modified: Dockerfile modified: Makefile modified: README.md modified: cmd/configure.go modified: cmd/diagnostics.go modified: cmd/root.go modified: config/config.go modified: environment/allocations.go modified: environment/docker.go modified: environment/docker/api.go modified: environment/docker/container.go modified: environment/docker/environment.go modified: environment/docker/power.go modified: environment/docker/stats.go modified: environment/environment.go modified: environment/settings.go modified: events/events.go modified: go.mod modified: internal/cron/activity_cron.go modified: internal/cron/cron.go modified: internal/cron/sftp_cron.go modified: internal/database/database.go modified: internal/progress/progress.go modified: internal/progress/progress_test.go modified: loggers/cli/cli.go new file: oryxBuildBinary modified: parser/parser.go modified: remote/http.go modified: remote/servers.go modified: remote/types.go modified: router/downloader/downloader.go modified: router/middleware.go modified: router/middleware/middleware.go modified: router/middleware/request_error.go modified: router/router.go modified: router/router_download.go modified: router/router_server.go modified: router/router_server_backup.go modified: router/router_server_files.go modified: router/router_server_transfer.go modified: router/router_server_ws.go modified: router/router_system.go modified: router/router_transfer.go modified: router/tokens/parser.go modified: router/websocket/listeners.go modified: router/websocket/websocket.go modified: server/activity.go modified: server/backup.go modified: server/backup/backup.go modified: server/backup/backup_local.go modified: server/backup/backup_s3.go modified: server/configuration.go modified: server/console.go modified: server/crash.go modified: server/events.go modified: server/filesystem/archive.go modified: server/filesystem/filesystem.go modified: server/filesystem/filesystem_test.go modified: server/install.go modified: server/installer/installer.go modified: server/listeners.go modified: server/manager.go modified: server/mounts.go modified: server/power.go modified: server/power_test.go modified: server/resources.go modified: server/server.go modified: server/transfer/archive.go modified: server/transfer/source.go modified: server/transfer/transfer.go modified: server/update.go modified: sftp/event.go modified: sftp/handler.go modified: sftp/server.go modified: wings.go
67 lines
2.3 KiB
Go
67 lines
2.3 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"emperror.dev/errors"
|
|
|
|
"github.com/Tech-Gamer/nwy-wings/internal/database"
|
|
"github.com/Tech-Gamer/nwy-wings/internal/models"
|
|
)
|
|
|
|
const ActivityPowerPrefix = "server:power."
|
|
|
|
const (
|
|
ActivityConsoleCommand = models.Event("server:console.command")
|
|
ActivitySftpWrite = models.Event("server:sftp.write")
|
|
ActivitySftpCreate = models.Event("server:sftp.create")
|
|
ActivitySftpCreateDirectory = models.Event("server:sftp.create-directory")
|
|
ActivitySftpRename = models.Event("server:sftp.rename")
|
|
ActivitySftpDelete = models.Event("server:sftp.delete")
|
|
ActivityFileUploaded = models.Event("server:file.uploaded")
|
|
)
|
|
|
|
// RequestActivity is a wrapper around a LoggedEvent that is able to track additional request
|
|
// specific metadata including the specific user and IP address associated with all subsequent
|
|
// events. The internal logged event structure can be extracted by calling RequestEvent.Event().
|
|
type RequestActivity struct {
|
|
server string
|
|
user string
|
|
ip string
|
|
}
|
|
|
|
// Event returns the underlying logged event from the RequestEvent instance and sets the
|
|
// specific event and metadata on it.
|
|
func (ra RequestActivity) Event(event models.Event, metadata models.ActivityMeta) *models.Activity {
|
|
a := models.Activity{Server: ra.server, IP: ra.ip, Event: event, Metadata: metadata}
|
|
|
|
return a.SetUser(ra.user)
|
|
}
|
|
|
|
// SetUser clones the RequestActivity struct and sets a new user value on the copy
|
|
// before returning it.
|
|
func (ra RequestActivity) SetUser(u string) RequestActivity {
|
|
c := ra
|
|
c.user = u
|
|
return c
|
|
}
|
|
|
|
func (s *Server) NewRequestActivity(user string, ip string) RequestActivity {
|
|
return RequestActivity{server: s.ID(), user: user, ip: ip}
|
|
}
|
|
|
|
// SaveActivity saves an activity entry to the database in a background routine. If an error is
|
|
// encountered it is logged but not returned to the caller.
|
|
func (s *Server) SaveActivity(a RequestActivity, event models.Event, metadata models.ActivityMeta) {
|
|
ctx, cancel := context.WithTimeout(s.Context(), time.Second*3)
|
|
go func() {
|
|
defer cancel()
|
|
if tx := database.Instance().WithContext(ctx).Create(a.Event(event, metadata)); tx.Error != nil {
|
|
s.Log().WithField("error", errors.WithStack(tx.Error)).
|
|
WithField("event", event).
|
|
Error("activity: failed to save event")
|
|
}
|
|
}()
|
|
}
|