lumberg 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.rvmrc +49 -1
- data/.travis.yml +11 -0
- data/README.md +153 -90
- data/Rakefile +2 -0
- data/lib/lumberg/version.rb +1 -1
- data/lib/lumberg/whm/server.rb +84 -3
- data/lumberg.gemspec +4 -5
- data/spec/vcr_cassettes/whm/server/addip.yml +22 -0
- data/spec/vcr_cassettes/whm/server/delip.yml +22 -0
- data/spec/vcr_cassettes/whm/server/listips.yml +22 -0
- data/spec/vcr_cassettes/whm/server/nvget.yml +22 -0
- data/spec/vcr_cassettes/whm/server/nvset.yml +22 -0
- data/spec/vcr_cassettes/whm/server/reboot.yml +22 -0
- data/spec/vcr_cassettes/whm/server/sethostname.yml +22 -0
- data/spec/vcr_cassettes/whm/server/setresolvers.yml +22 -0
- data/spec/vcr_cassettes/whm/server/showbw.yml +22 -0
- data/spec/whm/account_spec.rb +1 -1
- data/spec/whm/server_spec.rb +122 -4
- metadata +85 -107
- data/Gemfile.lock +0 -102
data/.gitignore
CHANGED
data/.rvmrc
CHANGED
@@ -1 +1,49 @@
|
|
1
|
-
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
+
# development environment upon cd'ing into the directory
|
5
|
+
|
6
|
+
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
|
7
|
+
environment_id="ruby-1.9.2-p180@lumberg"
|
8
|
+
|
9
|
+
#
|
10
|
+
# First we attempt to load the desired environment directly from the environment
|
11
|
+
# file. This is very fast and efficicent compared to running through the entire
|
12
|
+
# CLI and selector. If you want feedback on which environment was used then
|
13
|
+
# insert the word 'use' after --create as this triggers verbose mode.
|
14
|
+
#
|
15
|
+
if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
|
16
|
+
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]] ; then
|
17
|
+
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
18
|
+
|
19
|
+
[[ -s ".rvm/hooks/after_use" ]] && . ".rvm/hooks/after_use"
|
20
|
+
else
|
21
|
+
# If the environment file has not yet been created, use the RVM CLI to select.
|
22
|
+
rvm --create use "$environment_id"
|
23
|
+
fi
|
24
|
+
|
25
|
+
#
|
26
|
+
# If you use an RVM gemset file to install a list of gems (*.gems), you can have
|
27
|
+
# it be automatically loaded. Uncomment the following and adjust the filename if
|
28
|
+
# necessary.
|
29
|
+
#
|
30
|
+
# filename=".gems"
|
31
|
+
# if [[ -s "$filename" ]] ; then
|
32
|
+
# rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
|
33
|
+
# fi
|
34
|
+
|
35
|
+
#
|
36
|
+
# If you use bundler and would like to run bundle each time you enter the
|
37
|
+
# directory, you can uncomment the following code.
|
38
|
+
#
|
39
|
+
# # Ensure that Bundler is installed. Install it if it is not.
|
40
|
+
# if ! command -v bundle >/dev/null; then
|
41
|
+
# printf "The rubygem 'bundler' is not installed. Installing it now.\n"
|
42
|
+
# gem install bundler
|
43
|
+
# fi
|
44
|
+
#
|
45
|
+
# # Bundle while reducing excess noise.
|
46
|
+
# printf "Bundling your gems. This may take a few minutes on a fresh clone.\n"
|
47
|
+
# bundle | grep -v '^Using ' | grep -v ' is complete' | sed '/^$/d'
|
48
|
+
#
|
49
|
+
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,81 +1,111 @@
|
|
1
|
-
Lumberg
|
2
|
-
|
1
|
+
Lumberg [![Lumberg Build Status][Build Icon]][Build Status]
|
2
|
+
===========================================================
|
3
3
|
|
4
4
|
![Lumberg logo](http://i.imgur.com/xC4Sw.jpg)
|
5
5
|
|
6
|
-
Ruby library for the WHM & cPanel API. It is currently what we consider to be
|
6
|
+
Ruby library for the WHM & cPanel API. It is currently what we consider to be
|
7
|
+
beta-ish. Please report any issues you find. :)
|
7
8
|
|
8
9
|
[RDoc](http://rdoc.info/github/site5/lumberg/master/frames)
|
9
10
|
|
10
|
-
Confirmed to work with ruby 1.8.7, 1.9.2 and JRuby 1.6.0 on
|
11
|
+
Confirmed to work with ruby 1.8.7, 1.9.2, Rubinius, REE and JRuby 1.6.0 on
|
12
|
+
cPanel 11.28+
|
13
|
+
|
14
|
+
[Build Status]: http://travis-ci.org/site5/lumberg
|
15
|
+
[Build Icon]: https://secure.travis-ci.org/site5/lumberg.png?branch=master
|
16
|
+
|
11
17
|
|
12
18
|
Install
|
13
19
|
-------
|
14
20
|
|
15
21
|
gem install lumberg
|
16
22
|
|
23
|
+
|
17
24
|
Usage
|
18
25
|
-----
|
19
26
|
|
20
27
|
Create a server object and connect to WHM using your host and hash:
|
21
28
|
|
22
|
-
|
23
|
-
|
29
|
+
```ruby
|
30
|
+
require 'lumberg'
|
31
|
+
server = Lumberg::Whm::Server.new(
|
32
|
+
:host => WHM_HOST,
|
33
|
+
:hash => WHM_HASH
|
34
|
+
)
|
35
|
+
```
|
36
|
+
|
37
|
+
If you are using HTTP Basic Authentication with a username/password:
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
server = Lumberg::Whm::Server.new(
|
41
|
+
:host => WHM_HOST,
|
42
|
+
:user => USERNAME,
|
43
|
+
:hash => 'my_password'
|
44
|
+
)
|
45
|
+
```
|
24
46
|
|
25
|
-
You can access the modules of WHM by calling server.<module
|
47
|
+
You can access the modules of WHM by calling `server.<module>`. For example,
|
48
|
+
`server.account` or `server.dns`. Here are the currently supported modules:
|
26
49
|
|
27
50
|
* Account
|
28
51
|
* DNS
|
29
52
|
* Reseller
|
30
53
|
|
31
|
-
|
32
54
|
Here's how to get a list of accounts:
|
33
55
|
|
34
|
-
|
35
|
-
|
56
|
+
```ruby
|
57
|
+
account = server.account
|
58
|
+
result = account.list
|
59
|
+
```
|
36
60
|
|
37
61
|
Most responses will return success and a message
|
38
62
|
|
39
|
-
|
63
|
+
```ruby
|
64
|
+
p "Returned #{result[:success]} with message: #{result[:message]}"
|
40
65
|
|
41
|
-
|
66
|
+
Returned true with message: Ok
|
67
|
+
```
|
42
68
|
|
43
69
|
You can grab the data you need from the results hash
|
44
70
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
71
|
+
```ruby
|
72
|
+
num_accounts = result[:params][:acct].size
|
73
|
+
p "There are #{num_accounts} accounts"
|
74
|
+
|
75
|
+
There are 6 accounts
|
76
|
+
```
|
77
|
+
|
78
|
+
Here's an example of what the returned data looks like for a single account
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
pp result[:params][:acct].first
|
82
|
+
|
83
|
+
{
|
84
|
+
:startdate=>false,
|
85
|
+
:plan => "default",
|
86
|
+
:suspended => false,
|
87
|
+
:theme => "x3",
|
88
|
+
:shell => "/usr/local/cpanel/bin/jailshell",
|
89
|
+
:maxpop => "unlimited",
|
90
|
+
:maxlst => "unlimited",
|
91
|
+
:maxaddons => "*unknown*",
|
92
|
+
:suspendtime => nil,
|
93
|
+
:ip => false,
|
94
|
+
:maxsub => "unlimited",
|
95
|
+
:domain => "bob.com",
|
96
|
+
:maxsql => "unlimited",
|
97
|
+
:partition => "home",
|
98
|
+
:maxftp => "unlimited",
|
99
|
+
:user => "bob",
|
100
|
+
:suspendreason => "not suspended",
|
101
|
+
:unix_startdate => false,
|
102
|
+
:diskused => false,
|
103
|
+
:maxparked => "*unknown*",
|
104
|
+
:email => "*unknown*",
|
105
|
+
:disklimit => "unlimited",
|
106
|
+
:owner => "root"
|
107
|
+
}
|
108
|
+
```
|
79
109
|
|
80
110
|
|
81
111
|
Account Example
|
@@ -83,80 +113,110 @@ Account Example
|
|
83
113
|
|
84
114
|
Creating a new account requires only a username, domain, and password.
|
85
115
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
116
|
+
```ruby
|
117
|
+
result = server.account.create(
|
118
|
+
:username => 'newuser',
|
119
|
+
:domain => 'newuser.com',
|
120
|
+
:password => 'password'
|
121
|
+
)
|
90
122
|
|
91
|
-
|
123
|
+
if result[:success]
|
124
|
+
p result[:message]
|
125
|
+
end
|
92
126
|
|
127
|
+
Account Creation Ok
|
128
|
+
```
|
93
129
|
|
94
130
|
You can list all accounts or search for a specific account.
|
95
131
|
|
96
|
-
|
97
|
-
|
98
|
-
|
132
|
+
```ruby
|
133
|
+
result = server.account.list(:search => 'new', :searchtype => 'user')
|
134
|
+
acct = result[:params][:acct].first
|
135
|
+
p "Found user '#{acct[:user]}' with domain '#{acct[:domain]}'"
|
99
136
|
|
100
|
-
|
137
|
+
Found user 'newuser' with domain 'newuser.com'
|
138
|
+
```
|
101
139
|
|
102
140
|
|
103
141
|
Suspending an account is simple and the reason for suspension is optional.
|
104
142
|
|
105
|
-
|
106
|
-
|
143
|
+
```ruby
|
144
|
+
result = server.account.suspend(:username => 'newuser', :reason => 'bad user')
|
145
|
+
p "user was suspended successfully" if result[:success]
|
107
146
|
|
108
|
-
|
147
|
+
user was suspended successfully
|
148
|
+
```
|
109
149
|
|
110
|
-
We can look at the account list again to see the reason for the user's
|
150
|
+
We can look at the account list again to see the reason for the user's
|
151
|
+
suspension.
|
111
152
|
|
112
|
-
|
113
|
-
|
114
|
-
|
153
|
+
```ruby
|
154
|
+
result = server.account.list(:search => 'new', :searchtype => 'user')
|
155
|
+
acct = result[:params][:acct].first
|
156
|
+
p "user '#{acct[:user]}' was suspended with reason '#{acct[:suspendreason]}'"
|
115
157
|
|
116
|
-
|
158
|
+
user 'newuser' was suspended with reason 'bad user'
|
159
|
+
```
|
117
160
|
|
118
161
|
Finally, we remove the user and delete their account.
|
119
162
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
newuser account removed
|
163
|
+
```ruby
|
164
|
+
result = server.account.remove(:username => 'newuser')
|
165
|
+
p result[:message]
|
124
166
|
|
167
|
+
newuser account removed
|
168
|
+
```
|
125
169
|
|
126
170
|
|
127
171
|
Reseller Example
|
128
172
|
----------------
|
129
173
|
|
130
|
-
Creating a reseller works by changing the status of an existing user account,
|
174
|
+
Creating a reseller works by changing the status of an existing user account,
|
175
|
+
so first we create a user account and then we can create that user as a reseller.
|
131
176
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
177
|
+
```ruby
|
178
|
+
result = server.account.create(
|
179
|
+
:username => 'rtest',
|
180
|
+
:domain => 'resellerexample.com',
|
181
|
+
:password => 'password'
|
182
|
+
)
|
137
183
|
|
138
|
-
|
184
|
+
if result[:success]
|
185
|
+
result = server.reseller.create(:username => 'rtest', :makeowner => true)
|
186
|
+
p "created reseller rtest" if result[:success]
|
187
|
+
end
|
139
188
|
|
140
|
-
|
189
|
+
created reseller rtest
|
190
|
+
```
|
141
191
|
|
142
|
-
|
143
|
-
p result[:params][:resellers].inspect
|
192
|
+
You can get a list of all of the reseller accounts easily.
|
144
193
|
|
145
|
-
|
194
|
+
```
|
195
|
+
result = server.reseller.list
|
196
|
+
p result[:params][:resellers].inspect
|
146
197
|
|
147
|
-
|
198
|
+
["samir", "rtest"]
|
199
|
+
```
|
148
200
|
|
149
|
-
|
150
|
-
|
201
|
+
Suspending a reseller is pretty straightforward. It's optional to provide a
|
202
|
+
reason for the suspension.
|
151
203
|
|
152
|
-
|
153
|
-
|
154
|
-
|
204
|
+
```ruby
|
205
|
+
result = server.reseller.suspend(:username => 'rtest', :reason => 'bad user')
|
206
|
+
p "reseller was suspended successfully" if result[:success]
|
155
207
|
|
156
|
-
|
157
|
-
|
208
|
+
user was suspended successfully
|
209
|
+
```
|
158
210
|
|
159
|
-
|
211
|
+
Deleting the reseller removes the reseller status from the user account. To
|
212
|
+
also delete the user account, set the `:terminatereseller` argument.
|
213
|
+
|
214
|
+
```ruby
|
215
|
+
result = server.reseller.terminate(:reseller => 'rtest', :terminatereseller => true)
|
216
|
+
p result[:message]
|
217
|
+
|
218
|
+
Account Terminations Complete
|
219
|
+
```
|
160
220
|
|
161
221
|
Contributors
|
162
222
|
============
|
@@ -166,15 +226,18 @@ Contributors
|
|
166
226
|
|
167
227
|
Note on Patches/Pull Requests
|
168
228
|
=============================
|
169
|
-
|
170
|
-
|
229
|
+
|
230
|
+
All HTTP interactions are recorded using VCR and FakeWeb. Please be sure to
|
231
|
+
remove any sensitive information from your cassettes.
|
232
|
+
|
171
233
|
* Fork the project.
|
172
234
|
* Add yourself to the Contributors list
|
173
235
|
* Make your feature addition or bug fix.
|
174
236
|
* Add tests for it. This is important so I don't break it in a
|
175
237
|
future version unintentionally.
|
176
238
|
* Commit, do not mess with rakefile, version, or history.
|
177
|
-
(if you want to have your own version, that is fine but bump version in a
|
239
|
+
(if you want to have your own version, that is fine but bump version in a
|
240
|
+
commit by itself I can ignore when I pull)
|
178
241
|
* Send me a pull request. Bonus points for topic branches.
|
179
242
|
|
180
243
|
Copyright
|
data/Rakefile
CHANGED
data/lib/lumberg/version.rb
CHANGED
data/lib/lumberg/whm/server.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'cgi'
|
2
|
+
require 'base64'
|
2
3
|
|
3
4
|
module Lumberg
|
4
5
|
module Whm
|
@@ -12,6 +13,9 @@ module Lumberg
|
|
12
13
|
# Base URL to the WHM API
|
13
14
|
attr_accessor :base_url
|
14
15
|
|
16
|
+
# Enable Basic Authentication with API - default false
|
17
|
+
attr_accessor :basic_auth
|
18
|
+
|
15
19
|
# API username - :default => root
|
16
20
|
attr_accessor :user
|
17
21
|
|
@@ -47,10 +51,11 @@ module Lumberg
|
|
47
51
|
# ==== Optional
|
48
52
|
# * <tt>:user</tt> - PENDING
|
49
53
|
# * <tt>:ssl</tt> - PENDING
|
54
|
+
# * <tt>:basic_auth</tt>
|
50
55
|
def initialize(options)
|
51
56
|
Args.new(options) do |c|
|
52
57
|
c.requires :host, :hash
|
53
|
-
c.optionals :user, :ssl
|
58
|
+
c.optionals :user, :ssl, :basic_auth
|
54
59
|
end
|
55
60
|
|
56
61
|
@ssl_verify ||= false
|
@@ -58,6 +63,7 @@ module Lumberg
|
|
58
63
|
@host = options.delete(:host)
|
59
64
|
@hash = format_hash(options.delete(:hash))
|
60
65
|
@user = (options.has_key?(:user) ? options.delete(:user) : 'root')
|
66
|
+
@basic_auth = options.has_key?(:basic_auth) && options.delete(:basic_auth)
|
61
67
|
|
62
68
|
@base_url = format_url(options)
|
63
69
|
end
|
@@ -110,6 +116,75 @@ module Lumberg
|
|
110
116
|
perform_request('getlanglist', {:key => 'lang'})
|
111
117
|
end
|
112
118
|
|
119
|
+
def list_ips
|
120
|
+
perform_request('listips', {:key => 'result'})
|
121
|
+
end
|
122
|
+
|
123
|
+
def add_ip(options = {})
|
124
|
+
Args.new(options) do |c|
|
125
|
+
c.requires :ip, :netmask
|
126
|
+
end
|
127
|
+
|
128
|
+
perform_request('addip', options.merge(:key => 'addip'))
|
129
|
+
end
|
130
|
+
|
131
|
+
def delete_ip(options = {})
|
132
|
+
Args.new(options) do |c|
|
133
|
+
c.requires :ip
|
134
|
+
c.optionals :ethernetdev
|
135
|
+
c.booleans :skipifshutdown
|
136
|
+
end
|
137
|
+
|
138
|
+
perform_request('delip', options.merge(:key => 'delip'))
|
139
|
+
end
|
140
|
+
|
141
|
+
def set_hostname(options = {})
|
142
|
+
Args.new(options) do |c|
|
143
|
+
c.requires :hostname
|
144
|
+
end
|
145
|
+
|
146
|
+
perform_request('sethostname', options.merge(:key => 'sethostname'))
|
147
|
+
end
|
148
|
+
|
149
|
+
def set_resolvers(options = {})
|
150
|
+
Args.new(options) do |c|
|
151
|
+
c.requires :nameserver1
|
152
|
+
c.optionals :nameserver2, :nameserver3
|
153
|
+
end
|
154
|
+
|
155
|
+
perform_request('setresolvers', options.merge(:key => 'setresolvers'))
|
156
|
+
end
|
157
|
+
|
158
|
+
def show_bandwidth(options = {})
|
159
|
+
Args.new(options) do |c|
|
160
|
+
c.optionals :month, :year, :showres, :search, :searchtype
|
161
|
+
end
|
162
|
+
|
163
|
+
perform_request('showbw', options.merge(:key => 'bandwidth'))
|
164
|
+
end
|
165
|
+
|
166
|
+
def set_nv_var(options = {})
|
167
|
+
Args.new(options) do |c|
|
168
|
+
c.requires :key
|
169
|
+
c.optionals :value
|
170
|
+
end
|
171
|
+
|
172
|
+
perform_request('nvset', options.merge(:key => 'nvset'))
|
173
|
+
end
|
174
|
+
|
175
|
+
def get_nv_var(options = {})
|
176
|
+
Args.new(options) do |c|
|
177
|
+
c.requires :key
|
178
|
+
c.optionals :value
|
179
|
+
end
|
180
|
+
|
181
|
+
perform_request('nvget', options.merge(:key => 'nvget'))
|
182
|
+
end
|
183
|
+
|
184
|
+
def reboot
|
185
|
+
perform_request('reboot', {:key => "reboot"})
|
186
|
+
end
|
187
|
+
|
113
188
|
protected
|
114
189
|
def response_type
|
115
190
|
if !@force_response_type.nil?
|
@@ -268,10 +343,16 @@ module Lumberg
|
|
268
343
|
query = uri.query
|
269
344
|
url << "?" + query unless query.nil? || query.empty?
|
270
345
|
|
271
|
-
# Add Auth Header
|
272
346
|
req = Net::HTTP::Get.new(url)
|
273
|
-
req.add_field("Authorization", "WHM #{@user}:#{@hash}")
|
274
347
|
|
348
|
+
# Add Auth Header
|
349
|
+
if basic_auth
|
350
|
+
encoded = Base64.encode64("#{@user}:#{@hash}")
|
351
|
+
auth = "Basic #{encoded}"
|
352
|
+
else
|
353
|
+
auth = "WHM #{@user}:#{@hash}"
|
354
|
+
end
|
355
|
+
req.add_field("Authorization", auth)
|
275
356
|
req
|
276
357
|
end
|
277
358
|
|
data/lumberg.gemspec
CHANGED
@@ -16,11 +16,10 @@ Gem::Specification.new do |s|
|
|
16
16
|
|
17
17
|
s.add_dependency 'json'
|
18
18
|
s.add_runtime_dependency('jruby-openssl', '~> 0.7.3') if RUBY_PLATFORM == 'java'
|
19
|
-
s.add_development_dependency 'rspec'
|
20
|
-
s.add_development_dependency 'fakeweb'
|
21
|
-
s.add_development_dependency 'vcr'
|
22
|
-
s.add_development_dependency '
|
23
|
-
s.add_development_dependency 'metric_fu'
|
19
|
+
s.add_development_dependency 'rspec', '~> 2.8.0'
|
20
|
+
s.add_development_dependency 'fakeweb', '~> 1.3.0'
|
21
|
+
s.add_development_dependency 'vcr', '~> 1.11.3'
|
22
|
+
s.add_development_dependency 'rake', '~> 0.9.2.2'
|
24
23
|
|
25
24
|
s.files = `git ls-files`.split("\n")
|
26
25
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::HTTPInteraction
|
3
|
+
request: !ruby/struct:VCR::Request
|
4
|
+
method: :get
|
5
|
+
uri: https://myhost.com:2087/json-api/addip?ip=208.77.188.166&netmask=255.255.255.0
|
6
|
+
body:
|
7
|
+
headers:
|
8
|
+
authorization:
|
9
|
+
- WHM root:iscool
|
10
|
+
response: !ruby/struct:VCR::Response
|
11
|
+
status: !ruby/struct:VCR::ResponseStatus
|
12
|
+
code: 200
|
13
|
+
message: OK
|
14
|
+
headers:
|
15
|
+
server:
|
16
|
+
- cpsrvd/11.28.87
|
17
|
+
transfer-encoding:
|
18
|
+
- chunked
|
19
|
+
content-type:
|
20
|
+
- text/plain
|
21
|
+
body: "{\"addip\":[{\"errors\":[],\"status\":1,\"statusmsg\":\"Success\",\"msgs\":\"eth0:cp242 is now up. 208.77.188.166/255.255.255.0 broadcast 208.77.188.255 has been added\\nSystem has 240 free ips.\"}]}"
|
22
|
+
http_version: "1.1"
|
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::HTTPInteraction
|
3
|
+
request: !ruby/struct:VCR::Request
|
4
|
+
method: :get
|
5
|
+
uri: https://myhost.com:2087/json-api/delip?ip=208.77.188.166
|
6
|
+
body:
|
7
|
+
headers:
|
8
|
+
authorization:
|
9
|
+
- WHM root:iscool
|
10
|
+
response: !ruby/struct:VCR::Response
|
11
|
+
status: !ruby/struct:VCR::ResponseStatus
|
12
|
+
code: 200
|
13
|
+
message: OK
|
14
|
+
headers:
|
15
|
+
server:
|
16
|
+
- cpsrvd/11.28.87
|
17
|
+
transfer-encoding:
|
18
|
+
- chunked
|
19
|
+
content-type:
|
20
|
+
- text/plain
|
21
|
+
body: "{\"delip\":[{\"status\":1,\"statusmsg\":\"208.77.188.166 has been removed.\",\"warnings\":[\"Skipping shutdown of ethernet device 208.77.188.166 is bound to.\"]}]}"
|
22
|
+
http_version: "1.1"
|