panelbeater 0.1.0
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/Rakefile +72 -0
- data/Readme.markdown +1 -0
- data/cpanel-gem.gemspec +30 -0
- data/lib/panelbeater.rb +10 -0
- data/lib/panelbeater/cpanel/commands.rb +10 -0
- data/lib/panelbeater/model.rb +26 -0
- data/lib/panelbeater/remote.rb +43 -0
- data/lib/panelbeater/response.rb +17 -0
- data/lib/panelbeater/whm/commands.rb +333 -0
- data/pkg/cpanel-gem-0.1.0.gem +0 -0
- data/test/fixtures/applist.json +1 -0
- data/test/fixtures/createacct_fail.json +1 -0
- data/test/fixtures/createacct_success.json +1 -0
- data/test/fixtures/passwd_fail.json +1 -0
- data/test/fixtures/passwd_success.json +1 -0
- data/test/test_helper.rb +25 -0
- data/test/whm_test.rb +80 -0
- metadata +106 -0
data/Rakefile
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "rake/gempackagetask"
|
3
|
+
require "rake/rdoctask"
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
task :default => :package do
|
8
|
+
puts "Don't forget to write some tests!"
|
9
|
+
end
|
10
|
+
|
11
|
+
# This builds the actual gem. For details of what all these options
|
12
|
+
# mean, and other ones you can add, check the documentation here:
|
13
|
+
#
|
14
|
+
# http://rubygems.org/read/chapter/20
|
15
|
+
#
|
16
|
+
spec = Gem::Specification.new do |s|
|
17
|
+
|
18
|
+
# Change these as appropriate
|
19
|
+
s.name = "panelbeater"
|
20
|
+
s.version = "0.1.0"
|
21
|
+
s.summary = "A gem for communicating with the cPanel and WHM API's"
|
22
|
+
s.author = "Jamie Dyer"
|
23
|
+
s.email = "jamie@kernowsoul.com"
|
24
|
+
s.homepage = "http://kernowsoul.com"
|
25
|
+
|
26
|
+
s.has_rdoc = false
|
27
|
+
# You should probably have a README of some kind. Change the filename
|
28
|
+
# as appropriate
|
29
|
+
# s.extra_rdoc_files = %w(README)
|
30
|
+
# s.rdoc_options = %w(--main README)
|
31
|
+
|
32
|
+
# Add any extra files to include in the gem (like your README)
|
33
|
+
s.files = %w() + Dir.glob("{**/*}")
|
34
|
+
s.test_files = Dir.glob('test/fixtures/*') + Dir.glob('test/*.rb') + Dir.glob('test/*.example')
|
35
|
+
|
36
|
+
s.require_paths = ["lib"]
|
37
|
+
|
38
|
+
# If you want to depend on other gems, add them here, along with any
|
39
|
+
# relevant versions
|
40
|
+
s.add_dependency("json")
|
41
|
+
|
42
|
+
# If your tests use any gems, include them here
|
43
|
+
s.add_development_dependency("shoulda")
|
44
|
+
s.add_development_dependency("fakeweb")
|
45
|
+
|
46
|
+
# If you want to publish automatically to rubyforge, you'll may need
|
47
|
+
# to tweak this, and the publishing task below too.
|
48
|
+
end
|
49
|
+
|
50
|
+
# This task actually builds the gem. We also regenerate a static
|
51
|
+
# .gemspec file, which is useful if something (i.e. GitHub) will
|
52
|
+
# be automatically building a gem for this project. If you're not
|
53
|
+
# using GitHub, edit as appropriate.
|
54
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
55
|
+
pkg.gem_spec = spec
|
56
|
+
|
57
|
+
# Generate the gemspec file for github.
|
58
|
+
file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
|
59
|
+
File.open(file, "w") {|f| f << spec.to_ruby }
|
60
|
+
end
|
61
|
+
|
62
|
+
# Generate documentation
|
63
|
+
Rake::RDocTask.new do |rd|
|
64
|
+
|
65
|
+
rd.rdoc_files.include("lib/**/*.rb")
|
66
|
+
rd.rdoc_dir = "rdoc"
|
67
|
+
end
|
68
|
+
|
69
|
+
desc 'Clear out RDoc and generated packages'
|
70
|
+
task :clean => [:clobber_rdoc, :clobber_package] do
|
71
|
+
rm "#{spec.name}.gemspec"
|
72
|
+
end
|
data/Readme.markdown
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
#cPanel gem
|
data/cpanel-gem.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{cpanel-gem}
|
5
|
+
s.version = "0.1.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Jamie Dyer"]
|
9
|
+
s.date = %q{2010-01-29}
|
10
|
+
s.email = %q{jamie@kernowsoul.com}
|
11
|
+
s.files = ["cpanel-gem.gemspec", "lib", "lib/cpanel_api", "lib/cpanel_api/cpanel", "lib/cpanel_api/cpanel/commands.rb", "lib/cpanel_api/model.rb", "lib/cpanel_api/remote.rb", "lib/cpanel_api/response.rb", "lib/cpanel_api/whm", "lib/cpanel_api/whm/commands.rb", "lib/cpanel_api.rb", "Rakefile", "Readme.markdown", "test", "test/fixtures", "test/fixtures/applist.json", "test/fixtures/createacct_fail.json", "test/fixtures/createacct_success.json", "test/fixtures/passwd_fail.json", "test/fixtures/passwd_success.json", "test/test_helper.rb", "test/whm_test.rb", "~"]
|
12
|
+
s.homepage = %q{http://kernowsoul.com}
|
13
|
+
s.require_paths = ["lib"]
|
14
|
+
s.rubygems_version = %q{1.3.5}
|
15
|
+
s.summary = %q{A gem for communicating with cPanel}
|
16
|
+
s.test_files = ["test/fixtures/applist.json", "test/fixtures/createacct_fail.json", "test/fixtures/createacct_success.json", "test/fixtures/passwd_fail.json", "test/fixtures/passwd_success.json", "test/test_helper.rb", "test/whm_test.rb"]
|
17
|
+
|
18
|
+
if s.respond_to? :specification_version then
|
19
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
20
|
+
s.specification_version = 3
|
21
|
+
|
22
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
23
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
24
|
+
else
|
25
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
26
|
+
end
|
27
|
+
else
|
28
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
29
|
+
end
|
30
|
+
end
|
data/lib/panelbeater.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
module CpanelApi
|
2
|
+
module Cpanel
|
3
|
+
module Commands
|
4
|
+
|
5
|
+
def addsubdomain(user, subdomain, rootdomain, directory)
|
6
|
+
cpanel(user, {:xmlin => "<cpanelaction><module>SubDomain</module><func>addsubdomain</func><args><domain>#{subdomain}</domain><rootdomain>#{rootdomain}</rootdomain><dir>#{directory}</dir></args></cpanelaction>"})
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module CpanelApi
|
2
|
+
module Model
|
3
|
+
|
4
|
+
def key_mappings(map, hash)
|
5
|
+
map.each_key do |k|
|
6
|
+
if hash.has_key? k
|
7
|
+
hash[map[k]] = hash[k]
|
8
|
+
hash.delete(k)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
hash
|
12
|
+
end
|
13
|
+
|
14
|
+
def filter_options(hash)
|
15
|
+
hash.each do |k,v|
|
16
|
+
if v == true
|
17
|
+
hash[k] = 1
|
18
|
+
elsif v == false
|
19
|
+
hash[k] = 0
|
20
|
+
end
|
21
|
+
end
|
22
|
+
hash.delete_if {|k,v| v.nil? }
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module CpanelApi
|
2
|
+
module Remote
|
3
|
+
|
4
|
+
@@default_port = 2087
|
5
|
+
@@default_user = 'root'
|
6
|
+
|
7
|
+
def set_server(options={})
|
8
|
+
self.base_url = options[:url]
|
9
|
+
self.user = options[:user] ||= @@default_user
|
10
|
+
self.api_key = options[:api_key].gsub(/\n|\r/, '')
|
11
|
+
self.port = options[:port] ||= @@default_port
|
12
|
+
end
|
13
|
+
|
14
|
+
def connect(server, port, command, username, api_key, options={})
|
15
|
+
http = Net::HTTP.new(server, port)
|
16
|
+
http.use_ssl = true
|
17
|
+
http.start do |http|
|
18
|
+
req = Net::HTTP::Get.new "/json-api/#{command}#{map_options_to_url(options)}"
|
19
|
+
req.add_field 'Authorization', "WHM #{username}:#{api_key}"
|
20
|
+
# req.each_header {|k,v| @log.info "#{k}: #{v}"}
|
21
|
+
http.request(req)
|
22
|
+
# puts response.to_yaml
|
23
|
+
# response.value
|
24
|
+
# response.body
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def do_request(command, options={}, mappings=nil)
|
29
|
+
options = key_mappings(mappings, options) unless mappings.nil?
|
30
|
+
options = filter_options(options)
|
31
|
+
response = connect self.base_url, self.port, command, self.user, self.api_key, options
|
32
|
+
# if response.code == '200'
|
33
|
+
# response.json = JSON.parse(response.body)
|
34
|
+
# end
|
35
|
+
CpanelApi::Response.new(response)
|
36
|
+
end
|
37
|
+
|
38
|
+
def map_options_to_url(options={})
|
39
|
+
'?' + options.map { |k,v| "%s=%s" % [URI.encode(k.to_s), URI.encode(v.to_s)] }.join('&') unless options.nil?
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module CpanelApi
|
2
|
+
class Response
|
3
|
+
|
4
|
+
def initialize(response)
|
5
|
+
@response = response
|
6
|
+
end
|
7
|
+
|
8
|
+
def json
|
9
|
+
JSON.parse @response.body
|
10
|
+
end
|
11
|
+
|
12
|
+
def method_missing(method, *args)
|
13
|
+
@response.send(method) if @response.respond_to?(method)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,333 @@
|
|
1
|
+
module CpanelApi
|
2
|
+
module Whm
|
3
|
+
class Commands
|
4
|
+
include Model
|
5
|
+
include Remote
|
6
|
+
include Cpanel
|
7
|
+
|
8
|
+
attr_accessor :base_url
|
9
|
+
attr_accessor :user
|
10
|
+
attr_accessor :api_key
|
11
|
+
attr_accessor :port
|
12
|
+
|
13
|
+
def initialize(options={})
|
14
|
+
@log = Logger.new(STDOUT)
|
15
|
+
@log.level = Logger::INFO
|
16
|
+
set_server(options)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Each WHM API command has its own method
|
20
|
+
|
21
|
+
# Get a users account summary
|
22
|
+
def accountsummary(user)
|
23
|
+
do_request 'accountsummary', {:user => user}
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
# Add a new package
|
28
|
+
#
|
29
|
+
# required params:
|
30
|
+
# name
|
31
|
+
# quota
|
32
|
+
# maxftp
|
33
|
+
# maxsql
|
34
|
+
# maxpop
|
35
|
+
# maxlists
|
36
|
+
# maxsub
|
37
|
+
# maxpark
|
38
|
+
# maxaddon
|
39
|
+
# bwlimit
|
40
|
+
|
41
|
+
def addpkg(options={}, mappings=nil)
|
42
|
+
default_options = { :featurelist => 'default',
|
43
|
+
:ip => 0,
|
44
|
+
:cgi => 1,
|
45
|
+
:frontpage => 0,
|
46
|
+
:cpmod => 'x3',
|
47
|
+
:hasshell => 0 }
|
48
|
+
all_options = default_options.merge!(options)
|
49
|
+
do_request 'addpkg', all_options, mappings
|
50
|
+
end
|
51
|
+
|
52
|
+
# Returns a list of available commands
|
53
|
+
def applist
|
54
|
+
do_request 'applist'
|
55
|
+
end
|
56
|
+
|
57
|
+
# Change a users package
|
58
|
+
def changepackage(user, package)
|
59
|
+
do_request 'changepackage', {:user => user, :pkg => package}
|
60
|
+
end
|
61
|
+
|
62
|
+
# Call cpanel API1 and API2 commands
|
63
|
+
#
|
64
|
+
# user (string)
|
65
|
+
# The name of the user that owns the cPanel account to be affected.
|
66
|
+
# xmlin (XML)
|
67
|
+
# XML container for the function. Format <cpanelaction><module><func><args></args></func></module></cpanelaction>
|
68
|
+
# module (string)
|
69
|
+
# Name of the module to access. (See http://www.cpanel.net/plugins/api2/index.html for module and function names)
|
70
|
+
# apiversion (integer)
|
71
|
+
# Version of the API to access. (1 = API1, no input defaults to API2)
|
72
|
+
# func (string)
|
73
|
+
# Name of the function to access. (See http://www.cpanel.net/plugins/api2/index.html for module and function names)
|
74
|
+
# args (XML or string)
|
75
|
+
# List of arguments or argument container. See examples for API1 and API2 passing arguments.
|
76
|
+
|
77
|
+
def cpanel(user, options={})
|
78
|
+
default_options = { :apiversion => 2 }
|
79
|
+
all_options = default_options.merge!(options).merge!(:user => user)
|
80
|
+
do_request 'cpanel', all_options
|
81
|
+
end
|
82
|
+
|
83
|
+
# Create a new account
|
84
|
+
#
|
85
|
+
# username (string)
|
86
|
+
# User name of the account. Ex: user
|
87
|
+
# domain (string)
|
88
|
+
# Domain name. Ex: domain.tld
|
89
|
+
# plan (string)
|
90
|
+
# Package to use for account creation. Ex: reseller_gold
|
91
|
+
# quota (integer)
|
92
|
+
# Disk space quota in MB. (0-999999, 0 is unlimited)
|
93
|
+
# password (string)
|
94
|
+
# Password to access cPanel. Ex: p@ss!w0rd$123
|
95
|
+
# ip (string)
|
96
|
+
# Whether or not the domain has a dedicated IP address. (y = Yes, n = No)
|
97
|
+
# cgi (string)
|
98
|
+
# Whether or not the domain has cgi access. (y = Yes, n = No)
|
99
|
+
# frontpage (string)
|
100
|
+
# Whether or not the domain has FrontPage extensions installed. (y = Yes, n = No)
|
101
|
+
# hasshell (string)
|
102
|
+
# Whether or not the domain has shell / ssh access. (y = Yes, n = No)
|
103
|
+
# contactemail (string)
|
104
|
+
# Contact email address for the account. Ex: user@otherdomain.tld
|
105
|
+
# cpmod (string)
|
106
|
+
# cPanel theme name. Ex: x3
|
107
|
+
# maxftp (string)
|
108
|
+
# Maximum number of FTP accounts the user can create. (0-999999 | unlimited, null | 0 is unlimited)
|
109
|
+
# maxsql (string)
|
110
|
+
# Maximum number of SQL databases the user can create. (0-999999 | unlimited, null | 0 is unlimited)
|
111
|
+
# maxpop (string)
|
112
|
+
# Maximum number of email accounts the user can create. (0-999999 | unlimited, null | 0 is unlimited)
|
113
|
+
# maxlst (string)
|
114
|
+
# Maximum number of mailing lists the user can create. (0-999999 | unlimited, null | 0 is unlimited)
|
115
|
+
# maxsub (string)
|
116
|
+
# Maximum number of subdomains the user can create. (0-999999 | unlimited, null | 0 is unlimited)
|
117
|
+
# maxpark (string)
|
118
|
+
# Maximum number of parked domains the user can create. (0-999999 | unlimited, null | 0 is unlimited)
|
119
|
+
# maxaddon (string)
|
120
|
+
# Maximum number of addon domains the user can create. (0-999999 | unlimited, null | 0 is unlimited)
|
121
|
+
# bwlimit (string)
|
122
|
+
# Bandiwdth limit in MB. (0-999999, 0 is unlimited)
|
123
|
+
# customip (string)
|
124
|
+
# Specific IP address for the site.
|
125
|
+
# useregns (boolean)
|
126
|
+
# Use the registered nameservers for the domain instead of the ones configured on the server. (1 = Yes, 0 = No)
|
127
|
+
# hasuseregns (boolean)
|
128
|
+
# Set to 1 if you are using the above option.
|
129
|
+
# reseller (boolean)
|
130
|
+
# Give reseller privileges to the account. (1 = Yes, 0 = No)
|
131
|
+
|
132
|
+
def createacct(options={}, mappings=nil)
|
133
|
+
default_options = { :featurelist => 'default',
|
134
|
+
:ip => 'n',
|
135
|
+
:cgi => 'y',
|
136
|
+
:frontpage => 'n',
|
137
|
+
:cpmod => 'x3',
|
138
|
+
:hasshell => 'n',
|
139
|
+
:maxlst => 0,
|
140
|
+
:reseller => 0 }
|
141
|
+
all_options = default_options.merge!(options)
|
142
|
+
do_request 'createacct', all_options, mappings
|
143
|
+
end
|
144
|
+
|
145
|
+
# Edits an existing package
|
146
|
+
#
|
147
|
+
# name (string)
|
148
|
+
# Name of the package.
|
149
|
+
# featurelist (string)
|
150
|
+
# Name of the feature list to be used for the package.
|
151
|
+
# quota (integer)
|
152
|
+
# Disk space quota for the package (in MB). (max is unlimited)
|
153
|
+
# ip (boolean)
|
154
|
+
# Whether or not the account has a dedicated IP. Yes=1, No=0.
|
155
|
+
# cgi (boolean)
|
156
|
+
# Whether or not the account has cgi access. Yes=1, No=0.
|
157
|
+
# frontpage (boolean)
|
158
|
+
# Whether or not the account can install FrontPage extensions. Yes=1, No=0.
|
159
|
+
# cpmod (string)
|
160
|
+
# What to change the default package them to. Format: cpmod=themename
|
161
|
+
# maxftp (integer)
|
162
|
+
# The maximum amount of FTP accounts a user assigned to the package can create. (max is 999)
|
163
|
+
# maxsql (integer)
|
164
|
+
# The maximum amount of SQL databases a user assigned to the package can create. (max is 999)
|
165
|
+
# maxpop (integer)
|
166
|
+
# The maximum amount of email accounts a user assigned to the package can create. (max is 999)
|
167
|
+
# maxlists (integer)
|
168
|
+
# The maximum amount of email lists a user assigned to the package can create. (max is 999)
|
169
|
+
# maxsub (integer)
|
170
|
+
# The maximum amount of subdomains a user assigned to the package can create. (max is 999)
|
171
|
+
# maxpark (integer)
|
172
|
+
# The maximum amount of parked domains a user assigned to the package can create. (max is 999)
|
173
|
+
# maxaddon (integer)
|
174
|
+
# The maximum amount of addon domains a user assigned to the package can create. (max is 999)
|
175
|
+
# hasshell (boolean)
|
176
|
+
# Whether or not the account has shell access. Yes=1, No=0.
|
177
|
+
# bwlimit (integer)
|
178
|
+
|
179
|
+
def editpkg(name, options={}, mappings=nil)
|
180
|
+
default_options = { :featurelist => 'default',
|
181
|
+
:ip => 'n',
|
182
|
+
:cgi => 'y',
|
183
|
+
:frontpage => 'n',
|
184
|
+
:cpmod => 'x3',
|
185
|
+
:hasshell => 'n',
|
186
|
+
:maxlists => '0' }
|
187
|
+
all_options = default_options.merge!(options).merge!(:name => name)
|
188
|
+
do_request 'editpkg', all_options, mappings
|
189
|
+
end
|
190
|
+
|
191
|
+
def fetchsslinfo
|
192
|
+
|
193
|
+
end
|
194
|
+
|
195
|
+
def generatessl
|
196
|
+
|
197
|
+
end
|
198
|
+
|
199
|
+
# Get the hostname of the server
|
200
|
+
def gethostname
|
201
|
+
do_request 'gethostname'
|
202
|
+
end
|
203
|
+
|
204
|
+
# List of available languages
|
205
|
+
def getlanglist
|
206
|
+
do_request 'getlanglist'
|
207
|
+
end
|
208
|
+
|
209
|
+
# Deletes a package from the server
|
210
|
+
def killpkg(package)
|
211
|
+
do_request 'killpkg', {:pkg => package}
|
212
|
+
end
|
213
|
+
|
214
|
+
# Searches for an account
|
215
|
+
#
|
216
|
+
# searchtype
|
217
|
+
# Type of account search. (domain | owner | user | ip | package )
|
218
|
+
# search
|
219
|
+
# Search criteria. (Perl Regular Expression)
|
220
|
+
|
221
|
+
def listaccts(term, options={})
|
222
|
+
default_options = {:searchtype => 'user'}
|
223
|
+
all_options = default_options.merge!(options).merge!(:search => term)
|
224
|
+
do_request 'listaccts', all_options
|
225
|
+
end
|
226
|
+
|
227
|
+
# Reseller functionality not needed yet
|
228
|
+
def listacls
|
229
|
+
|
230
|
+
end
|
231
|
+
|
232
|
+
def listcrts
|
233
|
+
|
234
|
+
end
|
235
|
+
|
236
|
+
# List packages on server
|
237
|
+
def listpkgs
|
238
|
+
do_request 'listpkgs'
|
239
|
+
end
|
240
|
+
|
241
|
+
# Reseller functionality not needed yet
|
242
|
+
def listresellers
|
243
|
+
|
244
|
+
end
|
245
|
+
|
246
|
+
# List suspended accounts
|
247
|
+
def listsuspended
|
248
|
+
do_request 'listsuspended'
|
249
|
+
end
|
250
|
+
|
251
|
+
# Get the server load average
|
252
|
+
def loadavg
|
253
|
+
do_request 'loadavg'
|
254
|
+
end
|
255
|
+
|
256
|
+
# Change and accounts password
|
257
|
+
def passwd(user, password)
|
258
|
+
do_request 'passwd', {:user => user, :pass => password}
|
259
|
+
end
|
260
|
+
|
261
|
+
# Reboot the server, don't know if this works or if it takes any arguments
|
262
|
+
def reboot
|
263
|
+
do_request 'reboot'
|
264
|
+
end
|
265
|
+
|
266
|
+
# Remore and account from the server
|
267
|
+
def removeacct(user, options={})
|
268
|
+
default_options = {:keepdns => false}
|
269
|
+
all_options = default_options.merge!(options).merge!(:user => user)
|
270
|
+
do_request 'removeacct', all_options
|
271
|
+
end
|
272
|
+
|
273
|
+
# Reseller functionality not needed yet
|
274
|
+
def resellerstats
|
275
|
+
|
276
|
+
end
|
277
|
+
|
278
|
+
# Restart a service on the server
|
279
|
+
#
|
280
|
+
# service
|
281
|
+
# Service to restart (bind | interchange | ftp | httpd | imap | cppop | exim | mysql | postgres | ssh | tomcat)
|
282
|
+
|
283
|
+
def restartservice(service)
|
284
|
+
do_request 'restartservice', :service => service
|
285
|
+
end
|
286
|
+
|
287
|
+
# Reseller functionality not needed yet
|
288
|
+
def saveacllist
|
289
|
+
|
290
|
+
end
|
291
|
+
|
292
|
+
# Reseller functionality not needed yet
|
293
|
+
def setacls
|
294
|
+
|
295
|
+
end
|
296
|
+
|
297
|
+
# Reseller functionality not needed yet
|
298
|
+
def setupreseller
|
299
|
+
|
300
|
+
end
|
301
|
+
|
302
|
+
# Get bandwidth usage for all users, don't know if this takes additional parameters
|
303
|
+
def showbw
|
304
|
+
do_request 'showbw'
|
305
|
+
end
|
306
|
+
|
307
|
+
# Suspend an account
|
308
|
+
def suspendacct(user, reason)
|
309
|
+
do_request 'suspendacct', {:user => user, :reason => reason}
|
310
|
+
end
|
311
|
+
|
312
|
+
# Reseller functionality not needed yet
|
313
|
+
def terminatereseller
|
314
|
+
|
315
|
+
end
|
316
|
+
|
317
|
+
# Reseller functionality not needed yet
|
318
|
+
def unsetupreseller
|
319
|
+
|
320
|
+
end
|
321
|
+
|
322
|
+
# Unsuspend an account
|
323
|
+
def unsuspendacct(user)
|
324
|
+
do_request 'unsuspendacct', :user => user
|
325
|
+
end
|
326
|
+
|
327
|
+
# Get the of WHM
|
328
|
+
def version
|
329
|
+
do_request 'version'
|
330
|
+
end
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
{"app":["accountsummary","acctcounts","adddns","addip","addpkg","addzonerecord","applist","changepackage","configureservice","cpanel","createacct","delip","domainuserdata","dumpzone","editpkg","editquota","editzonerecord","fetchsslinfo","generatessl","gethostname","getlanglist","getresellerips","getzonerecord","installssl","killdns","killpkg","limitbw","listaccts","listacls","listcrts","listips","listpkgs","listresellers","listsuspended","listzones","loadavg","lookupnsip","modifyacct","myprivs","nvget","nvset","passwd","reboot","removeacct","removezonerecord","resellerstats","resetzone","restartservice","saveacllist","servicestatus","setacls","sethostname","setresellerips","setresellerlimits","setresellermainip","setresellernameservers","setresellerpackagelimit","setresolvers","setsiteip","setupreseller","showbw","suspendacct","suspendreseller","terminatereseller","unsetupreseller","unsuspendacct","unsuspendreseller","version"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"result":[{"status":0,"statusmsg":"Sorry, that's an invalid domain\n","rawout":null,"options":null}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"result":[{"status":1,"statusmsg":"Account Creation Ok","rawout":"<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Checking input data...System has 0 free ips.\n...Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>WWWAcct 12.5.0 (c) 1997-2009 cPanel, Inc....\n\nDns Zone check is enabled.\n+===================================+\n| New Account Info |\n+===================================+\n| Domain: bob.com\n| Ip: 77.72.7.154 (n)\n| HasCgi: y\n| UserName: bob\n| PassWord: FjW1tJ2dJlfRJU\n| CpanelMod: x3\n| HomeRoot: /home\n| Quota: 0 Meg\n| NameServer1: ns1.krystal.co.uk\n| NameServer2: ns2.krystal.co.uk\n| NameServer3: \n| NameServer4: \n| Contact Email: \n| Package: default\n| Feature List: default\n| Language: en\n+===================================+\n...Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Running pre creation script (/scripts/prewwwacct)......Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Adding User...Removing Shell Access (n)\n...Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Copying skel files from /root/cpanel3-skel/ to /home/bob/......Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Adding Entries to httpd.conf......Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Setting up Mail & Local Domains...localdomains...valiases ...vdomainaliases...vfilters......Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Configuring DNS......Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Restarting apache......Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\nChanging password for bob\nPassword for bob has been changed\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Updating Authentication Databases...Updating ftp passwords for bob\nFtp password files updated.\nFtp vhost passwords synced\n...Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Verifying MX Records and Setting up Databases...Reconfiguring Mail Routing:\n<ul><li>LOCAL MAIL EXCHANGER: This server will serve as a primary mail exchanger for bob.com's mail.:<br /> This configuration has been manually selected.<br /><br /></li></ul>...Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Setting up Proxy Subdomains......Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\nBind reload skipped on vps (nameserver disabled)\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Sending Account Information......Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\nSystem has 0 free ips.\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Running post creation scripts (/scripts/legacypostwwwacct, /scripts/postwwwacct, /scripts/postwwwacctuser)......Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\nwwwacct creation finished\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Setting up Domain Pointers......Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Setting Reseller Privs......Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\n<table style=\"border-bottom: 1px #ccc dotted;\"><tr><td width=\"100%\"><pre>Account Creation Complete!!!...Account Creation Ok...Done</pre></td><td width=\"30\"><img align=absmiddle src=\"/cPanel_magic_revision_1264774563/cjt/images/icons/success.png\"></td></tr></table>\n","options":{"nameserver4":null,"nameserver":"ns1.krystal.co.uk","nameserverentry2":null,"nameserverentry3":null,"nameserverentry4":null,"nameserverentry":null,"ip":"77.72.7.154","nameservera2":null,"nameservera3":null,"package":"default","nameservera4":null,"nameserver2":"ns2.krystal.co.uk","nameservera":null,"nameserver3":null}}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"passwd":[{"status":0,"services":null,"statusmsg":"Sorry, the user bob2 does not exist.","rawout":null}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"passwd":[{"status":1,"services":[{"app":"system"},{"app":"ftp"},{"app":"mail"},{"app":"mySQL"}],"statusmsg":"Password changed for user bob","rawout":"Changing password for bob\nPassword for bob has been changed\nUpdating ftp passwords for bob\nFtp password files updated.\nFtp vhost passwords synced\n"}]}
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
$:.unshift File.join( File.dirname(File.dirname(__FILE__)), 'lib' )
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
|
5
|
+
require 'panelbeater'
|
6
|
+
|
7
|
+
require 'test/unit'
|
8
|
+
require 'shoulda'
|
9
|
+
require 'fakeweb'
|
10
|
+
|
11
|
+
class Test::Unit::TestCase
|
12
|
+
|
13
|
+
# we don't want any connections to the outside world
|
14
|
+
FakeWeb.allow_net_connect = false
|
15
|
+
|
16
|
+
# include RR::Adapters::TestUnit
|
17
|
+
|
18
|
+
# def response(name)
|
19
|
+
# Pepper::Stanzas::Epp.parse File.read( File.join(File.dirname(__FILE__),"fixtures", "#{name}.xml") )
|
20
|
+
# end
|
21
|
+
|
22
|
+
def fixture(name)
|
23
|
+
File.read( File.join(File.dirname(__FILE__),"fixtures", "#{name}.json") )
|
24
|
+
end
|
25
|
+
end
|
data/test/whm_test.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
require "test_helper"
|
3
|
+
|
4
|
+
class WhmTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
FakeWeb.clean_registry
|
8
|
+
@expected_url = 'https://cpanel.server.local:2087/json-api/'
|
9
|
+
@connection = CpanelApi::Whm::Commands.new({ :url => 'cpanel.server.local', :api_key => '1234' })
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
context "404 error handling" do
|
14
|
+
setup do
|
15
|
+
FakeWeb.register_uri(:get, "#{@expected_url}applist?", :body => '', :status => ["404", "Not Found"])
|
16
|
+
@response = @connection.applist
|
17
|
+
end
|
18
|
+
|
19
|
+
should "return an error status" do
|
20
|
+
assert_equal 'Not Found', @response.message
|
21
|
+
assert_equal '404', @response.code
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
context "getting a list of commands the server supports" do
|
28
|
+
setup do
|
29
|
+
FakeWeb.register_uri(:get, "#{@expected_url}applist?", :body => fixture('applist'))
|
30
|
+
@response = @connection.applist
|
31
|
+
end
|
32
|
+
|
33
|
+
should "return a list of commands" do
|
34
|
+
assert_equal JSON.parse(fixture('applist')), @response.json
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
context "creating a new account" do
|
40
|
+
setup do
|
41
|
+
FakeWeb.register_uri :get,
|
42
|
+
"#{@expected_url}createacct?cpmod=x3&maxlst=0&hasshell=n&reseller=0&featurelist=default&ip=n&username=amos&cgi=y&frontpage=n",
|
43
|
+
:body => fixture('createacct_success')
|
44
|
+
@response = @connection.createacct :username => 'amos'
|
45
|
+
end
|
46
|
+
|
47
|
+
should "return a list of commands" do
|
48
|
+
assert_equal JSON.parse(fixture('createacct_success')), @response.json
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
context "creating a new account with key mappings" do
|
54
|
+
setup do
|
55
|
+
FakeWeb.register_uri :get,
|
56
|
+
"#{@expected_url}createacct?cpmod=x3&maxlst=0&hasshell=n&reseller=0&featurelist=default&ip=n&username=amos&cgi=y&frontpage=n",
|
57
|
+
:body => fixture('createacct_success')
|
58
|
+
@response = @connection.createacct({ :krazy => 'amos' }, { :krazy => :username })
|
59
|
+
end
|
60
|
+
|
61
|
+
should "return a list of commands" do
|
62
|
+
assert_equal JSON.parse(fixture('createacct_success')), @response.json
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
context "changing a users password" do
|
68
|
+
setup do
|
69
|
+
FakeWeb.register_uri :get,
|
70
|
+
"#{@expected_url}passwd?user=bob&pass=hello",
|
71
|
+
:body => fixture('passwd_success')
|
72
|
+
@response = @connection.passwd('bob', 'hello')
|
73
|
+
end
|
74
|
+
|
75
|
+
should "return a list of commands" do
|
76
|
+
assert_equal JSON.parse(fixture('passwd_success')), @response.json
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
metadata
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: panelbeater
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jamie Dyer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-01-29 00:00:00 +00:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: json
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: shoulda
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: fakeweb
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
description:
|
46
|
+
email: jamie@kernowsoul.com
|
47
|
+
executables: []
|
48
|
+
|
49
|
+
extensions: []
|
50
|
+
|
51
|
+
extra_rdoc_files: []
|
52
|
+
|
53
|
+
files:
|
54
|
+
- cpanel-gem.gemspec
|
55
|
+
- lib/panelbeater/cpanel/commands.rb
|
56
|
+
- lib/panelbeater/model.rb
|
57
|
+
- lib/panelbeater/remote.rb
|
58
|
+
- lib/panelbeater/response.rb
|
59
|
+
- lib/panelbeater/whm/commands.rb
|
60
|
+
- lib/panelbeater.rb
|
61
|
+
- pkg/cpanel-gem-0.1.0.gem
|
62
|
+
- Rakefile
|
63
|
+
- Readme.markdown
|
64
|
+
- test/fixtures/applist.json
|
65
|
+
- test/fixtures/createacct_fail.json
|
66
|
+
- test/fixtures/createacct_success.json
|
67
|
+
- test/fixtures/passwd_fail.json
|
68
|
+
- test/fixtures/passwd_success.json
|
69
|
+
- test/test_helper.rb
|
70
|
+
- test/whm_test.rb
|
71
|
+
has_rdoc: true
|
72
|
+
homepage: http://kernowsoul.com
|
73
|
+
licenses: []
|
74
|
+
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
|
78
|
+
require_paths:
|
79
|
+
- lib
|
80
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: "0"
|
85
|
+
version:
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: "0"
|
91
|
+
version:
|
92
|
+
requirements: []
|
93
|
+
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 1.3.5
|
96
|
+
signing_key:
|
97
|
+
specification_version: 3
|
98
|
+
summary: A gem for communicating with the cPanel and WHM API's
|
99
|
+
test_files:
|
100
|
+
- test/fixtures/applist.json
|
101
|
+
- test/fixtures/createacct_fail.json
|
102
|
+
- test/fixtures/createacct_success.json
|
103
|
+
- test/fixtures/passwd_fail.json
|
104
|
+
- test/fixtures/passwd_success.json
|
105
|
+
- test/test_helper.rb
|
106
|
+
- test/whm_test.rb
|