rmails 0.1.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.
Files changed (332) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/Gemfile +24 -0
  4. data/Gemfile.lock +167 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.markdown +9 -0
  7. data/Rakefile +31 -0
  8. data/Rakefile1 +9 -0
  9. data/Vagrantfile +51 -0
  10. data/app/assets/images/arrow_bottom.gif +0 -0
  11. data/app/assets/images/arrow_right.gif +0 -0
  12. data/app/assets/images/at-sign.png +0 -0
  13. data/app/assets/images/checkerboard.gif +0 -0
  14. data/app/assets/images/glyphicons-halflings-white.png +0 -0
  15. data/app/assets/images/glyphicons-halflings.png +0 -0
  16. data/app/assets/images/icon_draft.gif +0 -0
  17. data/app/assets/images/icon_layout.gif +0 -0
  18. data/app/assets/images/icon_move.gif +0 -0
  19. data/app/assets/images/icon_regular.gif +0 -0
  20. data/app/assets/images/icon_snippet.gif +0 -0
  21. data/app/assets/images/nav_arrow.png +0 -0
  22. data/app/assets/images/x.png +0 -0
  23. data/app/assets/javascripts/application.coffee.erb +27 -0
  24. data/app/assets/javascripts/canjs/can.construct.proxy.js +60 -0
  25. data/app/assets/javascripts/canjs/can.construct.super.js +44 -0
  26. data/app/assets/javascripts/canjs/can.control.plugin.js +245 -0
  27. data/app/assets/javascripts/canjs/can.control.view.js +88 -0
  28. data/app/assets/javascripts/canjs/can.dojo.js +3669 -0
  29. data/app/assets/javascripts/canjs/can.dojo.min.js +66 -0
  30. data/app/assets/javascripts/canjs/can.fixture.js +1020 -0
  31. data/app/assets/javascripts/canjs/can.jquery.js +2995 -0
  32. data/app/assets/javascripts/canjs/can.jquery.min.js +52 -0
  33. data/app/assets/javascripts/canjs/can.mootools.js +3462 -0
  34. data/app/assets/javascripts/canjs/can.mootools.min.js +63 -0
  35. data/app/assets/javascripts/canjs/can.observe.attributes.js +293 -0
  36. data/app/assets/javascripts/canjs/can.observe.backup.js +368 -0
  37. data/app/assets/javascripts/canjs/can.observe.delegate.js +359 -0
  38. data/app/assets/javascripts/canjs/can.observe.setter.js +58 -0
  39. data/app/assets/javascripts/canjs/can.observe.validations.js +374 -0
  40. data/app/assets/javascripts/canjs/can.view.modifiers.js +292 -0
  41. data/app/assets/javascripts/canjs/can.yui.js +3530 -0
  42. data/app/assets/javascripts/canjs/can.yui.min.js +65 -0
  43. data/app/assets/javascripts/canjs/can.zepto.js +3426 -0
  44. data/app/assets/javascripts/canjs/can.zepto.min.js +62 -0
  45. data/app/assets/javascripts/controls/admins.coffee.erb +105 -0
  46. data/app/assets/javascripts/controls/aliases.coffee.erb +91 -0
  47. data/app/assets/javascripts/controls/domains.coffee.erb +115 -0
  48. data/app/assets/javascripts/controls/settings.coffee.erb +47 -0
  49. data/app/assets/javascripts/controls/users.coffee.erb +94 -0
  50. data/app/assets/javascripts/lib/facebox.js +311 -0
  51. data/app/assets/javascripts/lib/html5.js +2 -0
  52. data/app/assets/javascripts/lib/jquery.js +9301 -0
  53. data/app/assets/javascripts/lib/jquery_formparams.js +108 -0
  54. data/app/assets/javascripts/lib/jquery_input_hint.js +20 -0
  55. data/app/assets/javascripts/lib/jquery_paginate.js +120 -0
  56. data/app/assets/javascripts/lib/jquery_ui_custom.js +6 -0
  57. data/app/assets/javascripts/lib/json2.js +487 -0
  58. data/app/assets/javascripts/lib/utils.coffee.erb +48 -0
  59. data/app/assets/javascripts/models/admin.coffee.erb +42 -0
  60. data/app/assets/javascripts/models/alias.coffee.erb +28 -0
  61. data/app/assets/javascripts/models/domain.coffee.erb +39 -0
  62. data/app/assets/javascripts/models/property.coffee.erb +18 -0
  63. data/app/assets/javascripts/models/user.coffee.erb +29 -0
  64. data/app/assets/stylesheets/application.sass +156 -0
  65. data/app/assets/stylesheets/base.css.sass +243 -0
  66. data/app/assets/stylesheets/facebox.css +80 -0
  67. data/app/assets/stylesheets/lib/bootstrap.css +9 -0
  68. data/app/assets/stylesheets/twitter/bootstrap-responsive.scss +1 -0
  69. data/app/assets/stylesheets/twitter/bootstrap.scss +63 -0
  70. data/app/assets/stylesheets/twitter/bootstrap/_accordion.scss +34 -0
  71. data/app/assets/stylesheets/twitter/bootstrap/_alerts.scss +79 -0
  72. data/app/assets/stylesheets/twitter/bootstrap/_breadcrumbs.scss +24 -0
  73. data/app/assets/stylesheets/twitter/bootstrap/_button-groups.scss +229 -0
  74. data/app/assets/stylesheets/twitter/bootstrap/_buttons.scss +228 -0
  75. data/app/assets/stylesheets/twitter/bootstrap/_carousel.scss +158 -0
  76. data/app/assets/stylesheets/twitter/bootstrap/_close.scss +32 -0
  77. data/app/assets/stylesheets/twitter/bootstrap/_code.scss +61 -0
  78. data/app/assets/stylesheets/twitter/bootstrap/_component-animations.scss +22 -0
  79. data/app/assets/stylesheets/twitter/bootstrap/_dropdowns.scss +237 -0
  80. data/app/assets/stylesheets/twitter/bootstrap/_forms.scss +689 -0
  81. data/app/assets/stylesheets/twitter/bootstrap/_grid.scss +21 -0
  82. data/app/assets/stylesheets/twitter/bootstrap/_hero-unit.scss +25 -0
  83. data/app/assets/stylesheets/twitter/bootstrap/_labels-badges.scss +83 -0
  84. data/app/assets/stylesheets/twitter/bootstrap/_layouts.scss +16 -0
  85. data/app/assets/stylesheets/twitter/bootstrap/_media.scss +55 -0
  86. data/app/assets/stylesheets/twitter/bootstrap/_mixins.scss +690 -0
  87. data/app/assets/stylesheets/twitter/bootstrap/_modals.scss +95 -0
  88. data/app/assets/stylesheets/twitter/bootstrap/_navbar.scss +497 -0
  89. data/app/assets/stylesheets/twitter/bootstrap/_navs.scss +409 -0
  90. data/app/assets/stylesheets/twitter/bootstrap/_pager.scss +43 -0
  91. data/app/assets/stylesheets/twitter/bootstrap/_pagination.scss +123 -0
  92. data/app/assets/stylesheets/twitter/bootstrap/_popovers.scss +133 -0
  93. data/app/assets/stylesheets/twitter/bootstrap/_progress-bars.scss +122 -0
  94. data/app/assets/stylesheets/twitter/bootstrap/_reset.scss +216 -0
  95. data/app/assets/stylesheets/twitter/bootstrap/_responsive-1200px-min.scss +28 -0
  96. data/app/assets/stylesheets/twitter/bootstrap/_responsive-767px-max.scss +193 -0
  97. data/app/assets/stylesheets/twitter/bootstrap/_responsive-768px-979px.scss +19 -0
  98. data/app/assets/stylesheets/twitter/bootstrap/_responsive-navbar.scss +189 -0
  99. data/app/assets/stylesheets/twitter/bootstrap/_responsive-utilities.scss +74 -0
  100. data/app/assets/stylesheets/twitter/bootstrap/_scaffolding.scss +53 -0
  101. data/app/assets/stylesheets/twitter/bootstrap/_sprites.scss +197 -0
  102. data/app/assets/stylesheets/twitter/bootstrap/_tables.scss +235 -0
  103. data/app/assets/stylesheets/twitter/bootstrap/_thumbnails.scss +53 -0
  104. data/app/assets/stylesheets/twitter/bootstrap/_tooltip.scss +70 -0
  105. data/app/assets/stylesheets/twitter/bootstrap/_type.scss +247 -0
  106. data/app/assets/stylesheets/twitter/bootstrap/_utilities.scss +45 -0
  107. data/app/assets/stylesheets/twitter/bootstrap/_variables.scss +301 -0
  108. data/app/assets/stylesheets/twitter/bootstrap/_wells.scss +29 -0
  109. data/app/assets/stylesheets/twitter/bootstrap/responsive.scss +48 -0
  110. data/app/controllers/admin_users_controller.rb +62 -0
  111. data/app/controllers/aliases_controller.rb +35 -0
  112. data/app/controllers/application_controller.rb +20 -0
  113. data/app/controllers/domains_controller.rb +48 -0
  114. data/app/controllers/server_controller.rb +28 -0
  115. data/app/controllers/users_controller.rb +35 -0
  116. data/app/helpers/admin_users_helper.rb +11 -0
  117. data/app/helpers/application_helper.rb +2 -0
  118. data/app/helpers/domains_helper.rb +25 -0
  119. data/app/helpers/server_helper.rb +30 -0
  120. data/app/mailers/.gitkeep +0 -0
  121. data/app/models/.gitkeep +0 -0
  122. data/app/models/admin_user.rb +54 -0
  123. data/app/models/certificate_manager.rb +46 -0
  124. data/app/models/property.rb +103 -0
  125. data/app/models/property/awstats.rb +15 -0
  126. data/app/models/property/dovecot.rb +61 -0
  127. data/app/models/property/dspam.rb +45 -0
  128. data/app/models/property/nginx.rb +47 -0
  129. data/app/models/property/postfix.rb +64 -0
  130. data/app/models/property_value_validator.rb +41 -0
  131. data/app/models/system_manager.rb +88 -0
  132. data/app/models/virtual_alias.rb +13 -0
  133. data/app/models/virtual_domain.rb +15 -0
  134. data/app/models/virtual_user.rb +51 -0
  135. data/app/views/admin_users/_form.html.haml +21 -0
  136. data/app/views/admin_users/first.html.haml +12 -0
  137. data/app/views/admin_users/index.html.haml +61 -0
  138. data/app/views/aliases/_form.html.haml +11 -0
  139. data/app/views/aliases/_list.html.haml +0 -0
  140. data/app/views/devise/confirmations/new.html.haml +9 -0
  141. data/app/views/devise/mailer/confirmation_instructions.html.haml +4 -0
  142. data/app/views/devise/mailer/reset_password_instructions.html.haml +6 -0
  143. data/app/views/devise/mailer/unlock_instructions.html.haml +5 -0
  144. data/app/views/devise/passwords/edit.html.haml +14 -0
  145. data/app/views/devise/passwords/new.html.haml +12 -0
  146. data/app/views/devise/registrations/edit.html.haml +18 -0
  147. data/app/views/devise/registrations/new.html.haml +10 -0
  148. data/app/views/devise/sessions/new.html.haml +16 -0
  149. data/app/views/devise/shared/_links.haml +17 -0
  150. data/app/views/devise/unlocks/new.html.haml +11 -0
  151. data/app/views/domains/_fields.html.haml +0 -0
  152. data/app/views/domains/_form.html.haml +7 -0
  153. data/app/views/domains/index.html.haml +133 -0
  154. data/app/views/domains/show.html.haml +1 -0
  155. data/app/views/layouts/_nav.html.haml +3 -0
  156. data/app/views/layouts/application.html.haml +29 -0
  157. data/app/views/server/_certificates.html.haml +10 -0
  158. data/app/views/server/_dovecot.html.haml +27 -0
  159. data/app/views/server/_dspam.html.haml +9 -0
  160. data/app/views/server/_postfix_info.html.haml +5 -0
  161. data/app/views/server/_postfix_test.html.haml +5 -0
  162. data/app/views/server/_status.html.haml +11 -0
  163. data/app/views/server/index.html.haml +36 -0
  164. data/app/views/users/_form.html.haml +11 -0
  165. data/app/views/users/_list.html.haml +0 -0
  166. data/bin/rmails +43 -0
  167. data/config.ru +4 -0
  168. data/config/application.rb +62 -0
  169. data/config/boot.rb +6 -0
  170. data/config/environment.rb +5 -0
  171. data/config/environments/development.rb +37 -0
  172. data/config/environments/production.rb +67 -0
  173. data/config/environments/test.rb +37 -0
  174. data/config/initializers/backtrace_silencers.rb +7 -0
  175. data/config/initializers/devise.rb +240 -0
  176. data/config/initializers/devise_encryptable.rb +37 -0
  177. data/config/initializers/devise_models.rb +86 -0
  178. data/config/initializers/inflections.rb +15 -0
  179. data/config/initializers/mime_types.rb +5 -0
  180. data/config/initializers/secret_token.rb +7 -0
  181. data/config/initializers/session_store.rb +8 -0
  182. data/config/initializers/simple_form.rb +142 -0
  183. data/config/initializers/simple_form_bootstrap.rb +45 -0
  184. data/config/initializers/wrap_parameters.rb +14 -0
  185. data/config/locales/cz.yml +45 -0
  186. data/config/locales/devise.cz.yml +47 -0
  187. data/config/locales/devise.en.yml +60 -0
  188. data/config/locales/en.yml +5 -0
  189. data/config/locales/server/cz.yml +14 -0
  190. data/config/locales/server/en.yml +7 -0
  191. data/config/locales/server/help/dovecot/cz.yml +21 -0
  192. data/config/locales/server/help/dovecot/en.yml +18 -0
  193. data/config/locales/server/help/dspam/cz.yml +10 -0
  194. data/config/locales/server/help/dspam/en.yml +4 -0
  195. data/config/locales/server/key/dovecot/cz.yml +23 -0
  196. data/config/locales/server/key/dovecot/en.yml +20 -0
  197. data/config/locales/server/key/dspam/cz.yml +10 -0
  198. data/config/locales/server/key/dspam/en.yml +4 -0
  199. data/config/locales/simple_form.en.yml +26 -0
  200. data/config/locales/views/admin_users/cz.yml +25 -0
  201. data/config/locales/views/admin_users/en.yml +5 -0
  202. data/config/locales/views/aliases/cz.yml +17 -0
  203. data/config/locales/views/aliases/en.yml +1 -0
  204. data/config/locales/views/devise/cz.yml +26 -0
  205. data/config/locales/views/devise/en.yml +13 -0
  206. data/config/locales/views/domains/cz.yml +15 -0
  207. data/config/locales/views/domains/en.yml +15 -0
  208. data/config/locales/views/server/cz.yml +19 -0
  209. data/config/locales/views/server/en.yml +3 -0
  210. data/config/locales/views/users/cz.yml +18 -0
  211. data/config/locales/views/users/en.yml +1 -0
  212. data/config/routes.rb +80 -0
  213. data/db/migrate/20121112201233_virtual_domain.rb +11 -0
  214. data/db/migrate/20121112201247_virtual_alias.rb +10 -0
  215. data/db/migrate/20121112201341_virtual_user.rb +34 -0
  216. data/db/migrate/20121112201359_create_admin_user.rb +30 -0
  217. data/db/migrate/20121112201411_server_configuration.rb +13 -0
  218. data/db/migrate/20130304083938_join_domains_users.rb +12 -0
  219. data/db/migrate/20130311214040_create_versions.rb +18 -0
  220. data/db/seeds.rb +45 -0
  221. data/lib/devise-encryptable.rb +1 -0
  222. data/lib/rmails.rb +5 -0
  223. data/lib/rmails/installer.rb +37 -0
  224. data/lib/rmails/version.rb +3 -0
  225. data/lib/tasks/.gitkeep +0 -0
  226. data/lib/templates/haml/scaffold/_form.html.haml +10 -0
  227. data/locals +0 -0
  228. data/log/.gitkeep +0 -0
  229. data/public/404.html +26 -0
  230. data/public/422.html +26 -0
  231. data/public/500.html +25 -0
  232. data/public/favicon.ico +0 -0
  233. data/public/fonts/London.eot +0 -0
  234. data/public/fonts/London.otf +0 -0
  235. data/public/fonts/London.woff +0 -0
  236. data/public/fonts/LondonBold.otf +0 -0
  237. data/public/robots.txt +5 -0
  238. data/rmails.gemspec +35 -0
  239. data/script/prepflog.pl +576 -0
  240. data/script/rails +6 -0
  241. data/system/config/automateit_env.rb +16 -0
  242. data/system/config/fields.yml +48 -0
  243. data/system/config/tags.yml +39 -0
  244. data/system/dist/README_AutomateIt_dist.txt +20 -0
  245. data/system/dist/amavis/spamassassin.cf.erb +85 -0
  246. data/system/dist/amavis/user.erb +33 -0
  247. data/system/dist/awstats/awstats.mail.conf.erb +41 -0
  248. data/system/dist/awstats/prepflog.pl +576 -0
  249. data/system/dist/dovecot/dovecot-sql.conf.ext.erb +14 -0
  250. data/system/dist/dovecot/dovecot.conf.erb +297 -0
  251. data/system/dist/dovecot/old_dovecot.conf.erb +63 -0
  252. data/system/dist/dspam/conf.erb +96 -0
  253. data/system/dist/dspam/pgsql.conf +33 -0
  254. data/system/dist/nginx/awstats.erb +17 -0
  255. data/system/dist/nginx/rmails.erb +40 -0
  256. data/system/dist/postfix/email2email.cf.erb +5 -0
  257. data/system/dist/postfix/main.cf.erb +118 -0
  258. data/system/dist/postfix/master.cf.erb +74 -0
  259. data/system/dist/postfix/sasl.conf.erb +3 -0
  260. data/system/dist/postfix/sender_login_maps.cf.erb +5 -0
  261. data/system/dist/postfix/virtual_alias_maps.cf.erb +5 -0
  262. data/system/dist/postfix/virtual_mailbox_domains.cf.erb +5 -0
  263. data/system/dist/postfix/virtual_mailbox_maps.cf.erb +5 -0
  264. data/system/dist/postgresql/postgresql.conf.erb +54 -0
  265. data/system/dist/rmails/Gemfile.1 +8 -0
  266. data/system/dist/rmails/Gemfile.2 +24 -0
  267. data/system/dist/rmails/database.yml.erb +15 -0
  268. data/system/dist/sudoers +37 -0
  269. data/system/lib/README_AutomateIt_lib.txt +22 -0
  270. data/system/lib/dkim_key.rb +9 -0
  271. data/system/lib/smtpd_key.rb +39 -0
  272. data/system/lib/ssl.rb +23 -0
  273. data/system/recipes/01_prepare_server.rb +84 -0
  274. data/system/recipes/02_setup_database.rb +65 -0
  275. data/system/recipes/03_setup_postfix.rb +124 -0
  276. data/system/recipes/04_setup_dovecot.rb +78 -0
  277. data/system/recipes/05_setup_nginx.rb +29 -0
  278. data/system/recipes/06_setup_dspam.rb +24 -0
  279. data/system/recipes/07_setup_amavis.rb +16 -0
  280. data/system/recipes/08_setup_spamassassin.rb +22 -0
  281. data/system/recipes/09_setup_awstats.rb +49 -0
  282. data/system/recipes/XX_start_services.rb +5 -0
  283. data/test/fixtures/.gitkeep +0 -0
  284. data/test/functional/.gitkeep +0 -0
  285. data/test/functional/aliases_controller_test.rb +7 -0
  286. data/test/functional/domains_controller_test.rb +7 -0
  287. data/test/functional/users_controller_test.rb +7 -0
  288. data/test/integration/.gitkeep +0 -0
  289. data/test/performance/browsing_test.rb +12 -0
  290. data/test/test_helper.rb +13 -0
  291. data/test/unit/.gitkeep +0 -0
  292. data/test/unit/helpers/aliases_helper_test.rb +4 -0
  293. data/test/unit/helpers/domains_helper_test.rb +4 -0
  294. data/test/unit/helpers/users_helper_test.rb +4 -0
  295. data/vendor/assets/javascripts/.gitkeep +0 -0
  296. data/vendor/assets/javascripts/canjs/can.construct.proxy.js +60 -0
  297. data/vendor/assets/javascripts/canjs/can.construct.super.js +44 -0
  298. data/vendor/assets/javascripts/canjs/can.control.plugin.js +245 -0
  299. data/vendor/assets/javascripts/canjs/can.control.view.js +88 -0
  300. data/vendor/assets/javascripts/canjs/can.dojo.js +3669 -0
  301. data/vendor/assets/javascripts/canjs/can.dojo.min.js +66 -0
  302. data/vendor/assets/javascripts/canjs/can.fixture.js +1020 -0
  303. data/vendor/assets/javascripts/canjs/can.jquery.js +2995 -0
  304. data/vendor/assets/javascripts/canjs/can.jquery.min.js +52 -0
  305. data/vendor/assets/javascripts/canjs/can.mootools.js +3462 -0
  306. data/vendor/assets/javascripts/canjs/can.mootools.min.js +63 -0
  307. data/vendor/assets/javascripts/canjs/can.observe.attributes.js +293 -0
  308. data/vendor/assets/javascripts/canjs/can.observe.backup.js +368 -0
  309. data/vendor/assets/javascripts/canjs/can.observe.delegate.js +359 -0
  310. data/vendor/assets/javascripts/canjs/can.observe.setter.js +58 -0
  311. data/vendor/assets/javascripts/canjs/can.observe.validations.js +374 -0
  312. data/vendor/assets/javascripts/canjs/can.view.modifiers.js +292 -0
  313. data/vendor/assets/javascripts/canjs/can.yui.js +3530 -0
  314. data/vendor/assets/javascripts/canjs/can.yui.min.js +65 -0
  315. data/vendor/assets/javascripts/canjs/can.zepto.js +3426 -0
  316. data/vendor/assets/javascripts/canjs/can.zepto.min.js +62 -0
  317. data/vendor/assets/javascripts/twitter/bootstrap-affix.js +104 -0
  318. data/vendor/assets/javascripts/twitter/bootstrap-alert.js +90 -0
  319. data/vendor/assets/javascripts/twitter/bootstrap-button.js +96 -0
  320. data/vendor/assets/javascripts/twitter/bootstrap-carousel.js +176 -0
  321. data/vendor/assets/javascripts/twitter/bootstrap-collapse.js +158 -0
  322. data/vendor/assets/javascripts/twitter/bootstrap-dropdown.js +150 -0
  323. data/vendor/assets/javascripts/twitter/bootstrap-modal.js +239 -0
  324. data/vendor/assets/javascripts/twitter/bootstrap-popover.js +103 -0
  325. data/vendor/assets/javascripts/twitter/bootstrap-scrollspy.js +151 -0
  326. data/vendor/assets/javascripts/twitter/bootstrap-tab.js +135 -0
  327. data/vendor/assets/javascripts/twitter/bootstrap-tooltip.js +275 -0
  328. data/vendor/assets/javascripts/twitter/bootstrap-transition.js +60 -0
  329. data/vendor/assets/javascripts/twitter/bootstrap-typeahead.js +300 -0
  330. data/vendor/assets/javascripts/twitter/my/bootstrap-typeahead.js +311 -0
  331. data/vendor/assets/stylesheets/.gitkeep +0 -0
  332. metadata +470 -0
@@ -0,0 +1,46 @@
1
+ class CertificateManager
2
+
3
+ attr_reader :interpreter
4
+
5
+ def self.save_all_and_restart
6
+ sm = CertificateManager.new
7
+ sm.send 'smtpd_cert_gen', {}
8
+ end
9
+
10
+ def initialize
11
+ @i = @interpreter = AutomateIt.new
12
+ end
13
+
14
+ def smtpd_cert_gen(params)
15
+ #pass = SecureRandom.base64(25)
16
+ #@i.edit :file => pass_file = @i.mktemp do
17
+ # append pass
18
+ #end
19
+ params[:email] ||= 'fandisek@rmails.com' # Property.find_by_key('postmaster').value
20
+ @i.shell_manager.sh "openssl req -new -newkey rsa:4096 -x509 -days 3650 -nodes -out /etc/ssl/certs/smtpd.pem -keyout /etc/ssl/private/smtpd.pem -subj /C=#{params[:country]}/ST=#{params[:state]}/L=#{params[:locality]}/O=#{params[:org]}/OU=#{params[:org_unit]}/CN=#{params[:name]||Property.find_by_key('myhostname').value}/emailAddress=#{params[:email]}"
21
+ #@i.shell_manager.rm pass_file
22
+ #pass
23
+ end
24
+
25
+ def https_cert_gen(params)
26
+ params[:email] ||= 'fandisek@rmails.com'
27
+ @i.shell_manager.sh "openssl req -new -newkey rsa:4096 -x509 -days 3650 -nodes -out /etc/ssl/certs/https.pem -keyout /etc/ssl/private/https.pem -subj /C=/ST=/L=/O=/OU=/CN=#{params[:name]||Property.find_by_key('mydomain').value}/emailAddress=#{params[:email]}"
28
+ end
29
+
30
+ def dkim_cert_gen(domain, keyname=domain)
31
+ @i.shell_manager.sh("opendkim-genkey -r -d #{keyname} -D /etc/ssl/dkim")
32
+ @i.shell_manager.chown 'opendkim', 'opendkim', "/etc/ssl/dkim/#{keyname}.private"
33
+
34
+ key_table = "default._domainkey.#{keyname} #{domain}:default:/etc/ssl/dkim/#{keyname}.private"
35
+ signing_table = "#{domain} default._domainkey.#{keyname}"
36
+
37
+ @i.edit :file => '/etc/opendkim/KeyTable' do
38
+ append key_table
39
+ end
40
+ @i.edit :file => '/etc/opendkim/SigningTable' do
41
+ append signing_table
42
+ end
43
+ end
44
+
45
+
46
+ end
@@ -0,0 +1,103 @@
1
+ class Property < ActiveRecord::Base
2
+
3
+ self.table_name = 'server_configuration'
4
+
5
+ attr_reader :collection, :multiple, :translate
6
+
7
+ validates_presence_of :key, :value, :service
8
+ validates_with PropertyValueValidator
9
+
10
+ has_paper_trail :ignore => [:new_value], :skip => [:new_value, :template]
11
+
12
+ def self.service; APPLICATION ;end
13
+
14
+ def self.add(service, key, value, template)
15
+ p = Property.find_by_key(key)||Property.new
16
+ p.key = key; p.value = value; p.template = template
17
+ case service
18
+ when :postfix
19
+ p.service = POSTFIX
20
+ when :dovecot
21
+ p.service = DOVECOT
22
+ when :awstats
23
+ p.service = AWSTATS
24
+ when :dspam
25
+ p.service = DSPAM
26
+ when :nginx
27
+ p.service = NGINX
28
+ else
29
+ end
30
+ p.save
31
+ end
32
+
33
+ def self.all_new_values
34
+ self.select([:key, :value, :new_value]).where 'new_value is not null'
35
+ end
36
+
37
+ def self.all_new_values_for_write
38
+ properties = self.where 'new_value is not null'
39
+ # template = "template+type", so remove '+type'
40
+ properties.map {|p| p.template.sub!(/\+.*/, ''); p }
41
+ end
42
+
43
+ def self.all_to_show
44
+ properties = self.select [:id, :key, :value, :new_value, :template]
45
+ # template = "template+type", so remove 'template+'
46
+ properties.map {|p| p.template.sub!(/.*\+/, ''); p }
47
+ end
48
+
49
+ def input_type
50
+ t = template.to_sym
51
+ if :yes_no == t
52
+ @collection = [ 'yes', 'no' ]
53
+ @translate = true
54
+ return :radio_buttons
55
+
56
+ elsif :on_off == t
57
+ @collection = [ 'on', 'off']
58
+ @translate = true
59
+ return :radio_buttons
60
+
61
+ elsif [:select_from_enum, :select_from_list].include? t
62
+ arr = self.value.split(';')
63
+ @collection = arr.map {|s| s.sub('+','') }
64
+ @translate = t == :select_from_enum
65
+ self.value = arr.select {|s| s.first == '+' }.first[1..-1]
66
+ return :select
67
+
68
+ elsif [:multiselect_from_enum, :multiselect_from_list].include? t
69
+ arr = self.value.split(';')
70
+ @collection = arr.map {|s| s.sub('+','') }
71
+ @multiple = true
72
+ @translate = t == :multiselect_from_enum
73
+ self.value = arr.map {|s| s[1..-1] if s.first == '+' }.compact
74
+ return :select
75
+
76
+ elsif [:integer, :select].include? t
77
+ return t
78
+
79
+ else
80
+ return :string
81
+ end
82
+ end
83
+
84
+ def has_new_value?
85
+ !self.new_value.nil?
86
+ end
87
+
88
+ def set_value(value)
89
+ self.update_attribute :new_value, value
90
+ end
91
+
92
+ protected
93
+
94
+ APPLICATION = 0
95
+
96
+ POSTFIX = 1
97
+ DOVECOT = 2
98
+ NGINX = 3
99
+ DSPAM = 4
100
+ AMAVIS = 5
101
+ AWSTATS = 6
102
+
103
+ end
@@ -0,0 +1,15 @@
1
+ class Property::Awstats < Property
2
+
3
+ def self.service; AWSTATS ;end
4
+
5
+ default_scope where(:service => self.service)
6
+
7
+
8
+ protected
9
+
10
+ def self.etc_awstats
11
+ '/etc/awstats'
12
+ end
13
+
14
+
15
+ end
@@ -0,0 +1,61 @@
1
+ class Property::Dovecot < Property
2
+
3
+ def self.service; DOVECOT ;end
4
+
5
+ default_scope where(:service => self.service)
6
+
7
+ def self.etc_dovecot
8
+ '/etc/dovecot'
9
+ end
10
+
11
+ def self.value_template(a, locals)
12
+ a.edit :file => "#{etc_dovecot}/dovecot.conf", :backup => false do
13
+ locals.each do |key, value|
14
+ replace /#{key}\s*=\s*.*/, "#{key} = #{value}"
15
+ end
16
+ end
17
+ end
18
+
19
+ def self.yes_no_template(a, values)
20
+ a.edit :file => "#{etc_dovecot}/dovecot.conf", :backup => false do
21
+ values.each do |key, value|
22
+ replace /^#{key}\s*=\s*.*$/, "#{key} = #{value}"
23
+ end
24
+ end
25
+ end
26
+
27
+ def self.commented_value_template(a, values)
28
+ a.edit :file => "#{etc_dovecot}/dovecot.conf", :backup => false do
29
+ values.each do |key, value|
30
+ param_name = key.split('__').last
31
+ rxp = /(\s*#\s#{key}\s+!!.*!!\s*$\s*#{param_name}\s*=\s*)(\d+)/
32
+ manipulate do |text|
33
+ text =~ rxp
34
+ text.gsub rxp, "#{$1}#{value}"
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ def self.storage_template(a, values)
41
+ a.edit :file => "#{etc_dovecot}/dovecot.conf", :backup => false do
42
+ values.each do |key, value|
43
+ value += '%' if value =~ /%$/
44
+ manipulate do |text|
45
+ case key.to_sym
46
+ when :storage_size
47
+ text =~ rxp = /(\*:storage\s*=\s*).*$/
48
+ when :storage_trash
49
+ text =~ rxp = /(Trash:storage\s*=\s*).*$/
50
+ when :storage_spam
51
+ text =~ rxp = /(Spam:storage\s*=\s*).*$/
52
+ else
53
+ end
54
+ text.gsub rxp, "#{$1}#{value}"
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+
61
+ end
@@ -0,0 +1,45 @@
1
+ class Property::Dspam< Property
2
+
3
+ def self.service; DSPAM ;end
4
+
5
+ default_scope where(:service => self.service)
6
+
7
+
8
+ def self.on_off_pref_template(a, locals)
9
+ a.edit :file => "#{etc_dspam}/dspam.conf" do
10
+ locals.each do |key, value|
11
+ value = value == true or value == 'on' ? 'on' : 'off'
12
+ delete /^Preference\s+"#{key}/
13
+ append "Preference\t\t\"#{key}=#{value}\""
14
+ end
15
+ end
16
+ end
17
+
18
+ def self.preference_template(a, locals)
19
+ a.edit :file => "#{etc_dspam}/dspam.conf" do
20
+ locals.each do |key, value|
21
+ delete /^Preference\s+"#{key}/
22
+ append "Preference\t\t\"#{key}=#{value}\""
23
+ end
24
+ end
25
+ end
26
+
27
+ def self.enum_template(a, locals)
28
+ a.edit :file => "#{etc_dspam}/dspam.conf" do
29
+ locals.each do |key, value|
30
+ value = value.split(';').select {|s| sfirst=='+' }. first[1..-1]
31
+ delete /^Preference\s+"#{key}/
32
+ append "Preference\t\t\"#{key}=#{value}\""
33
+ end
34
+ end
35
+ end
36
+
37
+
38
+ protected
39
+
40
+ def self.etc_dspam
41
+ '/etc/dspam'
42
+ end
43
+
44
+
45
+ end
@@ -0,0 +1,47 @@
1
+ class Property::Nginx < Property
2
+
3
+ def self.service; NGINX ;end
4
+
5
+ default_scope where(:service => self.service)
6
+
7
+ def self.render_thin_site_template(a, site, key_value_string)
8
+ # example key_value_string= 'hostnames=rmails.com www.rmails.com;a=b;c=d'
9
+ locals = Hash[ key_value_string.split(';').map {|it| it.split('=', 2) } ]
10
+ site_path = "#{etc_nginx}/#{sites_available}/#{site}"
11
+ render(
12
+ :file => "#{dist}nginx/rmails.erb",
13
+ :to => site_path,
14
+ :mode => 0664,
15
+ :locals => locals
16
+ )
17
+ end
18
+
19
+ def site_power(a, site, run)
20
+ site_enabled = "#{etc_nginx}/#{sites_enabled}/#{site}"
21
+ if run
22
+ unless File.file? site_enabled
23
+ a.shell_manager.ln_s "#{etc_nginx}/#{sites_available}/#{site}",
24
+ site_enabled
25
+ end
26
+ else
27
+ a.shell_manager.rm site_enabled
28
+ end
29
+ end
30
+
31
+ protected
32
+
33
+ def self.etc_nginx
34
+ '/etc/nginx'
35
+ end
36
+
37
+ def self.sites_enabled
38
+ 'sites-enabled'
39
+ end
40
+
41
+ def self.sites_available
42
+ 'sites-available'
43
+ end
44
+
45
+
46
+
47
+ end
@@ -0,0 +1,64 @@
1
+ class Property::Postfix < Property
2
+
3
+ def self.service; POSTFIX ;end
4
+
5
+ default_scope where(:service => self.service)
6
+
7
+ def self.main_value_template(a, locals)
8
+ a.edit :file => "#{etc_postfix}/main.cf", :backup => false do
9
+ locals.each do |key, value|
10
+ replace /^#{key}\s*=\s*.*$/, "#{key}=#{value}"
11
+ end
12
+ end
13
+ end
14
+
15
+ # reject_rbl_client bl.spamcop.net
16
+ # reject_rbl_client zen.spamhaus.org ...
17
+ # values = {'bl.spamcop.net' => true, 'zen.spamhaus.org' => false}
18
+ def self.rbl_client_template(a, values)
19
+ a.edit :file => "#{etc_postfix}/main.cf", :backup => false do
20
+ values.each do |key, value|
21
+ value ? uncomment(key) : comment(key)
22
+ end
23
+ end
24
+ end
25
+
26
+ def self.dspam_power(a, run)
27
+ a.edit :file => "#{etc_postfix}/master.cf", :backup => false do
28
+ if run
29
+ uncomment 'filter=lmtp:unix:/var/run/dspam'
30
+ uncomment 'localhost:7711 inet'
31
+ else
32
+ comment 'filter=lmtp:unix:/var/run/dspam'
33
+ comment 'localhost:7711 inet'
34
+ end
35
+ end
36
+ end
37
+
38
+ def self.dkim_power(a, run)
39
+ a.edit :file => "#{etc_postfix}/main.cf", :backup => false do
40
+ if run
41
+ uncomment 'smtpd_milters = inet:127.0.0.1:8891'
42
+ uncomment 'non_smtpd_milters = inet:127.0.0.1:8891'
43
+ else
44
+ comment 'smtpd_milters = inet:127.0.0.1:8891'
45
+ comment 'non_smtpd_milters = inet:127.0.0.1:8891'
46
+ end
47
+ end
48
+ a.edit :file => "/etc/default/opendkim", :backup => false do
49
+ if run
50
+ uncomment 'SOCKET="inet:8891@localhost"'
51
+ else
52
+ comment 'SOCKET="inet:8891@localhost"'
53
+ end
54
+ end
55
+ end
56
+
57
+ protected
58
+
59
+ def self.etc_postfix
60
+ '/etc/postfix'
61
+ end
62
+
63
+
64
+ end
@@ -0,0 +1,41 @@
1
+ class PropertyValueValidator < ActiveModel::Validator
2
+
3
+ def validate(record)
4
+ return true unless record.new_value
5
+ template, rxp = record.template.split('+')
6
+ rxp = template unless rxp
7
+ if validation = Validations[rxp]
8
+ if record.new_value ~! validation
9
+ record.errors[:base] << I18n.t('validation.format')
10
+ return false
11
+ end
12
+ end
13
+ true
14
+ end
15
+
16
+ private
17
+
18
+ Validations = {
19
+ 'on_off' => /\A(on)|(off)\Z/i,
20
+
21
+ 'yes_no' => /\A(yes)|(no)\Z/i,
22
+
23
+ 'mega_size' => /\A\d+[bBkKmMgG]?\Z/i,
24
+
25
+ 'mail_name' => /\A[a-z0-9](\s|[a-z0-9])*\Z/i,
26
+
27
+ 'domain' => /\A[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}\Z/i,
28
+
29
+ 'param_string' => /\A(\w|\d|\s|\$|@|%|_|-|\.|:)*\Z/i,
30
+
31
+ 'string' => /\A[a-zA-Z0-9_-]*\Z/i,
32
+
33
+ 'number' => /\A(\+|-)?\d+\Z/i,
34
+
35
+ 'percent' => /\A\d+%\Z/i,
36
+
37
+ 'select_from_enum' => /\A(\+?\w+;?)*\Z/i
38
+ }
39
+
40
+
41
+ end
@@ -0,0 +1,88 @@
1
+ class SystemManager
2
+
3
+ attr_reader :interpreter
4
+
5
+ SERVICES = ['rmails', 'postfix', 'dovecot', 'nginx', 'dspam', 'amavisd']
6
+
7
+ def self.change_configuration_and_restart
8
+ sm = ServiceManager.new
9
+ sm.write_new_values_for Property::Dovecot
10
+ sm.write_new_values_for Property::Postfix
11
+ sm.write_new_values_for Property::Dspam
12
+ sm.smart_restart_all
13
+ end
14
+
15
+ def self.run(service, goal)
16
+ sm = ServiceManager.new
17
+ sm.send "#{service}_switch", goal
18
+ end
19
+
20
+ def restart_all
21
+ SERVICES[1..-1].each do |s|
22
+ @interpreter.service_manager.restart s
23
+ end
24
+ end
25
+
26
+ def smart_restart_all
27
+ @services_to_restart.each do |klass|
28
+ @interpreter.service_manager.restart SERVICES[klass.service]
29
+ end
30
+ @services_to_restart = []
31
+ end
32
+
33
+ def initialize
34
+ @i = @interpreter = AutomateIt.new
35
+ @services_to_restart = []
36
+ end
37
+
38
+ def write_new_values_for(properties_of_service)
39
+ # find properties to write
40
+ new_values = properties_of_service.all_new_values_for_write
41
+ if new_values.any?
42
+ @services_to_restart << properties_of_service
43
+ else
44
+ return true
45
+ end
46
+ # update database in transaction
47
+ properties_of_service.transaction do
48
+ new_values.each do |property|
49
+ property.value = property.new_value
50
+ property.new_value = nil
51
+ property.save
52
+ end
53
+ end
54
+ # write properties with template
55
+ new_values.group_by(&:template).each do |template, properties|
56
+ locals = {}
57
+ properties.each do |property|
58
+ locals[property.key] = property.value
59
+ end
60
+ properties_of_service.send "#{template}_template", @interpreter, locals
61
+ end
62
+ end
63
+
64
+ def dspam_switch(goal)
65
+ Property::Postfix.dspam_power @interpreter, goal
66
+ action = goal ? 'restart' : 'stop'
67
+ @i.service_manager.send('restart', "postfix") # postfix will only restart
68
+ @i.service_manager.send(action, "dspam")
69
+ end
70
+
71
+
72
+ def amavis_switch(goal)
73
+
74
+ end
75
+
76
+ def dkim_switch(goal)
77
+ Property::Postfix.dkim_power @interpreter, goal
78
+ action = goal ? 'restart' : 'stop'
79
+ @i.service_manager.send('restart', "postfix")
80
+ @i.service_manager.send(action, "opendkim")
81
+ end
82
+
83
+ def postfix_switch(goal)
84
+ action = goal ? 'restart' : 'stop'
85
+ @i.service_manager.send(action, "postfix")
86
+ end
87
+
88
+ end