From ddcc8658999ccef1883086d6401071ca2d78634a Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Thu, 13 Dec 2018 19:18:10 +0100 Subject: [PATCH] Improve IRC bot/logs setup. --- .../web/etc/systemd/system/plomlombot.service | 4 +- all_new_2018/setup_plomlombot.sh | 17 ++++- .../user_scripts/plomlombot_daemon.sh | 70 +++++++++++-------- 3 files changed, 55 insertions(+), 36 deletions(-) diff --git a/all_new_2018/linkable_etc_files/web/etc/systemd/system/plomlombot.service b/all_new_2018/linkable_etc_files/web/etc/systemd/system/plomlombot.service index e836e46..a4f6769 100644 --- a/all_new_2018/linkable_etc_files/web/etc/systemd/system/plomlombot.service +++ b/all_new_2018/linkable_etc_files/web/etc/systemd/system/plomlombot.service @@ -2,9 +2,9 @@ Description=plomlombot screen [Service] -Type=forking +Type=simple User=plom -ExecStart=/bin/sh -c '~/start_plomlombot.sh' +ExecStart=/bin/sh -c '~/plomlombot_daemon.sh' Restart=always [Install] diff --git a/all_new_2018/setup_plomlombot.sh b/all_new_2018/setup_plomlombot.sh index 2282603..93e857d 100755 --- a/all_new_2018/setup_plomlombot.sh +++ b/all_new_2018/setup_plomlombot.sh @@ -1,14 +1,25 @@ #!/bin/sh set -e +# Ensure we have a GPG target to encrypt to. +if [ $# -lt 1 ]; then + echo "Need public key ID as argument." + false +fi +gpg_key="$1" + config_tree_prefix="${HOME}/config/all_new_2018/" irclogs_dir=/var/www/html/irclogs cp "${config_tree_prefix}"/user_scripts/plomlombot_daemon.sh /home/plom/ chown plom:plom /home/plom/plomlombot_daemon.sh -apt -y install screen python3-venv +apt -y install screen python3-venv gpg dirmngr +su plom -c "gpg --recv-key ${gpg_key}" +# TODO: After this, we could in theory remove dirmngr if we only installed it just now. su plom -c "cd && git clone /var/public_repos/plomlombot-irc" systemctl enable /etc/systemd/system/plomlombot.service service plomlombot start mkdir -p "${irclogs_dir}" -chown -r plom:plom "${irclogs_dir}" -echo "Don't forget to add an encryption key to plom's key chain and to his ~/.plomlombot." +chown -R plom:plom "${irclogs_dir}" +echo "Don't forget to add a file ~/.plomlombot with content such as:" +echo "gpg_key ${gpg_key}" +echo "bot: SCREEN_SESSION_NAME BOT_NAME #CHANNEL_NAME IRC_SERVER_NAME" diff --git a/all_new_2018/user_scripts/plomlombot_daemon.sh b/all_new_2018/user_scripts/plomlombot_daemon.sh index 60b0d9c..b7d0709 100755 --- a/all_new_2018/user_scripts/plomlombot_daemon.sh +++ b/all_new_2018/user_scripts/plomlombot_daemon.sh @@ -6,38 +6,46 @@ path=~/.plomlombot db_dir="${HOME}/plomlombot_db" irclogs_dir=/var/www/html/irclogs while true; do - cat "${path}" | while read line; do - first_word=$(echo -n "${line}" | cut -d' ' -f1) + if [ -f "${path}" ]; then + cat "${path}" | while read line; do + first_word=$(echo -n "${line}" | cut -d' ' -f1) - # Read "bot:" line, start bot screen session from it if not yet existing, - # set up irclogs dir if not yet existing. - if [ "${first_word}" = "bot:" ]; then - session_name=$(echo -n "${line}" | cut -d' ' -f2) - bot_name=$(echo -n "${line}" | cut -d' ' -f3) - channel_name=$(echo -n "${line}" | cut -d' ' -f4) - server_name=$(echo -n "${line}" | cut -d' ' -f5) - set +e - screen -S "${session_name}" -Q select . > /dev/null - start_screen=$? - set -e - if [ "${start_screen}" -eq "1" ]; then - cd ~/plomlombot-irc - screen -d -m -S "${session_name}" ./run.sh -n "${bot_name}" -s "${server_name}" "${channel_name}" - fi - md5_server=$(echo -n "${server_name}" | md5sum | cut -d' ' -f1) - md5_channel=$(echo -n "${channel_name" | md5sum | cut -d' ' -f1) - logs_dir="${db_dir}/${md5_server}/${md5_channel}/logs" - # FIXME: Note the trouble we will have if we have the same channel - # name on different servers … - ln -sf "${logs_dir}" "${irclogs_dir}/${channel_name}" + # Read "bot:" line, start bot screen session from it if not yet existing, + # set up irclogs dir if not yet existing. + if [ "${first_word}" = "bot:" ]; then + session_name=$(echo -n "${line}" | cut -d' ' -f2) + bot_name=$(echo -n "${line}" | cut -d' ' -f3) + channel_name=$(echo -n "${line}" | cut -d' ' -f4) + server_name=$(echo -n "${line}" | cut -d' ' -f5) + set +e + screen -S "${session_name}" -Q select . > /dev/null + start_screen=$? + set -e + if [ "${start_screen}" -eq "1" ]; then + cd ~/plomlombot-irc + screen -d -m -S "${session_name}" ./run.sh -n "${bot_name}" -s "${server_name}" "${channel_name}" + fi + md5_server=$(echo -n "${server_name}" | md5sum | cut -d' ' -f1) + md5_channel=$(echo -n "${channel_name}" | md5sum | cut -d' ' -f1) + logs_dir="${db_dir}/${md5_server}/${md5_channel}/logs" + # FIXME: Note the trouble we will have if we have the same channel + # name on different servers … + shortened_channel_name="${channel_name}" + first_char=$(echo -n "${channel_name}" | cut -c1) + if [ "${first_char}" = "#" ]; then + shortened_channel_name=$(echo -n "${channel_name}" | cut -c2-) + fi + ln -sf "${logs_dir}" "${irclogs_dir}/${shortened_channel_name}" - # If "key:" line, encrypt old raw logs to that GPG key. - elif [ "${first_word}" = "gpg_key": ]; then - key=$(echo -n "${line}" | cut -d' ' -f2) - cd ~/plomlombot_db - find . -path '*/*/raw_logs/*.txt' -mtime +1 -type f -exec gpg --recipient "${key}" --trust-model always --encrypt {} \; -exec rm {} \; - fi + # If "key:" line, encrypt old raw logs to that GPG key. + elif [ "${first_word}" = "gpg_key": ]; then + key=$(echo -n "${line}" | cut -d' ' -f2) + mkdir -p ~/plomlombot_db + cd ~/plomlombot_db + find . -path '*/*/raw_logs/*.txt' -mtime +1 -type f -exec gpg --recipient "${key}" --trust-model always --encrypt {} \; -exec rm {} \; + fi - done - sleep 1 + done + sleep 1 + fi done -- 2.30.2