1*340f5e56SDavid van Moolenbroek#! /usr/bin/env lua 2*340f5e56SDavid van Moolenbroek 3*340f5e56SDavid van Moolenbroek-- 4*340f5e56SDavid van Moolenbroek-- Copyright (c) 2009 The NetBSD Foundation, Inc. 5*340f5e56SDavid van Moolenbroek-- All rights reserved. 6*340f5e56SDavid van Moolenbroek-- 7*340f5e56SDavid van Moolenbroek-- This code is derived from software contributed to The NetBSD Foundation 8*340f5e56SDavid van Moolenbroek-- by Alistair Crooks (agc@netbsd.org) 9*340f5e56SDavid van Moolenbroek-- 10*340f5e56SDavid van Moolenbroek-- Redistribution and use in source and binary forms, with or without 11*340f5e56SDavid van Moolenbroek-- modification, are permitted provided that the following conditions 12*340f5e56SDavid van Moolenbroek-- are met: 13*340f5e56SDavid van Moolenbroek-- 1. Redistributions of source code must retain the above copyright 14*340f5e56SDavid van Moolenbroek-- notice, this list of conditions and the following disclaimer. 15*340f5e56SDavid van Moolenbroek-- 2. Redistributions in binary form must reproduce the above copyright 16*340f5e56SDavid van Moolenbroek-- notice, this list of conditions and the following disclaimer in the 17*340f5e56SDavid van Moolenbroek-- documentation and/or other materials provided with the distribution. 18*340f5e56SDavid van Moolenbroek-- 19*340f5e56SDavid van Moolenbroek-- THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20*340f5e56SDavid van Moolenbroek-- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21*340f5e56SDavid van Moolenbroek-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22*340f5e56SDavid van Moolenbroek-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23*340f5e56SDavid van Moolenbroek-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24*340f5e56SDavid van Moolenbroek-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25*340f5e56SDavid van Moolenbroek-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26*340f5e56SDavid van Moolenbroek-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27*340f5e56SDavid van Moolenbroek-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28*340f5e56SDavid van Moolenbroek-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29*340f5e56SDavid van Moolenbroek-- POSSIBILITY OF SUCH DAMAGE. 30*340f5e56SDavid van Moolenbroek-- 31*340f5e56SDavid van Moolenbroek 32*340f5e56SDavid van Moolenbroek-- command line args 33*340f5e56SDavid van Moolenbroekdofile "optparse.lua" 34*340f5e56SDavid van Moolenbroek 35*340f5e56SDavid van Moolenbroekopt = OptionParser{usage="%prog [options] root [vhost]", version="20091105"} 36*340f5e56SDavid van Moolenbroek 37*340f5e56SDavid van Moolenbroekopt.add_option{"-C", "--cgimap", action="store", dest="cgimap", help="--cgimap 's t'"} 38*340f5e56SDavid van Moolenbroekopt.add_option{"-H", "--hide-dots", action="store_true", dest="hidedots", help="--hide-dots"} 39*340f5e56SDavid van Moolenbroekopt.add_option{"-I", "--portnum", action="store", dest="portnum", help="--portnum number"} 40*340f5e56SDavid van Moolenbroekopt.add_option{"-M", "--dynamicmime", action="store", dest="dynmime", help="--dynamicmime 'suffix type a b'"} 41*340f5e56SDavid van Moolenbroekopt.add_option{"-S", "--server-software", action="store", dest="serversw", help="--server-software name"} 42*340f5e56SDavid van Moolenbroekopt.add_option{"-U", "--username", action="store", dest="username", help="--username name"} 43*340f5e56SDavid van Moolenbroekopt.add_option{"-V", "--unknown-slash", action="store_true", dest="unknown", help="--unknown-slash"} 44*340f5e56SDavid van Moolenbroekopt.add_option{"-X", "--dir-index", action="store_true", dest="dirindex", help="--dir-index"} 45*340f5e56SDavid van Moolenbroekopt.add_option{"-Z", "--ssl", action="store", dest="ssl", help="--ssl 'cert priv'"} 46*340f5e56SDavid van Moolenbroekopt.add_option{"-b", "--background", action="store", dest="background", help="--background count"} 47*340f5e56SDavid van Moolenbroekopt.add_option{"-c", "--cgibin", action="store", dest="cgibin", help="--cgibin bin"} 48*340f5e56SDavid van Moolenbroekopt.add_option{"-e", "--dirtyenv", action="store_true", dest="dirtyenv", help="--dirtyenv"} 49*340f5e56SDavid van Moolenbroekopt.add_option{"-f", "--foreground", action="store_true", dest="foreground", help="--foreground"} 50*340f5e56SDavid van Moolenbroekopt.add_option{"-i", "--bindaddr", action="store", dest="bindaddress", help="--bindaddr address"} 51*340f5e56SDavid van Moolenbroekopt.add_option{"-n", "--numeric", action="store_true", dest="numeric", help="--numeric"} 52*340f5e56SDavid van Moolenbroekopt.add_option{"-p", "--public-html", action="store", dest="public_html", help="--public-html dir"} 53*340f5e56SDavid van Moolenbroekopt.add_option{"-r", "--trusted-referal", action="store_true", dest="trustedref", help="trusted referal"} 54*340f5e56SDavid van Moolenbroekopt.add_option{"-s", "--logtostderr", action="store_true", dest="logstderr", help="log to stderr"} 55*340f5e56SDavid van Moolenbroekopt.add_option{"-t", "--chroot", action="store", dest="chroot", help="--chroot dir"} 56*340f5e56SDavid van Moolenbroekopt.add_option{"-u", "--enable-users", action="store_true", dest="enableusers", help="--enable-users"} 57*340f5e56SDavid van Moolenbroekopt.add_option{"-v", "--virtbase", action="store", dest="virtbase", help="virtual base location"} 58*340f5e56SDavid van Moolenbroekopt.add_option{"-x", "--index-html", action="store", dest="indexhtml", help="index.html name"} 59*340f5e56SDavid van Moolenbroek 60*340f5e56SDavid van Moolenbroek-- caller lua script 61*340f5e56SDavid van Moolenbroeklocal extension = ".so" 62*340f5e56SDavid van Moolenbroekf = io.open("libluabozohttpd.dylib", "r") 63*340f5e56SDavid van Moolenbroekif f then 64*340f5e56SDavid van Moolenbroek extension = ".dylib" 65*340f5e56SDavid van Moolenbroek io.close(f) 66*340f5e56SDavid van Moolenbroekend 67*340f5e56SDavid van Moolenbroekglupkg = package.loadlib("./" .. "libluabozohttpd" .. extension, "luaopen_bozohttpd") 68*340f5e56SDavid van Moolenbroekbozohttpd = glupkg() 69*340f5e56SDavid van Moolenbroek 70*340f5e56SDavid van Moolenbroek-- initialise 71*340f5e56SDavid van Moolenbroekhttpd = bozohttpd.new() 72*340f5e56SDavid van Moolenbroekbozohttpd.init_httpd(httpd) 73*340f5e56SDavid van Moolenbroekprefs = bozohttpd.init_prefs() 74*340f5e56SDavid van Moolenbroek 75*340f5e56SDavid van Moolenbroek-- parse command line args 76*340f5e56SDavid van Moolenbroekoptions,args = opt.parse_args() 77*340f5e56SDavid van Moolenbroekif options.portnum then 78*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "port number", options.portnum) 79*340f5e56SDavid van Moolenbroekend 80*340f5e56SDavid van Moolenbroekif options.background then 81*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "background", options.background) 82*340f5e56SDavid van Moolenbroekend 83*340f5e56SDavid van Moolenbroekif options.numeric then 84*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "numeric", "true") 85*340f5e56SDavid van Moolenbroekend 86*340f5e56SDavid van Moolenbroekif options.logstderr then 87*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "log to stderr", "true") 88*340f5e56SDavid van Moolenbroekend 89*340f5e56SDavid van Moolenbroekif options.foreground then 90*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "foreground", "true") 91*340f5e56SDavid van Moolenbroekend 92*340f5e56SDavid van Moolenbroekif options.trustedref then 93*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "trusted referal", "true") 94*340f5e56SDavid van Moolenbroekend 95*340f5e56SDavid van Moolenbroekif options.dynmime then 96*340f5e56SDavid van Moolenbroek suffix, type, s1, s2 = string.find(options.dynmime, 97*340f5e56SDavid van Moolenbroek "(%S+)%s+(%S+)%s+(%S+)%s+(%S+)") 98*340f5e56SDavid van Moolenbroek bozohttpd.dynamic_mime(httpd, suffix, type, s1, s2) 99*340f5e56SDavid van Moolenbroekend 100*340f5e56SDavid van Moolenbroekif options.serversw then 101*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "server software", options.serversw) 102*340f5e56SDavid van Moolenbroekend 103*340f5e56SDavid van Moolenbroekif options.ssl then 104*340f5e56SDavid van Moolenbroek cert, priv = string.find(options.ssl, "(%S+)%s+(%S+)") 105*340f5e56SDavid van Moolenbroek bozohttpd.dynamic_mime(httpd, cert, priv) 106*340f5e56SDavid van Moolenbroekend 107*340f5e56SDavid van Moolenbroekif options.username then 108*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "username", options.username) 109*340f5e56SDavid van Moolenbroekend 110*340f5e56SDavid van Moolenbroekif options.unknownslash then 111*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "unknown slash", "true") 112*340f5e56SDavid van Moolenbroekend 113*340f5e56SDavid van Moolenbroekif options.virtbase then 114*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "virtual base", options.virtbase) 115*340f5e56SDavid van Moolenbroekend 116*340f5e56SDavid van Moolenbroekif options.indexhtml then 117*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "index.html", options.indexhtml) 118*340f5e56SDavid van Moolenbroekend 119*340f5e56SDavid van Moolenbroekif options.dirtyenv then 120*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "dirty environment", "true") 121*340f5e56SDavid van Moolenbroekend 122*340f5e56SDavid van Moolenbroekif options.bindaddr then 123*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "bind address", options.bindaddr) 124*340f5e56SDavid van Moolenbroekend 125*340f5e56SDavid van Moolenbroekif options.cgibin then 126*340f5e56SDavid van Moolenbroek bozohttpd.cgi_setbin(httpd, options.cgibin) 127*340f5e56SDavid van Moolenbroekend 128*340f5e56SDavid van Moolenbroekif options.cgimap then 129*340f5e56SDavid van Moolenbroek name, handler = string.find(options.cgimap, "(%S+)%s+(%S+)") 130*340f5e56SDavid van Moolenbroek bozohttpd.cgi_map(httpd, name, handler) 131*340f5e56SDavid van Moolenbroekend 132*340f5e56SDavid van Moolenbroekif options.public_html then 133*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "public_html", options.public_html) 134*340f5e56SDavid van Moolenbroekend 135*340f5e56SDavid van Moolenbroekif options.chroot then 136*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "chroot dir", options.chroot) 137*340f5e56SDavid van Moolenbroekend 138*340f5e56SDavid van Moolenbroekif options.enableusers then 139*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "enable users", "true") 140*340f5e56SDavid van Moolenbroekend 141*340f5e56SDavid van Moolenbroekif options.hidedots then 142*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "hide dots", "true") 143*340f5e56SDavid van Moolenbroekend 144*340f5e56SDavid van Moolenbroekif options.dirindex then 145*340f5e56SDavid van Moolenbroek bozohttpd.set_pref(prefs, "directory indexing", "true") 146*340f5e56SDavid van Moolenbroekend 147*340f5e56SDavid van Moolenbroek 148*340f5e56SDavid van Moolenbroekif #args < 1 then 149*340f5e56SDavid van Moolenbroek print("At least one arg needed for root directory") 150*340f5e56SDavid van Moolenbroekelse 151*340f5e56SDavid van Moolenbroek -- set up connections 152*340f5e56SDavid van Moolenbroek local vhost = args[2] or "" 153*340f5e56SDavid van Moolenbroek bozohttpd.setup(httpd, prefs, vhost, args[1]) 154*340f5e56SDavid van Moolenbroek 155*340f5e56SDavid van Moolenbroek -- loop, serving requests 156*340f5e56SDavid van Moolenbroek local numreps = options.background or 0 157*340f5e56SDavid van Moolenbroek repeat 158*340f5e56SDavid van Moolenbroek req = bozohttpd.read_request(httpd) 159*340f5e56SDavid van Moolenbroek bozohttpd.process_request(httpd, req) 160*340f5e56SDavid van Moolenbroek bozohttpd.clean_request(req) 161*340f5e56SDavid van Moolenbroek until numreps == 0 162*340f5e56SDavid van Moolenbroekend 163