X-Git-Url: http://git.hcoop.net/hcoop/zz_old/domtool2-proto.git/blobdiff_plain/06e243f45dd9ff6abb2d23f44afbe658ee110fe6..db42f9ffd41b71157b7c8970a9c1af9fecb0f67b:/src/plugins/apache.sml diff --git a/src/plugins/apache.sml b/src/plugins/apache.sml index 966240c..11b4ab3 100644 --- a/src/plugins/apache.sml +++ b/src/plugins/apache.sml @@ -86,6 +86,10 @@ val _ = Env.type_one "suexec_flag" Env.bool (fn b => b orelse Domain.hasPriv "www") +val _ = Env.type_one "regexp" + Env.string + Pcre.validRegexp + fun validLocation s = size s > 0 andalso size s < 1000 andalso CharVector.all (fn ch => Char.isAlphaNum ch @@ -111,6 +115,15 @@ fun ssl e = case e of | (EApp ((EVar "use_cert", _), s), _) => Option.map SOME (Env.string s) | _ => NONE +fun validExtension s = + size s > 0 + andalso size s < 20 + andalso CharVector.all (fn ch => Char.isAlphaNum ch orelse ch = #"_") s + +val _ = Env.type_one "file_extension" + Env.string + validExtension + val defaults = [("WebPlaces", (TList (TBase "web_place", dl), dl), (fn () => (EList (map webPlaceDefault Config.Apache.webNodes_default), dl))), @@ -178,6 +191,7 @@ val cond_flag = fn (EVar "cond_nocase", _) => SOME "NC" val apache_option = fn (EVar "execCGI", _) => SOME "ExecCGI" | (EVar "includesNOEXEC", _) => SOME "IncludesNOEXEC" | (EVar "indexes", _) => SOME "Indexes" + | (EVar "followSymLinks", _) => SOME "FollowSymLinks" | _ => NONE val autoindex_width = fn (EVar "autofit", _) => SOME "*" @@ -267,6 +281,13 @@ fun logDir {user, node, vhostId} = "/", vhostId] +fun realLogDir {user, node, vhostId} = + String.concat [Config.Apache.realLogDirOf user, + "/", + node, + "/", + vhostId] + val () = Slave.registerFileHandler (fn fs => let val spl = OS.Path.splitDirFile (#file fs) @@ -414,104 +435,110 @@ fun registerAliaser f = aliaser := (fn x => (old x; f x)) end -val () = Env.containerV_one "vhost" - ("host", Env.string) - (fn (env, host) => - let - val places = Env.env (Env.list webPlace) (env, "WebPlaces") - - val ssl = Env.env ssl (env, "SSL") - val user = Env.env Env.string (env, "User") - val group = Env.env Env.string (env, "Group") - val docroot = Env.env Env.string (env, "DocumentRoot") - val sadmin = Env.env Env.string (env, "ServerAdmin") - val suexec = Env.env Env.bool (env, "SuExec") - - val fullHost = host ^ "." ^ Domain.currentDomain () - val vhostId = fullHost ^ (if Option.isSome ssl then ".ssl" else "") - val confFile = fullHost ^ (if Option.isSome ssl then ".vhost_ssl" else ".vhost") - in - currentVhost := fullHost; - currentVhostId := vhostId; - sslEnabled := Option.isSome ssl; - - rewriteEnabled := false; - localRewriteEnabled := false; - vhostFiles := map (fn (node, ip) => - let - val file = Domain.domainFile {node = node, - name = confFile} +fun vhostPost () = (!post (); + write "\n"; + app (TextIO.closeOut o #2) (!vhostFiles)) - val ld = logDir {user = user, node = node, vhostId = vhostId} - in - TextIO.output (file, "# Owner: "); +fun vhostBody (env, makeFullHost) = + let + val places = Env.env (Env.list webPlace) (env, "WebPlaces") + + val ssl = Env.env ssl (env, "SSL") + val user = Env.env Env.string (env, "User") + val group = Env.env Env.string (env, "Group") + val docroot = Env.env Env.string (env, "DocumentRoot") + val sadmin = Env.env Env.string (env, "ServerAdmin") + val suexec = Env.env Env.bool (env, "SuExec") + + val fullHost = makeFullHost (Domain.currentDomain ()) + val vhostId = fullHost ^ (if Option.isSome ssl then ".ssl" else "") + val confFile = fullHost ^ (if Option.isSome ssl then ".vhost_ssl" else ".vhost") + in + currentVhost := fullHost; + currentVhostId := vhostId; + sslEnabled := Option.isSome ssl; + + rewriteEnabled := false; + localRewriteEnabled := false; + vhostFiles := map (fn (node, ip) => + let + val file = Domain.domainFile {node = node, + name = confFile} + + val ld = logDir {user = user, node = node, vhostId = vhostId} + in + TextIO.output (file, "# Owner: "); + TextIO.output (file, user); + TextIO.output (file, "\n "443" + | NONE => "80"); + TextIO.output (file, ">\n"); + TextIO.output (file, "\tErrorLog "); + TextIO.output (file, ld); + TextIO.output (file, "/error.log\n\tCustomLog "); + TextIO.output (file, ld); + TextIO.output (file, "/access.log combined\n"); + TextIO.output (file, "\tServerName "); + TextIO.output (file, fullHost); + app + (fn dom => (TextIO.output (file, "\n\tServerAlias "); + TextIO.output (file, makeFullHost dom))) + (Domain.currentAliasDomains ()); + + if suexec then + if isVersion1 node then + (TextIO.output (file, "\n\tUser "); TextIO.output (file, user); - TextIO.output (file, "\n "443" - | NONE => "80"); - TextIO.output (file, ">\n"); - TextIO.output (file, "\tErrorLog "); - TextIO.output (file, ld); - TextIO.output (file, "/error.log\n\tCustomLog "); - TextIO.output (file, ld); - TextIO.output (file, "/access.log combined\n"); - TextIO.output (file, "\tServerName "); - TextIO.output (file, fullHost); - app - (fn dom => (TextIO.output (file, "\n\tServerAlias "); - TextIO.output (file, host); - TextIO.output (file, "."); - TextIO.output (file, dom))) - (Domain.currentAliasDomains ()); - - if suexec then - if isVersion1 node then - (TextIO.output (file, "\n\tUser "); - TextIO.output (file, user); - TextIO.output (file, "\n\tGroup "); - TextIO.output (file, group)) - else - (TextIO.output (file, "\n\tSuexecUserGroup "); - TextIO.output (file, user); - TextIO.output (file, " "); - TextIO.output (file, group)) - else - (); - - if isWaklog node then - (TextIO.output (file, "\n\tWaklogEnabled on\n\tWaklogLocationPrincipal "); - TextIO.output (file, user); - TextIO.output (file, "/daemon@HCOOP.NET /etc/keytabs/user.daemon/"); - TextIO.output (file, user)) - else - (); - - TextIO.output (file, "\n\tDAVLockDB /var/lock/apache2/dav/"); + TextIO.output (file, "\n\tGroup "); + TextIO.output (file, group)) + else + (TextIO.output (file, "\n\tSuexecUserGroup "); TextIO.output (file, user); - TextIO.output (file, "/DAVLock"); + TextIO.output (file, " "); + TextIO.output (file, group)) + else + (); + + if isWaklog node then + (TextIO.output (file, "\n\tWaklogEnabled on\n\tWaklogLocationPrincipal "); + TextIO.output (file, user); + TextIO.output (file, "/daemon@HCOOP.NET /etc/keytabs/user.daemon/"); + TextIO.output (file, user)) + else + (); + + TextIO.output (file, "\n\tDAVLockDB /var/lock/apache2/dav/"); + TextIO.output (file, user); + TextIO.output (file, "/DAVLock"); + + (ld, file) + end) + places; + write "\n\tDocumentRoot "; + write docroot; + write "\n\tServerAdmin "; + write sadmin; + case ssl of + SOME cert => + (write "\n\tSSLEngine on\n\tSSLCertificateFile "; + write cert) + | NONE => (); + write "\n"; + !pre {user = user, nodes = map #1 places, id = vhostId, hostname = fullHost}; + app (fn dom => !aliaser (makeFullHost dom)) (Domain.currentAliasDomains ()) + end - (ld, file) - end) - places; - write "\n\tDocumentRoot "; - write docroot; - write "\n\tServerAdmin "; - write sadmin; - case ssl of - SOME cert => - (write "\n\tSSLEngine on\n\tSSLCertificateFile "; - write cert) - | NONE => (); - write "\n"; - !pre {user = user, nodes = map #1 places, id = vhostId, hostname = fullHost}; - app (fn dom => !aliaser (host ^ "." ^ dom)) (Domain.currentAliasDomains ()) - end, - fn () => (!post (); - write "\n"; - app (TextIO.closeOut o #2) (!vhostFiles))) +val () = Env.containerV_one "vhost" + ("host", Env.string) + (fn (env, host) => vhostBody (env, fn dom => host ^ "." ^ dom), + vhostPost) + +val () = Env.containerV_none "vhostDefault" + (fn env => vhostBody (env, fn dom => dom), + vhostPost) val inLocal = ref false @@ -539,7 +566,7 @@ val () = Env.container_one "directory" fun checkRewrite () = if !inLocal then - if !rewriteEnabled orelse !localRewriteEnabled then + if !localRewriteEnabled then () else (write "\tRewriteEngine on\n"; @@ -653,12 +680,24 @@ val () = Env.action_two "scriptAlias" val () = Env.action_two "errorDocument" ("code", Env.string, "handler", Env.string) (fn (code, handler) => - (write "\tErrorDocument\t"; - write code; - write " "; - write handler; - write "\n")) + let + val hasSpaces = CharVector.exists Char.isSpace handler + fun maybeQuote () = + if hasSpaces then + write "\"" + else + () + in + write "\tErrorDocument\t"; + write code; + write " "; + maybeQuote (); + write handler; + maybeQuote (); + write "\n" + end) + val () = Env.action_one "options" ("options", Env.list apache_option) (fn opts => @@ -686,6 +725,12 @@ val () = Env.action_one "unset_options" app (fn opt => (write " -"; write opt)) opts; write "\n")) +val () = Env.action_one "cgiExtension" + ("extension", Env.string) + (fn ext => (write "\tAddHandler cgi-script "; + write ext; + write "\n")) + val () = Env.action_one "directoryIndex" ("filenames", Env.list Env.string) (fn opts => @@ -926,6 +971,12 @@ val () = Env.action_two "setEnv" | ch => str ch) value); write "\"\n")) +val () = Env.action_one "diskCache" + ("path", Env.string) + (fn path => (write "\tCacheEnable disk \""; + write path; + write "\"\n")) + val () = Domain.registerResetLocal (fn () => ignore (OS.Process.system (Config.rm ^ " -rf /var/domtool/vhosts/*")))