From 64a7f9dcf7f93bf2ef7c8abf8a4c67b8537aadae Mon Sep 17 00:00:00 2001 From: Tobias Herre Date: Sat, 21 Oct 2023 22:08:35 +0200 Subject: [PATCH] Initial commit --- sympa.cf | 498 ++++++++++++++++++ templates/sympa/list_aliases.tt2.mustache | 8 + templates/sympa/postfix-master-cfg.mustache | 6 + ...stfix-virtual-mailbox-maps-sql.cf.mustache | 9 + templates/sympa/robot.conf | 3 + 5 files changed, 524 insertions(+) create mode 100644 sympa.cf create mode 100644 templates/sympa/list_aliases.tt2.mustache create mode 100644 templates/sympa/postfix-master-cfg.mustache create mode 100644 templates/sympa/postfix-virtual-mailbox-maps-sql.cf.mustache create mode 100644 templates/sympa/robot.conf diff --git a/sympa.cf b/sympa.cf new file mode 100644 index 0000000..5d8dd42 --- /dev/null +++ b/sympa.cf @@ -0,0 +1,498 @@ +# +# +# + +bundle agent sympa +{ +classes: + "sympa_b"; + +vars: + debian&sympa_b:: + "lib_dir" string => "/usr/lib/sympa"; + "var_lib_dir" string => "/var/lib/sympa"; + "share_dir" string => "/usr/share/sympa"; + "conf_dir" string => "/etc/sympa"; + "sympa_conf" string => "$(conf_dir)/sympa/sympa.conf"; + "service_name" string => "sympa"; + "wwservice_name" string => "wwsympa"; + "wwsympa_socket" string => "/var/run/sympa/wwsympa.socket"; + "sympa_pl_cmd" string => "/usr/bin/sympa"; + + "pkgs" slist => { + "sympa" + }; + + + debian&sympa_s:: + "install_dir" string => "/usr/local/sympa"; + "queue_cmd" string => "$(install_dir)/bin/queue"; + "bouncequeue_cmd" string => "$(install_dir)/bin/bouncequeue"; + + "static_content_dir" string => "$(install_dir)/static_content"; + "css_dir" string => "$(static_content_dir)/css"; + "pictures_dir" string => "$(static_content_dir)/pictures"; + + any:: + + + "queue_cmd" string => "$(lib_dir)/bin/queue"; + "bouncequeue_cmd" string => "$(lib_dir)/bin/bouncequeue"; + + + "static_content_dir" string => "$(share_dir)/static_content"; + "pictures_dir" string => "$(static_content_dir)/pictures"; + "css_dir" string => "$(var_lib_dir)/css"; + + "sendmail_aliases" string => "$(conf_dir)/sympa_transport"; + + "postfix_master_cfg" string => readfile("$(sys.workdir)/inputs/$(def.wmde_libdir)/templates/sympa/postfix-master-cfg.mustache"); + + "apache_cfg" string => + " + + + Alias /css-sympa $(sympa.css_dir) + Alias /pictures-sympa $(sympa.pictures_dir) + Alias /static-sympa $(sympa.static_content_dir) + + + Require all granted + + + + Require all granted + + + + Require all granted + + + + SetHandler \\\"proxy:unix:$(sympa.wwsympa_socket)|fcgi://\\\" + Require all granted + + + + + "; + + +reports: +# "MUSTACHE: $(postfix_master_cfg_m)"; +# "RF: $(sys.workdir)/inputs/$(wmde_lib)/templates/sympa-postfix-master-cfg.mustache"; +} + + +bundle agent sympa_init_db(cfg) +{ +classes: + "run_backups" expression => isvariable("cfg[backup_dir]"); + + run_backups:: + "sql_backup_exists" expression => fileexists("$(cfg[backup_dir])/sympa.sql"); + +methods: + "any" usebundle => mysql_table_exists(@(cfg[db_settings]),"user_table"); + + run_backups:: + "any" usebundle => restore_mysql_db(@(cfg[db_settings]),"$(cfg[backup_dir])/sympa.sql"), + depends_on => {"sympa_config_updated"}, + if => "sql_backup_exists&(!mysql_sympa_user_table_exists)", + handle => "sympa_db_initialized"; +commands: + "!mysql_sympa_user_table_exists":: + "$(sympa.sympa_pl_cmd)" + args => "--health_check", + handle => "sympa_db_initialized", + depends_on => {"sympa_config_updated"}; + + +} + + +bundle agent sympa_create_postfix_maps +{ +classes: + "sympa_run_postmap" expression => not(fileexists("$(sympa.sendmail_aliases).db")); +files: + "$(sympa.sendmail_aliases)" + create => "true", + classes => if_repaired("sympa_run_postmap"), + perms => mog("644","sympa","sympa"), + handle => "sympa_sendmail_aliases_created"; + + "$(sympa.conf_dir)/list_aliases.tt2" + create => "true", + copy_from => local_dcp("$(sys.workdir)/inputs/$(def.wmde_libdir)/templates/sympa/list_aliases.tt2.mustache"), + perms => mog("644","sympa","sympa"); + +commands: + "sympa_run_postmap":: + "$(postfix.postmap_cmd)" + args => "$(sympa.sendmail_aliases)", + classes => if_repaired("postfix_repaired"), + depends_on => {"sympa_sendmail_aliases_created"}; +reports: + "create maps"; + "sympa_sendmail_aliases_repaired":: + "POSTMAP CALL"; + +} + +bundle agent sympa_postfix_sql(cfg) +{ +vars: + "file[sympa_virtual_mailbox_maps]" string => "query = SELECT 'present' FROM list_table WHERE name_list='%u' + or name_list = replace('%u', '-request', '') + or name_list = replace('%u', '-editor', '') + or name_list = replace('%u', '-subscribe', '') + or name_list = replace('%u', '-unsubscribe', '') +"; + + "idx" slist => getindices("file"); + + "sql_dir" string => "$(postfix.cfg_dir)/sql"; + "$(idx)" string => "$(sql_dir)/$(idx).sql"; +files: + "$(sql_dir)/." + create => "true", + perms => m("755"); + + "$(sql_dir)/$(idx).sql" + create=>"true", + perms=>m("644"), + content=>" +user = $(cfg[db_user]) +password = $(cfg[db_pass]) +hosts = $(cfg[db_host]) +dbname = $(cfg[db_name]) +$(file[$(idx)]) +"; + +reports: + +} + + + +bundle agent sympa_update_config(cfg) +{ +vars: + "default_settings" data => '{ + "aliases_db_type":"hash", + "aliases_program":"$(postfix.postmap_cmd)", + "sendmail_aliases":"$(sympa.sendmail_aliases)", + "db_type":"$(cfg[db_settings][db_type])", + "db_name":"$(cfg[db_settings][db_name])", + "db_host":"$(cfg[db_settings][db_host])", + "db_passwd":"$(cfg[db_settings][db_pass])", + "db_user":"$(cfg[db_settings][db_user])" + + }'; + + "settings_data" data => mergedata(@(default_settings),@(cfg[settings])); + + "idx" slist => getindices(@(settings_data)); + "settings[$(idx)]" string => "$(settings_data[$(idx)])"; + +files: + "$(sympa.sympa_conf)" + edit_line => set_config_values("$(this.bundle).settings"), + handle => "sympa_config_updated", + classes => if_repaired("sympa_repaired"), + depends_on => { "sympa_pkgs_installed" }; + +reports: +} + + +bundle agent install_sympa_domain(domain,data) +{ +vars: + "default_settings" data => '{ + }'; + + "settings_data" data => mergedata(@(default_settings),@(data[settings])); + + "idx" slist => getindices(@(settings_data)); + "settings[$(idx)]" string => "$(settings_data[$(idx)])"; + "settings[domain]" string => "$(domain)"; + +files: + "$(sympa.conf_dir)/$(domain)/." + create => "true", + perms => m("755"); + + "$(sympa.conf_dir)/$(domain)/robot.conf" + perms => m("644"), + copy_from => seed_cp("$(sys.workdir)/inputs/$(def.wmde_libdir)/templates/sympa/robot.conf"), + handle => "sympa_robot_$(domain)_ready"; + + "$(sympa.conf_dir)/$(domain)/robot.conf" + create => "true", + perms => m("644"), #"sympa","sympa"), + edit_line => set_config_values("$(this.bundle).settings"), + handle => "sympa_robots_created", + classes => if_repaired("sympa_repaired"), + depends_on => { "sympa_pkgs_installed","sympa_robot_$(domain)_ready" }; + +reports: +# "INSTALL DOMAIN $(domain)"; +# "WWSYMuRL:$(data[settings][wwsympa_url])"; +# "OUT: $(settings)"; +# "JO: $(jo)"; +} + +bundle agent install_sympa_domains(dl) +{ +vars: + "idx" slist => getindices(@(dl)); +methods: + "any" usebundle => install_sympa_domain("$(idx)",@(dl[$(idx)])); + +reports: +} + + + + + +bundle agent install_sympa(cfg) +{ +vars: +# "cfg_domains" data => @(cfg[domains]); + "domains_idx" slist => getindices(@(cfg[domains])); +# "cfg_domains" slist => {"a","b","c"}; +methods: + "any" usebundle => wmde_install_packages(@(sympa.pkgs),"sympa"); + "any" usebundle => sympa_update_config(@(cfg)); + "any" usebundle => sympa_init_db(@(cfg)); + + "any" usebundle => wmde_service("$(sympa.service_name)","sympa_kept","sympa_repaired"), + depends_on => { + "sympa_pkgs_installed", + "sympa_config_updated" + }; + "any" usebundle => wmde_service("$(sympa.wwservice_name)","sympa_kept","sympa_repaired"), + depends_on => { + "sympa_pkgs_installed", + "sympa_config_updated", + "sympa_robots_created" + }; + +# "any" usebundle => install_sympa_domain("@(cfg[domains][$(domains_idx)])"); + "any" usebundle => install_sympa_domains(@(cfg[domains2])); +reports: +# "IDX $(domains_idx)"; +# "DOMCONF: $(cfg[$(idx)])"; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +bundle agent install_sympa_src(cfg) +{ +classes: + "run_backups" expression => isvariable("cfg[backup_dir]"); + + run_backups:: + "sql_backup_exists" expression => fileexists("$(cfg[backup_dir])/sympa.sql"); + +methods: + "any" usebundle => mysql_table_exists(@(cfg),"user_table"); + + "run_backups&sql_backup_exists&(!mysql_sympa_user_table_exists)":: + "any" usebundle => restore_mysql_db(@(cfg),"$(cfg[backup_dir])/sympa.sql"); + + +vars: + debian:: + "pkgs" slist => { + "clang", + "gcc", + "make", + "mhonarc", + "libdbd-mysql-perl", + "spawn-fcgi", + "libdbd-mysql-perl", + "libdatetime-format-mail-perl", + "libmime-encwords-perl", + "libmime-lite-html-perl", + "cpanminus" + }; + "cfg_file" string => "/etc/sympa/sympa.conf"; + "log_file" string => "/var/log/sympa.log"; + "syslog_cfg" string => "/etc/rsyslog.d/sympa.conf"; + "syslog_service" string => "rsyslog"; + freebsd:: + "pkgs" slist => {}; + "cfg_file" string => "/usr/local/etc/sympa/sympa.conf"; + "log_file" string => "/var/log/sympa.log"; + "syslog_cfg" string => "/etc/syslog.d/sympa.conf"; + "syslog_service" string => "syslogd"; + + any:: + "src_tgz" string => "sympa-$(cfg[version]).tar.gz"; + "extract_dir" string => "$(sys.workdir)/data/agent/sympa"; + "compile_dir" string => "$(extract_dir)/sympa-$(cfg[version])"; + + "configure_options" string => "--prefix $(sympa.install_dir)"; + + "sympa_pl_cmd" string => "$(sympa.install_dir)/bin/sympa.pl"; + +classes: + "compile_and_install" expression => not(fileexists("$(compile_dir)/installed.txt")); + +commands: + 'if grep -q sympa /etc/group ; then echo "+sympa_group_exists"; else echo "-sympa_group_exists" ; fi' + module => "true", + inform => "false", + contain => wmde_cmd_useshell; + + + debian&(!sympa_group_exists):: + "/usr/sbin/groupadd" + args => "sympa", + handle => "sympa_group_created"; + debian&sympa_group_exists:: + "/usr/bin/true" + inform => "false", + handle => "sympa_group_created"; + +methods: + "any" usebundle => wmde_install_packages(@(pkgs),"sympabuild"); + +files: + "$(extract_dir)/." + create => "true", + handle => "sympa_extract_dir_created"; + +users: + "sympa" + policy => "present", + description => "Sympa System", + home_dir => "$(sympa.install_dir)", + group_primary => "sympa", + depends_on => {"sympa_group_created"}, + shell => "/bin/bash"; + +methods: + "any" usebundle => download_and_untar ( + "sympa", + "$(def.hub_public_dir)/$(src_tgz)", + "$(sys.workdir)/data/public/$(src_tgz)", + "$(extract_dir)", + "$(compile_dir)/configure" + ), + depends_on => {"sympabuild_pkgs_installed","sympa_extract_dir_created"}, + handle => "sympa_downloaded"; + +commands: + compile_and_install:: + "cd $(compile_dir) && ./configure $(configure_options) && make && make install && cpanm --installdeps --with-recommends -n . && touch installed.txt" + contain => wmde_cmd_useshell, + depends_on => {"sympa_downloaded"}, + handle => "sympa_installed"; + + !compile_and_install:: + "/usr/bin/true" + inform => "false", + handle => "sympa_installed"; + + +vars: + "settings[domain]" string => "$(cfg[domain])"; + "settings[listmaster]" string => "$(cfg[listmaster])"; + "settings[db_type]" string => "$(cfg[db_type])"; + "settings[db_host]" string => "$(cfg[db_host])"; + "settings[db_user]" string => "$(cfg[db_user])"; + "settings[db_passwd]" string => "$(cfg[db_pass])"; + "settings[wwsympa_url]" string => "$(cfg[wwsympa_url])"; + "settings[listmaster]" string => "$(cfg[listmaster])"; + "settings[sendmail_aliases]" string=> "$(cfg[sendmail_aliases])"; + "settings[aliases_program]" string=> "$(cfg[aliases_program])"; + + +files: + "$(cfg_file)" + edit_line => set_config_values("$(this.bundle).settings"), + handle => "sympa_config_edited_old", + classes => if_repaired("sympa_config_changed"), + depends_on => { "sympa_installed" }; + +commands: + "sympa_config_changed|(!mysql_sympa_user_table_exists)":: + "$(sympa.sympa_pl_cmd)" + args => "--health_check", + depends_on => {"sympa_config_edited_old"}; + + +# Sympa Logs +files: + "$(log_file)" + create=>"true", + perms=>m("644"); + + "$(syslog_cfg)" + create=>"true", + content=>"local1.* -/var/log/sympa.log + ", + handle => "sympa_syslog_cfg_ready", + classes => if_repaired("sympa_syslog_cfg_repaired"); + +services: + sympa_syslog_cfg_repaired:: + "$(syslog_service)" + depends_on => {"sympa_syslog_cfg_ready"}, + service_policy=>"restart"; + + +# Configure Backup stuff +files: + run_backups:: + "$(cfg[backup_dir])/." + create => "true"; +methods: + run_backups:: + "any" usebundle => create_mysql_backup_cron_job(@(cfg),"$(cfg[backup_dir])/sympa.sql","user_table","true"); + !run_backups:: + "any" usebundle => create_mysql_backup_cron_job(@(cfg),"$(cfg[backup_dir])/sympa.sql","user_table","false"); + + + + +reports: + +} diff --git a/templates/sympa/list_aliases.tt2.mustache b/templates/sympa/list_aliases.tt2.mustache new file mode 100644 index 0000000..1fbbb63 --- /dev/null +++ b/templates/sympa/list_aliases.tt2.mustache @@ -0,0 +1,8 @@ +#--- [% list.name %]@[% list.domain %]: list transport map created at [% date %] +[% list.name %]@[% list.domain %] sympa:[% list.name %]@[% list.domain %] +[% list.name %]-request@[% list.domain %] sympa:[% list.name %]-request@[% list.domain %] +[% list.name %]-editor@[% list.domain %] sympa:[% list.name %]-editor@[% list.domain %] +#[% list.name %]-subscribe@[% list.domain %] sympa:[% list.name %]-subscribe@[%list.domain %] +[% list.name %]-unsubscribe@[% list.domain %] sympa:[% list.name %]-unsubscribe@[% list.domain %] +[% list.name %][% return_path_suffix %]@[% list.domain %] sympabounce:[% list.name %]@[% list.domain %] + diff --git a/templates/sympa/postfix-master-cfg.mustache b/templates/sympa/postfix-master-cfg.mustache new file mode 100644 index 0000000..ba30c2a --- /dev/null +++ b/templates/sympa/postfix-master-cfg.mustache @@ -0,0 +1,6 @@ +sympa unix - n n - - pipe + flags=hqRu null_sender= user=sympa argv=$(queue_cmd) \dollar{recipient} +sympabounce unix - n n - - pipe + flags=hqRu null_sender= user=sympa argv=$(bouncequeue_cmd) \dollar{user}@\dollar{domain} + + diff --git a/templates/sympa/postfix-virtual-mailbox-maps-sql.cf.mustache b/templates/sympa/postfix-virtual-mailbox-maps-sql.cf.mustache new file mode 100644 index 0000000..264c209 --- /dev/null +++ b/templates/sympa/postfix-virtual-mailbox-maps-sql.cf.mustache @@ -0,0 +1,9 @@ +user = {{db_user}} +password = {{db_pass}} +hosts = {{db_host}} +dbname = {{db_name}} +query = SELECT 'present' FROM list_table WHERE name_list='%u' + or name_list = replace('%u', '-request', '') + or name_list = replace('%u', '-editor', '') + or name_list = replace('%u', '-subscribe', '') + or name_list = replace('%u', '-unsubscribe', '') diff --git a/templates/sympa/robot.conf b/templates/sympa/robot.conf new file mode 100644 index 0000000..3923ec4 --- /dev/null +++ b/templates/sympa/robot.conf @@ -0,0 +1,3 @@ +# +# Managed by CFEngine +#