ses-proxy 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/app/public/bootstrap/css/bootstrap-responsive.css +1092 -0
- data/app/public/bootstrap/css/bootstrap-responsive.min.css +9 -0
- data/app/public/bootstrap/css/bootstrap.css +6039 -0
- data/app/public/bootstrap/css/bootstrap.min.css +9 -0
- data/app/public/bootstrap/img/glyphicons-halflings-white.png +0 -0
- data/app/public/bootstrap/img/glyphicons-halflings.png +0 -0
- data/app/public/bootstrap/js/bootstrap.js +2159 -0
- data/app/public/bootstrap/js/bootstrap.min.js +6 -0
- data/app/public/css/application.css +16 -0
- data/app/public/datepicker/css/datepicker.css +7 -0
- data/app/public/datepicker/js/bootstrap-datepicker.js +454 -0
- data/app/public/datepicker/less/datepicker.less +119 -0
- data/app/public/highcharts/adapters/mootools-adapter.js +13 -0
- data/app/public/highcharts/adapters/mootools-adapter.src.js +327 -0
- data/app/public/highcharts/adapters/prototype-adapter.js +16 -0
- data/app/public/highcharts/adapters/prototype-adapter.src.js +385 -0
- data/app/public/highcharts/highcharts-more.js +35 -0
- data/app/public/highcharts/highcharts.js +246 -0
- data/app/public/highcharts/highcharts.src.js +15111 -0
- data/app/public/highcharts/modules/canvas-tools.js +133 -0
- data/app/public/highcharts/modules/canvas-tools.src.js +3113 -0
- data/app/public/highcharts/modules/data.js +11 -0
- data/app/public/highcharts/modules/data.src.js +277 -0
- data/app/public/highcharts/modules/exporting.js +23 -0
- data/app/public/highcharts/modules/exporting.src.js +736 -0
- data/app/public/highcharts/themes/dark-blue.js +263 -0
- data/app/public/highcharts/themes/dark-green.js +263 -0
- data/app/public/highcharts/themes/gray.js +262 -0
- data/app/public/highcharts/themes/grid.js +95 -0
- data/app/public/highcharts/themes/skies.js +89 -0
- data/app/public/images/loader.gif +0 -0
- data/app/public/js/application.js +81 -0
- data/app/views/_chart.haml +2 -0
- data/app/views/_search_form.haml +23 -0
- data/app/views/bounces.haml +23 -0
- data/app/views/kaminari/_first_page.html.erb +3 -0
- data/app/views/kaminari/_gap.html.erb +3 -0
- data/app/views/kaminari/_last_page.html.erb +3 -0
- data/app/views/kaminari/_next_page.html.erb +3 -0
- data/app/views/kaminari/_page.html.erb +3 -0
- data/app/views/kaminari/_paginator.html.erb +17 -0
- data/app/views/kaminari/_prev_page.html.erb +3 -0
- data/app/views/layout.haml +25 -0
- data/app/views/mails.haml +26 -0
- data/app/web_panel.rb +149 -0
- data/bin/ses_proxy +20 -0
- data/lib/ses_proxy/conf.rb +9 -0
- data/lib/ses_proxy/main_command.rb +154 -0
- data/lib/ses_proxy/models/bounce.rb +14 -0
- data/lib/ses_proxy/models/complaint.rb +13 -0
- data/lib/ses_proxy/models/email.rb +15 -0
- data/lib/ses_proxy/smtp_server.rb +122 -0
- data/lib/ses_proxy/sns_endpoint.rb +199 -0
- data/ses_proxy.rb +10 -0
- data/template/mongoid.yml +12 -0
- data/template/ses-proxy.yml +19 -0
- metadata +294 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
%form.form-horizontal(data-ajax-url="#{@chart_url}" data-chart="chartdiv")
|
2
|
+
%fieldset(style="text-align: left")
|
3
|
+
%legend Search:
|
4
|
+
%div(style="display: inline-block;vertical-align: middle;")
|
5
|
+
%label Text
|
6
|
+
%input.span4(type="text" name="q" value="#{@q}" placeholder="Type something…")
|
7
|
+
%div.input-append.date(data-date="#{@s||Time.now.strftime('%d/%m/%Y')}" data-date-format="dd-mm-yyyy")
|
8
|
+
%label From
|
9
|
+
%input.span2(size="16" type="text" name="s" value="#{@s}" placeholder="dd-mm-yyyy")
|
10
|
+
%span.add-on
|
11
|
+
%i.icon-th
|
12
|
+
%div.input-append.date(data-date="#{@e||Time.now.strftime('%d/%m/%Y')}" data-date-format="dd-mm-yyyy")
|
13
|
+
%label To
|
14
|
+
%input.span2(size="16" type="text" name="e" value="#{@e}" placeholder="dd-mm-yyyy")
|
15
|
+
%span.add-on
|
16
|
+
%i.icon-th
|
17
|
+
%div(style="display: inline-block;vertical-align: middle;")
|
18
|
+
%label Per page
|
19
|
+
%select.span2(name="per")
|
20
|
+
-5.times do |i|
|
21
|
+
%option{:value=>(i+1)*10, :selected=>("selected" if @per.to_i.eql?((i+1)*10))}= (i+1)*10
|
22
|
+
%div.form-actions
|
23
|
+
%button.btn(type="submit") Search
|
@@ -0,0 +1,23 @@
|
|
1
|
+
%h1.page-title(style="text-align: center; margin-bottom:20px;") Bounced Addresses
|
2
|
+
= haml :_search_form
|
3
|
+
= haml :_chart
|
4
|
+
%table.table.table-striped(style="table-layout:fixed")
|
5
|
+
%colgoup
|
6
|
+
%col(width="25%")
|
7
|
+
%col(width="15%")
|
8
|
+
%col(width="50%")
|
9
|
+
%col(width="10%")
|
10
|
+
%thead
|
11
|
+
%tr
|
12
|
+
%th Email
|
13
|
+
%th Type
|
14
|
+
%th Description
|
15
|
+
%th Created At
|
16
|
+
%tbody
|
17
|
+
- for bounce in @bounces
|
18
|
+
%tr
|
19
|
+
%td= bounce.email
|
20
|
+
%td= bounce.type
|
21
|
+
%td= bounce.desc
|
22
|
+
%td= bounce.created_at.strftime '%d/%m/%Y'
|
23
|
+
= paginate @bounces
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%= paginator.render do -%>
|
2
|
+
<div class="pagination pagination-centered">
|
3
|
+
<ul>
|
4
|
+
<%= first_page_tag unless current_page.first? %>
|
5
|
+
<%= prev_page_tag unless current_page.first? %>
|
6
|
+
<% each_page do |page| -%>
|
7
|
+
<% if page.left_outer? || page.right_outer? || page.inside_window? -%>
|
8
|
+
<%= page_tag page %>
|
9
|
+
<% elsif !page.was_truncated? -%>
|
10
|
+
<%= gap_tag %>
|
11
|
+
<% end -%>
|
12
|
+
<% end -%>
|
13
|
+
<%= next_page_tag unless current_page.last? %>
|
14
|
+
<%= last_page_tag unless current_page.last? %>
|
15
|
+
</ul>
|
16
|
+
</div>
|
17
|
+
<% end -%>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
!!! 5
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%title SES Proxy WebPanel
|
5
|
+
%link(rel="stylesheet" type="text/css" href="bootstrap/css/bootstrap.min.css" media="screen")
|
6
|
+
%link(rel="stylesheet" type="text/css" href="datepicker/css/datepicker.css" media="screen")
|
7
|
+
%link(rel="stylesheet" type="text/css" href="css/application.css" media="screen")
|
8
|
+
%link(rel="icon" type="image/ico" href="https://awsmedia.s3.amazonaws.com/favicon.ico")
|
9
|
+
%link(rel="shortcut icon" type="image/ico" href="https://awsmedia.s3.amazonaws.com/favicon.ico")
|
10
|
+
%body
|
11
|
+
%div.container-fluid
|
12
|
+
%div.navbar
|
13
|
+
%div.navbar-inner
|
14
|
+
%a.brand(href="#") SES Proxy WebPanel
|
15
|
+
%ul.nav.nav-pills
|
16
|
+
%li{:class => ('active' if @menu_item.eql? "mails")}
|
17
|
+
%a(href="/") Sent Emails
|
18
|
+
%li{:class => ('active' if @menu_item.eql? "bounces")}
|
19
|
+
%a(href="/bounces") Bounced Addresses
|
20
|
+
= yield
|
21
|
+
%script(src="http://code.jquery.com/jquery-latest.js")
|
22
|
+
%script(src="bootstrap/js/bootstrap.min.js")
|
23
|
+
%script(src="datepicker/js/bootstrap-datepicker.js")
|
24
|
+
%script(src="highcharts/highcharts.js")
|
25
|
+
%script(src="js/application.js")
|
@@ -0,0 +1,26 @@
|
|
1
|
+
%h1.page-title(style="text-align: center; margin-bottom:20px;") Sent Emails
|
2
|
+
= haml :_search_form
|
3
|
+
= haml :_chart
|
4
|
+
%table.table.table-striped(style="table-layout:fixed")
|
5
|
+
%colgoup
|
6
|
+
%col(width="15%")
|
7
|
+
%col(width="25%")
|
8
|
+
%col(width="30%")
|
9
|
+
%col(width="20%")
|
10
|
+
%col(width="10%")
|
11
|
+
%thead
|
12
|
+
%tr
|
13
|
+
%th System
|
14
|
+
%th Sender
|
15
|
+
%th Recipients
|
16
|
+
%th Subject
|
17
|
+
%th Created At
|
18
|
+
%tbody
|
19
|
+
- for mail in @mails
|
20
|
+
%tr
|
21
|
+
%td= mail.system
|
22
|
+
%td= mail.sender
|
23
|
+
%td= mail.recipients
|
24
|
+
%td= mail.subject
|
25
|
+
%td= mail.created_at.strftime '%d/%m/%Y'
|
26
|
+
= paginate @mails
|
data/app/web_panel.rb
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
require 'sinatra'
|
2
|
+
require 'haml'
|
3
|
+
require 'kaminari/sinatra'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
helpers do
|
7
|
+
def protected!
|
8
|
+
unless authorized?
|
9
|
+
response['WWW-Authenticate'] = %(Basic realm="Restricted Area")
|
10
|
+
throw(:halt, [401, "Not authorized\n"])
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def authorized?
|
15
|
+
@auth ||= Rack::Auth::Basic::Request.new(request.env)
|
16
|
+
@auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == [SesProxy::Conf.get[:smtp_auth][:user], SesProxy::Conf.get[:smtp_auth][:password]]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
helpers Kaminari::Helpers::SinatraHelpers
|
21
|
+
module Kaminari::Helpers
|
22
|
+
module SinatraHelpers
|
23
|
+
class ActionViewTemplateProxy
|
24
|
+
def render(*args)
|
25
|
+
base = ActionView::Base.new.tap do |a|
|
26
|
+
a.view_paths << File.expand_path('../views', __FILE__)
|
27
|
+
end
|
28
|
+
base.render(*args)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
configure :development do
|
35
|
+
Sinatra::Application.reset!
|
36
|
+
end
|
37
|
+
|
38
|
+
get '/' do
|
39
|
+
protected!
|
40
|
+
@menu_item = "mails"
|
41
|
+
@chart_url = "/mails.json"
|
42
|
+
@per = params[:per] || 20
|
43
|
+
mails = mails_query
|
44
|
+
@mails = mails.page(params[:page]).per(@per)
|
45
|
+
haml :mails
|
46
|
+
end
|
47
|
+
|
48
|
+
get '/mails.json' do
|
49
|
+
protected!
|
50
|
+
mails = mails_query
|
51
|
+
d_array = (string_to_date(@s)..string_to_date(@e)).to_a
|
52
|
+
data = get_data_json "Mails", mails, "created_at", d_array
|
53
|
+
content_type :json
|
54
|
+
data.to_json
|
55
|
+
end
|
56
|
+
|
57
|
+
get '/bounces' do
|
58
|
+
protected!
|
59
|
+
@menu_item = "bounces"
|
60
|
+
@chart_url = "/bounces.json"
|
61
|
+
@per = params[:per] || 20
|
62
|
+
bounces = bounces_query
|
63
|
+
@bounces = bounces.page(params[:page]).per(@per)
|
64
|
+
haml :bounces
|
65
|
+
end
|
66
|
+
|
67
|
+
get '/bounces.json' do
|
68
|
+
protected!
|
69
|
+
bounces = bounces_query
|
70
|
+
d_array = (string_to_date(@s)..string_to_date(@e)).to_a
|
71
|
+
data = get_data_json "Bounced", bounces, "created_at", d_array
|
72
|
+
content_type :json
|
73
|
+
data.to_json
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def get_data_json(name, collection, method, d_array)
|
79
|
+
data = {}
|
80
|
+
grouped_collection = {}
|
81
|
+
if d_array.size <= 30
|
82
|
+
#days
|
83
|
+
key_format = "%d/%m/%Y"
|
84
|
+
elsif d_array.size > 30 and d_array.size <= 210
|
85
|
+
#weeks
|
86
|
+
key_format = "%W/%Y"
|
87
|
+
elsif d_array.size > 210
|
88
|
+
#months
|
89
|
+
key_format = "%B/%Y"
|
90
|
+
end
|
91
|
+
data[:x] = d_array.map{|d| d.to_date.strftime(key_format)}.uniq
|
92
|
+
data[:y] ||= []
|
93
|
+
data[:x].each do |d|
|
94
|
+
grouped_collection[d] = collection.collect{|b| b if b.send(method).strftime(key_format).eql? d}.compact.size
|
95
|
+
end
|
96
|
+
data[:y] << {:name=>name,:data=>grouped_collection.values}
|
97
|
+
data
|
98
|
+
end
|
99
|
+
|
100
|
+
def mails_query
|
101
|
+
@q = params[:q]
|
102
|
+
@s = params[:s]||(Date.today-1.month).strftime("%d-%m-%Y")
|
103
|
+
@e = params[:e]||Date.today.strftime("%d-%m-%Y")
|
104
|
+
if @q.nil? or @q.eql?""
|
105
|
+
if valid_date(@s) and valid_date(@e)
|
106
|
+
mails = SesProxy::Email.where(:created_at=>{'$gte' => string_to_date(@s),'$lt' => string_to_date(@e)})
|
107
|
+
else
|
108
|
+
mails = SesProxy::Email.all
|
109
|
+
end
|
110
|
+
else
|
111
|
+
if valid_date(@s) and valid_date(@e)
|
112
|
+
mails = SesProxy::Email.where(:created_at=>{'$gte' => string_to_date(@s),'$lt' => string_to_date(@e)}).any_of({:recipients => /.*#{@q}.*/i },{:sender => /.*#{@q}.*/i },{:system => /.*#{@q}.*/i },{:subject => /.*#{@q}.*/i })
|
113
|
+
else
|
114
|
+
mails = SesProxy::Email.any_of({:recipients => /.*#{@q}.*/i },{:sender => /.*#{@q}.*/i },{:system => /.*#{@q}.*/i },{:subject => /.*#{@q}.*/i }).page(params[:page]).per(20)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def bounces_query
|
120
|
+
@q = params[:q]
|
121
|
+
@s = params[:s]||(Date.today-1.month).strftime("%d-%m-%Y")
|
122
|
+
@e = params[:e]||Date.today.strftime("%d-%m-%Y")
|
123
|
+
if @q.nil? or @q.eql?""
|
124
|
+
if valid_date(@s) and valid_date(@e)
|
125
|
+
bounces = SesProxy::Bounce.where(:created_at=>{'$gte' => string_to_date(@s),'$lte' => string_to_date(@e)})
|
126
|
+
else
|
127
|
+
bounces = SesProxy::Bounce.all
|
128
|
+
end
|
129
|
+
else
|
130
|
+
if valid_date(@s) and valid_date(@e)
|
131
|
+
bounces = SesProxy::Bounce.where(:created_at=>{'$gte' => string_to_date(@s),'$lte' => string_to_date(@e)}).any_of({:email => /.*#{@q}.*/i },{ :type => /.*#{@q}.*/i },{ :desc => /.*#{@q}.*/i })
|
132
|
+
else
|
133
|
+
bounces = SesProxy::Bounce.any_of({:email => /.*#{@q}.*/i },{ :type => /.*#{@q}.*/i },{ :desc => /.*#{@q}.*/i })
|
134
|
+
end
|
135
|
+
end
|
136
|
+
bounces
|
137
|
+
end
|
138
|
+
|
139
|
+
def valid_date(d)
|
140
|
+
begin
|
141
|
+
d and not d.eql?"" and string_to_date(d)
|
142
|
+
rescue Exception=>e
|
143
|
+
false
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def string_to_date(d)
|
148
|
+
Date.strptime(d, '%d-%m-%Y')
|
149
|
+
end
|
data/bin/ses_proxy
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
require 'rubygems'
|
5
|
+
|
6
|
+
file_path = Pathname.new(__FILE__).realpath
|
7
|
+
|
8
|
+
require File.join(File.dirname(File.dirname(file_path)), 'ses_proxy.rb')
|
9
|
+
libdir = File.join(File.dirname(File.dirname(file_path)), "lib")
|
10
|
+
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
11
|
+
|
12
|
+
begin
|
13
|
+
SesProxy::MainCommand.run
|
14
|
+
rescue Exception => e
|
15
|
+
puts e.message
|
16
|
+
if $DEBUG
|
17
|
+
puts $!
|
18
|
+
puts $@
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'clamp'
|
2
|
+
require 'rack'
|
3
|
+
require 'eventmachine'
|
4
|
+
require 'thread'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'mongoid'
|
7
|
+
require 'daemons'
|
8
|
+
require 'tmpdir'
|
9
|
+
|
10
|
+
require './app/web_panel'
|
11
|
+
|
12
|
+
module SesProxy
|
13
|
+
|
14
|
+
class StartCommand < Clamp::Command
|
15
|
+
option ["-s","--smtp-port"], "SMTP_PORT", "SMTP listen port (default: \"1025\")"
|
16
|
+
def default_smtp_port
|
17
|
+
if SesProxy::Conf.get[:smtp] and SesProxy::Conf.get[:smtp][:port]
|
18
|
+
SesProxy::Conf.get[:smtp][:port]
|
19
|
+
else
|
20
|
+
1025
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
option ["-o","--smtp-host"], "SMTP_HOST", "SMTP host (default: \"0.0.0.0\")"
|
25
|
+
def default_smtp_host
|
26
|
+
if SesProxy::Conf.get[:smtp] and SesProxy::Conf.get[:smtp][:host]
|
27
|
+
SesProxy::Conf.get[:smtp][:host]
|
28
|
+
else
|
29
|
+
"0.0.0.0"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
option ["-p","--http-port"], "HTTP_PORT", "HTTP listen port (default: \"9292\")"
|
34
|
+
def default_http_port
|
35
|
+
if SesProxy::Conf.get[:http] and SesProxy::Conf.get[:http][:port]
|
36
|
+
SesProxy::Conf.get[:http][:port]
|
37
|
+
else
|
38
|
+
9292
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
option ["-l","--http-address"], "HTTP_ADDRESS", "HTTP listen address (default: \"0.0.0.0\")"
|
43
|
+
def default_http_address
|
44
|
+
if SesProxy::Conf.get[:http] and SesProxy::Conf.get[:http][:host]
|
45
|
+
SesProxy::Conf.get[:http][:host]
|
46
|
+
else
|
47
|
+
"0.0.0.0"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
option ["-e","--environment"], "ENVIRONMENT", "Environment", :default => "development"
|
52
|
+
|
53
|
+
option ["-c","--config-file"], "CONFIG_FILE", "Configuration file", :default => "#{File.join(Dir.home,'.ses-proxy','ses-proxy.yml')}"
|
54
|
+
option ["-m","--mongoid-config-file"], "MONGOID_CONFIG_FILE", "Mongoid configuration file", :default => "#{File.join(Dir.home,'.ses-proxy','mongoid.yml')}"
|
55
|
+
|
56
|
+
option ["-d","--demonize"], :flag, "Demonize application", :default => false
|
57
|
+
|
58
|
+
@@env = "development"
|
59
|
+
|
60
|
+
def execute
|
61
|
+
check_for_config_file config_file
|
62
|
+
check_for_mongoid_config_file mongoid_config_file
|
63
|
+
|
64
|
+
@@env = environment
|
65
|
+
Mongoid.load! mongoid_config_file, @@env
|
66
|
+
|
67
|
+
app = Rack::Builder.new do
|
68
|
+
use Rack::Reloader, 0 if @@env.eql?"development"
|
69
|
+
map "/sns_endpoint" do
|
70
|
+
run SesProxy::SnsEndpoint.new
|
71
|
+
end
|
72
|
+
run Sinatra::Application
|
73
|
+
end.to_app
|
74
|
+
options = {:app=>app, :environment=>environment, :server=>"thin", :Port=>http_port, :Host=>http_address}
|
75
|
+
server = Rack::Server.new options
|
76
|
+
|
77
|
+
if demonize?
|
78
|
+
options = {:app_name => "ses_proxy", :dir_mode=>:normal, :dir=>Dir.tmpdir, :multiple=>true}
|
79
|
+
group = Daemons::ApplicationGroup.new('ses_proxy', options)
|
80
|
+
options[:mode] = :proc
|
81
|
+
options[:proc] = Proc.new { EM.run{ SesProxy::SmtpServer.start smtp_host, smtp_port } }
|
82
|
+
pid = Daemons::PidFile.new Dir.tmpdir, "ses_proxy_smtp"
|
83
|
+
@smtp = Daemons::Application.new(group, options, pid)
|
84
|
+
options[:proc] = Proc.new { server.start }
|
85
|
+
pid = Daemons::PidFile.new Dir.tmpdir, "ses_proxy_http"
|
86
|
+
@http = Daemons::Application.new(group, options, pid)
|
87
|
+
@smtp.start
|
88
|
+
@http.start
|
89
|
+
else
|
90
|
+
@smtp = Thread.new do
|
91
|
+
EM.run{ SesProxy::SmtpServer.start smtp_host, smtp_port }
|
92
|
+
end
|
93
|
+
@http = Thread.new do
|
94
|
+
server.start
|
95
|
+
end
|
96
|
+
@smtp.join
|
97
|
+
@http.join
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
def check_for_config_file(path)
|
104
|
+
if path.eql? File.join(Dir.home,'.ses-proxy','ses-proxy.yml').to_s
|
105
|
+
unless File.directory? File.join(Dir.home,'.ses-proxy')
|
106
|
+
Dir.mkdir(File.join(Dir.home,'.ses-proxy'))
|
107
|
+
end
|
108
|
+
unless File.exists? path
|
109
|
+
FileUtils.cp File.join(ROOT,"template","ses-proxy.yml").to_s, path
|
110
|
+
puts "ATTENTION: Edit '#{path}' file with your data and then restart ses_proxy."
|
111
|
+
exit
|
112
|
+
end
|
113
|
+
else
|
114
|
+
unless File.exists? path
|
115
|
+
raise ArgumentError, "Configuration file '#{path}' not found!"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def check_for_mongoid_config_file(path)
|
121
|
+
if path.eql? File.join(Dir.home,'.ses-proxy','mongoid.yml').to_s
|
122
|
+
unless File.directory? File.join(Dir.home,'.ses-proxy')
|
123
|
+
Dir.mkdir(File.join(Dir.home,'.ses-proxy'))
|
124
|
+
end
|
125
|
+
unless File.exists? path
|
126
|
+
FileUtils.cp File.join(ROOT,"template","mongoid.yml").to_s, path
|
127
|
+
puts "ATTENTION: Edit '#{path}' file with your data and then restart ses_proxy."
|
128
|
+
exit
|
129
|
+
end
|
130
|
+
else
|
131
|
+
unless File.exists? path
|
132
|
+
raise ArgumentError, "Configuration file '#{path}' not found!"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
class StopCommand < Clamp::Command
|
139
|
+
def execute
|
140
|
+
options = {:app_name => "ses_proxy", :dir_mode=>:normal, :dir=>Dir.tmpdir, :multiple=>true}
|
141
|
+
group = Daemons::ApplicationGroup.new('ses_proxy', options)
|
142
|
+
group.setup
|
143
|
+
group.applications.each do |application|
|
144
|
+
application.stop
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
class MainCommand < Clamp::Command
|
150
|
+
subcommand "start", "Start proxy", StartCommand
|
151
|
+
subcommand "stop", "Stop proxy", StopCommand
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|