quickmox 0.1.3 → 0.1.4

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.
@@ -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