blob: 239e1857cb233b1f68029f34fbe5df676fbb07e4 [file] [log] [blame]
#!/usr/bin/env ruby
require 'wunderbar'
# response to form requests
if ENV['REQUEST_METHOD'].to_s.upcase == 'POST'
cgi = CGI.new
cgi.out 'type' => 'text/plain' do
# extract parameters
hostname = cgi.params['hostname'].first
docroot = cgi.params['docroot'].first
https = cgi.params['https'].first
# read live configuration
conf = File.read(Dir['/etc/apache2/sites-available/*whimsy*.conf'].first)
# enable all interfaces
conf[/<VirtualHost (.*):\d+>/, 1] = '*'
# replace hostname
conf[/ServerName (.*)/, 1] = hostname
# don't override error or custom logs
conf[/()ErrorLog/, 1] = '# '
conf[/()CustomLog/, 1] = '# '
# disable Passenger Default user and group (if present)
begin
conf[/()PassengerDefaultUser/, 1] = '# '
rescue
end
begin
conf[/()PassengerDefaultGroup/, 1] = '# '
rescue
end
# global replace docroot
conf.gsub! '/srv/whimsy', docroot.chomp('/')
# global replace docroot
conf.gsub! /SetEnv HTTPS .*/, "SetEnv HTTPS #{https}"
conf
end
exit 0
end
# form used for tailoring vhosts
_html do
_style %{
label {width: 12em; float: left}
legend {background: #141; color: #DFD; padding: 0.4em}
fieldset {background: #EFE; width: 34em}
fieldset div {clear: both; padding: 0.4em 0 0 1.5em}
input,textarea {width: 3in}
select {width: 3.06in}
input[type=checkbox] {margin-left: 6em; width: 1em}
input[type=submit] {margin-top: 0.5em; margin-left: 3em; width: 8em}
ul {padding: 0; display: flex; flex-wrap: wrap}
li {width: 10%; list-style-type: none; margin: 0 2em}
}
_form method: 'post' do
_fieldset do
_legend 'Apache Whimsy vhost generator'
_div_ do
_label 'Virtual host name', for: 'hostname'
_input id: 'hostname', name: 'hostname', required: true,
pattern: '^(?![0-9]+$)(?!-)[a-zA-Z0-9-]{,63}(?<!-)$',
value: 'whimsy.local'
end
_div_ do
_label 'Document root', for: 'docroot'
_input id: 'docroot', name: 'docroot', required: true,
pattern: '^/([^\\(){}:\*\?<>\|\"\'])+$',
value: '/srv/whimsy'
end
_div_ do
_label 'HTTPS', for: 'https'
_select id: 'https', name: 'https' do
_option 'on'
_option 'off', selected: true
end
end
_input type: 'submit', value: 'Submit'
end
_h3 'Modules enabled'
_ul do
Dir['/etc/apache2/mods-enabled/*.load'].sort.each do |conf|
_li File.basename(conf, '.load')
end
end
end
_script %{
var inputs = Array.prototype.slice.call(document.querySelectorAll("input"));
var submit = document.querySelector("input[type=submit]");
// only enable submit button when all inputs are valid
inputs.forEach(function(input) {
input.addEventListener("input", function() {
if (inputs.some(function(input) {
return input.matches(":invalid")
})) {
submit.disabled = true
} else {
submit.disabled = false
}
})
})
}
end