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,156 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Author: Zhang Huangbin (zhb@iredmail.org)
|
|
4
|
+
# Purpose: Backup SOGo database with `sogo-tool` command.
|
|
5
|
+
# You can run this script manually or via crontab (recommended).
|
|
6
|
+
#
|
|
7
|
+
# Backing up SOGo data by dumping SQL database to a plain SQL file is not ideal
|
|
8
|
+
# because:
|
|
9
|
+
#
|
|
10
|
+
# - it's hard to restore single user's data
|
|
11
|
+
# - if SOGo changes some SQL structure, it's hard to restore all data.
|
|
12
|
+
#
|
|
13
|
+
# This script does backup with 'sogo-tool backup' command to avoid issues
|
|
14
|
+
# mentioned above, it stores each user's data in a single file, so you can
|
|
15
|
+
# restore a single user's data or all users data with 'sogo-tool restore'.
|
|
16
|
+
|
|
17
|
+
# Required commands:
|
|
18
|
+
#
|
|
19
|
+
# + sogo-tool
|
|
20
|
+
# + tar
|
|
21
|
+
# + bzip2
|
|
22
|
+
|
|
23
|
+
# USAGE
|
|
24
|
+
#
|
|
25
|
+
# * It stores backup copies under '/var/vmail/backup/sogo' by default,
|
|
26
|
+
# feel free to change it with variable BACKUP_ROOTDIR below.
|
|
27
|
+
#
|
|
28
|
+
# * If you want to log a message in iRedAdmin database (`iredadmin.log`),
|
|
29
|
+
# please specify correct MySQL username in variable MYSQL_USER, and
|
|
30
|
+
# write the same MySQL username and password in file /root/.my.cnf.
|
|
31
|
+
#
|
|
32
|
+
# * Add crontab job for root user:
|
|
33
|
+
#
|
|
34
|
+
# # crontab -e -u root
|
|
35
|
+
# 1 4 * * * bash /var/vmail/backup/backup_sogo.sh
|
|
36
|
+
|
|
37
|
+
# Keep backup for how many days. Defaults to 90 days.
|
|
38
|
+
export KEEP_DAYS='90'
|
|
39
|
+
|
|
40
|
+
# Where to store backup copies.
|
|
41
|
+
export BACKUP_ROOTDIR='/var/vmail/backup'
|
|
42
|
+
|
|
43
|
+
# MySQL username. Root user is required to dump all databases.
|
|
44
|
+
export MYSQL_USER='root'
|
|
45
|
+
|
|
46
|
+
# ~/.my.cnf
|
|
47
|
+
export MYSQL_DOT_MY_CNF='/root/.my.cnf'
|
|
48
|
+
|
|
49
|
+
export CMD_MYSQL="mysql --defaults-file=${MYSQL_DOT_MY_CNF} -u${MYSQL_USER}"
|
|
50
|
+
|
|
51
|
+
#########################################################
|
|
52
|
+
# You do *NOT* need to modify below lines.
|
|
53
|
+
#########################################################
|
|
54
|
+
# FreeBSD has 'sogo-tool' in different directory.
|
|
55
|
+
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin:/usr/local/GNUstep/Local/Tools/Admin:$PATH
|
|
56
|
+
|
|
57
|
+
# Commands.
|
|
58
|
+
export CMD_DATE='/bin/date'
|
|
59
|
+
export CMD_DU='du -sh'
|
|
60
|
+
export CMD_COMPRESS='bzip2 -9'
|
|
61
|
+
export COMPRESS_SUFFIX='bz2'
|
|
62
|
+
|
|
63
|
+
# Path to sogo-tool command.
|
|
64
|
+
export CMD_SOGO_TOOL='sogo-tool'
|
|
65
|
+
|
|
66
|
+
# Date.
|
|
67
|
+
export YEAR="$(${CMD_DATE} +%Y)"
|
|
68
|
+
export MONTH="$(${CMD_DATE} +%m)"
|
|
69
|
+
export DAY="$(${CMD_DATE} +%d)"
|
|
70
|
+
export TIME="$(${CMD_DATE} +%H-%M-%S)"
|
|
71
|
+
export TIMESTAMP="${YEAR}-${MONTH}-${DAY}-${TIME}"
|
|
72
|
+
|
|
73
|
+
# Pre-defined backup status
|
|
74
|
+
export BACKUP_SUCCESS='YES'
|
|
75
|
+
|
|
76
|
+
# Define, check, create directories.
|
|
77
|
+
export BACKUP_DIR="${BACKUP_ROOTDIR}/sogo/${YEAR}/${MONTH}/${DAY}"
|
|
78
|
+
|
|
79
|
+
# Find the old backup which should be removed.
|
|
80
|
+
export REMOVE_OLD_BACKUP='YES'
|
|
81
|
+
|
|
82
|
+
export KERNEL="$(uname -s)"
|
|
83
|
+
if [[ X"${KERNEL}" == X'Linux' ]]; then
|
|
84
|
+
shift_year=$(date --date="${KEEP_DAYS} days ago" "+%Y")
|
|
85
|
+
shift_month=$(date --date="${KEEP_DAYS} days ago" "+%m")
|
|
86
|
+
shift_day=$(date --date="${KEEP_DAYS} days ago" "+%d")
|
|
87
|
+
elif [[ X"${KERNEL}" == X'FreeBSD' ]]; then
|
|
88
|
+
shift_year=$(date -j -v-${KEEP_DAYS}d "+%Y")
|
|
89
|
+
shift_month=$(date -j -v-${KEEP_DAYS}d "+%m")
|
|
90
|
+
shift_day=$(date -j -v-${KEEP_DAYS}d "+%d")
|
|
91
|
+
elif [[ X"${KERNEL}" == X'OpenBSD' ]]; then
|
|
92
|
+
epoch_seconds_now="$(date +%s)"
|
|
93
|
+
epoch_shift="$((${KEEP_DAYS} * 86400))"
|
|
94
|
+
epoch_seconds_old="$((epoch_seconds_now - epoch_shift))"
|
|
95
|
+
|
|
96
|
+
shift_year=$(date -r ${epoch_seconds_old} "+%Y")
|
|
97
|
+
shift_month=$(date -r ${epoch_seconds_old} "+%m")
|
|
98
|
+
shift_day=$(date -r ${epoch_seconds_old} "+%d")
|
|
99
|
+
else
|
|
100
|
+
export REMOVE_OLD_BACKUP='NO'
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
export REMOVED_BACKUP="${BACKUP_ROOTDIR}/sogo/${shift_year}/${shift_month}/${shift_day}.tar.bz2"
|
|
104
|
+
export REMOVED_BACKUP_MONTH_DIR="${BACKUP_ROOTDIR}/sogo/${shift_year}/${shift_month}"
|
|
105
|
+
export REMOVED_BACKUP_YEAR_DIR="${BACKUP_ROOTDIR}/sogo/${shift_year}"
|
|
106
|
+
|
|
107
|
+
# Check and create directories.
|
|
108
|
+
if [ ! -d ${BACKUP_DIR} ]; then
|
|
109
|
+
mkdir -p ${BACKUP_DIR} 2>/dev/null
|
|
110
|
+
chown -R root ${BACKUP_DIR}
|
|
111
|
+
chmod -R 0700 ${BACKUP_DIR}
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
# Backup
|
|
115
|
+
echo "* Backup all users' data under ${BACKUP_DIR}"
|
|
116
|
+
${CMD_SOGO_TOOL} backup ${BACKUP_DIR} ALL
|
|
117
|
+
|
|
118
|
+
dir_name="$(dirname ${BACKUP_DIR})"
|
|
119
|
+
base_name="$(basename ${BACKUP_DIR})"
|
|
120
|
+
|
|
121
|
+
if ls ${BACKUP_DIR} | grep -i '[a-z0-9]' &>/dev/null; then
|
|
122
|
+
# Backup is not empty.
|
|
123
|
+
chown -R root ${BACKUP_DIR}
|
|
124
|
+
chmod -R 0700 ${BACKUP_DIR}
|
|
125
|
+
|
|
126
|
+
# Get original size of backup files
|
|
127
|
+
original_size="$(${CMD_DU} ${BACKUP_DIR} | awk '{print $1}')"
|
|
128
|
+
|
|
129
|
+
# Compress the directory.
|
|
130
|
+
echo "* Compress backup files."
|
|
131
|
+
cd ${dir_name} &&\
|
|
132
|
+
tar cjf ${base_name}.tar.bz2 ${base_name} && \
|
|
133
|
+
chown root ${base_name}.tar.bz2 && \
|
|
134
|
+
chmod 0400 ${base_name}.tar.bz2 && \
|
|
135
|
+
rm -rf ${base_name}
|
|
136
|
+
|
|
137
|
+
compressed_size="$(${CMD_DU} ${base_name}.tar.bz2 | awk '{print $1}')"
|
|
138
|
+
if [ -n X"${MYSQL_USER}" -a -f ${MYSQL_DOT_MY_CNF} ]; then
|
|
139
|
+
sql_log_msg="INSERT INTO log (event, loglevel, msg, admin, ip, timestamp) VALUES ('backup', 'info', 'SOGo data. size: ${compressed_size} (original: ${original_size})', 'cron_backup_sogo', '127.0.0.1', UTC_TIMESTAMP());"
|
|
140
|
+
${CMD_MYSQL} iredadmin -e "${sql_log_msg}"
|
|
141
|
+
fi
|
|
142
|
+
else
|
|
143
|
+
echo "* Backup is empty, remove temporary backup directory: ${BACKUP_DIR}."
|
|
144
|
+
rm -rf ${BACKUP_DIR} &>/dev/null
|
|
145
|
+
fi
|
|
146
|
+
|
|
147
|
+
if [ X"${REMOVE_OLD_BACKUP}" == X'YES' -a -f ${REMOVED_BACKUP} ]; then
|
|
148
|
+
echo -e "* Old backup found. Deleting: ${REMOVED_BACKUP}."
|
|
149
|
+
rm -rf ${REMOVED_BACKUP} &>/dev/null
|
|
150
|
+
|
|
151
|
+
# Try to remove empty directory.
|
|
152
|
+
rmdir ${REMOVED_BACKUP_MONTH_DIR} 2>/dev/null
|
|
153
|
+
rmdir ${REMOVED_BACKUP_YEAR_DIR} 2>/dev/null
|
|
154
|
+
fi
|
|
155
|
+
|
|
156
|
+
exit 0
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
# Author: Zhang Huangbin <zhb _at_ iredmail.org>
|
|
5
|
+
# Purpose: Add new OpenLDAP user for postfix mail server.
|
|
6
|
+
# Project: iRedMail (http://www.iredmail.org/)
|
|
7
|
+
|
|
8
|
+
# --------------------------- WARNING ------------------------------
|
|
9
|
+
# This script only works under iRedMail >= 0.4.0 due to ldap schema
|
|
10
|
+
# changes.
|
|
11
|
+
# ------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
# ---------------------------- USAGE -------------------------------
|
|
14
|
+
# Put your user list in a csv format file, e.g. users.csv, and then
|
|
15
|
+
# import users listed in the file:
|
|
16
|
+
#
|
|
17
|
+
# $ python3 create_mail_user_OpenLDAP.py users.csv
|
|
18
|
+
#
|
|
19
|
+
# ------------------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
# ------------------------- SETTINGS -------------------------------
|
|
22
|
+
# LDAP server address.
|
|
23
|
+
LDAP_URI = 'ldap://127.0.0.1:389'
|
|
24
|
+
|
|
25
|
+
# LDAP base dn.
|
|
26
|
+
BASEDN = 'o=domains,dc=example,dc=com'
|
|
27
|
+
|
|
28
|
+
# Bind dn/password
|
|
29
|
+
BINDDN = 'cn=Manager,dc=example,dc=com'
|
|
30
|
+
BINDPW = 'password'
|
|
31
|
+
|
|
32
|
+
# Storage base directory.
|
|
33
|
+
STORAGE_BASE_DIRECTORY = '/var/vmail/vmail1'
|
|
34
|
+
|
|
35
|
+
# Append timestamp in maildir path.
|
|
36
|
+
APPEND_TIMESTAMP_IN_MAILDIR = True
|
|
37
|
+
|
|
38
|
+
# Get base directory and storage node.
|
|
39
|
+
std = STORAGE_BASE_DIRECTORY.rstrip('/').split('/')
|
|
40
|
+
STORAGE_NODE = std.pop()
|
|
41
|
+
|
|
42
|
+
# Hashed maildir: True, False.
|
|
43
|
+
# Example:
|
|
44
|
+
# domain: domain.ltd,
|
|
45
|
+
# user: zhang (zhang@domain.ltd)
|
|
46
|
+
#
|
|
47
|
+
# - hashed: d/do/domain.ltd/z/zh/zha/zhang/
|
|
48
|
+
# - normal: domain.ltd/zhang/
|
|
49
|
+
HASHED_MAILDIR = True
|
|
50
|
+
|
|
51
|
+
# Default password schemes.
|
|
52
|
+
# Multiple passwords are supported if you separate schemes with '+'.
|
|
53
|
+
# For example: 'SSHA+NTLM', 'CRAM-MD5+SSHA', 'CRAM-MD5+SSHA+MD5'.
|
|
54
|
+
DEFAULT_PASSWORD_SCHEME = 'SSHA512'
|
|
55
|
+
|
|
56
|
+
# Do not prefix password scheme name in password hash.
|
|
57
|
+
HASHES_WITHOUT_PREFIXED_PASSWORD_SCHEME = ['NTLM']
|
|
58
|
+
# ------------------------------------------------------------------
|
|
59
|
+
|
|
60
|
+
import os
|
|
61
|
+
import sys
|
|
62
|
+
import time
|
|
63
|
+
import datetime
|
|
64
|
+
from subprocess import Popen, PIPE
|
|
65
|
+
from typing import List, Dict
|
|
66
|
+
import re
|
|
67
|
+
|
|
68
|
+
try:
|
|
69
|
+
import ldif
|
|
70
|
+
except ImportError:
|
|
71
|
+
print("""
|
|
72
|
+
Error: You don't have python-ldap installed, Please install it first.
|
|
73
|
+
|
|
74
|
+
You can install it like this:
|
|
75
|
+
|
|
76
|
+
- On RHEL/CentOS 5.x:
|
|
77
|
+
|
|
78
|
+
$ sudo yum install python-ldap
|
|
79
|
+
|
|
80
|
+
- On Debian & Ubuntu:
|
|
81
|
+
|
|
82
|
+
$ sudo apt install python-ldap
|
|
83
|
+
""")
|
|
84
|
+
sys.exit()
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def usage():
|
|
88
|
+
print("""
|
|
89
|
+
CSV file format:
|
|
90
|
+
|
|
91
|
+
domain name, username, password, [common name], [quota_in_bytes], [groups]
|
|
92
|
+
|
|
93
|
+
Example #1:
|
|
94
|
+
iredmail.org, zhang, plain_password, Zhang Huangbin, 104857600, group1:group2
|
|
95
|
+
Example #2:
|
|
96
|
+
iredmail.org, zhang, plain_password, Zhang Huangbin, ,
|
|
97
|
+
Example #3:
|
|
98
|
+
iredmail.org, zhang, plain_password, , 104857600, group1:group2
|
|
99
|
+
|
|
100
|
+
Note:
|
|
101
|
+
- Domain name, username and password are REQUIRED, others are optional:
|
|
102
|
+
+ common name.
|
|
103
|
+
* It will be the same as username if it's empty.
|
|
104
|
+
* Non-ascii character is allowed in this field, they will be
|
|
105
|
+
encoded automaticly. Such as Chinese, Korea, Japanese, etc.
|
|
106
|
+
+ quota. It will be 0 (unlimited quota) if it's empty.
|
|
107
|
+
+ groups.
|
|
108
|
+
* valid group name (hr@a.cn): hr
|
|
109
|
+
* incorrect group name: hr@a.cn
|
|
110
|
+
* Do *NOT* include domain name in group name, it will be
|
|
111
|
+
appended automaticly.
|
|
112
|
+
* Multiple groups must be seperated by colon.
|
|
113
|
+
- Leading and trailing Space will be ignored.
|
|
114
|
+
""")
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def __str2bytes(s) -> bytes:
|
|
118
|
+
"""Convert `s` from string to bytes."""
|
|
119
|
+
if isinstance(s, bytes):
|
|
120
|
+
return s
|
|
121
|
+
elif isinstance(s, str):
|
|
122
|
+
return s.encode()
|
|
123
|
+
elif isinstance(s, (int, float)):
|
|
124
|
+
return str(s).encode()
|
|
125
|
+
else:
|
|
126
|
+
return bytes(s)
|
|
127
|
+
|
|
128
|
+
def __attr_ldif(attr, value, default=None) -> List:
|
|
129
|
+
"""Generate a list of LDIF data with given attribute name and value.
|
|
130
|
+
Returns empty list if no valid value.
|
|
131
|
+
|
|
132
|
+
Value is properly handled with str/bytes/list/tuple/set types, and
|
|
133
|
+
converted to list of bytes at the end.
|
|
134
|
+
|
|
135
|
+
To generate ldif list with ldap modification like `ldap.MOD_REPLACE`,
|
|
136
|
+
please use function `mod_replace()` instead.
|
|
137
|
+
"""
|
|
138
|
+
_ldif = []
|
|
139
|
+
v = value or default
|
|
140
|
+
if v:
|
|
141
|
+
if isinstance(value, (list, tuple, set)):
|
|
142
|
+
lst = []
|
|
143
|
+
for i in v:
|
|
144
|
+
# Avoid duplicate element.
|
|
145
|
+
if i in lst:
|
|
146
|
+
continue
|
|
147
|
+
|
|
148
|
+
if isinstance(i, bytes):
|
|
149
|
+
lst.append(i)
|
|
150
|
+
else:
|
|
151
|
+
lst.append(__str2bytes(i))
|
|
152
|
+
|
|
153
|
+
_ldif = [(attr, lst)]
|
|
154
|
+
else:
|
|
155
|
+
_ldif = [(attr, [__str2bytes(v)])]
|
|
156
|
+
|
|
157
|
+
return _ldif
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def __attrs_ldif(kvs: Dict) -> List:
|
|
161
|
+
lst = []
|
|
162
|
+
for (k, v) in kvs.items():
|
|
163
|
+
lst += __attr_ldif(k, v)
|
|
164
|
+
|
|
165
|
+
return lst
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
# Return list of modification operation.
|
|
169
|
+
def mail_to_user_dn(mail):
|
|
170
|
+
"""Convert email address to ldap dn of normail mail user."""
|
|
171
|
+
if mail.count('@') != 1:
|
|
172
|
+
return ''
|
|
173
|
+
|
|
174
|
+
user, domain = mail.split('@')
|
|
175
|
+
|
|
176
|
+
# User DN format.
|
|
177
|
+
# mail=user@domain.ltd,domainName=domain.ltd,[LDAP_BASEDN]
|
|
178
|
+
dn = 'mail=%s,ou=Users,domainName=%s,%s' % (mail, domain, BASEDN)
|
|
179
|
+
|
|
180
|
+
return dn
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def generate_password_with_doveadmpw(plain_password, scheme=None):
|
|
184
|
+
"""Generate password hash with `doveadm pw` command.
|
|
185
|
+
Return SSHA instead if no 'doveadm' command found or other error raised."""
|
|
186
|
+
if not scheme:
|
|
187
|
+
scheme = DEFAULT_PASSWORD_SCHEME
|
|
188
|
+
|
|
189
|
+
scheme = scheme.upper()
|
|
190
|
+
p = str(plain_password).strip()
|
|
191
|
+
|
|
192
|
+
pp = Popen(['doveadm', 'pw', '-s', scheme, '-p', p], stdout=PIPE)
|
|
193
|
+
pw = pp.communicate()[0]
|
|
194
|
+
|
|
195
|
+
if scheme in HASHES_WITHOUT_PREFIXED_PASSWORD_SCHEME:
|
|
196
|
+
pw.lstrip('{' + scheme + '}')
|
|
197
|
+
|
|
198
|
+
# remove '\n'
|
|
199
|
+
pw = pw.strip()
|
|
200
|
+
|
|
201
|
+
return pw
|
|
202
|
+
|
|
203
|
+
def get_days_of_today():
|
|
204
|
+
"""Return number of days since 1970-01-01."""
|
|
205
|
+
today = datetime.date.today()
|
|
206
|
+
|
|
207
|
+
try:
|
|
208
|
+
return (datetime.date(today.year, today.month, today.day) - datetime.date(1970, 1, 1)).days
|
|
209
|
+
except:
|
|
210
|
+
return 0
|
|
211
|
+
|
|
212
|
+
def ldif_mailuser(domain, username, passwd, cn, quota, groups=''):
|
|
213
|
+
# Append timestamp in maildir path
|
|
214
|
+
DATE = time.strftime('%Y.%m.%d.%H.%M.%S')
|
|
215
|
+
TIMESTAMP_IN_MAILDIR = ''
|
|
216
|
+
if APPEND_TIMESTAMP_IN_MAILDIR:
|
|
217
|
+
TIMESTAMP_IN_MAILDIR = '-%s' % DATE
|
|
218
|
+
|
|
219
|
+
if quota == '':
|
|
220
|
+
quota = '0'
|
|
221
|
+
|
|
222
|
+
# Remove SPACE in username.
|
|
223
|
+
username = str(username).lower().strip().replace(' ', '')
|
|
224
|
+
|
|
225
|
+
if cn == '':
|
|
226
|
+
cn = username
|
|
227
|
+
|
|
228
|
+
mail = username + '@' + domain
|
|
229
|
+
dn = mail_to_user_dn(mail)
|
|
230
|
+
|
|
231
|
+
# Get group list.
|
|
232
|
+
if groups.strip() != '':
|
|
233
|
+
groups = groups.strip().split(':')
|
|
234
|
+
for i in range(len(groups)):
|
|
235
|
+
groups[i] = groups[i] + '@' + domain
|
|
236
|
+
|
|
237
|
+
maildir_domain = str(domain).lower()
|
|
238
|
+
if HASHED_MAILDIR is True:
|
|
239
|
+
str1 = str2 = str3 = username[0]
|
|
240
|
+
if len(username) >= 3:
|
|
241
|
+
str2 = username[1]
|
|
242
|
+
str3 = username[2]
|
|
243
|
+
elif len(username) == 2:
|
|
244
|
+
str2 = str3 = username[1]
|
|
245
|
+
|
|
246
|
+
maildir_user = "%s/%s/%s/%s%s/" % (str1, str2, str3, username, TIMESTAMP_IN_MAILDIR, )
|
|
247
|
+
mailMessageStore = maildir_domain + '/' + maildir_user
|
|
248
|
+
else:
|
|
249
|
+
mailMessageStore = "%s/%s%s/" % (domain, username, TIMESTAMP_IN_MAILDIR)
|
|
250
|
+
|
|
251
|
+
homeDirectory = STORAGE_BASE_DIRECTORY + '/' + mailMessageStore
|
|
252
|
+
|
|
253
|
+
_ldif = __attrs_ldif({
|
|
254
|
+
'objectClass': ['inetOrgPerson', 'mailUser', 'shadowAccount', 'amavisAccount'],
|
|
255
|
+
'mail': mail,
|
|
256
|
+
'userPassword': generate_password_with_doveadmpw(passwd),
|
|
257
|
+
'mailQuota': quota,
|
|
258
|
+
'cn': cn,
|
|
259
|
+
'sn': username,
|
|
260
|
+
'uid': username,
|
|
261
|
+
'homeDirectory': homeDirectory,
|
|
262
|
+
'accountStatus': 'active',
|
|
263
|
+
'enabledService': ['internal', 'doveadm', 'lib-storage',
|
|
264
|
+
'indexer-worker', 'dsync', 'quota-status',
|
|
265
|
+
'mail',
|
|
266
|
+
'smtp', 'smtpsecured', 'smtptls',
|
|
267
|
+
'pop3', 'pop3secured', 'pop3tls',
|
|
268
|
+
'imap', 'imapsecured', 'imaptls',
|
|
269
|
+
'managesieve', 'managesievesecured', 'managesievetls',
|
|
270
|
+
'sieve', 'sievesecured', 'sievetls',
|
|
271
|
+
'deliver', 'lda', 'lmtp', 'forward',
|
|
272
|
+
'senderbcc', 'recipientbcc',
|
|
273
|
+
'sogo', 'sogowebmail', 'sogocalendar', 'sogoactivesync',
|
|
274
|
+
'shadowaddress',
|
|
275
|
+
'displayedInGlobalAddressBook'],
|
|
276
|
+
'memberOfGroup': groups,
|
|
277
|
+
# shadowAccount integration.
|
|
278
|
+
'shadowLastChange': get_days_of_today(),
|
|
279
|
+
# Amavisd integration.
|
|
280
|
+
'amavisLocal': 'TRUE',
|
|
281
|
+
})
|
|
282
|
+
|
|
283
|
+
return dn, _ldif
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
if len(sys.argv) != 2 or len(sys.argv) > 2:
|
|
287
|
+
print("""Usage: $ python3 %s users.csv""" % sys.argv[0])
|
|
288
|
+
usage()
|
|
289
|
+
sys.exit()
|
|
290
|
+
else:
|
|
291
|
+
CSV = sys.argv[1]
|
|
292
|
+
if not os.path.exists(CSV):
|
|
293
|
+
print("Error: file not exist:", CSV)
|
|
294
|
+
sys.exit()
|
|
295
|
+
|
|
296
|
+
ldif_file = CSV + '.ldif'
|
|
297
|
+
|
|
298
|
+
# Remove exist LDIF file.
|
|
299
|
+
if os.path.exists(ldif_file):
|
|
300
|
+
print("< INFO > Remove exist file:", ldif_file)
|
|
301
|
+
os.remove(ldif_file)
|
|
302
|
+
|
|
303
|
+
# Read user list.
|
|
304
|
+
userList = open(CSV, 'rb')
|
|
305
|
+
|
|
306
|
+
# Convert to LDIF format.
|
|
307
|
+
for entry in userList.readlines():
|
|
308
|
+
entry = entry.decode().rstrip()
|
|
309
|
+
domain, username, passwd, cn, quota, groups = re.split(r'\s?,\s?', entry)
|
|
310
|
+
dn, data = ldif_mailuser(domain, username, passwd, cn, quota, groups)
|
|
311
|
+
|
|
312
|
+
# Write LDIF data.
|
|
313
|
+
result = open(ldif_file, 'a')
|
|
314
|
+
ldif_writer = ldif.LDIFWriter(result)
|
|
315
|
+
ldif_writer.unparse(dn, data)
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
ldif_file_path = os.path.abspath(ldif_file)
|
|
319
|
+
print("< INFO > User data are stored in %s, you can verify it before importing it." % ldif_file_path)
|
|
320
|
+
print("< INFO > You can import it with below command:")
|
|
321
|
+
print("ldapadd -x -D %s -W -f %s" % (BINDDN, ldif_file_path))
|
|
322
|
+
|
|
323
|
+
# Prompt to import user data.
|
|
324
|
+
"""
|
|
325
|
+
answer = raw_input("Would you like to import them now? [y|N]").lower().strip()
|
|
326
|
+
|
|
327
|
+
if answer == 'y':
|
|
328
|
+
# Import data.
|
|
329
|
+
conn = ldap.initialize(LDAP_URI)
|
|
330
|
+
conn.set_option(ldap.OPT_PROTOCOL_VERSION, 3) # Use LDAP v3
|
|
331
|
+
conn.bind_s(BINDDN, BINDPW)
|
|
332
|
+
conn.unbind()
|
|
333
|
+
else:
|
|
334
|
+
pass
|
|
335
|
+
"""
|