openship 0.4.4 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -24
- package/dist/bare-2HYDXQEH.js +23 -0
- package/dist/{bowser-MFQA6OS4.js → bowser-O3AEA6AN.js} +5 -1
- package/dist/{chunk-KD7VO4LG.js → chunk-2ZLR7ULL.js} +255 -65
- package/dist/{chunk-YHXCHW7Q.js → chunk-3JQTL4R4.js} +236 -99
- package/dist/{chunk-E77LJWJK.js → chunk-4TJC4JZQ.js} +20 -9
- package/dist/{chunk-YL67EWYZ.js → chunk-4Z5QO7N6.js} +6 -2
- package/dist/{chunk-WJPCBU7Z.js → chunk-5FNIWBFI.js} +10 -6
- package/dist/{chunk-Y37KHU7L.js → chunk-5MZ624VX.js} +5 -0
- package/dist/{chunk-QKFRZNKN.js → chunk-6APIPIJY.js} +8 -4
- package/dist/{chunk-JZLNHGLW.js → chunk-6APULWSU.js} +153 -133
- package/dist/{chunk-F4DFVG6Q.js → chunk-6B5YCFFV.js} +8 -4
- package/dist/{chunk-XVSAUO2I.js → chunk-AVIB7CT7.js} +5 -1
- package/dist/{chunk-TEYJYSMT.js → chunk-C5OHTYEF.js} +12 -6
- package/dist/{chunk-7UOB5GGQ.js → chunk-DYPH4HCI.js} +5 -0
- package/dist/{chunk-XIFRMKYT.js → chunk-EI575GHN.js} +6 -2
- package/dist/{chunk-4CQWT2WL.js → chunk-FPRHYBY2.js} +5 -0
- package/dist/chunk-FQGJZ2HS.js +248 -0
- package/dist/{chunk-JR2OCMJA.js → chunk-FRNAR33O.js} +6 -2
- package/dist/{chunk-JUJBBF5U.js → chunk-FXTBHTWY.js} +362 -42
- package/dist/chunk-ILFETZOM.js +131 -0
- package/dist/{chunk-5ZCKQ2MI.js → chunk-IXCHURVK.js} +7 -3
- package/dist/{chunk-6ERIMTBC.js → chunk-JYGD5WSN.js} +5 -0
- package/dist/{chunk-4VNS5WPM.js → chunk-KI2EY3WB.js} +4 -0
- package/dist/{chunk-3U4SPZD5.js → chunk-L2VOGB2X.js} +7 -104
- package/dist/{chunk-NB2VEIWG.js → chunk-MZ2WEHHY.js} +7 -3
- package/dist/{chunk-BUBSSKO6.js → chunk-O6ZZF52V.js} +5 -1
- package/dist/{chunk-LBFH7THC.js → chunk-OWED2GRM.js} +5 -1
- package/dist/{chunk-4MG3BVHE.js → chunk-OXWDY22G.js} +6 -2
- package/dist/{chunk-4FABQGQP.js → chunk-Q2CIRAOK.js} +5 -0
- package/dist/{chunk-4LEL3H2Z.js → chunk-RPHRPFEH.js} +5 -0
- package/dist/{chunk-46YJFP4S.js → chunk-SQ77DZOI.js} +1728 -1484
- package/dist/{chunk-S6DSRLNE.js → chunk-TGIINPVM.js} +15 -2
- package/dist/{chunk-U2DPZSXA.js → chunk-TYVME3XD.js} +9 -1
- package/dist/{chunk-HFYDYK4D.js → chunk-V6AN6XLZ.js} +18 -6
- package/dist/{chunk-ZKJOFWBJ.js → chunk-VDMQJHPI.js} +38 -15
- package/dist/{chunk-E6W2JMMU.js → chunk-VFINNTUL.js} +22 -1
- package/dist/{chunk-OJE6YWPQ.js → chunk-VWPEKOH6.js} +6 -2
- package/dist/{chunk-5N7VUGL6.js → chunk-W73X43R7.js} +6 -2
- package/dist/cloud-7QYOGF7F.js +11 -0
- package/dist/cloud-ZSKOS4GY.js +30 -0
- package/dist/detect-SH4FHFBI.js +36 -0
- package/dist/{dist-L3MPOWCA.js → dist-IQJ6H6UZ.js} +6 -2
- package/dist/{dist-es-KE56MWYO.js → dist-es-5DY7K32L.js} +9 -5
- package/dist/dist-es-JSTDUS7Q.js +26 -0
- package/dist/{dist-es-GTAMF674.js → dist-es-OSNJBLXB.js} +8 -4
- package/dist/{dist-es-NRZIQY5B.js → dist-es-RYHIPOTN.js} +17 -13
- package/dist/{dist-es-XQCOTGC7.js → dist-es-VNKHQVIB.js} +7 -3
- package/dist/{dist-es-WZCR7DHQ.js → dist-es-WV4AMOII.js} +11 -7
- package/dist/{dist-es-ZW3HFQUM.js → dist-es-X3B5QYKB.js} +9 -5
- package/dist/docker-U7AF5PTA.js +16 -0
- package/dist/docker-edge-executor-VHW3JPJS.js +13 -0
- package/dist/edge-import-V5CBA47C.js +45 -0
- package/dist/ensure-container-edge-CMYROUSI.js +33 -0
- package/dist/{event-streams-7LGDL56D.js → event-streams-EHRAKL75.js} +7 -3
- package/dist/executor-YPT6RH6O.js +30 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +258 -245
- package/dist/{loadSso-N273C5I7.js → loadSso-46FQRIZS.js} +13 -9
- package/dist/local-executor-V7U5VOZW.js +12 -0
- package/dist/nginx-2GTRUIDE.js +24 -0
- package/dist/noop-FMMFG2EZ.js +11 -0
- package/dist/{openresty-lua-HAO4EUDY.js → openresty-lua-4WLGDSER.js} +13 -3
- package/dist/server/engine/ChangeLog +2289 -0
- package/dist/server/engine/Documentations +5 -0
- package/dist/server/engine/LICENSE +674 -0
- package/dist/server/engine/README.md +34 -0
- package/dist/server/engine/conf/amavisd +150 -0
- package/dist/server/engine/conf/clamav +71 -0
- package/dist/server/engine/conf/core +632 -0
- package/dist/server/engine/conf/dovecot +151 -0
- package/dist/server/engine/conf/fail2ban +72 -0
- package/dist/server/engine/conf/global +698 -0
- package/dist/server/engine/conf/iredapd +52 -0
- package/dist/server/engine/conf/logwatch +28 -0
- package/dist/server/engine/conf/postfix +97 -0
- package/dist/server/engine/conf/postgresql +93 -0
- package/dist/server/engine/conf/spamassassin +39 -0
- package/dist/server/engine/dialog/config_via_dialog.sh +258 -0
- package/dist/server/engine/dialog/optional_components.sh +122 -0
- package/dist/server/engine/dialog/pgsql_config.sh +52 -0
- package/dist/server/engine/dialog/virtual_domain_config.sh +94 -0
- package/dist/server/engine/functions/amavisd.sh +267 -0
- package/dist/server/engine/functions/backend.sh +85 -0
- package/dist/server/engine/functions/clamav.sh +100 -0
- package/dist/server/engine/functions/cleanup.sh +393 -0
- package/dist/server/engine/functions/dovecot.sh +583 -0
- package/dist/server/engine/functions/fail2ban.sh +209 -0
- package/dist/server/engine/functions/iredapd.sh +356 -0
- package/dist/server/engine/functions/optional_components.sh +24 -0
- package/dist/server/engine/functions/packages.sh +522 -0
- package/dist/server/engine/functions/packages_freebsd.sh +179 -0
- package/dist/server/engine/functions/postfix.sh +457 -0
- package/dist/server/engine/functions/postgresql.sh +239 -0
- package/dist/server/engine/functions/spamassassin.sh +49 -0
- package/dist/server/engine/functions/system_accounts.sh +128 -0
- package/dist/server/engine/iRedMail.sh +144 -0
- package/dist/server/engine/pkgs/get_all.sh +338 -0
- package/dist/server/engine/pkgs/pkgs.freebsd.sha256 +3 -0
- package/dist/server/engine/pkgs/pkgs.openbsd.sha256 +6 -0
- package/dist/server/engine/pkgs/pkgs.sha256 +1 -0
- package/dist/server/engine/samples/amavisd/amavisd.conf +677 -0
- package/dist/server/engine/samples/amavisd/amavisd.mysql +278 -0
- package/dist/server/engine/samples/amavisd/amavisd.pgsql +253 -0
- package/dist/server/engine/samples/amavisd/amavisd.schema +942 -0
- package/dist/server/engine/samples/amavisd/default_spam_policy.sql +46 -0
- package/dist/server/engine/samples/dovecot/dovecot-2.4-mariadb.conf +758 -0
- package/dist/server/engine/samples/dovecot/dovecot-2.4-openldap.conf +767 -0
- package/dist/server/engine/samples/dovecot/dovecot-2.4-pgsql.conf +762 -0
- package/dist/server/engine/samples/dovecot/dovecot-last-login.conf +50 -0
- package/dist/server/engine/samples/dovecot/dovecot-ldap.conf +21 -0
- package/dist/server/engine/samples/dovecot/dovecot-share-folder.conf +22 -0
- package/dist/server/engine/samples/dovecot/dovecot-sql.conf +28 -0
- package/dist/server/engine/samples/dovecot/dovecot-used-quota.conf +13 -0
- package/dist/server/engine/samples/dovecot/dovecot.conf +484 -0
- package/dist/server/engine/samples/dovecot/dovecot.sieve +7 -0
- package/dist/server/engine/samples/dovecot/dovecot2-quota-warning.sh +38 -0
- package/dist/server/engine/samples/dovecot/sql/imap_share_folder.mysql +16 -0
- package/dist/server/engine/samples/dovecot/sql/last_login.mysql +12 -0
- package/dist/server/engine/samples/dovecot/sql/used_quota.mysql +26 -0
- package/dist/server/engine/samples/dovecot/systemd/override.conf +3 -0
- package/dist/server/engine/samples/fail2ban/action.d/banned_db.conf +9 -0
- package/dist/server/engine/samples/fail2ban/bin/fail2ban_banned_db +268 -0
- package/dist/server/engine/samples/fail2ban/fail2ban.local +17 -0
- package/dist/server/engine/samples/fail2ban/filter.d/dovecot.iredmail.conf +5 -0
- package/dist/server/engine/samples/fail2ban/filter.d/postfix-pregreet.iredmail.conf +16 -0
- package/dist/server/engine/samples/fail2ban/filter.d/postfix.iredmail.conf +18 -0
- package/dist/server/engine/samples/fail2ban/filter.d/roundcube.iredmail.conf +9 -0
- package/dist/server/engine/samples/fail2ban/jail.d/dovecot.local +8 -0
- package/dist/server/engine/samples/fail2ban/jail.d/nginx-http-auth.local +8 -0
- package/dist/server/engine/samples/fail2ban/jail.d/postfix-pregreet.local +9 -0
- package/dist/server/engine/samples/fail2ban/jail.d/postfix.local +8 -0
- package/dist/server/engine/samples/fail2ban/jail.d/roundcube.local +9 -0
- package/dist/server/engine/samples/fail2ban/jail.d/sogo.local +8 -0
- package/dist/server/engine/samples/fail2ban/jail.d/sshd.local +8 -0
- package/dist/server/engine/samples/fail2ban/jail.local +6 -0
- package/dist/server/engine/samples/fail2ban/openbsd/rc +27 -0
- package/dist/server/engine/samples/fail2ban/sql/fail2ban.mysql +49 -0
- package/dist/server/engine/samples/fail2ban/sql/fail2ban.pgsql +48 -0
- package/dist/server/engine/samples/firewall/firewalld/services/ssh.xml +6 -0
- package/dist/server/engine/samples/firewall/firewalld/zones/iredmail.xml +15 -0
- package/dist/server/engine/samples/firewall/iptables/ip6tables.init.debian +362 -0
- package/dist/server/engine/samples/firewall/iptables/ip6tables.rules +53 -0
- package/dist/server/engine/samples/firewall/iptables/iptables.init.debian +363 -0
- package/dist/server/engine/samples/firewall/iptables/iptables.rules +54 -0
- package/dist/server/engine/samples/firewall/nftables.conf +58 -0
- package/dist/server/engine/samples/freebsd/newsyslog.conf.d/dovecot.conf +3 -0
- package/dist/server/engine/samples/freebsd/newsyslog.conf.d/iredapd.conf +1 -0
- package/dist/server/engine/samples/freebsd/newsyslog.conf.d/mlmmjadmin.conf +1 -0
- package/dist/server/engine/samples/freebsd/newsyslog.conf.d/php-fpm.conf +2 -0
- package/dist/server/engine/samples/freebsd/newsyslog.conf.d/slapd.conf +1 -0
- package/dist/server/engine/samples/freebsd/syslog.d/dovecot.conf +2 -0
- package/dist/server/engine/samples/freebsd/syslog.d/fail2ban.conf +2 -0
- package/dist/server/engine/samples/freebsd/syslog.d/iredapd.conf +2 -0
- package/dist/server/engine/samples/freebsd/syslog.d/mlmmjadmin.conf +2 -0
- package/dist/server/engine/samples/freebsd/syslog.d/php-fpm.conf +2 -0
- package/dist/server/engine/samples/freebsd/syslog.d/slapd.conf +2 -0
- package/dist/server/engine/samples/iredmail/iredmail.mysql +491 -0
- package/dist/server/engine/samples/iredmail/iredmail.pgsql +465 -0
- package/dist/server/engine/samples/iredmail/iredmail.schema +456 -0
- package/dist/server/engine/samples/iredmail/used_quota_triggers_dovecot_2.3.pgsql +40 -0
- package/dist/server/engine/samples/iredmail/used_quota_triggers_dovecot_2.4.pgsql +18 -0
- package/dist/server/engine/samples/logrotate/dovecot +13 -0
- package/dist/server/engine/samples/logrotate/iredapd +13 -0
- package/dist/server/engine/samples/logrotate/mlmmjadmin +13 -0
- package/dist/server/engine/samples/logrotate/openldap +19 -0
- package/dist/server/engine/samples/logrotate/php-fpm +13 -0
- package/dist/server/engine/samples/openbsd/ldapd.conf +58 -0
- package/dist/server/engine/samples/openbsd/pf.conf +28 -0
- package/dist/server/engine/samples/postfix/command_filter.pcre +3 -0
- package/dist/server/engine/samples/postfix/freebsd/mailer.conf +9 -0
- package/dist/server/engine/samples/postfix/helo_access.pcre +180 -0
- package/dist/server/engine/samples/postfix/ldap/catchall_maps.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/recipient_bcc_maps_domain.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/recipient_bcc_maps_user.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/relay_domains.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/sender_bcc_maps_domain.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/sender_bcc_maps_user.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/sender_dependent_relayhost_maps_domain.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/sender_dependent_relayhost_maps_user.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/sender_login_maps.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/transport_maps_domain.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/transport_maps_user.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/virtual_alias_maps.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/virtual_group_maps.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/virtual_group_members_maps.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/virtual_mailbox_domains.cf +11 -0
- package/dist/server/engine/samples/postfix/ldap/virtual_mailbox_maps.cf +12 -0
- package/dist/server/engine/samples/postfix/main.cf +282 -0
- package/dist/server/engine/samples/postfix/main.cf.amavisd +7 -0
- package/dist/server/engine/samples/postfix/main.cf.dovecot +8 -0
- package/dist/server/engine/samples/postfix/main.cf.ldap +39 -0
- package/dist/server/engine/samples/postfix/main.cf.mlmmj +5 -0
- package/dist/server/engine/samples/postfix/main.cf.mysql +39 -0
- package/dist/server/engine/samples/postfix/main.cf.pgsql +39 -0
- package/dist/server/engine/samples/postfix/main.cf.postscreen +30 -0
- package/dist/server/engine/samples/postfix/master.cf +87 -0
- package/dist/server/engine/samples/postfix/mysql/catchall_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/domain_alias_catchall_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/domain_alias_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/recipient_bcc_maps_domain.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/recipient_bcc_maps_user.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/relay_domains.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/sender_bcc_maps_domain.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/sender_bcc_maps_user.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/sender_dependent_relayhost_maps.cf +6 -0
- package/dist/server/engine/samples/postfix/mysql/sender_login_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/transport_maps_domain.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/transport_maps_maillist.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/transport_maps_user.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/virtual_alias_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/virtual_mailbox_domains.cf +5 -0
- package/dist/server/engine/samples/postfix/mysql/virtual_mailbox_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/catchall_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/domain_alias_catchall_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/domain_alias_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/recipient_bcc_maps_domain.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/recipient_bcc_maps_user.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/relay_domains.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/sender_bcc_maps_domain.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/sender_bcc_maps_user.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/sender_dependent_relayhost_maps.cf +6 -0
- package/dist/server/engine/samples/postfix/pgsql/sender_login_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/transport_maps_domain.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/transport_maps_maillist.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/transport_maps_user.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/virtual_alias_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/virtual_mailbox_domains.cf +5 -0
- package/dist/server/engine/samples/postfix/pgsql/virtual_mailbox_maps.cf +5 -0
- package/dist/server/engine/samples/postfix/postscreen_access.cidr +6 -0
- package/dist/server/engine/samples/postgresql/sql/add_first_domain_and_user.sql +34 -0
- package/dist/server/engine/samples/postgresql/sql/grant_permissions.sql +14 -0
- package/dist/server/engine/samples/postgresql/sql/init_vmail_db.sql +15 -0
- package/dist/server/engine/samples/rsyslog.d/1-iredmail-dovecot.conf +23 -0
- package/dist/server/engine/samples/rsyslog.d/1-iredmail-fail2ban.conf +2 -0
- package/dist/server/engine/samples/rsyslog.d/1-iredmail-iredapd.conf +12 -0
- package/dist/server/engine/samples/rsyslog.d/1-iredmail-mlmmjadmin.conf +12 -0
- package/dist/server/engine/samples/rsyslog.d/1-iredmail-openldap.conf +2 -0
- package/dist/server/engine/samples/rsyslog.d/1-iredmail-phpfpm.conf +3 -0
- package/dist/server/engine/samples/spamassassin/local.cf +186 -0
- package/dist/server/engine/samples/spamassassin/razor.conf +1 -0
- package/dist/server/engine/samples/systemd/clamd.service.d/override.conf +2 -0
- package/dist/server/engine/samples/systemd/mariadb.service.d/override.conf +3 -0
- package/dist/server/engine/samples/systemd/slapd.service.d/override.conf +6 -0
- package/dist/server/engine/samples/yum/CentOS-Linux-AppStream.repo +6 -0
- package/dist/server/engine/samples/yum/CentOS-Linux-PowerTools.repo +6 -0
- package/dist/server/engine/samples/yum/CentOS-Stream-AppStream.repo +7 -0
- package/dist/server/engine/samples/yum/CentOS-Stream-PowerTools.repo +7 -0
- package/dist/server/engine/samples/yum/symas-openldap.repo +6 -0
- package/dist/server/engine/tools/add_enabled_service.py +60 -0
- package/dist/server/engine/tools/backup_mysql.sh +238 -0
- package/dist/server/engine/tools/backup_openldap.sh +230 -0
- package/dist/server/engine/tools/backup_pgsql.sh +217 -0
- package/dist/server/engine/tools/backup_sogo.sh +156 -0
- package/dist/server/engine/tools/create_mail_user_OpenLDAP.py +335 -0
- package/dist/server/engine/tools/create_mail_user_OpenLDAP.sh +287 -0
- package/dist/server/engine/tools/create_mail_user_SQL.sh +127 -0
- package/dist/server/engine/tools/enable_postscreen.sh +144 -0
- package/dist/server/engine/tools/fail2ban_unban_ip.sh +39 -0
- package/dist/server/engine/tools/find_sasl_login_ip.sh +20 -0
- package/dist/server/engine/tools/find_top_sasl_usernames.sh +28 -0
- package/dist/server/engine/tools/generate_ssl_keys.sh +85 -0
- package/dist/server/engine/tools/kill_high_cpu_sogo_process.sh +32 -0
- package/dist/server/engine/tools/ldap_assign_user_to_groups.py +151 -0
- package/dist/server/engine/tools/ldap_move_members_to_another_group.py +129 -0
- package/dist/server/engine/tools/migrate_sql_alias_table.py +177 -0
- package/dist/server/engine/update/0.9.8/amavisd.mysql +29 -0
- package/dist/server/engine/update/0.9.8/amavisd.pgsql +39 -0
- package/dist/server/engine/update/0.9.8/iredmail.mysql +53 -0
- package/dist/server/engine/update/0.9.8/iredmail.pgsql +61 -0
- package/dist/server/engine/update/0.9.9/iredmail.mysql +2 -0
- package/dist/server/engine/update/0.9.9/iredmail.pgsql +2 -0
- package/dist/server/engine/update/1.0/iredmail.mysql +2 -0
- package/dist/server/engine/update/1.0/iredmail.pgsql +2 -0
- package/dist/server/engine/update/1.2/last_login.mysql +16 -0
- package/dist/server/engine/update/1.4.0/iredmail.mysql +22 -0
- package/dist/server/engine/update/1.4.0/iredmail.pgsql +20 -0
- package/dist/server/engine/update/1.4.1/iredmail.mysql +3 -0
- package/dist/server/engine/update/1.4.1/iredmail.pgsql +3 -0
- package/dist/server/engine/update/1.4.1/sogo.mysql +11 -0
- package/dist/server/engine/update/1.4.1/sogo.pgsql +30 -0
- package/dist/server/engine/update/1.4.1/update-ldap.py +66 -0
- package/dist/server/engine/update/1.4.2/iredmail.mysql +9 -0
- package/dist/server/engine/update/1.4.2/iredmail.pgsql +9 -0
- package/dist/server/engine/update/1.4.2/sogo.pgsql +30 -0
- package/dist/server/engine/update/1.6.0/sogo_view.pgsql +27 -0
- package/dist/server/engine/update/1.6.3/iredmail.mysql +1 -0
- package/dist/server/engine/update/1.7.0/fail2ban.mysql +11 -0
- package/dist/server/engine/update/1.7.0/fail2ban.pgsql +12 -0
- package/dist/server/engine/update/1.7.1/amavisd.mysql +1 -0
- package/dist/server/engine/update/1.7.2/vmail.mysql +30 -0
- package/dist/server/engine/update/1.7.3/deleted_mailboxes.mysql +43 -0
- package/dist/server/engine/update/1.7.3/iredadmin.mysql +26 -0
- package/dist/server/engine/update/1.7.3/vmail.mysql +79 -0
- package/dist/server/engine/update/1.7.3/vmail.pgsql +9 -0
- package/dist/server/engine/update/README.md +1 -0
- package/dist/server/engine/update/ldap/README.md +40 -0
- package/dist/server/engine/update/ldap/update-ldap-dovecot-2.3.py +69 -0
- package/dist/server/index.js +55574 -53675
- package/dist/server/migrations/0071_gh_device_token.sql +3 -0
- package/dist/server/migrations/0072_gh_device_token_method.sql +1 -0
- package/dist/server/migrations/meta/_journal.json +14 -0
- package/dist/setup-HQIZLUOJ.js +20 -0
- package/dist/{signin-DR462ERO.js → signin-ITOPKKUB.js} +13 -9
- package/dist/{sso-oidc-VBZLJUK5.js → sso-oidc-NON2PD7Y.js} +13 -9
- package/dist/{sts-EJLZ4Z77.js → sts-HHFFSAY2.js} +12 -8
- package/package.json +1 -1
- package/dist/bare-ITM45QBX.js +0 -18
- package/dist/cloud-JMPHO3CW.js +0 -7
- package/dist/cloud-W5G6YXAY.js +0 -24
- package/dist/dist-es-4C322O5D.js +0 -22
- package/dist/docker-3FVJMFC3.js +0 -12
- package/dist/docker-edge-executor-ZIWAZWPL.js +0 -9
- package/dist/edge-import-Y34YL6JK.js +0 -39
- package/dist/executor-J7BHW5HF.js +0 -26
- package/dist/nginx-YZWKYKQU.js +0 -16
- package/dist/noop-RRNCIUI5.js +0 -7
- package/dist/setup-5X3WEEHA.js +0 -14
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Author: Zhang Huangbin (zhb _at_ iredmail.org)
|
|
4
|
+
# Purpose: Create new SSL keys.
|
|
5
|
+
# Project: iRedMail (http://www.iredmail.org/)
|
|
6
|
+
|
|
7
|
+
# USAGE:
|
|
8
|
+
# 1) Edit variables which starts with TLS_ below, then save file.
|
|
9
|
+
# 2) Execute shell command:
|
|
10
|
+
#
|
|
11
|
+
# # bash generate_ssl_keys.sh
|
|
12
|
+
#
|
|
13
|
+
# It will create two new files under CURRENT directory:
|
|
14
|
+
#
|
|
15
|
+
# - certs/iRedMail.crt: Used to replace file on iRedMail server:
|
|
16
|
+
# + on RHEL/CentOS/Scientific Linux: /etc/pki/tls/certs/iRedMail.crt
|
|
17
|
+
# + on Debian/Ubuntu: /etc/ssl/certs/iRedMail.crt
|
|
18
|
+
# + on FreeBSD: /etc/ssl/certs/iRedMail.crt
|
|
19
|
+
# - private/iRedMail.key: Used to replace file on iRedMail server:
|
|
20
|
+
# + on RHEL/CentOS/Scientific Linux: /etc/pki/tls/private/iRedMail.key
|
|
21
|
+
# + on Debian/Ubuntu: /etc/ssl/private/iRedMail.key
|
|
22
|
+
# + on FreeBSD: /etc/ssl/private/iRedMail.key
|
|
23
|
+
#
|
|
24
|
+
# 3) Grant read access to all users. e.g. on RHEL/CentOS/Scientific Linux:
|
|
25
|
+
#
|
|
26
|
+
# # chmod +r /etc/ssl/certs/iRedMail.crt
|
|
27
|
+
# # chmod +r /etc/ssl/private/iRedMail.key
|
|
28
|
+
#
|
|
29
|
+
# If you need more restrict file permission, please use file system ACL instead.
|
|
30
|
+
# Refer to command 'setfacl' and 'getfacl' for more detail.
|
|
31
|
+
#
|
|
32
|
+
# 4) Restart all services which provides SSL secure connection. e.g. http,
|
|
33
|
+
# dovecot, postfix, etc. A system reboot should be easier if possible.
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
export HOSTNAME="$(hostname -f)"
|
|
37
|
+
|
|
38
|
+
# SSL key related settings.
|
|
39
|
+
# Country.
|
|
40
|
+
export TLS_COUNTRY='CN'
|
|
41
|
+
|
|
42
|
+
# State.
|
|
43
|
+
export TLS_STATE='GuangDong'
|
|
44
|
+
|
|
45
|
+
# City.
|
|
46
|
+
export TLS_CITY='ShenZhen'
|
|
47
|
+
|
|
48
|
+
# Company name here, e.g. Apple Inc.
|
|
49
|
+
export TLS_COMPANY="${HOSTNAME}"
|
|
50
|
+
|
|
51
|
+
# Department name.
|
|
52
|
+
export TLS_DEPARTMENT='IT'
|
|
53
|
+
|
|
54
|
+
# Hostname of your mail server.
|
|
55
|
+
export TLS_HOSTNAME="${HOSTNAME}"
|
|
56
|
+
|
|
57
|
+
# Server admininistrator's email address.
|
|
58
|
+
export TLS_ADMIN="root@${HOSTNAME}"
|
|
59
|
+
|
|
60
|
+
# Do not edit below lines.
|
|
61
|
+
export ROOTDIR="$(pwd)"
|
|
62
|
+
export SSL_CERT_FILE="${ROOTDIR}/certs/iRedMail.crt"
|
|
63
|
+
export SSL_KEY_FILE="${ROOTDIR}/private/iRedMail.key"
|
|
64
|
+
|
|
65
|
+
# Create SSL certs/private files.
|
|
66
|
+
generate_ssl_keys()
|
|
67
|
+
{
|
|
68
|
+
# Create necessary directories.
|
|
69
|
+
mkdir -p {certs,private} 2>/dev/null
|
|
70
|
+
|
|
71
|
+
openssl req \
|
|
72
|
+
-x509 -nodes -days 3650 -newkey rsa:2048 \
|
|
73
|
+
-subj "/C=${TLS_COUNTRY}/ST=${TLS_STATE}/L=${TLS_CITY}/O=${TLS_COMPANY}/OU=${TLS_DEPARTMENT}/CN=${TLS_HOSTNAME}/emailAddress=${TLS_ADMIN}/" \
|
|
74
|
+
-out ${SSL_CERT_FILE} -keyout ${SSL_KEY_FILE} >/dev/null 2>&1
|
|
75
|
+
|
|
76
|
+
# Set correct file permission.
|
|
77
|
+
chmod 0444 ${SSL_CERT_FILE}
|
|
78
|
+
chmod 0444 ${SSL_KEY_FILE}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
generate_ssl_keys && cat <<EOF
|
|
82
|
+
SSL keys were generated:
|
|
83
|
+
- ${SSL_CERT_FILE}
|
|
84
|
+
- ${SSL_KEY_FILE}
|
|
85
|
+
EOF
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# Purpose: Kill SOGo child processes which have been running too long, they
|
|
4
|
+
# may cause high CPU usage.
|
|
5
|
+
# Author: Zhang Huangbin <zhb@iredmail.org>
|
|
6
|
+
# Based on Jan-Frode Myklebust's script published on 04 Apr 2013:
|
|
7
|
+
# https://www.mail-archive.com/users@sogo.nu/msg14152.html
|
|
8
|
+
|
|
9
|
+
# Allow to run for how long (in minutes). e.g. 15, 25.
|
|
10
|
+
LONGEST=10
|
|
11
|
+
|
|
12
|
+
# Kill a pid.
|
|
13
|
+
k() {
|
|
14
|
+
# Usage: k <pid>
|
|
15
|
+
pid="${1}"
|
|
16
|
+
|
|
17
|
+
echo "Killing PID $pid"
|
|
18
|
+
ps -fp $pid
|
|
19
|
+
kill -9 $pid
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
ps -u sogo -opid,ppid,cputime | grep -v PPID | while read pid ppid time; do
|
|
23
|
+
# Don't kill main daemon (ppid=1).
|
|
24
|
+
if [[ X"$ppid" != X"1" ]]; then
|
|
25
|
+
hours="$(echo $time | cut -d: -f1 | sed 's/^0//')"
|
|
26
|
+
minutes="$(echo $time | cut -d: -f2 | sed 's/^0//')"
|
|
27
|
+
|
|
28
|
+
if [[ $minutes -gt ${LONGEST} ]] || [[ $hours -gt 0 ]]; then
|
|
29
|
+
k ${pid}
|
|
30
|
+
fi
|
|
31
|
+
fi
|
|
32
|
+
done
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
# Author: Zhang Huangbin <zhb _at_ iredmail.org>
|
|
5
|
+
# Purpose: Assign one user to specified groups.
|
|
6
|
+
|
|
7
|
+
# USAGE
|
|
8
|
+
#
|
|
9
|
+
# * Set correct LDAP server address (LDAP_URI), LDAP suffix (LDAP_SUFFIX),
|
|
10
|
+
# bind dn (BINDDN) and password (BINDPW).
|
|
11
|
+
#
|
|
12
|
+
# * Run this script:
|
|
13
|
+
#
|
|
14
|
+
# $ python3 ldap_assign_user_to_groups.py [options] user@domain.com group@domain.com [group2@domain.com ...]
|
|
15
|
+
|
|
16
|
+
# LDAP server address.
|
|
17
|
+
LDAP_URI = 'ldap://127.0.0.1:389'
|
|
18
|
+
LDAP_SUFFIX = 'dc=example,dc=com'
|
|
19
|
+
|
|
20
|
+
# LDAP base dn, bind dn/password.
|
|
21
|
+
BASEDN = 'o=domains,%s' % LDAP_SUFFIX
|
|
22
|
+
BINDDN = 'cn=Manager,%s' % LDAP_SUFFIX
|
|
23
|
+
BINDPW = 'www'
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
import sys
|
|
27
|
+
import ldap
|
|
28
|
+
|
|
29
|
+
def usage():
|
|
30
|
+
print("""Usage:
|
|
31
|
+
|
|
32
|
+
$ python3 ldap_assign_user_to_groups.py [options] user@domain.com new_group@domain.com [new_group_2@domain.com ...]
|
|
33
|
+
|
|
34
|
+
Note: Non-existing group will be ignored.
|
|
35
|
+
|
|
36
|
+
Optional arguments:
|
|
37
|
+
|
|
38
|
+
--remove Remove memberships. If no mailing list specified, it will remove
|
|
39
|
+
ALL assigned mailing lists.
|
|
40
|
+
|
|
41
|
+
Samples:
|
|
42
|
+
|
|
43
|
+
*) Remove all memberships:
|
|
44
|
+
python3 ldap_assign_user_to_groups.py --remove user@domain.com
|
|
45
|
+
|
|
46
|
+
*) Remove memberships of specified mailing lists:
|
|
47
|
+
python3 ldap_assign_user_to_groups.py --remove user@domain.com group1@domain.com group2@domain.com
|
|
48
|
+
|
|
49
|
+
*) Assign user to new mailing lists:
|
|
50
|
+
python3 ldap_assign_user_to_groups.py user@domain.com group1@domain.com group2@domain.com
|
|
51
|
+
""")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
if len(sys.argv) < 3:
|
|
55
|
+
usage()
|
|
56
|
+
sys.exit()
|
|
57
|
+
|
|
58
|
+
args = sys.argv
|
|
59
|
+
args.pop(0)
|
|
60
|
+
|
|
61
|
+
is_remove = False
|
|
62
|
+
if '--remove' in args:
|
|
63
|
+
args.remove('--remove')
|
|
64
|
+
is_remove = True
|
|
65
|
+
|
|
66
|
+
user = args.pop(0)
|
|
67
|
+
groups = args
|
|
68
|
+
|
|
69
|
+
if not groups and not is_remove:
|
|
70
|
+
print("<<< ERROR >>> No group specified.")
|
|
71
|
+
usage()
|
|
72
|
+
sys.exit()
|
|
73
|
+
|
|
74
|
+
print("* Connecting to LDAP server: %s" % LDAP_URI)
|
|
75
|
+
conn = ldap.initialize(uri=LDAP_URI, trace_level=0)
|
|
76
|
+
conn.bind_s(BINDDN, BINDPW)
|
|
77
|
+
|
|
78
|
+
if not is_remove:
|
|
79
|
+
print("* Querying existing mailing lists.")
|
|
80
|
+
|
|
81
|
+
qr_filter = '(&(objectClass=mailList)(|'
|
|
82
|
+
for g in groups:
|
|
83
|
+
qr_filter += '(mail=%s)(shadowAddress=%s)' % (g, g)
|
|
84
|
+
qr_filter += '))'
|
|
85
|
+
|
|
86
|
+
print("* Query filter:", qr_filter)
|
|
87
|
+
|
|
88
|
+
qr = conn.search_s(BASEDN,
|
|
89
|
+
ldap.SCOPE_SUBTREE,
|
|
90
|
+
qr_filter,
|
|
91
|
+
['mail'])
|
|
92
|
+
|
|
93
|
+
if qr:
|
|
94
|
+
groups = []
|
|
95
|
+
for (dn, entry) in qr:
|
|
96
|
+
groups += entry['mail']
|
|
97
|
+
|
|
98
|
+
print("* Found %d mailing list(s)." % len(groups))
|
|
99
|
+
else:
|
|
100
|
+
sys.exit("* No specified groups found in LDAP.")
|
|
101
|
+
|
|
102
|
+
print("* Get user's dn and membership of mailing list(s).")
|
|
103
|
+
(user_name, domain) = user.split('@', 1)
|
|
104
|
+
user_dn = 'mail=%s,ou=Users,domainName=%s,%s' % (user, domain, BASEDN)
|
|
105
|
+
try:
|
|
106
|
+
qr = conn.search_s(user_dn,
|
|
107
|
+
ldap.SCOPE_BASE,
|
|
108
|
+
'(mail=%s)' % user,
|
|
109
|
+
['mail', 'memberOfGroup'])
|
|
110
|
+
except ldap.NO_SUCH_OBJECT:
|
|
111
|
+
print("* <<< ERROR >>> User doesn't exist: %s" % user)
|
|
112
|
+
sys.exit()
|
|
113
|
+
|
|
114
|
+
(dn, entry) = qr[0]
|
|
115
|
+
|
|
116
|
+
# Get existing, assigned mailing lists.
|
|
117
|
+
existing_groups = entry.get('memberOfGroup', [])
|
|
118
|
+
if existing_groups:
|
|
119
|
+
print("* Existing membership: %s" % ', '.join(existing_groups))
|
|
120
|
+
else:
|
|
121
|
+
print("* User is not member of any mailing list.")
|
|
122
|
+
|
|
123
|
+
# New groups
|
|
124
|
+
if is_remove:
|
|
125
|
+
if groups:
|
|
126
|
+
print("* Remove membership: %s" % ', '.join(groups))
|
|
127
|
+
new_groups = list(set(existing_groups) - set(groups))
|
|
128
|
+
else:
|
|
129
|
+
print("* Remove ALL memberships.")
|
|
130
|
+
new_groups = []
|
|
131
|
+
|
|
132
|
+
# Set to None to remove attribute `memberOfGroup`
|
|
133
|
+
if not new_groups:
|
|
134
|
+
print("* No membership left, remove attribute `memberOfGroup`.")
|
|
135
|
+
new_groups = None
|
|
136
|
+
else:
|
|
137
|
+
new_groups = list(set(existing_groups + groups))
|
|
138
|
+
print("* New membership: %s" % ', '.join(new_groups))
|
|
139
|
+
|
|
140
|
+
mod_attrs = [(ldap.MOD_REPLACE, 'memberOfGroup', new_groups)]
|
|
141
|
+
|
|
142
|
+
try:
|
|
143
|
+
print("* Updating membership.")
|
|
144
|
+
conn.modify_s(dn, mod_attrs)
|
|
145
|
+
print("* Updated.")
|
|
146
|
+
|
|
147
|
+
# Unbind connection.
|
|
148
|
+
print("* Unbind LDAP server.")
|
|
149
|
+
conn.unbind()
|
|
150
|
+
except Exception as e:
|
|
151
|
+
print("<<< ERROR >>> %s" % repr(e))
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
# Author: Zhang Huangbin <zhb _at_ iredmail.org>
|
|
5
|
+
# Purpose: Move or copy ALL members of specified mailing list to another
|
|
6
|
+
# mailing list.
|
|
7
|
+
|
|
8
|
+
# USAGE
|
|
9
|
+
#
|
|
10
|
+
# * Set correct LDAP server address (LDAP_URI), LDAP suffix (LDAP_SUFFIX),
|
|
11
|
+
# bind dn (BINDDN) and password (BINDPW).
|
|
12
|
+
#
|
|
13
|
+
# * Run this script:
|
|
14
|
+
#
|
|
15
|
+
# $ python3 ldap_move_members_to_another_group.py [options] old_group@domain.com new_group@domain.com [new_group2@domain.com ...]
|
|
16
|
+
|
|
17
|
+
# LDAP server address.
|
|
18
|
+
LDAP_URI = 'ldap://127.0.0.1:389'
|
|
19
|
+
LDAP_SUFFIX = 'dc=example,dc=com'
|
|
20
|
+
|
|
21
|
+
# LDAP base dn, bind dn/password.
|
|
22
|
+
BASEDN = 'o=domains,%s' % LDAP_SUFFIX
|
|
23
|
+
BINDDN = 'cn=Manager,%s' % LDAP_SUFFIX
|
|
24
|
+
BINDPW = 'www'
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
import sys
|
|
28
|
+
import ldap
|
|
29
|
+
|
|
30
|
+
def usage():
|
|
31
|
+
print("""Usage:
|
|
32
|
+
|
|
33
|
+
$ python3 ldap_move_members_to_another_group.py [options] old_group@domain.com [new_group@domain.com new_group_2@domain.com ...]
|
|
34
|
+
|
|
35
|
+
Available optional options:
|
|
36
|
+
|
|
37
|
+
--copy Assign members of old group to new groups without removing
|
|
38
|
+
membership of old group. That means user will be member of both
|
|
39
|
+
old and new groups.
|
|
40
|
+
|
|
41
|
+
If no --copy specified, this script will remove membership of old
|
|
42
|
+
group.
|
|
43
|
+
|
|
44
|
+
Samples:
|
|
45
|
+
|
|
46
|
+
*) Copy all members of old_group@domain.com to new_group@domain.com
|
|
47
|
+
python3 ldap_move_members_to_another_group --copy old_group@domain.com new_group@domain.com
|
|
48
|
+
|
|
49
|
+
*) Copy all members of old_group@domain.com to new_group@domain.com, and remove
|
|
50
|
+
ALL members of old_group@domain.com.
|
|
51
|
+
python3 ldap_move_members_to_another_group old_group@domain.com new_group@domain.com
|
|
52
|
+
|
|
53
|
+
*) Remove all members (just remove membership, not remove mail accounts) of
|
|
54
|
+
old_group@domain.com.
|
|
55
|
+
python3 ldap_move_members_to_another_group old_group@domain.com
|
|
56
|
+
""")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
if len(sys.argv) < 3:
|
|
60
|
+
usage()
|
|
61
|
+
sys.exit()
|
|
62
|
+
|
|
63
|
+
args = sys.argv
|
|
64
|
+
args.pop(0)
|
|
65
|
+
|
|
66
|
+
is_copy = False
|
|
67
|
+
if '--copy' in args:
|
|
68
|
+
is_copy = True
|
|
69
|
+
args.remove('--copy')
|
|
70
|
+
|
|
71
|
+
old_group = args.pop(0)
|
|
72
|
+
new_groups = args
|
|
73
|
+
|
|
74
|
+
# Initialize LDAP connection.
|
|
75
|
+
print("* Connecting to LDAP server: %s" % LDAP_URI)
|
|
76
|
+
conn = ldap.initialize(uri=LDAP_URI, trace_level=0)
|
|
77
|
+
conn.bind_s(BINDDN, BINDPW)
|
|
78
|
+
|
|
79
|
+
# Get all members of old mailing list.
|
|
80
|
+
print("* Get all members of old mailing list: %s" % old_group)
|
|
81
|
+
|
|
82
|
+
qr_filter = '(&(objectClass=mailUser)(memberOfGroup=%s))' % old_group
|
|
83
|
+
print("* Query filter:", qr_filter)
|
|
84
|
+
|
|
85
|
+
qr = conn.search_s(BASEDN,
|
|
86
|
+
ldap.SCOPE_SUBTREE,
|
|
87
|
+
qr_filter,
|
|
88
|
+
['memberOfGroup'])
|
|
89
|
+
|
|
90
|
+
total = len(qr)
|
|
91
|
+
|
|
92
|
+
if total:
|
|
93
|
+
print("* Old mailing list has %d member(s)." % total)
|
|
94
|
+
else:
|
|
95
|
+
sys.exit("* Old mailing list doesn't have any member. Exit.")
|
|
96
|
+
|
|
97
|
+
# accumulate counter
|
|
98
|
+
count = 1
|
|
99
|
+
|
|
100
|
+
for user in qr:
|
|
101
|
+
(dn, entry) = user
|
|
102
|
+
|
|
103
|
+
# Get all assigned mailing lists.
|
|
104
|
+
groups = entry['memberOfGroup']
|
|
105
|
+
|
|
106
|
+
if not is_copy:
|
|
107
|
+
# Remove old mailing list
|
|
108
|
+
groups.remove(old_group)
|
|
109
|
+
|
|
110
|
+
# Assign to new mailing list
|
|
111
|
+
if new_groups:
|
|
112
|
+
groups = list(set(groups + new_groups))
|
|
113
|
+
|
|
114
|
+
# Use only value of rdn.
|
|
115
|
+
mod_attrs = [(ldap.MOD_REPLACE, 'memberOfGroup', groups)]
|
|
116
|
+
|
|
117
|
+
try:
|
|
118
|
+
print("* (%d of %d) Updating object: %s" % (count, total, dn))
|
|
119
|
+
conn.modify_s(dn, mod_attrs)
|
|
120
|
+
except Exception as e:
|
|
121
|
+
print("<<< ERROR >>> %s" % repr(e))
|
|
122
|
+
|
|
123
|
+
count += 1
|
|
124
|
+
|
|
125
|
+
# Unbind connection.
|
|
126
|
+
print("* Unbind LDAP server.")
|
|
127
|
+
conn.unbind()
|
|
128
|
+
|
|
129
|
+
print("* Done.")
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# This file is used to migrate SQL table `vmail.alias` for SQL backends.
|
|
3
|
+
#
|
|
4
|
+
# Requirements:
|
|
5
|
+
#
|
|
6
|
+
# * Python 3
|
|
7
|
+
# * Make sure you have new SQL tables ready: alias_moderators, forwardings.
|
|
8
|
+
# * For PostgreSQL, please make sure SQL user 'vmail' has 'SELECT' privilege on
|
|
9
|
+
# newly created sql tables.
|
|
10
|
+
|
|
11
|
+
import sys
|
|
12
|
+
import web
|
|
13
|
+
|
|
14
|
+
web.config.debug = False
|
|
15
|
+
|
|
16
|
+
# Read iRedAdmin config file `settings.py` from one of expected paths
|
|
17
|
+
sys.path.insert(0, '/usr/local/www/iredadmin') # FreeBSD
|
|
18
|
+
sys.path.insert(0, '/opt/www/iredadmin') # Debian/Ubuntu
|
|
19
|
+
sys.path.insert(0, '/var/www/iredadmin') # CentOS/OpenBSD
|
|
20
|
+
sys.path.insert(0, '/usr/share/apache2/iredadmin') # Debian/Ubuntu (old iRedMail releases)
|
|
21
|
+
|
|
22
|
+
import settings
|
|
23
|
+
print("* Read SQL username/password from iRedAdmin config file:", settings.__file__)
|
|
24
|
+
print("* Backend:", settings.backend)
|
|
25
|
+
|
|
26
|
+
if settings.backend in ['ldap', 'mysql']:
|
|
27
|
+
sql_dbn = 'mysql'
|
|
28
|
+
elif settings.backend in ['pgsql']:
|
|
29
|
+
sql_dbn = 'postgres'
|
|
30
|
+
else:
|
|
31
|
+
sys.exit('* << ERROR >>: Unsupported backend (%s).' % settings.backend)
|
|
32
|
+
|
|
33
|
+
try:
|
|
34
|
+
if sql_dbn == 'postgres':
|
|
35
|
+
db = web.database(dbn=sql_dbn,
|
|
36
|
+
host=settings.vmail_db_host,
|
|
37
|
+
port=int(settings.vmail_db_port),
|
|
38
|
+
db=settings.vmail_db_name,
|
|
39
|
+
user=settings.vmail_db_user,
|
|
40
|
+
pw=settings.vmail_db_password)
|
|
41
|
+
else:
|
|
42
|
+
db = web.database(dbn=sql_dbn,
|
|
43
|
+
host=settings.vmail_db_host,
|
|
44
|
+
port=int(settings.vmail_db_port),
|
|
45
|
+
db=settings.vmail_db_name,
|
|
46
|
+
user=settings.vmail_db_user,
|
|
47
|
+
pw=settings.vmail_db_password,
|
|
48
|
+
charset='utf8',
|
|
49
|
+
use_unicode=False)
|
|
50
|
+
|
|
51
|
+
db.supports_multiple_insert = True
|
|
52
|
+
except Exception as e:
|
|
53
|
+
print("<< ERROR >> Cannot connecting to SQL server:", e)
|
|
54
|
+
sys.exit()
|
|
55
|
+
|
|
56
|
+
def __bytes2str(b) -> str:
|
|
57
|
+
"""Convert object `b` to string."""
|
|
58
|
+
if isinstance(b, str):
|
|
59
|
+
return b
|
|
60
|
+
|
|
61
|
+
if isinstance(b, (bytes, bytearray)):
|
|
62
|
+
return b.decode()
|
|
63
|
+
elif isinstance(b, memoryview):
|
|
64
|
+
return b.tobytes().decode()
|
|
65
|
+
else:
|
|
66
|
+
return repr(b)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def bytes2str(b):
|
|
70
|
+
"""Convert `b` from bytes-like type to string."""
|
|
71
|
+
if isinstance(b, (list, web.db.ResultSet)):
|
|
72
|
+
s = [bytes2str(i) for i in b]
|
|
73
|
+
elif isinstance(b, tuple):
|
|
74
|
+
s = tuple([bytes2str(i) for i in b])
|
|
75
|
+
elif isinstance(b, set):
|
|
76
|
+
s = {bytes2str(i) for i in b}
|
|
77
|
+
elif isinstance(b, (dict, web.utils.Storage)):
|
|
78
|
+
new_dict = {}
|
|
79
|
+
for (k, v) in list(b.items()):
|
|
80
|
+
new_dict[k] = bytes2str(v) # v could be list/tuple/dict
|
|
81
|
+
s = new_dict
|
|
82
|
+
else:
|
|
83
|
+
s = __bytes2str(b)
|
|
84
|
+
|
|
85
|
+
return s
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
# Check required tables
|
|
89
|
+
for tbl in ['forwardings', 'alias_moderators']:
|
|
90
|
+
try:
|
|
91
|
+
db.select(tbl, limit=1)
|
|
92
|
+
except:
|
|
93
|
+
print("<<< ERROR >>> SQL table '%s' doesn't exist. Please create it first." % tbl)
|
|
94
|
+
sys.exit()
|
|
95
|
+
|
|
96
|
+
# Get all existing accounts
|
|
97
|
+
records = db.select('alias', what='address,goto,moderators,domain,active,islist,is_alias')
|
|
98
|
+
|
|
99
|
+
total = len(records)
|
|
100
|
+
counter = 1
|
|
101
|
+
for r in records:
|
|
102
|
+
# standard mail alias account
|
|
103
|
+
is_list = 0
|
|
104
|
+
# per-account alias address
|
|
105
|
+
is_alias = 0
|
|
106
|
+
# forwarding addresses of mail user
|
|
107
|
+
is_forwarding = 0
|
|
108
|
+
|
|
109
|
+
if r.islist == 1:
|
|
110
|
+
is_list = 1
|
|
111
|
+
_type = 'mail alias'
|
|
112
|
+
elif r.is_alias == 1:
|
|
113
|
+
is_alias = 1
|
|
114
|
+
_type = 'per-account alias address'
|
|
115
|
+
else:
|
|
116
|
+
is_forwarding = 1
|
|
117
|
+
_type = 'mail user'
|
|
118
|
+
|
|
119
|
+
account = bytes2str(r.address).lower()
|
|
120
|
+
active = int(r.active)
|
|
121
|
+
domain = bytes2str(r.domain).lower()
|
|
122
|
+
|
|
123
|
+
goto = bytes2str(r.goto).strip(' ')
|
|
124
|
+
goto = goto.replace(' ', '')
|
|
125
|
+
goto = goto.replace(';', ',')
|
|
126
|
+
members = list(set([i.strip().lower() for i in goto.strip(' ').split(',')]))
|
|
127
|
+
|
|
128
|
+
# Migrating forwardings
|
|
129
|
+
print("* [%d/%d] Migrating %s %s" % (counter, total, _type, account))
|
|
130
|
+
for m in members:
|
|
131
|
+
if m:
|
|
132
|
+
try:
|
|
133
|
+
dest_domain = m.split('@', 1)[-1]
|
|
134
|
+
|
|
135
|
+
db.insert('forwardings',
|
|
136
|
+
address=account,
|
|
137
|
+
forwarding=m,
|
|
138
|
+
domain=domain,
|
|
139
|
+
dest_domain=dest_domain,
|
|
140
|
+
active=active,
|
|
141
|
+
is_list=is_list,
|
|
142
|
+
is_alias=is_alias,
|
|
143
|
+
is_forwarding=is_forwarding)
|
|
144
|
+
|
|
145
|
+
except Exception as e:
|
|
146
|
+
if e[0] == 1062 or 'duplicate' in repr(e):
|
|
147
|
+
# Duplicate record
|
|
148
|
+
pass
|
|
149
|
+
else:
|
|
150
|
+
print("Error while migrating %s %s: %s" % (_type, m, repr(e)))
|
|
151
|
+
|
|
152
|
+
# Migrating moderators of mail alias account
|
|
153
|
+
moderators = []
|
|
154
|
+
if is_list == 1:
|
|
155
|
+
if r.moderators:
|
|
156
|
+
moderators = [i.lower() for i in set(r.moderators.strip(' ').split(','))]
|
|
157
|
+
|
|
158
|
+
if moderators:
|
|
159
|
+
for m in moderators:
|
|
160
|
+
try:
|
|
161
|
+
dest_domain = m.split('@', 1)[-1]
|
|
162
|
+
|
|
163
|
+
db.insert('alias_moderators',
|
|
164
|
+
address=account,
|
|
165
|
+
moderator=m,
|
|
166
|
+
domain=domain,
|
|
167
|
+
dest_domain=dest_domain)
|
|
168
|
+
except Exception as e:
|
|
169
|
+
if e[0] == 1062 or 'duplicate' in repr(e):
|
|
170
|
+
# Duplicate record
|
|
171
|
+
pass
|
|
172
|
+
else:
|
|
173
|
+
print("Error while migrating moderators of alias account %s: %s" % (m, repr(e)))
|
|
174
|
+
|
|
175
|
+
counter += 1
|
|
176
|
+
|
|
177
|
+
print("* DONE.")
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
-- If subject contains emoji, varchar doesn't work well.
|
|
2
|
+
ALTER TABLE msgs MODIFY COLUMN subject VARBINARY(255) DEFAULT '';
|
|
3
|
+
ALTER TABLE msgs MODIFY COLUMN from_addr VARBINARY(255) DEFAULT '';
|
|
4
|
+
|
|
5
|
+
-- mail address without address extension: user+abc@domain.com -> user@domain.com
|
|
6
|
+
ALTER TABLE maddr ADD COLUMN email_raw varbinary(255) NOT NULL DEFAULT '';
|
|
7
|
+
|
|
8
|
+
-- index
|
|
9
|
+
CREATE INDEX maddr_idx_email_raw ON maddr (email_raw);
|
|
10
|
+
|
|
11
|
+
-- Create trigger to save email address withou address extension
|
|
12
|
+
-- user+abc@domain.com -> user@domain.com
|
|
13
|
+
DELIMITER //
|
|
14
|
+
CREATE TRIGGER `maddr_email_raw`
|
|
15
|
+
BEFORE INSERT
|
|
16
|
+
ON `maddr`
|
|
17
|
+
FOR EACH ROW
|
|
18
|
+
BEGIN
|
|
19
|
+
IF (NEW.email LIKE '%+%') THEN
|
|
20
|
+
SET NEW.email_raw = CONCAT(SUBSTRING_INDEX(NEW.email, '+', 1), '@', SUBSTRING_INDEX(new.email, '@', -1));
|
|
21
|
+
ELSE
|
|
22
|
+
SET NEW.email_raw = NEW.email;
|
|
23
|
+
END IF;
|
|
24
|
+
END;
|
|
25
|
+
//
|
|
26
|
+
DELIMITER ;
|
|
27
|
+
|
|
28
|
+
-- Update all existing records.
|
|
29
|
+
UPDATE maddr SET email_raw=email WHERE email_raw='';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
-- If subject/from_addr contains emoji, varchar doesn't work well.
|
|
2
|
+
ALTER TABLE msgs ALTER COLUMN subject DROP DEFAULT;
|
|
3
|
+
ALTER TABLE msgs ALTER COLUMN subject TYPE bytea USING subject::bytea;
|
|
4
|
+
ALTER TABLE msgs ALTER COLUMN subject SET DEFAULT '';
|
|
5
|
+
|
|
6
|
+
ALTER TABLE msgs ALTER COLUMN from_addr DROP DEFAULT;
|
|
7
|
+
ALTER TABLE msgs ALTER COLUMN from_addr TYPE bytea USING subject::bytea;
|
|
8
|
+
ALTER TABLE msgs ALTER COLUMN from_addr SET DEFAULT '';
|
|
9
|
+
|
|
10
|
+
-- mail address without address extension: user+abc@domain.com -> user@domain.com
|
|
11
|
+
ALTER TABLE maddr ADD COLUMN email_raw VARCHAR(255) NOT NULL DEFAULT '';
|
|
12
|
+
|
|
13
|
+
-- index
|
|
14
|
+
CREATE INDEX maddr_idx_email ON maddr (email);
|
|
15
|
+
CREATE INDEX maddr_idx_email_raw ON maddr (email_raw);
|
|
16
|
+
CREATE INDEX maddr_idx_domain ON maddr (domain);
|
|
17
|
+
|
|
18
|
+
-- Create trigger to save email address withou address extension
|
|
19
|
+
-- user+abc@domain.com -> user@domain.com
|
|
20
|
+
-- CREATE OR REPLACE FUNCTION strip_addr_extension(bytea, varchar, integer) RETURNS TRIGGER AS $$
|
|
21
|
+
CREATE OR REPLACE FUNCTION strip_addr_extension()
|
|
22
|
+
RETURNS TRIGGER AS $$
|
|
23
|
+
BEGIN
|
|
24
|
+
IF (NEW.email LIKE '%+%') THEN
|
|
25
|
+
NEW.email_raw := split_part(convert_from(NEW.email, 'UTF8'), '+', 1) || '@' || split_part(convert_from(NEW.email, 'UTF8'), '@', 2);
|
|
26
|
+
ELSE
|
|
27
|
+
NEW.email_raw := convert_from(NEW.email, 'UTF8');
|
|
28
|
+
END IF;
|
|
29
|
+
RETURN NEW;
|
|
30
|
+
END;
|
|
31
|
+
$$ LANGUAGE plpgsql;
|
|
32
|
+
|
|
33
|
+
CREATE TRIGGER maddr_email_raw
|
|
34
|
+
BEFORE INSERT ON maddr
|
|
35
|
+
FOR EACH ROW
|
|
36
|
+
EXECUTE PROCEDURE strip_addr_extension();
|
|
37
|
+
|
|
38
|
+
-- Update all existing records.
|
|
39
|
+
UPDATE maddr SET email_raw=email WHERE email_raw='';
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
-- USE vmail;
|
|
2
|
+
|
|
3
|
+
-- DROP column
|
|
4
|
+
ALTER TABLE mailbox DROP COLUMN local_part;
|
|
5
|
+
|
|
6
|
+
-- New SQL column
|
|
7
|
+
ALTER TABLE mailbox ADD COLUMN enableimaptls TINYINT(1) NOT NULL DEFAULT 1;
|
|
8
|
+
ALTER TABLE mailbox ADD INDEX (enableimaptls);
|
|
9
|
+
ALTER TABLE mailbox ADD COLUMN enablepop3tls TINYINT(1) NOT NULL DEFAULT 1;
|
|
10
|
+
ALTER TABLE mailbox ADD INDEX (enablepop3tls);
|
|
11
|
+
ALTER TABLE mailbox ADD COLUMN enablesievetls TINYINT(1) NOT NULL DEFAULT 1;
|
|
12
|
+
ALTER TABLE mailbox ADD INDEX (enablesievetls);
|
|
13
|
+
|
|
14
|
+
-- Rename table
|
|
15
|
+
RENAME TABLE alias_moderators TO moderators;
|
|
16
|
+
|
|
17
|
+
-- Column used to limit number of mailing lists a domain admin can create
|
|
18
|
+
ALTER TABLE domain ADD COLUMN maillists INT(10) NOT NULL DEFAULT 0;
|
|
19
|
+
|
|
20
|
+
-- Column used to mark sql record is a mailing list
|
|
21
|
+
ALTER TABLE forwardings ADD COLUMN `is_maillist` TINYINT(1) NOT NULL DEFAULT 0;
|
|
22
|
+
ALTER TABLE forwardings ADD INDEX (`is_maillist`);
|
|
23
|
+
|
|
24
|
+
-- Table used to store mailing list accounts
|
|
25
|
+
CREATE TABLE IF NOT EXISTS maillists (
|
|
26
|
+
id BIGINT(20) UNSIGNED AUTO_INCREMENT,
|
|
27
|
+
address VARCHAR(255) NOT NULL DEFAULT '',
|
|
28
|
+
domain VARCHAR(255) NOT NULL DEFAULT '',
|
|
29
|
+
-- Per mailing list transport. for example: 'mlmmj:example.com/listname'.
|
|
30
|
+
transport VARCHAR(255) NOT NULL DEFAULT '',
|
|
31
|
+
accesspolicy VARCHAR(30) NOT NULL DEFAULT '',
|
|
32
|
+
maxmsgsize BIGINT(20) NOT NULL DEFAULT 0,
|
|
33
|
+
-- name of the mailing list
|
|
34
|
+
name VARCHAR(255) NOT NULL DEFAULT '',
|
|
35
|
+
-- short introduction of the mailing list on subscription page
|
|
36
|
+
description TEXT,
|
|
37
|
+
-- a server-wide unique id (a 36-characters string) for each mailing list
|
|
38
|
+
mlid VARCHAR(36) NOT NULL DEFAULT '',
|
|
39
|
+
-- control whether newsletter-style subscription from website is enabled
|
|
40
|
+
-- 1 -> enabled, 0 -> disabled
|
|
41
|
+
is_newsletter TINYINT(1) NOT NULL DEFAULT 0,
|
|
42
|
+
settings TEXT,
|
|
43
|
+
created DATETIME NOT NULL DEFAULT '1970-01-01 01:01:01',
|
|
44
|
+
modified DATETIME NOT NULL DEFAULT '1970-01-01 01:01:01',
|
|
45
|
+
expired DATETIME NOT NULL DEFAULT '9999-12-31 00:00:00',
|
|
46
|
+
active TINYINT(1) NOT NULL DEFAULT 1,
|
|
47
|
+
PRIMARY KEY (id),
|
|
48
|
+
UNIQUE INDEX (address),
|
|
49
|
+
UNIQUE INDEX (mlid),
|
|
50
|
+
INDEX (is_newsletter),
|
|
51
|
+
INDEX (domain),
|
|
52
|
+
INDEX (active)
|
|
53
|
+
) ENGINE=InnoDB;
|