| @@ -104,6 +104,12 @@ ALLOW_JSONPATH_EVAL=false | ||
| 104 | 104 | # when you trust everyone using your Huginn installation. | 
| 105 | 105 | ENABLE_INSECURE_AGENTS=false | 
| 106 | 106 |  | 
| 107 | +# Enable this setting to allow second precision schedule in | |
| 108 | +# SchedulerAgent. By default, the use of the "second" field is | |
| 109 | +# restricted so that any value other than a single zero (which means | |
| 110 | +# "on the minute") is disallowed. | |
| 111 | +ENABLE_SECOND_PRECISION_SCHEDULE=false | |
| 112 | + | |
| 107 | 113 | # Use Graphviz for generating diagrams instead of using Google Chart | 
| 108 | 114 | # Tools. Specify a dot(1) command path built with SVG support | 
| 109 | 115 | # enabled. | 
| @@ -8,7 +8,11 @@ module Agents | ||
| 8 | 8 | cannot_receive_events! | 
| 9 | 9 | cannot_create_events! | 
| 10 | 10 |  | 
| 11 | - description <<-MD | |
| 11 | + @@second_precision_enabled = ENV['ENABLE_SECOND_PRECISION_SCHEDULE'] == 'true' | |
| 12 | + | |
| 13 | + cattr_reader :second_precision_enabled | |
| 14 | + | |
| 15 | +    description <<-MD % { seconds: (<<-MD_SECONDS if second_precision_enabled) } | |
| 12 | 16 | This agent periodically triggers a run of each target Agent according to a user-defined schedule. | 
| 13 | 17 |  | 
| 14 | 18 | # Targets | 
| @@ -34,11 +38,7 @@ module Agents | ||
| 34 | 38 |  | 
| 35 | 39 | * `0 22 * * 1-5 Etc/GMT+2`: every day of the week when it's 22:00 in GMT+2 | 
| 36 | 40 |  | 
| 37 | - ## Seconds | |
| 38 | - | |
| 39 | - You can optionally specify seconds before the minute field. | |
| 40 | - | |
| 41 | - * `*/30 * * * * *`: every 30 seconds | |
| 41 | +      %{seconds} | |
| 42 | 42 |  | 
| 43 | 43 | ## Last day of month | 
| 44 | 44 |  | 
| @@ -61,6 +61,14 @@ module Agents | ||
| 61 | 61 | * `0 22 * * Sun#L1`: every last Sunday of the month, at 22:00 | 
| 62 | 62 | MD | 
| 63 | 63 |  | 
| 64 | + ## Seconds | |
| 65 | + | |
| 66 | + You can optionally specify seconds before the minute field. | |
| 67 | + | |
| 68 | + * `*/30 * * * * *`: every 30 seconds | |
| 69 | + | |
| 70 | + MD_SECONDS | |
| 71 | + | |
| 64 | 72 | def default_options | 
| 65 | 73 |        super.update({ | 
| 66 | 74 | 'schedule' => '0 * * * *', | 
| @@ -78,7 +86,10 @@ module Agents | ||
| 78 | 86 | def validate_options | 
| 79 | 87 | if (spec = options['schedule']).present? | 
| 80 | 88 | begin | 
| 81 | - Rufus::Scheduler::CronLine.new(spec) | |
| 89 | + cron = Rufus::Scheduler::CronLine.new(spec) | |
| 90 | + if !second_precision_enabled && cron.seconds != [0] | |
| 91 | + errors.add(:base, "second precision schedule is not allowed in this service") | |
| 92 | + end | |
| 82 | 93 | rescue ArgumentError | 
| 83 | 94 | errors.add(:base, "invalid schedule") | 
| 84 | 95 | end | 
| @@ -26,14 +26,22 @@ describe Agents::SchedulerAgent do | ||
| 26 | 26 | @agent.options['schedule'] = '*/15 * * * * * *' | 
| 27 | 27 | @agent.should_not be_valid | 
| 28 | 28 |  | 
| 29 | - @agent.options['schedule'] = '*/15 * * * * *' | |
| 30 | - @agent.should be_valid | |
| 31 | - | |
| 32 | 29 | @agent.options['schedule'] = '*/1 * * * *' | 
| 33 | 30 | @agent.should be_valid | 
| 34 | 31 |  | 
| 35 | 32 | @agent.options['schedule'] = '*/1 * * *' | 
| 36 | 33 | @agent.should_not be_valid | 
| 34 | + | |
| 35 | +      stub(@agent).second_precision_enabled { true } | |
| 36 | + @agent.options['schedule'] = '*/15 * * * * *' | |
| 37 | + @agent.should be_valid | |
| 38 | + | |
| 39 | +      stub(@agent).second_precision_enabled { false } | |
| 40 | + @agent.options['schedule'] = '*/15 * * * * *' | |
| 41 | + @agent.should_not be_valid | |
| 42 | + | |
| 43 | + @agent.options['schedule'] = '0 * * * * *' | |
| 44 | + @agent.should be_valid | |
| 37 | 45 | end | 
| 38 | 46 | end | 
| 39 | 47 |  |