#!/bin/bash
BDD_NOM='scrom.db'
DIR_DAT='links'
NC='\033[0m'
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
PURPLE='\033[0;35m'
# -----------------------------------------
# creation des tables de la base de données
# -----------------------------------------
function create_tables() {
# vérifier si la base de données existe
if [ ! -f $BDD_NOM ]; then
echo -e "${RED}database not found, create $BDD_NOM${NC}"
# créer la base de données
sqlite3 $BDD_NOM < /dev/null
echo "create tables : systemes, pages, jeux"
# créer la table systemes
sqlite3 -batch $BDD_NOM "create table systemes (\
id INTEGER PRIMARY KEY,\
identifiant TEXT,\
machine TEXT,\
televerseur TEXT,\
extension TEXT,\
commentaire TEXT);" 2> /dev/null
# créer la table pages
sqlite3 -batch $BDD_NOM "create table pages (\
id INTEGER PRIMARY KEY,\
identifiant_systeme TEXT,\
lien TEXT,\
commentaire TEXT);" 2> /dev/null
# créer la table jeux
sqlite3 -batch $BDD_NOM "create table jeux (\
id INTEGER PRIMARY KEY,\
lien_page TEXT,\
lien TEXT,\
nom TEXT,\
telechargement TEXT,\
commentaire TEXT);" 2> /dev/null
fi
}
# -------------------------------------------
# vérifier si toutes les URLs sont valides
# $1 = fichier .dat
# -------------------------------------------
function check_urls() {
# toutes les URL sont valides
local urls=0
# boucle sur toutes les URLs dans le fichier .dat
while read -r url_page; do
# vérifier si la ligne n'est pas vide
if [ -z "$url_page" ]; then
break
fi
# vérifier si l'URL est valide
if [[ $url_page =~ ^https?://.*$ ]]; then
echo -n "$url_page : "
# obtenir le statut de l'URL avec curl
status="$(curl -Is "$url_page" | head -1)"
validate=( $status )
# vérifier si l'URL est valide
if [ "${validate[-2]}" == "200" ]; then
echo -e "${GREEN}valid${NC}"
else
echo -e "${RED}not valid${NC}"
# pas valide
urls=1
fi
else
echo -e "${RED}$url_page : bad url${NC}"
# mauvaise URL
urls=1
fi
# boucle sur toutes les URLs du fichier .dat
done < <(tail -n +4 "$1")
# si au moins une URL n'est pas valide, retourne 1 sinon 0
return $urls
}
# ------------------------------------------------------------
# fonction pour ajouter des fichiers .dat à la base de données
# ------------------------------------------------------------
function files_to_database() {
# vérifier si le répertoire existe
if [ -d "$DIR_DAT" ]; then
echo -e "${YELLOW}check if all .dat files have been added to the database...${NC}"
# boucle sur tous les fichiers .dat
for file in "$DIR_DAT"/*.dat; do
# lire les 3 premières lignes, et obtenir machine, téléverseur et extension
exec 6< $file
read machine <&6
read televerseur <&6
read extension <&6
exec 6<&-
# créer l'identifiant
identifiant=$(echo $machine\_$televerseur)
echo -ne "dat file ${PURPLE}$machine - $televerseur${NC} in database : "
# datas_file = 0 n'est pas ajouté à la base de données
datas_file=0
# vérifier si le fichier .dat a été ajouté à la base de données
# obtenir tous les identifiants dans la base de données
identifiants=(`sqlite3 -batch $BDD_NOM "select identifiant from systemes"`)
# vérifier si l'identifiant est dans la base de données
for idents in "${identifiants[@]}"; do
# identifiant trouvé, data_file = 1
if [ $idents == $identifiant ]; then
datas_file=1
echo -e "${GREEN}ok${NC}"
break
fi
done
# data_file = 0, le fichier .dat n'a pas été ajouté à la base de données,
# vérifier si toutes les URLs sont valides
if [ $datas_file == 0 ]; then
echo -e "${RED}no found, checking urls :${NC}"
# obtenir le nombre de lignes dans le fichier .dat
lines=$(wc -l < "$file")
# vérifier si le fichier contient des liens
if [ "$lines" -le 3 ]; then
echo -e "${RED}no URLs found, the .dat file is not added to the database${NC}"
datas_file=1
else
# le fichier contient au moins une URL,
# vérification des URLs
if check_urls $file; then
echo -n "all urls are valid : "
else
echo -e "${RED}at least one URL is not valid, the .dat file is not added to the database${NC}"
datas_file=1
fi
fi
fi
# data_file = 0, le fichier .dat n'a pas été ajouté à la base de données
# et toutes les URL sont valides, le fichier peut être ajouté à la base de données
if [ $datas_file == 0 ]; then
echo -e "${YELLOW}searching for games...${NC}"
# boucle sur toutes les URL
tail -n +4 $file | while read url_page; do
# vérifier si la ligne url_page n'est pas vide
if [ -z "$url_page" ]; then
break
fi
# insérer dans la table pages identifiant_systeme et lien
sqlite3 -batch $BDD_NOM "\
insert into pages (identifiant_systeme,lien) \
values ('$identifiant','$url_page');" 2> /dev/null
# extraire le dernier répertoire de l'URL
echo -n "${url_page#*/*/*/*/} : "
# obtenir tous les liens de jeux avec l'extension spécifiée contenus dans la page
counter=0; while read url_jeu; do
# extraire de url_jeu le nom du jeu
[[ $url_jeu == *\'* ]] && url_jeu=$(echo $url_jeu | sed "s/'/''/g")
nom_jeu=$(basename "$url_jeu" ".$extension")
# insérer dans la table jeux lien_page, lien, nom, telechargement
sqlite3 -batch $BDD_NOM "\
insert into jeux (lien_page,lien,nom,telechargement) \
values ('$url_page','$url_jeu','$nom_jeu','-');" 2> /dev/null
# compter les jeux
let counter++
# obtenir tous les liens de jeux avec l'extension spécifiée contenus dans la page avec lynx
done < <(lynx -dump -listonly -nonumbers $url_page | grep "\.${extension}$")
echo -e "${GREEN}${counter} found${NC}"
# boucle sur toutes les URL
done
# insérer dans la table systemes identifiant, machine, televerseur, extension
sqlite3 -batch $BDD_NOM "\
insert into systemes (identifiant,machine,televerseur,extension) \
values ('$identifiant','$machine','$televerseur','$extension');" 2> /dev/null
fi
# boucle sur tous les fichiers .dat
done
fi
}
# ----
# main
# ----
# creation de la base de données et des tables
create_tables
# inserer les fichiers .dat dans la base de données
files_to_database