mastblocksmerge.sh 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #!/bin/bash
  2. # This program is free software: you can redistribute it and/or modify
  3. # it under the terms of the GNU General Public License as published by
  4. # the Free Software Foundation, either version 3 of the License, or
  5. # (at your option) any later version.
  6. # This program is distributed in the hope that it will be useful,
  7. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  9. # GNU General Public License for more details.
  10. # You should have received a copy of the GNU General Public License
  11. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  12. MASTHOME='/var/lib/mastodon'
  13. MASTENVFP="$MASTHOME/live/.env.production"
  14. SISTERSFP="istanzesorelle"
  15. HELP="SINTASSI
  16. mastblocksmerge.sh [opzioni]
  17. DESCRIZIONE
  18. Questo script integra i dati di una o più blocklist esterne nella
  19. tabella domain_blocks di mastodon.
  20. Legge i domini delle istanze di cui recuperare la blocklist da un file,
  21. per default \"$SISTERSP\" (formato del file: un dominio per riga),
  22. prova a recuperare ciascuna blocklist da
  23. https://[dominio]/domain_blocks.txt, costruisce dalle liste recuperate
  24. un\'unica lista senza duplicati, si collega al db di mastodon e scrive
  25. nella tabella domain_blocks i dati relativi alle istanze bloccate che
  26. non sono già presenti nella tabella stessa.
  27. Per la connessione al db di mastodon legge i dati necessari dal file
  28. di configurazione di mastodon, per default
  29. \"$MASTENVFP\"
  30. È pensato per essere eseguito periodicamente da un cron job, come
  31. utente mastodon oppure root oppure altro utente che abbia accesso in
  32. lettura al file di configurazione di mastodon.
  33. OPZIONI
  34. -H, --home
  35. Definisce la home di mastodon (per default \"$MASTHOME\")
  36. e di conseguenza il percorso del suo file di configurazione
  37. (per default \"$MASTENVFP\").
  38. È comunque possibile specificare individualmente il percorso
  39. del file di configurazione di mastodon con l\'opzione che segue.
  40. -e, --envfp
  41. Definisce il percorso del file di configurazione di mastodon in uso.
  42. -s, --sistersfp
  43. Definisce il percorso del file da cui leggere la lista delle istanze
  44. sorelle.
  45. -h, --help
  46. Mostra questo aiuto ed esce."
  47. args=("$@")
  48. i=0
  49. while [ $i -lt ${#args[@]} ]; do
  50. if [ "${args[$i]:0:1}" == "-" ]; then
  51. case "${args[$i]}" in
  52. "-H" | "--home" )
  53. if [ -z "${args[$i+1]}" ]; then
  54. echo "L'opzione \"${args[$i]}\" richiede un parametro (usa \"-h\" per l'aiuto)."
  55. exit 1
  56. else
  57. ((i++))
  58. MASTHOME=$(echo "${args[$i]}" | sed -e 's/\/$//')
  59. MASTENVFP="$MASTHOME/live/.env.production"
  60. fi
  61. ;;
  62. "-e" | "--envfp" )
  63. if [ -z "${args[$i+1]}" ]; then
  64. echo "L'opzione \"${args[$i]}\" richiede un parametro (usa \"-h\" per l'aiuto)."
  65. exit 1
  66. else
  67. ((i++))
  68. MASTENVFP="${args[$i]}"
  69. fi
  70. ;;
  71. "-s" | "--sistersfp" )
  72. if [ -z "${args[$i+1]}" ]; then
  73. echo "L'opzione \"${args[$i]}\" richiede un parametro (usa \"-h\" per l'aiuto)."
  74. exit 1
  75. else
  76. ((i++))
  77. SISTERSFP="${args[$i]}"
  78. fi
  79. ;;
  80. "-h" | "--help" )
  81. echo "$HELP"
  82. exit 0
  83. ;;
  84. *)
  85. echo "\"${args[$i]}\": opzione sconosciuta (usa \"-h\" per l'aiuto)."
  86. exit 1
  87. ;;
  88. esac
  89. else
  90. echo "\"${args[$i]}\": opzione sconosciuta (usa \"-h\" per l'aiuto)."
  91. exit 1
  92. fi
  93. ((i++))
  94. done
  95. [ ! -e "$MASTENVFP" ] && echo "\"$MASTENVFP\" non esiste, muoio (usa \"-h\" per l'aiuto)." && exit 1
  96. [ ! -f "$MASTENVFP" ] && echo "\"$MASTENVFP\" non è un file, muoio (usa \"-h\" per l'aiuto)." && exit 1
  97. [ ! -r "$MASTENVFP" ] && echo "\"$MASTENVFP\" non è leggibile, muoio (usa \"-h\" per l'aiuto)." && exit 1
  98. [ ! -e "$SISTERSFP" ] && echo "\"$SISTERSFP\" non esiste, muoio (usa \"-h\" per l'aiuto)." && exit 1
  99. [ ! -f "$SISTERSFP" ] && echo "\"$SISTERSFP\" non è un file, muoio (usa \"-h\" per l'aiuto)." && exit 1
  100. [ ! -r "$SISTERSFP" ] && echo "\"$SISTERSFP\" non è leggibile, muoio (usa \"-h\" per l'aiuto)." && exit 1
  101. DB_HOST=`grep 'DB_HOST' "$MASTENVFP"|sed -e 's/[^=]*=//'`
  102. DB_PORT=`grep 'DB_PORT' "$MASTENVFP"|sed -e 's/[^=]*=//'`
  103. DB_NAME=`grep 'DB_NAME' "$MASTENVFP"|sed -e 's/[^=]*=//'`
  104. DB_USER=`grep 'DB_USER' "$MASTENVFP"|sed -e 's/[^=]*=//'`
  105. DB_PASS=`grep 'DB_PASS' "$MASTENVFP"|sed -e 's/[^=]*=//'`
  106. IFS=$'\n'
  107. for sisdom in $(grep -P '^[^#]+[^\s]+' "$SISTERSFP"); do
  108. blocks="$(curl -s "https://$sisdom/domain_blocks.txt" | grep -P '^[^#]+[^\s]+')"
  109. # blocks=$(cat "$sisdom" | grep -P '^[^#]+[^\s]+')
  110. for line in $blocks; do
  111. dom=$(echo "$line" | sed -e 's/\t.*//' -e 's/\./\\./g')
  112. echo "$allblocks" | grep -P "^$dom\t" &>/dev/null
  113. [ $? -ne 0 ] && allblocks+="$line$IFS"
  114. done
  115. done
  116. allblocks=$(echo "$allblocks" | head -n -1 | sort)
  117. blocks=$(PGPASSWORD="$DB_PASS" psql -h "$DB_HOST" -p "$DB_PORT" -d "$DB_NAME" -U "$DB_USER" -c 'SELECT domain, updated_at, severity, public_comment FROM domain_blocks' -A -t -F $'\t')
  118. i=0
  119. for line in $allblocks; do
  120. dom=$(echo "$line" | sed -e 's/\t.*//' -e 's/\./\\./g')
  121. echo "$blocks" | grep -P "^$dom\t" &>/dev/null
  122. [ $? -ne 0 ] && newblocks+="$line$IFS" && ((i++))
  123. done
  124. newblocks=$(echo "$newblocks" | head -n -1 | sort)
  125. [ $i -eq 0 ] && echo "Non ho trovato nessuna nuova istanza bloccata." && exit 0
  126. echo "Ho trovato $i istanza/e bloccata da aggiungere."
  127. echo "$newblocks" | PGPASSWORD="$DB_PASS" psql -h "$DB_HOST" -p "$DB_PORT" -d "$DB_NAME" -U "$DB_USER" -A -t -c "COPY domain_blocks ( domain, created_at, updated_at, severity, reject_media, reject_reports, public_comment ) FROM STDIN WITH ( FORMAT text, DELIMITER ' ' )"