From 5e8b1603cddaca81239b64ab56e043d0f650459f Mon Sep 17 00:00:00 2001 From: pvincent Date: Wed, 2 Jul 2025 20:00:52 +0400 Subject: [PATCH] bin + debian --- README.md | 3 +- bin/apply_auth_remote_ssh.bash | 13 +++ bin/export.bash | 44 ++++++++++ bin/import.bash | 134 +++++++++++++++++++++++++++++++ bin/purge.bash | 87 ++++++++++++++++++++ debian/install.bash | 3 + debian/install_zourit_style.bash | 27 +++++++ 7 files changed, 310 insertions(+), 1 deletion(-) create mode 100755 bin/apply_auth_remote_ssh.bash create mode 100755 bin/export.bash create mode 100755 bin/import.bash create mode 100644 bin/purge.bash create mode 100644 debian/install.bash create mode 100755 debian/install_zourit_style.bash diff --git a/README.md b/README.md index 1ede6c7..0b83e5e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ -# sympa-util +# sympa-utils +utilities for SYMPA diff --git a/bin/apply_auth_remote_ssh.bash b/bin/apply_auth_remote_ssh.bash new file mode 100755 index 0000000..da65e87 --- /dev/null +++ b/bin/apply_auth_remote_ssh.bash @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +# changes in /etc/sympa/auth.conf +sed -i 's/.*host 192.168.1.254:389.*/ host 127.0.0.1:389 # remote connection through SSH/' /etc/sympa/auth.conf + +# start SSH port translation if needed +if ! ss -tln | grep -q 127.0.0.1:389; then + ssh -fN listes.artcode.re -L 389:192.168.1.254:389 + echo 'SSH port translation 389 is now active!' + systemctl restart wwsympa.socket +else + echo 'SSH already enabled!' +fi diff --git a/bin/export.bash b/bin/export.bash new file mode 100755 index 0000000..666307e --- /dev/null +++ b/bin/export.bash @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +### CONSTANTS + +SYMPA_CONF=/etc/sympa/sympa/sympa.conf +SYMPA_DOMAIN=$(grep '^domain' "$SYMPA_CONF" | cut -f2) + +### FUNCTIONS + +function create_temp_dir { + temp_name="$SYMPA_DOMAIN-$(date '+%F')" + temp_dir="/tmp/$temp_name" + mkdir "$temp_dir" +} + +function export_database { + db_name=sympa + db_user=sympa + db_passwd=$(grep '^db_passwd' /etc/sympa/sympa/sympa.conf | cut -f2) + PGPASSWORD=$db_passwd pg_dump -h localhost -U "$db_user" "$db_name" | gzip >"$temp_dir/database.psql.gz" +} + +function export_files { + tar -C / -cf "$temp_dir/files.tar" etc/sympa/sympa/sympa.conf + tar -C / -uf "$temp_dir/files.tar" etc/sympa/data_structure.version + tar -C / -uf "$temp_dir/files.tar" etc/sympa/auth.conf + tar -C / -uf "$temp_dir/files.tar" var/lib/sympa + tar -C / -uf "$temp_dir/files.tar" var/spool/sympa + gzip "$temp_dir/files.tar" +} + +function export { + create_temp_dir + export_database + export_files + tar -C $temp_dir -cf "$temp_name.sympa" . + rm "$temp_dir" -rf +} + +### MAIN + +set -Eeu + +export diff --git a/bin/import.bash b/bin/import.bash new file mode 100755 index 0000000..864b4bb --- /dev/null +++ b/bin/import.bash @@ -0,0 +1,134 @@ +#!/usr/bin/env bash + +## constants + +BASEDIR=$(dirname "$0") +BASECMD=$(basename "$0") +DB_NAME=sympa +DB_USER="$DB_NAME" +DB_PASS="$DB_NAME" + +## functions + +function usage { + echo "$BASECMD " +} + +function assert_file { + [[ $# != 1 ]] && usage && exit 1 + file="$1" + [[ ! -f $file ]] && echo "file not found: $file" && exit 2 + true +} + +function create_temp { + echo -n "create_temp..." + export_name=$(basename $file) + export_tmp="/tmp/$export_name" + mkdir "$export_tmp" + echo OK +} + +function uncompress_export_file { + echo -n "uncompress export file..." + tar -xf $file -C "$export_tmp" + echo OK +} + +function import_database { + echo -n "import database $DB_NAME..." + sudo -u postgres dropdb "$DB_NAME" 2>/dev/null + sudo -u postgres createdb -O "$DB_USER" "$DB_NAME" 2>/dev/null + gunzip "$export_tmp"/database.psql.gz | PGPASSWORD="$DB_PASS" psql -h localhost -U "$DB_USER" "$DB_NAME" + echo OK +} + +function replace_conf_entry_from_export { + local export_conf=etc/sympa/sympa/sympa.conf + local final_conf="/$export_conf" + local key="$1" + local pattern="^$key.*" + local replacement=$(grep $pattern $export_conf) + local ksh93=${replacement//\//\\/} + sed -i "s/$pattern/$ksh93/" "$final_conf" +} + +function import_files_etc { + mv etc/sympa/auth.conf /etc/sympa/ + mv etc/sympa/data_structure.version /etc/sympa/ + + replace_conf_entry_from_export domain + replace_conf_entry_from_export listmaster + replace_conf_entry_from_export wwsympa_url + replace_conf_entry_from_export lang +} + +function import_files_lib { + rm -rf /var/lib/sympa + mv var/lib/sympa /var/lib +} + +function import_files_spool { + rm -rf /var/spool/sympa + mv var/spool/sympa /var/spool +} + + +function import_files { + echo -n "import files..." + files_temp="$export_tmp/files" + mkdir "$files_temp" + cd "$files_temp" + + tar -xf "$export_tmp/files.tar.gz" + import_files_etc + import_files_lib + import_files_spool + + echo OK +} + +function migrate_sympa { + echo -n "migrate sympa..." + /usr/lib/sympa/bin/sympa.pl upgrade 2>&1 + echo OK +} + +function stop_services { + echo -n "stop services..." + sudo systemctl stop sympa.service + sudo systemctl stop wwsympa.socket + echo OK +} + +function start_services { + echo -n "start services..." + sudo systemctl start sympa.service + sudo systemctl start wwsympa.socket + echo OK +} + +function remove_temp { + echo -n "remove temp..." + rm -rf "$export_tmp" + echo OK +} + +function import { + create_temp + uncompress_export_file + + stop_services + import_database + import_files + start_services + migrate_sympa + + remove_temp +} + +## main + +set -Eeu +assert_file $* +import diff --git a/bin/purge.bash b/bin/purge.bash new file mode 100644 index 0000000..d5a3d32 --- /dev/null +++ b/bin/purge.bash @@ -0,0 +1,87 @@ +#!/usr/bin/env bash + +### CONSTANTS + +SYMPA_CONF=/etc/sympa/sympa/sympa.conf +SYMPA_DOMAIN=$(grep '^domain' "$SYMPA_CONF" | cut -f2) + +### FUNCTIONS + +function purge { + + # LIB/ARCHIVE + for arc_entry in /var/lib/sympa/arc/*; do + arc_name=$(basename "$arc_entry") + if [[ $arc_name != '*' ]] && [[ $arc_name != *"@$SYMPA_DOMAIN" ]]; then + rm /var/lib/sympa/arc/"$arc_name" -rf + echo "archive [$arc_name] removed!" + fi + done + + # LIB/BOUNCE + for bounce_entry in /var/lib/sympa/bounce/*; do + bounce_name=$(basename "$bounce_entry") + if [[ $bounce_name != '*' ]] && [[ $bounce_name != *"@$SYMPA_DOMAIN" ]]; then + rm /var/lib/sympa/bounce/"$bounce_name" -rf + echo "bounce [$bounce_name] removed!" + fi + done + + # SPOOL/DIGEST + for digest_entry in /var/spool/sympa/digest/*; do + digest_name=$(basename "$digest_entry") + if [[ $digest_name != '*' ]] && [[ $digest_name != *"@$SYMPA_DOMAIN"* ]]; then + rm /var/spool/sympa/digest/"$digest_name" -rf + echo "digest [$digest_name] removed!" + fi + done + + # SPOOL/VIEWMAIL/BOUNCE + for bounce_entry in /var/spool/sympa/viewmail/bounce/*; do + bounce_name=$(basename "$bounce_entry") + if [[ $bounce_name != '*' ]] && [[ $bounce_name != *"@$SYMPA_DOMAIN"* ]]; then + rm /var/spool/sympa/viewmail/bounce/"$bounce_name" -rf + echo "viewmail/bounce [$bounce_name] removed!" + fi + done + + # SPOOL/VIEWMAIL/MOD + for mod_entry in /var/spool/sympa/viewmail/mod/*; do + mod_name=$(basename "$mod_entry") + if [[ $mod_name != '*' ]] && [[ $mod_name != *"@$SYMPA_DOMAIN"* ]]; then + rm /var/spool/sympa/viewmail/mod/"$mod_name" -rf + echo "viewmail/mod [$mod_name] removed!" + fi + done + +} + +function create_temp_dir { + temp_dir="$SYMPA_DOMAIN-$(date '+%F')" + mkdir "$temp_dir" + echo "$temp_dir" +} + +function export { + echo "temp_dir=$temp_dir" + cd "$temp_dir" + + db_name=sympa + db_user=sympa + db_passwd=$(grep '^db_passwd' /etc/sympa/sympa/sympa.conf | cut -f2) + PGPASSWORD=$db_passwd pg_dump -h localhost -U "$db_user" "$db_name" | gzip >"$db_name.psql.gz" + + cp "$SYMPA_CONF" . + tar -czvf lib-sympa.tgz /var/lib/sympa + tar -czvf spool-sympa.tgz /var/spool/sympa + + cd .. + tar -cf "$temp_dir.sympa" "$temp_dir" + rm "$temp_dir" -rf +} + +### MAIN + +set -Eeu + +purge diff --git a/debian/install.bash b/debian/install.bash new file mode 100644 index 0000000..120ba33 --- /dev/null +++ b/debian/install.bash @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +echo TODO... \ No newline at end of file diff --git a/debian/install_zourit_style.bash b/debian/install_zourit_style.bash new file mode 100755 index 0000000..a72e577 --- /dev/null +++ b/debian/install_zourit_style.bash @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +# changes in /usr/share/sympa/lib/Sympa/Config/Schema.pm +sed -i "s/.*005ab2.*/ default => '#ad0c78', # '#005ab2' replaced by ZOURIT-COLOR-1/" /usr/share/sympa/lib/Sympa/Config/Schema.pm +sed -i "s/.*004b94.*/ default => '#1f2937', # '#004b94' replaced by ZOURIT-COLOR-2/" /usr/share/sympa/lib/Sympa/Config/Schema.pm +sed -i "s/.*0090e9.*/ default => '#b15593', # '#0090e9' replaced by ZOURIT-COLOR-3/" /usr/share/sympa/lib/Sympa/Config/Schema.pm +sed -i "s/.*66aaff.*/ default => '#949ba7', # '#66aaff' replaced by ZOURIT-COLOR-4/" /usr/share/sympa/lib/Sympa/Config/Schema.pm + +# changes in /usr/share/sympa/default/web_tt2/css.tt2 +if ! grep -q '.top-bar button:hover' /usr/share/sympa/default/web_tt2/css.tt2; then + sed -i "1661i\\.top-bar button:hover{\\n color: white;\\n}" /usr/share/sympa/default/web_tt2/css.tt2 + echo 'style changed successfully' +else + echo 'style already changed!' +fi + +# detect if exists inherited list styles +socket_restart=false +for i in /var/lib/sympa/css/*; do + if [[ "$i" != '/var/lib/sympa/css/style.css' ]] && [[ -d "$i" ]]; then + socket_restart=true + rm -rf "$i" + fi +done + +[[ $socket_restart == true ]] && systemctl restart wwsympa.socket && echo "wwsympa restarted with fresh styles" +true