lumberg 1.0.1 → 2.0.0.pre4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (248) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +8 -7
  3. data/LICENSE +1 -1
  4. data/README.md +130 -23
  5. data/Rakefile +3 -1
  6. data/lib/lumberg/config.rb +19 -0
  7. data/lib/lumberg/cpanel/addon_domain.rb +50 -0
  8. data/lib/lumberg/cpanel/backups.rb +16 -0
  9. data/lib/lumberg/cpanel/base.rb +56 -0
  10. data/lib/lumberg/cpanel/box_trapper.rb +18 -0
  11. data/lib/lumberg/cpanel/branding.rb +89 -0
  12. data/lib/lumberg/cpanel/contact.rb +38 -0
  13. data/lib/lumberg/cpanel/cron.rb +89 -0
  14. data/lib/lumberg/cpanel/dns_lookup.rb +23 -0
  15. data/lib/lumberg/cpanel/domain_keys.rb +37 -0
  16. data/lib/lumberg/cpanel/domain_lookup.rb +71 -0
  17. data/lib/lumberg/cpanel/email.rb +491 -0
  18. data/lib/lumberg/cpanel/file_manager.rb +146 -0
  19. data/lib/lumberg/cpanel/gpg.rb +36 -0
  20. data/lib/lumberg/cpanel/locale.rb +15 -0
  21. data/lib/lumberg/cpanel/mime.rb +34 -0
  22. data/lib/lumberg/cpanel/mysql.rb +66 -0
  23. data/lib/lumberg/cpanel/net.rb +28 -0
  24. data/lib/lumberg/cpanel/park.rb +58 -0
  25. data/lib/lumberg/cpanel/password.rb +52 -0
  26. data/lib/lumberg/cpanel/random_data.rb +25 -0
  27. data/lib/lumberg/cpanel/redirect.rb +44 -0
  28. data/lib/lumberg/cpanel/ssl.rb +206 -0
  29. data/lib/lumberg/cpanel/sub_domain.rb +61 -0
  30. data/lib/lumberg/cpanel/support.rb +29 -0
  31. data/lib/lumberg/cpanel/zone_edit.rb +134 -0
  32. data/lib/lumberg/cpanel.rb +29 -0
  33. data/lib/lumberg/format_whm.rb +125 -0
  34. data/lib/lumberg/version.rb +1 -1
  35. data/lib/lumberg/whm/account.rb +28 -105
  36. data/lib/lumberg/whm/base.rb +3 -7
  37. data/lib/lumberg/whm/cert.rb +76 -0
  38. data/lib/lumberg/whm/dns.rb +49 -77
  39. data/lib/lumberg/whm/reseller.rb +24 -117
  40. data/lib/lumberg/whm/server.rb +111 -230
  41. data/lib/lumberg/whm.rb +2 -1
  42. data/lib/lumberg.rb +34 -8
  43. data/lumberg.gemspec +7 -4
  44. data/spec/config_spec.rb +28 -0
  45. data/spec/cpanel/addon_domain_spec.rb +84 -0
  46. data/spec/cpanel/backups_spec.rb +22 -0
  47. data/spec/cpanel/base_spec.rb +128 -0
  48. data/spec/cpanel/box_trapper_spec.rb +22 -0
  49. data/spec/cpanel/branding_spec.rb +46 -0
  50. data/spec/cpanel/contact_spec.rb +50 -0
  51. data/spec/cpanel/cron_spec.rb +161 -0
  52. data/spec/cpanel/dns_lookup_spec.rb +22 -0
  53. data/spec/cpanel/domain_keys_spec.rb +46 -0
  54. data/spec/cpanel/domain_lookup_spec.rb +77 -0
  55. data/spec/cpanel/email_spec.rb +615 -0
  56. data/spec/cpanel/file_manager_spec.rb +73 -0
  57. data/spec/cpanel/gpg_spec.rb +48 -0
  58. data/spec/cpanel/locale_spec.rb +23 -0
  59. data/spec/cpanel/mime_spec.rb +0 -0
  60. data/spec/cpanel/mysql_spec.rb +0 -0
  61. data/spec/cpanel/net_spec.rb +30 -0
  62. data/spec/cpanel/park_spec.rb +94 -0
  63. data/spec/cpanel/password_spec.rb +35 -0
  64. data/spec/cpanel/random_data_spec.rb +24 -0
  65. data/spec/cpanel/redirect_spec.rb +0 -0
  66. data/spec/cpanel/ssl_spec.rb +148 -0
  67. data/spec/cpanel/sub_domain_spec.rb +72 -0
  68. data/spec/cpanel/support_spec.rb +38 -0
  69. data/spec/cpanel/zone_edit_spec.rb +0 -0
  70. data/spec/sample_certs/cpanel.crt +28 -0
  71. data/spec/sample_certs/cpanel.key +28 -0
  72. data/spec/sample_certs/main.crt +27 -0
  73. data/spec/sample_certs/sample.crt +26 -0
  74. data/spec/sample_certs/sample.key +27 -0
  75. data/spec/spec_helper.rb +9 -3
  76. data/spec/support/cpanel_matchers.rb +17 -0
  77. data/spec/vcr_cassettes/cpanel/addon_domain/add.yml +77 -0
  78. data/spec/vcr_cassettes/cpanel/addon_domain/list.yml +77 -0
  79. data/spec/vcr_cassettes/cpanel/addon_domain/remove.yml +77 -0
  80. data/spec/vcr_cassettes/cpanel/backups/list.yml +40 -0
  81. data/spec/vcr_cassettes/cpanel/box_trapper/list.yml +40 -0
  82. data/spec/vcr_cassettes/cpanel/branding/list_icons.yml +40 -0
  83. data/spec/vcr_cassettes/cpanel/branding/list_image_types.yml +40 -0
  84. data/spec/vcr_cassettes/cpanel/branding/list_object_types.yml +40 -0
  85. data/spec/vcr_cassettes/cpanel/branding/list_pkgs.yml +40 -0
  86. data/spec/vcr_cassettes/cpanel/branding/list_sprites.yml +40 -0
  87. data/spec/vcr_cassettes/cpanel/contact/show.yml +40 -0
  88. data/spec/vcr_cassettes/cpanel/contact/update.yml +40 -0
  89. data/spec/vcr_cassettes/cpanel/cron/add.yml +77 -0
  90. data/spec/vcr_cassettes/cpanel/cron/edit.yml +114 -0
  91. data/spec/vcr_cassettes/cpanel/cron/email.yml +77 -0
  92. data/spec/vcr_cassettes/cpanel/cron/list.yml +77 -0
  93. data/spec/vcr_cassettes/cpanel/cron/remove.yml +151 -0
  94. data/spec/vcr_cassettes/cpanel/cron/set_email.yml +77 -0
  95. data/spec/vcr_cassettes/cpanel/dns_lookup/name_to_ip.yml +40 -0
  96. data/spec/vcr_cassettes/cpanel/domain_keys/add.yml +40 -0
  97. data/spec/vcr_cassettes/cpanel/domain_keys/available.yml +40 -0
  98. data/spec/vcr_cassettes/cpanel/domain_keys/installed.yml +40 -0
  99. data/spec/vcr_cassettes/cpanel/domain_keys/remove.yml +40 -0
  100. data/spec/vcr_cassettes/cpanel/domain_lookup/count.yml +40 -0
  101. data/spec/vcr_cassettes/cpanel/domain_lookup/docroot.yml +40 -0
  102. data/spec/vcr_cassettes/cpanel/domain_lookup/docroots.yml +40 -0
  103. data/spec/vcr_cassettes/cpanel/domain_lookup/document_root.yml +40 -0
  104. data/spec/vcr_cassettes/cpanel/domain_lookup/document_roots.yml +40 -0
  105. data/spec/vcr_cassettes/cpanel/domain_lookup/list.yml +40 -0
  106. data/spec/vcr_cassettes/cpanel/email/acceptable_encodings.yml +40 -0
  107. data/spec/vcr_cassettes/cpanel/email/accounts.yml +188 -0
  108. data/spec/vcr_cassettes/cpanel/email/add_account.yml +77 -0
  109. data/spec/vcr_cassettes/cpanel/email/add_filter.yml +77 -0
  110. data/spec/vcr_cassettes/cpanel/email/add_forwarder.yml +77 -0
  111. data/spec/vcr_cassettes/cpanel/email/add_mailing_list.yml +73 -0
  112. data/spec/vcr_cassettes/cpanel/email/add_mx.yml +40 -0
  113. data/spec/vcr_cassettes/cpanel/email/change_mx.yml +40 -0
  114. data/spec/vcr_cassettes/cpanel/email/check_local_delivery_local.yml +77 -0
  115. data/spec/vcr_cassettes/cpanel/email/check_local_delivery_remote.yml +77 -0
  116. data/spec/vcr_cassettes/cpanel/email/default_address.yml +40 -0
  117. data/spec/vcr_cassettes/cpanel/email/delete_mx.yml +40 -0
  118. data/spec/vcr_cassettes/cpanel/email/disk_usage.yml +77 -0
  119. data/spec/vcr_cassettes/cpanel/email/domains.yml +40 -0
  120. data/spec/vcr_cassettes/cpanel/email/domains_with_aliases.yml +77 -0
  121. data/spec/vcr_cassettes/cpanel/email/edit_quota.yml +112 -0
  122. data/spec/vcr_cassettes/cpanel/email/filters.yml +114 -0
  123. data/spec/vcr_cassettes/cpanel/email/forwarders.yml +77 -0
  124. data/spec/vcr_cassettes/cpanel/email/mail_dir.yml +77 -0
  125. data/spec/vcr_cassettes/cpanel/email/mail_dirs.yml +77 -0
  126. data/spec/vcr_cassettes/cpanel/email/mailing_lists.yml +73 -0
  127. data/spec/vcr_cassettes/cpanel/email/main_discard.yml +40 -0
  128. data/spec/vcr_cassettes/cpanel/email/mx.yml +40 -0
  129. data/spec/vcr_cassettes/cpanel/email/remove.yml +77 -0
  130. data/spec/vcr_cassettes/cpanel/email/set_mail_delivery_local.yml +77 -0
  131. data/spec/vcr_cassettes/cpanel/email/set_mail_delivery_remote.yml +77 -0
  132. data/spec/vcr_cassettes/cpanel/email/set_mx_type.yml +40 -0
  133. data/spec/vcr_cassettes/cpanel/file_manager/disk_usage.yml +38 -0
  134. data/spec/vcr_cassettes/cpanel/file_manager/list.yml +38 -0
  135. data/spec/vcr_cassettes/cpanel/file_manager/operate.yml +77 -0
  136. data/spec/vcr_cassettes/cpanel/file_manager/show.yml +40 -0
  137. data/spec/vcr_cassettes/cpanel/file_manager/stat.yml +38 -0
  138. data/spec/vcr_cassettes/cpanel/gpg/count.yml +40 -0
  139. data/spec/vcr_cassettes/cpanel/gpg/count_private.yml +40 -0
  140. data/spec/vcr_cassettes/cpanel/gpg/list.yml +40 -0
  141. data/spec/vcr_cassettes/cpanel/gpg/list_private.yml +40 -0
  142. data/spec/vcr_cassettes/cpanel/locale/show.yml +40 -0
  143. data/spec/vcr_cassettes/cpanel/net/query_hostname.yml +40 -0
  144. data/spec/vcr_cassettes/cpanel/net/traceroute.yml +40 -0
  145. data/spec/vcr_cassettes/cpanel/park/add.yml +77 -0
  146. data/spec/vcr_cassettes/cpanel/park/list.yml +77 -0
  147. data/spec/vcr_cassettes/cpanel/park/list_addon_domains.yml +77 -0
  148. data/spec/vcr_cassettes/cpanel/park/remove.yml +77 -0
  149. data/spec/vcr_cassettes/cpanel/password/digest_authentication.yml +77 -0
  150. data/spec/vcr_cassettes/cpanel/password/modify.yml +77 -0
  151. data/spec/vcr_cassettes/cpanel/random_data/show.yml +40 -0
  152. data/spec/vcr_cassettes/cpanel/ssl/fetchcabundle.yml +40 -0
  153. data/spec/vcr_cassettes/cpanel/ssl/gencrt.yml +43 -0
  154. data/spec/vcr_cassettes/cpanel/ssl/gencsr.yml +43 -0
  155. data/spec/vcr_cassettes/cpanel/ssl/genkey.yml +40 -0
  156. data/spec/vcr_cassettes/cpanel/ssl/installssl.yml +40 -0
  157. data/spec/vcr_cassettes/cpanel/ssl/listcrts.yml +40 -0
  158. data/spec/vcr_cassettes/cpanel/ssl/listcsrs.yml +40 -0
  159. data/spec/vcr_cassettes/cpanel/ssl/listkeys.yml +40 -0
  160. data/spec/vcr_cassettes/cpanel/ssl/listsslitems.yml +40 -0
  161. data/spec/vcr_cassettes/cpanel/ssl/showcrt.yml +38 -0
  162. data/spec/vcr_cassettes/cpanel/ssl/showcsr.yml +38 -0
  163. data/spec/vcr_cassettes/cpanel/ssl/showkey.yml +38 -0
  164. data/spec/vcr_cassettes/cpanel/ssl/uploadcrt.yml +40 -0
  165. data/spec/vcr_cassettes/cpanel/sub_domain/add.yml +77 -0
  166. data/spec/vcr_cassettes/cpanel/sub_domain/list.yml +77 -0
  167. data/spec/vcr_cassettes/cpanel/sub_domain/remove.yml +77 -0
  168. data/spec/vcr_cassettes/cpanel/support/contactable.yml +40 -0
  169. data/spec/vcr_cassettes/whm/account/accountsummary.yml +41 -29
  170. data/spec/vcr_cassettes/whm/account/changepackage.yml +73 -43
  171. data/spec/vcr_cassettes/whm/account/createacct.yml +101 -31
  172. data/spec/vcr_cassettes/whm/account/domainuserdata.yml +43 -29
  173. data/spec/vcr_cassettes/whm/account/editquota.yml +78 -57
  174. data/spec/vcr_cassettes/whm/account/limitbw.yml +79 -57
  175. data/spec/vcr_cassettes/whm/account/listaccts.yml +195 -100
  176. data/spec/vcr_cassettes/whm/account/listsuspended.yml +41 -29
  177. data/spec/vcr_cassettes/whm/account/modifyacct.yml +61 -42
  178. data/spec/vcr_cassettes/whm/account/myprivs.yml +41 -29
  179. data/spec/vcr_cassettes/whm/account/passwd.yml +44 -29
  180. data/spec/vcr_cassettes/whm/account/removeacct.yml +134 -57
  181. data/spec/vcr_cassettes/whm/account/restoreaccount.yml +310 -135
  182. data/spec/vcr_cassettes/whm/account/setsiteip.yml +166 -127
  183. data/spec/vcr_cassettes/whm/account/suspend.yml +75 -43
  184. data/spec/vcr_cassettes/whm/account/unsuspend.yml +46 -29
  185. data/spec/vcr_cassettes/whm/cert/fetchsslinfo.yml +38 -0
  186. data/spec/vcr_cassettes/whm/cert/generatessl.yml +94 -0
  187. data/spec/vcr_cassettes/whm/cert/installssl.yml +38 -0
  188. data/spec/vcr_cassettes/whm/cert/listcrts.yml +38 -0
  189. data/spec/vcr_cassettes/whm/dns/adddns.yml +61 -43
  190. data/spec/vcr_cassettes/whm/dns/addzonerecord.yml +42 -29
  191. data/spec/vcr_cassettes/whm/dns/dumpzone.yml +44 -29
  192. data/spec/vcr_cassettes/whm/dns/editzonerecord.yml +61 -43
  193. data/spec/vcr_cassettes/whm/dns/getzonerecord.yml +60 -43
  194. data/spec/vcr_cassettes/whm/dns/killdns.yml +42 -29
  195. data/spec/vcr_cassettes/whm/dns/listmxs.yml +23 -15
  196. data/spec/vcr_cassettes/whm/dns/listzones.yml +22 -15
  197. data/spec/vcr_cassettes/whm/dns/lookupnsip.yml +40 -29
  198. data/spec/vcr_cassettes/whm/dns/removezonerecord.yml +61 -43
  199. data/spec/vcr_cassettes/whm/dns/resetzone.yml +42 -29
  200. data/spec/vcr_cassettes/whm/dns/resolvedomainname.yml +40 -29
  201. data/spec/vcr_cassettes/whm/dns/savemxs.yml +23 -15
  202. data/spec/vcr_cassettes/whm/reseller/acctcounts.yml +41 -29
  203. data/spec/vcr_cassettes/whm/reseller/listacls.yml +22 -15
  204. data/spec/vcr_cassettes/whm/reseller/listresellers.yml +22 -15
  205. data/spec/vcr_cassettes/whm/reseller/resellerstats.yml +42 -29
  206. data/spec/vcr_cassettes/whm/reseller/saveacllist.yml +76 -57
  207. data/spec/vcr_cassettes/whm/reseller/setacls.yml +40 -29
  208. data/spec/vcr_cassettes/whm/reseller/setresellerips.yml +42 -28
  209. data/spec/vcr_cassettes/whm/reseller/setresellerlimits.yml +41 -29
  210. data/spec/vcr_cassettes/whm/reseller/setresellermainip.yml +59 -43
  211. data/spec/vcr_cassettes/whm/reseller/setresellernameservers.yml +58 -43
  212. data/spec/vcr_cassettes/whm/reseller/setresellerpackagelimit.yml +61 -43
  213. data/spec/vcr_cassettes/whm/reseller/setupreseller.yml +41 -29
  214. data/spec/vcr_cassettes/whm/reseller/suspendreseller.yml +75 -44
  215. data/spec/vcr_cassettes/whm/reseller/terminatereseller.yml +83 -46
  216. data/spec/vcr_cassettes/whm/reseller/unsetupreseller.yml +41 -29
  217. data/spec/vcr_cassettes/whm/reseller/unsuspendreseller.yml +46 -29
  218. data/spec/vcr_cassettes/whm/server/addip.yml +24 -15
  219. data/spec/vcr_cassettes/whm/server/applist.yml +22 -15
  220. data/spec/vcr_cassettes/whm/server/delip.yml +23 -15
  221. data/spec/vcr_cassettes/whm/server/gethostname.yml +22 -15
  222. data/spec/vcr_cassettes/whm/server/getlanglist.yml +22 -15
  223. data/spec/vcr_cassettes/whm/server/gettweaksetting.yml +44 -0
  224. data/spec/vcr_cassettes/whm/server/listips.yml +22 -15
  225. data/spec/vcr_cassettes/whm/server/loadavg.yml +26 -19
  226. data/spec/vcr_cassettes/whm/server/my_function.yml +59 -43
  227. data/spec/vcr_cassettes/whm/server/nvget.yml +22 -15
  228. data/spec/vcr_cassettes/whm/server/nvset.yml +22 -15
  229. data/spec/vcr_cassettes/whm/server/reboot.yml +22 -15
  230. data/spec/vcr_cassettes/whm/server/sethostname.yml +24 -15
  231. data/spec/vcr_cassettes/whm/server/setresolvers.yml +23 -15
  232. data/spec/vcr_cassettes/whm/server/settweaksetting.yml +44 -0
  233. data/spec/vcr_cassettes/whm/server/showbw.yml +22 -15
  234. data/spec/vcr_cassettes/whm/server/systemloadavg.yml +40 -29
  235. data/spec/vcr_cassettes/whm/server/themes.yml +38 -0
  236. data/spec/vcr_cassettes/whm/server/version.yml +22 -15
  237. data/spec/whm/account_spec.rb +40 -199
  238. data/spec/whm/base_spec.rb +0 -4
  239. data/spec/whm/cert_spec.rb +99 -0
  240. data/spec/whm/dns_spec.rb +5 -123
  241. data/spec/whm/reseller_spec.rb +11 -79
  242. data/spec/whm/server_spec.rb +85 -142
  243. metadata +367 -47
  244. data/.rvmrc +0 -49
  245. data/lib/lumberg/whm/args.rb +0 -113
  246. data/lib/net_http_hacked.rb +0 -42
  247. data/spec/vcr_cassettes/whm/server/response_type.yml +0 -85
  248. data/spec/whm/args_spec.rb +0 -179
@@ -1,5 +1,4 @@
1
- require 'cgi'
2
- require 'base64'
1
+ Faraday.register_middleware :response, :format_whm => Lumberg::FormatWhm
3
2
 
4
3
  module Lumberg
5
4
  module Whm
@@ -19,9 +18,6 @@ module Lumberg
19
18
  # API username - :default => root
20
19
  attr_accessor :user
21
20
 
22
- # Raw HTTP response from WHM
23
- attr_accessor :raw_response
24
-
25
21
  # WHM parsed response
26
22
  attr_reader :response
27
23
 
@@ -43,58 +39,49 @@ module Lumberg
43
39
  # Force response type...ARG!
44
40
  attr_accessor :force_response_type
45
41
 
42
+ # HTTP read/open timeout
43
+ attr_accessor :timeout
44
+
46
45
  #
47
- # ==== Required
46
+ # ==== Required
48
47
  # * <tt>:host</tt> - PENDING
49
48
  # * <tt>:hash</tt> - PENDING
50
49
  #
51
- # ==== Optional
50
+ # ==== Optional
52
51
  # * <tt>:user</tt> - PENDING
53
52
  # * <tt>:ssl</tt> - PENDING
54
53
  # * <tt>:basic_auth</tt>
55
54
  def initialize(options)
56
- Args.new(options) do |c|
57
- c.requires :host, :hash
58
- c.optionals :user, :ssl, :basic_auth
59
- end
60
-
61
55
  @ssl_verify ||= false
62
56
  @ssl = options.delete(:ssl)
63
57
  @host = options.delete(:host)
64
58
  @hash = format_hash(options.delete(:hash))
65
59
  @user = (options.has_key?(:user) ? options.delete(:user) : 'root')
66
- @basic_auth = options.has_key?(:basic_auth) && options.delete(:basic_auth)
60
+ @basic_auth = options.delete(:basic_auth)
61
+ @timeout = options.delete(:timeout)
62
+
63
+ validate_server_host
67
64
 
68
65
  @base_url = format_url(options)
69
66
  end
70
67
 
71
68
  def perform_request(function, options = {})
72
- @function = function
73
-
74
69
  # WHM sometime uses different keys for the result hash
75
- @key = options.delete(:key) || 'result'
76
-
70
+ @response_key = options.delete(:response_key) || 'result'
71
+ @function = function
77
72
  @params = format_query(options)
78
- uri = URI.parse("#{@base_url}#{function}?#{@params}")
79
73
 
80
74
  yield self if block_given?
81
75
 
82
- req = prepare_request(uri)
83
-
84
- # Do the request
85
- res = do_request(uri, req)
86
-
87
- @raw_response = res
88
- @response = JSON.parse(@raw_response.body)
89
- format_response
76
+ do_request(@base_url, function, @params)
90
77
  end
91
78
 
92
79
  def get_hostname
93
- perform_request('gethostname', {:key => 'hostname'})
80
+ perform_request('gethostname', {:response_key => 'hostname'})
94
81
  end
95
82
 
96
83
  def version
97
- perform_request('version', {:key => 'version'})
84
+ perform_request('version', {:response_key => 'version'})
98
85
  end
99
86
 
100
87
  def load_average
@@ -105,267 +92,161 @@ module Lumberg
105
92
  end
106
93
 
107
94
  def system_load_average(options = {})
108
- Args.new(options) do |c|
109
- c.requires "api.version".to_sym
110
- end
111
-
112
- perform_request('systemloadavg', options.merge(:key => 'data'))
95
+ perform_request('systemloadavg', options.merge(:response_key => 'data'))
113
96
  end
114
97
 
115
98
  def languages
116
- perform_request('getlanglist', {:key => 'lang'})
99
+ perform_request('getlanglist', {:response_key => 'lang'})
100
+ end
101
+
102
+ def themes
103
+ perform_request('getlanglist', {:response_key => 'themes'})
117
104
  end
118
105
 
119
106
  def list_ips
120
- perform_request('listips', {:key => 'result'})
107
+ perform_request('listips', {:response_key => 'result'})
121
108
  end
122
109
 
123
- def add_ip(options = {})
124
- Args.new(options) do |c|
125
- c.requires :ip, :netmask
126
- end
110
+ def get_tweaksetting(options = {})
111
+ request = perform_request('get_tweaksetting',
112
+ options.merge(
113
+ :response_key => 'data',
114
+ :'api.version' => 1
115
+ )
116
+ )
127
117
 
128
- perform_request('addip', options.merge(:key => 'addip'))
118
+ request[:success] = !request[:params].empty?
119
+ request
129
120
  end
130
121
 
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
122
+ def set_tweaksetting(options = {})
123
+ request = perform_request('set_tweaksetting',
124
+ options.merge(
125
+ :response_key => 'metadata',
126
+ :'api.version' => 1
127
+ )
128
+ )
137
129
 
138
- perform_request('delip', options.merge(:key => 'delip'))
130
+ request[:success] = (request[:params][:reason] == 'OK')
131
+ request
139
132
  end
140
133
 
141
- def set_hostname(options = {})
142
- Args.new(options) do |c|
143
- c.requires :hostname
144
- end
134
+ def add_ip(options = {})
135
+ perform_request('addip', options.merge(:response_key => 'addip'))
136
+ end
145
137
 
146
- perform_request('sethostname', options.merge(:key => 'sethostname'))
138
+ def delete_ip(options = {})
139
+ perform_request('delip', options.merge(:response_key => 'delip'))
147
140
  end
148
141
 
149
- def set_resolvers(options = {})
150
- Args.new(options) do |c|
151
- c.requires :nameserver1
152
- c.optionals :nameserver2, :nameserver3
153
- end
142
+ def set_hostname(options = {})
143
+ perform_request('sethostname', options.merge(:response_key => 'sethostname'))
144
+ end
154
145
 
155
- perform_request('setresolvers', options.merge(:key => 'setresolvers'))
146
+ def set_resolvers(options = {})
147
+ perform_request('setresolvers', options.merge(:response_key => 'setresolvers'))
156
148
  end
157
149
 
158
150
  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'))
151
+ perform_request('showbw', options.merge(:response_key => 'bandwidth'))
164
152
  end
165
153
 
166
154
  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'))
155
+ perform_request('nvset', options.merge(:response_key => 'nvset'))
173
156
  end
174
157
 
175
158
  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'))
159
+ perform_request('nvget', options.merge(:response_key => 'nvget'))
182
160
  end
183
161
 
184
162
  def reboot
185
- perform_request('reboot', {:key => "reboot"})
163
+ perform_request('reboot', {:response_key => "reboot"})
186
164
  end
187
165
 
188
- protected
189
- def response_type
190
- if !@force_response_type.nil?
191
- @force_response_type
192
- elsif !@response.respond_to?(:has_key?)
193
- :unknown
194
- elsif @response.has_key?('error')
195
- :error
196
- elsif @response.has_key?(@key)
197
- :action
198
- elsif @response.has_key?('status') && @response.has_key?('statusmsg')
199
- :query
200
- else
201
- :unknown
202
- end
166
+ def account
167
+ @account ||= Account.new(:server => self)
203
168
  end
204
169
 
205
- def format_response
206
- success, message, params = false, nil, {}
207
-
208
- case response_type
209
- when :action
210
- success, message, params = format_action_response
211
- when :query
212
- success, message, params = format_query_response
213
- when :error
214
- message = @response['error']
215
- when :unknown
216
- message = "Unknown error occurred #{@response.inspect}"
217
- end
218
-
219
- params = Whm::to_bool(params, @boolean_params) unless @boolean_params.nil?
220
-
221
- # Reset this for subsequent requests
222
- @force_response_type = nil
223
- {:success => success, :message => message, :params => Whm::symbolize_keys(params)}
170
+ def dns
171
+ @dns ||= Dns.new(:server => self)
224
172
  end
225
173
 
226
- def format_url(options = {})
227
- @ssl = true if @ssl.nil?
228
- port = (@ssl ? 2087 : 2086)
229
- proto = (@ssl ? 'https' : 'http')
230
-
231
- "#{proto}://#{@host}:#{port}/json-api/"
174
+ def reseller
175
+ @reseller ||= Reseller.new(:server => self)
232
176
  end
233
177
 
234
- def format_hash(hash)
235
- raise Lumberg::WhmArgumentError.new("Missing WHM hash") unless hash.is_a?(String)
236
- hash.gsub(/\n|\s/, '')
237
- end
238
-
239
- def format_query(hash)
240
- elements = []
241
- hash.each do |key, value|
242
- value = 1 if value === true
243
- value = 0 if value === false
244
- elements << "#{CGI::escape(key.to_s)}=#{CGI::escape(value.to_s)}"
245
- end
246
- elements.sort.join('&')
178
+ def cert
179
+ @cert ||= Cert.new(:server => self)
247
180
  end
248
181
 
249
- private
182
+ private
250
183
 
251
- def do_request(uri, req)
252
- begin
253
- Net::HTTP.skip_bad_headers = true
254
- http = Net::HTTP.new(uri.host, uri.port)
255
- http.set_debug_output($stderr) if ENV['LUMBERG_DEBUG']
256
-
257
- enable_ssl(http) if uri.port == 2087
258
-
259
- http.start do |h|
260
- h.request(req)
261
- end
262
- rescue Exception => e
263
- puts "Error when sending the request.
264
- Enable debug output by setting the environment variable LUMBERG_DEBUG and try again."
265
- raise e
266
- ensure
267
- Net::HTTP.skip_bad_headers = false
268
- end
269
- end
270
-
271
- def format_action_response
272
- # Some API methods ALSO return a 'status' as
273
- # part of a result. We only use this value if it's
274
- # part of the results hash
275
- item = @response[@key]
276
-
277
- unless item.is_a?(Array) || item.is_a?(Hash)
278
- res = {@key => item}
279
- success, message = true, ""
280
- else
281
- result = nil
282
- if item.first.is_a?(Hash)
283
- result = item.first
284
- res = (item.size > 1 ? item.dup : item.first.dup)
184
+ def do_request(uri, function, params)
185
+ @response = Faraday.new(:url => uri, :ssl => ssl_options) do |c|
186
+ if basic_auth
187
+ c.basic_auth @user, @hash
285
188
  else
286
- res = item.dup
287
-
288
- # more hacks for WHM silly API
289
- if @response.has_key?('result')
290
- result_node = @response['result']
291
- node_with_key_status = result_node.is_a?(Hash) && result_node.has_key?('status')
292
- result = (node_with_key_status ? result_node : result_node.first)
293
- else
294
- res.delete('status')
295
- res.delete('statusmsg')
296
- end
189
+ c.headers['Authorization'] = "WHM #{@user}:#{@hash}"
297
190
  end
298
191
 
299
- unless result.nil?
300
- success = result['status'].to_i == 1
301
- message = result['statusmsg']
302
- end
303
- end
304
-
305
- return success, message, res
192
+ c.params = params
193
+ c.request :url_encoded
194
+ c.response :format_whm, @force_response_type, @response_key, @boolean_params
195
+ c.response :logger, create_logger_instance
196
+ c.response :json
197
+ c.adapter :net_http
198
+ c.options[:timeout] = timeout if timeout
199
+ end.get(function).body
200
+ @force_response_type = nil
201
+ @response
306
202
  end
307
203
 
308
- def format_query_response
309
- success = @response['status'].to_i == 1
310
- message = @response['statusmsg']
311
-
312
- # returns the rest as a params arg
313
- res = @response.dup
314
- res.delete('status')
315
- res.delete('statusmsg')
316
-
317
- return success, message, res
204
+ def format_query(hash)
205
+ hash.inject({}) do |params, (key, value)|
206
+ value = 1 if value === true
207
+ value = 0 if value === false
208
+ params[key] = value
209
+ params
210
+ end
318
211
  end
319
212
 
320
- # Creates WHM::Whatever.new(:server => @server)
321
- # automagically
322
- def auto_accessors
323
- [:account, :dns, :reseller]
213
+ def create_logger_instance
214
+ Logger.new(Lumberg.configuration[:debug].is_a?(TrueClass) ? $stderr : Lumberg.configuration[:debug])
324
215
  end
325
216
 
326
- def method_missing(meth, *args, &block)
327
- if auto_accessors.include?(meth.to_sym)
328
- ivar = instance_variable_get("@#{meth}")
329
- if ivar.nil?
330
- constant = Whm.const_get(meth.to_s.capitalize)
331
- return instance_variable_set("@#{meth}", constant.new(:server => self))
332
- else
333
- return ivar
334
- end
217
+ def ssl_options
218
+ if @ssl_verify
219
+ {
220
+ :verify_mode => OpenSSL::SSL::VERIFY_PEER,
221
+ :ca_file => File.join(Lumberg::base_path, "cacert.pem")
222
+ }
335
223
  else
336
- super
224
+ {
225
+ :verify_mode => OpenSSL::SSL::VERIFY_NONE
226
+ }
337
227
  end
338
228
  end
339
229
 
340
- def prepare_request(uri)
341
- # Setup request URL
342
- url = uri.path
343
- query = uri.query
344
- url << "?" + query unless query.nil? || query.empty?
345
-
346
- req = Net::HTTP::Get.new(url)
230
+ def format_url(options = {})
231
+ @ssl = true if @ssl.nil?
232
+ port = (@ssl ? 2087 : 2086)
233
+ proto = (@ssl ? 'https' : 'http')
347
234
 
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)
356
- req
235
+ "#{proto}://#{@host}:#{port}/json-api/"
357
236
  end
358
237
 
359
- def enable_ssl(http)
360
- if @ssl_verify
361
- http.verify_mode = OpenSSL::SSL::VERIFY_PEER
362
- http.ca_file = File.join(Lumberg::base_path, "cacert.pem")
363
- else
364
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
365
- end
366
- http.use_ssl = true
238
+ def format_hash(hash)
239
+ raise Lumberg::WhmArgumentError.new("Missing WHM hash") unless hash.is_a?(String)
240
+ hash.gsub(/\n|\s/, '')
367
241
  end
368
242
 
243
+ def validate_server_host
244
+ Resolv.getaddress(@host)
245
+ rescue Resolv::ResolvError
246
+ raise Lumberg::WhmArgumentError.new(
247
+ "Unable to resolve #{@host}"
248
+ )
249
+ end
369
250
  end
370
251
  end
371
252
  end
data/lib/lumberg/whm.rb CHANGED
@@ -5,6 +5,7 @@ module Lumberg
5
5
  autoload :Account, 'lumberg/whm/account'
6
6
  autoload :Dns, 'lumberg/whm/dns'
7
7
  autoload :Reseller, 'lumberg/whm/reseller'
8
+ autoload :Cert, 'lumberg/whm/cert'
8
9
 
9
10
  class << self
10
11
 
@@ -24,7 +25,7 @@ module Lumberg
24
25
  arg
25
26
  end
26
27
  end
27
-
28
+
28
29
  # Recursively converts values of 0 or 1 to true or false
29
30
  def to_bool(hash, *keys)
30
31
  if keys.empty?
data/lib/lumberg.rb CHANGED
@@ -1,23 +1,49 @@
1
1
  $:.unshift(File.dirname(__FILE__))
2
2
 
3
3
  # External Libs
4
+ require 'openssl'
4
5
  require 'json'
5
6
  require 'uri'
6
- require 'net/http'
7
- require 'net/https'
7
+ require 'faraday'
8
+ require 'faraday_middleware'
9
+ require 'logger'
10
+ require 'resolv'
8
11
 
9
12
  # Internal Libs
10
- require 'net_http_hacked'
13
+ require 'lumberg/format_whm'
11
14
  require 'lumberg/version'
12
15
  require 'lumberg/exceptions'
13
- require 'lumberg/whm/args'
16
+ require 'lumberg/config'
14
17
  require 'lumberg/whm'
18
+ require 'lumberg/cpanel'
15
19
 
16
20
  module Lumberg
17
- class << self
18
- def base_path
19
- File.dirname(__FILE__)
20
- end
21
+
22
+ extend self
23
+
24
+ attr_accessor :configuration
25
+
26
+ def base_path
27
+ File.dirname(__FILE__)
21
28
  end
29
+
30
+ self.configuration ||= Lumberg::Config.new
31
+
32
+ # Specificy the config via block
33
+ #
34
+ # ==== Attributes
35
+ #
36
+ # * +debug+ - Set to true to log debug info to $stderr, or a file path
37
+ #
38
+ # ==== Example
39
+ #
40
+ # Lumberg.config do |c|
41
+ # c.dubug "path/to/file.log"
42
+ # end
43
+ def config
44
+ yield self.configuration if block_given?
45
+ self.configuration.options
46
+ end
47
+
22
48
  end
23
49
 
data/lumberg.gemspec CHANGED
@@ -11,14 +11,17 @@ Gem::Specification.new do |s|
11
11
  s.homepage = ""
12
12
  s.summary = %q{Ruby library for the WHM & cPanel API}
13
13
  s.description = %q{Ruby library for the WHM & cPanel API; It's not a half day or anything like that}
14
+ s.license = 'MIT'
14
15
 
15
16
  s.rubyforge_project = "lumberg"
16
17
 
17
- s.add_dependency 'json'
18
+ s.add_runtime_dependency 'json', '~> 1.7.3'
19
+ s.add_runtime_dependency 'faraday', '~> 0.8.8'
20
+ s.add_runtime_dependency 'faraday_middleware', '~> 0.9.0'
18
21
  s.add_runtime_dependency('jruby-openssl', '~> 0.7.3') if RUBY_PLATFORM == 'java'
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 'rspec', '~> 2.10.0'
23
+ s.add_development_dependency 'webmock', '~> 1.8.7'
24
+ s.add_development_dependency 'vcr', '~> 2.4.0'
22
25
  s.add_development_dependency 'rake', '~> 0.9.2.2'
23
26
 
24
27
  s.files = `git ls-files`.split("\n")
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lumberg::Config do
4
+ before(:each) do
5
+ @config = Lumberg::Config.new
6
+ end
7
+
8
+ describe "#new" do
9
+ it "sets up the @config hash" do
10
+ @config.options.should == {}
11
+ end
12
+ end
13
+
14
+ describe "#[]" do
15
+ it "behaves like an array" do
16
+ @config.options[:something] = 1
17
+ @config[:something].should == 1
18
+ end
19
+ end
20
+
21
+ describe "#debug" do
22
+ it "configures net/http to log to console" do
23
+ @config.options[:debug].should be_nil
24
+ @config.debug true
25
+ @config.options[:debug].should == true
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,84 @@
1
+ require "spec_helper"
2
+
3
+ module Lumberg
4
+ describe Cpanel::AddonDomain do
5
+ before(:each) do
6
+ @login = { :host => @whm_host, :hash => @whm_hash }
7
+ @server = Whm::Server.new(@login.dup)
8
+
9
+ @api_username = "lumberg"
10
+ @addond = Cpanel::AddonDomain.new(
11
+ :server => @server.dup,
12
+ :api_username => @api_username
13
+ )
14
+ end
15
+
16
+ describe "#remove" do
17
+ use_vcr_cassette "cpanel/addon_domain/remove"
18
+
19
+ it "removes an addon domain" do
20
+ # Create the addon domain to be removed
21
+ @addond.add(
22
+ :dir => "public_html/test-addon.com/",
23
+ :newdomain => "test-addon.com",
24
+ :subdomain => "testadd"
25
+ )
26
+
27
+ result = @addond.remove(
28
+ :domain => "test-addon.com",
29
+ :subdomain => "testadd_lumberg-test.com"
30
+ )
31
+
32
+ result[:params][:data][0][:result].should == 1
33
+ end
34
+
35
+ end
36
+
37
+ describe "#add" do
38
+ use_vcr_cassette "cpanel/addon_domain/add"
39
+
40
+ it "adds an addon domain" do
41
+ result = @addond.add(
42
+ :dir => "public_html/test-magic.com/",
43
+ :newdomain => "test-magic.com",
44
+ :subdomain => "tmagic"
45
+ )
46
+ result[:params][:data][0][:result].should == 1
47
+
48
+ # Remove the addon domain
49
+ result = @addond.remove(
50
+ :domain => "test-magic.com",
51
+ :subdomain => "tmagic_lumberg-test.com"
52
+ )
53
+ end
54
+ end
55
+
56
+ describe "#list" do
57
+ use_vcr_cassette "cpanel/addon_domain/list"
58
+
59
+ context "addon domains exist on the account" do
60
+ let(:result) { @addond.list }
61
+ subject { result[:params][:data] }
62
+
63
+ it "returns an array with info for each addon domain" do
64
+ subject.should be_an(Array)
65
+ subject.each {|info|
66
+ info.keys.should include(
67
+ :domainkey, :status, :dir, :reldir, :subdomain, :rootdomain,
68
+ :fullsubdomain, :domain, :basedir
69
+ )
70
+ }
71
+ end
72
+ end
73
+
74
+ context "addon domains do not exist on the account" do
75
+ before { @addond.api_username = "minimal" }
76
+ after { @addond.api_username = "lumberg" }
77
+
78
+ it "returns an empty array" do
79
+ @addond.list[:params][:data].should be_empty
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,22 @@
1
+ require "spec_helper"
2
+
3
+ module Lumberg
4
+ describe Cpanel::Backups do
5
+ let(:server) { Whm::Server.new(:host => @whm_host, :hash => @whm_hash) }
6
+ let(:api_username) { "lumberg" }
7
+ let(:backups) do
8
+ described_class.new(
9
+ :server => server,
10
+ :api_username => api_username
11
+ )
12
+ end
13
+
14
+ describe "#list" do
15
+ use_vcr_cassette("cpanel/backups/list")
16
+
17
+ subject { backups.list[:params][:data] }
18
+
19
+ it { should be_an(Array) }
20
+ end
21
+ end
22
+ end