Skip to content

Commit

Permalink
Add support for address_internal
Browse files Browse the repository at this point in the history
  • Loading branch information
leighmacdonald committed Jan 18, 2025
1 parent aa4594d commit fe60129
Show file tree
Hide file tree
Showing 12 changed files with 79 additions and 33 deletions.
2 changes: 2 additions & 0 deletions frontend/src/api/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ export interface Server extends TimeStamped {
enable_stats: boolean;
log_secret: number;
token_created_on: Date;
address_internal: string;
}

export interface Location {
Expand Down Expand Up @@ -92,6 +93,7 @@ export interface SaveServerOpts {
is_enabled: boolean;
enable_stats: boolean;
log_secret: number;
address_internal: string;
}

export const apiCreateServer = async (opts: SaveServerOpts) =>
Expand Down
18 changes: 16 additions & 2 deletions frontend/src/component/modal/ServerEditorModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ type ServerEditValues = {
short_name: string;
name: string;
address: string;
address_internal: string;
port: string;
password: string;
rcon: string;
Expand Down Expand Up @@ -50,7 +51,8 @@ export const ServerEditorModal = NiceModal.create(({ server }: { server?: Server
reserved_slots: Number(values.reserved_slots),
is_enabled: values.is_enabled,
enable_stats: values.enabled_stats,
log_secret: Number(values.log_secret)
log_secret: Number(values.log_secret),
address_internal: values.address_internal
};
if (server?.server_id) {
modal.resolve(await apiSaveServer(server.server_id, opts));
Expand Down Expand Up @@ -80,7 +82,8 @@ export const ServerEditorModal = NiceModal.create(({ server }: { server?: Server
reserved_slots: server ? String(server.reserved_slots) : '0',
is_enabled: server ? server.is_enabled : true,
enabled_stats: server ? server.enable_stats : true,
log_secret: server ? String(server.log_secret) : ''
log_secret: server ? String(server.log_secret) : '',
address_internal: server ? server.address_internal : ''
}
});

Expand Down Expand Up @@ -143,6 +146,17 @@ export const ServerEditorModal = NiceModal.create(({ server }: { server?: Server
}}
/>
</Grid>
<Grid xs={8}>
<Field
name={'address_internal'}
validators={{
onChange: z.string()
}}
children={(props) => {
return <TextFieldSimple {...props} label={'Address Internal'} />;
}}
/>
</Grid>
<Grid xs={4}>
<Field
name={'password'}
Expand Down
3 changes: 1 addition & 2 deletions internal/cmd/serve.go
Original file line number Diff line number Diff line change
Expand Up @@ -424,8 +424,7 @@ func serveCmd() *cobra.Command { //nolint:maintidx
}
}()

periodicJons := createPeriodicJobs()
queueClient, errClient := queue.Client(dbConn.Pool(), workers, periodicJons)
queueClient, errClient := queue.Client(dbConn.Pool(), workers, createPeriodicJobs())
if errClient != nil {
slog.Error("Failed to setup job queue", log.ErrAttr(errClient))

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
BEGIN;

ALTER TABLE config
DROP COLUMN IF EXISTS address_internal;

COMMIT;
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
BEGIN;

ALTER TABLE server
ADD COLUMN address_internal text not null default '';

COMMIT;
9 changes: 6 additions & 3 deletions internal/demo/fetcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ var (
errFailedToList = errors.New("failed to list files")
errFailedOpenFile = errors.New("failed to open file")
errFailedReadFile = errors.New("failed to read file")
errCloseReader = errors.New("failed to close file reader")
)

func (d Fetcher) OnClientConnect(ctx context.Context, client storage.Storager, servers []domain.Server) error {
Expand All @@ -105,7 +106,7 @@ func (d Fetcher) OnClientConnect(ctx context.Context, client storage.Storager, s

demoPath := path.Join(demoDir, file.Name())

slog.Debug("Downloading demo", slog.String("name", file.Name()))
slog.Info("Downloading demo", slog.String("name", file.Name()), slog.String("server", server.ShortName))

reader, err := client.Open(ctx, demoPath)
if err != nil {
Expand All @@ -119,7 +120,9 @@ func (d Fetcher) OnClientConnect(ctx context.Context, client storage.Storager, s
return errors.Join(errRead, errFailedReadFile)
}

_ = reader.Close()
if errClose := reader.Close(); errClose != nil {
return errors.Join(errClose, errCloseReader)
}

// need Seeker, but afs does not provide
demo := UploadedDemo{Name: file.Name(), Server: server, Content: data}
Expand All @@ -136,7 +139,7 @@ func (d Fetcher) OnClientConnect(ctx context.Context, client storage.Storager, s
slog.Error("Failed to cleanup demo", log.ErrAttr(errDelete), slog.String("path", demoPath))
}

slog.Debug("Deleted demo on remote host", slog.String("path", demoPath))
slog.Info("Deleted demo on remote host", slog.String("path", demoPath))
}
}

Expand Down
11 changes: 11 additions & 0 deletions internal/domain/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ type RequestServerUpdate struct {
IsEnabled bool `json:"is_enabled"`
EnableStats bool `json:"enable_stats"`
LogSecret int `json:"log_secret"`
AddressInternal string `json:"address_internal"`
}

type ServerInfoSafe struct {
Expand Down Expand Up @@ -89,6 +90,8 @@ type Server struct {
Name string `json:"name"`
// Address is the ip of the server
Address string `json:"address"`
// Internal/VPN network. When defined its used for things like pulling demos over ssh.
AddressInternal string `json:"address_internal"`
// Port is the port of the server
Port int `json:"port"`
// RCON is the RCON password for the server
Expand Down Expand Up @@ -129,6 +132,14 @@ func (s Server) Addr() string {
return fmt.Sprintf("%s:%d", s.Address, s.Port)
}

func (s Server) AddrInternalOrDefault() string {
if s.AddressInternal != "" {
return s.AddressInternal
}

return s.Address
}

func (s Server) Slots(statusSlots int) int {
return statusSlots - s.ReservedSlots
}
Expand Down
9 changes: 6 additions & 3 deletions internal/network/scp.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,13 @@ func (f SCPExecer) Update(ctx context.Context) error {
mappedServers := map[string][]domain.Server{}

for _, server := range servers {
_, ok := mappedServers[server.Address]
actualAddr := server.AddrInternalOrDefault()
_, ok := mappedServers[actualAddr]
if !ok {
mappedServers[server.Address] = []domain.Server{}
mappedServers[actualAddr] = []domain.Server{}
}

mappedServers[server.Address] = append(mappedServers[server.Address], server)
mappedServers[actualAddr] = append(mappedServers[actualAddr], server)
}

sshConfig := f.config.Config().SSH
Expand Down Expand Up @@ -228,6 +229,8 @@ func (f SCPExecer) trustedHostKeyCallback(ctx context.Context) ssh.HostKeyCallba
if errSet := setKey(addr.String(), pubKeyString); errSet != nil {
return errSet
}

trustedPubKeyString = pubKeyString
}

if trustedPubKeyString != pubKeyString {
Expand Down
31 changes: 13 additions & 18 deletions internal/servers/servers_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func (r *serversRepository) GetServer(ctx context.Context, serverID int) (domain
Builder().
Select("server_id", "short_name", "name", "address", "port", "rcon", "password",
"token_created_on", "created_on", "updated_on", "reserved_slots", "is_enabled", "region", "cc",
"latitude", "longitude", "deleted", "log_secret", "enable_stats").
"latitude", "longitude", "deleted", "log_secret", "enable_stats", "address_internal").
From("server").
Where(sq.And{sq.Eq{"server_id": serverID}, sq.Eq{"deleted": false}}))
if rowErr != nil {
Expand All @@ -39,7 +39,7 @@ func (r *serversRepository) GetServer(ctx context.Context, serverID int) (domain
&server.Password, &tokenTime, &server.CreatedOn, &server.UpdatedOn,
&server.ReservedSlots, &server.IsEnabled, &server.Region, &server.CC,
&server.Latitude, &server.Longitude,
&server.Deleted, &server.LogSecret, &server.EnableStats); errScan != nil {
&server.Deleted, &server.LogSecret, &server.EnableStats, &server.AddressInternal); errScan != nil {
return server, r.db.DBErr(errScan)
}

Expand Down Expand Up @@ -101,7 +101,7 @@ func (r *serversRepository) GetServers(ctx context.Context, filter domain.Server
Builder().
Select("s.server_id", "s.short_name", "s.name", "s.address", "s.port", "s.rcon", "s.password",
"s.token_created_on", "s.created_on", "s.updated_on", "s.reserved_slots", "s.is_enabled", "s.region", "s.cc",
"s.latitude", "s.longitude", "s.deleted", "s.log_secret", "s.enable_stats").
"s.latitude", "s.longitude", "s.deleted", "s.log_secret", "s.enable_stats", "s.address_internal").
From("server s")

var constraints sq.And
Expand All @@ -118,7 +118,7 @@ func (r *serversRepository) GetServers(ctx context.Context, filter domain.Server
"s.": {
"server_id", "short_name", "name", "address", "port",
"token_created_on", "created_on", "updated_on", "reserved_slots", "is_enabled", "region", "cc",
"latitude", "longitude", "deleted", "enable_stats",
"latitude", "longitude", "deleted", "enable_stats", "address_internal",
},
}, "short_name")

Expand All @@ -143,7 +143,7 @@ func (r *serversRepository) GetServers(ctx context.Context, filter domain.Server
Scan(&server.ServerID, &server.ShortName, &server.Name, &server.Address, &server.Port, &server.RCON,
&server.Password, &tokenDate, &server.CreatedOn, &server.UpdatedOn, &server.ReservedSlots,
&server.IsEnabled, &server.Region, &server.CC, &server.Latitude, &server.Longitude,
&server.Deleted, &server.LogSecret, &server.EnableStats); errScan != nil {
&server.Deleted, &server.LogSecret, &server.EnableStats, &server.AddressInternal); errScan != nil {
return nil, 0, errors.Join(errScan, domain.ErrScanResult)
}

Expand Down Expand Up @@ -184,15 +184,13 @@ func (r *serversRepository) GetServerByName(ctx context.Context, serverName stri
Builder().
Select("server_id", "short_name", "name", "address", "port", "rcon", "password",
"token_created_on", "created_on", "updated_on", "reserved_slots", "is_enabled", "region", "cc",
"latitude", "longitude", "deleted", "log_secret", "enable_stats").
"latitude", "longitude", "deleted", "log_secret", "enable_stats", "address_internal").
From("server").
Where(and))
if errRow != nil {
return r.db.DBErr(errRow)
}

var tokenTime *time.Time

if err := row.Scan(
&server.ServerID,
&server.ShortName,
Expand All @@ -202,14 +200,10 @@ func (r *serversRepository) GetServerByName(ctx context.Context, serverName stri
&server.RCON,
&server.Password, &server.TokenCreatedOn, &server.CreatedOn, &server.UpdatedOn, &server.ReservedSlots,
&server.IsEnabled, &server.Region, &server.CC, &server.Latitude, &server.Longitude,
&server.Deleted, &server.LogSecret, &server.EnableStats); err != nil {
&server.Deleted, &server.LogSecret, &server.EnableStats, &server.AddressInternal); err != nil {
return r.db.DBErr(err)
}

if tokenTime != nil {
server.TokenCreatedOn = *tokenTime
}

return nil
}

Expand All @@ -227,7 +221,7 @@ func (r *serversRepository) GetServerByPassword(ctx context.Context, serverPassw
Builder().
Select("server_id", "short_name", "name", "address", "port", "rcon", "password",
"token_created_on", "created_on", "updated_on", "reserved_slots", "is_enabled", "region", "cc",
"latitude", "longitude", "deleted", "log_secret", "enable_stats").
"latitude", "longitude", "deleted", "log_secret", "enable_stats", "address_internal").
From("server").
Where(and))
if errRow != nil {
Expand All @@ -239,7 +233,7 @@ func (r *serversRepository) GetServerByPassword(ctx context.Context, serverPassw
if err := row.Scan(&server.ServerID, &server.ShortName, &server.Name, &server.Address, &server.Port,
&server.RCON, &server.Password, &tokenTime, &server.CreatedOn, &server.UpdatedOn,
&server.ReservedSlots, &server.IsEnabled, &server.Region, &server.CC, &server.Latitude,
&server.Longitude, &server.Deleted, &server.LogSecret, &server.EnableStats); err != nil {
&server.Longitude, &server.Deleted, &server.LogSecret, &server.EnableStats, &server.AddressInternal); err != nil {
return r.db.DBErr(err)
}

Expand All @@ -264,14 +258,14 @@ func (r *serversRepository) insertServer(ctx context.Context, server *domain.Ser
INSERT INTO server (
short_name, name, address, port, rcon, token_created_on,
reserved_slots, created_on, updated_on, password, is_enabled, region, cc, latitude, longitude,
deleted, log_secret, enable_stats)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18)
deleted, log_secret, enable_stats, address_internal)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19)
RETURNING server_id;`

err := r.db.QueryRow(ctx, nil, query, server.ShortName, server.Name, server.Address, server.Port,
server.RCON, server.TokenCreatedOn, server.ReservedSlots, server.CreatedOn, server.UpdatedOn,
server.Password, server.IsEnabled, server.Region, server.CC,
server.Latitude, server.Longitude, server.Deleted, &server.LogSecret, &server.EnableStats).
server.Latitude, server.Longitude, server.Deleted, &server.LogSecret, &server.EnableStats, &server.AddressInternal).
Scan(&server.ServerID)
if err != nil {
return r.db.DBErr(err)
Expand Down Expand Up @@ -303,5 +297,6 @@ func (r *serversRepository) updateServer(ctx context.Context, server *domain.Ser
Set("longitude", server.Longitude).
Set("log_secret", server.LogSecret).
Set("enable_stats", server.EnableStats).
Set("address_internal", server.AddressInternal).
Where(sq.Eq{"server_id": server.ServerID})))
}
11 changes: 7 additions & 4 deletions internal/servers/servers_usecase.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,16 @@ import (
"github.com/leighmacdonald/gbans/internal/domain"
)

func NewServersUsecase(repository domain.ServersRepository) domain.ServersUsecase {
return &serversUsecase{repository: repository}
}

type serversUsecase struct {
repository domain.ServersRepository
}

// Delete performs a soft delete of the server. We use soft deleted because we dont wand to delete all the relationships
// that rely on this suchs a stats.
func (s *serversUsecase) Delete(ctx context.Context, serverID int) error {
if serverID <= 0 {
return domain.ErrInvalidParameter
Expand All @@ -26,10 +32,6 @@ func (s *serversUsecase) Delete(ctx context.Context, serverID int) error {
return s.repository.SaveServer(ctx, &server)
}

func NewServersUsecase(repository domain.ServersRepository) domain.ServersUsecase {
return &serversUsecase{repository: repository}
}

func (s *serversUsecase) Server(ctx context.Context, serverID int) (domain.Server, error) {
if serverID <= 0 {
return domain.Server{}, domain.ErrGetServer
Expand Down Expand Up @@ -82,6 +84,7 @@ func (s *serversUsecase) Save(ctx context.Context, req domain.RequestServerUpdat
server.IsEnabled = req.IsEnabled
server.LogSecret = req.LogSecret
server.EnableStats = req.EnableStats
server.AddressInternal = req.AddressInternal

if err := s.repository.SaveServer(ctx, &server); err != nil {
return domain.Server{}, err
Expand Down
2 changes: 1 addition & 1 deletion internal/state/collector.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import (

var (
ErrRCONCommand = errors.New("failed to execute rcon command")
ErrFailedToDialRCON = errors.New("failed to connect to conf")
ErrFailedToDialRCON = errors.New("failed to dial rcon")
)

type Collector struct {
Expand Down
4 changes: 4 additions & 0 deletions internal/state/state_usecase.go
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,10 @@ func (s *stateUsecase) Broadcast(ctx context.Context, serverIDs []int, cmd strin

resp, errExec := s.state.ExecRaw(egCtx, serverConf.Addr(), serverConf.RconPassword, cmd)
if errExec != nil {
if errors.Is(errExec, context.Canceled) {
return nil
}

slog.Error("Failed to exec server command", slog.String("name", serverConf.DefaultHostname),
slog.Int("server_id", sid), log.ErrAttr(errExec))

Expand Down

0 comments on commit fe60129

Please sign in to comment.