Installeur / installation automatique

Contenu du snippet

Voici l'exemple d'un installeur automatique minimisant les efforts de M. Lambda n'ayant évidament aucunes des connaissances requises pour installer un script, à plus forte raison quand il est constitué de plusieurs fichiers.

Cette technique d'installation consiste à télecharger un unique fichier script par un trigger (ici !MonKit). Et lorsque le téléchargement se termine on donne la commande pour charger le fichier. Puis ce fichier se charge d'installer correctement nos fichiers (en les récupérant sur un serveur, avec possibilitée de faire plusieurs serveurs pour diminuer les chances que le serveur soit indisponible). Lorsque l'installation se termine, le fichier d'installation s'autodétruit de lui-même.

Note : Dans cet exemple j'utilise un site web mais vous pouvez utiliser la même technique en laissant un socket en lecture chez la personne qui répond au trigger !MonKit.

Ce script utilise les timers, la manipulation de fichiers "par handle", les sockets, les groupes et les fenêtres image. Autant dire que les version de mirc ancienne sont totalement incompatibles (Je l'ai réalisé sous la 6.12).

Voici le fichier serveur (ici http://melnofil.no-ip.com/MonKit/MonKit-Setup.txt) :
### Début du fichier ###
-a MonKit-aliases.mrc
;-=-= test d'installation automatique =-=-

MonKitSuperAlias {
echo -a $1-
}
---
-rs1 MonKit-script.mrc
;-=-= test d'installation automatique =-=-

on *:start:{
MonKitSuperAlias Installation de MonKit terminée !
}
---
EOF
### Fin du fichier ###

Ce fichier va provoquer la création des fichiers scripts "MonKit-aliases.mrc" et "MonKit-script.mrc" qui seront tous deux placés dans un répértoire "MonKit" a la racine de mIRC. Notez que "-a" et "-rs1" sont les paramètres de la fonction "/load". Les lignes "---" sont des séparateurs, qui indiquent les fins de fichiers. Le "EOF" de la fin est obligatoire et doit être suivit d'un retour à la ligne, c'est pour contrôler que le fichier du serveur est correcte et téléchargé en entier (Si vous mettez quelque chose apès ce EOF, le script client ne le lira pas).

La personne qui héberge le script de téléchargement, doit possèder une copie du script d'installation (le code source tout en bas) placée dans $mircdir $+ \MonKit\MonKit-Setup.mrc
NE SURTOUT PAS LE CHARGER DANS MIRC !! Ca effacerait le fichier ^^
Et en plus elle doit avoir doit avoir ces 2 scripts remote :
### Début du fichier ###
on *:text:!MonKit*:?,#MonCanal:/dcc send -c $nick " $+ $mircdir $+ MonKit\MonKit-Setup.mrc"
on *:filesent:MonKit-Setup.mrc:{
.notice $nick Tapez maintenant la commande //.load -rs1 " $ $+ + $ $+ getdir(*.mrc) $ $+ + MonKit-Setup.mrc"
.notice $nick Une fenêtre d'avertissement va s'ouvrir avec la question "Run initialization command ?", répondez oui.
.notice $nick Si par erreur vous avez répondu non, démarrez manuellement le script avec la commande /MonKit-Start
}
### Fin du fichier ###
(N'oubliez pas de changer #MonCanal par le nom de votre canal)

Source / Exemple :


alias -l MonKitSetup-SiteWeb {
 if ($1 == 0) return 1
 elseif ($1 == 1) {
   if ($prop == file) return /MonKit/MonKit-Setup.txt
   else return melnofil.no-ip.com
 }
 else return $null
}
alias -l MonKitSetup-DrawText {; <R> <G> <B> <x> <y> <text>
 drawtext -nr @MonKit-Setup $rgb($1,$2,$3) Fixedsys 9 $4-
}
alias -l MonKitSetup-OpenWindow {
 window -dkpBo @MonKit-Setup -1 -1 400 150
 titlebar @MonKit-Setup - Installation de MonKit...
 setlayer 192 @MonKit-Setup
 clear @MonKit-Setup
 var %w $calc($window(@MonKit-Setup).dw - 10), %h $calc($window(@MonKit-Setup).dh - 10)
 drawrect -nrfd @MonKit-Setup $rgb(235,245,255) 4 4 4 %w %h 25 25
 MonKitSetup-DrawText 0 0 0 20 20 Installation de MonKit en cours...
}
alias -l MonKitSetup-ConnectServer {
 MonKitSetup-OpenWindow
 if ($1 <= $MonKitSetup-SiteWeb(0)) {
   MonKitSetup-DrawText 0 0 255 30 40 * Tentative de contact avec un serveur
   drawdot @MonKit-Setup
   .sockopen MonKitSetup $MonKitSetup-SiteWeb($1) 80
   .timerMonKitSetup-ConnectServer 1 30 MonKitSetup-ConnectServer $calc($1 + 1)
 }
 else {
   MonKitSetup-DrawText 255 0 0 30 40 - Aucun serveur n'est disponible !
   MonKitSetup-DrawText 0 0 255 30 30 * Nouvelle tentative dans 1 minute...
   drawdot @MonKit-Setup
   .timerMonKitSetup-ConnectServer 1 30 MonKitSetup-ConnectServer 1
} }
alias -l MonKitSetup-Timeout {
 .sockclose MonKitSetup
 MonKitSetup-ConnectServer $calc($1 + 1)
}
alias-l MonKitSetup-Erreur {
 MonKitSetup-OpenWindow
 MonKitSetup-DrawText 255 0 0 30 40 * $1-
 MonKitSetup-DrawText 0 0 0 30 60 Fin anormale de l'installation :
 MonKitSetup-DrawText 0 0 0 50 75 MonKit risque de ne pas fonctionner
 MonKitSetup-DrawText 0 0 0 50 90 correctement.
 drawdot @MonKit-Setup
 unset %MonKitSetup*
 .sockclose MonKitSetup
 .fclose MonKitSetup
 .unload -rs " $+ $script $+ "
 halt
}
alias -l MonKitSetup-Fin {
 MonKitSetup-OpenWindow
 MonKitSetup-DrawText 0 0 255 30 40 Installation terminée !
 MonKitSetup-DrawText 0 0 0 30 60 Vous pouvez utiliser MonKit =)
 drawdot @MonKit-Setup
 unset %MonKitSetup*
 .sockclose MonKitSetup
 .unload -rs " $+ $script $+ "
 halt
}
alias -l MonKitSetup-SockRead {
 if (%MonKitSetup == $null) { if ($1- == $null) set %MonKitSetup 1 }
 elseif (%MonKitSetup == 1) {
   if ($1- == EOF) { MonKitSetup-Fin }
   if (/ isin $1-) || (\ isin $1-) || ($chr(124) isin $1-) || ($ isin $1-) || (% isin $1-) $&
     || ($0 != 2) || ($left($1,1) != -) MonKitSetup-Erreur Le serveur est corrompu !
   var %dir $mircdir $+ MonKit\
   if (!$exists(%dir)) .mkdir " $+ %dir $+ "
   .fopen -no MonKitSetup " $+ %dir $+ $2 $+ "
   if ($fopen(MonKitSetup).err != 0) { MonKitSetup-Erreur Un fichier n'a pas pu être crée ! }
   set %MonKitSetup $1
 }
 elseif ($1- == ---) {
   var %file " $+ $fopen(MonKitSetup).fname $+ "
   .fclose MonKitSetup
   .load %MonKitSetup %file
   set %MonKitSetup 1
 }
 else .fwrite MonKitSetup $1- $+ $crlf
}
#MonKitSetup on
alias MonKitSetup-Start {
 .disable #MonKitSetup
 MonKitSetup-ConnectServer 1
}
#MonKitSetup end
on *:start:/MonKitSetup-Start
on *:unload:/.remove " $+ $script $+ "
on *:sockopen:MonKitSetup:{
 unset %MonKitSetup
 var %n $calc($gettok($timer(MonKitSetup-ConnectServer).com,2,32) - 1)
 .timerMonKitSetup-ConnectServer off
 .sockwrite -n MonKitSetup GET $MonKitSetup-SiteWeb(%n).file HTTP/1.1
 .sockwrite -n MonKitSetup Host: $MonKitSetup-SiteWeb(%n)
 .sockwrite -n MonKitSetup $null
 .timerMonKitSetup-Timeout 1 30 MonKitSetup-Timeout %n
 MonKitSetup-OpenWindow
 MonKitSetup-DrawText 0 0 0 30 40 Connection établie avec le serveur
 MonKitSetup-DrawText 0 0 255 30 30 Téléchargement en cours...
 drawdot @MonKit-Setup
}
on *:sockread:MonKitSetup:{
 if ($sockerr != 0) { e Erreur ! | return }
 var %cmd $timer(MonKitSetup-Timeout).com
 .timerMonKitSetup-Timeout off
 sockread %MonKitSetup-temp
 while ($sockbr != 0) { MonKitSetup-SockRead %MonKitSetup-temp | sockread %MonKitSetup-temp }
 .timerMonKitSetup-Timeout 1 30 %cmd
}

Conclusion :


J'ai mis le lancement de l'installation dans un groupe "#DCCnetSetup" afin d'être certain qu'il n'est lancé qu'une fois. Faites attention si vous testez ce fichier, il a des tentances suicidaires à s'effacer sans prévenir et de manière définitive sans passer par la corbeille.

Pour ajouter un serveur, modifiez l'alias "MonKitSetup-SiteWeb" qui retourne le nombre de serveur, l'addresse du serveur ou le nom du fichier sur le serveur.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.