xref: /minix3/libexec/httpd/lua/bozo.lua (revision 340f5e56603e4275faeb89a9aacace41ba22d661)
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