Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ require (
github.com/urfave/cli/v3 v3.8.0
github.com/varlink/go v0.4.0
golang.org/x/sync v0.20.0
gopkg.in/yaml.v3 v3.0.1
tailscale.com v1.96.5
)

Expand Down Expand Up @@ -526,7 +527,6 @@ require (
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/mail.v2 v2.3.1 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gotest.tools/v3 v3.5.2 // indirect
honnef.co/go/tools v0.7.0-0.dev.0.20251022135355-8273271481d0 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
Expand Down
10 changes: 9 additions & 1 deletion internal/app/server/client/globals.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ import (
"github.com/sargassum-world/godest/turbostreams"

"github.com/openUC2/device-admin/internal/app/server/conf"
"github.com/openUC2/device-admin/internal/clients/identity"
"github.com/openUC2/device-admin/internal/clients/networkmanager"
"github.com/openUC2/device-admin/internal/clients/sidecar"
"github.com/openUC2/device-admin/internal/clients/tailscale"
"github.com/openUC2/device-admin/internal/clients/templates"
"github.com/openUC2/device-admin/internal/clients/udisks2"
"github.com/openUC2/device-admin/internal/clients/versioning"
)

// Server
Expand All @@ -32,10 +34,13 @@ type Globals struct {
Config conf.Config
Base *BaseGlobals

Sidecar *sidecar.Client
Sidecar *sidecar.Client

Identity *identity.Client
NetworkManager *networkmanager.Client
Tailscale *tailscale.Client
UDisks2 *udisks2.Client
Versioning *versioning.Client
}

func NewBaseGlobals(config conf.Config, l godest.Logger) (g *BaseGlobals, err error) {
Expand Down Expand Up @@ -70,9 +75,12 @@ func NewGlobals(config conf.Config, l godest.Logger) (g *Globals, err error) {
}

g.Sidecar = sidecar.NewClient(config.Sidecar)

g.Identity = identity.NewClient(identity.Config{}, g.Base.Logger)
g.NetworkManager = networkmanager.NewClient(networkmanager.Config{}, g.Base.Logger)
g.Tailscale = tailscale.NewClient(tailscale.Config{}, g.Base.Logger)
g.UDisks2 = udisks2.NewClient(udisks2.Config{}, g.Base.Logger)
g.Versioning = versioning.NewClient(versioning.Config{}, g.Base.Logger)

return g, nil
}
77 changes: 53 additions & 24 deletions internal/app/server/routes/home/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,38 @@
package home

import (
"context"
"strings"

"github.com/labstack/echo/v4"
"github.com/pkg/errors"
"github.com/sargassum-world/godest"

"github.com/openUC2/device-admin/internal/clients/identity"
"github.com/openUC2/device-admin/internal/clients/tailscale"
"github.com/openUC2/device-admin/internal/clients/versioning"
)

type Handlers struct {
r godest.TemplateRenderer

ic *identity.Client
vc *versioning.Client
tsc *tailscale.Client

l godest.Logger
}

func New(r godest.TemplateRenderer, l godest.Logger) *Handlers {
func New(
r godest.TemplateRenderer, ic *identity.Client, vc *versioning.Client, tsc *tailscale.Client,
l godest.Logger,
) *Handlers {
return &Handlers{
r: r,
l: l,
r: r,
ic: ic,
vc: vc,
tsc: tsc,
l: l,
}
}

Expand All @@ -29,36 +44,50 @@ func (h *Handlers) Register(er godest.EchoRouter) {
}
}

type HomeViewData struct {
Hostname string
Port string
}

func getHomeViewData(host string) (vd HomeViewData, err error) {
split := strings.Split(host, ":")
const expectedComponents = 2
if len(split) > expectedComponents {
return HomeViewData{}, errors.Errorf(
"unable to split host '%s' into a hostname and a port", host,
)
}
vd.Hostname = split[0]
if len(split) == expectedComponents {
vd.Port = split[expectedComponents-1]
}
return vd, nil
}

func (h *Handlers) HandleHomeGet() echo.HandlerFunc {
t := "home/index.page.tmpl"
h.r.MustHave(t)
return func(c echo.Context) error {
// Run queries
homeViewData, err := getHomeViewData(c.Request().Host)
homeViewData, err := getHomeViewData(c.Request().Context(), h.vc, h.ic, h.tsc)
if err != nil {
return err
}
// Produce output
return h.r.CacheablePage(c.Response(), c.Request(), t, homeViewData, struct{}{})
}
}

type HomeViewData struct {
ForkliftVersioning versioning.Forklift
MachineName string
Hostname string
TailscaleDNS string
}

func getHomeViewData(
ctx context.Context, vc *versioning.Client, ic *identity.Client, tsc *tailscale.Client,
) (vd HomeViewData, err error) {
vd.ForkliftVersioning, err = vc.GetForklift()
if err != nil {
return vd, err
}

vd.MachineName, _ = ic.GetMachineName()
vd.Hostname, _ = ic.GetHostname()
vd.TailscaleDNS, _ = getTailscaleDNSName(ctx, tsc)

return vd, nil
}

func getTailscaleDNSName(ctx context.Context, tsc *tailscale.Client) (name string, err error) {
status, err := tsc.GetStatus(ctx)
if err != nil {
return "", errors.Wrap(err, "couldn't get tailscale daemon status")
}
selfStatus := status.Self
if selfStatus == nil {
return "", nil
}
return selfStatus.DNSName, nil
}
2 changes: 2 additions & 0 deletions internal/app/server/routes/internet/conn-profiles.go
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,8 @@ func updateConnProfile(
if err := checkConnProfile(formValues); err != nil {
return err
}
// TODO: if the conn profile is generated from drop-in files and the updateType is safe, then also
// use the sidecar to modify the drop-in files appropriately
return nmc.UpdateConnProfileByUUID(ctx, uid, updateType, updateValues)
}

Expand Down
2 changes: 1 addition & 1 deletion internal/app/server/routes/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func (h *Handlers) Register(er godest.EchoRouter, tsr turbostreams.Router, em go
cable.New(
h.r, h.globals.Base.ACSigner, h.globals.Base.TSBroker, l,
).Register(er)
home.New(h.r, l).Register(er)
home.New(h.r, h.globals.Identity, h.globals.Versioning, h.globals.Tailscale, l).Register(er)
identity.New(h.r).Register(er)
internet.New(h.r, tsh, h.globals.NetworkManager, h.globals.Sidecar, l).Register(er, tsr)
h.remote = remote.New(h.r, h.globals.Tailscale)
Expand Down
1 change: 1 addition & 0 deletions internal/clients/diskusage/du.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// Package diskusage exposes information about the machine's filesystem disk usage
package diskusage

import (
Expand Down
61 changes: 61 additions & 0 deletions internal/clients/identity/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// Package identity loads and exposes identity information about the machine
package identity

import (
"cmp"
"os"
"strings"

"github.com/pkg/errors"
"github.com/sargassum-world/godest"
)

type Config struct {
MachineNamePath string
}

type Client struct {
Config Config

l godest.Logger
}

func NewClient(c Config, l godest.Logger) *Client {
return &Client{
Config: c,
l: l,
}
}

func (c *Client) GetMachineName() (name string, err error) {
p := cmp.Or(c.Config.MachineNamePath, "/run/machine-name")
lines, err := readFile(p)
if err != nil {
return "", errors.Wrapf(err, "couldn't read machine name file %s", p)
}
return strings.Join(lines, ""), nil
}

func readFile(filePath string) (lines []string, err error) {
if lines, err = readLines(filePath); err != nil {
return nil, errors.Wrapf(err, "couldn't read file %s", filePath)
}
for i, l := range lines {
before, _, _ := strings.Cut(l, "#")
lines[i] = strings.TrimSpace(before)
}
return lines, nil
}

func readLines(filePath string) ([]string, error) {
contents, err := os.ReadFile(filePath) //nolint:gosec // We trust this file
if err != nil {
return nil, errors.Wrapf(err, "couldn't read file %s", filePath)
}

return strings.Split(string(contents), "\n"), nil
}

func (c *Client) GetHostname() (name string, err error) {
return os.Hostname()
}
55 changes: 55 additions & 0 deletions internal/clients/versioning/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// Package versioning loads and exposes versioning information about the machine
package versioning

import (
"cmp"
"os"

"github.com/pkg/errors"
"github.com/sargassum-world/godest"
"gopkg.in/yaml.v3"
)

type Config struct {
ForkliftPath string
}

type Client struct {
Config Config

l godest.Logger
}

func NewClient(c Config, l godest.Logger) *Client {
return &Client{
Config: c,
l: l,
}
}

type Forklift struct {
Factory string `yaml:"factory,omitempty"`
Current string `yaml:"current,omitempty"`
Pallet string `yaml:"pallet,omitempty"`
UpgradeSource string `yaml:"upgrade-source,omitempty"`
Upgrade string `yaml:"upgrade,omitempty"`
}

func (c *Client) GetForklift() (f Forklift, err error) {
p := cmp.Or(c.Config.ForkliftPath, "/run/versioning/forklift.yml")
if f, err = readForklift(p); err != nil {
return f, errors.Wrapf(err, "couldn't read Forklift versioning file %s", p)
}
return f, nil
}

func readForklift(filePath string) (f Forklift, err error) {
bytes, err := os.ReadFile(filePath) //nolint:gosec // We trust this file
if err != nil {
return f, errors.Wrapf(err, "couldn't read Forklift versioning report %s", filePath)
}
if err = yaml.Unmarshal(bytes, &f); err != nil {
return f, errors.Wrap(err, "couldn't parse Forklift versioning report")
}
return f, nil
}
Loading
Loading