lumberg 1.0.0 → 1.0.1
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/.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
|

|
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"
|