crntb 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.circleci/config.yml +44 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +10 -2
- data/README.md +54 -0
- data/Rakefile +10 -0
- data/lib/crntb.rb +8 -6
- data/lib/crntb/line.rb +27 -0
- data/lib/crntb/outputer.rb +8 -0
- data/lib/crntb/outputer/chef_cron.rb +22 -0
- data/lib/crntb/outputer/hash.rb +20 -0
- data/lib/crntb/outputer/text.rb +100 -0
- data/lib/crntb/outputer/whenever.rb +15 -0
- data/lib/crntb/version.rb +1 -1
- data/sample.cron +8 -1
- metadata +12 -6
- data/lib/crntb/field.rb +0 -202
- data/lib/crntb/file.rb +0 -38
- data/sample.cron1 +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: def18eedf778b1a5c534906f63c3ed9b12a3129f
|
4
|
+
data.tar.gz: a25aed6ca83b0e4a03efc25d54f456d2f29a41bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3328a02999cc990fb254044b11a986feae3bbfe5f54715d3729441ea19cee712c34380934307dfa36a006a8aee34894e4597150f016d6ebcca855a6504e0f6c
|
7
|
+
data.tar.gz: 4921ce724624cd787132c924e7e93f8052c06f724e981b7c680502ca259efea58fae2315234cb4d903b992e4a4f9e86af228acdb1ca34ef5223bc009c4b2f145
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Ruby CircleCI 2.0 configuration file
|
2
|
+
#
|
3
|
+
# Check https://circleci.com/docs/2.0/language-ruby/ for more details
|
4
|
+
#
|
5
|
+
version: 2
|
6
|
+
jobs:
|
7
|
+
build:
|
8
|
+
docker:
|
9
|
+
# specify the version you desire here
|
10
|
+
- image: circleci/ruby:2.4.1-node-browsers
|
11
|
+
|
12
|
+
# Specify service dependencies here if necessary
|
13
|
+
# CircleCI maintains a library of pre-built images
|
14
|
+
# documented at https://circleci.com/docs/2.0/circleci-images/
|
15
|
+
# - image: circleci/postgres:9.4
|
16
|
+
|
17
|
+
working_directory: ~/repo
|
18
|
+
|
19
|
+
steps:
|
20
|
+
- checkout
|
21
|
+
|
22
|
+
# Download and cache dependencies
|
23
|
+
- restore_cache:
|
24
|
+
keys:
|
25
|
+
- v1-dependencies-{{ checksum "Gemfile.lock" }}
|
26
|
+
# fallback to using the latest cache if no exact match is found
|
27
|
+
- v1-dependencies-
|
28
|
+
|
29
|
+
- run:
|
30
|
+
name: install dependencies
|
31
|
+
command: |
|
32
|
+
gem install bundler
|
33
|
+
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
34
|
+
|
35
|
+
- save_cache:
|
36
|
+
paths:
|
37
|
+
- ./vendor/bundle
|
38
|
+
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
|
39
|
+
|
40
|
+
# run tests!
|
41
|
+
- run:
|
42
|
+
name: run tests
|
43
|
+
command: |
|
44
|
+
bundle exec rake
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,14 @@
|
|
1
|
+
GIT
|
2
|
+
remote: https://github.com/litencatt/crontab
|
3
|
+
revision: 9c758a82a124f2b83a6e28ffb8cffce608f41844
|
4
|
+
branch: keep-cron-definition
|
5
|
+
specs:
|
6
|
+
crontab (0.0.2)
|
7
|
+
|
1
8
|
PATH
|
2
9
|
remote: .
|
3
10
|
specs:
|
4
|
-
crntb (0.
|
11
|
+
crntb (0.3.0)
|
5
12
|
|
6
13
|
GEM
|
7
14
|
remote: https://rubygems.org/
|
@@ -24,10 +31,11 @@ PLATFORMS
|
|
24
31
|
DEPENDENCIES
|
25
32
|
bundler (~> 1.16)
|
26
33
|
crntb!
|
34
|
+
crontab!
|
27
35
|
minitest
|
28
36
|
pry
|
29
37
|
pry-byebug
|
30
38
|
rake (~> 10.0)
|
31
39
|
|
32
40
|
BUNDLED WITH
|
33
|
-
1.16.
|
41
|
+
1.16.5
|
data/README.md
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
Inspired by http://crontab.homecoded.com/
|
2
|
+
|
3
|
+
Convert crontab lines to other format.
|
4
|
+
|
5
|
+
### Install
|
6
|
+
```
|
7
|
+
$ git clone https://github.com/litencatt/crntb
|
8
|
+
$ cd /path/to/crntb
|
9
|
+
$ bundle install --path vendor/bundle
|
10
|
+
```
|
11
|
+
|
12
|
+
### Usage
|
13
|
+
Convert a line.
|
14
|
+
```rb
|
15
|
+
$ bin/console
|
16
|
+
[1] pry(main)> Crntb.parse("* * * * * foo.sh").to_h
|
17
|
+
=> "{\"minute\":\"*\",\"hour\":\"*\",\"day_of_month\":\"*\",\"month\":\"*\",\"day_of_week\":\"*\",\"command\":\"foo.sh\"}"
|
18
|
+
|
19
|
+
[1] pry(main)> Crntb.parse("* * * * * foo.sh").to_json
|
20
|
+
=> "{\"minute\":\"*\",\"hour\":\"*\",\"day_of_month\":\"*\",\"month\":\"*\",\"day_of_week\":\"*\",\"command\":\"foo.sh\"}"
|
21
|
+
|
22
|
+
[2] pry(main)> puts Crntb.parse("* * * * * foo.sh").to_chef
|
23
|
+
cron 'exec_foo.sh' do
|
24
|
+
minute "*"
|
25
|
+
hour "*"
|
26
|
+
day "*"
|
27
|
+
month "*"
|
28
|
+
weekday "*"
|
29
|
+
command "foo.sh"
|
30
|
+
end
|
31
|
+
=> nil
|
32
|
+
|
33
|
+
[3] pry(main)> puts Crntb.parse("* * * * * foo.sh").to_whenever
|
34
|
+
every '* * * * *' do
|
35
|
+
command "foo.sh"
|
36
|
+
end
|
37
|
+
=> nil
|
38
|
+
```
|
39
|
+
|
40
|
+
Convert crontabs written in a file.
|
41
|
+
```rb
|
42
|
+
$ bin/console
|
43
|
+
[1] pry(main)> entries = Crntb.parse_file("./sample.cron")
|
44
|
+
|
45
|
+
[2] pry(main)> entries.map{|e| pp e.to_json}
|
46
|
+
=> ["{\"minute\":\"0\",\"hour\":\"8,10,12,14,16,18\",\"day_of_month\":\"*\",\"month\":\"*\",\"day_of_week\":\"*\",\"command\":\"php emptyTrash.php > log.txt\"}",
|
47
|
+
"{\"minute\":\"1-6,9,32\",\"hour\":\"*\",\"day_of_month\":\"*\",\"month\":\"*\",\"day_of_week\":\"*\",\"command\":\"echo \\\"sample me good\\\" > /etc/tmp/trash.txt\"}",
|
48
|
+
"{\"minute\":\"*\",\"hour\":\"4\",\"day_of_month\":\"*\",\"month\":\"*\",\"day_of_week\":\"*\",\"command\":\"/etc/init.d/apache2 restart\"}",
|
49
|
+
"{\"minute\":\"*\",\"hour\":\"*\",\"day_of_month\":\"3-4\",\"month\":\"1,4,5\",\"day_of_week\":\"*\",\"command\":\"/etc/init.d/apache2 restart\"}",
|
50
|
+
"{\"minute\":\"*\",\"hour\":\"*\",\"day_of_month\":\"3,5\",\"month\":\"12\",\"day_of_week\":\"1,5,6\",\"command\":\"/etc/init.d/apache2 restart\"}",
|
51
|
+
"{\"minute\":\"10\",\"hour\":\"4\",\"day_of_month\":\"1\",\"month\":\"*\",\"day_of_week\":\"*\",\"command\":\"/root/scripts/backup.sh\"}",
|
52
|
+
"{\"minute\":\"30\",\"hour\":\"3\",\"day_of_month\":\"*\",\"month\":\"*\",\"day_of_week\":\"mon\",\"command\":\"cat /proc/meminfo >> /tmp/meminfo\"}",
|
53
|
+
"{\"minute\":\"*\",\"hour\":\"*\",\"day_of_month\":\"*\",\"month\":\"*\",\"day_of_week\":\"*\",\"command\":\"top > test.txt\"}"]
|
54
|
+
```
|
data/Rakefile
ADDED
data/lib/crntb.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
-
require 'crntb/
|
2
|
-
require '
|
1
|
+
require 'crntb/line'
|
2
|
+
require 'crontab'
|
3
3
|
|
4
4
|
module Crntb
|
5
|
-
def self.parse(
|
6
|
-
Crntb::
|
5
|
+
def self.parse(line)
|
6
|
+
Crntb::Line.new(line)
|
7
7
|
end
|
8
8
|
|
9
|
-
def self.
|
10
|
-
|
9
|
+
def self.parse_file(file)
|
10
|
+
::File.readlines(file).each_with_object([]) do |line, arr|
|
11
|
+
arr << Crntb::Line.new(line.chomp!)
|
12
|
+
end
|
11
13
|
end
|
12
14
|
end
|
data/lib/crntb/line.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'crntb/outputer'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Crntb
|
5
|
+
class Line
|
6
|
+
def initialize(line)
|
7
|
+
return if line.empty?
|
8
|
+
@entry = ::Crontab::Entry.parse(line)
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_h
|
12
|
+
Crntb::Outputer::Hash.build(@entry)
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_json
|
16
|
+
to_h.to_json
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_chef
|
20
|
+
Crntb::Outputer::ChefCron.build(@entry)
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_whenever
|
24
|
+
Crntb::Outputer::Whenever.build(@entry)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Crntb
|
2
|
+
module Outputer
|
3
|
+
module ChefCron
|
4
|
+
class << self
|
5
|
+
def build(entry)
|
6
|
+
fields = entry.cron_definition.split(/\s/, 5)
|
7
|
+
|
8
|
+
<<EOS
|
9
|
+
cron 'exec_#{entry.command}' do
|
10
|
+
minute "#{fields[0]}"
|
11
|
+
hour "#{fields[1]}"
|
12
|
+
day "#{fields[2]}"
|
13
|
+
month "#{fields[3]}"
|
14
|
+
weekday "#{fields[4]}"
|
15
|
+
command "#{entry.command}"
|
16
|
+
end
|
17
|
+
EOS
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Crntb
|
2
|
+
module Outputer
|
3
|
+
module Hash
|
4
|
+
class << self
|
5
|
+
def build(entry)
|
6
|
+
fields = entry.cron_definition.split(/\s/, 5)
|
7
|
+
|
8
|
+
{
|
9
|
+
"minute": fields[0],
|
10
|
+
"hour": fields[1],
|
11
|
+
"day_of_month": fields[2],
|
12
|
+
"month": fields[3],
|
13
|
+
"day_of_week": fields[4],
|
14
|
+
"command": entry.command
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
module Crntb
|
2
|
+
module Outputer
|
3
|
+
module Text
|
4
|
+
class << self
|
5
|
+
attr_reader :result, :fields
|
6
|
+
|
7
|
+
def build(fields)
|
8
|
+
@result = ''
|
9
|
+
@fields = fields
|
10
|
+
day_week_month_result
|
11
|
+
min_hour_result
|
12
|
+
%Q{#{@result}\n run command "#{fields.command}"}
|
13
|
+
end
|
14
|
+
|
15
|
+
def day_week_month_result
|
16
|
+
build_month
|
17
|
+
build_day_of_month
|
18
|
+
build_day_of_week
|
19
|
+
end
|
20
|
+
|
21
|
+
def build_month
|
22
|
+
@result += "in #{fields.month}, on " if fields.month != '*'
|
23
|
+
@result += "every month on " if fields.month == '*' and fields.day_of_month != '*'
|
24
|
+
end
|
25
|
+
|
26
|
+
def build_day_of_month
|
27
|
+
if fields.day_of_month == '*'
|
28
|
+
@result += 'every day ' if fields.day_of_week == '*'
|
29
|
+
else
|
30
|
+
@result += 'the '
|
31
|
+
days = fields.day_of_month.split(',')
|
32
|
+
days.each do |day|
|
33
|
+
case day.to_i
|
34
|
+
when 1
|
35
|
+
@result += "#{day}st,"
|
36
|
+
when 2
|
37
|
+
@result += "#{day}nd,"
|
38
|
+
when 3
|
39
|
+
@result += "#{day}rd,"
|
40
|
+
else
|
41
|
+
@result += "#{day}th,"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
@result.slice!(@result.size - 1, 1)
|
45
|
+
@result += ' '
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def build_day_of_week
|
50
|
+
if fields.day_of_week != '*'
|
51
|
+
@result += 'and on ' if fields.day_of_month != '*'
|
52
|
+
@result += fields.day_of_week + ' '
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def min_hour_result
|
57
|
+
hour_collections = fields.hour.split(',')
|
58
|
+
min_collections = fields.minute.split(',')
|
59
|
+
if hour_collections.length > 1 or hour_collections[0].to_i.to_s == hour_collections[0]
|
60
|
+
# input exp. ["1,2"]
|
61
|
+
if min_collections.length > 1 or min_collections[0].to_i.to_s == min_collections[0]
|
62
|
+
@result += 'at '
|
63
|
+
hour_collections.each do |hour_collection|
|
64
|
+
min_collections.each do |min_collection|
|
65
|
+
@result += "%#02d" % hour_collection + ':' + "%#02d" % min_collections + ', '
|
66
|
+
end
|
67
|
+
end
|
68
|
+
@result.slice!(@result.size - 2, 2)
|
69
|
+
else
|
70
|
+
@result += "on #{fields.minute} when hour is ("
|
71
|
+
hour_collections.each do |hour_collection|
|
72
|
+
@result += "%#02d" % hour_collection + ', '
|
73
|
+
end
|
74
|
+
@result.slice!(@result.size - 2, 2)
|
75
|
+
@result += ')'
|
76
|
+
end
|
77
|
+
else
|
78
|
+
# input exp. ["every hour"]
|
79
|
+
if min_collections.length > 1
|
80
|
+
@result += "on #{fields.hour} when minute equals one of ("
|
81
|
+
min_collections.each do |min_collection|
|
82
|
+
@result += "%#02d" % min_collection + ', '
|
83
|
+
end
|
84
|
+
@result.slice!(@result.size - 2, 2)
|
85
|
+
@result += ')'
|
86
|
+
else
|
87
|
+
if fields.hour.to_i.to_s == fields.hour and fields.minute.to_i.to_s == fields.minute
|
88
|
+
@result += "on #{fields.hour}:#{fields.minute}"
|
89
|
+
elsif fields.minute.to_i.to_s == fields.minute
|
90
|
+
@result += "on #{fields.hour} when minute equals " + "%#02d" % fields.minute
|
91
|
+
else
|
92
|
+
@result += "on #{fields.hour} on #{fields.minute}"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
data/lib/crntb/version.rb
CHANGED
data/sample.cron
CHANGED
@@ -1 +1,8 @@
|
|
1
|
-
|
1
|
+
0 8,10,12,14,16,18 * * * php emptyTrash.php > log.txt
|
2
|
+
1-6,9,32 * * * * echo "sample me good" > /etc/tmp/trash.txt
|
3
|
+
* 4 * * * /etc/init.d/apache2 restart
|
4
|
+
* * 3-4 1,4,5 * /etc/init.d/apache2 restart
|
5
|
+
* * 3,5 12 1,5,6 /etc/init.d/apache2 restart
|
6
|
+
10 4 1 * * /root/scripts/backup.sh
|
7
|
+
30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
|
8
|
+
* * * * * top > test.txt
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crntb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- litencatt
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -73,17 +73,23 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
+
- ".circleci/config.yml"
|
76
77
|
- Gemfile
|
77
78
|
- Gemfile.lock
|
78
79
|
- LICENSE
|
80
|
+
- README.md
|
81
|
+
- Rakefile
|
79
82
|
- bin/console
|
80
83
|
- crntb.gemspec
|
81
84
|
- lib/crntb.rb
|
82
|
-
- lib/crntb/
|
83
|
-
- lib/crntb/
|
85
|
+
- lib/crntb/line.rb
|
86
|
+
- lib/crntb/outputer.rb
|
87
|
+
- lib/crntb/outputer/chef_cron.rb
|
88
|
+
- lib/crntb/outputer/hash.rb
|
89
|
+
- lib/crntb/outputer/text.rb
|
90
|
+
- lib/crntb/outputer/whenever.rb
|
84
91
|
- lib/crntb/version.rb
|
85
92
|
- sample.cron
|
86
|
-
- sample.cron1
|
87
93
|
homepage: https://github.com/litencatt/crntb
|
88
94
|
licenses:
|
89
95
|
- MIT
|
@@ -104,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
110
|
version: '0'
|
105
111
|
requirements: []
|
106
112
|
rubyforge_project:
|
107
|
-
rubygems_version: 2.6.
|
113
|
+
rubygems_version: 2.6.13
|
108
114
|
signing_key:
|
109
115
|
specification_version: 4
|
110
116
|
summary: Crontab format parser
|
data/lib/crntb/field.rb
DELETED
@@ -1,202 +0,0 @@
|
|
1
|
-
module Crntb
|
2
|
-
class Field
|
3
|
-
attr_reader :field
|
4
|
-
|
5
|
-
class << self
|
6
|
-
def parse(field)
|
7
|
-
self.new(field).parse
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def initialize(field)
|
12
|
-
@field = field
|
13
|
-
end
|
14
|
-
|
15
|
-
def parse
|
16
|
-
#return nil unless valid?
|
17
|
-
return '*' if first_to_last?
|
18
|
-
interpretation
|
19
|
-
end
|
20
|
-
|
21
|
-
# 先頭文字列を処理
|
22
|
-
# */...
|
23
|
-
# n...
|
24
|
-
# それ以降はカンマ区切りでsplitして-はloop処理しての繰り返し
|
25
|
-
def interpretation
|
26
|
-
step_collections = field.split(',')
|
27
|
-
collections = []
|
28
|
-
step_collections.each do |step_collection|
|
29
|
-
# /でsplitした結果
|
30
|
-
step = get_step(step_collection)
|
31
|
-
|
32
|
-
# /が使われてればstep[1]には分割数が来るはず, なければ1
|
33
|
-
# 次のrange処理で使う
|
34
|
-
if step[1] && step[1].match(/^[0-9]+$/)
|
35
|
-
step_size = step[1].to_i
|
36
|
-
else
|
37
|
-
step_size = 1
|
38
|
-
end
|
39
|
-
|
40
|
-
# step[0] : * => min..max
|
41
|
-
# step[0] : n-m => n..m
|
42
|
-
range = get_range(step[0])
|
43
|
-
if range.length > 1
|
44
|
-
s = range[0].to_i
|
45
|
-
e = range[1].to_i
|
46
|
-
s.step(e, step_size) { |r| collections << r }
|
47
|
-
end
|
48
|
-
end
|
49
|
-
collections.uniq.sort
|
50
|
-
# 曜日や月は文字列にして追加
|
51
|
-
# そうでなければ数字を追加
|
52
|
-
result = collections.inject '' do |res, collection|
|
53
|
-
res += collection.to_s
|
54
|
-
res += ", "
|
55
|
-
end
|
56
|
-
result.slice!(result.size - 2, 2)
|
57
|
-
result
|
58
|
-
end
|
59
|
-
|
60
|
-
def get_collection
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
# e.g
|
65
|
-
# "*/1" => ["*", "1"]
|
66
|
-
# "*/1,2-4" => ["*", "1,2-4"]
|
67
|
-
def get_range(value)
|
68
|
-
if value == '*'
|
69
|
-
[field_range.first, field_range.last]
|
70
|
-
else
|
71
|
-
value.split('-')
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def get_step(value)
|
76
|
-
value.split('/')
|
77
|
-
end
|
78
|
-
|
79
|
-
def expand_range(collections)
|
80
|
-
result = []
|
81
|
-
collections.each do |collection|
|
82
|
-
if collection.include?('-')
|
83
|
-
min, max = collection.split('-', 2)
|
84
|
-
for i in min..max do
|
85
|
-
result << i
|
86
|
-
end
|
87
|
-
else
|
88
|
-
result << collection
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def first_to_last?
|
94
|
-
field == '*'
|
95
|
-
end
|
96
|
-
|
97
|
-
def range_time?
|
98
|
-
end
|
99
|
-
|
100
|
-
def every_time?
|
101
|
-
end
|
102
|
-
|
103
|
-
private
|
104
|
-
|
105
|
-
def have_asterisk?
|
106
|
-
field.include?('*')
|
107
|
-
end
|
108
|
-
|
109
|
-
def have_hyphen?
|
110
|
-
field.include?('-')
|
111
|
-
end
|
112
|
-
|
113
|
-
def have_slash?
|
114
|
-
field.include?('/')
|
115
|
-
end
|
116
|
-
|
117
|
-
def have_comma?
|
118
|
-
field.include?(',')
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
class Minute < Field
|
123
|
-
def field_range
|
124
|
-
0..59
|
125
|
-
end
|
126
|
-
|
127
|
-
def parse
|
128
|
-
case field
|
129
|
-
when '*'
|
130
|
-
"every minute"
|
131
|
-
else
|
132
|
-
"when minute equals #{super}"
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
class Hour < Field
|
138
|
-
def parse
|
139
|
-
case field
|
140
|
-
when '*'
|
141
|
-
"every hour "
|
142
|
-
else
|
143
|
-
"at #{super}"
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
def field_range
|
148
|
-
0..23
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
class DayOfMonth < Field
|
153
|
-
def parse
|
154
|
-
case field
|
155
|
-
when '*'
|
156
|
-
""
|
157
|
-
else
|
158
|
-
"on the #{super}"
|
159
|
-
end
|
160
|
-
|
161
|
-
end
|
162
|
-
|
163
|
-
def field_range
|
164
|
-
1..31
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
class Month < Field
|
169
|
-
def parse
|
170
|
-
case field
|
171
|
-
when '*'
|
172
|
-
"every day "
|
173
|
-
else
|
174
|
-
"In #{super}"
|
175
|
-
end
|
176
|
-
|
177
|
-
end
|
178
|
-
|
179
|
-
def field_range
|
180
|
-
1..12
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
class DayOfWeek < Field
|
185
|
-
def parse
|
186
|
-
case field
|
187
|
-
when '*'
|
188
|
-
""
|
189
|
-
else
|
190
|
-
"and on #{super}"
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
def field_range
|
195
|
-
0..7
|
196
|
-
end
|
197
|
-
end
|
198
|
-
class Command < Field
|
199
|
-
def parse
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
data/lib/crntb/file.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
module Crntb
|
2
|
-
class File
|
3
|
-
def self.parse(file)
|
4
|
-
::File.readlines(file).each do |line|
|
5
|
-
Crntb::Line.new(line).parse
|
6
|
-
end
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
class Line
|
11
|
-
attr_reader :minute, :hour, :day_of_month, :month, :day_of_week, :command
|
12
|
-
|
13
|
-
def initialize(line)
|
14
|
-
fields = manipuate(line)
|
15
|
-
@minute = Minute.parse(fields[0])
|
16
|
-
@hour = Hour.parse(fields[1])
|
17
|
-
@day_of_month = DayOfWeek.parse(fields[2])
|
18
|
-
@month = Month.parse(fields[3])
|
19
|
-
@day_of_week = DayOfMonth.parse(fields[4])
|
20
|
-
@command = fields[5].chomp
|
21
|
-
end
|
22
|
-
|
23
|
-
def parse
|
24
|
-
[
|
25
|
-
day_of_week,
|
26
|
-
month,
|
27
|
-
day_of_month,
|
28
|
-
hour,
|
29
|
-
minute,
|
30
|
-
"\n exec #{@command}",
|
31
|
-
].join
|
32
|
-
end
|
33
|
-
|
34
|
-
def manipuate(line)
|
35
|
-
line.split(' ', 6)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
data/sample.cron1
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
* * * * * sample.sh && foo.sh && bar.sh
|
2
|
-
0 * * * * sample.sh
|
3
|
-
00 * * * * sample.sh
|
4
|
-
*/10 * * * * sample.sh
|
5
|
-
00 05 * * * sample.sh
|
6
|
-
30 08 * * * sample.sh
|
7
|
-
0,30 8-22 * * * sample.sh
|
8
|
-
00,30 * * * * sample.sh
|
9
|
-
00 00 1 * * sample.sh
|
10
|
-
00 01 1 * * sample.sh
|
11
|
-
0 9 25-29 * * sample.sh
|
12
|
-
00 09 13-17 * * sample.sh
|
13
|
-
00 02,05,08 * * * sample.sh
|
14
|
-
30 23 28-31 * * sample.sh
|