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.
- data/lib/quickmox/guest.rb +62 -0
- data/lib/quickmox/guestlist.rb +22 -0
- data/lib/quickmox/host.rb +43 -77
- data/lib/quickmox/version.rb +1 -1
- data/lib/quickmox.rb +2 -0
- data/quickmox.gemspec +0 -2
- metadata +47 -41
- checksums.yaml +0 -7
@@ -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
|
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
|
-
#
|
9
|
-
#
|
10
|
-
#
|
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,
|
15
|
+
attr_accessor :hostname,
|
16
|
+
:username,
|
17
|
+
:password,
|
18
|
+
:ip,
|
19
|
+
:session,
|
20
|
+
:guests
|
18
21
|
|
19
|
-
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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!(
|
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
|
data/lib/quickmox/version.rb
CHANGED
data/lib/quickmox.rb
CHANGED
data/quickmox.gemspec
CHANGED
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.
|
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-
|
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
|
-
-
|
147
|
-
-
|
148
|
-
-
|
149
|
-
-
|
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:
|
186
|
+
rubygems_version: 1.8.23
|
181
187
|
signing_key:
|
182
|
-
specification_version:
|
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
|