FAQ - Domande più frequenti
- Che cos'è CCFE?
- CCFE è un clone dello SMIT di AIX?
- È possibile installare CCFE su un host in cui non sono presenti l'interprete Perl ed il relativo modulo Curses?
- Come si fa a convertire CCFE in un binario eseguibile?
- "Curses function 'new_item' is not defined in your Curses library at /usr/bin/ccfe line NNNN."
- Nella configurazione standard di GNOME Terminal, il tasto F10 richiama il menu "File": come fare ad usarlo una volta configuratolo in CCFE?
- Come permettere agli utenti di crearsi form e menu privati accessibili dal menu globale?
- Come fare ad elencare in un ordine preferito le voci di un menu?
- Come si fa a riassegnare le funzioni dei tasti da F1 a F12?
- Come si fa ad usare CCFE come semplice application launcher?
- Quale è il metodo più rapido per applicare l'interfaccia CCFE ad un comando?
- Trucchi e suggerimenti per l'inizializzazione delle form:
- Trucchi e suggerimenti per le azioni delle form:
- 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.plIl 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.menuda 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.itemvengono elencate nel menu col seguente ordine:
five.item four.item one.item six.item three.item two.itemPer 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 }