moob 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
data/COPYING CHANGED
@@ -1,4 +1,13 @@
1
- Copyright (c) 2011, Pierre Carrier <pierre@gcarrier.fr>
1
+ Copyright (c) 2011-2012, Spotify AB
2
2
 
3
- Permission is granted to use, copy, modify and/or distribute this work
4
- and/or license, without conditions.
3
+ Permission to use, copy, modify, and/or distribute this software
4
+ for any purpose with or without fee is hereby granted, provided that
5
+ the above copyright notice and this permission notice appear in all copies.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
8
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
9
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
10
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
11
+ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
12
+ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
13
+ THIS SOFTWARE.
data/bin/moob CHANGED
@@ -4,106 +4,111 @@ require 'optparse'
4
4
  require 'moob'
5
5
 
6
6
  options = {
7
- :actions => [:jnlp],
8
- :type => :auto,
9
- :machines => [],
10
- :password => ENV['PASSWORD']
7
+ :actions => [:jnlp],
8
+ :type => :auto,
9
+ :machines => [],
10
+ :password => ENV['PASSWORD'],
11
+ :transport => 'https',
11
12
  }
12
13
 
13
14
  OptionParser.new do |opts|
14
- opts.on '-t', '--type t',
15
- 'LOM type, \'auto\' for autodetection, \'list\' to list',
16
- 'Defaults to auto' do |t|
17
- if t == 'list'
18
- Moob::TYPES.each do |sym, klass|
19
- puts "#{sym} (#{klass.name})"
20
- end
21
- exit 0
22
- else
23
- options[:type] = t.to_sym
24
- end
15
+ opts.on '-t', '--type t',
16
+ 'LOM type, \'auto\' for autodetection, \'list\' to list',
17
+ 'Defaults to auto' do |t|
18
+ if t == 'list'
19
+ Moob::TYPES.each do |sym, klass|
20
+ puts "#{sym} (#{klass.name})"
21
+ end
22
+ exit 0
23
+ else
24
+ options[:type] = t.to_sym
25
25
  end
26
+ end
26
27
 
27
- opts.on '-a', '--actions a,b,c', Array,
28
- 'Actions to perform, \'list\' to list',
29
- 'Defaults to jnlp' do |a|
30
- if a == ['list']
31
- Moob::TYPES.each do |sym, klass|
32
- if klass.actions
33
- puts "#{sym}:"
34
- klass.actions.each do |name, descr|
35
- puts " #{name}: #{descr}"
36
- end
37
- else
38
- puts "#{sym} doesn't have any actions"
39
- end
40
- end
41
- exit 0
28
+ opts.on '-a', '--actions a,b,c', Array,
29
+ 'Actions to perform, \'list\' to list',
30
+ 'Defaults to jnlp' do |a|
31
+ if a == ['list']
32
+ Moob::TYPES.each do |sym, klass|
33
+ if klass.actions
34
+ puts "#{sym}:"
35
+ klass.actions.each do |name, descr|
36
+ puts " #{name}: #{descr}"
37
+ end
42
38
  else
43
- options[:actions] = a
39
+ puts "#{sym} doesn't have any actions"
44
40
  end
41
+ end
42
+ exit 0
43
+ else
44
+ options[:actions] = a
45
45
  end
46
+ end
46
47
 
47
- opts.on '-u', '--username u',
48
- 'LOM username',
49
- 'Defaults to the model\'s default if known' do |u|
50
- options[:username] = u
51
- end
48
+ opts.on '-u', '--username u',
49
+ 'LOM username',
50
+ 'Defaults to the model\'s default if known' do |u|
51
+ options[:username] = u
52
+ end
52
53
 
53
- opts.on '-p', '--password p',
54
- 'LOM password',
55
- 'Defaults to the model\'s default if known',
56
- 'Use the environment variable PASSWORD instead!' do |p|
57
- options[:password] = p
58
- end
54
+ opts.on '-p', '--password p',
55
+ 'LOM password',
56
+ 'Defaults to the model\'s default if known',
57
+ 'Use the environment variable PASSWORD instead!' do |p|
58
+ options[:password] = p
59
+ end
59
60
 
60
- opts.on '-m', '--machines a,b,c', Array,
61
- 'Comma-separated list of LOM hostnames (or - to read from stdin)' do |m|
62
- options[:machines] = m
63
- end
61
+ opts.on '-m', '--machines a,b,c', Array,
62
+ 'Comma-separated list of LOM hostnames (or - to read from stdin)' do |m|
63
+ options[:machines] = m
64
+ end
64
65
 
65
- opts.on '-v', '--verbose' do
66
- $VERBOSE = true
67
- end
66
+ opts.on '-n', '--no-ssl' do
67
+ options[:transport] = 'http'
68
+ end
69
+
70
+ opts.on '-v', '--verbose' do
71
+ $VERBOSE = true
72
+ end
68
73
  end.parse!
69
74
 
70
75
  if options[:machines].empty?
71
- $stderr.puts 'No LOMs selected.'
72
- exit 1
76
+ $stderr.puts 'No LOMs selected.'
77
+ exit 1
73
78
  elsif options[:machines] == %w[-]
74
- options[:machines] = $stdin.read.split
79
+ options[:machines] = $stdin.read.split
75
80
  end
76
81
 
77
82
  begin
78
- options[:machines].each do |h|
79
- lom = Moob.lom options[:type], h, options
83
+ options[:machines].each do |h|
84
+ lom = Moob.lom options[:type], h, options
80
85
 
81
- Moob.inform "Trying to authenticate to #{h}..."
82
- lom.authenticate
83
- Moob.inform "Authenticated on #{h}."
86
+ Moob.inform "Trying to authenticate to #{h}..."
87
+ lom.authenticate
88
+ Moob.inform "Authenticated on #{h}."
84
89
 
85
- options[:actions].each do |action|
86
- action = action.to_sym
87
- Moob.inform "Trying to perform #{action} on #{h}..."
88
- case action
89
- when :jnlp
90
- Moob.start_jnlp lom
91
- else
92
- res = lom.send action
93
- puts res if res
94
- end
95
- Moob.inform "Performed #{action} on #{h}."
96
- end
97
-
98
- lom.logout
99
- Moob.inform "Logged out of #{h}."
90
+ options[:actions].each do |action|
91
+ action = action.to_sym
92
+ Moob.inform "Trying to perform #{action} on #{h}..."
93
+ case action
94
+ when :jnlp
95
+ Moob.start_jnlp lom
96
+ else
97
+ res = lom.send action
98
+ puts res if res
99
+ end
100
+ Moob.inform "Performed #{action} on #{h}."
100
101
  end
101
- puts 'There might be a delay before Java Web Start shows up...' if options[:action] == :jnlp
102
+
103
+ lom.logout
104
+ Moob.inform "Logged out of #{h}."
105
+ end
106
+ puts 'There might be a delay before Java Web Start shows up...' if options[:action] == :jnlp
102
107
 
103
108
  rescue Exception => e
104
- $stderr.puts "\033[31mFailure: #{e.class} (#{e})\033[0m\n\n" \
105
- "Backtrace to provide in any support request:\033[2;34m"
106
- $stderr.puts e.backtrace
107
- $stderr.puts "\033[0m"
108
- exit 1
109
+ $stderr.puts "\033[31mFailure: #{e.class} (#{e})\033[0m\n\n" \
110
+ "Backtrace to provide in any support request:\033[2;34m"
111
+ $stderr.puts e.backtrace
112
+ $stderr.puts "\033[0m"
113
+ exit 1
109
114
  end
@@ -1,62 +1,63 @@
1
1
  module Moob
2
- VERSION = [0,3,3]
2
+ VERSION = [0,3,4]
3
3
 
4
- class ResponseError < Exception
5
- def initialize response
6
- @response = response
7
- end
8
- def to_s
9
- "#{@response.url} failed (status #{@response.status})"
10
- end
4
+ class ResponseError < Exception
5
+ def initialize response
6
+ @response = response
11
7
  end
12
-
13
- autoload :BaseLom, 'moob/baselom.rb'
14
- autoload :Idrac6, 'moob/idrac6.rb'
15
- autoload :Megatrends, 'moob/megatrends.rb'
16
- autoload :SunILom, 'moob/sunilom.rb'
17
- autoload :IbmEServer, 'moob/ibmeserver.rb'
18
-
19
- TYPES = {
20
- :idrac6 => Idrac6,
21
- :megatrends => Megatrends,
22
- :sun => SunILom,
23
- :ibm => IbmEServer
24
- }
25
-
26
- def self.lom type, hostname, options = {}
27
- case type
28
- when :auto
29
- TYPES.find do |sym, klass|
30
- Moob.inform "Trying type #{sym}..."
31
- lom = klass.new hostname, options
32
- if lom.detect
33
- Moob.inform "Type #{sym} detected."
34
- return lom
35
- end
36
- false
37
- end
38
- raise "Couldn't detect a known LOM type"
39
- else
40
- return TYPES[type].new hostname, options
41
- end
8
+ def to_s
9
+ "#{@response.url} failed (status #{@response.status})"
42
10
  end
43
-
44
- def self.start_jnlp lom
45
- jnlp = lom.jnlp
46
-
47
- unless jnlp[/<\/jnlp>/]
48
- raise "Invalid JNLP file (\"#{jnlp}\")"
11
+ end
12
+
13
+ autoload :BaseLom, 'moob/baselom.rb'
14
+ autoload :Idrac6, 'moob/idrac6.rb'
15
+ autoload :Megatrends, 'moob/megatrends.rb'
16
+ autoload :SunILom, 'moob/sunilom.rb'
17
+ autoload :IbmEServer, 'moob/ibmeserver.rb'
18
+
19
+ TYPES = {
20
+ :idrac6 => Idrac6,
21
+ :megatrends => Megatrends,
22
+ :sun => SunILom,
23
+ :ibm => IbmEServer
24
+ }
25
+
26
+ def self.lom type, hostname, options = {}
27
+ case type
28
+ when :auto
29
+ TYPES.find do |sym, klass|
30
+ Moob.inform "Trying type #{sym}..."
31
+ lom = klass.new hostname, options
32
+ if lom.detect
33
+ Moob.inform "Type #{sym} detected."
34
+ return lom
49
35
  end
36
+ false
37
+ end
38
+ raise 'Couldn\'t detect a known LOM type'
39
+ else
40
+ raise "Type #{type} unknown" unless TYPES[type]
41
+ return TYPES[type].new hostname, options
42
+ end
43
+ end
50
44
 
51
- filepath = "/tmp/#{lom.hostname}_#{Time.now.to_i}.jnlp"
52
- File.open filepath, 'w' do |f|
53
- f.write jnlp
54
- end
45
+ def self.start_jnlp lom
46
+ jnlp = lom.jnlp
55
47
 
56
- raise "javaws failed" unless system "javaws -wait #{filepath}"
48
+ unless jnlp[/<\/jnlp>/]
49
+ raise "Invalid JNLP file (\"#{jnlp}\")"
57
50
  end
58
51
 
59
- def self.inform msg
60
- $stderr.puts "\033[36m#{msg}\033[0m" if $VERBOSE
52
+ filepath = "/tmp/#{lom.hostname}_#{Time.now.to_i}.jnlp"
53
+ File.open filepath, 'w' do |f|
54
+ f.write jnlp
61
55
  end
56
+
57
+ raise 'javaws failed' unless system "javaws -wait #{filepath}"
58
+ end
59
+
60
+ def self.inform msg
61
+ $stderr.puts "\033[36m#{msg}\033[0m" if $VERBOSE
62
+ end
62
63
  end
@@ -5,42 +5,43 @@ require 'json'
5
5
  require 'set'
6
6
 
7
7
  class Moob::BaseLom
8
- @name = "Unknown"
9
-
10
- def initialize hostname, options = {}
11
- @hostname = hostname
12
- @username = options[:username]
13
- @password = options[:password]
14
-
15
- @session = Patron::Session.new
16
- @session.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; '\
17
- 'Intel Mac OS X 10.7; rv:5.0.1) Gecko/20100101 Firefox/5.0.1'
18
- @session.base_url = "https://#{hostname}/"
19
- @session.connect_timeout = 10_000
20
- @session.timeout = 10_000
21
- @session.insecure = true
22
- @session.default_response_charset = 'ISO-8859-1'
23
- end
24
-
25
- def logout
26
- end
27
-
28
- attr_reader :hostname, :username
29
-
30
- def detect
31
- false
32
- end
33
-
34
- def self.name
35
- @name
36
- end
37
-
38
- def self.actions
39
- @actions
40
- end
41
-
42
- def self.action sym, descr
43
- @actions ||= []
44
- @actions << [sym, descr]
45
- end
8
+ @name = "Unknown"
9
+
10
+ def initialize hostname, options = {}
11
+ @hostname = hostname
12
+ @transport = options[:transport] or 'https'
13
+ @username = options[:username]
14
+ @password = options[:password]
15
+
16
+ @session = Patron::Session.new
17
+ @session.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; '\
18
+ 'Intel Mac OS X 10.7; rv:5.0.1) Gecko/20100101 Firefox/5.0.1'
19
+ @session.base_url = "#{@transport}://#{hostname}/"
20
+ @session.connect_timeout = 10_000
21
+ @session.timeout = 10_000
22
+ @session.insecure = true
23
+ @session.default_response_charset = 'ISO-8859-1'
24
+ end
25
+
26
+ def logout
27
+ end
28
+
29
+ attr_reader :hostname, :username
30
+
31
+ def detect
32
+ false
33
+ end
34
+
35
+ def self.name
36
+ @name
37
+ end
38
+
39
+ def self.actions
40
+ @actions
41
+ end
42
+
43
+ def self.action sym, descr
44
+ @actions ||= []
45
+ @actions << [sym, descr]
46
+ end
46
47
  end
@@ -1,75 +1,74 @@
1
1
  module Moob
2
2
  class IbmEServer < BaseLom
3
- @name = 'IBM eServer Remote Supervisor Adapter'
3
+ @name = 'IBM eServer Remote Supervisor Adapter'
4
4
 
5
- def initialize hostname, options = {}
6
- super hostname, options
7
- @username ||= 'USERID'
8
- @password ||= 'PASSW0RD'
9
- end
5
+ def initialize hostname, options = {}
6
+ super hostname, options
7
+ @username ||= 'USERID'
8
+ @password ||= 'PASSW0RD'
9
+ end
10
10
 
11
- def authenticate
12
- @session.handle_cookies nil
11
+ def authenticate
12
+ @session.handle_cookies nil
13
13
 
14
- home = @session.get ''
15
- raise ResponseError.new home unless home.status == 200
14
+ home = @session.get ''
15
+ raise ResponseError.new home unless home.status == 200
16
16
 
17
- auth = @session.post 'private/check_userlogin', {
18
- 'userid' => @username,
19
- 'passwd' => @password
20
- }
21
- raise ResponseError.new auth unless auth.status == 200
17
+ auth = @session.post 'private/check_userlogin', {
18
+ 'userid' => @username,
19
+ 'passwd' => @password
20
+ }
21
+ raise ResponseError.new auth unless auth.status == 200
22
22
 
23
- init = @session.post 'private/start_menus', {
24
- 'JUNK' => '1',
25
- 'TIMEOUT' => '05'
26
- }
27
- raise ResponseError.new init unless init.status == 200
23
+ init = @session.post 'private/start_menus', {
24
+ 'JUNK' => '1',
25
+ 'TIMEOUT' => '05'
26
+ }
27
+ raise ResponseError.new init unless init.status == 200
28
28
 
29
- return self
30
- end
29
+ return self
30
+ end
31
31
 
32
- action :infos, 'Vital Product Data'
33
- def infos
34
- return JSON.pretty_generate get_infos
35
- end
32
+ action :infos, 'Vital Product Data'
33
+ def infos
34
+ return JSON.pretty_generate get_infos
35
+ end
36
36
 
37
- def detect
38
- begin
39
- home = @session.get 'private/userlogin.ssi'
40
- home.body =~ /Remote Supervisor Adapter/
41
- rescue
42
- false
43
- end
44
- end
37
+ def detect
38
+ begin
39
+ home = @session.get 'private/userlogin.ssi'
40
+ home.body =~ /Remote Supervisor Adapter/
41
+ rescue
42
+ false
43
+ end
44
+ end
45
45
 
46
- def logout
47
- page = @session.get 'private/logoff'
48
- raise ResponseError.new page unless page.status == 200
49
- end
46
+ def logout
47
+ page = @session.get 'private/logoff'
48
+ raise ResponseError.new page unless page.status == 200
49
+ end
50
50
 
51
- def get_infos
52
- page = @session.get 'private/vpd.ssi'
53
- raise ResponseError.new page unless page.status == 200
51
+ def get_infos
52
+ page = @session.get 'private/vpd.ssi'
53
+ raise ResponseError.new page unless page.status == 200
54
54
 
55
- infos = {}
55
+ infos = {}
56
56
 
57
- infos[:macs] = Hash[
58
- page.body.scan /<TR><TD[^>]*>MAC ([^:]*):<\/TD><TD[^>]*>([^<]*)<\/TD><\/TR>/
59
- ]
57
+ infos[:macs] = Hash[
58
+ page.body.scan /<TR><TD[^>]*>MAC ([^:]*):<\/TD><TD[^>]*>([^<]*)<\/TD><\/TR>/
59
+ ]
60
60
 
61
- infos[:type] = grab page.body, 'Machine type'
62
- infos[:model] = grab page.body, 'Machine model'
63
- infos[:serial] = grab page.body, 'Serial number'
64
- infos[:uuid] = grab page.body, 'UUID'
65
- end
61
+ infos[:type] = grab page.body, 'Machine type'
62
+ infos[:model] = grab page.body, 'Machine model'
63
+ infos[:serial] = grab page.body, 'Serial number'
64
+ infos[:uuid] = grab page.body, 'UUID'
65
+ end
66
66
 
67
- private
68
- def grab contents, name
69
- if contents =~ /<TR><TD[^>]*>#{name}:<\/TD><TD[^>]*>([^<]*)<\/TD><\/TR>/
70
- return $1
71
- end
67
+ private
68
+ def grab contents, name
69
+ if contents =~ /<TR><TD[^>]*>#{name}:<\/TD><TD[^>]*>([^<]*)<\/TD><\/TR>/
70
+ return $1
72
71
  end
73
-
72
+ end
74
73
  end
75
74
  end