Archives pour l'auteur «Teto»

Page 2 sur 10

Comment mettre à jour son IOS depuis la ligne de commande ?

Me voici de retour pour une astuce rapide qui vous évitera comment upgrader l’OS sur les switchs/routeurs Cisco via la CLI. J’utilise dès que je peux le Cisco Network Assistant(aka CNA, petit logiciel gratuit utile pour configurer les paramètres de base,  regarder la topologie depuis une GUI, supprimer des fichiers sur la flash etc…) qui vous permet d’upgrader l’IOS via un glisser/déposer. Malheureusement l’outil peut rencontrer des problèmes. Exemple:

command /overwrite /http not available <– message approximatif

Du coup il reste la bonne vieille méthode, on lance un serveur Tftp (celui de windows ou le très bon tftpd32) qu’on configure sur la bonne interface. On met le package de mise à jour (*.tar ou *.bin) dans le dossier partagé du serveur tftp.

On se connecte sur le switch (via telnet/ssh/console par exemple) et ensuite, au lieu de télécharger la nouvelle image, via tftp (copy tftp: flash: ) puis changer la valeur de BOOT (en mode config, boot system <chemin_vers_bin>), on va utiliser la commande archive qui va lancer des vérifications supplémentaires et éviter de se retrouver avec un switch sans ios (ha les joies de Xmodem !):

archive download-sw /allow-feature-upgrade /reload tftp://10.4.1.16/c3560-ipbasek9-tar.150-1.SE1.tar

Le /allow-feature-upgrade permet d’outrepasser le message suivant qui survient si l’on passe d’une image IP-BASED à IP-ADVANCED par exemple:

Error: The image in the archive which would be used to upgrade
Error: system number 1 does not support the same feature set.

/reload permet de redémarrer automatiquement l’équipement si le nouvel ios a bien été installé.

Si jamais la flash est trop petite…

Error: There is insufficient space in flash: to install the required
Error: image.  Clean up some old images, and try again.

On peut ajouter le paramètre /imageonly pour extraire du tar le .bin uniquement (ou bien faire du ménage sur la flash avec delete). On peut également utiliser /overwrite pour supprimer l’ancienne image, l’option /safe permet de s’assurer que le switch redémarre correctement avec le nouvel ios avant de supprimer l’ancienne version.

A noter que l’on peut détarer un .tar directement depuis le switch avec la commande:

archive tar /xtract <source> <destination>

Comment créer/appliquer un patch svn sous windows ?

Des fois, malheureusement, on n’a pas le choix et il nous faut travailler avec svn au lieu d’utiliser un système de gestion de source moderne tels que Git ou Mercurial. Des fois même, il faut travailler et en plus sous windows ! On a les malheurs qu’on mérite. La plus grosse erreur que vous pourriez faire à mon sens est d’installer TortoiseSVN. Ca pourrit le menu contextuel, les icônes ne sont parfois pas mises à jour, on ne sait pas trop quel bouton exécute quelle commande, bref du grand n’importe quoi. Le mieux est donc d’installer le client svn windows classique depuis le site officiel, quitte à ajouter le dossier des binaires svn à votre path

Je vais prendre l’exemple d’Irrlicht car c’est pour contribuer à ce projet que j’ai du m’intéresser a problème.
Depuis la ligne de commande:

 mkdir irrlicht_svn
 svn checkout https://irrlicht.svn.sourceforge.net/svnroot/irrlicht/trunk .

(Attention au point, sinon svn crée un sous-dossier « trunk »)

Après on modifie les sources etc… Si on a créé de nouveaux fichiers alors on les ajoute via « svn add » (on peut utiliser des wildcards, l’option -R pour la récursivité). On vérifie que tout est à jour avec un « svn status » puis on crée notre patch via la commande:

svn diff > monPatchDuTonnerreDeZeus.patch 

(peu importe l’extension, il s’agit d’un fichier texte)

 

Jusque là rien de nouveau, c’est la procédure classique. Pour patcher sous windows, c’est déjà un peu plus sport car le programme « patch » de linux n’est pas présent par défaut. Il faut donc d’abord installer le programme patch.exe, l’ajouter à votre variable PATH (WIN+Pause -> Advanced Settings -> Environment Variables). Pour tester votre patch, placez-vous dans le même répertoire (au même niveau dans l’arborescence) et faîtes:

 patch --dry-run -p0 < monPatchDuTonnerreDeZeus.patch

L’option –dry-run permet de ne pas appliquer les modifications du patch mais permet d’afficher les messages (erreurs comprises) que vous auriez eu si vous aviez réellement appliqué le patch. S’il n’y a pas d’erreur alors vous pouvez appliquer le patch pour de bon avec patch -p0 < monPatchDuTonnerreDeZeus.patch . Si jamais néanmoins vous avez des erreurs vous pouveez revenir en arrière en faisant un svn revert -R * .  L’option « -pX » permet d’appliquer le patch depuis un répertoire différent de celui où il a été fait (remplacer « X » par le nombre de repértoires à enlever du chemin relatif). En l’état vous risquez fort d’avoir des problèmes et patch.exe va planter car les sauts de ligne ne sont pas ceux qu’il attend. svn diff crée des sauts de ligne Unix tandis que patch.exe attends des sauts de ligne windows (CR+LF). Vous devez donc effectuer la transformation vous-même. Par exemple avec Notepad++, on ouvre le patch puis dans les menus « Edition »-> »Convertir les sauts de ligne », on choist les fins de ligne windows, on sauvegarde et c’est tout bon. Autrement on peut aussi utiliser l’option –binary

Quelques liens en vrac:

  • http://www.journaldunet.com/developpeur/tutoriel/out/060906-subversion-svn-diff-patch.shtml
  • http://wiki.habariproject.org/en/Creating_and_Applying_Patches_for_Subversion
  • http://gnuwin32.sourceforge.net/packages/patch.htm (version windows de patch si vous ne voulez pas utiliser cygwin)

Comment se préparer au CCNA ?

Ayant récemment passé mon CCNA (Cisco Certified Network Associate), aussi connu sous la dénomination 640-802, et parce qu’il est difficile de réussir sans savoir comment l’épreuve se déroule ou bien quelle type de question est posée. Je présente ici ma propre expérience qui devrait être représentative de l’examen, ceci dit ce dernier évolue vite donc n’hésitez pas à vous mettre à la page
Depuis peu, il est possible de séparer le CCNA en 2 tests, ce qui permet de rater le 2nd et d’obtenir une certification CCENT.

1/ L’épreuve elle-même

Pour passer le CCNA, il faut se rendre dans un centre agréé. Je suis passé par le site www.pearsonvue.com qui est bien fait. A priori compter moins d’une semaine entre votre inscription et votre passage, vous pouvez donc vous y prendre au dernier moment. Passer le test m’est revenu à 210€.

Le test consiste en une série de 53 questions et dure 2h10 (si vous le passez en anglais, sinon un peu moins). Un tutoriel de 13 minutes vous permet d’expliquer l’interface (sobre) et le fonctionnement du questionnaire. Ces questions peuvent être:

  • à choix multiple
  • à choix unique
  • ou bien des sortes de minilab.

2/ Comment s’y préparer ?

Je n’évoquerai pas le temps nécessaire ici: cela dépend de votre niveau, de votre rythme etc…
Pour réviser (ou apprendre :) ), le Sybex de Todd lammle est pour moi la référence sur bien des points, très clair, avec les tests avant/après pour bien prendre conscience de son niveau. Les livres de Wendell Odom complètent bien le Sybex: Tome 1: 40$ et Tome 2 à 60$ (plus petit que le premier mais plus pointu). Attention à bien obtenir des versions à jour ! Le test évolue rapidement. De même méfiez-vous quand vous cherchez des réponses sur internet. Allez de préférence sur les sites cisco.
On peut également passer des tests gratuitement (enfin je crois) sur le site learningcisco.com mais il faut bien chercher.
Pouvoir manipuler un switch réel, le rebooter, se brancher à la console, changer l’image, se rendre compte qu’il n’y a pas de bouton mais qu’il faut le débrancher tout simplement (contrairement aux routeurs – en général) est sympathique. Mais à moins de posséder un matériel de ouf chez soi (2 routeurs, 3 switchs + pas mal de câbles), vouz aurez du mal à vraiment tester les features. C’est là que des programmes comme PacketTracer ou GNS3  (ce dernier nécessite que vous possédiez des images iOS) interviennent. Ils permettent de simuler des réseaux d’ampleur de façon fiable (oui c’est surprenant mais cela marche). Je vous conseille donc de ne pas hésiter à manipuler ces programmes gratuits. Et certaines personnes ont réalisé des exercices packet tracer très proches de ceux du CCNA que vous pourrez télécharger ici. Ces exercices sont un passage obligés si vous voulez être prêts.

Mise à jour du Bilboplanet

Bonjour,

Certains d’entre vous ont peut-être constaté que leur flux du planet gcn avait été « rechargé » (sous Opera ou newsbeuter par exemple, je vous invite à me dire en commentaire si vous avez eu le même problème avec un autre lecteur RSS). Ceci est dû à la mise à jour du bilboplanet qui supporte maintenant les tags ! Je rappelle que le bilboplanet est un logiciel jeune et que notre planet est toujours en phase de test donc le phénomène risque de se reproduire (pas tout de suite cependant).

Merci de votre compréhension

Comment éviter des erreurs « bêtes » en manipulant la pile lua

Lua est globalement très facile à utiliser. Ceci dit la manipulation de la pile (stack) n’est pas forcément évidente sur de longues manipulations. En effet selon la fonction employée, la fonction va dépiler (pop) un certain nombre d’éléments, voire en pusher un certain nombre. Dès lors comment s’assurer que la pile est équilibrée (balanced), c’est-à-dire que la taille de la pile avant et après appel de la fonction est identique ?

Imaginons par exemple cette fonction (tirée & modifiée  de luabind) :

 int create_cpp_class_metatable(lua_State* L)
 {
//Empile un tableau
lua_newtable(L);

// Empile une chaîne de caractère
 lua_pushstring(L, "__luabind_classrep");
// Empile un booléen
 lua_pushboolean(L, 1);
/* Jusque là c'était simple, maintenant il faut être capable de retenir que cette fonction assigne au tableau à la position en paramètre (soit ici "-3", c'est-à-dire 3 emplacements en dessous du haut de la pile => le tableau créé par lua_newtable(L)), la valeur à l'index -1 pour l'indice à l'index -2. Cet appel équivaut donc à monNouveauTableau["__luabind_classrep"] = 1.
lua_rawset dépile les 2 paramètres du haut de la pile ("__luabind_classrep" et "1") mais ne touche pas au tableau...
*/
 lua_rawset(L, -3);

// du coup ici on quitte la fonction en laissant le tableau sur le haut de la pile. PAS BIEN !!
}

Pour faciliter le débogage de ce type d’erreur, certaines bibliothèques dont luabind propose une classe avec le prototype suivant:

// Copyright (c) 2003 Daniel Wallin and Arvid Norberg

// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
// ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
// OR OTHER DEALINGS IN THE SOFTWARE.

#ifndef LUABIND_DEBUG_HPP_INCLUDED
#define LUABIND_DEBUG_HPP_INCLUDED

#ifndef NDEBUG

#include <luabind/lua_include.hpp>
#include <cassert>

namespace luabind { namespace detail
{

    /** \struct  stack_checker_type
     *  Registers stack size on creation. Destructor checks size is the same than that registered during creation (otherwise asserts).
     */

	class stack_checker_type
	{
	    public:
            stack_checker_type(lua_State* L,const int& diff)
                : m_L(L)
                , m_stack(lua_gettop(m_L) + diff)
            {}

            ~stack_checker_type()
            {
                assert(m_stack == lua_gettop(m_L));
            }
        private:
            lua_State* m_L;
            int m_stack;
	};

}}

    /** \def LUABIND_CHECK_STACK
     *   This macro checks if stack is balanced between its construction and destruction (within its C++ scope).
     * Available only with NDEBUG
     * \param A lua_State
     * creates an object registering current size of stack. When getting out of scope, destruct
     */
    #define LUABIND_CHECK_STACK(L) luabind::detail::stack_checker_type stack_checker_object(L,0)


    /** \def LUABIND_CHECK_STACK_DIFF check that the difference in size between construction and destruction of the structure is equal to diff
    * \param diff Differnece of stack size (either positive or negative)
    **/
    #define LUABIND_CHECK_STACK_DIFF(L,diff) luabind::detail::stack_checker_type stack_checker_object(L, (diff) )
#else
    #define LUABIND_CHECK_STACK(L) do {} while (0)
    #define LUABIND_CHECK_STACK_DIFF(L,diff) do {} while (0)
#endif

#endif // LUABIND_DEBUG_HPP_INCLUDED

Cette classe enregistre la taille de la pile lors de la construction d’une de cette instance. Quand l’instance sort de sa portée (scope), typiquement en fin de fonction, le destructeur est appelé. Le destructeur vérifie alors que la taille est identique à celle enregistrée lors de son instanciation. Si la taille de la pile après diffère de celle à l’instanciation alors un assert est lancé. Si l’on reprend notre exemple précédent, le code devient alors.


        int create_cpp_class_metatable(lua_State* L)
        {

            LUABIND_CHECK_STACK(L);//!< Crée une instance de la classe définie dans le fichier précédent

            lua_newtable(L);

            // mark the table with our (hopefully) unique tag
            // that says that the user data that has this
            // metatable is a class_rep
            lua_pushstring(L, "__luabind_classrep");
            lua_pushboolean(L, 1);
            lua_rawset(L, -3);

        }/* On sort du scope, le destructeur est appelé et détecte que la taille diffère (le tableau est restée sur la pile. La pile n'est pas "balanced", un assert va être lancé */

La version précédente de create_cpp_class_metatable va donc lancer un assert. Voici la version corrigée:


        int create_cpp_class_metatable(lua_State* L)
        {

            LUABIND_CHECK_STACK(L);//!< Crée une instance de la classe définie dans le fichier précédent

            lua_newtable(L);

            lua_pushstring(L, "__luabind_classrep");
            lua_pushboolean(L, 1);
            lua_rawset(L, -3);

            return luaL_ref(L, LUA_REGISTRYINDEX);//!< Dépile ce qu'il y a sur le dessus de la pile. Ici il s'agit du tableau
/* On sort du scope, le destructeur est appelé et détecte que la taille diffère (le tableau est restée sur la pile. La pile n'est pas "balanced", un assert va être lancé */
        }

On peut perfectionner la classe stack_checker_type en ajoutant une fonction membre check() pour vérifier la taille avant l’appel du destructeur, ou bien même passer un delta pour vérifier que la pile à la fin est égale à la taille de la pile lors de l’instanciation + delta (fonctionnalité que j’ai implémentée dans ma version de luabind). Par ailleurs on remarque que ce système de vérification peut-être désactivée selon si NDEBUG est défini ou pas. Les performances de votre application finale ne seront donc pas perturbées par cette astuce !