IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Mise à jour Minecraft : wget et conditions


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut Mise à jour Minecraft : wget et conditions
    Bonjour à tous et à toutes.

    J'ai des scripts qui mettent à jour mes docker Minecraft. Seulement, lorsque les dockers sont mis à jour, les plugins eux ne le sont pas et le serveur ne fonctionne plus.
    J'utilise deux plugins : floodgate et Geyser. Pour eux, c'est facile :

    $backup_source est une variable qui contient le chemin vers les fichiers du docker.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # Update floodgate-api.jar
    if [ -e "${backup_source}/plugins/floodgate-api.jar" ]
    then
        wget -N "https://ci.opencollab.dev/job/GeyserMC/job/Floodgate/job/master/lastSuccessfulBuild/artifact/api/target/floodgate-api.jar" -O "${backup_source}/plugins/floodgate-api.jar"
    fi
     
    # Update Geyser-Spigot.jar
    if [ -e "${backup_source}/plugins/Geyser-Spigot.jar" ]
    then
        wget -N "https://ci.opencollab.dev//job/GeyserMC/job/Geyser/job/master/lastSuccessfulBuild/artifact/bootstrap/spigot/target/Geyser-Spigot.jar" -O "${backup_source}/plugins/Geyser-Spigot.jar"
    fi
    Jusque là, c'est facile !
    Mais...
    J'ai aussi besoin de mettre à jour WorldEdit et là, ça se corse, l'URL est la suivante : https://dev.bukkit.org/projects/worldedit/files/latest
    Mais cette URL pose deux problèmes :
    • Avec wget, le fichier téléchargé s'appelle latest, or si on le fait dans un navigateur, le fichier est un fichier du genre "worldedit-bukkit-7.2.10.jar" dont le nom change à chaque version.
    • dans mon répertoire plugin, le nom s'appelle worldedit-bukkit-7.1.5.jar par exemple => il faut donc le supprimer, mieux, ne le mettre à jour que si besoin


    1. Une solution rapide serait de supprimer systématiquement worldedit-bukkit-*.jar et de télécharger la dernière version, mais
      Je ne sais pas comment télécharger le fichier dans le bon nom, il me télécharge et me le nomme latest !
    2. La meilleur solution est de chercher la version du fichier -bukkitxxxxx dans le répertoire plugin, de demander à wget le nom du fichier qui se trouve derrière l'URL, de comparer les versions et de finalement ne télécharger le fichier (et supprimer l'ancien) que s'il y a une nouvelle version.
      Et là, il y a beaucoup de choses que je ne sais pas faire


    Une idée, un coup de main ? Merci à tous et portez vous bien.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    Bonjour,

    le mieux, ce serait de faire digérer la page des téléchargements (https://dev.bukkit.org/projects/worldedit/files) par python pour récupérer le lien et la version de la dernière mise à jour (la première ligne du tableau), voire de lui demander de télécharger le lien proprement...
    en shell, ça sent la grosse galère.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    parce que je suis têtu :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ read url nomFichier < <(wget -qO- 'https://dev.bukkit.org/projects/worldedit/files' \
        | sed 's/^M//g' \
        | sed -zn 's/<a class="overflow-tip twitch-link"/\x00/;
                   s/.*\x00/<a class="overflow-tip twitch-link"/;
                   s@\(<a class="overflow-tip twitch-link" href="/projects/worldedit[^>]*[^>]*>\).*@\1@;
                   s@.*href="\([^"]*\).*data-name="\([^"]*\).*@https://dev.bukkit.org/\1/download \2@p')
    à utiliser ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ wget -qO "$nomFichier.jar" "$url"
    la transformation du nom dans un format qui te convient mieux est triviale.

    edit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                   s/.*\x00]*/<a class="overflow-tip twitch-link"/;

  4. #4
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut
    Eh..... Je dis respect et merci....

    Bon, ça me donne un nom de fichier => WorldEdit 7.2.10 (1.13.2 - 1.18.2) et non pas "worldedit-bukkit-7.2.10.jar", je vais tenter de comprendre ce que tu as fait...
    Tu peux juste expliquer ta démarche ? C'est un poil compliqué là... Comme ça je pourrais le faire évoluer pour ce que je veux faire et surtout que j'en ai d'autres.

    En plus tu fais ça à deux heures du mat !

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    seule la partie du milieu varie, tu peux la récupérer en plaçant la variable nomFichier un tableau indexé, pour rester ±full-bash, ou alors la récupérer avec un cut...
    l'extension, et le préfixe (wordedit-bukkit-), eux, sont constants.

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    le premier sed sert à convertir le fichier au format UNIX (\n uniquement).

    ensuite, en gros, le second sed met plus ou moins tout le fichier sur une seule ligne (pour "casser" le format aléatoire du HTML),
    remplace la première occurrence du début du lien par NULL,
    puis supprime tout ce qui précède ce NULL,
    récupère tout ce qu'il y a jusqu'au deuxième >,
    et, finalement, récupère les infos pertinentes.

    sed : simply esoteric dialect.

  7. #7
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut
    Je n'ai pas compris, quelle partie du milieu ?
    Et comment tu récupères ce qu'il faut parser ? J'ai exécuté wget -qO- 'https://dev.bukkit.org/projects/worldedit/files/latest' et le moins qu'on puisse dire c'est que ça fou le bordel dans la console !

    EDIT : ok, je viens de faire wget -qO- 'https://dev.bukkit.org/projects/worldedit/files' et en effet, j'obtient un fichier en retour qu'il faut parser, je vais examiner sed (que j'ai pas utilisé depuis la fac) pour comprendre les différentes expressions régulières que tu as utilisé.

    EDIT 2 : Ok, super, j'avais pas vu que tu avais déjà répondu.
    Il va falloir que je le fasse en deux temps mais quand j'exécute la commande, je vois que j'ai le lien sur le fichier => https://dev.bukkit.org/projects/worldedit/files/3559523
    En refaisant un nouveau wget il y a le nom du vrai fichier inscrit dans la page web, je vais creuser ça, merci.

    Je vous tient au courant et donnerai l'état de mes recherches...

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    Citation Envoyé par Feneck91 Voir le message
    Je n'ai pas compris, quelle partie du milieu ?
    le numéro de version.
    Et comment tu récupères ce qu'il faut parser ? J'ai exécuté wget -qO- 'https://dev.bukkit.org/projects/worldedit/files/latest' et le moins qu'on puisse dire c'est que ça fou le bordel dans la console !
    ça affiche le contenu compressé du jar sur la console. Ça doit pas être beau.

  9. #9
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ça affiche le contenu compressé du jar sur la console. Ça doit pas être beau.
    Comment dire.... C'est exactement ça !

  10. #10
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    parce que je suis têtu :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    read url nomFichier < <(wget -qO- 'https://dev.bukkit.org/projects/worldedit/files' \
        | sed 's/^M//g' \
        | sed -zn 's/<a class="overflow-tip twitch-link"/\x00/;
                   s/.*\x00]*/<a class="overflow-tip twitch-link"/;
                   s@\(<a class="overflow-tip twitch-link" href="/projects/worldedit[^>]*[^>]*>\).*@\1@;
                   s@.*href="\([^"]*\).*data-name="\([^"]*\).*@https://dev.bukkit.org/\1/download \2@p')
    à utiliser ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ wget -qO "$nomFichier.jar" "$url"
    la transformation du nom dans un format qui te convient mieux est triviale.
    Bon, je décortique le bignou pour comprendre...
    read url nomFichier Lit dans l'entrée standard les deux variables url et nomFichier.
    < c'est pour rediriger le wget vers le read.
    <( ..... blah blah blah commande ) : aucune espèce d'idée mais l'espace entre les deux << est important ainsi que le fait que <( soit collé. Mais je ne sais pas à quoi ça sert.
    wget -qO- 'url' : -q –> Évite l'affichage des messages du wget / -O spécifie le fichier de sortie et le - après le O signifie de mettre sur la sortie standard pour pouvoir le piper.
    Ensuite des instruction sed pipées...

    Et là... j'ai la migraine...

    sed 's/^M//g' : s/ c'est substitution : s/<chercher>/<remplacer>/[g] le g est optionnel et permet de remplacer toutes les occurrences sur la ligne et non pas uniquement la première.
    Toutes les lignes qui commencent par M : on supprime le M du début de ligne et toutes les occurences (mais il doit y en avoir qu'une seule puisque c'est en début de ligne)............. bizarre ce truc...

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    <( ... ) est une Substitution de processus.
    ça fonctionne comme un pipe, mais ça permet de conserver les variables dans l'environnement courant, alors qu'un [i]pipe[/c] crée un sous-processus en dehors duquel les variables qui y sont créées n'existent plus.

    oops!
    ^M j'ai oublié de te dire qu'il s'agit d'un caractère unique obtenu avec la combinaison de touches Ctrl-V Ctrl-M, qui est équivalent au retour chariot (\r) des alinéas au format Windows (\r\n).
    plutôt que ce sed, s'il est disponible sur ton système tu peux utiliser dos2unix.

  12. #12
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut
    La ligne du premier sed peut donc être replacée par sed 's/\x0D$//'

    Bon, on reprend calmement.

    Le code est donc le suivant :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    read url nomFichier < <(wget -qO- 'https://dev.bukkit.org/projects/worldedit/files' \
        | sed 's/\x0D$//' \
        | sed -zn 's/<a class="overflow-tip twitch-link"/\x00/;
                   s/.*\x00]*/<a class="overflow-tip twitch-link"/;
                   s@\(<a class="overflow-tip twitch-link" href="/projects/worldedit[^>]*[^>]*>\).*@\1@;
                   s@.*href="\([^"]*\).*data-name="\([^"]*\).*@https://dev.bukkit.org/\1/download \2@p')

    Bon, je décortique le bignou pour comprendre...
    read url nomFichier Lit dans l'entrée standard les deux variables url et nomFichier.
    < c'est pour rediriger le wget vers le read.
    <( ..... blah blah blah commande ) : est une Substitution de processus, ça fonctionne comme un pipe, mais ça permet de conserver les variables dans l'environnement courant, alors qu'un pipe crée un sous-processus en dehors duquel les variables qui y sont créées n'existent plus.
    wget -qO- 'url' : -q –> Évite l'affichage des messages du wget / -O spécifie le fichier de sortie et le - après le O signifie de mettre sur la sortie standard pour pouvoir le piper.

    Ensuite des instruction sed pipées...

    's/\x0D$//' : s/ c'est substitution : s/<chercher>/<remplacer>/[g] le g est optionnel (je ne le met pas) et permet de remplacer toutes les occurrences sur la ligne et non pas uniquement la première. Toutes les lignes qui finissent par \r (OxD) avant la fin de ligne (\n, ici représenté par le $ de l'expression régulière) : on supprime le \r, on passse ainsi de \r\n à \n uniquement => conversion au format unix. Avec la version GNU-sed (gsed 3.02.80 et supérieur), on peut utiliser la notation ASCII
    | sed -zn 's/<a class="overflow-tip twitch-link"/\x00/; :

  13. #13
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    le g n'est pas optionnel. Si tu ne le mets pas, seule la première correspondance sera modifiée !

  14. #14
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut
    A priori la première occurence de chaque ligne or le \r ne se retrouve normalement QUE en fin de ligne, donc.. une seule fois par ligne... J'ai raison ou pas ?

  15. #15
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    exact ! j'étais focalisé sur l'option -z du deuxième sed.

    le g du premier sed est tout à fait i nu tile, et pas facultatif.
    tu as eu raison d'insister.

  16. #16
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut
    Je suis pas très à l'aise avec le bash mais j'aime comprendre ce que je fais (et ça va me resservir crois moi). Je suis ingé développement C++ / C# / Python / Java / ROR et je dois en oublier...
    Donc tout ça ne m'est pas familier mais j'apprend vite.
    Je vais continuer à décortiquer tout ça (et ça pourra servir pour les autres) mais là je suis crevé... dodo
    En tout cas, merci pour tout.

  17. #17
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Bonjour

    Lis man wget car wget sait lui-même ne re-télécharger que les fichiers qui ont changé.

  18. #18
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    c'est ce que fait l'option -N* indiquée dans le premier message de Feneck91, et le lien qu'il utilisait dirigeait tout seul vers le dernier fichier disponible.

    son problème portait davantage sur le nom à attribuer (numéro de version) au fichier téléchargé.

    --
    * j'ai constaté l'inefficacité de cette option de nombreuses fois.

  19. #19
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut
    La ligne du premier sed peut donc être replacée par sed 's/\x0D$//'

    Bon, on reprend calmement.

    Le code est donc le suivant :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    read url nomFichier < <(wget -qO- 'https://dev.bukkit.org/projects/worldedit/files' \
        | sed 's/\x0D$//' \
        | sed -zn 's/<a class="overflow-tip twitch-link"/\x00/;
                   s/.*\x00]*/<a class="overflow-tip twitch-link"/;
                   s@\(<a class="overflow-tip twitch-link" href="/projects/worldedit[^>]*[^>]*>\).*@\1@;
                   s@.*href="\([^"]*\).*data-name="\([^"]*\).*@https://dev.bukkit.org/\1/download \2@p')

    Bon, je décortique le bignou pour comprendre...
    read url nomFichier Lit dans l'entrée standard les deux variables url et nomFichier.
    < c'est pour rediriger le wget vers le read.
    <( ..... blah blah blah commande ) : est une Substitution de processus, ça fonctionne comme un pipe, mais ça permet de conserver les variables dans l'environnement courant, alors qu'un pipe crée un sous-processus en dehors duquel les variables qui y sont créées n'existent plus.
    wget -qO- 'url' : -q –> Évite l'affichage des messages du wget / -O spécifie le fichier de sortie et le - après le O signifie de mettre sur la sortie standard pour pouvoir le piper.

    Ensuite des instruction sed pipées...

    's/\x0D$//' : s/ c'est substitution : s/<chercher>/<remplacer>/[g] le g est optionnel (je ne le met pas) et permet de remplacer toutes les occurrences sur la ligne et non pas uniquement la première. Toutes les lignes qui finissent par \r (OxD) avant la fin de ligne (\n, ici représenté par le $ de l'expression régulière) : on supprime le \r, on passe ainsi de \r\n à \n uniquement => conversion au format unix. Avec la version GNU-sed (gsed 3.02.80 et supérieur), on peut utiliser la notation ASCII
    | sed -zn 's/<a class="overflow-tip twitch-link"/\x00/; : -z ignore les retours chariots / n filtrer (ne retenir que ce qui est donné et ignorer tout le reste).

    Je ne comprend pas les 4 dernières lignes. Si on met que | sed -zn 's/<a class="overflow-tip twitch-link"/\x00/; on récupère une chaine vide, si on met | sed -z 's/<a class="overflow-tip twitch-link"/\x00/; alors ça supprimer de la chaine <a class="overflow-tip twitch-link", du coup les expressions suivantes ne doivent pas trouver or elles se base sur ça !!!
    C'est l'option n qui me gène, sinon je dirais le premier remplace <a class="overflow-tip twitch-link" par \0 puis la deuxième recherche tout le début du fichier jusque \0 et remplace par s/.*\x00]*/<a class="overflow-tip twitch-link"/;, en gros on supprime tout ce qu'il y a avant.
    Après....

    Tu pourrais m'expliquer ce que ça fait ? ça serait sympa. Merci.

  20. #20
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    oui, c'est ça : on remplace la première expression (la référence au dernier fichier à jour) par un repère (\x00) qu'on espère unique dans le fichier analysé.
    on supprime tout jusque cette marque "unique", et out ce qu'il y a après la fin des infos qu'on veut garder.
    il ne reste donc à traiter que les informations pertinentes.

    NB : j'ai fait un edit du code de mon message du 12/04/2022, 02h00 : il y avait une expression inutile.

Discussions similaires

  1. Mise-à-jour avec date sous condition
    Par fulgurr dans le forum SAS Base
    Réponses: 4
    Dernier message: 03/05/2016, 10h15
  2. Mise à jour de champ sous condition
    Par aiss57 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/07/2009, 21h57
  3. Mise à jour de champ sous conditions
    Par aiss57 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/06/2009, 15h05
  4. ajout et mise à jour conditionés avec T-SQL
    Par monsurf dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 05/05/2006, 15h59
  5. Mise à jour dans un formulaire avec condition
    Par Bourni dans le forum Access
    Réponses: 4
    Dernier message: 06/03/2006, 22h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo