#!/bin/bash # # .---. . . # | | | # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-. # | | (.-' (.-' ( | ( )| | | | )( )| | (.-' # ' ' --' --' -' - -' ' ' -' -' -' ' - --' # # Freedom in the Cloud # # A script for using avahi to discover peers and update zeronet trackers # Blogs and fora are discovered on the network and then published # to an index file which can be opened in a browser # License # ======= # # Copyright (C) 2015-2016 Bob Mottram # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . PROJECT_NAME='freedombone' export TEXTDOMAIN=$PROJECT_NAME-zeronetavahi export TEXTDOMAINDIR="/usr/share/locale" MESH_INSTALL_DIR=/var/lib WEB_PAGE_TITLE=$"${PROJECT_NAME} Mesh" TRACKER_PORT=6969 ZERONET_INSTALL=$MESH_INSTALL_DIR/zeronet MESH_USERNAME='fbone' MY_USERNAME=$MESH_USERNAME BLOGS_FILE=$ZERONET_INSTALL/${PROJECT_NAME}-blogs MAIL_FILE=$ZERONET_INSTALL/${PROJECT_NAME}-mail FORUM_FILE=$ZERONET_INSTALL/${PROJECT_NAME}-fora TOX_USERS_FILE=$ZERONET_INSTALL/${PROJECT_NAME}-tox-users ID_FILE=$ZERONET_INSTALL/${PROJECT_NAME}-id ZERONET_INDEX=$ZERONET_INSTALL/mesh.html ZERONET_CONFIG=$ZERONET_INSTALL/bootstrap IPFS_PORT=4001 IPFS_PATH=/usr/bin IPFS_COMMAND=$IPFS_PATH/ipfs MY_BLOG_STR=$"My Blog" MY_MAIL_STR=$"My Mail" MY_FORUM_STR=$"My Forum" MY_ID_STR=$"My ID Service" YOUR_SITES_STR=$'Your Sites' ON_THE_MESH_STR=$'On the Mesh' BLOGS_STR=$"Blogs" MAIL_STR=$"Mail" FORA_STR=$"Fora" TOX_STR=$"Users on the Mesh" ID_STR=$"ID Services" NO_USERS_STR=$"No users found" # service names advertised by avahi ENABLE_ZERONET= ZERONET_BLOG_STR="ZeroNet Blog" ZERONET_MAIL_STR="ZeroNet Mail" ZERONET_FORUM_STR="ZeroNet Forum" ZERONET_ID_STR="ZeroNet ID Service" # contains the output of the avahi command TEMPFILE_BASE=$(mktemp /tmp/zeronetavahibase.XXXXXX) TEMPFILE=$(mktemp /tmp/zeronetavahi.XXXXXX) # List of tox users previously seen PREV_TOX_USERS_FILE=/root/.prev_tox_users function ipfs_bootstrap { cat $TEMPFILE_BASE | grep "IPFS\|hostname =\|address =\|port =\|txt =" > $TEMPFILE state=0 address="" peer="" while IFS='' read -r line || [[ -n "$line" ]]; do if [ ${state} -eq "3" ]; then if [[ $line == *"txt ="* ]]; then ipfs_peer_id=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}' | awk -F '"' '{print $2}') $IPFS_COMMAND bootstrap add /ip4/${address}/tcp/${IPFS_PORT}/ipfs/${ipfs_peer_id} state=0 fi fi if [ ${state} -eq "2" ]; then if [[ $line == *"address ="* ]]; then address=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') state=3 fi fi if [ ${state} -eq "1" ]; then if [[ $line == *"hostname ="* ]]; then peer=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') state=2 fi fi if [[ $line == *"IPFS"* && $line == "= "* ]]; then state=1 fi done < "$TEMPFILE" } function detect_new_tox_users { CURRENT_USERS_FILE=$1 if [ ! -f $CURRENT_USERS_FILE ]; then return fi # Check that this is a GUI installation with a desktop if [ ! -d /home/$MESH_USERNAME/Desktop ]; then return fi # Produce notifications if new users appear if [ -f $PREV_TOX_USERS_FILE ]; then while IFS='' read -r line || [[ -n "$line" ]]; do if [[ $line != "Failed*" && $line != "data "* ]]; then if ! grep -q "$line" $PREV_TOX_USERS_FILE; then # get the nick of the user toxuser="$(echo "$line" | awk -F ' ' '{print $1}')" if [ -r "/home/$MESH_USERNAME/.dbus/Xdbus" ]; then . "/home/$MESH_USERNAME/.dbus/Xdbus" fi export DISPLAY=:0.0 export XAUTHORITY=/home/$MESH_USERNAME/.Xauthority sudo -u $MESH_USERNAME /usr/bin/notify-send $"$toxuser" $"has joined the mesh" --icon=dialog-information break fi fi done < "$CURRENT_USERS_FILE" fi # Store the previous tox users list cp -f $CURRENT_USERS_FILE $PREV_TOX_USERS_FILE } function detect_tox_users { # don't show the first peer field lstox | awk -F ' ' '{$1=""; print $0}' | sed -e 's/^[[:space:]]*//' | sort -d > $TEMPFILE detect_new_tox_users $TEMPFILE toxctr=0 echo '
    ' >> $TOX_USERS_FILE.new while IFS='' read -r line || [[ -n "$line" ]]; do if [[ $line != "Failed*" && $line != "data "* ]]; then echo "
  1. $line
  2. " >> $TOX_USERS_FILE.new toxctr=$((toxctr + 1)) fi done < "$TEMPFILE" if [ $toxctr -eq "0" ]; then echo "
  3. ${NO_USERS_STR}
  4. " >> $TOX_USERS_FILE.new fi echo '
      ' >> $TOX_USERS_FILE.new } function assemble_web_page { f="$1" fhome="$2" cat "${f}-header.html" "${f}.new" "${f}-footer.html" > "${f}.html" rm -f "${f}.new" if [ -d "${fhome}" ]; then sudo chown zeronet:zeronet "${f}.html" fi } function create_index { blogaddress=$(cat /home/$MY_USERNAME/.config/zeronet/myblog) mailaddress=$(cat /home/$MY_USERNAME/.config/zeronet/mymail) forumaddress=$(cat /home/$MY_USERNAME/.config/zeronet/myforum) idaddress=$(cat /home/$MY_USERNAME/.config/zeronet/myzeroid) if [ -f $ZERONET_INDEX ]; then sed -i "s|.*${MY_BLOG_STR}.*|
    1. ${MY_BLOG_STR}
    2. |g" $ZERONET_INDEX sed -i "s|.*${MY_MAIL_STR}.*|
    3. ${MY_MAIL_STR}
    4. |g" $ZERONET_INDEX sed -i "s|.*${MY_FORUM_STR}.*|
    5. ${MY_FORUM_STR}
    6. |g" $ZERONET_INDEX sed -i "s|.*${MY_ID_STR}.*|
    7. ${MY_ID_STR}
    8. |g" $ZERONET_INDEX return fi echo '' > $ZERONET_INDEX echo '' >> $ZERONET_INDEX echo '' >> $ZERONET_INDEX echo "$WEB_PAGE_TITLE" >> $ZERONET_INDEX echo '' >> $ZERONET_INDEX echo '' >> $ZERONET_INDEX echo "

      $WEB_PAGE_TITLE

      " >> $ZERONET_INDEX echo '' >> $ZERONET_INDEX echo "

      ${YOUR_SITES_STR}

      " >> $ZERONET_INDEX echo '' >> $ZERONET_INDEX echo '
        ' >> $ZERONET_INDEX echo "
      1. ${MY_BLOG_STR}
      2. " >> $ZERONET_INDEX echo "
      3. ${MY_MAIL_STR}
      4. " >> $ZERONET_INDEX echo "
      5. ${MY_FORUM_STR}
      6. " >> $ZERONET_INDEX echo "
      7. ${MY_ID_STR}
      8. " >> $ZERONET_INDEX # echo "
      9. File Share
      10. " >> $ZERONET_INDEX echo '
      ' >> $ZERONET_INDEX echo '' >> $ZERONET_INDEX echo "

      ${ON_THE_MESH_STR}

      " >> $ZERONET_INDEX echo '' >> $ZERONET_INDEX echo '
        ' >> $ZERONET_INDEX echo "
      1. ${BLOGS_STR}
      2. " >> $ZERONET_INDEX echo "
      3. ${MAIL_STR}
      4. " >> $ZERONET_INDEX echo "
      5. ${FORA_STR}
      6. " >> $ZERONET_INDEX echo "
      7. ${ID_STR}
      8. " >> $ZERONET_INDEX echo "
      9. ${TOX_STR}
      10. " >> $ZERONET_INDEX echo '
      ' >> $ZERONET_INDEX echo '' >> $ZERONET_INDEX echo '' >> $ZERONET_INDEX echo '' >> $ZERONET_INDEX } function create_header { header_file=${1}-header.html if [ -f $header_file ]; then return fi echo '' > $header_file echo '' >> $header_file echo '' >> $header_file echo "$WEB_PAGE_TITLE - $2" >> $header_file echo '' >> $header_file echo '' >> $header_file echo '' >> $header_file echo "

      $2

      " >> $header_file } function create_footer { footer_file=${1}-footer.html if [ -f $footer_file ]; then return fi echo '' >> $footer_file echo '' >> $footer_file } function avahi_extract_info { # Create a list of bootstrap nodes avahi-browse -atr > $TEMPFILE_BASE cat $TEMPFILE_BASE | grep "hostname =\|address =\|port =" > $TEMPFILE if [ ! -f $TEMPFILE ]; then exit 1 fi } function zeronet_detect { if [ -f $ZERONET_CONFIG.new ]; then rm -f $ZERONET_CONFIG.new fi touch $ZERONET_CONFIG.new state=0 address="" peer="" tracker_ctr=0 while IFS='' read -r line || [[ -n "$line" ]]; do if [ ${state} -eq "1" ]; then if [[ $line == *"address ="* ]]; then address=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') tracker_url="http://$peer:$TRACKER_PORT/announce" if ! grep -q "$tracker_url" $ZERONET_CONFIG.new; then echo "$tracker_url" >> $ZERONET_CONFIG.new tracker_ctr=$((tracker_ctr + 1)) fi state=0 fi fi if [[ $line == *"hostname ="* ]]; then peer=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') state=1 fi done < "$TEMPFILE" } function zeronet_detect_blog { if [ -f $BLOGS_FILE.new ]; then rm -f $BLOGS_FILE.new fi cat $TEMPFILE_BASE | grep "${ZERONET_BLOG_STR}\|hostname =\|address =\|port =\|txt =" > $TEMPFILE state=0 address="" peer="" echo '
        ' >> $BLOGS_FILE.new while IFS='' read -r line || [[ -n "$line" ]]; do if [ ${state} -eq "3" ]; then if [[ $line == *"txt ="* ]]; then blog_url=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') echo "
      1. ${peer}
      2. " >> $BLOGS_FILE.new state=0 fi fi if [ ${state} -eq "2" ]; then if [[ $line == *"address ="* ]]; then address=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') state=3 fi fi if [ ${state} -eq "1" ]; then if [[ $line == *"hostname ="* ]]; then peer=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') state=2 fi fi if [[ $line == *"${ZERONET_BLOG_STR}"* && $line == "= "* ]]; then state=1 fi done < "$TEMPFILE" echo '
      ' >> $BLOGS_FILE.new } function zeronet_detect_mail { if [ -f $MAIL_FILE.new ]; then rm -f $MAIL_FILE.new fi cat $TEMPFILE_BASE | grep "${ZERONET_MAIL_STR}\|hostname =\|address =\|port =\|txt =" > $TEMPFILE state=0 address="" peer="" echo '
        ' >> $MAIL_FILE.new while IFS='' read -r line || [[ -n "$line" ]]; do if [ ${state} -eq "3" ]; then if [[ $line == *"txt ="* ]]; then mail_url=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') echo "
      1. ${peer}
      2. " >> $MAIL_FILE.new state=0 fi fi if [ ${state} -eq "2" ]; then if [[ $line == *"address ="* ]]; then address=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') state=3 fi fi if [ ${state} -eq "1" ]; then if [[ $line == *"hostname ="* ]]; then peer=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') state=2 fi fi if [[ $line == *"${ZERONET_MAIL_STR}"* && $line == "= "* ]]; then state=1 fi done < "$TEMPFILE" echo '
      ' >> $MAIL_FILE.new } function zeronet_detect_fora { if [ -f $FORUM_FILE.new ]; then rm -f $FORUM_FILE.new fi cat $TEMPFILE_BASE | grep "${ZERONET_FORUM_STR}\|hostname =\|address =\|port =\|txt =" > $TEMPFILE state=0 address="" peer="" echo '
        ' >> $FORUM_FILE.new while IFS='' read -r line || [[ -n "$line" ]]; do if [ ${state} -eq "3" ]; then if [[ $line == *"txt ="* ]]; then forum_url=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') echo "
      1. ${peer}
      2. " >> $FORUM_FILE.new state=0 fi fi if [ ${state} -eq "2" ]; then if [[ $line == *"address ="* ]]; then address=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') state=3 fi fi if [ ${state} -eq "1" ]; then if [[ $line == *"hostname ="* ]]; then peer=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') state=2 fi fi if [[ $line == *"${ZERONET_FORUM_STR}"* && $line == "= "* ]]; then state=1 fi done < "$TEMPFILE" echo '
          ' >> $FORUM_FILE.new } function zeronet_detect_id { if [ -f $ID_FILE.new ]; then rm -f $ID_FILE.new fi cat $TEMPFILE_BASE | grep "${ZERONET_ID_STR}\|hostname =\|address =\|port =\|txt =" > $TEMPFILE state=0 address="" peer="" echo '
            ' >> $ID_FILE.new while IFS='' read -r line || [[ -n "$line" ]]; do if [ ${state} -eq "3" ]; then if [[ $line == *"txt ="* ]]; then id_url=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') echo "
          1. ${peer}
          2. " >> $ID_FILE.new state=0 fi fi if [ ${state} -eq "2" ]; then if [[ $line == *"address ="* ]]; then address=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') state=3 fi fi if [ ${state} -eq "1" ]; then if [[ $line == *"hostname ="* ]]; then peer=$(echo $line | awk -F '[' '{print $2}' | awk -F ']' '{print $1}') state=2 fi fi if [[ $line == *"${ZERONET_ID_STR}"* && $line == "= "* ]]; then state=1 fi done < "$TEMPFILE" echo '
          ' >> $ID_FILE.new } function avahi_remove_info { rm -f $TEMPFILE_BASE rm -f $TEMPFILE } function zeronet_update_config { if [ ${tracker_ctr} -gt "0" ]; then cp -f $ZERONET_CONFIG.new $ZERONET_CONFIG else if [ -f $ZERONET_CONFIG ]; then rm -f $ZERONET_CONFIG fi fi rm -f $ZERONET_CONFIG.new if [ -d $ZERONET_INSTALL ]; then sudo chown zeronet:zeronet $ZERONET_CONFIG fi } function avahi_ipfs { MY_IPFS_ID=/home/$MESH_USERNAME/.ipfs-id if [ ! -f $MY_IPFS_ID ]; then return fi service_name='ipfs' service_type='IPFS' service_protocol='tcp' service_port=$IPFS_PORT service_description=$(cat $MY_IPFS_ID) echo '' > /etc/avahi/services/${service_name}.service echo '' >> /etc/avahi/services/${service_name}.service echo '' >> /etc/avahi/services/${service_name}.service echo " %h ${service_type}" >> /etc/avahi/services/${service_name}.service echo ' ' >> /etc/avahi/services/${service_name}.service echo " _${service_type}._${service_protocol}" >> /etc/avahi/services/${service_name}.service echo " ${service_port}" >> /etc/avahi/services/${service_name}.service if [ "$service_description" ]; then echo " $service_description" >> /tmp/zeronet-blog.service fi echo ' ' >> /etc/avahi/services/${service_name}.service echo '' >> /etc/avahi/services/${service_name}.service } if [ ! -d /etc/avahi ]; then exit 0 fi avahi_extract_info if [ $ENABLE_ZERONET ]; then zeronet_detect zeronet_detect_id zeronet_detect_blog zeronet_detect_mail zeronet_detect_fora zeronet_update_config fi avahi_ipfs ipfs_bootstrap #detect_tox_users avahi_remove_info # make some html headers and footers if [ $ENABLE_ZERONET ]; then create_header $ID_FILE $ID_STR create_header $BLOGS_FILE $BLOGS_STR create_header $MAIL_FILE $MAIL_STR create_header $FORUM_FILE $FORA_STR create_footer $ID_FILE create_footer $BLOGS_FILE create_footer $MAIL_FILE create_footer $FORUM_FILE # make the index page create_index assemble_web_page ${ID_FILE} $ZERONET_INSTALL assemble_web_page ${BLOGS_FILE} $ZERONET_INSTALL assemble_web_page ${MAIL_FILE} $ZERONET_INSTALL assemble_web_page ${FORUM_FILE} $ZERONET_INSTALL chown -R zeronet:zeronet $ZERONET_INSTALL fi #create_header $TOX_USERS_FILE $"Tox Users" #create_footer $TOX_USERS_FILE #assemble_web_page ${TOX_USERS_FILE} $ZERONET_INSTALL exit 0