aboutsummaryrefslogtreecommitdiffstats
path: root/modules/apache
diff options
context:
space:
mode:
Diffstat (limited to 'modules/apache')
-rw-r--r--modules/apache/manifests/base.pp37
-rw-r--r--modules/apache/manifests/config.pp6
-rw-r--r--modules/apache/manifests/cve-2011-3192.pp9
-rw-r--r--modules/apache/manifests/init.pp163
-rw-r--r--modules/apache/manifests/mod/fastcgi.pp5
-rw-r--r--modules/apache/manifests/mod/fcgid.pp11
-rw-r--r--modules/apache/manifests/mod/geoip.pp4
-rw-r--r--modules/apache/manifests/mod/perl.pp4
-rw-r--r--modules/apache/manifests/mod/php.pp10
-rw-r--r--modules/apache/manifests/mod/proxy.pp4
-rw-r--r--modules/apache/manifests/mod/public_html.pp4
-rw-r--r--modules/apache/manifests/mod/ssl.pp20
-rw-r--r--modules/apache/manifests/mod/wsgi.pp12
-rw-r--r--modules/apache/manifests/var.pp12
-rw-r--r--modules/apache/manifests/vhost/base.pp50
-rw-r--r--modules/apache/manifests/vhost/catalyst_app.pp24
-rw-r--r--modules/apache/manifests/vhost/django_app.pp22
-rw-r--r--modules/apache/manifests/vhost/other_app.pp6
-rw-r--r--modules/apache/manifests/vhost/redirect_ssl.pp6
-rw-r--r--modules/apache/manifests/vhost/reverse_proxy.pp11
-rw-r--r--modules/apache/manifests/vhost/wsgi.pp10
-rw-r--r--modules/apache/manifests/webapp_other.pp7
-rw-r--r--modules/apache/templates/00_default_vhosts.conf10
-rw-r--r--modules/apache/templates/01_default_ssl_vhost.conf169
-rw-r--r--modules/apache/templates/50_mod_deflate.conf36
-rw-r--r--modules/apache/templates/CVE-2011-3192.conf12
-rw-r--r--modules/apache/templates/customization.conf1
-rw-r--r--modules/apache/templates/django.wsgi13
-rw-r--r--modules/apache/templates/logrotate23
-rw-r--r--modules/apache/templates/mod/php.conf5
-rw-r--r--modules/apache/templates/mod/ssl_vhost.conf1
-rw-r--r--modules/apache/templates/mod/wsgi.conf12
-rw-r--r--modules/apache/templates/no_hidden_file_dir.conf4
-rw-r--r--modules/apache/templates/urlescape9
-rw-r--r--modules/apache/templates/vhost_base.conf53
-rw-r--r--modules/apache/templates/vhost_catalyst_app.conf30
-rw-r--r--modules/apache/templates/vhost_django_app.conf13
-rw-r--r--modules/apache/templates/vhost_fcgid.conf6
-rw-r--r--modules/apache/templates/vhost_fcgid_norobot.conf45
-rw-r--r--modules/apache/templates/vhost_redirect.conf2
-rw-r--r--modules/apache/templates/vhost_reverse_proxy.conf15
-rw-r--r--modules/apache/templates/vhost_simple.conf14
-rw-r--r--modules/apache/templates/vhost_ssl.conf13
-rw-r--r--modules/apache/templates/vhost_ssl_redirect.conf5
-rw-r--r--modules/apache/templates/vhost_wsgi.conf3
45 files changed, 734 insertions, 197 deletions
diff --git a/modules/apache/manifests/base.pp b/modules/apache/manifests/base.pp
new file mode 100644
index 00000000..4e1d6ed4
--- /dev/null
+++ b/modules/apache/manifests/base.pp
@@ -0,0 +1,37 @@
+class apache::base {
+ include apache::var
+
+ $conf_d = '/etc/httpd/conf/conf.d'
+
+ package { 'apache':
+ alias => 'apache-server',
+ }
+
+ service { 'httpd':
+ alias => 'apache',
+ subscribe => [ Package['apache-server'] ],
+ }
+
+ exec { 'apachectl configtest':
+ refreshonly => true,
+ notify => Service['apache'],
+ }
+
+ apache::config {
+ "${conf_d}/no_hidden_file_dir.conf":
+ content => template('apache/no_hidden_file_dir.conf'),
+ require => Package[$apache::var::pkg_conf];
+ "${conf_d}/customization.conf":
+ content => template('apache/customization.conf'),
+ require => Package[$apache::var::pkg_conf];
+ '/etc/httpd/conf/vhosts.d/00_default_vhosts.conf':
+ content => template('apache/00_default_vhosts.conf'),
+ require => Package[$apache::var::pkg_conf];
+ '/etc/httpd/conf/modules.d/50_mod_deflate.conf':
+ content => template('apache/50_mod_deflate.conf');
+ }
+
+ file { '/etc/logrotate.d/httpd':
+ content => template('apache/logrotate')
+ }
+}
diff --git a/modules/apache/manifests/config.pp b/modules/apache/manifests/config.pp
new file mode 100644
index 00000000..0ff0962c
--- /dev/null
+++ b/modules/apache/manifests/config.pp
@@ -0,0 +1,6 @@
+define apache::config($content) {
+ file { $name:
+ content => $content,
+ notify => Exec['apachectl configtest'],
+ }
+}
diff --git a/modules/apache/manifests/cve-2011-3192.pp b/modules/apache/manifests/cve-2011-3192.pp
new file mode 100644
index 00000000..1e39ac04
--- /dev/null
+++ b/modules/apache/manifests/cve-2011-3192.pp
@@ -0,0 +1,9 @@
+class apache::cve-2011-3192 {
+ include apache::base
+ # temporary protection against CVE-2011-3192
+ # https://httpd.apache.org/security/CVE-2011-3192.txt
+ apache::config {
+ "${apache::base::conf_d}/CVE-2011-3192.conf":
+ content => template('apache/CVE-2011-3192.conf'),
+ }
+}
diff --git a/modules/apache/manifests/init.pp b/modules/apache/manifests/init.pp
index e8f7a575..40779d4d 100644
--- a/modules/apache/manifests/init.pp
+++ b/modules/apache/manifests/init.pp
@@ -1,156 +1,25 @@
class apache {
-
- class base {
- package { "apache-mpm-prefork":
- alias => apache,
- ensure => installed
- }
-
- service { httpd:
- alias => apache,
- ensure => running,
- subscribe => [ Package['apache-mpm-prefork'] ],
- }
-
- file { "customization.conf":
- ensure => present,
- path => "/etc/httpd/conf.d/customization.conf",
- content => template("apache/customization.conf"),
- require => Package["apache"],
- notify => Service["apache"],
- owner => root,
- group => root,
- mode => 644,
- }
-
- file { "00_default_vhosts.conf":
- path => "/etc/httpd/conf/vhosts.d/00_default_vhosts.conf",
- ensure => "present",
- owner => root,
- group => root,
- mode => 644,
- notify => Service['apache'],
- content => template("apache/00_default_vhosts.conf")
- }
- }
-
- class mod_php inherits base {
- package { "apache-mod_php":
- ensure => installed
- }
- }
-
- class mod_perl inherits base {
- package { "apache-mod_perl":
- ensure => installed
- }
- }
-
- class mod_fcgid inherits base {
- package { "apache-mod_fcgid":
- ensure => installed
- }
- }
-
- class mod_fastcgi inherits base {
- package { "apache-mod_fastcgi":
- ensure => installed
- }
- }
-
- class mod_ssl inherits base {
- package { "apache-mod_ssl":
- ensure => installed
- }
- }
-
- class mod_wsgi inherits base {
- package { "apache-mod_wsgi":
- ensure => installed
- }
-
- file { "/usr/local/lib/wsgi":
- ensure => directory,
- owner => root,
- group => root,
- mode => 644,
+ define vhost_simple($location) {
+ include apache::base
+ apache::vhost::base { $name:
+ location => $location,
}
- }
-
- define vhost_redirect_ssl() {
- file { "redirect_ssl_$name.conf":
- path => "/etc/httpd/conf/vhosts.d/redirect_ssl_$name.conf",
- ensure => "present",
- owner => root,
- group => root,
- mode => 644,
- notify => Service['apache'],
- content => template("apache/vhost_ssl_redirect.conf")
+ apache::vhost::base { "ssl_${name}":
+ vhost => $name,
+ use_ssl => true,
+ location => $location,
}
}
- define vhost_catalyst_app($script, $location = '', $process = 4, $use_ssl = false) {
-
- include apache::mod_fastcgi
-
- file { "$name.conf":
- path => "/etc/httpd/conf/vhosts.d/$name.conf",
- ensure => "present",
- owner => root,
- group => root,
- mode => 644,
- notify => Service['apache'],
- content => template("apache/vhost_catalyst_app.conf")
+ define vhost_redirect($url,
+ $vhost = false,
+ $use_ssl = false) {
+ include apache::base
+ apache::vhost::base { $name:
+ use_ssl => $use_ssl,
+ vhost => $vhost,
+ content => template("apache/vhost_redirect.conf"),
}
}
- define vhost_django_app($module, $module_path = '/usr/share') {
- include apache::mod_wsgi
-
- file { "$name.conf":
- path => "/etc/httpd/conf/vhosts.d/$name.conf",
- ensure => "present",
- owner => root,
- group => root,
- mode => 644,
- notify => Service['apache'],
- content => template("apache/vhost_django_app.conf")
- }
-
- # fichier django wsgi
- file { "$name.wsgi":
- path => "/usr/local/lib/wsgi/$name.wsgi",
- ensure => "present",
- owner => root,
- group => root,
- mode => 755,
- notify => Service['apache'],
- content => template("apache/django.wsgi")
- }
- }
-
- define vhost_other_app($vhost_file) {
- file { "$name.conf":
- path => "/etc/httpd/conf/vhosts.d/$name.conf",
- ensure => "present",
- owner => root,
- group => root,
- mode => 644,
- notify => Service['apache'],
- content => template($vhost_file)
- }
- }
-
- define webapp_other($webapp_file) {
- $webappname = $name
- file { "webapp_$name.conf":
- path => "/etc/httpd/conf/webapps.d/$webappname.conf",
- ensure => "present",
- owner => root,
- group => root,
- mode => 644,
- notify => Service['apache'],
- content => template($webapp_file)
- }
- }
}
diff --git a/modules/apache/manifests/mod/fastcgi.pp b/modules/apache/manifests/mod/fastcgi.pp
new file mode 100644
index 00000000..2b421291
--- /dev/null
+++ b/modules/apache/manifests/mod/fastcgi.pp
@@ -0,0 +1,5 @@
+class apache::mod::fastcgi {
+ include apache::base
+ package { 'apache-mod_fastcgi': }
+}
+
diff --git a/modules/apache/manifests/mod/fcgid.pp b/modules/apache/manifests/mod/fcgid.pp
new file mode 100644
index 00000000..b8186a64
--- /dev/null
+++ b/modules/apache/manifests/mod/fcgid.pp
@@ -0,0 +1,11 @@
+class apache::mod::fcgid {
+ include apache::base
+ package { 'apache-mod_fcgid': }
+
+ file { 'urlescape':
+ path => '/usr/local/bin/urlescape',
+ mode => '0755',
+ notify => Service['apache'],
+ content => template('apache/urlescape'),
+ }
+}
diff --git a/modules/apache/manifests/mod/geoip.pp b/modules/apache/manifests/mod/geoip.pp
new file mode 100644
index 00000000..7f5516bc
--- /dev/null
+++ b/modules/apache/manifests/mod/geoip.pp
@@ -0,0 +1,4 @@
+class apache::mod::geoip {
+ include apache::base
+ package { 'apache-mod_geoip': }
+}
diff --git a/modules/apache/manifests/mod/perl.pp b/modules/apache/manifests/mod/perl.pp
new file mode 100644
index 00000000..2c52bf50
--- /dev/null
+++ b/modules/apache/manifests/mod/perl.pp
@@ -0,0 +1,4 @@
+class apache::mod::perl {
+ include apache::base
+ package { 'apache-mod_perl': }
+}
diff --git a/modules/apache/manifests/mod/php.pp b/modules/apache/manifests/mod/php.pp
new file mode 100644
index 00000000..2c8d6733
--- /dev/null
+++ b/modules/apache/manifests/mod/php.pp
@@ -0,0 +1,10 @@
+class apache::mod::php {
+ include apache::base
+ $php_date_timezone = 'UTC'
+
+ package { 'apache-mod_php': }
+
+ apache::config { "${apache::base::conf_d}/mod_php.conf":
+ content => template('apache/mod/php.conf'),
+ }
+}
diff --git a/modules/apache/manifests/mod/proxy.pp b/modules/apache/manifests/mod/proxy.pp
new file mode 100644
index 00000000..80180d62
--- /dev/null
+++ b/modules/apache/manifests/mod/proxy.pp
@@ -0,0 +1,4 @@
+class apache::mod::proxy {
+ include apache::base
+ package { 'apache-mod_proxy': }
+}
diff --git a/modules/apache/manifests/mod/public_html.pp b/modules/apache/manifests/mod/public_html.pp
new file mode 100644
index 00000000..b5691b53
--- /dev/null
+++ b/modules/apache/manifests/mod/public_html.pp
@@ -0,0 +1,4 @@
+class apache::mod::public_html {
+ include apache::base
+ package { 'apache-mod_public_html': }
+}
diff --git a/modules/apache/manifests/mod/ssl.pp b/modules/apache/manifests/mod/ssl.pp
new file mode 100644
index 00000000..ab3d24e4
--- /dev/null
+++ b/modules/apache/manifests/mod/ssl.pp
@@ -0,0 +1,20 @@
+class apache::mod::ssl {
+ include apache::base
+ file { '/etc/ssl/apache/':
+ ensure => directory
+ }
+
+ openssl::self_signed_cert{ 'localhost':
+ directory => '/etc/ssl/apache/',
+ before => Apache::Config['/etc/httpd/conf/vhosts.d/01_default_ssl_vhost.conf'],
+ }
+
+ package { 'apache-mod_ssl': }
+
+ apache::config {
+ '/etc/httpd/conf/vhosts.d/01_default_ssl_vhost.conf':
+ content => template('apache/01_default_ssl_vhost.conf');
+ "${apache::base::conf_d}/ssl_vhost.conf":
+ content => template('apache/mod/ssl_vhost.conf');
+ }
+}
diff --git a/modules/apache/manifests/mod/wsgi.pp b/modules/apache/manifests/mod/wsgi.pp
new file mode 100644
index 00000000..7f4fb719
--- /dev/null
+++ b/modules/apache/manifests/mod/wsgi.pp
@@ -0,0 +1,12 @@
+class apache::mod::wsgi {
+ include apache::base
+ package { 'apache-mod_wsgi': }
+
+ file { '/usr/local/lib/wsgi':
+ ensure => directory,
+ }
+
+ apache::config { "${apache::base::conf_d}/mod_wsgi.conf":
+ content => template('apache/mod/wsgi.conf'),
+ }
+}
diff --git a/modules/apache/manifests/var.pp b/modules/apache/manifests/var.pp
new file mode 100644
index 00000000..4a6d68eb
--- /dev/null
+++ b/modules/apache/manifests/var.pp
@@ -0,0 +1,12 @@
+# $httpdlogs_rotate:
+# number of time the log file are rotated before being removed
+# $default_vhost_redirect:
+# URL to redirect to in case of unknown vhost
+class apache::var(
+ $httpdlogs_rotate = '24',
+ $apache_user = 'apache',
+ $apache_group = 'apache',
+ $default_vhost_redirect = ''
+) {
+ $pkg_conf = 'apache'
+}
diff --git a/modules/apache/manifests/vhost/base.pp b/modules/apache/manifests/vhost/base.pp
new file mode 100644
index 00000000..27a19998
--- /dev/null
+++ b/modules/apache/manifests/vhost/base.pp
@@ -0,0 +1,50 @@
+define apache::vhost::base ($content = '',
+ $location = '/dev/null',
+ $use_ssl = false,
+ $vhost = false,
+ $aliases = {},
+ $server_aliases = [],
+ $access_logfile = false,
+ $error_logfile = false,
+ $options = [],
+ $enable_public_html = false,
+ $enable_location = true) {
+ include apache::base
+ $httpd_logdir = '/var/log/httpd'
+ $filename = "${name}.conf"
+
+ if ! $vhost {
+ $real_vhost = $name
+ } else {
+ $real_vhost = $vhost
+ }
+
+ if ! $access_logfile {
+ $real_access_logfile = "${httpd_logdir}/${real_vhost}-access_log"
+ } else {
+ $real_access_logfile = $access_logfile
+ }
+ if ! $error_logfile {
+ $real_error_logfile = "${httpd_logdir}/${real_vhost}-error_log"
+ } else {
+ $real_error_logfile = $error_logfile
+ }
+
+ if $use_ssl {
+ include apache::mod::ssl
+ if $wildcard_sslcert != true {
+ openssl::self_signed_cert{ $real_vhost:
+ directory => '/etc/ssl/apache/',
+ before => Apache::Config["/etc/httpd/conf/vhosts.d/${filename}"],
+ }
+ }
+ }
+
+ if $enable_public_html {
+ include apache::mod::public_html
+ }
+
+ apache::config { "/etc/httpd/conf/vhosts.d/${filename}":
+ content => template('apache/vhost_base.conf')
+ }
+}
diff --git a/modules/apache/manifests/vhost/catalyst_app.pp b/modules/apache/manifests/vhost/catalyst_app.pp
new file mode 100644
index 00000000..1ce40747
--- /dev/null
+++ b/modules/apache/manifests/vhost/catalyst_app.pp
@@ -0,0 +1,24 @@
+define apache::vhost::catalyst_app( $script,
+ $location = '',
+ $process = 4,
+ $use_ssl = false,
+ $aliases = {},
+ $vhost = false) {
+ include apache::mod::fcgid
+ if ($location) {
+ $aliases['/static'] = "${location}/root/static"
+ }
+
+ $script_aliases = {
+ '/' => "$script/",
+ }
+
+ apache::vhost::base { $name:
+ vhost => $vhost,
+ use_ssl => $use_ssl,
+ content => template('apache/vhost_fcgid.conf'),
+ aliases => $aliases,
+ }
+}
+
+
diff --git a/modules/apache/manifests/vhost/django_app.pp b/modules/apache/manifests/vhost/django_app.pp
new file mode 100644
index 00000000..91974acd
--- /dev/null
+++ b/modules/apache/manifests/vhost/django_app.pp
@@ -0,0 +1,22 @@
+define apache::vhost::django_app ($module = false,
+ $module_path = false,
+ $use_ssl = false,
+ $aliases= {}) {
+ include apache::mod::wsgi
+ apache::vhost::base { $name:
+ use_ssl => $use_ssl,
+ content => template('apache/vhost_django_app.conf'),
+ aliases => $aliases,
+ }
+
+ # module is a ruby reserved keyword, cannot be used in templates
+ $django_module = $module
+ file { "${name}.wsgi":
+ path => "/usr/local/lib/wsgi/${name}.wsgi",
+ mode => '0755',
+ notify => Service['apache'],
+ content => template('apache/django.wsgi'),
+ }
+}
+
+
diff --git a/modules/apache/manifests/vhost/other_app.pp b/modules/apache/manifests/vhost/other_app.pp
new file mode 100644
index 00000000..f5a71574
--- /dev/null
+++ b/modules/apache/manifests/vhost/other_app.pp
@@ -0,0 +1,6 @@
+define apache::vhost::other_app($vhost_file) {
+ include apache::base
+ apache::config { "/etc/httpd/conf/vhosts.d/${name}.conf":
+ content => template($vhost_file),
+ }
+}
diff --git a/modules/apache/manifests/vhost/redirect_ssl.pp b/modules/apache/manifests/vhost/redirect_ssl.pp
new file mode 100644
index 00000000..22a4d4f6
--- /dev/null
+++ b/modules/apache/manifests/vhost/redirect_ssl.pp
@@ -0,0 +1,6 @@
+define apache::vhost::redirect_ssl() {
+ apache::vhost::base { "redirect_ssl_${name}":
+ vhost => $name,
+ content => template('apache/vhost_ssl_redirect.conf')
+ }
+}
diff --git a/modules/apache/manifests/vhost/reverse_proxy.pp b/modules/apache/manifests/vhost/reverse_proxy.pp
new file mode 100644
index 00000000..a32aaff0
--- /dev/null
+++ b/modules/apache/manifests/vhost/reverse_proxy.pp
@@ -0,0 +1,11 @@
+define apache::vhost::reverse_proxy($url,
+ $vhost = false,
+ $use_ssl = false,
+ $content = '') {
+ include apache::mod::proxy
+ apache::vhost::base { $name:
+ use_ssl => $use_ssl,
+ vhost => $vhost,
+ content => template('apache/vhost_reverse_proxy.conf')
+ }
+}
diff --git a/modules/apache/manifests/vhost/wsgi.pp b/modules/apache/manifests/vhost/wsgi.pp
new file mode 100644
index 00000000..291c6d71
--- /dev/null
+++ b/modules/apache/manifests/vhost/wsgi.pp
@@ -0,0 +1,10 @@
+define apache::vhost::wsgi ($wsgi_path,
+ $aliases = {},
+ $server_aliases = []) {
+ include apache::mod::wsgi
+ apache::vhost::base { $name:
+ aliases => $aliases,
+ server_aliases => $server_aliases,
+ content => template('apache/vhost_wsgi.conf'),
+ }
+}
diff --git a/modules/apache/manifests/webapp_other.pp b/modules/apache/manifests/webapp_other.pp
new file mode 100644
index 00000000..147a2370
--- /dev/null
+++ b/modules/apache/manifests/webapp_other.pp
@@ -0,0 +1,7 @@
+define apache::webapp_other($webapp_file) {
+ include apache::base
+ $webappname = $name
+ apache::config { "/etc/httpd/conf/webapps.d/${webappname}.conf":
+ content => template($webapp_file),
+ }
+}
diff --git a/modules/apache/templates/00_default_vhosts.conf b/modules/apache/templates/00_default_vhosts.conf
index 25f59b5e..9a5f586c 100644
--- a/modules/apache/templates/00_default_vhosts.conf
+++ b/modules/apache/templates/00_default_vhosts.conf
@@ -3,5 +3,13 @@
<Location />
Allow from all
</Location>
- Redirect / http://www.<%= domain %>/
+ <%-
+ default_redirect = scope.lookupvar('apache::var::default_vhost_redirect')
+ if default_redirect == ''
+ -%>
+ Redirect 404 /
+ ErrorDocument 404 "Page Not Found"
+ <%- else -%>
+ Redirect / <%= default_redirect %>
+ <%- end -%>
</VirtualHost>
diff --git a/modules/apache/templates/01_default_ssl_vhost.conf b/modules/apache/templates/01_default_ssl_vhost.conf
new file mode 100644
index 00000000..323bf145
--- /dev/null
+++ b/modules/apache/templates/01_default_ssl_vhost.conf
@@ -0,0 +1,169 @@
+<IfDefine HAVE_SSL>
+ <IfModule !mod_ssl.c>
+ LoadModule ssl_module modules/mod_ssl.so
+ </IfModule>
+</IfDefine>
+
+<IfModule mod_ssl.c>
+
+##
+## SSL Virtual Host Context
+##
+
+<VirtualHost _default_:443>
+
+# General setup for the virtual host
+DocumentRoot "/var/www/html"
+#ServerName localhost:443
+ServerAdmin root@<%= @domain %>
+ErrorLog logs/ssl_error_log
+
+<IfModule mod_log_config.c>
+ TransferLog logs/ssl_access_log
+</IfModule>
+
+# SSL Engine Switch:
+# Enable/Disable SSL for this virtual host.
+SSLEngine on
+
+# SSL Cipher Suite:
+# List the ciphers that the client is permitted to negotiate.
+# See the mod_ssl documentation for a complete list.
+SSLHonorCipherOrder On
+SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
+
+
+# SSL Protocol support:
+# List the enable protocol levels with which clients will be able to
+# connect. Disable SSLv2/v3 access by default:
+SSLProtocol ALL -SSLv2 -SSLv3
+
+<%- if @wildcard_sslcert == 'true' then -%>
+SSLCertificateFile /etc/ssl/wildcard.<%= @domain %>.crt
+SSLCertificateKeyFile /etc/ssl/wildcard.<%= @domain %>.key
+SSLCACertificateFile /etc/ssl/wildcard.<%= @domain %>.pem
+SSLVerifyClient None
+<%- else -%>
+SSLCertificateFile /etc/ssl/apache/localhost.pem
+SSLCertificateKeyFile /etc/ssl/apache/localhost.pem
+#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
+#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
+<%- end -%>
+
+# Certificate Revocation Lists (CRL):
+# Set the CA revocation path where to find CA CRLs for client
+# authentication or alternatively one huge file containing all
+# of them (file must be PEM encoded)
+# Note: Inside SSLCARevocationPath you need hash symlinks
+# to point to the certificate files. Use the provided
+# Makefile to update the hash symlinks after changes.
+#SSLCARevocationPath /etc/pki/tls/certs/ssl.crl
+#SSLCARevocationFile /etc/pki/tls/certs/ca-bundle.crl
+
+# Client Authentication (Type):
+# Client certificate verification type and depth. Types are
+# none, optional, require and optional_no_ca. Depth is a
+# number which specifies how deeply to verify the certificate
+# issuer chain before deciding the certificate is not valid.
+#SSLVerifyClient require
+#SSLVerifyDepth 10
+
+# Access Control:
+# With SSLRequire you can do per-directory access control based
+# on arbitrary complex boolean expressions containing server
+# variable checks and other lookup directives. The syntax is a
+# mixture between C and Perl. See the mod_ssl documentation
+# for more details.
+#<Location />
+#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
+# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
+# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
+# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
+# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \
+# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/
+#</Location>
+
+# SSL Engine Options:
+# Set various options for the SSL engine.
+# o FakeBasicAuth:
+# Translate the client X.509 into a Basic Authorisation. This means that
+# the standard Auth/DBMAuth methods can be used for access control. The
+# user name is the `one line' version of the client's X.509 certificate.
+# Note that no password is obtained from the user. Every entry in the user
+# file needs this password: `xxj31ZMTZzkVA'.
+# o ExportCertData:
+# This exports two additional environment variables: SSL_CLIENT_CERT and
+# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
+# server (always existing) and the client (only existing when client
+# authentication is used). This can be used to import the certificates
+# into CGI scripts.
+# o StdEnvVars:
+# This exports the standard SSL/TLS related `SSL_*' environment variables.
+# Per default this exportation is switched off for performance reasons,
+# because the extraction step is an expensive operation and is usually
+# useless for serving static content. So one usually enables the
+# exportation for CGI and SSI requests only.
+# o StrictRequire:
+# This denies access when "SSLRequireSSL" or "SSLRequire" applied even
+# under a "Satisfy any" situation, i.e. when it applies access is denied
+# and no other module can change it.
+# o OptRenegotiate:
+# This enables optimized SSL connection renegotiation handling when SSL
+# directives are used in per-directory context.
+#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
+
+<FilesMatch "\.(cgi|shtml|phtml|php)$">
+ SSLOptions +StdEnvVars
+</FilesMatch>
+
+<Directory "/var/www/cgi-bin">
+ SSLOptions +StdEnvVars
+</Directory>
+
+# SSL Protocol Adjustments:
+# The safe and default but still SSL/TLS standard compliant shutdown
+# approach is that mod_ssl sends the close notify alert but doesn't wait for
+# the close notify alert from client. When you need a different shutdown
+# approach you can use one of the following variables:
+# o ssl-unclean-shutdown:
+# This forces an unclean shutdown when the connection is closed, i.e. no
+# SSL close notify alert is send or allowed to received. This violates
+# the SSL/TLS standard but is needed for some brain-dead browsers. Use
+# this when you receive I/O errors because of the standard approach where
+# mod_ssl sends the close notify alert.
+# o ssl-accurate-shutdown:
+# This forces an accurate shutdown when the connection is closed, i.e. a
+# SSL close notify alert is send and mod_ssl waits for the close notify
+# alert of the client. This is 100% SSL/TLS standard compliant, but in
+# practice often causes hanging connections with brain-dead browsers. Use
+# this only for browsers where you know that their SSL implementation
+# works correctly.
+# Notice: Most problems of broken clients are also related to the HTTP
+# keep-alive facility, so you usually additionally want to disable
+# keep-alive for those clients, too. Use variable "nokeepalive" for this.
+# Similarly, one has to force some clients to use HTTP/1.0 to workaround
+# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
+# "force-response-1.0" for this.
+
+<IfModule mod_setenvif.c>
+ BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown \
+ downgrade-1.0 force-response-1.0
+</IfModule>
+
+# Per-Server Logging:
+# The home of a custom SSL log file. Use this when you want a
+# compact non-error SSL logfile on a virtual host basis.
+
+<IfModule mod_log_config.c>
+ CustomLog logs/ssl_request_log \
+ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
+</IfModule>
+
+<IfModule mod_rewrite.c>
+ RewriteEngine On
+ RewriteOptions inherit
+</IfModule>
+
+</VirtualHost>
+
+</IfModule>
diff --git a/modules/apache/templates/50_mod_deflate.conf b/modules/apache/templates/50_mod_deflate.conf
new file mode 100644
index 00000000..5192bf6e
--- /dev/null
+++ b/modules/apache/templates/50_mod_deflate.conf
@@ -0,0 +1,36 @@
+<IfModule mod_deflate.c>
+ # Compress HTML, CSS, JavaScript, JSON, Text, XML and fonts
+ AddOutputFilterByType DEFLATE application/javascript
+ AddOutputFilterByType DEFLATE application/json
+ AddOutputFilterByType DEFLATE application/rss+xml
+ AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
+ AddOutputFilterByType DEFLATE application/x-font
+ AddOutputFilterByType DEFLATE application/x-font-opentype
+ AddOutputFilterByType DEFLATE application/x-font-otf
+ AddOutputFilterByType DEFLATE application/x-font-truetype
+ AddOutputFilterByType DEFLATE application/x-font-ttf
+ AddOutputFilterByType DEFLATE application/x-javascript
+ AddOutputFilterByType DEFLATE application/xhtml+xml
+ AddOutputFilterByType DEFLATE application/xml
+ AddOutputFilterByType DEFLATE font/opentype
+ AddOutputFilterByType DEFLATE font/otf
+ AddOutputFilterByType DEFLATE font/ttf
+ AddOutputFilterByType DEFLATE image/svg+xml
+ AddOutputFilterByType DEFLATE image/x-icon
+ AddOutputFilterByType DEFLATE text/css
+ AddOutputFilterByType DEFLATE text/html
+ AddOutputFilterByType DEFLATE text/javascript
+ AddOutputFilterByType DEFLATE text/plain
+ AddOutputFilterByType DEFLATE text/xml
+
+ # Level of compression (9=highest compression level)
+ DeflateCompressionLevel 1
+
+ # Do not compress certain file types
+ SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|heif|heic|webp|mp4|mov|mpg|webm|avi)$ no-gzip dont-vary
+ SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|xz|zst|lzo|lzma|sit|rar|cab|rpm)$ no-gzip dont-vary
+ SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
+
+ # Make sure proxies don't deliver the wrong content
+ Header append Vary User-Agent env=!dont-vary
+</IfModule>
diff --git a/modules/apache/templates/CVE-2011-3192.conf b/modules/apache/templates/CVE-2011-3192.conf
new file mode 100644
index 00000000..25751adc
--- /dev/null
+++ b/modules/apache/templates/CVE-2011-3192.conf
@@ -0,0 +1,12 @@
+ # Drop the Range header when more than 5 ranges.
+ # CVE-2011-3192
+ SetEnvIf Range (?:,.*?){5,5} bad-range=1
+ RequestHeader unset Range env=bad-range
+
+ # We always drop Request-Range; as this is a legacy
+ # dating back to MSIE3 and Netscape 2 and 3.
+ #
+ RequestHeader unset Request-Range
+
+ # optional logging.
+ CustomLog logs/range-CVE-2011-3192.log common env=bad-range
diff --git a/modules/apache/templates/customization.conf b/modules/apache/templates/customization.conf
index 81424c42..41e15e3a 100644
--- a/modules/apache/templates/customization.conf
+++ b/modules/apache/templates/customization.conf
@@ -1,2 +1 @@
NameVirtualHost *:80
-NameVirtualHost *:443
diff --git a/modules/apache/templates/django.wsgi b/modules/apache/templates/django.wsgi
index 90521653..2188e1e7 100644
--- a/modules/apache/templates/django.wsgi
+++ b/modules/apache/templates/django.wsgi
@@ -1,7 +1,16 @@
#!/usr/bin/python
import os, sys
-sys.path.append('<%= module_path %>')
-os.environ['DJANGO_SETTINGS_MODULE'] = '<%= module %>.settings'
+<%- for m in module_path -%>
+path = '<%= m %>'
+if path not in sys.path:
+ sys.path.append(path)
+<%- end -%>
+
+<%- if @django_module -%>
+os.environ['DJANGO_SETTINGS_MODULE'] = '<%= @django_module %>.settings'
+<%- else -%>
+os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
+<%- end -%>
import django.core.handlers.wsgi
diff --git a/modules/apache/templates/logrotate b/modules/apache/templates/logrotate
new file mode 100644
index 00000000..823989eb
--- /dev/null
+++ b/modules/apache/templates/logrotate
@@ -0,0 +1,23 @@
+/var/log/httpd/*_log /var/log/httpd/apache_runtime_status /var/log/httpd/ssl_mutex {
+<% if @hostname == 'duvel' %>
+ rotate 60
+ daily
+<% elsif @hostname == 'friteuse' %>
+ # The virtual disk is very small so keep log sizes down
+ rotate 26
+ weekly
+<% elsif @hostname == 'sucuk' %>
+ rotate 52
+ weekly
+<% else %>
+ rotate <%= scope.lookupvar('apache::var::httpdlogs_rotate') %>
+ monthly
+<% end %>
+ missingok
+ notifempty
+ sharedscripts
+ compress
+ postrotate
+ /bin/systemctl restart httpd.service > /dev/null 2>/dev/null || true
+ endscript
+}
diff --git a/modules/apache/templates/mod/php.conf b/modules/apache/templates/mod/php.conf
new file mode 100644
index 00000000..8bc20078
--- /dev/null
+++ b/modules/apache/templates/mod/php.conf
@@ -0,0 +1,5 @@
+# as php insist to have this value set, let's
+# look on the system for him
+php_value date.timezone "<%= @php_date_timezone %>"
+php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f root@<%= @domain %>"
+
diff --git a/modules/apache/templates/mod/ssl_vhost.conf b/modules/apache/templates/mod/ssl_vhost.conf
new file mode 100644
index 00000000..bcfe8201
--- /dev/null
+++ b/modules/apache/templates/mod/ssl_vhost.conf
@@ -0,0 +1 @@
+NameVirtualHost *:443
diff --git a/modules/apache/templates/mod/wsgi.conf b/modules/apache/templates/mod/wsgi.conf
new file mode 100644
index 00000000..18678bc6
--- /dev/null
+++ b/modules/apache/templates/mod/wsgi.conf
@@ -0,0 +1,12 @@
+# https://code.google.com/p/modwsgi/wiki/ApplicationIssues
+# mainly for viewvc at the moment , when doing a diff
+WSGIRestrictStdout Off
+# again viewvc :
+# mod_wsgi (pid=20083): Callback registration for signal 15 ignored.
+# no bug reported upstream yet :/
+# WSGIRestrictSignal Off
+# reenabled, as this prevent apache from restarting properly
+
+# make sure transifex client work fine, as we need wsgi to pass authorisation
+# header to django ( otherwise, this just show error 401 )
+WSGIPassAuthorization On
diff --git a/modules/apache/templates/no_hidden_file_dir.conf b/modules/apache/templates/no_hidden_file_dir.conf
new file mode 100644
index 00000000..dce78912
--- /dev/null
+++ b/modules/apache/templates/no_hidden_file_dir.conf
@@ -0,0 +1,4 @@
+#
+# dont serve up any hidden files or dirs like .git*, .svn, ...
+#
+RedirectMatch 404 /\..*$
diff --git a/modules/apache/templates/urlescape b/modules/apache/templates/urlescape
new file mode 100644
index 00000000..8feb7fa4
--- /dev/null
+++ b/modules/apache/templates/urlescape
@@ -0,0 +1,9 @@
+#!/usr/bin/python3 -u
+# URL escape each path given on stdin
+import sys
+import urllib.parse
+while True:
+ l = sys.stdin.readline()
+ if not l:
+ break
+ print(urllib.parse.quote(l.rstrip("\n")))
diff --git a/modules/apache/templates/vhost_base.conf b/modules/apache/templates/vhost_base.conf
new file mode 100644
index 00000000..da26b683
--- /dev/null
+++ b/modules/apache/templates/vhost_base.conf
@@ -0,0 +1,53 @@
+<%- if @use_ssl then
+ port = 443
+else
+ port = 80
+end
+-%>
+
+<VirtualHost *:<%= port %>>
+<%- if @use_ssl then -%>
+<%= scope.function_template(["apache/vhost_ssl.conf"]) %>
+<%- end -%>
+ ServerName <%= @real_vhost %>
+<%- @server_aliases.each do |key| -%>
+ ServerAlias <%= key %>
+<%- end -%>
+ DocumentRoot <%= @location %>
+
+ CustomLog <%= @real_access_logfile %> combined
+ ErrorLog <%= @real_error_logfile %>
+
+<%- if @enable_public_html -%>
+ #TODO add the rest
+ UserDir public_html
+<%- else -%>
+<IfModule mod_userdir.c>
+ UserDir disabled
+</IfModule>
+<%- end -%>
+
+<%- @aliases.keys.sort {|a,b| a.size <=> b.size }.reverse.each do |key| -%>
+ Alias <%= key %> <%= @aliases[key] %>
+<%- end -%>
+
+ <%= @content %>
+
+<%- if @options.length > 0 -%>
+ <Directory <%= @location %>>
+ Options <%= @options.join(" ") %>
+ </Directory>
+<%- end -%>
+
+<%- if @enable_location -%>
+ <Location />
+ <IfModule mod_authz_core.c>
+ Require all granted
+ </IfModule>
+ <IfModule !mod_authz_core.c>
+ Allow from all
+ </IfModule>
+ </Location>
+<%- end -%>
+</VirtualHost>
+
diff --git a/modules/apache/templates/vhost_catalyst_app.conf b/modules/apache/templates/vhost_catalyst_app.conf
deleted file mode 100644
index 57867fc4..00000000
--- a/modules/apache/templates/vhost_catalyst_app.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-<% if use_ssl then
- port = 443
-else
- port = 80
-end
-%>
-
-<VirtualHost *:<%= port %>>
-<% if use_ssl then %>
- SSLEngine on
- #TODO deploy SNI later
- SSLCertificateFile /etc/ssl/apache/apache.pem
- SSLCertificateKeyFile /etc/ssl/apache/apache.pem
-<% end %>
- ServerName <%= name %>
- # Serve static content directly
- DocumentRoot /dev/null
-# header
-
-<% if location then %>
- Alias /static <%= location %>/root/static
-<% end %>
- Alias / <%= script %>/
- FastCgiServer <%= script %> -processes <%= process %> -idle-timeout 30
-
- <Location />
- Allow from all
- </Location>
-</VirtualHost>
-
diff --git a/modules/apache/templates/vhost_django_app.conf b/modules/apache/templates/vhost_django_app.conf
index 9d64865f..d85cf7a9 100644
--- a/modules/apache/templates/vhost_django_app.conf
+++ b/modules/apache/templates/vhost_django_app.conf
@@ -1,12 +1 @@
-<VirtualHost *:80>
- ServerName <%= name %>
- # Serve static content directly
- DocumentRoot /dev/null
-
- WSGIScriptAlias / /usr/local/lib/wsgi/<%= name %>.wsgi
-#footer
- <Location />
- Allow from all
- </Location>
-</VirtualHost>
-
+WSGIScriptAlias / /usr/local/lib/wsgi/<%= @name %>.wsgi
diff --git a/modules/apache/templates/vhost_fcgid.conf b/modules/apache/templates/vhost_fcgid.conf
new file mode 100644
index 00000000..fefa4a49
--- /dev/null
+++ b/modules/apache/templates/vhost_fcgid.conf
@@ -0,0 +1,6 @@
+AddHandler fcgid-script .pl
+<%- @script_aliases.keys.sort {|a,b| a.size <=> b.size }.reverse.each do |key| -%>
+ ScriptAlias <%= key %> <%= @script_aliases[key] %>
+<%- end -%>
+FcgidMinProcessesPerClass <%= @process %>
+FcgidIdleTimeout 30
diff --git a/modules/apache/templates/vhost_fcgid_norobot.conf b/modules/apache/templates/vhost_fcgid_norobot.conf
new file mode 100644
index 00000000..0643cac9
--- /dev/null
+++ b/modules/apache/templates/vhost_fcgid_norobot.conf
@@ -0,0 +1,45 @@
+AddHandler fcgid-script .pl
+<%- @script_aliases.keys.sort {|a,b| a.size <=> b.size }.reverse.each do |key| -%>
+ ScriptAlias <%= key %> <%= @script_aliases[key] %>
+<%- end -%>
+FcgidMinProcessesPerClass <%= @process %>
+FcgidIdleTimeout 30
+
+# These robots were scraping the whole of svnweb in 2024-04, causing severe
+# load, so they are banned. It's not clear whether they obey robots.txt or
+# not (we didn't give them enough of a chance to find out), so we could
+# consider giving them a chance to redeem themselves at some point in the
+# future.
+RewriteEngine on
+RewriteCond %{HTTP_USER_AGENT} ClaudeBot|Amazonbot
+RewriteRule . - [R=403,L]
+
+# Block expensive SVN operations on all common robots ("spider" covers a
+# bunch). "Expensive" is considered to be most operations other than showing a
+# directory or downloading a specific version of a file.
+# Note: eliminating view=log and annotate= doesn't make much difference to the
+# CPU load when robots are hitting the server in real world operation.
+#RewriteCond %{QUERY_STRING} pathrev=|r1=
+# Treat anything other than a plain path as "expensive"
+RewriteCond %{QUERY_STRING} .
+RewriteCond %{HTTP_USER_AGENT} "Googlebot|GoogleOther|bingbot|Yahoo! Slurp|ClaudeBot|Amazonbot|YandexBot|SemrushBot|Barkrowler|DataForSeoBot|PetalBot|facebookexternalhit|GPTBot|ImagesiftBot|spider|Spider|iPod|Trident|Presto"
+RewriteRule . - [R=403,L]
+
+# Only let expensive operations through when a cookie is set. If no cookie is
+# set, redirect to a page where it will be set using JavaScript and redirect
+# back. This will block requests from user agents that do not support
+# JavaScript, which includes many robots.
+RewriteMap urlescape prg:/usr/local/bin/urlescape
+#RewriteCond %{QUERY_STRING} pathrev=|r1=
+# Treat anything other than a plain path as "expensive"
+RewriteCond %{QUERY_STRING} .
+RewriteCond %{REQUEST_URI} !/_check
+RewriteCond %{HTTP_COOKIE} !session=([^;]+) [novary]
+RewriteRule . %{REQUEST_SCHEME}://%{SERVER_NAME}:%{SERVER_PORT}/_check?to=%{REQUEST_URI}?${urlescape:%{QUERY_STRING}} [R=302,L]
+
+# Block abusive spiders by IP address who don't identify themselves in the
+# User-Agent: string
+RewriteCond expr "-R '47.76.0.0/14' || -R '47.80.0.0/14' || -R '47.208.0.0/16' || -R '47.238.0.0/16' || -R '8.210.0.0/16' || -R '8.218.0.0/16' || -R '188.239.0.0/18' || -R '166.108.192.0/18' || -R '124.243.160.0/19' || -R '101.46.0.0/20'"
+RewriteRule . - [R=403,L]
+
+ErrorDocument 403 "<html><body>Impolite robots are not allowed</body></html>"
diff --git a/modules/apache/templates/vhost_redirect.conf b/modules/apache/templates/vhost_redirect.conf
new file mode 100644
index 00000000..c787311e
--- /dev/null
+++ b/modules/apache/templates/vhost_redirect.conf
@@ -0,0 +1,2 @@
+Redirect / <%= @url %>
+
diff --git a/modules/apache/templates/vhost_reverse_proxy.conf b/modules/apache/templates/vhost_reverse_proxy.conf
new file mode 100644
index 00000000..4859bda3
--- /dev/null
+++ b/modules/apache/templates/vhost_reverse_proxy.conf
@@ -0,0 +1,15 @@
+<%= @content %>
+
+ ProxyRequests Off
+ ProxyPreserveHost On
+
+ <Proxy *>
+ Order deny,allow
+ Allow from all
+ </Proxy>
+<%- if @url =~ /^https/ -%>
+ SSLProxyEngine On
+<%- end -%>
+ ProxyPass / <%= @url %>
+ ProxyPassReverse / <%= @url %>
+
diff --git a/modules/apache/templates/vhost_simple.conf b/modules/apache/templates/vhost_simple.conf
new file mode 100644
index 00000000..77b55287
--- /dev/null
+++ b/modules/apache/templates/vhost_simple.conf
@@ -0,0 +1,14 @@
+<VirtualHost *:80>
+ ServerName <%= @name %>
+ DocumentRoot <%= @location %>
+
+ <Location />
+ <IfModule mod_authz_core.c>
+ Require all granted
+ </IfModule>
+ <IfModule !mod_authz_core.c>
+ Allow from all
+ </IfModule>
+ </Location>
+</VirtualHost>
+
diff --git a/modules/apache/templates/vhost_ssl.conf b/modules/apache/templates/vhost_ssl.conf
new file mode 100644
index 00000000..0cb52eca
--- /dev/null
+++ b/modules/apache/templates/vhost_ssl.conf
@@ -0,0 +1,13 @@
+ SSLEngine on
+ SSLProtocol ALL -SSLv2 -SSLv3
+ SSLHonorCipherOrder On
+ SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
+ <%- if @wildcard_sslcert == 'true' then -%>
+ SSLCertificateFile /etc/ssl/wildcard.<%= @domain %>.crt
+ SSLCertificateKeyFile /etc/ssl/wildcard.<%= @domain %>.key
+ SSLCACertificateFile /etc/ssl/wildcard.<%= @domain %>.pem
+ SSLVerifyClient None
+ <%- else -%>
+ SSLCertificateFile /etc/ssl/apache/<%= @real_vhost %>.pem
+ SSLCertificateKeyFile /etc/ssl/apache/<%= @real_vhost %>.pem
+ <%- end -%>
diff --git a/modules/apache/templates/vhost_ssl_redirect.conf b/modules/apache/templates/vhost_ssl_redirect.conf
index bb22a2c8..23a7eabe 100644
--- a/modules/apache/templates/vhost_ssl_redirect.conf
+++ b/modules/apache/templates/vhost_ssl_redirect.conf
@@ -1,4 +1 @@
-<VirtualHost *:80>
- ServerName <%= name %>
- Redirect / https://<%= name %>/
-</VirtualHost>
+Redirect / https://<%= @name %>/
diff --git a/modules/apache/templates/vhost_wsgi.conf b/modules/apache/templates/vhost_wsgi.conf
new file mode 100644
index 00000000..2f1ba585
--- /dev/null
+++ b/modules/apache/templates/vhost_wsgi.conf
@@ -0,0 +1,3 @@
+WSGIScriptAlias / <%= @wsgi_path %>
+
+