From 1e088983f6a80b6fd47543d0b4989e9ddb3234d5 Mon Sep 17 00:00:00 2001 From: Cullum Smith Date: Fri, 4 Oct 2024 21:59:59 -0400 Subject: add imap stuff --- scripts/hostclass/imap_server/10-solr | 78 ++++++++++++++++++++++ scripts/hostclass/imap_server/20-tika | 38 +++++++++++ scripts/hostclass/imap_server/30-dovecot | 108 +++++++++++++++++++++++++++++++ 3 files changed, 224 insertions(+) create mode 100644 scripts/hostclass/imap_server/10-solr create mode 100644 scripts/hostclass/imap_server/20-tika create mode 100644 scripts/hostclass/imap_server/30-dovecot (limited to 'scripts/hostclass/imap_server') diff --git a/scripts/hostclass/imap_server/10-solr b/scripts/hostclass/imap_server/10-solr new file mode 100644 index 0000000..252a8c3 --- /dev/null +++ b/scripts/hostclass/imap_server/10-solr @@ -0,0 +1,78 @@ +#!/bin/sh + +: ${solr_version:='9.7.0'} + +solr_uid=161 +solr_user=solr +solr_data_dir=/var/db/solr +solr_conf_dir=/usr/local/etc/solr +solr_install_dir=/usr/local/solr +solr_heap_size=2g +solr_softcommit_ms=60000 +solr_url="https://dlcdn.apache.org/solr/solr/${solr_version}/solr-${solr_version}-slim.tgz" +solr_port=8983 + +# Install dependencies. +pkg install -y \ + curl \ + openjdk21 \ + bash + +# Add local solr user. +add_user \ + -u "$solr_uid" \ + -c 'Apache Solr' \ + -d "$solr_data_dir" \ + -s /usr/sbin/nologin \ + "$solr_user" + +# Create ZFS dataset for solr DB. +create_dataset -o "mountpoint=${solr_data_dir}" "${state_dataset}/solr" + +# Set ownership on solr DB dir. +install_directory -m 0770 -o "$solr_user" -g "$solr_user" "$solr_data_dir" + +# Create solr install/config directories. +install_directory -m 0755 \ + "$solr_install_dir" \ + "$solr_conf_dir" + +# Download and extract the solr tarball. +curl -fL "$solr_url" | tar xf - -C "$solr_install_dir" --strip-components 1 + +# Copy solr rc script. +install_file -m 0555 /usr/local/etc/rc.d/solr + +# Copy solr config files. +install_file -m 0644 \ + "${solr_conf_dir}/solrconfig.xml" \ + "${solr_conf_dir}/log4j2.xml" + +# Copy the default solr config from the distribution. +install -v -m 0644 -o "$solr_user" -g "$solr_user" \ + "${solr_install_dir}/server/solr/solr.xml" \ + "${solr_data_dir}/solr.xml" + +# Enable and start solr. +sysrc -v \ + solr_enable=YES \ + solr_heap_size="$solr_heap_size" + +# Start solr. +service solr restart + +# Create solr collection for dovecot. +if ! [ -d "${solr_data_dir}/dovecot" ]; then + log "waiting a few seconds for solr to finish starting up" + sleep 3 + JAVA_TOOL_OPTIONS='-Xmx64m' su -m "$solr_user" -c "${solr_install_dir}/bin/solr create --name dovecot --solr-url http://127.0.0.1:${solr_port}" +fi + +# Copy solr configs for dovecot. +install_file -m 0644 -o "$solr_user" -g "$solr_user" \ + "${solr_data_dir}/dovecot/conf/schema.xml" \ + "${solr_data_dir}/dovecot/conf/solrconfig.xml" +rm -f "${solr_data_dir}/dovecot/conf/managed-schema.xml" + +# Restart solr. +service solr restart diff --git a/scripts/hostclass/imap_server/20-tika b/scripts/hostclass/imap_server/20-tika new file mode 100644 index 0000000..3b4aa47 --- /dev/null +++ b/scripts/hostclass/imap_server/20-tika @@ -0,0 +1,38 @@ +#!/bin/sh + +: ${tika_version:='2.9.2'} +: ${tika_uid:='787'} + +tika_user=tika +tika_conf_dir=/usr/local/etc/tika +tika_install_dir=/usr/local/tika +tika_heap_size=2g +tika_port=9998 +tika_url="https://dlcdn.apache.org/tika/${tika_version}/tika-server-standard-${tika_version}.jar" + +# Add local tika user. +add_user \ + -u "$tika_uid" \ + -c 'Apache Tika' \ + -d /nonexistent \ + -s /usr/sbin/nologin \ + "$tika_user" + +# Create tika install/config directories. +install_directory -m 0755 \ + "$tika_install_dir" \ + "$tika_conf_dir" + +# Download tika jar file. +curl -fL -o "${tika_install_dir}/tika.jar" "$tika_url" + +# Copy tika rc script. +install_file -m 0555 /usr/local/etc/rc.d/tika + +# Copy tika config files. +install_template -m 0644 "${tika_conf_dir}/config.xml" +install_file -m 0644 "${tika_conf_dir}/log4j2.xml" + +# Enable and start tika. +sysrc -v tika_enable=YES +service tika restart diff --git a/scripts/hostclass/imap_server/30-dovecot b/scripts/hostclass/imap_server/30-dovecot new file mode 100644 index 0000000..07c089e --- /dev/null +++ b/scripts/hostclass/imap_server/30-dovecot @@ -0,0 +1,108 @@ +#!/bin/sh + +: ${dovecot_recipient_delimiter:='+'} +: ${dovecot_default_quota:='10G'} +: ${dovecot_quota_grace_percent:='5'} +: ${dovecot_quota_mail_from:="postmaster@${email_domain}"} +: ${rspamd_host:='smtp'} + +dovecot_user=dovecot +dovecot_login_user=dovenull +dovecot_vmail_user=vmail +dovecot_vmail_uid=793 +dovecot_vmail_dir=/var/db/vmail +dovecot_conf_dir=/usr/local/etc/dovecot +dovecot_script_dir=/usr/local/libexec/dovecot +dovecot_sieve_before_dir="${dovecot_conf_dir}/sieve-before.d" +dovecot_sieve_pipe_bin_dir="${dovecot_script_dir}/sieve-pipe" +dovecot_keytab="${keytab_dir}/dovecot.keytab" +dovecot_tls_cert="${dovecot_conf_dir}/dovecot.crt" +dovecot_tls_key="${dovecot_conf_dir}/dovecot.key" +dovecot_cipherlist='ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305' + +pkg install -y \ + dovecot \ + dovecot-pigeonhole \ + rspamd + +# Add local vmail user. +add_user \ + -u "$dovecot_vmail_uid" \ + -c 'Virtual Mail User' \ + -d "$dovecot_vmail_dir" \ + -s /usr/sbin/nologin \ + "$dovecot_vmail_user" + +# Create ZFS dataset for virtual maildirs. +create_dataset -o "mountpoint=${dovecot_vmail_dir}" "${state_dataset}/mailboxes" + +# Set ownership on vmail dir. +install_directory -m 0770 -o "$dovecot_vmail_user" -g "$dovecot_vmail_user" "$dovecot_vmail_dir" + +# Create service principals and keytab. +add_principal -nokey -x "containerdn=${services_basedn}" "imap/${fqdn}" +add_principal -nokey -x "containerdn=${services_basedn}" "sieve/${fqdn}" + +ktadd -k "$dovecot_keytab" "imap/${fqdn}" +ktadd -k "$dovecot_keytab" "sieve/${fqdn}" +chgrp "$dovecot_user" "$dovecot_keytab" +chmod 640 "$dovecot_keytab" + +dovecot_uid=$(id -u "$dovecot_user") +install_directory -o "$dovecot_user" -m 0700 "/var/krb5/user/${dovecot_uid}" +ln -snfv "$dovecot_keytab" "/var/krb5/user/${dovecot_uid}/keytab" +ln -snfv "$dovecot_keytab" "/var/krb5/user/${dovecot_uid}/client.keytab" + +# Create dovecot directories. +install_directory -m 0755 \ + "${dovecot_conf_dir}/conf.d" \ + "$dovecot_sieve_before_dir" \ + "$dovecot_sieve_pipe_bin_dir" + +# Generate dovecot configuration. +install_template -m 0644 \ + "${dovecot_conf_dir}/dovecot.conf" \ + "${dovecot_conf_dir}/dovecot-ldap-userdb.conf.ext" \ + "${dovecot_conf_dir}/dovecot-ldap-passdb.conf.ext" \ + "${dovecot_conf_dir}/conf.d/10-auth.conf" \ + "${dovecot_conf_dir}/conf.d/10-mail.conf" \ + "${dovecot_conf_dir}/conf.d/10-master.conf" \ + "${dovecot_conf_dir}/conf.d/10-ssl.conf" \ + "${dovecot_conf_dir}/conf.d/15-lda.conf" \ + "${dovecot_conf_dir}/conf.d/90-fts.conf" \ + "${dovecot_conf_dir}/conf.d/90-quota.conf" \ + "${dovecot_conf_dir}/conf.d/90-sieve.conf" \ + "${dovecot_conf_dir}/conf.d/90-sieve-extprograms.conf" \ + "${dovecot_conf_dir}/conf.d/auth-ldap.conf.ext" + +install_template -m 0550 -o root -g "$dovecot_user" \ + "${dovecot_sieve_pipe_bin_dir}/report-spam.sh" \ + "${dovecot_sieve_pipe_bin_dir}/report-ham.sh" \ + +install_file -m 0555 \ + "${dovecot_script_dir}/quota-warning.sh" + +install_file -m 0644 \ + "${dovecot_conf_dir}/conf.d/15-mailboxes.conf" \ + "${dovecot_conf_dir}/conf.d/20-imap.conf" \ + "${dovecot_conf_dir}/conf.d/20-lmtp.conf" \ + "${dovecot_conf_dir}/conf.d/20-managesieve.conf" \ + "${dovecot_conf_dir}/report-ham.sieve" \ + "${dovecot_conf_dir}/report-spam.sieve" \ + "${dovecot_sieve_before_dir}/10-rspamd.sieve" + +# Compile sieve scripts. +sievec "${dovecot_conf_dir}/report-ham.sieve" +sievec "${dovecot_conf_dir}/report-spam.sieve" +sievec "${dovecot_sieve_before_dir}/10-rspamd.sieve" + +# Copy TLS certificate for dovecot. +install_certificate -m 0644 -o root -g "$dovecot_user" dovecot "$dovecot_tls_cert" +install_certificate_key -m 0640 -o root -g "$dovecot_user" dovecot "$dovecot_tls_key" + +# Enable and start dovecot and dependencies. +sysrc -v dovecot_enable=YES +service dovecot restart + +# Disable rspamd log rotation (we don't actually run rspamd here). +echo '# intentionally empty' > /usr/local/etc/newsyslog.conf.d/rspamd.newsyslog.conf -- cgit v1.2.3