93 lines
1.5 KiB
Go
93 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
|
|
"m.cluseau.fr/go/watchable"
|
|
"novit.tech/direktil/pkg/localconfig"
|
|
)
|
|
|
|
type PublicState struct {
|
|
UIHash string
|
|
Store struct {
|
|
New bool
|
|
Open bool
|
|
}
|
|
}
|
|
|
|
var wPublicState = watchable.New[PublicState]()
|
|
|
|
type State struct {
|
|
HasConfig bool
|
|
|
|
Clusters []ClusterState
|
|
Hosts []HostState
|
|
Config *localconfig.Config
|
|
|
|
Downloads map[string]DownloadSpec
|
|
}
|
|
|
|
type ClusterState struct {
|
|
Name string
|
|
Addons bool
|
|
// TODO CAs
|
|
// TODO passwords
|
|
// TODO tokens
|
|
}
|
|
|
|
type HostState struct {
|
|
Name string
|
|
Cluster string
|
|
IPs []string
|
|
}
|
|
|
|
var wState = watchable.New[State]()
|
|
|
|
func init() {
|
|
wState.Set(State{Downloads: map[string]DownloadSpec{}})
|
|
}
|
|
|
|
func updateState() {
|
|
log.Print("updating state")
|
|
|
|
cfg, err := readConfig()
|
|
if err != nil {
|
|
wState.Change(func(v *State) { v.HasConfig = false; v.Config = nil })
|
|
return
|
|
}
|
|
|
|
if secStore.IsNew() || !secStore.Unlocked() {
|
|
wState.Change(func(v *State) { v.HasConfig = false; v.Config = nil })
|
|
return
|
|
}
|
|
|
|
// remove heavy data
|
|
clusters := make([]ClusterState, 0, len(cfg.Clusters))
|
|
for _, cluster := range cfg.Clusters {
|
|
c := ClusterState{
|
|
Name: cluster.Name,
|
|
Addons: len(cluster.Addons) != 0,
|
|
}
|
|
clusters = append(clusters, c)
|
|
}
|
|
|
|
hosts := make([]HostState, 0, len(cfg.Hosts))
|
|
for _, host := range cfg.Hosts {
|
|
h := HostState{
|
|
Name: host.Name,
|
|
Cluster: host.ClusterName,
|
|
IPs: host.IPs,
|
|
}
|
|
|
|
hosts = append(hosts, h)
|
|
}
|
|
|
|
// done
|
|
wState.Change(func(v *State) {
|
|
v.HasConfig = true
|
|
//v.Config = cfg
|
|
v.Clusters = clusters
|
|
v.Hosts = hosts
|
|
})
|
|
}
|