webrelay_scheduler 0.5.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.
- data/.gitignore +17 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +25 -0
- data/Rakefile +1 -0
- data/bin/webrelay +26 -0
- data/lib/webrelay_scheduler.rb +3 -0
- data/lib/webrelay_scheduler/command.rb +49 -0
- data/lib/webrelay_scheduler/relay.rb +36 -0
- data/lib/webrelay_scheduler/version.rb +3 -0
- data/webrelay_scheduler.gemspec +29 -0
- metadata +177 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Ian Yamey
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# WebrelayScheduler
|
2
|
+
|
3
|
+
A tool to power on/off a list of webrelays.
|
4
|
+
This tool is usually called by a task scheduler, such as cron or Windows Task Scheduler.
|
5
|
+
By default, the tool will not power down webrelays if the current day or following day is a public holiday
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'webrelay_scheduler'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install webrelay_scheduler
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
The gem is distributed with a binary. For usage details, run
|
24
|
+
|
25
|
+
$ webrelay --help
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/webrelay
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'webrelay_scheduler'
|
4
|
+
require "pry"
|
5
|
+
require "escort"
|
6
|
+
|
7
|
+
Escort::App.create do |app|
|
8
|
+
app.version WebrelayScheduler::VERSION
|
9
|
+
app.description "A tool to power on/off a list of webrelays.\n"+
|
10
|
+
"This tool is usually called by a task scheduler, such as cron or Windows Task Scheduler.\n"+
|
11
|
+
"By default, the tool will not power down webrelays if the current day or following day is a public holiday\n"
|
12
|
+
|
13
|
+
app.options do |opts|
|
14
|
+
opts.opt :ip, "The ip address of the relay to control. This argument can be used multiple times to control more than one relay at a time, eg. '... --ip 10.0.0.1 --ip 10.0.0.2'", :short => '-i', :long => '--ip', :type => :string, :multi => true
|
15
|
+
opts.opt :power, "Sets the power on the relays. Accepts either ON or OFF", :short => '-p', :long => '--power', :type => :string, :default => "ON"
|
16
|
+
opts.opt :delay, "The delay between sending commands to each relay", :short => '-d', :long => '--delay', :type => :integer, :default => 5
|
17
|
+
opts.opt :timeout, "The maximum timeout (in seconds) when sending a command to a relay", :short => '-t', :long => '--timeout', :type => :integer, :default => 5
|
18
|
+
opts.opt :skip_powerdown_on_holidays, "Prevents the system from switching off the relay during holidays. If the current day is a holiday in the current locale, then commands to power off relays will be skipped.", :short => :none, :long => '--skip-powerdown-on-holidays', :type => :flag, :default => true
|
19
|
+
opts.opt :locale_code, "The country/locale code to use when determining if today's date is currently a holiday", :short => '-l', :long => '--locale-code', :type => :string, :default => "au_nsw"
|
20
|
+
opts.opt :relay_name, "The name of the relay to switch. This will be 'relay' for single channel relays, or 'relay1', 'relay2', ... , 'relay<N>' for multi-channel relays", :short => '-n', :long => '--relay-name', :type => :string, :default => "relay"
|
21
|
+
end
|
22
|
+
|
23
|
+
app.action do |options, arguments|
|
24
|
+
WebrelayScheduler::Command.new(options, arguments).execute
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "escort"
|
2
|
+
require "holidays"
|
3
|
+
|
4
|
+
module WebrelayScheduler
|
5
|
+
class Command < ::Escort::ActionCommand::Base
|
6
|
+
def execute
|
7
|
+
o = command_options
|
8
|
+
|
9
|
+
relays = o[:ip].collect{ |ip| Relay.new(ip, o[:timeout]) }
|
10
|
+
delay = o[:delay]
|
11
|
+
|
12
|
+
if o[:power] == "ON"
|
13
|
+
switch_on(relays,o[:relay_name],delay)
|
14
|
+
elsif o[:power] == "OFF"
|
15
|
+
unless o[:skip_powerdown_on_holidays] and is_holiday?(o[:locale_code])
|
16
|
+
switch_off(relays,o[:relay_name],delay)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Returns true if either today or tomorrow is a holiday in the specified locale
|
22
|
+
def is_holiday?(locale_code)
|
23
|
+
today = Date.today
|
24
|
+
tomorrow = today + 1
|
25
|
+
Holidays.load_all
|
26
|
+
today.holiday?(locale_code.to_sym) or tomorrow.holiday?(locale_code.to_sym)
|
27
|
+
end
|
28
|
+
|
29
|
+
def switch_on(relays,relay_name,delay); send_to_each(relays,relay_name,:on,delay); end
|
30
|
+
def switch_off(relays,relay_name,delay); send_to_each(relays,relay_name,:off,delay); end
|
31
|
+
|
32
|
+
# Safely executes a method on each relay
|
33
|
+
def send_to_each(relays,relay_name,method,delay=0)
|
34
|
+
relays.each do |relay|
|
35
|
+
begin
|
36
|
+
result = relay.send method, relay_name
|
37
|
+
if result
|
38
|
+
Escort::Logger.output.info "#{relay.to_s} - OK"
|
39
|
+
else
|
40
|
+
Escort::Logger.output.error "#{relay.to_s} - FAILED"
|
41
|
+
end
|
42
|
+
rescue Exception => e
|
43
|
+
Escort::Logger.output.error "#{relay.to_s} - FAILED (#{e.message})"
|
44
|
+
end
|
45
|
+
sleep delay
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'httpclient'
|
2
|
+
require 'crack'
|
3
|
+
module WebrelayScheduler
|
4
|
+
class Relay
|
5
|
+
attr_accessor :ip_address
|
6
|
+
|
7
|
+
def initialize(ip_address, timeout=5)
|
8
|
+
@ip_address = ip_address
|
9
|
+
@client = HTTPClient.new
|
10
|
+
@client.receive_timeout = timeout * 1000
|
11
|
+
end
|
12
|
+
|
13
|
+
def set(relay_name, value)
|
14
|
+
url = "http://#{ip_address}/state.xml?#{relay_name}State=#{value}"
|
15
|
+
response = @client.get url
|
16
|
+
parsed_response = Crack::XML.parse response.body
|
17
|
+
|
18
|
+
parsed_response["datavalues"]["#{relay_name}state"] == value
|
19
|
+
end
|
20
|
+
|
21
|
+
# Turns the relay on
|
22
|
+
def on(relay_name="relay")
|
23
|
+
set relay_name, "0"
|
24
|
+
end
|
25
|
+
|
26
|
+
# Turns the relay off
|
27
|
+
def off(relay_name="relay")
|
28
|
+
set relay_name, "1"
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_s
|
32
|
+
"Relay #{ip_address}"
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'webrelay_scheduler/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "webrelay_scheduler"
|
8
|
+
spec.version = WebrelayScheduler::VERSION
|
9
|
+
spec.authors = ["Ian Yamey","Jobin Varughese"]
|
10
|
+
spec.email = ["ian.yamey@parkassist.com"]
|
11
|
+
spec.description = %q{This gem is used to control the power on webrelays}
|
12
|
+
spec.summary = %q{}
|
13
|
+
spec.homepage = "http://www.parkassist.com"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_dependency "holidays"
|
23
|
+
spec.add_dependency "escort"
|
24
|
+
spec.add_dependency "crack"
|
25
|
+
spec.add_dependency "httpclient"
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
27
|
+
spec.add_development_dependency "rake"
|
28
|
+
spec.add_development_dependency "pry"
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,177 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: webrelay_scheduler
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ian Yamey
|
9
|
+
- Jobin Varughese
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-05-23 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: holidays
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: escort
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
type: :runtime
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: crack
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: httpclient
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :runtime
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: bundler
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ~>
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '1.3'
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ~>
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '1.3'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: rake
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ! '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
description: This gem is used to control the power on webrelays
|
128
|
+
email:
|
129
|
+
- ian.yamey@parkassist.com
|
130
|
+
executables:
|
131
|
+
- webrelay
|
132
|
+
extensions: []
|
133
|
+
extra_rdoc_files: []
|
134
|
+
files:
|
135
|
+
- .gitignore
|
136
|
+
- Gemfile
|
137
|
+
- LICENSE.txt
|
138
|
+
- README.md
|
139
|
+
- Rakefile
|
140
|
+
- bin/webrelay
|
141
|
+
- lib/webrelay_scheduler.rb
|
142
|
+
- lib/webrelay_scheduler/command.rb
|
143
|
+
- lib/webrelay_scheduler/relay.rb
|
144
|
+
- lib/webrelay_scheduler/version.rb
|
145
|
+
- webrelay_scheduler.gemspec
|
146
|
+
homepage: http://www.parkassist.com
|
147
|
+
licenses:
|
148
|
+
- MIT
|
149
|
+
post_install_message:
|
150
|
+
rdoc_options: []
|
151
|
+
require_paths:
|
152
|
+
- lib
|
153
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
154
|
+
none: false
|
155
|
+
requirements:
|
156
|
+
- - ! '>='
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
segments:
|
160
|
+
- 0
|
161
|
+
hash: 2193386232894529438
|
162
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
|
+
none: false
|
164
|
+
requirements:
|
165
|
+
- - ! '>='
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
168
|
+
segments:
|
169
|
+
- 0
|
170
|
+
hash: 2193386232894529438
|
171
|
+
requirements: []
|
172
|
+
rubyforge_project:
|
173
|
+
rubygems_version: 1.8.23
|
174
|
+
signing_key:
|
175
|
+
specification_version: 3
|
176
|
+
summary: ''
|
177
|
+
test_files: []
|