| 387 | } |
| 388 | |
| 389 | func (l *Loader) replaceUserRule(rule *Rule) (err error) { |
| 390 | l.Lock() |
| 391 | oldRule, found := l.rules[rule.Name] |
| 392 | l.Unlock() |
| 393 | |
| 394 | if found { |
| 395 | // If the rule has changed from Always (saved on disk) to !Always (temporary), |
| 396 | // we need to delete the rule from disk and keep it in memory. |
| 397 | l.deleteOldRuleFromDisk(oldRule, rule) |
| 398 | |
| 399 | // delete loaded lists, if this is a rule of type Lists |
| 400 | l.cleanListsRule(oldRule) |
| 401 | } |
| 402 | |
| 403 | if err := l.unmarshalOperatorList(&rule.Operator); err != nil { |
| 404 | log.Error(err.Error()) |
| 405 | } |
| 406 | |
| 407 | if rule.Enabled { |
| 408 | if err := rule.Operator.Compile(); err != nil { |
| 409 | log.Warning("Operator.Compile() error: %s: %s", err, rule.Operator.Data) |
| 410 | return fmt.Errorf("(2) error compiling rule: %s", err) |
| 411 | } |
| 412 | |
| 413 | if rule.Operator.Type == List { |
| 414 | for i := 0; i < len(rule.Operator.List); i++ { |
| 415 | if err := rule.Operator.List[i].Compile(); err != nil { |
| 416 | log.Warning("Operator.Compile() error: %s: ", err) |
| 417 | return fmt.Errorf("(2) error compiling list rule: %s", err) |
| 418 | } |
| 419 | } |
| 420 | } |
| 421 | } |
| 422 | l.Lock() |
| 423 | l.rules[rule.Name] = rule |
| 424 | l.sortRules() |
| 425 | l.Unlock() |
| 426 | |
| 427 | if rule.Enabled && l.isTemporary(rule) { |
| 428 | err = l.scheduleTemporaryRule(*rule) |
| 429 | } |
| 430 | |
| 431 | return err |
| 432 | } |
| 433 | |
| 434 | func (l *Loader) scheduleTemporaryRule(rule Rule) error { |
| 435 | tTime, err := time.ParseDuration(string(rule.Duration)) |