Commit c6f2b1f1 authored by Kevin Lyda's avatar Kevin Lyda
Browse files

Update go deps; add sessions

Enable a SHOW USERS command.  Update go tools.
parent f660b111
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -16,8 +16,8 @@ require (
	golang.org/x/crypto v0.48.0
	golang.org/x/sys v0.41.0
	golang.org/x/term v0.40.0
	golang.org/x/time v0.12.0
	modernc.org/sqlite v1.46.0
	golang.org/x/time v0.14.0
	modernc.org/sqlite v1.46.1
)

require (
@@ -98,11 +98,11 @@ require (
	go.uber.org/multierr v1.11.0 // indirect
	go.uber.org/zap v1.27.0 // indirect
	go.yaml.in/yaml/v3 v3.0.4 // indirect
	golang.org/x/exp v0.0.0-20260212183809-81e46e3db34a // indirect
	golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa // indirect
	golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 // indirect
	golang.org/x/mod v0.33.0 // indirect
	golang.org/x/net v0.50.0 // indirect
	golang.org/x/pkgsite v0.0.0-20260212172942-ce44214c045b // indirect
	golang.org/x/pkgsite v0.0.0-20260220170115-bf658f25df2c // indirect
	golang.org/x/sync v0.19.0 // indirect
	golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4 // indirect
	golang.org/x/text v0.34.0 // indirect
+8 −0
Original line number Diff line number Diff line
@@ -259,6 +259,8 @@ golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=
golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
golang.org/x/exp v0.0.0-20260212183809-81e46e3db34a h1:ovFr6Z0MNmU7nH8VaX5xqw+05ST2uO1exVfZPVqRC5o=
golang.org/x/exp v0.0.0-20260212183809-81e46e3db34a/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA=
golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0=
golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA=
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 h1:1P7xPZEwZMoBoz0Yze5Nx2/4pxj6nw9ZqHWXqP0iRgQ=
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
@@ -275,6 +277,8 @@ golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60=
golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM=
golang.org/x/pkgsite v0.0.0-20260212172942-ce44214c045b h1:v/TCE4eB4FyeNBm0p6/6U52Ok1fvGyP0SXxe4a30BJM=
golang.org/x/pkgsite v0.0.0-20260212172942-ce44214c045b/go.mod h1:XO+pNgdObWUAp1KSqmAG+7+vXaUj2EQySRvgDftfKJo=
golang.org/x/pkgsite v0.0.0-20260220170115-bf658f25df2c h1:MCiSQrKnPXwEw9HS/oAl4Y3FzcmiVKxG2SpYiqhMD8E=
golang.org/x/pkgsite v0.0.0-20260220170115-bf658f25df2c/go.mod h1:XO+pNgdObWUAp1KSqmAG+7+vXaUj2EQySRvgDftfKJo=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -307,6 +311,8 @@ golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -383,6 +389,8 @@ modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
modernc.org/sqlite v1.46.0 h1:pCVOLuhnT8Kwd0gjzPwqgQW1KW2XFpXyJB6cCw11jRE=
modernc.org/sqlite v1.46.0/go.mod h1:CzbrU2lSB1DKUusvwGz7rqEKIq+NUd8GWuBBZDs9/nA=
modernc.org/sqlite v1.46.1 h1:eFJ2ShBLIEnUWlLy12raN0Z1plqmFX9Qe3rjQTKt6sU=
modernc.org/sqlite v1.46.1/go.mod h1:CzbrU2lSB1DKUusvwGz7rqEKIq+NUd8GWuBBZDs9/nA=
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
+8 −1
Original line number Diff line number Diff line
@@ -1567,7 +1567,7 @@ that folder cannot be removed.`,
The following options are available:

  CREATE      FLAGS       FOLDER      NEW         PRIVILEGES  SYSTEM
  USER        VERSION
  USER        USERS       VERSION
`,
		Action: ActionShow,
		Commands: dclish.Commands{
@@ -1676,6 +1676,13 @@ have done this.`,
					},
				},
			},
			"USERS": {
				Description: `Shows a list of users currently logged into BULLETIN.

  Format:
    SHOW USERS`,
				Action: ActionShowUsers,
			},
			"VERSION": {
				Description: `  Shows the  version of BULLETIN  and the  date that the  executable was
  linked.`,
+5 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ import (
	"unicode"

	"git.lyda.ie/pp/bulletin/dclish"
	"git.lyda.ie/pp/bulletin/storage"
	"git.lyda.ie/pp/bulletin/this"
	"github.com/adrg/xdg"
	"github.com/chzyer/readline"
@@ -41,6 +42,10 @@ func Loop() error {
		return err
	}
	defer rl.Close()
	defer func() {
		ctx := storage.Context()
		_ = this.Q.DeleteSession(ctx, this.User.Login, int64(os.Getpid())) // #nosec G104 -- best-effort cleanup
	}()

	missing := []string{}
	for _, entry := range cmdTable {
+30 −0
Original line number Diff line number Diff line
@@ -358,6 +358,36 @@ func countFolders() int {
	return len(folders)
}

// ActionShowUsers handles the `SHOW USERS` command.
func ActionShowUsers(_ *dclish.Command) error {
	ctx := storage.Context()
	sessions, err := this.Q.GetSessions(ctx)
	if err != nil {
		fmt.Printf("ERROR: Failed to get sessions (%s).\n", err)
		return nil
	}

	if len(sessions) == 0 {
		fmt.Println("No users are currently logged in.")
		return nil
	}

	now := time.Now()
	fmt.Printf("%-12s  %-19s  %s\n", "Username", "Login Time", "Idle")
	for _, s := range sessions {
		idle := now.Sub(s.LastSeenAt)
		h := int(idle.Hours())
		m := int(idle.Minutes()) % 60
		sec := int(idle.Seconds()) % 60
		fmt.Printf("%-12s  %s  %d:%02d:%02d\n",
			s.Login,
			s.LoginAt.Local().Format("2006-01-02 15:04:05"),
			h, m, sec)
	}
	fmt.Printf("\nTotal: %d user(s) connected.\n", len(sessions))
	return nil
}

// ActionShowVersion handles the `SHOW VERSION` command.
func ActionShowVersion(_ *dclish.Command) error {
	rev := versioninfo.Revision
Loading