turnout 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/lib/rack/turnout.rb +91 -0
- data/lib/tasks/maintenance.rake +21 -0
- data/lib/turnout.rb +3 -0
- data/lib/turnout/engine.rb +12 -0
- data/lib/turnout/version.rb +5 -0
- data/public/maintenance.html +69 -0
- metadata +64 -0
data/lib/rack/turnout.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'rack'
|
2
|
+
require 'yaml'
|
3
|
+
require 'ipaddr'
|
4
|
+
require 'nokogiri'
|
5
|
+
|
6
|
+
class Rack::Turnout
|
7
|
+
|
8
|
+
def initialize(app, config={})
|
9
|
+
@app = app
|
10
|
+
@config = config
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
reload_settings
|
15
|
+
|
16
|
+
if on?(env)
|
17
|
+
[ 503, { 'Content-Type' => 'text/html', 'Content-Length' => content_length }, [content] ]
|
18
|
+
else
|
19
|
+
@app.call(env)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def on?(env)
|
26
|
+
request = Rack::Request.new(env)
|
27
|
+
|
28
|
+
return false if ip_allowed?(request.ip)
|
29
|
+
File.exists? settings_file
|
30
|
+
end
|
31
|
+
|
32
|
+
def ip_allowed?(ip)
|
33
|
+
ip = IPAddr.new(ip) unless ip.is_a? IPAddr
|
34
|
+
(settings['allowed_ips'] || []).each do |allowed_ip|
|
35
|
+
return true if IPAddr.new(allowed_ip).include? ip
|
36
|
+
end
|
37
|
+
false
|
38
|
+
end
|
39
|
+
|
40
|
+
def reload_settings
|
41
|
+
@settings = nil
|
42
|
+
settings
|
43
|
+
end
|
44
|
+
|
45
|
+
def settings
|
46
|
+
@settings ||= if File.exists? settings_file
|
47
|
+
YAML::load(File.open(settings_file)) || {}
|
48
|
+
else
|
49
|
+
{}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def app_root
|
54
|
+
@app_root ||= Pathname.new(
|
55
|
+
@config[:app_root] || @app.respond_to?(:root)? @app.root.to_s : '.'
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
def settings_file
|
60
|
+
app_root.join('tmp', 'maintenance.yml')
|
61
|
+
end
|
62
|
+
|
63
|
+
def maintenance_page
|
64
|
+
File.exists?(app_maintenance_page) ? app_maintenance_page : default_maintenance_page
|
65
|
+
end
|
66
|
+
|
67
|
+
def app_maintenance_page
|
68
|
+
@app_maintenance_page ||= app_root.join('public', 'maintenance.html')
|
69
|
+
end
|
70
|
+
|
71
|
+
def default_maintenance_page
|
72
|
+
@default_maintenance_page ||= File.expand_path('../../../public/maintenance.html', __FILE__)
|
73
|
+
end
|
74
|
+
|
75
|
+
def content_length
|
76
|
+
content.size.to_s
|
77
|
+
end
|
78
|
+
|
79
|
+
def content
|
80
|
+
content = File.open(maintenance_page, 'rb').read
|
81
|
+
|
82
|
+
if settings['reason']
|
83
|
+
html = Nokogiri::HTML(content)
|
84
|
+
html.at_css('#reason').inner_html = settings['reason']
|
85
|
+
content = html.to_s
|
86
|
+
end
|
87
|
+
|
88
|
+
content
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
namespace :maintenance do
|
2
|
+
|
3
|
+
desc 'Enable the maintenance mode page ("reason" and/or "allowed_ips" can be passed as environment variables)'
|
4
|
+
task :start do |t, args|
|
5
|
+
settings = { 'reason' => ENV['reason'], 'allowed_ips' => ENV['allowed_ips'].to_s.split(',') }
|
6
|
+
|
7
|
+
file = File.open settings_file, 'w'
|
8
|
+
file.write settings.to_yaml
|
9
|
+
file.close
|
10
|
+
end
|
11
|
+
|
12
|
+
desc 'Disable the maintenance mode page'
|
13
|
+
task :end do
|
14
|
+
File.delete settings_file
|
15
|
+
end
|
16
|
+
|
17
|
+
def settings_file
|
18
|
+
Rails.root.join('tmp', 'maintenance.yml')
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
data/lib/turnout.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Down for Maintenance</title>
|
5
|
+
|
6
|
+
<style type="text/css">
|
7
|
+
|
8
|
+
*{
|
9
|
+
font-family: Arial, Helvetica, sans-serif;
|
10
|
+
}
|
11
|
+
|
12
|
+
body{
|
13
|
+
margin: 0;
|
14
|
+
background-color: #fff;
|
15
|
+
}
|
16
|
+
|
17
|
+
#page{
|
18
|
+
position: relative;
|
19
|
+
width: 550px;
|
20
|
+
margin: 200px auto;
|
21
|
+
padding: 75px 0;
|
22
|
+
text-align: center;
|
23
|
+
background-color: #eaeaea;
|
24
|
+
border: solid 1px #ccc;
|
25
|
+
border-top: solid 10px #666;
|
26
|
+
-moz-box-shadow: inset 0 2px 10px #ccc;
|
27
|
+
-webkit-box-shadow: inset 0 2px 10px #ccc;
|
28
|
+
box-shadow: inset 0 2px 10px #ccc;
|
29
|
+
}
|
30
|
+
|
31
|
+
header, #body{
|
32
|
+
width: 400px;
|
33
|
+
margin: 0 auto;
|
34
|
+
}
|
35
|
+
|
36
|
+
h1{
|
37
|
+
margin: 0;
|
38
|
+
color: #CC3601;
|
39
|
+
font-size: 26pt;
|
40
|
+
border-bottom: solid 4px #666;
|
41
|
+
}
|
42
|
+
|
43
|
+
#reason{
|
44
|
+
margin: 10px 0;
|
45
|
+
color: #333;
|
46
|
+
}
|
47
|
+
|
48
|
+
</style>
|
49
|
+
|
50
|
+
</head>
|
51
|
+
<body>
|
52
|
+
|
53
|
+
<section id="page">
|
54
|
+
|
55
|
+
<header>
|
56
|
+
<h1>Down for Maintenance</h1>
|
57
|
+
</header>
|
58
|
+
|
59
|
+
<section id="body">
|
60
|
+
<div id="reason">
|
61
|
+
<p>The site is temporarily down for maintenance.</p>
|
62
|
+
<p>Please check back soon.</p>
|
63
|
+
</div>
|
64
|
+
</section>
|
65
|
+
|
66
|
+
</section>
|
67
|
+
|
68
|
+
</body>
|
69
|
+
</html>
|
metadata
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: turnout
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Adam Crownoble
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-07-15 00:00:00.000000000 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: nokogiri
|
17
|
+
requirement: &86563140 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '1.3'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *86563140
|
26
|
+
description: Turnout makes it easy to put your Rails application into maintenance
|
27
|
+
mode
|
28
|
+
email: adam.crownoble@biola.edu
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- lib/turnout.rb
|
34
|
+
- lib/rack/turnout.rb
|
35
|
+
- lib/turnout/version.rb
|
36
|
+
- lib/turnout/engine.rb
|
37
|
+
- lib/tasks/maintenance.rake
|
38
|
+
- public/maintenance.html
|
39
|
+
has_rdoc: true
|
40
|
+
homepage: https://github.com/biola/turnout
|
41
|
+
licenses: []
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
requirements: []
|
59
|
+
rubyforge_project:
|
60
|
+
rubygems_version: 1.6.2
|
61
|
+
signing_key:
|
62
|
+
specification_version: 3
|
63
|
+
summary: A Rack based maintenance mode plugin for Rails
|
64
|
+
test_files: []
|