quickmox 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,62 @@
1
+ module Quickmox
2
+
3
+ class Guest
4
+
5
+ attr_accessor :host, :id, :params
6
+
7
+ def initialize(id, host)
8
+ @host = host
9
+ @id = id
10
+ @params = Hash.new
11
+ end
12
+
13
+ def status
14
+ line = host.exec "qm status #{id}"
15
+ (line =~ /status: (.*)/) ? $1.chomp : 'unknown'
16
+ end
17
+
18
+ def start
19
+ host.exec "qm start #{id}"
20
+ end
21
+
22
+ def stop
23
+ host.exec "qm stop #{id}"
24
+ end
25
+
26
+ def set_param(param, value)
27
+ host.exec "qm set #{id} -#{param} #{value}"
28
+ end
29
+
30
+ def rescan
31
+ scan
32
+ end
33
+
34
+ def name
35
+ params[:name]
36
+ end
37
+
38
+ def scan
39
+ host.exec("qm config #{id}").split("\n").each do |line|
40
+ if line =~ /net0:.*=([0-9A-Fa-f:]{17}),/
41
+ params[:mac] = $1
42
+ params[:mac] = params[:mac].gsub(':', '').downcase
43
+ elsif line =~ /cores: ([0-9]{1,3})/
44
+ params[:cores] = $1
45
+ elsif line =~ /bootdisk: (.*)/
46
+ params[:bootdisk] = $1
47
+ elsif line =~ /description: (.*)/
48
+ params[:description] = $1
49
+ elsif line =~ /memory: ([0-9]{1,6})/
50
+ params[:memory] = $1
51
+ elsif line =~ /name: (.*)/
52
+ params[:name] = $1
53
+ elsif line =~ /onboot: ([0-9])/
54
+ params[:onboot] = $1
55
+ elsif line =~ /(scsi|virtio|ide)[0-9]{1,3}: .*size=([0-9]{1,3}[MGTK])/
56
+ params[:disk] = $2
57
+ end
58
+ end
59
+ self
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,22 @@
1
+ class Guestlist < Array
2
+
3
+ def find(id)
4
+ self.each do |el|
5
+ if el.id.eql?(id.to_s)
6
+ return el
7
+ end
8
+ end
9
+ end
10
+
11
+ def scan
12
+ self.each do |el|
13
+ el.scan
14
+ end
15
+ self
16
+ end
17
+
18
+ def rescan
19
+ scan
20
+ end
21
+
22
+ end
data/lib/quickmox/host.rb CHANGED
@@ -1,38 +1,36 @@
1
1
  require 'net/ssh'
2
- require 'ap'
3
2
  require 'resolv'
4
3
 
5
4
  module Quickmox
6
5
 
7
-
8
- # This class represents a SSH server host. It may or may not be
9
- # connected to a Proxmox server. If it's not, proxmox specific
10
- # methods like guests(), guest_params() etc. will return empty
11
- # data structures.
6
+ # This class represents a SSH server host. It may or may not be
7
+ # connected to a Proxmox server. If it's not, proxmox specific
8
+ # methods like guests(), guest_params() etc. will return empty
9
+ # data structures.
12
10
  class Host
13
11
 
14
12
  class HostError < StandardError
15
13
  end
16
14
 
17
- attr_accessor :hostname, :username, :password, :ip, :session
15
+ attr_accessor :hostname,
16
+ :username,
17
+ :password,
18
+ :ip,
19
+ :session,
20
+ :guests
18
21
 
19
- # Initialize Host object
20
- # * +hostname:+
21
- # * +username:+
22
- # * +password:+
23
- # h = Host.new(hostname:"10.0.0.1", username:"root", password:"qwerty123")
24
- def initialize(opts = {})
22
+ def initialize(opts = {})
25
23
  @hostname = opts[:hostname]
26
24
  @username = opts[:username]
27
25
  @password = opts[:password]
28
26
  begin
29
27
  @ip = Resolv.getaddress(@hostname)
30
28
  rescue => e
31
- @ip = ''
29
+ @ip = String.new
32
30
  end
31
+ @guests = Guestlist.new
33
32
  end
34
33
 
35
- # Make SSH connection and log in.
36
34
  def connect
37
35
  begin
38
36
  @session = Net::SSH.start(hostname,
@@ -43,26 +41,50 @@ module Quickmox
43
41
  timeout: 3)
44
42
 
45
43
  rescue => e
46
- raise HostError, "Warning: exception while connecting to host #{hostname}: #{e.to_s}"
44
+ raise HostError, "Warning: exception while connecting to host #{hostname}: #{e}"
45
+ end
46
+ self
47
+ end
48
+
49
+ def rescan
50
+ scan
51
+ end
52
+
53
+ def scan
54
+ guestlist.each do |id|
55
+ @guests << Guest.new(id, self)
47
56
  end
48
57
  self
49
58
  end
50
59
 
51
- # Returns local hostname obtained by the Unix 'hostname' command
60
+ def guestlist
61
+ list = Array.new
62
+ table = handle_exceptions { session.exec!('qm list') }
63
+ lines = table.split("\n")
64
+ lines.each do |line|
65
+ if line =~ /^ *([0-9]{1,4}) */
66
+ list << $1
67
+ end
68
+ end
69
+ list
70
+ end
71
+
52
72
  def localname
53
73
  handle_exceptions do
54
74
  session.exec!('hostname').chomp
55
75
  end
56
76
  end
57
77
 
58
- # Returns host uptime
59
78
  def uptime
60
79
  handle_exceptions do
61
80
  session.exec!('uptime').chomp
62
81
  end
63
82
  end
64
83
 
65
- # Disconnects the SSH session
84
+ def close
85
+ disconnect
86
+ end
87
+
66
88
  def disconnect
67
89
  begin
68
90
  session.close
@@ -71,7 +93,6 @@ module Quickmox
71
93
  end
72
94
  end
73
95
 
74
- # Checks if host responds to 'qm' commands
75
96
  def is_proxmox?
76
97
  handle_exceptions do
77
98
  output = session.exec!('qm list')
@@ -79,67 +100,12 @@ module Quickmox
79
100
  end
80
101
  end
81
102
 
82
- # Returns guest status (running/stopped/NA)
83
- # * +guest_id+ numeric ID of the guest
84
- def guest_status(guest_id)
85
- status = ''
86
- handle_exceptions do
87
- status = session.exec!("qm status #{guest_id}")
88
- end
89
- if status =~ /running/
90
- 'running'
91
- elsif status =~ /stopped/
92
- 'stopped'
93
- else
94
- 'N/A'
95
- end
96
- end
97
-
98
- # Returns a hash of guest parameters
99
- # * +guest_id+ numeric ID of the guest
100
- # h = guest_params(100)
101
- # h = guest_params("101")
102
- def guest_params(guest_id)
103
- params = {}
103
+ def exec(cmd)
104
104
  handle_exceptions do
105
- session.exec!("qm config #{guest_id}").split("\n").each do |line|
106
- if line =~ /net0:.*=([0-9A-Fa-f:]{17}),/
107
- params['mac'] = $1
108
- params['mac'].gsub!(':', '').downcase!
109
- elsif line =~ /cores: ([0-9]{1,3})/
110
- params['cores'] = $1
111
- elsif line =~ /bootdisk: (.*)/
112
- params['bootdisk'] = $1
113
- elsif line =~ /description: (.*)/
114
- params['description'] = $1
115
- elsif line =~ /memory: ([0-9]{1,6})/
116
- params['memory'] = $1
117
- elsif line =~ /name: (.*)/
118
- params['name'] = $1
119
- elsif line =~ /onboot: ([0-9])/
120
- params['onboot'] = $1
121
- elsif line =~ /(scsi|virtio|ide)[0-9]{1,3}: .*size=([0-9]{1,3}[MGTK])/
122
- params['disk'] = $2
123
- end
124
- end
125
- end
126
- params
127
- end
128
-
129
- # Returns an array of guest IDs on this host
130
- def guests
131
- guests = []
132
- table = handle_exceptions { session.exec!('qm list') }
133
- lines = table.split("\n")
134
- lines.each do |line|
135
- if line =~ /^ *([0-9]{1,4}) */
136
- guests << $1
137
- end
105
+ return session.exec!(cmd).chomp
138
106
  end
139
- guests
140
107
  end
141
108
 
142
- # Wrapper method to rescue SSH/connection exceptions
143
109
  private
144
110
  def handle_exceptions
145
111
  begin
@@ -1,3 +1,3 @@
1
1
  module Quickmox
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
data/lib/quickmox.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require "quickmox/version"
2
2
  require "quickmox/host"
3
+ require "quickmox/guest"
4
+ require "quickmox/guestlist"
3
5
 
4
6
  module Quickmox
5
7
  end
data/quickmox.gemspec CHANGED
@@ -38,7 +38,5 @@ Gem::Specification.new do |spec|
38
38
  spec.add_development_dependency "pry"
39
39
 
40
40
  spec.add_dependency "net-ssh", "~> 2.9"
41
- spec.add_dependency "awesome_print", '~> 1.6'
42
-
43
41
 
44
42
  end
metadata CHANGED
@@ -1,141 +1,144 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quickmox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - J.K.Valk
8
9
  autorequire:
9
10
  bindir: exe
10
11
  cert_chain: []
11
- date: 2015-06-15 00:00:00.000000000 Z
12
+ date: 2015-06-17 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: bundler
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
- - - "~>"
19
+ - - ~>
18
20
  - !ruby/object:Gem::Version
19
21
  version: '1.10'
20
22
  type: :development
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
- - - "~>"
27
+ - - ~>
25
28
  - !ruby/object:Gem::Version
26
29
  version: '1.10'
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: rake
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
- - - "~>"
35
+ - - ~>
32
36
  - !ruby/object:Gem::Version
33
37
  version: '10.0'
34
38
  type: :development
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
- - - "~>"
43
+ - - ~>
39
44
  - !ruby/object:Gem::Version
40
45
  version: '10.0'
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: rspec
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
- - - ">="
51
+ - - ! '>='
46
52
  - !ruby/object:Gem::Version
47
53
  version: '0'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
- - - ">="
59
+ - - ! '>='
53
60
  - !ruby/object:Gem::Version
54
61
  version: '0'
55
62
  - !ruby/object:Gem::Dependency
56
63
  name: guard
57
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
58
66
  requirements:
59
- - - ">="
67
+ - - ! '>='
60
68
  - !ruby/object:Gem::Version
61
69
  version: '0'
62
70
  type: :development
63
71
  prerelease: false
64
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
65
74
  requirements:
66
- - - ">="
75
+ - - ! '>='
67
76
  - !ruby/object:Gem::Version
68
77
  version: '0'
69
78
  - !ruby/object:Gem::Dependency
70
79
  name: guard-rspec
71
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
72
82
  requirements:
73
- - - ">="
83
+ - - ! '>='
74
84
  - !ruby/object:Gem::Version
75
85
  version: '0'
76
86
  type: :development
77
87
  prerelease: false
78
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
79
90
  requirements:
80
- - - ">="
91
+ - - ! '>='
81
92
  - !ruby/object:Gem::Version
82
93
  version: '0'
83
94
  - !ruby/object:Gem::Dependency
84
95
  name: coveralls
85
96
  requirement: !ruby/object:Gem::Requirement
97
+ none: false
86
98
  requirements:
87
- - - ">="
99
+ - - ! '>='
88
100
  - !ruby/object:Gem::Version
89
101
  version: '0'
90
102
  type: :development
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
93
106
  requirements:
94
- - - ">="
107
+ - - ! '>='
95
108
  - !ruby/object:Gem::Version
96
109
  version: '0'
97
110
  - !ruby/object:Gem::Dependency
98
111
  name: pry
99
112
  requirement: !ruby/object:Gem::Requirement
113
+ none: false
100
114
  requirements:
101
- - - ">="
115
+ - - ! '>='
102
116
  - !ruby/object:Gem::Version
103
117
  version: '0'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
107
122
  requirements:
108
- - - ">="
123
+ - - ! '>='
109
124
  - !ruby/object:Gem::Version
110
125
  version: '0'
111
126
  - !ruby/object:Gem::Dependency
112
127
  name: net-ssh
113
128
  requirement: !ruby/object:Gem::Requirement
129
+ none: false
114
130
  requirements:
115
- - - "~>"
131
+ - - ~>
116
132
  - !ruby/object:Gem::Version
117
133
  version: '2.9'
118
134
  type: :runtime
119
135
  prerelease: false
120
136
  version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
121
138
  requirements:
122
- - - "~>"
139
+ - - ~>
123
140
  - !ruby/object:Gem::Version
124
141
  version: '2.9'
125
- - !ruby/object:Gem::Dependency
126
- name: awesome_print
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '1.6'
132
- type: :runtime
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '1.6'
139
142
  description: This is VERY raw, version 1.0.0 is expected to be first usable implementation.
140
143
  email:
141
144
  - jkvalk@mail.ru
@@ -143,10 +146,10 @@ executables: []
143
146
  extensions: []
144
147
  extra_rdoc_files: []
145
148
  files:
146
- - ".coveralls.yml"
147
- - ".gitignore"
148
- - ".rspec"
149
- - ".travis.yml"
149
+ - .coveralls.yml
150
+ - .gitignore
151
+ - .rspec
152
+ - .travis.yml
150
153
  - CODE_OF_CONDUCT.md
151
154
  - Gemfile
152
155
  - README.md
@@ -154,32 +157,35 @@ files:
154
157
  - bin/console
155
158
  - bin/setup
156
159
  - lib/quickmox.rb
160
+ - lib/quickmox/guest.rb
161
+ - lib/quickmox/guestlist.rb
157
162
  - lib/quickmox/host.rb
158
163
  - lib/quickmox/version.rb
159
164
  - quickmox.gemspec
160
165
  homepage: https://github.com/jkvalk/quickmox
161
166
  licenses:
162
167
  - MIT
163
- metadata: {}
164
168
  post_install_message:
165
169
  rdoc_options: []
166
170
  require_paths:
167
171
  - lib
168
172
  required_ruby_version: !ruby/object:Gem::Requirement
173
+ none: false
169
174
  requirements:
170
- - - ">="
175
+ - - ! '>='
171
176
  - !ruby/object:Gem::Version
172
177
  version: '0'
173
178
  required_rubygems_version: !ruby/object:Gem::Requirement
179
+ none: false
174
180
  requirements:
175
- - - ">="
181
+ - - ! '>='
176
182
  - !ruby/object:Gem::Version
177
183
  version: '0'
178
184
  requirements: []
179
185
  rubyforge_project:
180
- rubygems_version: 2.2.2
186
+ rubygems_version: 1.8.23
181
187
  signing_key:
182
- specification_version: 4
188
+ specification_version: 3
183
189
  summary: Quickmox is a Ruby gem for managing Proxmox hosts by SSH screen-scraping
184
190
  techniques.
185
191
  test_files: []
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 96570c4900eedda611703f6725c527030fd2addb
4
- data.tar.gz: 0579c88cb726cc1e5f48319d682678186d6ae509
5
- SHA512:
6
- metadata.gz: 8e0b35d6df6759f86d4593d968a719b25e1c8aebade27b1b42a258209a40bed5fa90c3e74a50154f9c3c60a36ebeef52bc01547ac40b8d822b3984df26428469
7
- data.tar.gz: 935378cda0470f1bb00b9bb1a6d4a593cf631f12aa49b98f392967b71cb003ef85902f0b65211a811d11e2d627fb1f61825bc24a708c19d653b514375edc4322