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 ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
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,3 @@
1
+ require "webrelay_scheduler/relay"
2
+ require "webrelay_scheduler/command"
3
+ require "webrelay_scheduler/version"
@@ -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,3 @@
1
+ module WebrelayScheduler
2
+ VERSION = "0.5.0"
3
+ 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: []