X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/81180509ead024b0b46beb4a356bf8d7887b5d51..129d3b575680d8d5f73162442b0a3f5cfdfbb595:/src/plugins/apache.sml diff --git a/src/plugins/apache.sml b/src/plugins/apache.sml index c97b9a3..20bd7ed 100644 --- a/src/plugins/apache.sml +++ b/src/plugins/apache.sml @@ -1,6 +1,6 @@ (* HCoop Domtool (http://hcoop.sourceforge.net/) * Copyright (c) 2006-2009, Adam Chlipala - * Copyright (c) 2013 Clinton Ebadi + * Copyright (c) 2013,2014,2015,2017,2018,2019 Clinton Ebadi * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -39,24 +39,28 @@ val _ = Env.registerFunction ("web_node_to_node", | _ => NONE) fun webPlace (EApp ((EVar "web_place_default", _), (EString node, _)), _) = - SOME (node, Domain.nodeIp node) - | webPlace (EApp ((EApp ((EVar "web_place", _), (EString node, _)), _), (EString ip, _)), _) = - SOME (node, ip) + SOME (node, Domain.nodeIp node, Domain.nodeIpv6 node) + | webPlace (EApp ((EApp ((EApp ((EVar "web_place", _), (EString node, _)), _), (EString ip, _)), _), (EString ipv6, _)), _) = + SOME (node, ip, ipv6) | webPlace _ = NONE fun webPlaceDefault node = (EApp ((EVar "web_place_default", dl), (EString node, dl)), dl) val _ = Env.registerFunction ("web_place_to_web_node", - fn [e] => Option.map (fn (node, _) => (EString node, dl)) (webPlace e) + fn [e] => Option.map (fn (node, _, _) => (EString node, dl)) (webPlace e) | _ => NONE) val _ = Env.registerFunction ("web_place_to_node", - fn [e] => Option.map (fn (node, _) => (EString node, dl)) (webPlace e) + fn [e] => Option.map (fn (node, _, _) => (EString node, dl)) (webPlace e) | _ => NONE) val _ = Env.registerFunction ("web_place_to_ip", - fn [e] => Option.map (fn (_, ip) => (EString ip, dl)) (webPlace e) - | _ => NONE) + fn [e] => Option.map (fn (_, ip, _) => (EString ip, dl)) (webPlace e) + | _ => NONE) + +val _ = Env.registerFunction ("web_place_to_ipv6", + fn [e] => Option.map (fn (_, _, ipv6) => (EString ipv6, dl)) (webPlace e) + | _ => NONE) val _ = Env.type_one "proxy_port" Env.int @@ -93,7 +97,8 @@ val _ = Env.type_one "proxy_reverse_target" val _ = Env.type_one "rewrite_arg" Env.string - (CharVector.all Char.isAlphaNum) + (* #":" is permitted here, but really ought to be disallowed or escaped for E=VAR:VAL *) + (CharVector.all (fn ch => (Char.isGraph ch) andalso not (List.exists (fn c => ch = c) [ #"[", #"]", #",", #"\"", #"'", #"=", #"\\" ]))) val _ = Env.type_one "suexec_flag" Env.bool @@ -378,7 +383,7 @@ val () = Slave.registerFileHandler (fn fs => Slave.moveDirCreate {from = backupLogs (), to = rld} end - + | _ => (ignore (OS.Process.system (Config.cp ^ " " @@ -466,8 +471,8 @@ fun vhostPost () = (!post (); write "\n"; app (TextIO.closeOut o #2) (!vhostFiles)) -val php_version = fn (EVar "php5", _) => SOME 5 - | (EVar "fast_php", _) => SOME 6 +val php_version = fn (EVar "php56", _) => SOME 56 + | (EVar "php72", _) => SOME 72 | _ => NONE fun vhostBody (env, makeFullHost) = @@ -494,7 +499,7 @@ fun vhostBody (env, makeFullHost) = localRewriteEnabled := false; expiresEnabled := false; localExpiresEnabled := false; - vhostFiles := map (fn (node, ip) => + vhostFiles := map (fn (node, ip, ipv6) => let val file = Domain.domainFile {node = node, name = confFile} @@ -504,11 +509,21 @@ fun vhostBody (env, makeFullHost) = TextIO.output (file, "# Owner: "); TextIO.output (file, user); TextIO.output (file, "\n "443" | NONE => "80"); + + TextIO.output (file, " ["); + TextIO.output (file, ipv6); + TextIO.output (file, "]"); + TextIO.output (file, ":"); + TextIO.output (file, case ssl of + SOME _ => "443" + | NONE => "80"); + TextIO.output (file, ">\n"); TextIO.output (file, "\tErrorLog "); TextIO.output (file, ld); @@ -532,15 +547,7 @@ fun vhostBody (env, makeFullHost) = (TextIO.output (file, "\n\tSuexecUserGroup "); TextIO.output (file, user); TextIO.output (file, " "); - TextIO.output (file, group); - (* suPHP is no longer used for fastcgi php and php 7.x *) - (if php < 6 then - (TextIO.output (file, "\n\tsuPHP_UserGroup "); - TextIO.output (file, user); - TextIO.output (file, " "); - TextIO.output (file, group)) - else - ())) + TextIO.output (file, group)) else (); @@ -556,26 +563,18 @@ fun vhostBody (env, makeFullHost) = TextIO.output (file, user); TextIO.output (file, "/DAVLock"); - if php = Config.Apache.defaultPhpVersion - then - () - else if php = 6 - then - (* fastcgi php 5.6 since 6 doesn't exist *) - (TextIO.output (file, "\n\tAddHandler fcgid-script .php .phtml"); - (* FIXME: only set kerberos wrapper of waklog is on *) - map (fn ext => (TextIO.output (file, "\n\tFcgidWrapper \""); - TextIO.output (file, Config.Apache.fastCgiWrapperOf user); - TextIO.output (file, " "); - TextIO.output (file, Config.Apache.phpFastCgiWrapper); - TextIO.output (file, "\" "); - TextIO.output (file, ext))) - [".php", ".phtml"]; - ()) - else - (TextIO.output (file, "\n\tAddHandler x-httpd-php"); - TextIO.output (file, Int.toString php); - TextIO.output (file, " .php .phtml")); + TextIO.output (file, "\n\tAddHandler fcgid-script .php .phtml"); + map (fn ext => (TextIO.output (file, "\n\tFcgidWrapper \""); + (* kerberos wrapper, simulates waklog+mod_cgi *) + if isWaklog node then + (TextIO.output (file, Config.Apache.fastCgiWrapperOf user); + TextIO.output (file, " ")) + else + (); + TextIO.output (file, Config.Apache.phpFastCgiWrapper php); + TextIO.output (file, "\" "); + TextIO.output (file, ext))) + [".php", ".phtml"]; (ld, file) end) places; @@ -591,7 +590,7 @@ fun vhostBody (env, makeFullHost) = write "\n"; !pre {user = user, nodes = map #1 places, id = vhostId, hostname = fullHost}; app (fn dom => !aliaser (makeFullHost dom)) (Domain.currentAliasDomains ()) - end + end val () = Env.containerV_one "vhost" ("host", Env.string) @@ -817,6 +816,7 @@ val () = Env.action_two "fastScriptAlias" write "\tSetHandler fcgid-script\n"; (* FIXME: only set kerberos wrapper of waklog is on *) + (* won't be trivial, since we don't have access to node here *) write "\tFcgidWrapper \""; write (Config.Apache.fastCgiWrapperOf (Domain.getUser ())); write " "; @@ -846,7 +846,7 @@ val () = Env.action_two "errorDocument" maybeQuote (); write "\n" end) - + val () = Env.action_one "options" ("options", Env.list apache_option) (fn opts => @@ -887,6 +887,13 @@ val () = Env.action_one "directoryIndex" app (fn opt => (write " "; write opt)) opts; write "\n")) +val () = Env.action_one "directorySlash" + ("enable", Env.bool) + (fn enable => + (write "\tDirectorySlash "; + if enable then write "On" else write "Off"; + write "\n")) + val () = Env.action_one "serverAliasHost" ("host", Env.string) (fn host => @@ -936,8 +943,8 @@ val () = Env.action_one "authType" write ty; write "\n"; case ty of - "kerberos" => - write "\tKrbServiceName apache2\n\tKrb5Keytab /etc/keytabs/service/apache\n\tKrbMethodNegotiate on\n\tKrbMethodK5Passwd on\n\tKrbVerifyKDC on\n\tKrbAuthRealms HCOOP.NET\n\tKrbSaveCredentials on\n" + "kerberos" => + write "\tKrbServiceName HTTP\n\tKrb5Keytab /etc/keytabs/service/apache\n\tKrbMethodNegotiate on\n\tKrbMethodK5Passwd on\n\tKrbVerifyKDC on\n\tKrbAuthRealms HCOOP.NET\n\tKrbSaveCredentials on\n" | _ => ()) else print "WARNING: Skipped Kerberos authType because this isn't an SSL vhost.\n") @@ -1147,6 +1154,34 @@ val () = Env.action_two "setEnv" | ch => str ch) value); write "\"\n")) +val () = Env.action_three "setEnvIf" + ("attribute", Env.string, "match", Env.string, "env_variables", Env.list Env.string) + (fn (attribute, match, envs) => + case envs of + [] => (print "WARNING: Skipped setEnvIf, no environment variables provided.\n") + | envs => + (write "\tSetEnvIf\t\""; + write attribute; + write "\"\t\""; + write match; + write "\""; + app (fn env => (write "\t"; write env)) envs; + write "\n")) + +val () = Env.action_three "setEnvIfNoCase" + ("attribute", Env.string, "match", Env.string, "env_variables", Env.list Env.string) + (fn (attribute, match, envs) => + case envs of + [] => (print "WARNING: Skipped setEnvIfNoCase, no environment variables provided.\n") + | envs => + (write "\tSetEnvIfNoCase\t\""; + write attribute; + write "\"\t\""; + write match; + write "\""; + app (fn env => (write "\t"; write env)) envs; + write "\n")) + val () = Env.action_one "diskCache" ("path", Env.string) (fn path => (write "\tCacheEnable disk \""; @@ -1155,20 +1190,14 @@ val () = Env.action_one "diskCache" val () = Env.action_one "phpVersion" ("version", php_version) - (fn version => (if version = 6 - then - (* fastcgi php 5.6 since 6 doesn't exist *) - (write "\tAddHandler fcgid-script .php .phtml\n"; + (fn version => (write "\tAddHandler fcgid-script .php .phtml\n"; (* FIXME: only set kerberos wrapper of waklog is on *) + (* won't be trivial, since we don't have access to node here *) write "\n\tFcgidWrapper \""; write (Config.Apache.fastCgiWrapperOf (Domain.getUser ())); write " "; - write Config.Apache.phpFastCgiWrapper; - write "\" .php .phtml\n") - else - (write "\tAddHandler x-httpd-php"; - write (Int.toString version); - write " .php .phtml\n"))) + write (Config.Apache.phpFastCgiWrapper version); + write "\" .php .phtml\n")) val () = Env.action_two "addType" ("mime type", Env.string, "extension", Env.string)