* control: enable/disable filter: move code to a separate function

* don't start updating all filters after 1 filter has been enabled
* unload filter data on disable
This commit is contained in:
Simon Zolin 2019-03-18 14:12:04 +03:00
parent afa54a1339
commit ae2c7d00a9
2 changed files with 36 additions and 24 deletions

View File

@ -688,24 +688,12 @@ func handleFilteringEnableURL(w http.ResponseWriter, r *http.Request) {
return return
} }
found := false found := filterEnable(url, true)
config.Lock()
for i := range config.Filters {
filter := &config.Filters[i] // otherwise we will be operating on a copy
if filter.URL == url {
filter.Enabled = true
found = true
}
}
config.Unlock()
if !found { if !found {
http.Error(w, "URL parameter was not previously added", http.StatusBadRequest) http.Error(w, "URL parameter was not previously added", http.StatusBadRequest)
return return
} }
// kick off refresh of rules from new URLs
refreshFiltersIfNecessary(false)
httpUpdateConfigReloadDNSReturnOK(w, r) httpUpdateConfigReloadDNSReturnOK(w, r)
} }
@ -728,17 +716,7 @@ func handleFilteringDisableURL(w http.ResponseWriter, r *http.Request) {
return return
} }
found := false found := filterEnable(url, false)
config.Lock()
for i := range config.Filters {
filter := &config.Filters[i] // otherwise we will be operating on a copy
if filter.URL == url {
filter.Enabled = false
found = true
}
}
config.Unlock()
if !found { if !found {
http.Error(w, "URL parameter was not previously added", http.StatusBadRequest) http.Error(w, "URL parameter was not previously added", http.StatusBadRequest)
return return

View File

@ -44,6 +44,34 @@ func userFilter() filter {
} }
} }
// Enable or disable a filter
func filterEnable(url string, enable bool) bool {
r := false
config.Lock()
for i := range config.Filters {
filter := &config.Filters[i] // otherwise we will be operating on a copy
if filter.URL == url {
filter.Enabled = enable
if enable {
e := filter.load()
if e != nil {
// This isn't a fatal error,
// because it may occur when someone removes the file from disk.
// In this case the periodic update task will try to download the file.
filter.LastUpdated = time.Time{}
log.Tracef("%s filter load: %v", url, e)
}
} else {
filter.unload()
}
r = true
break
}
}
config.Unlock()
return r
}
// Load filters from the disk // Load filters from the disk
// And if any filter has zero ID, assign a new one // And if any filter has zero ID, assign a new one
func loadFilters() { func loadFilters() {
@ -284,6 +312,12 @@ func (filter *filter) load() error {
return nil return nil
} }
// Clear filter rules
func (filter *filter) unload() {
filter.Rules = []string{}
filter.RulesCount = 0
}
// Path to the filter contents // Path to the filter contents
func (filter *filter) Path() string { func (filter *filter) Path() string {
return filepath.Join(config.ourWorkingDir, dataDir, filterDir, strconv.FormatInt(filter.ID, 10)+".txt") return filepath.Join(config.ourWorkingDir, dataDir, filterDir, strconv.FormatInt(filter.ID, 10)+".txt")