Big refactoring for automatic server restart, if needed. - annna - Annna the nice friendly bot.
 (HTM) git clone git://bitreich.org/annna/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/annna/
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
       ---
 (DIR) commit f3d26842d5e8b3695eb3cd2d0cf8c83ae2f40565
 (DIR) parent e519438ca2a0234f4f0c04fc41dae0160741411a
 (HTM) Author: Annna Robert-Houdin <annna@bitreich.org>
       Date:   Sat,  1 Jan 2022 21:59:13 +0100
       
       Big refactoring for automatic server restart, if needed.
       
       * Make everything configurable in annna base dir.
       * Have a global file, if annna is running, which is checked everywhere.
       
       Diffstat:
         M annna-channel-service               |       7 ++++---
         A annna-join-channels                 |      38 +++++++++++++++++++++++++++++++
         M annna-message-common                |       9 ++++-----
         M annna-message-gopherproject         |       6 ++++--
         M annna-message-radio                 |       6 ++++--
         M annna-say                           |       2 +-
         M annna-start                         |       6 ++++--
         M annna-start-main                    |     149 ++++++++++++++-----------------
         M annna-start-service                 |      19 ++++++++++---------
         M annna-stop                          |       3 +++
       
       10 files changed, 140 insertions(+), 105 deletions(-)
       ---
 (DIR) diff --git a/annna-channel-service b/annna-channel-service
       @@ -11,10 +11,11 @@ pgrep -f "$0 $*" | grep -vxq "$$" && exec echo "$0 $* already running"
        server="$1"
        channel="$2"
        
       -iiroot="/home/annna/irc"
       -iibase="/home/annna/irc/${server}"
       +cfgbase="$(pwd)"
       +ircbase="$(cat ${cfgbase}/ircbase)"
       +serverbase="${ircbase}/${server}"
        
       -ls "${iibase}/${channel}/out" | entr tail -n 1 "${iibase}/${channel}/out" 2>/dev/null \
       +ls "${serverbase}/${channel}/out" | entr tail -n 1 "${serverbase}/${channel}/out" 2>/dev/null \
                | sed -nu 's,[0-9]* <\([^ >]*\)> \(.*\),\1 \2,p' \
                | {
        while read -r user text;
 (DIR) diff --git a/annna-join-channels b/annna-join-channels
       @@ -0,0 +1,38 @@
       +#!/bin/sh
       +
       +set -x
       +
       +export PATH="$PATH:/home/annna/bin"
       +
       +cfgbase="$(pwd)"
       +ircbase="$(cat ${cfgbase}/ircbase)"
       +
       +server="$1"
       +channels="$2"
       +
       +# Channels
       +for chan in ${channels};
       +do
       +        printf "/j %s\n" "${chan}" > ${ircbase}/${server}/in
       +
       +        # Do not flood.
       +        sleep 1
       +
       +        ## Make sure the pipes are there.
       +        while [ ! -e "${ircbase}/${server}/${chan}/out" ];
       +        do
       +                [ ! -f ${cfgbase}/running ] && exit 1
       +                sleep 1
       +        done
       +
       +        ## Make sure we are in the channel, for the services.
       +        while [ -z "$(grep " JOIN :${chan}" \
       +                        ${ircbase}/${server}/out)" ];
       +        do
       +                [ ! -f ${cfgbase}/running ] && exit 1
       +                sleep 1
       +        done
       +
       +        annna-start-service "${server}" "${chan}"
       +done
       +
 (DIR) diff --git a/annna-message-common b/annna-message-common
       @@ -1,17 +1,16 @@
        #!/bin/sh
       -#
       -# If this gets too unmaintainable, consider adding some directory structure.
       -#
        
        set -x
        
        export PATH="/br/bin:$PATH"
        
       -modbase="/home/annna/bin/modules"
       +cfgbase="$(pwd)"
       +ircbase="$(cat ${cfgbase}/ircbase)"
       +modbase="$(cat ${cfgbase}/modbase)"
       +botname="$(cat ${cfgbase}/botname)"
        hashtagfile="${modbase}/hashtags/hashtags.txt"
        idontcaredb="${modbase}/i-dont-care/i-dont-care.txt"
        printnhashtags=2
       -botname="annna"
        brmembers="__20h__ Evil_Bob chripo posativ quinq stateless solene josuah parazyd bin KatolaZ adc"
        
        server="$1"
 (DIR) diff --git a/annna-message-gopherproject b/annna-message-gopherproject
       @@ -1,7 +1,9 @@
        #!/bin/sh -e
        
       -modbase="/home/annna/bin/modules/"
       -botname="annna"
       +cfgbase="$(pwd)"
       +ircbase="$(cat ${cfgbase}/ircbase)"
       +modbase="$(cat ${cfgbase}/modbase)"
       +botname="$(cat ${cfgbase}/botname)"
        
        server="$1"
        channel="$2"
 (DIR) diff --git a/annna-message-radio b/annna-message-radio
       @@ -1,7 +1,9 @@
        #!/bin/sh -e
        
       -modbase="/home/annna/bin/modules/"
       -botname="annna"
       +cfgbase="$(pwd)"
       +ircbase="$(cat ${cfgbase}/ircbase)"
       +modbase="$(cat ${cfgbase}/modbase)"
       +botname="$(cat ${cfgbase}/botname)"
        
        server="$1"
        channel="$2"
 (DIR) diff --git a/annna-say b/annna-say
       @@ -60,7 +60,7 @@ do
                        printf "%s\n" "$@" > "${ircpath}/in"
                else
                        # Might be a user.
       -                printf "/j %s %s\n" "$c" "$@" > "${ircbase}/in"
       +                printf "/j %s %s\n" "$c" "$@" > "${ircpath}/in"
                fi
        
        done
 (DIR) diff --git a/annna-start b/annna-start
       @@ -4,9 +4,11 @@ set -x
        
        export PATH="$PATH:/home/annna/bin"
        
       -cfgbase="/home/annna/annna"
       -cd ${cfgbase}
       +#cfgbase="$(pwd)"
       +cfgbase="$HOME/annna"
       +touch ${cfgbase}/running
        
       +cd ${cfgbase}
        for server in $(find . -maxdepth 1 -type d | tail -n +2 | cut -c 3-);
        do
                [ ! -f ${server}/autoconnect ] && continue
 (DIR) diff --git a/annna-start-main b/annna-start-main
       @@ -4,94 +4,81 @@ set -x
        
        export PATH="$PATH:/home/annna/bin"
        
       +cfgbase="$(pwd)"
       +ircbase="$(cat ${cfgbase}/ircbase)"
       +
        server="$1"
        usetls="$2"
       -[ $usetls -gt 0 ] && tlsparam=" -t"
       +[ $usetls -gt 0 ] && tlsparam=" -v -t"
        port="$3"
        channels="$4"
        
       -rm -rf $HOME/irc/${server}
       -mkdir -p $HOME/irc/${server}
       -cd $HOME/irc
       -rm -f "$HOME/irc/${server}/sock"
       -
       -# Connect
       -#socat openssl:${server}:6697,keepalive,keepcnt=5,keepidle=1,keepintvl=1 \
       -#        unix-l:$HOME/irc/${server}/sock &
       -#while [ ! -e $HOME/irc/${server}/sock ];
       -#do
       -#        [ -z "$(pgrep socat)" ] && exit 1
       -#        sleep 0.5
       -#done
       -
       -# Connection
       -export ircuser="$(sed -n 's/^user: //p' $HOME/annna/${server}/irc-credentials.txt 2>/dev/null)"
       -export ircpass="$(sed -n 's/^pass: //p' $HOME/annna/${server}/irc-credentials.txt 2>/dev/null)"
       -#ii -s "${server}" -t -p 6697 -n "$ircuser" -k ircpass \
       -#        -f "Annna Robert-Houdin" &
       -if [ -n "${ircuser}" -a -n "${ircpass}" ];
       -then
       -        ii -s "${server}" -v${tlsparam} -p 6697 -n "$ircuser" \
       -                -f "Annna Robert-Houdin" &
       -        iipid=$!
       -else
       -        ii -s "${server}" -v${tlsparam} -p 6697 \
       -                -f "Annna Robert-Houdin" &
       -        iipid=$!
       -fi
       -
        {
       -        # Watch for ii to exit. Then remove the used directory to have all
       -        # services disappear.
       -        while kill -0 $iipid >/dev/null 2>&1;
       +        while [ -f ${cfgbase}/running ];
                do
       -                sleep 10
       +                # Connect
       +                #socat openssl:${server}:6697,keepalive,keepcnt=5,keepidle=1,keepintvl=1 \
       +                #        unix-l:${ircbase}/${server}/sock &
       +                #while [ ! -e ${ircbase}/${server}/sock ];
       +                #do
       +                #        [ -z "$(pgrep socat)" ] && exit 1
       +                #        sleep 0.5
       +                #done
       +
       +                rm -rf ${ircbase}/${server}
       +                mkdir -p ${ircbase}/${server}
       +
       +                # Connection
       +                export ircuser="$(sed -n 's/^user: //p' ${cfgbase}/${server}/irc-credentials.txt 2>/dev/null)"
       +                ircuserparam=""
       +                [ -n "${ircuserparam}" ] && ircuserparam="-u ${ircuser}"
       +
       +                export ircpass="$(sed -n 's/^pass: //p' ${cfgbase}/${server}/irc-credentials.txt 2>/dev/null)"
       +                ircpassparam=""
       +                [ -n "${ircpassparam}" ] && ircpassparam="-k ircpass"
       +
       +                if [ -f ${cfgbase}/${server}/fullname ];
       +                then
       +                        fullname="$(cat ${cfgbase}/${server}/fullname)"
       +                else
       +                        fullname="Gode"
       +                fi
       +
       +                #ii -s "${server}" -t -p 6697 -n "$ircuser" -k ircpass \
       +                #        -f "Annna Robert-Houdin" &
       +
       +                ii -s "${server}"${ircpassparam}${ircuserparam}${tlsparam} \
       +                        -f "${fullname}" -p ${port} &
       +                iipid=$!
       +
       +                sleep 5
       +
       +                ## Waiting for the socket to be available.
       +                while [ ! -e ${ircbase}/${server}/out ];
       +                do
       +                        kill -0 $iipid >/dev/null 2>&1 || exit 1
       +                        [ ! -f ${cfgbase}/running ] && exit 1
       +                        sleep 2
       +                done
       +
       +                #while [ -z "$(grep " 376 " ${ircbase}/${server}/out)" ];
       +                #do
       +                #        [ ! -f ${cfgbase}/running ] && exit 1
       +                #        sleep 2
       +                #done
       +
       +                {
       +                        sleep 2
       +                        annna-join-channels "${server}" "${channels}"
       +                } &
       +
       +                # Watch for ii to exit. Then remove the used directory to have all
       +                # services disappear.
       +                while kill -0 $iipid >/dev/null 2>&1;
       +                do
       +                        sleep 10
       +                done
       +                rm -rf ${ircbase}/${server}
                done
       -        rm -rf $HOME/irc/${server}
       -
        } &
        
       -## Waiting for the socket to be available.
       -while [ ! -e $HOME/irc/${server}/out ];
       -do
       -        kill -0 $iipid >/dev/null 2>&1 || exit 1
       -        sleep 0.5
       -done
       -
       -## Waiting for the motd to have ended so we can send something.
       -#while [ -z "$(grep "End of /MOTD command" $HOME/irc/${server}/out)" ];
       -#do
       -#        if [ -n "$(grep "Nickname is already in use" $HOME/irc/${server}/out)" ];
       -#        then
       -#                exit 1
       -#        fi
       -#
       -#        sleep 0.5
       -#done
       -
       -sleep 2
       -
       -# Channels
       -for chan in ${channels};
       -do
       -        printf "/j %s\n" "${chan}" > ${server}/in
       -
       -        # Do not flood.
       -        sleep 1
       -
       -        ## Make sure the pipes are there.
       -        while [ ! -e "$HOME/irc/${server}/${chan}/out" ];
       -        do
       -                sleep 0.5
       -        done
       -
       -        ## Make sure we are in the channel, for the services.
       -        while [ -z "$(grep "has joined ${chan}" \
       -                        $HOME/irc/${server}/${chan}/out)" ];
       -        do
       -                sleep 0.5
       -        done
       -
       -        annna-start-service "${server}" "${chan}"
       -done
       -
 (DIR) diff --git a/annna-start-service b/annna-start-service
       @@ -15,20 +15,21 @@ export PATH="$PATH:/home/annna/bin"
        # plan9port
        export PATH="$PATH:/opt/plan9/bin"
        
       -iiroot="/home/annna/irc"
       -iibase="/home/annna/irc/${server}"
       +cfgbase="$(pwd)"
       +ircbase="$(cat ${cfgbase}/ircbase)"
       +serverbase="${ircbase}/${server}"
        
        # Permissions
       -[ -d ${iiroot} ] && chmod o+rx ${iiroot}
       -[ -d ${iibase} ] && chmod o+rx ${iibase}
       +[ -d ${ircbase} ] && chmod o+rx ${ircbase}
       +[ -d ${serverbase} ] && chmod o+rx ${serverbase}
        
        ## Channel handlers
       -[ -d "${iibase}/${channel}" ] \
       -        && chmod o+rx "${iibase}/${channel}"
       -[ -p "${iibase}/${channel}/in" ] \
       -        && chmod o+w "${iibase}/${channel}/in"
       +[ -d "${serverbase}/${channel}" ] \
       +        && chmod o+rx "${serverbase}/${channel}"
       +[ -p "${serverbase}/${channel}/in" ] \
       +        && chmod o+w "${serverbase}/${channel}/in"
        
       -if [ -f "${iibase}/${channel}/out" ];
       +if [ -f "${serverbase}/${channel}/out" ];
        then
                annna-channel-service "${server}" "${channel}" &
        fi
 (DIR) diff --git a/annna-stop b/annna-stop
       @@ -5,6 +5,9 @@
        
        export PATH="$PATH:/home/annna/bin"
        
       +cfgbase="$HOME/annna"
       +[ -f "${cfgbase}/running" ] && rm -f "${cfgbase}/running"
       +
        annna-stop-ii
        annna-stop-checker
        annna-stop-services