FAQ - Domande più frequenti

  1. Che cos'è CCFE?
  2. CCFE è un clone dello SMIT di AIX?
  3. È possibile installare CCFE su un host in cui non sono presenti l'interprete Perl ed il relativo modulo Curses?
  4. Come si fa a convertire CCFE in un binario eseguibile?
  5. "Curses function 'new_item' is not defined in your Curses library at /usr/bin/ccfe line NNNN."
  6. Nella configurazione standard di GNOME Terminal, il tasto F10 richiama il menu "File": come fare ad usarlo una volta configuratolo in CCFE?
  7. Come permettere agli utenti di crearsi form e menu privati accessibili dal menu globale?
  8. Come fare ad elencare in un ordine preferito le voci di un menu?
  9. Come si fa a riassegnare le funzioni dei tasti da F1 a F12?
  10. Come si fa ad usare CCFE come semplice application launcher?
  11. Quale è il metodo più rapido per applicare l'interfaccia CCFE ad un comando?
  12. Trucchi e suggerimenti per l'inizializzazione delle form:
  13. Trucchi e suggerimenti per le azioni delle form:
  14. Trucchi e suggerimenti i campi delle form:

D: Che cos'è CCFE?
R: Il "Curses Command Front-end" è uno strumento proposto come aiuto all'utente per velocizzare e ridurre gli errori nella compilazione di argomenti ed opzioni da specificare nell'invocazione dei comandi Unix, ma è talmente semplice e flessibile che può essere utilizzato anche per altri scopi.


D: CCFE è un clone dello SMIT di AIX?
R: No.
SMIT è un'applicazione specifica per la gestione del Sistema Operativo IBM AIX, ed è basata sull'Object Data Manager, caratteristica peculiare di tale S.O.
CCFE invece è uno strumento molto semplice (un singolo script Perl), è potenzialmente installabile su qualsiasi sistema Unix-like, e può essere utilizzato in molti modi, ma, nel suo utilizzo base, non è altro che una interfaccia stupida.
Con i plugin è possibile aggiungere "intelligenza" a CCFE, in quanto le maschere video (form) possono contenere shell script per modificarne il comportamento base, e quindi dargli anche aspetto e funzionalità simili a quelle dello SMIT.


D: È possibile installare CCFE su un host in cui non sono presenti l'interprete Perl ed il relativo modulo Curses?
R: Sì, convertendo CCFE in binario eseguibile, come spiegato nella prossima risposta, e sostituendo lo script Perl /usr/bin/ccfe con tale eseguibile.


D: Come si fa a convertire CCFE in un binario eseguibile?
R: È possibile utilizzare il PAR Packager disponibile nel CPAN, che non fa una vera e propria compilazione, ma permette di ottenere un eseguibile standalone da programmi Perl:
Dopo aver installato CCFE ed il pacchetto PAR-Packer dal CPAN o dal repository dei pacchetti della propria distribuzione di S.O. (ad esempio, il pacchetto Ubuntu è libpar-packer-perl) si procede come segue:

     cp /usr/bin/ccfe /tmp/ccfe.pl
     pp -o /tmp/ccfe /tmp/ccfe.pl
    
Il file binario ottenuto /tmp/ccfe può essere eseguito su macchine Linux senza la presenza dell'interprete Perl e del relativo modulo Curses.


D: Perche' eseguendo il comando "ccfe" viene restituito il seguente errore:

   Curses function 'new_item' is not defined in your Curses library at /usr/bin/ccfe line NNNN.
   
R: Se il modulo Perl Curses è stato installato da pacchetto, probabilmente questo è stato compilato senza il supporto per menu e form. In particolare, per le distribuzioni RedHat, Fedora e CentOS si consiglia l'installazione del pacchetto RPM perl-Curses presente nel repository EPEL. Se invece si compila il modulo da CPAN, è necessario farne il build attivando il supporto per pad, menu e form come indicato nel file INSTALL presente nel tarball del modulo stesso.


D: Nella configurazione standard di GNOME Terminal, il tasto F10 richiama il menu "File": come fare ad usarlo una volta configuratolo in CCFE?
R: In GNOME Terminal, disabilitare l'impostazione del tasto scorciatoia per i menu (F10) nel pannello richiamabile dal menu "Modifica" / "Scorciatoie da tastiera"


D: Come permettere agli utenti di crearsi form e menu privati accessibili dal menu globale?
R: Si può procedere, ad esempio, creando il file /usr/lib/ccfe/smit/ccfe.menu/private.item per aggiungere la voce "User private menu" al menu principale di CCFE, che è anche quello globale ed accessibile da tutti gli utenti del sistema:

    item {
      id     = PRIVATE
      descr  = User private menu
      action = menu:private
    }
    
A questo punto ogni utente può creare nella propria home directory il proprio menu privato, ad esempio:
    /home/john/.ccfe/ccfe/private.menu
    /home/bill/.ccfe/ccfe/private.menu
    
da cui può invocare altri menu o form private. Gli altri utenti del sistema che invocheranno CCFE e dal menu principale selezioneranno la voce "User private menu" otterranno invece il seguente messaggio pop-up di errore:
   File not found while loading menu "private"


D: Come fare ad elencare in un ordine preferito le voci di un menu?
R: Per default, le opzioni dei menu dinamici sono ordinate in base al nome del file dell'item (*.item), così, per esempio, le voci

    one.item
    two.item
    three.item
    four.item
    five.item
    six.item
    
vengono elencate nel menu col seguente ordine:
    five.item
    four.item
    one.item
    six.item
    three.item
    two.item
    
Per stabilire un ordine arbitrario è sufficiente rinominare i nomi dei file delle voci del menu, come ad esempio nel seguente modo:
    10-one.item
    20-two.item
    30-three.item
    40-four.item
    50-five.item
    60-six.item
    


D: Come si fa a riassegnare le funzioni dei tasti da F1 a F12?
A: Esempio: assegnare al tasto F12 la funzione di uscita da CCFE:

  • nel file /etc/ccfe/ccfe.conf (or $HOME/.ccfe/ccfe.conf) assegnare la funzione al tasto:
           key_f12 = exit
         
  • e nel file /usr/share/ccfe/msg/C/ccfe definirne l'etichetta "Quit" a video:
           KEY_F12_LABEL = "Quit"
         


D: Come si fa ad usare CCFE come semplice application launcher?
R: Invocando l'applicazione utilizzando l'azione exec nei menu o nelle form. In questo modo si evita l'inutile fork di un nuovo processo ed il ritorno al S.O. al termine dell'applicazione invocata.


D: Quale è il metodo più rapido per applicare l'interfaccia CCFE ad un comando?
R: Utilizzando il metacarattere "*" nella form action: ad esempio, nella form fping.form per richiamare il comando fping(8), l'azione è semplicemente "fping %{*}".


D: Come visualizzare un messaggio pop-up al caricamento di una form?
R: Ogni stringa scritta nello standard error dai comandi nel blocco di inizializzazione della form (init{}) viene mostrato in una finestra pop-up al caricamento della form. Ad esempio:

  init { command:
    echo "Welcome $(whoami)!" > /dev/stderr
  }
  
Questo sistema è stato previsto per dare messaggi di errore/avviso in base al risultato di eventuali controlli fatti in fase di inizializzazione della form.


D: Come condizionare il caricamento di una form?
R: Il processo di caricamento di una form continua se il blocco di inizializzazione (init{}) restituisce un exit status maggiore di zero, altrimenti abortisce. Ad esempio:

  init { command:
    [ "$(whoami)" != root ] && exit 1
    exit 0
  }
  
Riprendendo quanto detto nella precedente risposta, è possibile visualizzare un messaggio pop-up prima di abortire il caricamento di una form utilizzando una tecnica come la seguente:
  init { command:
    [ "$(whoami)" != root ] && echo 'Only root can do this!' > /dev/stderr && exit 1
    exit 0
  }
  


D: Come inserire un apice singolo (') all'interno di una stringa racchiusa tra apici singoli?
R: È necessario usare la sintassi '\''; ad esempio, il costrutto:

  action { run:
    echo 'Error resizing logical volume '%{LV_NAME}'.' > /dev/stderr
  }
  
è sbagliato! La forma corretta è la seguente:
  action { run:
    echo 'Error resizing logical volume '\''%{LV_NAME}'\''.' > /dev/stderr
  }
  


Nella form voglio utilizzare un campo booleano che inserisca nell'action la stringa "YES" (oppure "NO"), ma utilizzando un campo di tipo BOOLEAN non riesco: perchè?
R: L'errore più frequente è la definizione del campo come segue:

  ### WRONG!!!
  field {
    id       = SHOW_CHANGED_FIELDS
    label    = Changed fields uses different video attribute?
    type     = BOOLEAN
    default  = const:YES
  } 
  
che ritorna un valore nullo perchè non è stato definito alcun attributo option nel campo; la definizione corretta ` la seguente:
  ### Correct!
  field {
    id       = SHOW_CHANGED_FIELDS
    label    = Changed fields uses different video attribute?
    type     = BOOLEAN
    option   = YES,NO
    default  = const:YES
  } 
  
Oppure, in alternativa, può essere utilizzato un campo di tipo STRING:
  ### Correct!
  field {
    id       = SHOW_CHANGED_FIELDS
    label    = Changed fields uses different video attribute?
    type     = STRING
    len      = 3
    list_cmd = const:single-val:"YES","NO"
    default  = const:YES
  } 
  
IBM and AIX are trademarks of International Business Machines Corporation in the United States, other countries, or both.