@@ -4,10 +4,10 @@ import (
44 "fmt"
55 "os"
66 "path/filepath"
7- "strconv"
87 "strings"
98
109 "github.com/BurntSushi/toml"
10+ "github.com/caarlos0/env/v11"
1111)
1212
1313type Config struct {
@@ -21,36 +21,36 @@ type Config struct {
2121}
2222
2323type TrueNAS struct {
24- Host string `toml:"host"`
25- Port int `toml:"port"`
26- Username string `toml:"username"`
27- APIKey string `toml:"api_key"`
28- InsecureSkipVerify * bool `toml:"insecure_skip_verify"`
24+ Host string `toml:"host" env:"PIXELS_TRUENAS_HOST" `
25+ Port int `toml:"port" env:"PIXELS_TRUENAS_PORT" `
26+ Username string `toml:"username" env:"PIXELS_TRUENAS_USERNAME" `
27+ APIKey string `toml:"api_key" env:"PIXELS_TRUENAS_API_KEY" `
28+ InsecureSkipVerify * bool `toml:"insecure_skip_verify" env:"PIXELS_TRUENAS_INSECURE" `
2929}
3030
3131type Defaults struct {
32- Image string `toml:"image"`
33- CPU string `toml:"cpu"`
34- Memory int64 `toml:"memory"` // MiB
35- Pool string `toml:"pool"`
36- NICType string `toml:"nic_type"` // "macvlan" or "bridged"
37- Parent string `toml:"parent"` // parent interface (e.g. "eno1", "br0")
32+ Image string `toml:"image" env:"PIXELS_DEFAULT_IMAGE "`
33+ CPU string `toml:"cpu" env:"PIXELS_DEFAULT_CPU "`
34+ Memory int64 `toml:"memory" env:"PIXELS_DEFAULT_MEMORY "` // MiB
35+ Pool string `toml:"pool" env:"PIXELS_DEFAULT_POOL "`
36+ NICType string `toml:"nic_type"` // "macvlan" or "bridged"
37+ Parent string `toml:"parent"` // parent interface (e.g. "eno1", "br0")
3838 Network string `toml:"network"` // Incus network name (e.g. "incusbr0")
3939 DNS []string `toml:"dns"` // nameservers to write into containers
4040}
4141
4242type SSH struct {
43- User string `toml:"user"`
44- Key string `toml:"key"`
43+ User string `toml:"user" env:"PIXELS_SSH_USER" `
44+ Key string `toml:"key" env:"PIXELS_SSH_KEY" `
4545}
4646
4747type Checkpoint struct {
48- DatasetPrefix string `toml:"dataset_prefix"`
48+ DatasetPrefix string `toml:"dataset_prefix" env:"PIXELS_CHECKPOINT_DATASET_PREFIX" `
4949}
5050
5151type Provision struct {
52- Enabled * bool `toml:"enabled"`
53- DevTools * bool `toml:"devtools"`
52+ Enabled * bool `toml:"enabled" env:"PIXELS_PROVISION_ENABLED" `
53+ DevTools * bool `toml:"devtools" env:"PIXELS_PROVISION_DEVTOOLS" `
5454}
5555
5656func (p * Provision ) IsEnabled () bool {
@@ -68,7 +68,7 @@ func (p *Provision) DevToolsEnabled() bool {
6868}
6969
7070type Network struct {
71- Egress string `toml:"egress"`
71+ Egress string `toml:"egress" env:"PIXELS_NETWORK_EGRESS" `
7272 Allow []string `toml:"allow"`
7373}
7474
@@ -103,21 +103,9 @@ func Load() (*Config, error) {
103103 }
104104 }
105105
106- applyEnv (& cfg .TrueNAS .Host , "PIXELS_TRUENAS_HOST" )
107- applyEnv (& cfg .TrueNAS .Username , "PIXELS_TRUENAS_USERNAME" )
108- applyEnv (& cfg .TrueNAS .APIKey , "PIXELS_TRUENAS_API_KEY" )
109- applyEnvInt (& cfg .TrueNAS .Port , "PIXELS_TRUENAS_PORT" )
110- applyEnvBool (& cfg .TrueNAS .InsecureSkipVerify , "PIXELS_TRUENAS_INSECURE" )
111- applyEnv (& cfg .Defaults .Image , "PIXELS_DEFAULT_IMAGE" )
112- applyEnv (& cfg .Defaults .CPU , "PIXELS_DEFAULT_CPU" )
113- applyEnvInt64 (& cfg .Defaults .Memory , "PIXELS_DEFAULT_MEMORY" )
114- applyEnv (& cfg .Defaults .Pool , "PIXELS_DEFAULT_POOL" )
115- applyEnv (& cfg .SSH .User , "PIXELS_SSH_USER" )
116- applyEnv (& cfg .SSH .Key , "PIXELS_SSH_KEY" )
117- applyEnv (& cfg .Checkpoint .DatasetPrefix , "PIXELS_CHECKPOINT_DATASET_PREFIX" )
118- applyEnvBool (& cfg .Provision .Enabled , "PIXELS_PROVISION_ENABLED" )
119- applyEnvBool (& cfg .Provision .DevTools , "PIXELS_PROVISION_DEVTOOLS" )
120- applyEnv (& cfg .Network .Egress , "PIXELS_NETWORK_EGRESS" )
106+ if err := env .Parse (cfg ); err != nil {
107+ return nil , fmt .Errorf ("parsing environment: %w" , err )
108+ }
121109
122110 cfg .SSH .Key = expandHome (cfg .SSH .Key )
123111
@@ -136,37 +124,6 @@ func configPath() string {
136124 return filepath .Join (dir , "pixels" , "config.toml" )
137125}
138126
139- func applyEnv (dst * string , key string ) {
140- if v := os .Getenv (key ); v != "" {
141- * dst = v
142- }
143- }
144-
145- func applyEnvInt (dst * int , key string ) {
146- if v := os .Getenv (key ); v != "" {
147- if n , err := strconv .Atoi (v ); err == nil {
148- * dst = n
149- }
150- }
151- }
152-
153- func applyEnvInt64 (dst * int64 , key string ) {
154- if v := os .Getenv (key ); v != "" {
155- if n , err := strconv .ParseInt (v , 10 , 64 ); err == nil {
156- * dst = n
157- }
158- }
159- }
160-
161- func applyEnvBool (dst * * bool , key string ) {
162- if v := os .Getenv (key ); v != "" {
163- b , err := strconv .ParseBool (v )
164- if err == nil {
165- * dst = & b
166- }
167- }
168- }
169-
170127// InsecureSkipVerify returns whether TLS verification should be skipped.
171128// Defaults to true (skip) when not explicitly set, since most TrueNAS boxes use self-signed certs.
172129func (t * TrueNAS ) InsecureSkipVerifyValue () bool {
0 commit comments