ModularCLI – Interfacce CLI modulare e veloce

Spesso mi capita di dover fare piccoli applicativi console per gestire alcuni aspetti di altri software. Stanco di reinventare la ruota ho realizzato una sorta di CLI universale in grado di wrappare progetti class library.

L’idea è quella di avere una sorta di sandbox che gestisca i menu lasciando allo sviluppatore l’onere di scrivere soltanto le classi e le funzioni senza dover gestire l’output a video, l’input ecc…

Funzionamento

Il programma è un applicativo console che grazie a Castle Windsor crea un container contenente tutte le classi che implementano l’interfaccia ICli discoverate all’interno delle cartelle canfigurate nell’app.config.

L’interfaccia ICli è definita nel progetto CLI.Shared che è l’unica reference necessaria per realizzare un modulo integrabile con ModularCLI.

Una volta che il container è stato popolato con tutti gli oggetti necessari il programma crea una struttura di oggetti MenuPage e MenuItem con tutte le voci a menu possibili.

Successivamente la funzione MakeConsoleMenu mostra a video e gestisce la navigazione dell’intero programma.

Creare un modulo

ModulaCLI sfrutta Castle Windsor per disaccoppiare la gestione dei menu dalla realizzazione delle funzionalità e per rendere l’interfaccia CLI modulare.
La struttura dei menu a video segue questo schema:

  1. elenco degli assembly
  2. elenco delle classi
  3. elenco dei metodi

Per fare il discovery degli assembly e delle classi ModularCLI controlla le classi che implementano l’interfaccia ICli mentre per i metodi controlla che abbiano definito l’attributo MethodAttribute.

Ecco un esempio di modulo base:

    [Class(Name = "Configurazione Active Directory",
           Author = "Simone Ciamberlini",
           ReleaseDate = "08-03-2016",
           Description = "Modulo per la configurazione dei parametri di active directory",
           Version = "1.0.0.0")]
    public class Class1 : ICli
    {
        private readonly ICliLogger _logger;
        public Class1(ICliLogger logger)
        {
            _logger = logger;
        }

        [Method("Imposta parametri di Active Directory", "configuread")]
        public void ConfigureActiveDirectory(
              [Param("Inserire il nome di dominio DNS", "-d")]               string dnsDomainName,
              [Param("Inserire la porta LDAP", "-p")]                        int ldapPort,
              [Param("Inserire un username valido per il bind ad AD", "-u")] string bindUsername,
              [Param("Inserire la password valida per il bind ad AD", "-s")] string bindPassword)
        {
            _logger.WarnFormat("You entered bind for {0} on port {1} with user {2} and password {3}", dnsDomainName, ldapPort, bindUsername, bindPassword);
        }
    }

Utilizzando gli attributi ClassAttribute, MethodAttribute e ParamAttribute è possibile customizzare le voci del menu dell’interfaccia console.
Aggiungendo i settings (app.config) al nostro modulo essi verranno utilizzati attraverso il comando Properties.Settings.Default.NomeSetting.
Il costruttore riceve un oggetto di tipo ICliLogger che Castle Windsor inietta a runtime come una classe che proxa il log4net per creare output a video.

Paramentri a command line

Il file CLI.exe è anche richiamabile a riga comando specificando gli opportuni switch come segue:
CLI.exe -module:Module1.Class1 -method:configuread -d:ciamberlini.it -p:389 -u:utente -s:password

Download

Ecco l’url su github al progetto:
https://github.com/ciamberlini/ModularCLI.git

Rispondi