From dfcf1a5799d687dbbe0d496cad6b27df533778e1 Mon Sep 17 00:00:00 2001 From: unfr Date: Sat, 1 Feb 2025 22:23:51 +0100 Subject: [PATCH] envoi du script --- autopost/analyzer.php | 130 +++++++++++++++++++++++++++ autopost/common.sh | 29 ++++++ autopost/conf.sh | 24 +++++ autopost/posteur.sh | 77 ++++++++++++++++ bin/postauto | 172 ++++++++++++++++++++++++++++++++++++ install.sh | 200 ++++++++++++++++++++++++++++++++++++++++++ uninstall.sh | 79 +++++++++++++++++ 7 files changed, 711 insertions(+) create mode 100644 autopost/analyzer.php create mode 100644 autopost/common.sh create mode 100644 autopost/conf.sh create mode 100644 autopost/posteur.sh create mode 100644 bin/postauto create mode 100644 install.sh create mode 100644 uninstall.sh diff --git a/autopost/analyzer.php b/autopost/analyzer.php new file mode 100644 index 0000000..e4d6599 --- /dev/null +++ b/autopost/analyzer.php @@ -0,0 +1,130 @@ + pour choisir la méthode d'analyse +if (strpos($xmlContent, '') !== false) { + // Analyse via Regex (approche nzbanal.php) + $rename = '/"(.*?).par2/'; + preg_match($rename, $xmlContent, $matchesname); + $ngname = $matchesname[1]; + + if (empty($ngname)) { + $rename = '/subject="(.*?).par2/'; + preg_match($rename, $xmlContent, $matchesname); + $ngname = $matchesname[1]; + } + + // Récupération du mot de passe + $repass = '/(.*?)<\/meta>/'; + preg_match($repass, $xmlContent, $matchespass); + $password = $matchespass[1]; + + // Récupération de la date + $redate = '/date="(.*?)"/'; + preg_match($redate, $xmlContent, $matchesdate); + $update = $matchesdate[1]; + $update = date('d/m/Y', $update); + + // Calcul de la taille des fichiers RAR/ISO/MKV/MP4 + $regexsize = '/(rar|iso|mkv|mp4).*\(\d+\/\d+\) (\d+)/'; + preg_match_all($regexsize, $xmlContent, $matchessize, PREG_PATTERN_ORDER, 0); + + $filesize = formatBytesnzb(array_sum($matchessize[2])); + + // Extraction des groupes + $regroup = '/(.*?)<\/group>/'; + preg_match_all($regroup, $xmlContent, $matchesgroup, PREG_PATTERN_ORDER, 0); + $resultgroup = array_unique($matchesgroup[1]); + + $GROUP = ''; + $i = '0'; + foreach ($resultgroup as $group) { + $GROUP .= $group; + $i++; + } + + // Création de l'objet JSON pour cette approche + $myObj = new stdClass(); + $myObj->Name = $ngname; + $myObj->Pass = $password; + $myObj->Date = $update; + $myObj->Groupes = $GROUP; + $myObj->Taille = $filesize; + $myObj->Taillebit = array_sum($matchessize[2]); + + $myJSON = json_encode($myObj); + echo $myJSON; +} else { + // Analyse via XML (approche nzbanal_obs.php) + $password = 'Aucun'; + $xml = @simplexml_load_string($xmlContent, null, 0, "http://www.newzbin.com/DTD/2003/nzb"); + + if ($xml === false) { + die('Erreur lors de l\'analyse du fichier NZB en tant que XML.'); + } + + $maxSegmentsFile = null; + $maxSegmentsCount = 0; + + foreach ($xml->file as $file) { + $fileName = (string)$file->attributes()->subject; + $fileDate = (string)$file->attributes()->date; + $fileGroups = []; + $totalSize = 0; + $segmentCount = 0; + + foreach ($file->groups->group as $group) { + $fileGroups[] = (string)$group; + } + + foreach ($file->segments->segment as $segment) { + $segmentSize = (int)$segment->attributes()->bytes; + $totalSize += $segmentSize; + $segmentCount++; + } + + if ($segmentCount > $maxSegmentsCount) { + $maxSegmentsCount = $segmentCount; + $maxSegmentsFile = [ + 'name' => $fileName, + 'date' => $fileDate, + 'groups' => $fileGroups, + 'total_size' => $totalSize, + 'segment_count' => $segmentCount + ]; + } + } + + if ($maxSegmentsFile) { + $myObj = new stdClass(); + $myObj->Name = $maxSegmentsFile['name']; + $myObj->Pass = $password; + $myObj->Date = date('Y-m-d H:i:s', (int)$maxSegmentsFile['date']); + $myObj->Groupes = implode(', ', $maxSegmentsFile['groups']); + $myObj->Taille = formatBytesnzb($maxSegmentsFile['total_size']); + $myObj->Taillebit = $maxSegmentsFile['total_size']; + + $myJSON = json_encode($myObj); + echo $myJSON; + } else { + echo "Aucun fichier trouvé dans le NZB. +"; + } +} +?> diff --git a/autopost/common.sh b/autopost/common.sh new file mode 100644 index 0000000..395e9e1 --- /dev/null +++ b/autopost/common.sh @@ -0,0 +1,29 @@ +#!/bin/bash +source /home/$USER/autopost/conf.sh + +# Couleurs de texte +NOIR='\e[30m' +ROUGE='\e[31m' +VERT='\e[32m' +JAUNE='\e[33m' +BLEU='\e[34m' +ROSE='\e[35m' +CYAN='\e[36m' +BLANC='\e[37m' + +# Couleurs de fond +FOND_NOIR='\e[40m' +FOND_ROUGE='\e[41m' +FOND_VERT='\e[42m' +FOND_JAUNE='\e[43m' +FOND_BLEU='\e[44m' +FOND_ROSE='\e[45m' +FOND_CYAN='\e[46m' +FOND_BLANC='\e[47m' + +# Effets +GRAS='\e[1m' +SOULIGNE='\e[4m' +CLIGNOTANT='\e[5m' +INVERSE='\e[7m' +NORMAL='\e[0m' diff --git a/autopost/conf.sh b/autopost/conf.sh new file mode 100644 index 0000000..d171ee5 --- /dev/null +++ b/autopost/conf.sh @@ -0,0 +1,24 @@ +#!/bin/bash +#CONFIG A MODIF +URL_API="A NOUS DEMANDER SUR DISCORD" +APIKEY="A RETROUVER DANS VOTRE PROFIL" +DB_FILE="/home/$USER/autopost/base_autopost.db" +DOSSIER_GLOBAL="/home/$USER/" +DOSSIER_NFO="/home/$USER/autopost/mediainfo/" +DOSSIER_NZB_ATTENTE="/home/$USER/ATTENTE/" +DOSSIER_NZB_FINAL="/home/$USER/FINIS/" + +#CONFIG GLOBAL +SCREEN_NAME="autopost" +SCRIPT_PATH="/home/$USER/autopost/posteur.sh" +ANALYZER="/home/$USER/autopost/analyzer.php" + +#CONFIG FOURNISSEUR USENET DE POST +NG_HOST="" +NG_PORT="" +NG_USER="" +NG_PASS="" +NG_NBR_CONN="" + + + diff --git a/autopost/posteur.sh b/autopost/posteur.sh new file mode 100644 index 0000000..f9dcbb2 --- /dev/null +++ b/autopost/posteur.sh @@ -0,0 +1,77 @@ +#!/bin/bash +source /home/$USER/autopost/common.sh + +# Vérification et création des dossiers +for dossier in "$DOSSIER_NFO" "$DOSSIER_NZB_ATTENTE" "$DOSSIER_NZB_FINAL" +do + if [ ! -d "$dossier" ]; then + echo -e "${ROUGE} Le dossier $dossier n'existe pas. Création... ${NORMAL}" + mkdir -p "$dossier" + fi +done + +attente() { + for ((i=$1; i>0; i--)); do + echo -ne "Attente : $i secondes\r" + sleep 1 + done +} + +checkusenet(){ + SERVICE="nyuu" + if pgrep -x "$SERVICE" >/dev/null + then + echo "$SERVICE EN COURS" + sleep 16 + else + echo "$SERVICE OK" + fi +} + + +while true +do + verif=$(sqlite3 $DB_FILE "SELECT COUNT(ID) FROM release WHERE status = 0") + if [ $verif -ge 1 ]; then + verif=$(sqlite3 $DB_FILE "SELECT * FROM release WHERE status = '0' LIMIT 1") + id=$(echo $verif | awk -F "|" '{ print $1 }' | sed 's/^[ \t]*//;s/[ \t]*$//') + name=$(echo $verif | awk -F "|" '{ print $2 }' | sed 's/^[ \t]*//;s/[ \t]*$//') + FILESANSEXT=${name%.*} + echo -e ${VERT}"DEBUT DE TRAITEMENT DE" ${FILESANSEXT}${NORMAL} + echo -e ${CYAN}"CREATION DES PAR2"${NORMAL} + parpar -s10M -r20%+2 -m4096M -p1l -o ${FILESANSEXT}.par2 ${name} + + echo -e ${VERT}"UPLOAD SUR USENET" ${NORMAL} + checkusenet + nyuu -h ${NG_HOST} -P ${NG_PORT} -S -u ${NG_USER} -p ${NG_PASS} -n ${NG_NBR_CONN} -g alt.binaries.boneless -o "{fnamebase}.nzb" --nzb-title "${FILESANSEXT}" -f "{rand(14)} {rand(14)}@{rand(5)}.{rand(3)}" --message-id "{rand(32)}@{rand(8)}.{rand(3)}" --subject "{rand(32)}" --nzb-subject "{filename}" --obfuscate-articles ${FILESANSEXT}.* + mv ${FILESANSEXT}.nzb ${DOSSIER_NZB_ATTENTE} + if [ -e "${DOSSIER_NFO}""${FILESANSEXT}".json ]; then + echo -e ${JAUNE}"VERIF DU NZB"${NORMAL} + nzbsizebit=$(php ${ANALYZER} ${DOSSIER_NZB_ATTENTE}${FILESANSEXT}.nzb | jq '.Taillebit') + echo -e "NZB_SIZE :"${nzbsizebit} + jsonsizebit=$(cat ${DOSSIER_NFO}${FILESANSEXT}.json | jq -r '.media.track[] | select(.["@type"] == "General") | .FileSize') + echo -e "MEDIAINFO_SIZE :"${jsonsizebit} + if [[ ${nzbsizebit} -le ${jsonsizebit} ]] || [[ ${nzbsizebit} = "NAN" ]]; then + echo -e "$ROUGE""PROBLEME TAILLE NZB""$NORMAL" + rm ${DOSSIER_NZB_ATTENTE}${FILESANSEXT}.nzb ${FILESANSEXT}.par2 ${FILESANSEXT}.vol* + sqlite3 $DB_FILE "UPDATE release SET status = '2' WHERE id = ${id}" + else + echo -e ${CYAN}"ENVOI SUR LE SITE"${NORMAL} + curl -s -k -L -m 60 --output /dev/null -F rlsname=${FILESANSEXT} -F generated_nfo_json=@${DOSSIER_NFO}${FILESANSEXT}.json -F nzb=@${DOSSIER_NZB_ATTENTE}${FILESANSEXT}.nzb -F upload=upload "${URL_API}${APIKEY}" + first_char=$(echo "${name:0:1}" | tr '[:lower:]' '[:upper:]') + if [ ! -d ${DOSSIER_NZB_FINAL}${first_char} ]; then + mkdir ${DOSSIER_NZB_FINAL}${first_char} + fi + mv ${DOSSIER_NZB_ATTENTE}${FILESANSEXT}.nzb ${DOSSIER_NZB_FINAL}${first_char}/ + rm -rf ${FILESANSEXT}* + #rm ${DOSSIER_NFO}${FILESANSEXT}.json + sqlite3 $DB_FILE "UPDATE release SET status = '1' WHERE id = ${id}" + echo -e ${VERT}"FIN DE TRAITEMENT DE" ${FILESANSEXT}${NORMAL} + fi + else + echo -e ${ROUGE}"ENVOI SUR LE SITE IMPOSSIBLE NFO MANQUANT"${NORMAL} + fi + fi + attente 10 # Attente de 10 secondes +done + diff --git a/bin/postauto b/bin/postauto new file mode 100644 index 0000000..30d83f1 --- /dev/null +++ b/bin/postauto @@ -0,0 +1,172 @@ + #!/bin/bash + +source /home/$USER/autopost/common.sh + +checkdb(){ + if [ ! -f "$DB_FILE" ]; then + echo "La base de données n'existe pas. Création..." + do_createdb + fi +} + +do_start() { + checkdb + if screen -list | grep -q "$SCREEN_NAME"; then + echo "Le screen '$SCREEN_NAME' est déjà en cours d'exécution." + else + screen -dmS "$SCREEN_NAME" bash -c "$SCRIPT_PATH" + echo "Screen '$SCREEN_NAME' démarré avec '$SCRIPT_PATH'." + fi +} + +do_stop() { + if screen -list | grep -q "$SCREEN_NAME"; then + screen -S "$SCREEN_NAME" -X quit + echo "Screen '$SCREEN_NAME' arrêté." + else + echo "Aucun screen '$SCREEN_NAME' en cours d'exécution." + fi +} + +do_restart() { + do_stop + sleep 10 + do_start +} + +do_show() { + if screen -list | grep -q "$SCREEN_NAME"; then + screen -r "$SCREEN_NAME" + else + echo "Aucun screen '$SCREEN_NAME' en cours d'exécution." + fi +} + + +do_add() { + checkdb + release_path="$2" + release_name=$(basename "$release_path") + release_without_ext="${release_name%.*}" + + # Récupération de la réponse JSON complète + response=$(curl -s "${URL_API}${APIKEY}&check=${release_without_ext}") + + # Extraction du champ "code" avec jq + code=$(echo "$response" | jq -r '.code') + + # Extraction du champ "explain" avec jq + explain=$(echo "$response" | jq -r '.Explain') + + # Arrêt du script si "code" vaut 1, en affichant le message "explain" + if [ "$code" = "2" ]; then + echo -e "$ROUGE""$explain""$NORMAL" + sqlite3 "$DB_FILE" "INSERT INTO release (nom, status) VALUES ('${release_name}', 3);" + exit 1 + fi + + echo -e "$VERT""DEPLACEMENT DE LA RELEASE DANS LE REPERTOIRE DE TRAVAIL""$NORMAL" + cp -rl "${release_path}" "${DOSSIER_GLOBAL}" + + echo -e "$ROUGE""CREATION MEDIAINFO""$NORMAL" + mediainfo --output=JSON --full "${DOSSIER_GLOBAL}${release_name}" > "${DOSSIER_NFO}${release_without_ext}.json" + + echo -e "$CYAN""AJOUT DE LA RELEASE DANS LA DATABASE""$NORMAL" + sqlite3 "$DB_FILE" "INSERT INTO release (nom, status) VALUES ('${release_name}', 0);" +} + +do_status() { + checkdb + # Afficher la légende des couleurs + echo -e "${CYAN}${GRAS}■■■■■■${NORMAL} : EN ATTENTE" + echo -e "${ROSE}${GRAS}■■■■■■${NORMAL} : DEJA DISPONIBLE" + echo -e "${VERT}${GRAS}■■■■■■${NORMAL} : ENVOIR TERMINÉ" + echo -e "${ROUGE}${GRAS}■■■■■■${NORMAL} : ERREUR" + echo "" + + # Exécuter la requête SQLite et récupérer les résultats dans une variable + results=$(sqlite3 "$DB_FILE" "SELECT nom, status FROM (SELECT * FROM release ORDER BY id DESC LIMIT 500) ORDER BY id DESC;") + + # Trouver la longueur maximale du champ name + max_length=$(echo "$results" | awk -F'|' '{ if (length($1) > max) max = length($1) } END { print max }') + + # Ajouter 10 à la longueur maximale pour définir la largeur de la première colonne + col1_width=$((max_length + 5)) + + # En-tête du tableau + printf "%-${col1_width}s %-35s %-19s\n" "Name" + + # Parcourir les résultats et afficher avec la couleur appropriée + while IFS='|' read -r name status; do + case $status in + 0) + printf "${FOND_CYAN}${NOIR}${GRAS}%-${col1_width}s %-35s %-19s${NORMAL}\n" "$name" + ;; + 1) + printf "${FOND_VERT}${NOIR}${GRAS}%-${col1_width}s %-35s %-19s${NORMAL}\n" "$name" + ;; + 2) + printf "${FOND_ROUGE}${NOIR}${GRAS}%-${col1_width}s %-35s %-19s${NORMAL}\n" "$name" + ;; + 3) + printf "${FOND_ROSE}${NOIR}${GRAS}%-${col1_width}s %-35s %-19s${NORMAL}\n" "$name" + ;; + *) + printf "%-${col1_width}s %-30s %-15s\n" "$name" + ;; + esac + done <<< "$results" +} + +do_createdb() { + if [ -f "$DB_FILE" ]; then + read -p "Voulez-vous vraiment supprimer $DB_FILE ? (y/n) : " choix + if [[ "$choix" =~ ^[Yy]$ ]]; then + rm "$DB_FILE" + fi + fi + + sqlite3 "$DB_FILE" <" + exit 1 + fi + do_add "$@" + ;; + *) + echo "Usage: $0 {start|stop|restart|show|add }" + exit 1 + ;; +esac + diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..93af903 --- /dev/null +++ b/install.sh @@ -0,0 +1,200 @@ +#!/bin/bash +# Couleurs de texte +NOIR='\e[30m' +ROUGE='\e[31m' +VERT='\e[32m' +JAUNE='\e[33m' +BLEU='\e[34m' +ROSE='\e[35m' +CYAN='\e[36m' +BLANC='\e[37m' + +# Couleurs de fond +FOND_NOIR='\e[40m' +FOND_ROUGE='\e[41m' +FOND_VERT='\e[42m' +FOND_JAUNE='\e[43m' +FOND_BLEU='\e[44m' +FOND_ROSE='\e[45m' +FOND_CYAN='\e[46m' +FOND_BLANC='\e[47m' + +# Effets +GRAS='\e[1m' +SOULIGNE='\e[4m' +CLIGNOTANT='\e[5m' +INVERSE='\e[7m' +NORMAL='\e[0m' + +#Vérification des prérequis +echo -e "$BLEU""Vérification si les prérequis sont disponibles""$NORMAL" +LISTE_APPLIS="curl basename php" +BIN_DIR="$HOME/bin" +AUTOPOST_DIR="$HOME/autopost" + +# Vérifier si le dossier bin existe, sinon le créer +echo -e "$BLEU""Vérification de la présence du dossier bin""$NORMAL" +if [ ! -d "$BIN_DIR" ]; then + mkdir -p "$BIN_DIR" +fi + +LISTE_APPLIS=() + +# Vérifier et installer mediainfo si manquant +if command -v mediainfo > /dev/null 2>&1; then + LISTE_APPLIS+=("mediainfo") +else + echo -e "${ROUGE}mediainfo est manquant. Installation en cours...${NORMAL}" + curl -L -o "$BIN_DIR/mediainfo" "https://mediaarea.net/download/binary/mediainfo/20.09/mediainfo-20.09.glibc2.3-x86_64.AppImage" + chmod +x "$BIN_DIR/mediainfo" + LISTE_APPLIS+=("$BIN_DIR/mediainfo") + echo -e "${VERT}mediainfo installé dans $BIN_DIR${NORMAL}" +fi + +# Vérifier et installer sqlite3 si manquant +if command -v sqlite3 > /dev/null 2>&1; then + LISTE_APPLIS+=("sqlite3") +else + echo -e "${ROUGE}sqlite3 est manquant. Installation en cours...${NORMAL}" + curl -L -o sqlite-tools.zip "https://www.sqlite.org/2025/sqlite-tools-linux-x64-3480000.zip" + unzip sqlite-tools.zip -d "$BIN_DIR" + + # Recherche et déplacement du binaire sqlite3 uniquement + find "$BIN_DIR" -type f -name "sqlite3" -exec mv {} "$BIN_DIR/sqlite3" \; + chmod +x "$BIN_DIR/sqlite3" + + # Nettoyage des fichiers inutiles + rm -rf sqlite-tools.zip "$BIN_DIR/sqlite-tools-linux-x64-3480000" "$BIN_DIR/sqldiff" "$BIN_DIR/sqlite3_analyzer" "$BIN_DIR/sqlite3_rsync" + + LISTE_APPLIS+=("$BIN_DIR/sqlite3") + echo -e "${VERT}sqlite3 installé dans $BIN_DIR${NORMAL}" +fi + +# Vérifier et installer jq si manquant +if command -v jq > /dev/null 2>&1; then + LISTE_APPLIS+=("jq") +else + echo -e "${ROUGE}jq est manquant. Installation en cours...${NORMAL}" + curl -L -o "$BIN_DIR/jq" "https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-amd64" + chmod +x "$BIN_DIR/jq" + LISTE_APPLIS+=("$BIN_DIR/jq") + echo -e "${VERT}jq installé dans $BIN_DIR${NORMAL}" +fi + +# Télécharger et extraire Nyuu +echo -e "$BLEU""Téléchargement et installation de nyuu""$NORMAL" +NYUU_URL="https://github.com/Antidote2151/Nyuu-Obfuscation/releases/download/v0.4.2-Obfuscate1.3/nyuu-v0.4.2-Obfuscate1.3-linux-amd64.tar.xz" +NYUU_TAR="nyuu.tar.xz" +NYUU_EXE="nyuu" + +wget -q -O "$NYUU_TAR" "$NYUU_URL" +tar -xJf "$NYUU_TAR" > /dev/null 2>&1 +mv "$NYUU_EXE" "$BIN_DIR/nyuu" +rm config-sample.json +rm "$NYUU_TAR" +chmod 777 "$BIN_DIR/nyuu" +LISTE_APPLIS+=("$BIN_DIR/nyuu") + +# Télécharger et extraire ParPar +echo -e "$BLEU""Téléchargement et installation de parpar""$NORMAL" +PARPAR_URL="https://github.com/animetosho/ParPar/releases/download/v0.4.5/parpar-v0.4.5-linux-static-amd64.xz" +PARPAR_XZ="parpar-v0.4.5-linux-static-amd64.xz" + +wget -q -O "$PARPAR_XZ" "$PARPAR_URL" +xz -d "$PARPAR_XZ" > /dev/null 2>&1 +chmod 777 "parpar-v0.4.5-linux-static-amd64" +mv "parpar-v0.4.5-linux-static-amd64" "$BIN_DIR/parpar" +LISTE_APPLIS+=("$BIN_DIR/parpar") + +# Téléchargement et installation du script de post +echo -e "$BLEU""Téléchargement de autopost""$NORMAL" + +# Création des répertoires si inexistants +mkdir -p "$AUTOPOST_DIR" + +# Télécharger les fichiers dans autopost +wget -q -O "$AUTOPOST_DIR/analyzer.php" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/autopost/analyzer.php" +wget -q -O "$AUTOPOST_DIR/common.sh" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/autopost/common.sh" +wget -q -O "$AUTOPOST_DIR/posteur.sh" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/autopost/posteur.sh" + +# Télécharger le fichier dans bin +wget -q -O "$BIN_DIR/postauto" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/bin/postauto" + +if [ ! -f "$AUTOPOST_DIR/conf.sh" ]; then + wget -q -O "$AUTOPOST_DIR/conf.sh" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/autopost/conf.sh" +fi + +# Donner les permissions d'exécution si nécessaire +chmod 777 "$BIN_DIR/postauto" +chmod -R 755 "$AUTOPOST_DIR" + +LISTE_APPLIS+=("$BIN_DIR/postauto") + +source ~/.bashrc + +manquants=() + +for i in $LISTE_APPLIS; do + if ! command -v "$i" > /dev/null 2>&1; then + manquants+=("$i") + fi +done + +if [ ${#manquants[@]} -gt 0 ]; then + echo -e "${ROUGE}Programme(s) manquant(s) : ${manquants[*]}${NORMAL}" + exit 1 +else + echo -e "${VERT}Toutes les dépendances sont disponibles.${NORMAL}" +fi + +# Définir le chemin du fichier bashrc +BASHRC_FILE="$HOME/.bashrc" + +# Marqueurs pour identifier la section ajoutée +DEBUT_MARKER="# DEBUT COMPLETION POSTAUTO" +FIN_MARKER="# FIN COMPLETION POSTAUTO" + +# Le code de complétion à ajouter, encadré par les marqueurs +read -r -d '' COMPLETION_CODE << 'EOF' +# DEBUT COMPLETION POSTAUTO +# Fonction de complétion pour ton script +_autopost_completion() { + local cur prev opts + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + + # Liste des commandes disponibles + opts="start stop restart show status createdb add" + + # Si l'utilisateur est en train de taper le premier argument, proposer les commandes + if [ $COMP_CWORD -eq 1 ]; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + + # (Optionnel) Pour la sous-commande "add", proposer des fichiers en complétion + if [ $COMP_CWORD -eq 2 ] && [ "${COMP_WORDS[1]}" = "add" ]; then + COMPREPLY=( $(compgen -f -- "${cur}") ) + return 0 + fi +} + +# Associer la fonction de complétion à ton script (ici, 'postauto' est le nom de la commande) +complete -F _autopost_completion postauto +# FIN COMPLETION POSTAUTO +EOF + +# Vérifier si le code est déjà présent dans le fichier bashrc +if grep -q "$DEBUT_MARKER" "$BASHRC_FILE"; then + echo "La configuration de complétion pour 'postauto' est déjà présente dans $BASHRC_FILE." +else + echo "Ajout de la configuration de complétion dans $BASHRC_FILE..." + # Ajouter une ligne vide pour séparer (optionnel) + echo "" >> "$BASHRC_FILE" + # Ajouter le code de complétion + echo "$COMPLETION_CODE" >> "$BASHRC_FILE" + echo "Mise à jour effectuée." +fi + +echo "Suppression du script après exécution..." +rm -- "$0" diff --git a/uninstall.sh b/uninstall.sh new file mode 100644 index 0000000..62668bb --- /dev/null +++ b/uninstall.sh @@ -0,0 +1,79 @@ +#!/bin/bash +source "$HOME/autopost/common.sh" + +BIN_DIR="$HOME/bin" +AUTOPOST_DIR="$HOME/autopost" + +LISTE_APPLIS=( + "$BIN_DIR/mediainfo" + "$BIN_DIR/sqlite3" + "$BIN_DIR/jq" + "$BIN_DIR/nyuu" + "$BIN_DIR/parpar" + "$BIN_DIR/postauto" +) + +# Vérifier et supprimer les fichiers existants +for fichier in "${LISTE_APPLIS[@]}"; do + if [ -f "$fichier" ]; then + echo "Suppression de $fichier" + rm -f "$fichier" + fi +done + +rm -f "$AUTOPOST_DIR/common.sh" +rm -f "$AUTOPOST_DIR/posteur.sh" +rm -f "$AUTOPOST_DIR/analyzer.php" +rm -rf "${DOSSIER_NFO:-}" + +# Demander confirmation pour supprimer le fichier de conf +read -r -p "Voulez-vous vraiment supprimer votre fichier de conf ? (y/n) : " conf +if [[ "$conf" =~ ^[Yy]$ ]]; then + rm -f "$AUTOPOST_DIR/conf.sh" +fi + +# Demander confirmation pour supprimer la base de données +read -r -p "Voulez-vous vraiment supprimer $DB_FILE ? (y/n) : " filedb +if [[ "$filedb" =~ ^[Yy]$ ]]; then + rm -f "$DB_FILE" +fi + +# Demander confirmation pour supprimer les NZB +read -r -p "Voulez-vous supprimer vos NZB ? (y/n) : " nzb +if [[ "$nzb" =~ ^[Yy]$ ]]; then + rm -f "$DB_FILE" + rm -rf "${DOSSIER_NZB_ATTENTE:-}" + rm -rf "${DOSSIER_NZB_FINAL:-}" +fi + +# Vérifier si le dossier existe et est vide +if [ -d "$AUTOPOST_DIR" ] && [ -z "$(ls -A "$AUTOPOST_DIR" 2>/dev/null)" ]; then + echo "Suppression du dossier $AUTOPOST_DIR car il est vide." + rmdir "$AUTOPOST_DIR" +fi + +# Chemin vers le fichier bashrc +BASHRC_FILE="$HOME/.bashrc" + +# Définir les marqueurs qui encadrent le bloc à supprimer +DEBUT_MARKER="# DEBUT COMPLETION POSTAUTO" +FIN_MARKER="# FIN COMPLETION POSTAUTO" + +# Vérifier si le bloc est présent dans le fichier +if grep -q "$DEBUT_MARKER" "$BASHRC_FILE"; then + echo "Suppression de la configuration de complétion dans $BASHRC_FILE..." + + # Faire une sauvegarde de sécurité du fichier .bashrc + cp "$BASHRC_FILE" "${BASHRC_FILE}.bak" + echo "Sauvegarde réalisée dans ${BASHRC_FILE}.bak" + + # Supprimer le bloc de code entre les marqueurs (inclusifs) + sed -i "/$DEBUT_MARKER/,/$FIN_MARKER/d" "$BASHRC_FILE" + + echo "Bloc de configuration supprimé." +else + echo "Aucun bloc de configuration de complétion trouvé dans $BASHRC_FILE." +fi + +echo "Suppression du script après exécution..." +rm -- "$0" \ No newline at end of file