From a5fd348b9608515e21da9ff7e6a2107fc79ed034 Mon Sep 17 00:00:00 2001 From: Patrick Pacher Date: Fri, 3 Apr 2020 14:16:52 +0200 Subject: [PATCH 1/3] Export netenv event names --- netenv/main.go | 8 ++++---- netenv/network-change.go | 32 +++++++++++++++----------------- netenv/online-status.go | 26 +++++++++++--------------- 3 files changed, 30 insertions(+), 36 deletions(-) diff --git a/netenv/main.go b/netenv/main.go index d8d07b3c..2c360d6d 100644 --- a/netenv/main.go +++ b/netenv/main.go @@ -5,8 +5,8 @@ import ( ) const ( - networkChangedEvent = "network changed" - onlineStatusChangedEvent = "online status changed" + NetworkChangedEvent = "network changed" + OnlineStatusChangedEvent = "online status changed" ) var ( @@ -15,8 +15,8 @@ var ( func init() { module = modules.Register("netenv", nil, start, nil) - module.RegisterEvent(networkChangedEvent) - module.RegisterEvent(onlineStatusChangedEvent) + module.RegisterEvent(NetworkChangedEvent) + module.RegisterEvent(OnlineStatusChangedEvent) } func start() error { diff --git a/netenv/network-change.go b/netenv/network-change.go index 8e1a9f68..63f9b066 100644 --- a/netenv/network-change.go +++ b/netenv/network-change.go @@ -29,23 +29,21 @@ serviceLoop: for { trigger := false + timeout := time.Minute + if GetOnlineStatus() != StatusOnline { + timeout = time.Second + } // wait for trigger - if GetOnlineStatus() == StatusOnline { - select { - case <-ctx.Done(): - return nil - case <-networkChangeCheckTrigger: - case <-time.After(1 * time.Minute): - trigger = true - } - } else { - select { - case <-ctx.Done(): - return nil - case <-networkChangeCheckTrigger: - case <-time.After(1 * time.Second): - trigger = true - } + select { + case <-ctx.Done(): + return nil + case <-networkChangeCheckTrigger: + // don't fall through because the online change check + // triggers the networkChangeCheck this way. If we would set + // trigger == true we would trigger the online check again + // resulting in a loop of pointless checks. + case <-time.After(timeout): + trigger = true } // check network for changes @@ -84,7 +82,7 @@ serviceLoop: if trigger { triggerOnlineStatusInvestigation() } - module.TriggerEvent(networkChangedEvent, nil) + module.TriggerEvent(NetworkChangedEvent, nil) } } diff --git a/netenv/online-status.go b/netenv/online-status.go index c1773cb7..a9880844 100644 --- a/netenv/online-status.go +++ b/netenv/online-status.go @@ -156,7 +156,7 @@ func updateOnlineStatus(status OnlineStatus, portalURL, comment string) { // trigger event if changed { - module.TriggerEvent(onlineStatusChangedEvent, nil) + module.TriggerEvent(OnlineStatusChangedEvent, nil) if status == StatusPortal { log.Infof(`network: setting online status to %s at "%s" (%s)`, status, captivePortalURL, comment) } else { @@ -201,21 +201,17 @@ func triggerOnlineStatusInvestigation() { func monitorOnlineStatus(ctx context.Context) error { for { + timeout := time.Minute + if GetOnlineStatus() != StatusOnline { + timeout = time.Second + } // wait for trigger - if GetOnlineStatus() == StatusOnline { - select { - case <-ctx.Done(): - return nil - case <-onlineStatusInvestigationTrigger: - case <-time.After(1 * time.Minute): - } - } else { - select { - case <-ctx.Done(): - return nil - case <-onlineStatusInvestigationTrigger: - case <-time.After(1 * time.Second): - } + select { + case <-ctx.Done(): + return nil + case <-onlineStatusInvestigationTrigger: + + case <-time.After(timeout): } // enable waiting From 85b5cf02a4e98dd7ba2ea7fd2d010998e54da6ff Mon Sep 17 00:00:00 2001 From: Patrick Pacher Date: Fri, 3 Apr 2020 14:17:33 +0200 Subject: [PATCH 2/3] Export updates module event names --- updates/config.go | 2 +- updates/export.go | 4 ++-- updates/get.go | 4 ++-- updates/main.go | 31 +++++++++++++++++++++++-------- updates/upgrader.go | 4 ++-- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/updates/config.go b/updates/config.go index 16f31842..c0070d6f 100644 --- a/updates/config.go +++ b/updates/config.go @@ -56,7 +56,7 @@ func updateRegistryConfig(_ context.Context, _ interface{}) error { if changed { registry.SelectVersions() - module.TriggerEvent(eventVersionUpdate, nil) + module.TriggerEvent(VersionUpdateEvent, nil) } return nil diff --git a/updates/export.go b/updates/export.go index 8d027ff5..b113819c 100644 --- a/updates/export.go +++ b/updates/export.go @@ -50,8 +50,8 @@ func initVersionExport() (err error) { } return module.RegisterEventHook( - "updates", - eventVersionUpdate, + ModuleName, + VersionUpdateEvent, "export version status", export, ) diff --git a/updates/get.go b/updates/get.go index b627d1b4..876b2d09 100644 --- a/updates/get.go +++ b/updates/get.go @@ -20,7 +20,7 @@ func GetPlatformFile(identifier string) (*updater.File, error) { return nil, err } - module.TriggerEvent(eventVersionUpdate, nil) + module.TriggerEvent(VersionUpdateEvent, nil) return file, nil } @@ -33,6 +33,6 @@ func GetFile(identifier string) (*updater.File, error) { return nil, err } - module.TriggerEvent(eventVersionUpdate, nil) + module.TriggerEvent(VersionUpdateEvent, nil) return file, nil } diff --git a/updates/main.go b/updates/main.go index 31bc3065..adbb7e28 100644 --- a/updates/main.go +++ b/updates/main.go @@ -19,8 +19,23 @@ const ( releaseChannelStable = "stable" releaseChannelBeta = "beta" - eventVersionUpdate = "active version update" - eventResourceUpdate = "resource update" + // ModuleName is the name of the update module + // and can be used when declaring module dependencies. + ModuleName = "updates" + + // VersionUpdateEvent is emitted every time a new + // version of a monitored resource is selected. + // During module initialization VersionUpdateEvent + // is also emitted. + VersionUpdateEvent = "active version update" + + // ResourceUpdateEvent is emitted every time the + // updater successfully performed a resource update. + // ResourceUpdateEvent is emitted even if no new + // versions are available. Subscribers are expected + // to check if new versions of their resources are + // available by checking File.UpgradeAvailable(). + ResourceUpdateEvent = "resource update" ) var ( @@ -29,9 +44,9 @@ var ( ) func init() { - module = modules.Register("updates", registerConfig, start, stop, "base") - module.RegisterEvent(eventVersionUpdate) - module.RegisterEvent(eventResourceUpdate) + module = modules.Register(ModuleName, registerConfig, start, stop, "base") + module.RegisterEvent(VersionUpdateEvent) + module.RegisterEvent(ResourceUpdateEvent) } func start() error { @@ -57,7 +72,7 @@ func start() error { // create registry registry = &updater.ResourceRegistry{ - Name: "updates", + Name: ModuleName, UpdateURLs: []string{ "https://updates.safing.io", }, @@ -83,7 +98,7 @@ func start() error { } registry.SelectVersions() - module.TriggerEvent(eventVersionUpdate, nil) + module.TriggerEvent(VersionUpdateEvent, nil) err = initVersionExport() if err != nil { @@ -96,7 +111,7 @@ func start() error { if err != nil { return fmt.Errorf("updates: failed to update: %s", err) } - module.TriggerEvent(eventResourceUpdate, nil) + module.TriggerEvent(ResourceUpdateEvent, nil) return nil }).Repeat(24 * time.Hour).MaxDelay(1 * time.Hour).Schedule(time.Now().Add(10 * time.Second)) diff --git a/updates/upgrader.go b/updates/upgrader.go index fff7855c..7029d207 100644 --- a/updates/upgrader.go +++ b/updates/upgrader.go @@ -37,8 +37,8 @@ var ( func initUpgrader() error { return module.RegisterEventHook( - "updates", - eventResourceUpdate, + ModuleName, + ResourceUpdateEvent, "run upgrades", upgrader, ) From a3a591740e8fa6f3d2fa359ee4b4c4f1b0a60941 Mon Sep 17 00:00:00 2001 From: Patrick Pacher Date: Fri, 3 Apr 2020 14:19:20 +0200 Subject: [PATCH 3/3] Fix geoip database upgrade handling --- intel/geoip/database.go | 8 ++++---- intel/geoip/module.go | 7 ++++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/intel/geoip/database.go b/intel/geoip/database.go index 96bf62d1..512ce0c0 100644 --- a/intel/geoip/database.go +++ b/intel/geoip/database.go @@ -59,20 +59,20 @@ func doReload() error { func openDBs() error { var err error - file, err := updates.GetFile("intel/geoip/geoip-city.mmdb") + dbCityFile, err = updates.GetFile("intel/geoip/geoip-city.mmdb") if err != nil { return fmt.Errorf("could not get GeoIP City database file: %s", err) } - dbCity, err = maxminddb.Open(file.Path()) + dbCity, err = maxminddb.Open(dbCityFile.Path()) if err != nil { return err } - file, err = updates.GetFile("intel/geoip/geoip-asn.mmdb") + dbASNFile, err = updates.GetFile("intel/geoip/geoip-asn.mmdb") if err != nil { return fmt.Errorf("could not get GeoIP ASN database file: %s", err) } - dbASN, err = maxminddb.Open(file.Path()) + dbASN, err = maxminddb.Open(dbASNFile.Path()) if err != nil { return err } diff --git a/intel/geoip/module.go b/intel/geoip/module.go index 94827e6a..be6a02ff 100644 --- a/intel/geoip/module.go +++ b/intel/geoip/module.go @@ -4,6 +4,7 @@ import ( "context" "github.com/safing/portbase/modules" + "github.com/safing/portmaster/updates" ) var ( @@ -16,9 +17,9 @@ func init() { func prep() error { return module.RegisterEventHook( - "updates", - "resource update", - "upgrade databases", + updates.ModuleName, + updates.ResourceUpdateEvent, + "Check for GeoIP database updates", upgradeDatabases, ) }