Skip to content

Commit

Permalink
Add option to run gravity after sync
Browse files Browse the repository at this point in the history
  • Loading branch information
lovelaze committed Mar 5, 2025
1 parent 78738d2 commit fa75f9f
Show file tree
Hide file tree
Showing 10 changed files with 301 additions and 148 deletions.
97 changes: 44 additions & 53 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,17 @@ import (
)

type Config struct {
Primary model.PiHole `required:"true" envconfig:"PRIMARY"`
Replicas []model.PiHole `required:"true" envconfig:"REPLICAS"`
FullSync bool `required:"true" envconfig:"FULL_SYNC"`
Cron *string `envconfig:"CRON"`
ClientSettings *ClientSettings `ignored:"true"`
SyncSettings *SyncSettings `ignored:"true"`
Primary model.PiHole `required:"true" envconfig:"PRIMARY"`
Replicas []model.PiHole `required:"true" envconfig:"REPLICAS"`
Client *Client `ignored:"true"`
Sync *Sync `ignored:"true"`
}

type ClientSettings struct {
type Client struct {
SkipSSLVerification bool `default:"false" envconfig:"CLIENT_SKIP_TLS_VERIFICATION"`
}

func (cs *ClientSettings) NewHttpClient() *http.Client {
return &http.Client{
Timeout: 5 * time.Second,
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: cs.SkipSSLVerification},
},
}
}

type ManualGravity struct {
type GravitySettings struct {
DHCPLeases bool `default:"false" envconfig:"SYNC_GRAVITY_DHCP_LEASES"`
Group bool `default:"false" envconfig:"SYNC_GRAVITY_GROUP"`
Adlist bool `default:"false" envconfig:"SYNC_GRAVITY_AD_LIST"`
Expand All @@ -44,7 +33,7 @@ type ManualGravity struct {
ClientByGroup bool `default:"false" envconfig:"SYNC_GRAVITY_CLIENT_BY_GROUP"`
}

type ManualConfig struct {
type ConfigSettings struct {
DNS bool `default:"false" envconfig:"SYNC_CONFIG_DNS"`
DHCP bool `default:"false" envconfig:"SYNC_CONFIG_DHCP"`
NTP bool `default:"false" envconfig:"SYNC_CONFIG_NTP"`
Expand All @@ -56,56 +45,49 @@ type ManualConfig struct {
Debug bool `default:"false" envconfig:"SYNC_CONFIG_DEBUG"`
}

type SyncSettings struct {
Gravity *ManualGravity `ignored:"true"`
Config *ManualConfig `ignored:"true"`
type Sync struct {
FullSync bool `required:"true" envconfig:"FULL_SYNC"`
Cron *string `envconfig:"CRON"`
RunGravity bool `default:"false" envconfig:"RUN_GRAVITY"`
GravitySettings *GravitySettings
ConfigSettings *ConfigSettings
}

func (c *Config) Load() error {
if err := envconfig.Process("", c); err != nil {
return fmt.Errorf("env vars: %w", err)
}

if err := c.loadClientSettings(); err != nil {
if err := c.loadClient(); err != nil {
return err
}

if !c.FullSync {
if err := c.loadSyncSettings(); err != nil {
return err
}
if err := c.loadSync(); err != nil {
return err
}

return nil
}

func (c *Config) loadClientSettings() error {
clientSettings := ClientSettings{}
func (c *Config) loadClient() error {
client := Client{}

if err := envconfig.Process("", &clientSettings); err != nil {
if err := envconfig.Process("", &client); err != nil {
return fmt.Errorf("client env vars: %w", err)
}

c.ClientSettings = &clientSettings
c.Client = &client

return nil
}

func (c *Config) loadSyncSettings() error {
manualGravity := ManualGravity{}
if err := envconfig.Process("", &manualGravity); err != nil {
return fmt.Errorf("gravity env vars: %w", err)
}

manualConfig := ManualConfig{}
if err := envconfig.Process("", &manualConfig); err != nil {
return fmt.Errorf("config env vars: %w", err)
}

c.SyncSettings = &SyncSettings{
Gravity: &manualGravity,
Config: &manualConfig,
func (c *Config) loadSync() error {
sync := Sync{}
if err := envconfig.Process("", &sync); err != nil {
return fmt.Errorf("sync env vars: %w", err)
}

c.Sync = &sync
return nil
}

Expand All @@ -121,19 +103,28 @@ func (c *Config) String() string {
}

cron := ""
if c.Cron != nil {
cron = *c.Cron
if c.Sync.Cron != nil {
cron = *c.Sync.Cron
}

syncSettings := ""
if c.SyncSettings != nil {
if mc := c.SyncSettings.Config; mc != nil {
syncSettings += fmt.Sprintf("config=%+v", *mc)
sync := ""
if c.Sync != nil {
if mc := c.Sync.ConfigSettings; mc != nil {
sync += fmt.Sprintf("config=%+v", *mc)
}
if gc := c.SyncSettings.Gravity; gc != nil {
syncSettings += fmt.Sprintf(", gravity=%+v", *gc)
if gc := c.Sync.GravitySettings; gc != nil {
sync += fmt.Sprintf(", gravity=%+v", *gc)
}
}

return fmt.Sprintf("primary=%s, replicas=%s, fullSync=%t, cron=%s, syncSettings=%s", c.Primary.Url, replicas, c.FullSync, cron, syncSettings)
return fmt.Sprintf("primary=%s, replicas=%s, fullSync=%t, cron=%s, sync=%s", c.Primary.Url, replicas, c.Sync.FullSync, cron, sync)
}

func (cs *Client) NewHttpClient() *http.Client {
return &http.Client{
Timeout: 20 * time.Second,
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: cs.SkipSSLVerification},
},
}
}
65 changes: 35 additions & 30 deletions internal/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ func TestConfig_Load(t *testing.T) {

t.Setenv("PRIMARY", "http://localhost:1337|asdf")
t.Setenv("REPLICAS", "http://localhost:1338|qwerty")
t.Setenv("FULL_SYNC", "true")
t.Setenv("CRON", "* * * * *")
t.Setenv("FULL_SYNC", "false")

err := conf.Load()
require.NoError(t, err)
Expand All @@ -23,14 +22,16 @@ func TestConfig_Load(t *testing.T) {
assert.Len(t, conf.Replicas, 1)
assert.Equal(t, "http://localhost:1338", conf.Replicas[0].Url.String())
assert.Equal(t, "qwerty", conf.Replicas[0].Password)
assert.Equal(t, true, conf.FullSync)
assert.Equal(t, "* * * * *", *conf.Cron)
assert.Nil(t, conf.SyncSettings)
assert.Equal(t, false, conf.Sync.FullSync)
}

func TestConfig_loadSyncSettings(t *testing.T) {
func TestConfig_loadSync(t *testing.T) {
conf := Config{}
assert.Nil(t, conf.SyncSettings)
assert.Nil(t, conf.Sync)

t.Setenv("FULL_SYNC", "true")
t.Setenv("CRON", "* * * * *")
t.Setenv("RUN_GRAVITY", "true")

t.Setenv("SYNC_CONFIG_DNS", "true")
t.Setenv("SYNC_CONFIG_DHCP", "true")
Expand All @@ -49,39 +50,43 @@ func TestConfig_loadSyncSettings(t *testing.T) {
t.Setenv("SYNC_GRAVITY_CLIENT", "true")
t.Setenv("SYNC_GRAVITY_CLIENT_BY_GROUP", "true")

err := conf.loadSyncSettings()
err := conf.loadSync()
require.NoError(t, err)

assert.NotNil(t, conf.SyncSettings.Config)
assert.NotNil(t, conf.SyncSettings.Gravity)

assert.True(t, conf.SyncSettings.Config.DNS)
assert.True(t, conf.SyncSettings.Config.DHCP)
assert.True(t, conf.SyncSettings.Config.NTP)
assert.True(t, conf.SyncSettings.Config.Resolver)
assert.True(t, conf.SyncSettings.Config.Database)
assert.True(t, conf.SyncSettings.Config.Misc)
assert.True(t, conf.SyncSettings.Config.Debug)

assert.True(t, conf.SyncSettings.Gravity.DHCPLeases)
assert.True(t, conf.SyncSettings.Gravity.Group)
assert.True(t, conf.SyncSettings.Gravity.Adlist)
assert.True(t, conf.SyncSettings.Gravity.AdlistByGroup)
assert.True(t, conf.SyncSettings.Gravity.Domainlist)
assert.True(t, conf.SyncSettings.Gravity.DomainlistByGroup)
assert.True(t, conf.SyncSettings.Gravity.Client)
assert.True(t, conf.SyncSettings.Gravity.ClientByGroup)
assert.Equal(t, true, conf.Sync.FullSync)
assert.Equal(t, "* * * * *", *conf.Sync.Cron)
assert.Equal(t, true, conf.Sync.RunGravity)

assert.NotNil(t, conf.Sync.ConfigSettings)
assert.NotNil(t, conf.Sync.GravitySettings)

assert.True(t, conf.Sync.ConfigSettings.DNS)
assert.True(t, conf.Sync.ConfigSettings.DHCP)
assert.True(t, conf.Sync.ConfigSettings.NTP)
assert.True(t, conf.Sync.ConfigSettings.Resolver)
assert.True(t, conf.Sync.ConfigSettings.Database)
assert.True(t, conf.Sync.ConfigSettings.Misc)
assert.True(t, conf.Sync.ConfigSettings.Debug)

assert.True(t, conf.Sync.GravitySettings.DHCPLeases)
assert.True(t, conf.Sync.GravitySettings.Group)
assert.True(t, conf.Sync.GravitySettings.Adlist)
assert.True(t, conf.Sync.GravitySettings.AdlistByGroup)
assert.True(t, conf.Sync.GravitySettings.Domainlist)
assert.True(t, conf.Sync.GravitySettings.DomainlistByGroup)
assert.True(t, conf.Sync.GravitySettings.Client)
assert.True(t, conf.Sync.GravitySettings.ClientByGroup)
}

func TestConfig_LoadClientSettings(t *testing.T) {
func TestConfig_LoadClient(t *testing.T) {
conf := Config{}

t.Setenv("CLIENT_SKIP_TLS_VERIFICATION", "true")

err := conf.loadClientSettings()
err := conf.loadClient()
require.NoError(t, err)

assert.Equal(t, true, conf.ClientSettings.SkipSSLVerification)
assert.Equal(t, true, conf.Client.SkipSSLVerification)
}

func TestConfig_LoadEnvFile(t *testing.T) {
Expand Down
45 changes: 45 additions & 0 deletions internal/mocks/pihole/Client.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit fa75f9f

Please sign in to comment.