Skip to content

Instantly share code, notes, and snippets.

@kellegous
Created September 2, 2015 23:57
Show Gist options
  • Select an option

  • Save kellegous/3fae3de858c2939516b7 to your computer and use it in GitHub Desktop.

Select an option

Save kellegous/3fae3de858c2939516b7 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python2.7
import optparse
import os
import subprocess
import sys
import tempfile
import time
HTTPD_PATH = '/usr/sbin/httpd'
INITDB_PATH = '/usr/local/bin/initdb'
POSTGRES_PATH = '/usr/local/bin/postgres'
MEMCACHE_PATH = '/usr/local/bin/memcached'
def start_apache(opts, procs):
def emit_conf(dst):
with open(dst, 'w') as w:
w.write(HTTP_CONF_TEMPLATE % {
'DATADIR': opts.data_dir,
'PORT': opts.port,
'DOCROOT': opts.doc_root
})
conf = os.path.join(opts.data_dir, 'httpd.conf')
emit_conf(conf)
env = os.environ
env['PHPRC'] = os.path.abspath(opts.data_dir)
env['USE_ZEND_ALLOC'] = '0'
procs.append(subprocess.Popen([
HTTPD_PATH, '-DFOREGROUND', '-d.', '-f%s' % conf
], env=env))
def ensure_kernel_settings():
out, _ = subprocess.Popen(['sysctl', '-n', 'kern.sysv.shmall'], stdout=subprocess.PIPE).communicate()
shmall = int(out.strip())
if shmall < 65536:
subprocess.call(['sudo', 'sysctl', '-w', 'kern.sysv.shmall=65536'])
out, _ = subprocess.Popen(['sysctl', '-n', 'kern.sysv.shmmax'], stdout=subprocess.PIPE).communicate()
shmmax = int(out.strip())
if shmmax < 16777216:
subprocess.call(['sudo', 'sysctl', '-w', 'kern.sysv.shmmax=16777216'])
def start_postgres(opts, procs):
ensure_kernel_settings()
dir = os.path.join(opts.data_dir, 'pg_data')
if not os.path.exists(dir):
if subprocess.call([INITDB_PATH, '-D', dir, '--auth-local=trust']) != 0:
raise RuntimeError()
procs.append(subprocess.Popen([POSTGRES_PATH, '-D', dir]))
def start_memcached(opts, procs):
procs.append(subprocess.Popen([MEMCACHE_PATH]))
def ensure_dir(dir):
if not os.path.exists(dir):
os.makedirs(dir)
def main():
parser = optparse.OptionParser()
parser.add_option('--doc_root',
dest='doc_root',
default=None,
help='')
parser.add_option('--data_dir',
dest='data_dir',
default='data',
help='')
parser.add_option('--disable_pg',
dest='enable_pg',
action='store_false',
default=True,
help='')
parser.add_option('--disable_memcached',
dest='enable_memcached',
action='store_false',
default=True,
help='')
parser.add_option('--port',
dest='port',
default='8086')
opts, args = parser.parse_args()
if not opts.doc_root:
opts.doc_root = os.getcwd()
else:
opts.doc_root = os.path.abspath(opts.doc_root)
ensure_dir(opts.data_dir)
procs = []
if opts.enable_pg:
start_postgres(opts, procs)
if opts.enable_memcached:
start_memcached(opts, procs)
try:
while True:
start_apache(opts, procs)
procs[-1].wait()
print 'crashed, restarting...'
procs.pop()
except KeyboardInterrupt:
pass
for p in procs:
try:
p.kill()
except:
pass
HTTP_CONF_TEMPLATE = """
LoadModule authn_file_module /usr/libexec/apache2/mod_authn_file.so
LoadModule authn_dbm_module /usr/libexec/apache2/mod_authn_dbm.so
LoadModule authn_anon_module /usr/libexec/apache2/mod_authn_anon.so
LoadModule authn_dbd_module /usr/libexec/apache2/mod_authn_dbd.so
LoadModule authn_default_module /usr/libexec/apache2/mod_authn_default.so
LoadModule authz_host_module /usr/libexec/apache2/mod_authz_host.so
LoadModule authz_groupfile_module /usr/libexec/apache2/mod_authz_groupfile.so
LoadModule authz_user_module /usr/libexec/apache2/mod_authz_user.so
LoadModule authz_dbm_module /usr/libexec/apache2/mod_authz_dbm.so
LoadModule authz_owner_module /usr/libexec/apache2/mod_authz_owner.so
LoadModule authz_default_module /usr/libexec/apache2/mod_authz_default.so
LoadModule auth_basic_module /usr/libexec/apache2/mod_auth_basic.so
LoadModule auth_digest_module /usr/libexec/apache2/mod_auth_digest.so
LoadModule cache_module /usr/libexec/apache2/mod_cache.so
LoadModule disk_cache_module /usr/libexec/apache2/mod_disk_cache.so
LoadModule mem_cache_module /usr/libexec/apache2/mod_mem_cache.so
LoadModule dbd_module /usr/libexec/apache2/mod_dbd.so
LoadModule dumpio_module /usr/libexec/apache2/mod_dumpio.so
LoadModule reqtimeout_module /usr/libexec/apache2/mod_reqtimeout.so
LoadModule ext_filter_module /usr/libexec/apache2/mod_ext_filter.so
LoadModule include_module /usr/libexec/apache2/mod_include.so
LoadModule filter_module /usr/libexec/apache2/mod_filter.so
LoadModule substitute_module /usr/libexec/apache2/mod_substitute.so
LoadModule deflate_module /usr/libexec/apache2/mod_deflate.so
LoadModule log_config_module /usr/libexec/apache2/mod_log_config.so
LoadModule log_forensic_module /usr/libexec/apache2/mod_log_forensic.so
LoadModule logio_module /usr/libexec/apache2/mod_logio.so
LoadModule env_module /usr/libexec/apache2/mod_env.so
LoadModule mime_magic_module /usr/libexec/apache2/mod_mime_magic.so
LoadModule cern_meta_module /usr/libexec/apache2/mod_cern_meta.so
LoadModule expires_module /usr/libexec/apache2/mod_expires.so
LoadModule headers_module /usr/libexec/apache2/mod_headers.so
LoadModule ident_module /usr/libexec/apache2/mod_ident.so
LoadModule usertrack_module /usr/libexec/apache2/mod_usertrack.so
LoadModule setenvif_module /usr/libexec/apache2/mod_setenvif.so
LoadModule version_module /usr/libexec/apache2/mod_version.so
LoadModule proxy_module /usr/libexec/apache2/mod_proxy.so
LoadModule proxy_connect_module /usr/libexec/apache2/mod_proxy_connect.so
LoadModule proxy_ftp_module /usr/libexec/apache2/mod_proxy_ftp.so
LoadModule proxy_http_module /usr/libexec/apache2/mod_proxy_http.so
LoadModule proxy_scgi_module /usr/libexec/apache2/mod_proxy_scgi.so
LoadModule proxy_ajp_module /usr/libexec/apache2/mod_proxy_ajp.so
LoadModule proxy_balancer_module /usr/libexec/apache2/mod_proxy_balancer.so
LoadModule ssl_module /usr/libexec/apache2/mod_ssl.so
LoadModule mime_module /usr/libexec/apache2/mod_mime.so
LoadModule dav_module /usr/libexec/apache2/mod_dav.so
LoadModule status_module /usr/libexec/apache2/mod_status.so
LoadModule autoindex_module /usr/libexec/apache2/mod_autoindex.so
LoadModule asis_module /usr/libexec/apache2/mod_asis.so
LoadModule info_module /usr/libexec/apache2/mod_info.so
LoadModule cgi_module /usr/libexec/apache2/mod_cgi.so
LoadModule dav_fs_module /usr/libexec/apache2/mod_dav_fs.so
LoadModule vhost_alias_module /usr/libexec/apache2/mod_vhost_alias.so
LoadModule negotiation_module /usr/libexec/apache2/mod_negotiation.so
LoadModule dir_module /usr/libexec/apache2/mod_dir.so
LoadModule imagemap_module /usr/libexec/apache2/mod_imagemap.so
LoadModule actions_module /usr/libexec/apache2/mod_actions.so
LoadModule speling_module /usr/libexec/apache2/mod_speling.so
LoadModule userdir_module /usr/libexec/apache2/mod_userdir.so
LoadModule alias_module /usr/libexec/apache2/mod_alias.so
LoadModule rewrite_module /usr/libexec/apache2/mod_rewrite.so
LoadModule hfs_apple_module /usr/libexec/apache2/mod_hfs_apple.so
LoadModule php5_module /usr/libexec/apache2/libphp5.so
# These can also be turned into an Include.
PidFile %(DATADIR)s/httpd.pid
LockFile %(DATADIR)s/httpd.lock
# Can be substituted for a variable in an Include.
Listen %(PORT)s
NameVirtualHost *:%(PORT)s
# Just put this here to stop the startup error. Can be replaced with something else.
ServerName test
Include /etc/apache2/extra/httpd-autoindex.conf
Include /etc/apache2/extra/httpd-default.conf
Include /etc/apache2/extra/httpd-info.conf
ErrorLog %(DATADIR)s/error.log
<VirtualHost *:%(PORT)s>
DocumentRoot %(DOCROOT)s
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
DirectoryIndex index.html index.php
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
</VirtualHost>
"""
if __name__ == '__main__':
sys.exit(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment