JS-DOS 6.22

JS-DOS permet d’exécuter un programme DOS dans un navigateur Web de manière très simple. => Site officiel : https://js-dos.com.

Version : https://github.com/caiiiycuk/js-dos/releases/tag/6.22.60

Télécharger et décompresser 6.22.60.zip :

cd Téléchargements
wget https://github.com/caiiiycuk/js-dos/releases/download/6.22.60/6.22.60.zip
unzip 6.22.60.zip -d 6.22.60

Problème rencontré : Le titre que je donne à mes pages html est écrasé par JS-DOS et indique DOSBox. Pour résoudre ce problème, j’ai modifié certains fichiers de l’archive en remplaçant :

setWindowTitle!=="undefined"

par :

setWindowTitle=="undefined"

Pour lister les fichiers concernés par le problème, on va écrire un script Bash dans un fichier nommé liste-jsdos.sh (utilisation : ./liste-jsdos.sh 6.22.60):

#!/bin/bash

# ============================================================
# Recherche de fichiers contenant :
#
#     setWindowTitle!=="undefined"
#
# Utilisation :
#
#     ./liste-jsdos.sh /chemin/vers/le/repertoire
#
# Exemple :
#
#     ./liste-jsdos.sh /var/www/html/js-dos
# ============================================================


# ------------------------------------------------------------
# Vérifie qu'un répertoire a été fourni en argument
# ------------------------------------------------------------

if [ -z "$1" ]; then
    echo "Usage : $0 /chemin/vers/le/repertoire"
    exit 1
fi


# ------------------------------------------------------------
# Stocke le répertoire fourni dans une variable
# ------------------------------------------------------------

DIR="$1"


# ------------------------------------------------------------
# Vérifie que le répertoire existe
# ------------------------------------------------------------

if [ ! -d "$DIR" ]; then
    echo "Erreur : le répertoire '$DIR' n'existe pas."
    exit 1
fi


# ------------------------------------------------------------
# Texte que l'on recherche
# ------------------------------------------------------------

PATTERN='setWindowTitle!=="undefined"'


# ------------------------------------------------------------
# Recherche récursive avec grep
#
# -r  : recherche récursivement dans les sous-répertoires
# -l  : affiche uniquement le nom des fichiers contenant
#       le texte recherché
# -F  : recherche le texte exactement, sans expression
#       régulière
# -I  : ignore les fichiers binaires
#
# "$DIR" : répertoire dans lequel commencer la recherche
# ------------------------------------------------------------

grep -rIlF "$PATTERN" "$DIR"

Résultat obtenu (5 fichiers contiennent l’erreur mentionnée) :

6.22.60/wdosbox.js
6.22.60/wdosbox-emterp.js
6.22.60/dosbox.js
6.22.60/dosbox-emterp.js
6.22.60/wdosbox-nosync.js

On va écrire un nouveau fichier Bash qui va corriger l’erreur (utilisation : ./reparer-jsdos.sh 6.22.60) :

#!/bin/bash

# ============================================================
# CORRECTION GÉNÉRIQUE DE JS-DOS
# ============================================================
#
# Le script recherche automatiquement dans un répertoire
# tous les fichiers contenant :
#
#     setWindowTitle!=="undefined"
#
# et remplace cette chaîne par :
#
#     setWindowTitle=="undefined"
#
# Il n'est donc pas nécessaire de connaître à l'avance
# les fichiers problématiques.
#
# Une copie de chaque fichier est créée avant modification :
#
#     fichier.js
#     fichier.js.bak
#
# Utilisation :
#
#     ./reparer-jsdos.sh /chemin/vers/js-dos
#
# Exemple :
#
#     ./reparer-jsdos.sh 6.22.60
#
# ============================================================


# ------------------------------------------------------------
# Vérification de l'argument
# ------------------------------------------------------------

if [ -z "$1" ]; then
    echo "Usage : $0 /chemin/vers/js-dos"
    exit 1
fi


# ------------------------------------------------------------
# Répertoire à analyser
# ------------------------------------------------------------

DIR="$1"


# ------------------------------------------------------------
# Vérification du répertoire
# ------------------------------------------------------------

if [ ! -d "$DIR" ]; then
    echo "Erreur : le répertoire '$DIR' n'existe pas."
    exit 1
fi


# ------------------------------------------------------------
# Texte recherché
# ------------------------------------------------------------

OLD='setWindowTitle!=="undefined"'


# ------------------------------------------------------------
# Texte de remplacement
# ------------------------------------------------------------

NEW='setWindowTitle=="undefined"'


# ------------------------------------------------------------
# Recherche des fichiers problématiques
# ------------------------------------------------------------
#
# grep :
#
#   -r  recherche récursivement
#   -l  affiche uniquement les noms des fichiers
#   -I  ignore les fichiers binaires
#   -F  recherche le texte exactement
#
# "|| true" empêche le script de s'arrêter si grep ne
# trouve aucun fichier.
# ------------------------------------------------------------

mapfile -t FILES < <(
    grep -rIlF "$OLD" "$DIR" 2>/dev/null || true
)


# ------------------------------------------------------------
# Vérification du résultat de la recherche
# ------------------------------------------------------------

if [ "${#FILES[@]}" -eq 0 ]; then

    echo "Aucun fichier contenant :"
    echo
    echo "    $OLD"
    echo
    echo "n'a été trouvé dans :"
    echo
    echo "    $DIR"

    exit 0
fi


# ------------------------------------------------------------
# Affichage du nombre de fichiers trouvés
# ------------------------------------------------------------

echo "=========================================="
echo " Fichiers problématiques trouvés"
echo "=========================================="
echo

echo "Nombre de fichiers : ${#FILES[@]}"
echo


# ------------------------------------------------------------
# Affichage de la liste
# ------------------------------------------------------------

for FILE in "${FILES[@]}"; do
    echo "  $FILE"
done


echo
echo "=========================================="
echo " Correction"
echo "=========================================="
echo


# ------------------------------------------------------------
# Traitement de chaque fichier
# ------------------------------------------------------------

for FILE in "${FILES[@]}"; do

    echo "Traitement : $FILE"


    # --------------------------------------------------------
    # Création d'une sauvegarde
    # --------------------------------------------------------
    #
    # Le fichier original est conservé avec l'extension .bak.
    #
    # Exemple :
    #
    #     dosbox.js
    #
    # devient :
    #
    #     dosbox.js
    #     dosbox.js.bak
    #
    # --------------------------------------------------------

    BACKUP="$FILE.bak"


    # --------------------------------------------------------
    # Évite d'écraser une sauvegarde existante
    # --------------------------------------------------------
    #
    # Si .bak existe déjà, on ne le remplace pas.
    #
    # Cela évite de perdre la version originale si le script
    # est exécuté plusieurs fois.
    #
    # --------------------------------------------------------

    if [ ! -f "$BACKUP" ]; then

        cp -p "$FILE" "$BACKUP"

        echo "  Sauvegarde : $BACKUP"

    else

        echo "  Sauvegarde déjà présente : $BACKUP"

    fi


    # --------------------------------------------------------
    # Compte le nombre d'occurrences avant modification
    # --------------------------------------------------------

    COUNT=$(grep -oF "$OLD" "$FILE" | wc -l)


    echo "  Occurrences trouvées : $COUNT"


    # --------------------------------------------------------
    # Effectue le remplacement
    # --------------------------------------------------------
    #
    # sed -i modifie directement le fichier.
    #
    # "g" signifie que toutes les occurrences de la chaîne
    # sont remplacées.
    #
    # --------------------------------------------------------

    sed -i \
        's/setWindowTitle!=="undefined"/setWindowTitle=="undefined"/g' \
        "$FILE"


    # --------------------------------------------------------
    # Vérification après modification
    # --------------------------------------------------------

    if grep -Fq "$OLD" "$FILE"; then

        echo "  ERREUR : certaines occurrences sont encore présentes."

        # Restauration automatique
        cp -p "$BACKUP" "$FILE"

        echo "  Fichier restauré depuis la sauvegarde."

    else

        echo "  OK : $COUNT occurrence(s) corrigée(s)."

    fi


    echo

done


# ------------------------------------------------------------
# Résumé final
# ------------------------------------------------------------

echo "=========================================="
echo " Terminé"
echo "=========================================="
echo

echo "Fichiers traités : ${#FILES[@]}"
echo
echo "Les fichiers originaux sont conservés avec l'extension .bak."

J’en ai informé l’auteur.

Laisser un commentaire