From 651f374a9d1c3f0171fc728121af5446b751222d Mon Sep 17 00:00:00 2001 From: pvincent Date: Mon, 30 Jun 2025 09:01:42 +0400 Subject: [PATCH] import/export --- .vscode/settings.json | 3 + sympa/bin/export.bash | 43 ++++++++++++ sympa/bin/import.bash | 133 +++++++++++++++++++++++++++++++++++++ sympa/bin/purge.bash | 87 ++++++++++++++++++++++++ sympa/{ => doc}/install.md | 4 +- sympa/doc/migration.md | 37 +++++++++++ sympa/migration.md | 27 -------- 7 files changed, 306 insertions(+), 28 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 sympa/bin/export.bash create mode 100644 sympa/bin/import.bash create mode 100644 sympa/bin/purge.bash rename sympa/{ => doc}/install.md (96%) create mode 100644 sympa/doc/migration.md delete mode 100644 sympa/migration.md diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..23fd35f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.formatOnSave": true +} \ No newline at end of file diff --git a/sympa/bin/export.bash b/sympa/bin/export.bash new file mode 100644 index 0000000..21a6376 --- /dev/null +++ b/sympa/bin/export.bash @@ -0,0 +1,43 @@ +#!/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/sympa/bin/import.bash b/sympa/bin/import.bash new file mode 100644 index 0000000..bfe7d59 --- /dev/null +++ b/sympa/bin/import.bash @@ -0,0 +1,133 @@ +#!/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/sympa/bin/purge.bash b/sympa/bin/purge.bash new file mode 100644 index 0000000..d5a3d32 --- /dev/null +++ b/sympa/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/sympa/install.md b/sympa/doc/install.md similarity index 96% rename from sympa/install.md rename to sympa/doc/install.md index 6f78e73..1664390 100644 --- a/sympa/install.md +++ b/sympa/doc/install.md @@ -46,7 +46,7 @@ LISTMASTER=pvincent@artcode.re ## Nginx + fastcgi -* apt install -y postfix postgresql nginx fcgiwrap +* apt install -y postfix postgresql nginx fcgiwrap perl-doc * domain: {{PUBLIC_URL}} * apt install -y sympa * editor /etc/sympa/sympa/sympa.conf @@ -87,3 +87,5 @@ server { ## after any sympa change! * systemctl restart wwsympa.socket + + diff --git a/sympa/doc/migration.md b/sympa/doc/migration.md new file mode 100644 index 0000000..c384f61 --- /dev/null +++ b/sympa/doc/migration.md @@ -0,0 +1,37 @@ +Migration +========= + +``` +From: debian9, sympa 6.2.16 +To: debian12, sympa 6.2.70 +``` + +## Documentation + +* https://www.sympa.community/manual/upgrade/in-place.html +* https://www.sympa.community/manual/upgrade/move.html + +## export + +1. temp dir + * sympa_domain=$(grep '^domain' /etc/sympa/sympa/sympa.conf | cut -f2) + * temp_dir="$sympa_domain-$(date '+%F')" + * mkdir $temp_dir && cd $temp_dir || echo 'already exist!' && false +2. database backup + * 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" +3. tar + 1. /etc/sympa + * cp /etc/sympa/sympa/sympa.conf . + 2. /var/lib/sympa + * tar -czvf lib-sympa.tgz /var/lib/sympa + 3. /var/spool/sympa + * tar -czvf spool-sympa.tgz /var/spool/sympa + +## import + +1. database restore +2. tar + 1. /etc/sympa/sympa/sympa.conf diff --git a/sympa/migration.md b/sympa/migration.md deleted file mode 100644 index ec5bef9..0000000 --- a/sympa/migration.md +++ /dev/null @@ -1,27 +0,0 @@ -Migration -========= - -``` -From: debian9, sympa 6.2.16 -To: debian12, sympa 6.2.70 -``` - -## Documentation - -* https://www.sympa.community/manual/upgrade/in-place.html -* https://www.sympa.community/manual/upgrade/move.html - - -## export - -1. database backup -2. tar - 1. /etc/sympa - 2. /var/lib/sympa - 3. /var/spool/sympa - -## import - -1. database restore -2. tar - 1. /etc/sympa/sympa/sympa.conf