vae 0.6.10 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/vae +32 -2
- data/lib/full_stack.rb +122 -0
- data/lib/logging.rb +3 -3
- data/lib/proxy_server.rb +31 -0
- data/lib/servlet.rb +2 -2
- data/lib/site.rb +17 -16
- data/lib/{vae.rb → vae_local.rb} +41 -91
- data/lib/vae_site_servlet.rb +47 -30
- data/lib/version.rb +1 -1
- metadata +76 -33
- data/lib/vae_local_servlet.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: acfbc6120a34efdcc155c6893b47538f47bb2da5
|
4
|
+
data.tar.gz: d9ef76554fcab3d7ace9348ab543e701e0708d3b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6fa33a2e3bedd4b78cf56cbaedc4e385a8b8230074fb62673718ecf1fc1dcd8f7060bea026c45756b80147593c2f0403d1d04a8f350b9e7caa2b34eb656c2b04
|
7
|
+
data.tar.gz: 84ce9c1c794f5fc18c4228270e25aa9f0861a915dae6ad85bb4cb8ef5483f62aa17484bb9fbc0270377c5c79d47b662d2bd3b6e229d5a8483e15f4a518109907
|
data/bin/vae
CHANGED
@@ -3,6 +3,36 @@
|
|
3
3
|
THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
|
4
4
|
$:.unshift File.dirname(THIS_FILE) + '/../lib'
|
5
5
|
|
6
|
-
require '
|
6
|
+
require 'version'
|
7
7
|
|
8
|
-
|
8
|
+
require 'rubygems'
|
9
|
+
|
10
|
+
require 'cgi'
|
11
|
+
require 'digest/md5'
|
12
|
+
require 'fileutils'
|
13
|
+
require 'json'
|
14
|
+
require 'mongrel'
|
15
|
+
require 'net/http'
|
16
|
+
require 'net/https'
|
17
|
+
require 'optparse'
|
18
|
+
require 'ptools'
|
19
|
+
require 'shellwords'
|
20
|
+
require 'thread'
|
21
|
+
require 'webrick'
|
22
|
+
require 'yaml'
|
23
|
+
|
24
|
+
require 'directory_watcher'
|
25
|
+
require 'highline/import'
|
26
|
+
require 'compass'
|
27
|
+
require 'haml'
|
28
|
+
|
29
|
+
require 'full_stack'
|
30
|
+
require 'logging'
|
31
|
+
require 'proxy_server'
|
32
|
+
require 'servlet'
|
33
|
+
require 'site'
|
34
|
+
require 'vae_error'
|
35
|
+
require 'vae_site_servlet'
|
36
|
+
require 'vae_local'
|
37
|
+
|
38
|
+
VaeLocal.run_trapping_exceptions
|
data/lib/full_stack.rb
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
class FullStack
|
2
|
+
attr_reader :options
|
3
|
+
|
4
|
+
def initialize(site, options)
|
5
|
+
@site = site
|
6
|
+
@options = options
|
7
|
+
@stop = false
|
8
|
+
@pids = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def authenticate
|
12
|
+
req = Net::HTTP::Post.new("/api/local/v1/authorize")
|
13
|
+
req.body = "username=#{CGI.escape(@site.username)}&password=#{CGI.escape(@site.password)}"
|
14
|
+
res = VaeLocal.fetch_from_vaeplatform(@site.subdomain, req)
|
15
|
+
data = JSON.parse(res.body)
|
16
|
+
if data['valid'] == "valid"
|
17
|
+
FileUtils.mkdir_p(@site.data_path)
|
18
|
+
if !File.exists?(@site.data_path + "/assets/")
|
19
|
+
FileUtils.ln_s("#{vae_remote_path}/public", @site.data_path + "/assets")
|
20
|
+
end
|
21
|
+
@site.secret_key = data['secret_key']
|
22
|
+
generation = File.exists?("#{@site.data_path}feed_generation") ? File.open("#{@site.data_path}feed_generation").read.to_i : 0
|
23
|
+
if data['feed_url'] and data['feed_generation'].to_i > generation
|
24
|
+
puts "Downloading updated Site Data Feed..."
|
25
|
+
if curl = File.which("curl")
|
26
|
+
`curl -o #{Shellwords.shellescape(@site.data_path)}feed.xml #{Shellwords.shellescape(data['feed_url'])}`
|
27
|
+
else
|
28
|
+
download_feed(data['feed_url'])
|
29
|
+
end
|
30
|
+
File.open("#{@site.data_path}feed_generation",'w') { |f| f.write(data['feed_generation']) }
|
31
|
+
end
|
32
|
+
File.open("#{@site.data_path}settings.php",'w') { |f| f.write(data['settings']) }
|
33
|
+
else
|
34
|
+
raise VaeError, "Error Connecting to Vae with the supplied Username and Password. Please make sure this user has Vae Local permissions assigned."
|
35
|
+
end
|
36
|
+
rescue JSON::ParserError
|
37
|
+
raise VaeError, "An unknown error occurred signing into Vae Platform. Please email support for help."
|
38
|
+
end
|
39
|
+
|
40
|
+
def download_feed(url)
|
41
|
+
url_base = url.split('/')[2]
|
42
|
+
url_path = '/'+url.split('/')[3..-1].join('/')
|
43
|
+
Net::HTTP.start(url_base) { |http|
|
44
|
+
File.open("#{@site.data_path}feed.xml", 'w') { |f|
|
45
|
+
http.get(URI.escape(url_path)) { |str|
|
46
|
+
f.write str
|
47
|
+
}
|
48
|
+
}
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def run
|
53
|
+
authenticate
|
54
|
+
launch_daemons
|
55
|
+
trap("INT") { @stop = true }
|
56
|
+
loop { break if @stop; sleep 0.5 }
|
57
|
+
puts "Quit signal received, cleaning up ..."
|
58
|
+
@pids.map { |pid| Process.kill("TERM", pid) }
|
59
|
+
end
|
60
|
+
|
61
|
+
def launch_daemons
|
62
|
+
if VaeLocal.port_open?(9090)
|
63
|
+
@pids << fork {
|
64
|
+
Dir.chdir("#{vae_thrift_path}/rb/")
|
65
|
+
STDOUT.reopen("/dev/null", "w")
|
66
|
+
STDERR.reopen("/dev/null", "w")
|
67
|
+
exec "bundle exec ./vaerubyd.rb"
|
68
|
+
}
|
69
|
+
end
|
70
|
+
port = 9091
|
71
|
+
serve_root = @site.root
|
72
|
+
loop {
|
73
|
+
break if VaeLocal.port_open?(port)
|
74
|
+
port = port + 1
|
75
|
+
}
|
76
|
+
if File.exists?(@site.root + "/.jekyll")
|
77
|
+
serve_root = @site.root + "/_site/"
|
78
|
+
FileUtils.mkdir_p(serve_root)
|
79
|
+
@pids << fork {
|
80
|
+
exec "bundle exec jekyll build --watch --source #{Shellwords.shellescape(@site.root)} --destination #{Shellwords.shellescape(serve_root)}"
|
81
|
+
}
|
82
|
+
end
|
83
|
+
@pids << fork {
|
84
|
+
Dir.chdir("#{vae_thrift_path}/cpp/")
|
85
|
+
ENV['VAE_LOCAL_VAEDB_PORT'] = port.to_s
|
86
|
+
exec "./vaedb --port #{port} --busaddress 'tcp://*:#{port-4000}' --test --log_level #{options[:log_level]}"
|
87
|
+
}
|
88
|
+
@pids << fork {
|
89
|
+
Dir.chdir(serve_root)
|
90
|
+
ENV['VAE_LOCAL_BACKSTAGE'] = @site.subdomain + ".vaeplatform." + (ENV['VAEPLATFORM_LOCAL'] ? "dev" : "com")
|
91
|
+
ENV['VAE_LOCAL_SECRET_KEY'] = @site.secret_key
|
92
|
+
ENV['VAE_LOCAL_DATA_PATH'] = @site.data_path
|
93
|
+
exec "php -c #{vae_remote_path}/tests/dependencies/php.ini -S 0.0.0.0:#{options[:port]} #{vae_remote_path}/lib/index.php"
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
def vae_remote_path
|
98
|
+
return @vae_remote_path if @vae_remote_path
|
99
|
+
thisdir = File.dirname(__FILE__)
|
100
|
+
[ "#{thisdir}/../../vae_remote", "#{thisdir}/../../../vae_remote", "/usr/local/vae_remote", "/usr/local/opt/vae-thrift", "/usr/local/Cellar/vae_thrift/1.0.0", "~/vae_remote" ].each { |path|
|
101
|
+
if File.exists?(path)
|
102
|
+
return @vae_remote_path = path
|
103
|
+
end
|
104
|
+
}
|
105
|
+
raise VaeError, "Could not find Vae Remote on your system.#{brew_message}"
|
106
|
+
end
|
107
|
+
|
108
|
+
def vae_thrift_path
|
109
|
+
return @vae_thrift_path if @vae_thrift_path
|
110
|
+
thisdir = File.dirname(__FILE__)
|
111
|
+
[ "#{thisdir}/../../vae_thrift", "#{thisdir}/../../../vae_thrift", "/usr/local/vae_thrift", "/usr/local/opt/vae-thrift", "/usr/local/Cellar/vae_thrift/1.0.0", "~/vae_thrift", "#{vae_remote_path}/tests/dependencies/vae_thrift" ].each { |path|
|
112
|
+
if File.exists?(path)
|
113
|
+
return @vae_remote_path = path
|
114
|
+
end
|
115
|
+
}
|
116
|
+
raise VaeError, "Could not find Vae Thrift on your system.#{brew_message}"
|
117
|
+
end
|
118
|
+
|
119
|
+
def brew_message
|
120
|
+
"\n\nTo install Vae Local Full Stack dependencies on macOS via Homebrew, run the following commands:\n brew tap actionverb/tap\n brew install vae-remote vae-thrift vaeql\n\nMake sure you resolve any errors from Homebrew before proceeding."
|
121
|
+
end
|
122
|
+
end
|
data/lib/logging.rb
CHANGED
data/lib/proxy_server.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
class ProxyServer
|
2
|
+
def initialize(site, options)
|
3
|
+
$site = site
|
4
|
+
@options = options
|
5
|
+
|
6
|
+
set_mime_types
|
7
|
+
end
|
8
|
+
|
9
|
+
def run
|
10
|
+
server = Mongrel::Configurator.new host: "0.0.0.0", port: @options[:port] do
|
11
|
+
listener do
|
12
|
+
uri "/", handler: VaeSiteServlet.new($site)
|
13
|
+
end
|
14
|
+
trap("INT") { raise Mongrel::StopServer }
|
15
|
+
run
|
16
|
+
end
|
17
|
+
|
18
|
+
puts "Vae is in action at http://localhost:#{@options[:port]}/"
|
19
|
+
puts " (hit Control+C to exit)"
|
20
|
+
|
21
|
+
begin
|
22
|
+
server.join
|
23
|
+
rescue Mongrel::StopServer
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def set_mime_types
|
28
|
+
WEBrick::HTTPUtils::DefaultMimeTypes.store 'js', 'application/javascript'
|
29
|
+
WEBrick::HTTPUtils::DefaultMimeTypes.store 'svg', 'image/svg+xml'
|
30
|
+
end
|
31
|
+
end
|
data/lib/servlet.rb
CHANGED
data/lib/site.rb
CHANGED
@@ -1,27 +1,29 @@
|
|
1
1
|
class Site
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
http = Net::HTTP.new("#{subdomain}.vaesite.com")
|
6
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
7
|
-
http.start { |http|
|
8
|
-
http.read_timeout = 120
|
9
|
-
http.request(req)
|
10
|
-
}
|
11
|
-
end
|
12
|
-
|
2
|
+
attr_reader :password, :root, :session_id, :subdomain, :username, :data_path
|
3
|
+
attr_accessor :secret_key
|
4
|
+
|
13
5
|
def initialize(options)
|
14
6
|
@root = options[:root] if options[:root]
|
15
7
|
@subdomain = options[:subdomain] if options[:subdomain]
|
16
8
|
@username = options[:username] if options[:username]
|
17
9
|
@password = options[:password] if options[:password]
|
18
10
|
@session_id = Digest::MD5.hexdigest(rand.to_s)
|
11
|
+
@data_path = options[:data_path] || "#{@root}/.vae/data/"
|
19
12
|
login_to_server
|
20
13
|
end
|
21
|
-
|
14
|
+
|
15
|
+
def fetch_from_server(req)
|
16
|
+
http = Net::HTTP.new("#{subdomain}.vaesite.com")
|
17
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
18
|
+
http.start { |http|
|
19
|
+
http.read_timeout = 120
|
20
|
+
http.request(req)
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
22
24
|
def login_to_server
|
23
|
-
req = Net::HTTP::Post.new("
|
24
|
-
req.body = "__local_username=#{CGI.escape(username)}&__local_password=#{CGI.escape(password)}&__local_version=#{VER}"
|
25
|
+
req = Net::HTTP::Post.new("/")
|
26
|
+
req.body = "__vae_local=#{session_id}&__local_username=#{CGI.escape(username)}&__local_password=#{CGI.escape(password)}&__local_version=#{VER}"
|
25
27
|
res = fetch_from_server(req)
|
26
28
|
if res.body == "BAD"
|
27
29
|
raise VaeError, "Invalid password or insufficient permissions."
|
@@ -31,5 +33,4 @@ class Site
|
|
31
33
|
raise VaeError, "Could not connect to Vae servers. Please check your Internet connection."
|
32
34
|
end
|
33
35
|
end
|
34
|
-
|
35
|
-
end
|
36
|
+
end
|
data/lib/{vae.rb → vae_local.rb}
RENAMED
@@ -1,45 +1,21 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
|
3
|
-
require 'cgi'
|
4
|
-
require 'digest/md5'
|
5
|
-
require 'json'
|
6
|
-
require 'mongrel'
|
7
|
-
require 'net/http'
|
8
|
-
require 'net/https'
|
9
|
-
require 'optparse'
|
10
|
-
require 'thread'
|
11
|
-
require 'webrick'
|
12
|
-
require 'yaml'
|
13
|
-
|
14
|
-
require 'directory_watcher'
|
15
|
-
require 'highline/import'
|
16
|
-
require 'compass'
|
17
|
-
require 'haml'
|
18
|
-
|
19
|
-
require 'logging'
|
20
|
-
require 'servlet'
|
21
|
-
require 'site'
|
22
|
-
require 'vae_error'
|
23
|
-
require 'vae_site_servlet'
|
24
|
-
require 'vae_local_servlet'
|
25
|
-
require 'version'
|
26
|
-
|
27
|
-
SERVER_PARSED = [ ".html", ".haml", ".php", ".xml", ".rss", ".pdf.haml", ".pdf.haml.php", ".haml.php" ]
|
28
|
-
SERVER_PARSED_GLOB = [ "**/*.html", "**/*.haml", "**/*.php", "**/*.xml", "**/*.rss", "**/*.pdf.haml", "**/*.pdf.haml.php", "**/*.haml.php" ]
|
29
|
-
BANNER = "Vae local preview server, version #{VER}"
|
30
|
-
|
31
1
|
class VaeLocal
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
2
|
+
BANNER = "Vae local preview server, version #{VER}"
|
3
|
+
|
4
|
+
def self.fetch_from_vaeplatform(site, req)
|
5
|
+
local = ENV['VAEPLATFORM_LOCAL']
|
6
|
+
http = Net::HTTP.new("#{site}." + (local ? "vaeplatform.dev" : "vaeplatform.com"), (local ? 80 : 443))
|
7
|
+
http.use_ssl = true unless local
|
36
8
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
37
9
|
http.start { |http|
|
38
10
|
http.read_timeout = 120
|
39
11
|
http.request(req)
|
40
12
|
}
|
41
13
|
end
|
42
|
-
|
14
|
+
|
15
|
+
def self.port_open?(port)
|
16
|
+
!system("lsof -i:#{port}", out: '/dev/null')
|
17
|
+
end
|
18
|
+
|
43
19
|
def get_svn_credentials(site)
|
44
20
|
home = Dir.chdir { Dir.pwd }
|
45
21
|
Dir.glob("#{home}/.subversion/auth/svn.simple/*").each do |file|
|
@@ -50,7 +26,7 @@ class VaeLocal
|
|
50
26
|
end
|
51
27
|
{}
|
52
28
|
end
|
53
|
-
|
29
|
+
|
54
30
|
def parse_svn_auth_file(file)
|
55
31
|
key = nil
|
56
32
|
mode = nil
|
@@ -73,18 +49,27 @@ class VaeLocal
|
|
73
49
|
end
|
74
50
|
params
|
75
51
|
end
|
76
|
-
|
77
|
-
def run
|
78
|
-
options = { :
|
52
|
+
|
53
|
+
def run
|
54
|
+
options = { port: 9999, server: ProxyServer, log_level: "warning" }
|
55
|
+
loop {
|
56
|
+
break if VaeLocal.port_open?(options[:port])
|
57
|
+
options[:port] = options[:port] - 1
|
58
|
+
}
|
59
|
+
|
79
60
|
ARGV.options do |opts|
|
80
|
-
opts.banner = BANNER + "\n\nUsage: vae [options]\n starts a local development server\n vae [options] deploy\n promotes the source in Subversion repository to the FTP\n\n If you are using the Vae Production environment features:\n vae [options] stage\n promotes the source in Subversion repository to the staging environment\n vae [options] stagerelease\n promotes the source in Subversion repository to the staging environment\n and releases it to the production environment\n vae [options] release\n releases the current staging environment to the production environment\n vae [options] rollback\n rolls back the production environment to a previous release\n\nAvailable Options:"
|
81
|
-
opts.on("-u","--username <username>","Your Vae username") { |o| options[:username] = o }
|
82
|
-
opts.on("-p","--port <port number>","Start server on this port") { |o| options[:port] = o }
|
83
|
-
opts.on("-r","--root <path to site root>","Path to the root of the local copy of your Vae site.") { |o| options[:site_root] = o }
|
84
|
-
opts.on("-s","--site <subdomain>","Vae subdomain for this site") { |o| options[:site] = o }
|
61
|
+
opts.banner = BANNER + "\n\nUsage: vae [options]\n starts a local development server\n vae [options] deploy\n promotes the source in Git/Subversion repository to the FTP\n\n If you are using the Vae Production environment features:\n vae [options] stage\n promotes the source in Git/Subversion repository to the staging environment\n vae [options] stagerelease\n promotes the source in Git/Subversion repository to the staging environment\n and releases it to the production environment\n vae [options] release\n releases the current staging environment to the production environment\n vae [options] rollback\n rolls back the production environment to a previous release\n\nAvailable Options:"
|
62
|
+
opts.on("-u","--username <username>","Your Vae username") { |o| options[:username] = o }
|
63
|
+
opts.on("-p","--port <port number>","Start server on this port") { |o| options[:port] = o.to_i; raise VaeError "Port #{o.to_i} is already in use." unless VaeLocal.port_open?(o.to_i) }
|
64
|
+
opts.on("-r","--root <path to site root>","Path to the root of the local copy of your Vae site.") { |o| options[:site_root] = o }
|
65
|
+
opts.on("-s","--site <subdomain>","Vae subdomain for this site") { |o| options[:site] = o }
|
66
|
+
opts.on("-f","--full-stack","Run in Full Stack Mode (experimental)") { options[:server] = FullStack }
|
67
|
+
opts.on("-d","--data-path <path>","Where to Store Content and Image Data When In Full Stack Mode") { |o| options[:data_path] = o }
|
68
|
+
opts.on("-l","--log-level <level>","Vaedb Log Level (for Full Stack Mode)") { |o| options[:log_level] = o }
|
85
69
|
opts.on_tail("-h","--help", "Show this help message") { puts opts; exit }
|
86
70
|
opts.parse!
|
87
71
|
end
|
72
|
+
|
88
73
|
options[:site_root] = Dir.pwd if options[:site_root].nil? and (File.exists?("#{Dir.pwd}/__vae.yml") or File.exists?("#{Dir.pwd}/__verb.yml"))
|
89
74
|
if options[:site_root]
|
90
75
|
[ "verb", "vae" ].each do |name|
|
@@ -95,7 +80,9 @@ class VaeLocal
|
|
95
80
|
end
|
96
81
|
end
|
97
82
|
end
|
83
|
+
|
98
84
|
raise VaeError, "We could not determine the Vae subdomain for this site. Please specify it manually by using the --site option or create a __vae.yml file within the site root." if options[:site].nil?
|
85
|
+
|
99
86
|
unless options[:username]
|
100
87
|
svn_credentials = get_svn_credentials(options[:site])
|
101
88
|
options[:username] = svn_credentials["username"]
|
@@ -103,53 +90,23 @@ class VaeLocal
|
|
103
90
|
end
|
104
91
|
raise VaeError, "We could not determine the Vae username that you use. Please specify it manually by using the --username option." if options[:username].nil?
|
105
92
|
if options[:password].nil?
|
106
|
-
options[:password] = ask("Please enter the Vae password for username #{options[:username]}:") {|q| q.echo = false}
|
93
|
+
options[:password] = ask("Please enter the Vae password for username #{options[:username]}:") { |q| q.echo = false }
|
107
94
|
end
|
95
|
+
|
108
96
|
if [ "deploy", "release", "rollback", "stage", "stagerelease" ].include?(ARGV.last)
|
109
97
|
stagerelease(ARGV.last, options[:site], options[:username], options[:password])
|
110
98
|
exit
|
111
99
|
end
|
112
100
|
|
113
|
-
# Move mongrel dependency here so not as required on Windows
|
114
|
-
|
115
101
|
raise VaeError, "You did not specify the path to the root of the local copy of your Vae site. Please specify it manually by using the --root option or cd to the site root (and make sure it contains a __vae.yml file)." unless options[:site_root]
|
116
102
|
raise VaeError, "You specified an invalid path to the local copy of your Vae site." unless File.exists?(options[:site_root])
|
117
103
|
|
118
|
-
$biglock = Mutex.new
|
119
|
-
dw = DirectoryWatcher.new options[:site_root], :interval => 1.0, :glob => SERVER_PARSED_GLOB, :pre_load => true, :logger => DirectoryWatcher::NullLogger.new
|
120
|
-
dw.add_observer { |*args|
|
121
|
-
args.each { |event|
|
122
|
-
path = event.path.gsub($site.root, "")
|
123
|
-
$biglock.synchronize {
|
124
|
-
$changed[path] = event.type
|
125
|
-
}
|
126
|
-
}
|
127
|
-
}
|
128
|
-
dw.start
|
129
|
-
|
130
|
-
set_mime_types
|
131
|
-
|
132
104
|
Dir.chdir File.dirname(__FILE__)
|
133
105
|
puts BANNER
|
134
|
-
puts "Vae is in action at http://localhost:#{options[:port]}/"
|
135
|
-
puts " (hit Control+C to exit)"
|
136
|
-
$site = Site.new(:subdomain => options[:site], :root => options[:site_root], :username => options[:username], :password => options[:password])
|
137
|
-
$cache = {}
|
138
|
-
$changed = {}
|
139
|
-
$server = Mongrel::Configurator.new :host => "0.0.0.0", :port => options[:port] do
|
140
|
-
listener do
|
141
|
-
uri "/", :handler => VaeSiteServlet.new
|
142
|
-
#uri "/__welcome/", :handler => VaeLocalServlet.new
|
143
|
-
end
|
144
|
-
trap("INT") { raise Mongrel::StopServer }
|
145
|
-
run
|
146
|
-
end
|
147
106
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
puts "Thanks for using Vae!"
|
152
|
-
end
|
107
|
+
site = Site.new(subdomain: options[:site], root: options[:site_root], username: options[:username], password: options[:password])
|
108
|
+
options[:server].new(site, options).run
|
109
|
+
puts "Thanks for using Vae!"
|
153
110
|
end
|
154
111
|
|
155
112
|
def show_job_status(res, site)
|
@@ -161,7 +118,7 @@ class VaeLocal
|
|
161
118
|
loop do
|
162
119
|
sleep 5
|
163
120
|
req = Net::HTTP::Get.new("/api/local/v1/job_status/#{data['job']}")
|
164
|
-
res = fetch_from_vaeplatform(site, req)
|
121
|
+
res = VaeLocal.fetch_from_vaeplatform(site, req)
|
165
122
|
status = JSON.parse(res.body)
|
166
123
|
if status['status'] == "completed"
|
167
124
|
puts data['success']
|
@@ -175,11 +132,6 @@ class VaeLocal
|
|
175
132
|
raise VaeError, "An unknown error occurred requesting this operation from Vae Platform. Please email support for help."
|
176
133
|
end
|
177
134
|
|
178
|
-
def set_mime_types
|
179
|
-
WEBrick::HTTPUtils::DefaultMimeTypes.store 'js', 'application/javascript'
|
180
|
-
WEBrick::HTTPUtils::DefaultMimeTypes.store 'svg', 'image/svg+xml'
|
181
|
-
end
|
182
|
-
|
183
135
|
def stagerelease(action, site, username, password)
|
184
136
|
if action == "deploy"
|
185
137
|
action = "stage"
|
@@ -190,18 +142,17 @@ class VaeLocal
|
|
190
142
|
end
|
191
143
|
req = Net::HTTP::Post.new("/api/local/v1/#{action}")
|
192
144
|
req.body = "username=#{CGI.escape(username)}&password=#{CGI.escape(password)}&vae_local=1"
|
193
|
-
res = fetch_from_vaeplatform(site, req)
|
145
|
+
res = VaeLocal.fetch_from_vaeplatform(site, req)
|
194
146
|
if res.is_a?(Net::HTTPFound)
|
195
147
|
raise VaeError, "Invalid username/password or insufficient permissions."
|
196
148
|
else
|
197
149
|
show_job_status(res, site)
|
198
150
|
end
|
199
151
|
end
|
200
|
-
|
201
|
-
def self.run_trapping_exceptions
|
152
|
+
|
153
|
+
def self.run_trapping_exceptions
|
202
154
|
begin
|
203
|
-
|
204
|
-
v.run!
|
155
|
+
new.run
|
205
156
|
rescue VaeError => e
|
206
157
|
cmd = $0
|
207
158
|
cmd = "vae" if cmd =~ /\.\.\/vae_local/
|
@@ -210,5 +161,4 @@ class VaeLocal
|
|
210
161
|
puts "Type #{cmd} --help for help."
|
211
162
|
end
|
212
163
|
end
|
213
|
-
|
214
164
|
end
|
data/lib/vae_site_servlet.rb
CHANGED
@@ -1,24 +1,43 @@
|
|
1
|
-
class VaeSiteServlet < Servlet
|
2
|
-
|
1
|
+
class VaeSiteServlet < Servlet
|
2
|
+
SERVER_PARSED = [ ".html", ".haml", ".php", ".xml", ".rss", ".pdf.haml", ".pdf.haml.php", ".haml.php" ]
|
3
|
+
|
4
|
+
def initialize(site)
|
5
|
+
@cache = {}
|
6
|
+
@changed = {}
|
7
|
+
@lock = Mutex.new
|
8
|
+
@site = site
|
9
|
+
|
10
|
+
dw = DirectoryWatcher.new @site.root, interval: 1.0, glob: SERVER_PARSED.map { |ext| "**/*#{ext}" }, pre_load: true, logger: DirectoryWatcher::NullLogger.new
|
11
|
+
dw.add_observer { |*args|
|
12
|
+
args.each { |event|
|
13
|
+
path = event.path.gsub(@site.root, "")
|
14
|
+
@lock.synchronize {
|
15
|
+
@changed[path] = event.type
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
19
|
+
dw.start
|
20
|
+
end
|
21
|
+
|
3
22
|
def bundle_changed_source_files(source_files)
|
4
23
|
source_files ||= []
|
5
24
|
changed = nil
|
6
|
-
|
7
|
-
changed =
|
8
|
-
|
25
|
+
@lock.synchronize {
|
26
|
+
changed = @changed
|
27
|
+
@changed = {}
|
9
28
|
}
|
10
29
|
source_files.concat(changed.map { |filename,action|
|
11
30
|
get_source_file(filename, (action == :deleted))
|
12
31
|
}).reject { |src| src.nil? }
|
13
32
|
end
|
14
|
-
|
33
|
+
|
15
34
|
def get_source_file(path, optional = false)
|
16
35
|
full_path = nil
|
17
|
-
if File.exists?(
|
36
|
+
if File.exists?(@site.root + path)
|
18
37
|
full_path = path
|
19
38
|
else
|
20
39
|
SERVER_PARSED.each do |ext|
|
21
|
-
if full_path.nil? and File.exists?(
|
40
|
+
if full_path.nil? and File.exists?(@site.root + path + ext)
|
22
41
|
full_path = path + ext
|
23
42
|
end
|
24
43
|
end
|
@@ -27,7 +46,7 @@ class VaeSiteServlet < Servlet
|
|
27
46
|
raise FileNotFound
|
28
47
|
elsif full_path
|
29
48
|
begin
|
30
|
-
file = File.read(
|
49
|
+
file = File.read(@site.root + full_path)
|
31
50
|
md5 = Digest::MD5.hexdigest(file)
|
32
51
|
rescue Errno::EISDIR
|
33
52
|
return nil
|
@@ -37,16 +56,16 @@ class VaeSiteServlet < Servlet
|
|
37
56
|
md5 = ""
|
38
57
|
file = ""
|
39
58
|
end
|
40
|
-
if
|
41
|
-
|
59
|
+
if @cache[full_path] != md5
|
60
|
+
@cache[full_path] = md5
|
42
61
|
[ full_path, file ]
|
43
62
|
else
|
44
63
|
nil
|
45
64
|
end
|
46
65
|
end
|
47
|
-
|
66
|
+
|
48
67
|
def fetch_from_vae(wb_req, method, source_files = nil)
|
49
|
-
uri = wb_req.params["REQUEST_URI"] + ((wb_req.params["REQUEST_URI"] =~ /\?/) ? "&" : "?") + "__vae_local=#{
|
68
|
+
uri = wb_req.params["REQUEST_URI"] + ((wb_req.params["REQUEST_URI"] =~ /\?/) ? "&" : "?") + "__vae_local=#{@site.session_id}"
|
50
69
|
source_files = bundle_changed_source_files(source_files)
|
51
70
|
if method == "GET"
|
52
71
|
if source_files.is_a?(Array) and source_files.size > 0
|
@@ -68,31 +87,31 @@ class VaeSiteServlet < Servlet
|
|
68
87
|
if wb_req.params['HTTP_X_REQUESTED_WITH']
|
69
88
|
req['X-Requested-With'] = req_404['X-Requested-With'] = wb_req.params['HTTP_X_REQUESTED_WITH']
|
70
89
|
end
|
71
|
-
res =
|
90
|
+
res = @site.fetch_from_server(req)
|
72
91
|
if res.body =~ /__vae_local_needs=(.*)/
|
73
92
|
begin
|
74
93
|
return fetch_from_vae(wb_req, method, [ get_source_file($1) ])
|
75
94
|
rescue FileNotFound
|
76
95
|
puts "* Could not find requested file: #{$1}"
|
77
|
-
return
|
96
|
+
return @site.fetch_from_server(req_404)
|
78
97
|
end
|
79
98
|
end
|
80
99
|
res
|
81
100
|
end
|
82
|
-
|
101
|
+
|
83
102
|
def fetch_from_vae_and_include_source_of_current_page(req, method)
|
84
103
|
fetch_from_vae(req, method, [ find_source_file_from_path(req.params["REQUEST_URI"]), get_source_file("/__vae.php", true), get_source_file("/__verb.php", true) ])
|
85
104
|
end
|
86
|
-
|
105
|
+
|
87
106
|
def find_source_file_from_path(path)
|
88
107
|
path_parts = path.split("/").reject { |part| part.length < 1 }
|
89
108
|
local_path = ""
|
90
|
-
loop do
|
109
|
+
loop do
|
91
110
|
gotit = false
|
92
111
|
if part = path_parts.shift
|
93
112
|
new_local_path = local_path + "/" + part
|
94
113
|
(SERVER_PARSED + [ "" ]).each do |ext|
|
95
|
-
if File.exists?(
|
114
|
+
if File.exists?(@site.root + new_local_path + ext)
|
96
115
|
gotit = true
|
97
116
|
local_path = new_local_path + ext
|
98
117
|
end
|
@@ -103,22 +122,22 @@ class VaeSiteServlet < Servlet
|
|
103
122
|
return nil unless local_path.length > 0
|
104
123
|
get_source_file(local_path)
|
105
124
|
end
|
106
|
-
|
125
|
+
|
107
126
|
def get_line_from_sass_exception(exception)
|
108
127
|
return exception.message.scan(/:(\d+)/).first.first if exception.is_a?(::SyntaxError)
|
109
128
|
exception.backtrace[0].scan(/:(\d+)/).first.first
|
110
|
-
end
|
129
|
+
end
|
111
130
|
|
112
131
|
def not_modified?(req, res, mtime, etag)
|
113
132
|
return true if (ims = req.params['IF_MODIFIED_SINCE']) && Time.parse(ims) >= mtime
|
114
133
|
return true if (inm = req.params['IF_NONE_MATCH']) && WEBrick::HTTPUtils::split_header_value(inm).member?(etag)
|
115
134
|
false
|
116
135
|
end
|
117
|
-
|
136
|
+
|
118
137
|
def render_sass(local_path)
|
119
138
|
begin
|
120
139
|
options = Compass.sass_engine_options
|
121
|
-
options[:load_paths] << File.dirname(local_path)
|
140
|
+
options[:load_paths] << File.dirname(local_path)
|
122
141
|
options[:syntax] = :scss if local_path =~ /\.scss$/
|
123
142
|
engine = Sass::Engine.new(open(local_path, "rb").read, options)
|
124
143
|
engine.render
|
@@ -132,10 +151,10 @@ class VaeSiteServlet < Servlet
|
|
132
151
|
serve(request, response)
|
133
152
|
response.finished
|
134
153
|
end
|
135
|
-
|
154
|
+
|
136
155
|
def serve(req, res)
|
137
156
|
res.status = 200
|
138
|
-
local_path = (
|
157
|
+
local_path = (@site.root+req.params["REQUEST_URI"] || "/").split("?").first
|
139
158
|
if File.exists?(local_path) and !File.directory?(local_path) and !server_parsed?(local_path)
|
140
159
|
st = File::stat(local_path)
|
141
160
|
mtime = st.mtime
|
@@ -158,7 +177,7 @@ class VaeSiteServlet < Servlet
|
|
158
177
|
end
|
159
178
|
else
|
160
179
|
if req.params["REQUEST_URI"] =~ /^\/__data\// or req.params["REQUEST_URI"] =~ /^\/__assets\//
|
161
|
-
from_vae = { 'location' => "http://#{
|
180
|
+
from_vae = { 'location' => "http://#{@site.subdomain}.vaesite.com#{req.params["REQUEST_URI"]}"}
|
162
181
|
puts "#{req.params["REQUEST_URI"]} static asset"
|
163
182
|
else
|
164
183
|
from_vae = fetch_from_vae_and_include_source_of_current_page(req, req.params["REQUEST_METHOD"])
|
@@ -169,7 +188,7 @@ class VaeSiteServlet < Servlet
|
|
169
188
|
if from_vae['location']
|
170
189
|
res.body << "<p>Redirecting to <a href=\"#{from_vae['location']}\">#{from_vae['location']}</a>"
|
171
190
|
res.status = 302
|
172
|
-
res.header['Location'] = from_vae['location']
|
191
|
+
res.header['Location'] = from_vae['location']
|
173
192
|
else
|
174
193
|
res.header['Etag'] = from_vae['etag']
|
175
194
|
res.header['Last-Modified'] = from_vae['last-modified']
|
@@ -185,13 +204,11 @@ class VaeSiteServlet < Servlet
|
|
185
204
|
def req_scss?(req)
|
186
205
|
req.params["REQUEST_URI"] =~ /\.(sass|scss)$/
|
187
206
|
end
|
188
|
-
|
207
|
+
|
189
208
|
def server_parsed?(path)
|
190
209
|
SERVER_PARSED.each do |ext|
|
191
210
|
return true if Regexp.new("#{ext}$").match(path)
|
192
211
|
end
|
193
212
|
false
|
194
213
|
end
|
195
|
-
|
196
214
|
end
|
197
|
-
|
data/lib/version.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
VER = "0.
|
1
|
+
VER = "0.7.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vae
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Action Verb, LLC
|
@@ -9,92 +9,120 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-07-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: chunky_png
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
20
|
+
version: '1'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- - "
|
25
|
+
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '
|
27
|
+
version: '1'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: compass
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: '1'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
41
|
+
version: '1'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: directory_watcher
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - "
|
46
|
+
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
48
|
+
version: '1'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- - "
|
53
|
+
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '
|
55
|
+
version: '1'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
57
|
+
name: github-pages
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - '='
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
62
|
+
version: '87'
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - '='
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
69
|
+
version: '87'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: haml
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '4'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '4'
|
70
84
|
- !ruby/object:Gem::Dependency
|
71
85
|
name: highline
|
72
86
|
requirement: !ruby/object:Gem::Requirement
|
73
87
|
requirements:
|
74
|
-
- - "
|
88
|
+
- - "~>"
|
75
89
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
90
|
+
version: '1'
|
77
91
|
type: :runtime
|
78
92
|
prerelease: false
|
79
93
|
version_requirements: !ruby/object:Gem::Requirement
|
80
94
|
requirements:
|
81
|
-
- - "
|
95
|
+
- - "~>"
|
82
96
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
97
|
+
version: '1'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: jekyll-multiple-languages-plugin
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '1.4'
|
105
|
+
type: :runtime
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '1.4'
|
84
112
|
- !ruby/object:Gem::Dependency
|
85
113
|
name: json
|
86
114
|
requirement: !ruby/object:Gem::Requirement
|
87
115
|
requirements:
|
88
|
-
- - "
|
116
|
+
- - "~>"
|
89
117
|
- !ruby/object:Gem::Version
|
90
|
-
version: '
|
118
|
+
version: '1'
|
91
119
|
type: :runtime
|
92
120
|
prerelease: false
|
93
121
|
version_requirements: !ruby/object:Gem::Requirement
|
94
122
|
requirements:
|
95
|
-
- - "
|
123
|
+
- - "~>"
|
96
124
|
- !ruby/object:Gem::Version
|
97
|
-
version: '
|
125
|
+
version: '1'
|
98
126
|
- !ruby/object:Gem::Dependency
|
99
127
|
name: mongrel
|
100
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,20 +137,34 @@ dependencies:
|
|
109
137
|
- - '='
|
110
138
|
- !ruby/object:Gem::Version
|
111
139
|
version: 1.2.0.pre2
|
140
|
+
- !ruby/object:Gem::Dependency
|
141
|
+
name: ptools
|
142
|
+
requirement: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - "~>"
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '1'
|
147
|
+
type: :runtime
|
148
|
+
prerelease: false
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - "~>"
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '1'
|
112
154
|
- !ruby/object:Gem::Dependency
|
113
155
|
name: sass
|
114
156
|
requirement: !ruby/object:Gem::Requirement
|
115
157
|
requirements:
|
116
|
-
- -
|
158
|
+
- - "~>"
|
117
159
|
- !ruby/object:Gem::Version
|
118
|
-
version: 3.
|
160
|
+
version: '3.4'
|
119
161
|
type: :runtime
|
120
162
|
prerelease: false
|
121
163
|
version_requirements: !ruby/object:Gem::Requirement
|
122
164
|
requirements:
|
123
|
-
- -
|
165
|
+
- - "~>"
|
124
166
|
- !ruby/object:Gem::Version
|
125
|
-
version: 3.
|
167
|
+
version: '3.4'
|
126
168
|
description: Supports local development for Vae Platform (http://vaeplatform.com/)
|
127
169
|
email: support@actionverb.com
|
128
170
|
executables:
|
@@ -131,18 +173,19 @@ extensions: []
|
|
131
173
|
extra_rdoc_files: []
|
132
174
|
files:
|
133
175
|
- bin/vae
|
176
|
+
- lib/full_stack.rb
|
134
177
|
- lib/logging.rb
|
178
|
+
- lib/proxy_server.rb
|
135
179
|
- lib/servlet.rb
|
136
180
|
- lib/site.rb
|
137
|
-
- lib/vae.rb
|
138
181
|
- lib/vae_error.rb
|
139
|
-
- lib/
|
182
|
+
- lib/vae_local.rb
|
140
183
|
- lib/vae_site_servlet.rb
|
141
184
|
- lib/version.rb
|
142
185
|
- test/vae_test.rb
|
143
186
|
homepage: http://docs.vaeplatform.com/vae_local
|
144
187
|
licenses:
|
145
|
-
- GPL
|
188
|
+
- GPL-3.0
|
146
189
|
metadata: {}
|
147
190
|
post_install_message:
|
148
191
|
rdoc_options: []
|
@@ -160,7 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
203
|
version: '0'
|
161
204
|
requirements: []
|
162
205
|
rubyforge_project:
|
163
|
-
rubygems_version: 2.
|
206
|
+
rubygems_version: 2.5.1
|
164
207
|
signing_key:
|
165
208
|
specification_version: 4
|
166
209
|
summary: This gem allows for local development for sites on Vae Platform (http://vaeplatform.com/)
|
data/lib/vae_local_servlet.rb
DELETED