Informations système

Mise en situation

On désire faire un application C++ en mode console qui permet d’afficher des informations sur le système Linux sur lequel s’exécute le programme.

Il existe déjà une commande — nommée uname — qui fait cela :

pi@rpi-defrance:~ $ uname -a
Linux rpi-defrance 5.10.17-v7+ #1414 SMP Fri Apr 30 13:18:35 BST 2021 armv7l GNU/Linux

Cependant, on désire obtenir un affichage différent, semblable à celui-ci:

pi@rpi-defrance:~ $ ./myuname
Nom hôte  : rpi-defrance
OS        : Linux  5.10.17-v7+
Type CPU  : armv7l

Bye !

Le diagramme de classes envisagé pour cette application est le suivant :

hostinfo uml model

✎ Travail n° 1 Analyse du modèle

  1. Analyser le diagramme UML :

    • Identifier les différents types de relation entre les classes du diagramme (→ relations de dépendance, de composition, d'inclusion/ancrage/emboîtement)

      1. Une relation de dépendance entre 2 classes est moins “forte” qu’une association. Une dépendance implique généralement (mais pas toujours) qu’un objet accepte un autre objet comme paramètre de méthode, instancie ou utilise un autre objet dans une méthode.

      2. La relation d’inclusion/ancrage/emboîtement (→ inner/anchor/nesting relation ou namespace owned element association) entre classes est obsolète dans les versions récentes des spécifications UML (≥ v2.0 ).

      Cependant, elle est encore valide dans les diagrammes de package.

    • Identifier le rôle UML (→ _term) présent sur la relation de composition.

      Celui-ci se traduira dans le code C++ comme un attribut de type AnsiTerm dans la classe App

🖮 Travail n° 2 Création du répertoire projet

  1. Créer le répertoire projet et y copier la classe AnsiTerm codée dans les activités précédentes (→ ansiterm.h et ansiterm.cpp)

🖮 Travail n° 3 Codage/Test de la classe Hostinfo

  1. Déclarer la classe HosInfo dans un fichier hostinfo.h

    Consignes/Indices :

    • la structure standard C utsname est déclarée dans l’entête <sys/utsname.h>

  2. Coder le constructeur de la classe HostInfo dans le fichier hostinfo.cpp

    Consignes/Indices :

    • Le constructeur devra appeler la fonction C standard int uname(struct utsname *buf); (→ voir page de manuel : man 2 uname) pour renseigner la structure _info

    • la variable pointée par l’argument du constructeur (→ ok de type bool *) indiquera le status d’exécution de la fonction uname() (→ true si OK, false si NOK)

  3. Coder l’ensemble des méthodes de la classe HostInfo.

    Consignes/Indices :

    • getCPUArch() doit retourner une chaîne C++ (→ string) contenant l’architecture du CPU présent sur la machine. Cette information est présente — sous forme de chaîne C (→ char * ou char []) — dans le membre machine de la structure _info (après appel du constructeur de la classe Hostname).

    • Pour convertir une chaîne C (→ char * ou char []) en chaîne C++ (→ string), il suffit de faire appel au constructeur de la classe string en lui passant la chaîne C en argument.

      #include <string>
      using namespace std;
      
      char helloC[] = "Bonjour";
      string helloCpp = string(helloC);
    • getHostname() doit retourner une chaîne C++ contenant le nom de l’hôte. Cette information est présente — sous forme de chaîne C — dans le membre nodename de la structure _info.

    • getOSType() doit retourner une chaine C++ contenant le type de l’OS suivi de sa version. Ces informations sont présentes sous forme de chaîne C dans les membres sysname et release de la structure _info. Il faudra donc concaténer les 2 informations dans la chaîne C++ retournée.

  4. Tester la classe HostInfo

    Consignes/Indices :

    • créer un un fichier test.cpp qui instancie statiquement la classe HostInfo dans un objet que vous nommerez host.

    • tester le résultat de l’instanciation (→ valeur de la variable booléenne passée en argument au contructeur) puis…​

      • …​ en cas de réussite (→ variable à true), appeler successivement les 3 méthodes de la classe HostInfo et afficher les chaînes C++ retournées avec cout (→ déclaré dans l’entête standard <ìostream>)

      • …​ en cas d’échec (→ variable à false), afficher une message d’erreur "Echec instanciation de ’HostInfo'" avec cout

    • compiler et exécuter le programme

      Résultat attendu :
      pi@rpi-defrance:~/Documents/hostinfo $ ./test
      CPU   : armv7l
      Hôte  : rpi-defrance
      OS    : Linux 5.10.17-v7+
    • Faire constater le résultat au professeur

🖮 Travail n° 4 Codage/Test de la classe App

  1. Déclarer la classe App (→ app.h) conformément au modèle UML.

    Consignes/Indices :

    • Penser à déclarer l’attribut _term

  2. Coder la méthode exec() de manière à utiliser les méthodes de la classe Ansiterm pour réaliser l’affichage

    Consignes/Indices :

    • Le constructeur se contente d’effacer l’écran (→ clearScreen())

    • La méthode exec() doit instancier dynamiquement la classe HostInfo

    • La méthode exec() doit afficher un message d’erreur en rouge si l’instanciation échoue

    • Les informations retournées par les méthodes de la classe HostInfo seront affichées avec la couleur Cyan.

  3. Tester la classe App depuis un fichier main.cpp

    Consignes/Indices :

    • La classe App doit être instanciée dynamiquement

    • le nom de l’exécutable sera myuname

    • L’exécution du programme doit mener à l’affichage suivant :

      hostinfo
    • Faire constater le résultat au professeur

🖮 Travail n° 5 Évolution

  1. Proposer une évolution du modèle UML pour permettre à l’utilisateur de passer en argument au constructeur de la classe App une option permettant d’afficher les informations d’une façon différente.

    Par exemple, lancer ./myuname avec l’option csv devrait mener à l’affichage suivant (→ csv pour comma separated values est un format reconnu par Excel) :

    pi@rpi-defrance:~ $ ./myuname csv
    Nom hôte,OS,Type CPU
    rpi-defrance,Linux 5.10.17-v7+,armv7l
  2. Procéder au codage de cette évolution

🞄  🞄  🞄