Sviluppo di un sistema multipiattaforma per l`installazione e

Università degli Studi di Napoli Federico II
Facoltà di Scienze MM.FF.NN.
Corso di Laurea in Informatica
Tesi Sperimentale di Laurea Triennale
Sviluppo di un sistema multipiattaforma per l'installazione e
condivisione di codice del portale di monitoraggio
Relatori
Candidato
Prof. Guido Russo
Dr. Ing Catello Di Martino
Anno accademico 2009/2010
Vincenzo Masullo
Matricola:566/2795
Desidero ringraziare...
Il Prof. Guido Russo e l'Ing. Catello Di Martino per l'opportunità che mi hanno concesso di
svolgere il tirocinio nel Centro SCoPE e per il costante supporto umano e professionale
fornitomi
I miei genitori, mio fratello, mia sorella e le mie stupende nipotine per avermi supportato e
sopportato anche nei momenti più difficili...
Giuseppe ( il mio migliore amico e perchè no, fratello maggiore )
Tutti i colleghi e amici del corso di laurea, i ragazzi e le ragazze del Centro SCoPE, in
particolare Marco con il quale ho svolto un lavoro collaborativo durante il tirocinio, Franco
( in bocca al lupo per l'imminente laurea ), Paolo ( per la disponibilità infinita )
chi ha sempre creduto in me e continua a farlo ancora oggi...
Grazie a tutti !!!
Vincenzo Masullo 566/2795
Pagina 2 di 265
Indice generale
1. Introduzione............................................................................................................................6
2. Monitoraggio di rete..............................................................................................................10
2.1 Il Protocollo SNMP : Simple Network Management Protocol......................................10
2.2 Cacti................................................................................................................................12
2.3 RRDTool : Round -Robin Database Tool.......................................................................18
2.4 LAMP : Linux-Apache-Mysql-Php................................................................................19
2.4.1 Apache....................................................................................................................20
2.4.2 Php..........................................................................................................................21
2.4.3 Mysql......................................................................................................................22
3. Il Portale di monitoraggio della rete d'Ateneo......................................................................23
3.1 Il Software realizzato per UniNa....................................................................................23
3.2 Porting dell' Applicazione WebMon...............................................................................27
3.2.1 Introduzione............................................................................................................27
3.2.2 La soluzione scelta : VMware Workstation............................................................29
3.2.3 Architettura finale...................................................................................................33
4. L'applicazione realizzata.......................................................................................................34
4.1 Introduzione....................................................................................................................34
4.1.1 Descrizione del problema.......................................................................................34
4.1.2 Soluzioni a confronto..............................................................................................35
4.2 Installer...........................................................................................................................40
4.2.1 Requisiti..................................................................................................................40
4.2.2 Architettura Generale..............................................................................................41
4.2.3 Sviluppo del Software............................................................................................43
4.2.4 Architettura Completa.............................................................................................50
4.3 Condivisione codice e mailing-list.................................................................................51
4.3.1 Subversion SVN.....................................................................................................51
4.3.2 Mailman GNU........................................................................................................55
4.3.3 Bugzilla...................................................................................................................59
5. Guida d'uso all'applicazione realizzata.................................................................................60
5.1 Windows-Package..........................................................................................................63
5.2 Debian-Package..............................................................................................................71
5.3 RedHat-Package.............................................................................................................81
6. Considerazioni e conclusioni................................................................................................90
7. Appendici..............................................................................................................................92
7.1 Diagrammi......................................................................................................................92
7.1.1 UML-Use Case Diagram........................................................................................92
7.1.2 UML-Component Diagram....................................................................................93
7.1.3 UML-Class Diagram..............................................................................................94
7.1.4 UML-Sequence Diagram........................................................................................97
7.2 Documentazione JavaDoc..............................................................................................98
7.3 HowTo............................................................................................................................99
7.3.1 Debian Installer.......................................................................................................99
Vincenzo Masullo 566/2795
Pagina 3 di 265
7.3.2 Redhat Installer.....................................................................................................103
7.3.3 Guida per il Porting..............................................................................................107
7.3.4 Subversion SVN...................................................................................................118
7.3.5 Mailman................................................................................................................122
7.3.6 Bugzilla ................................................................................................................129
7.3.7 Tomcat..................................................................................................................133
7.3.8 Joomla...................................................................................................................136
7.4 Codice Sorgente...........................................................................................................138
7.4.1 Debian-Package....................................................................................................138
7.4.1.1 Apache.java...................................................................................................138
7.4.1.2 BrowserLaunch.java.....................................................................................145
7.4.1.3 Cacti.java......................................................................................................146
7.4.1.4 Home.java.....................................................................................................152
7.4.1.5 Mailing.java..................................................................................................158
7.4.1.6 Main.java......................................................................................................161
7.4.1.7 Messaggio.java..............................................................................................161
7.4.1.8 MyApp.java..................................................................................................162
7.4.1.9 Mysql.java.....................................................................................................165
7.4.1.10 OS.java........................................................................................................171
7.4.1.11 Php.java.......................................................................................................176
7.4.1.12 Utility.java...................................................................................................182
7.4.1.13 Script-Bash..................................................................................................185
7.4.2 Redhat-Package....................................................................................................187
7.4.2.1 Apache.java...................................................................................................187
7.4.2.2 BrowserLaunch.java.....................................................................................194
7.4.2.3 Cacti.java......................................................................................................196
7.4.2.4 Home.java.....................................................................................................202
7.4.2.5 Mailing.java..................................................................................................208
7.4.2.6 Main.java.......................................................................................................211
7.4.2.7 Messaggio.java..............................................................................................211
7.4.2.8 MyApp.java..................................................................................................212
7.4.2.9 Mysql.java.....................................................................................................217
7.4.2.10 OS.java........................................................................................................223
7.4.2.11 Php.java.......................................................................................................226
7.4.2.12 Utility.java...................................................................................................232
7.4.2.13 Script-Bash..................................................................................................235
7.4.3 Windows-Package.................................................................................................238
7.4.3.1 AppServ.java.................................................................................................238
7.4.3.2 BrowserLaunch.java.....................................................................................245
7.4.3.3 Home.java.....................................................................................................246
7.4.3.4 Mailing.java..................................................................................................253
7.4.3.5 Main.java......................................................................................................256
7.4.3.6 Messaggio.java..............................................................................................256
7.4.3.7 MyApp.java..................................................................................................257
Vincenzo Masullo 566/2795
Pagina 4 di 265
7.4.3.8 Utility.java.....................................................................................................261
8.Bibliografia e Sitografia.......................................................................................................264
Vincenzo Masullo 566/2795
Pagina 5 di 265
1. Introduzione
Il seguente lavoro di tesi, si colloca nell'ambito dell'iniziativa "WiFiSUD" del
progetto "ICT4 University" che realizza quanto previsto dell'obiettivo Università del
Piano E-Gov 2012. In particolare l'iniziativa ha previsto il finanziamento di progetti
delle Università del Sud per realizzare, estendere o completare reti di connettività
senza fili e sviluppare servizi on-line di tipo amministrativo e/o didattico, accessibili
gratuitamente da parte degli studenti.
L'applicazione realizzata, denominata, WiFi Web Monitoring Portal, si suddivide
logicamente in due componenti principali : un' Installer, che consente di installare
sulla macchina il software necessario per configurare un sistema di monitoraggio e una
seconda fase di installazione e configurazione di servizi, come la condivisione del
codice
sorgente
dell'applicativo,
l'implementazione
di
un
sistema
di
creazione/gestione di Mailing-list per la raccolta dei feed-back degli utenti e un
sistema di tracciamento degli errori di programmazione.
Il software è scritto interamente in Java per consentire un'alta portabilità. Tale scelta
ha permesso la realizzazione di un'applicazione ex novo, con la possibilità di
modificare ogni minimo dettaglio, in base alle esigenze sia del programmatore, sia per
l'utente, ottenendo vantaggi anche in termini di usabilità.
L'IDE utilizzato è NetBeans 6.9. Quest'ultimo è un ambiente di sviluppo
multilinguaggio ( IDE ufficiale della SUN Microsystem ), possiede numerosi pluging,
e numerose librerie grafiche standard di Java ( Framework Swing ).
L'installer consente di installare su qualsiasi macchina ( Linux – Debian – Red Hat –
Windows ), software LAMP, acronimo di Linux-Apache-MySQL-Php, inoltre come
strumento per il monitoraggio è stato scelto Cacti che utilizza RRDTool ( nella sezione
apposita sarà spiegato il motivo di tale scelta ), ottimo per creare grafici,
immagazzinare dati e grazie al suo database circolare, libera il programmatore da
Vincenzo Masullo 566/2795
Pagina 6 di 265
qualsiasi compito dalla cancellazione dei dati storici.
La piattaforma LAMP è un sistema usato frequentemente in applicazioni web, che
necessitano appunto, di un Web Server come Apache, un database MySQL e il
linguaggio Php. La scelta di tre versioni differenti, una per ogni piattaforma ( Debian
– RedHat – Windows ), rende l'applicazione funzionante sulla stragrande maggioranza
dei Sistemi Operativi. Grazie ad una procedura guidata ( supportata da una miniguida
contentente screen-shots esplicativi ), il processo di installazione dei pacchetti risulta
semplice anche per utenti meno esperti, quest'ultimo sarò guidato passo passo
nell'installazione dei software necessari per il funzionamento della piattaforma LAMP
e nella configurazione del sistema di monitoraggio sulla macchina in uso. Da notare
che l'installazione dei pacchetti, avviene in automatico, grazie all'utilizzo di alcuni
script bash, che attraverso opportuni comandi, lanciano l' installazione e si occupano
della configurazione dei singoli pacchetti.
La creazione e la gestione del servizio di Mailing-list è alla base del concetto di opensource. In pratica, l'applicazione realizzata, grazie al supporto del sistema di gestione
delle mailing list, consente a tutti gli Atenei che vogliono contribuire, individuare bug
di programmazione o anche proporre soluzioni alternative per il miglioramento del
software. Mailman è un software di gestione di mailing list anch'esso sviluppato
nell'ambito dal progetto GNU. Uno o più amministratori si occupano della gestione
delle mailing-list, organizzare i post, moderare i messaggi.
Sia la gestione che l'invio dei messaggi avviene via web, dove Mailman rappresenta il
leader in tale ambito.
Il CVS ( Concurrent Versions System ) implementa un sistema di controllo versione :
mantiene al corrente di tutto il lavoro e di tutti i cambiamenti in un insieme di file,
tipicamente è l'implementazione di un software in via di sviluppo, in un progetto, e
permette a molti sviluppatori di collaborare, spesso anche in posti molto lontani.
Vincenzo Masullo 566/2795
Pagina 7 di 265
E' rilasciato sotto la licenza GNU ( software libero ). Utilizza un architettura di tipo
Client-Server, generalmente il software del server gira su linux, mentre i client sono
collocati su tutti i Sistemi Operativi ( linux, windows, ecc. ).
Anche per questo servizio è stato scelto un applicativo Open Source come SVN
Subversion, considerato il successore di CVS. Attraverso un repository è possibile
condividere il codice sorgente di più progetti e aggiornarlo periodicamente, ogni client
può lavorare autonomamente sulla propria working-copy ed a fine lavoro comunicare
al repository gli aggiornamenti effettuati.
Infine grazie a Bugzilla (bugtracker) è possibile individuare bug di programmazione,
per poi apportare miglioramenti all'applicativo. Quest'ultimo necessita di un web
server come Apache e di una Database Management System, tipicamente Mysql.
Grazie a questo sistema di condivisione e aggiornamento del codice è sempre
disponibile una versione aggiornata e ottimizzata.
Ecco un breve sommario degli argomenti trattati nella Tesi, suddivisa per capitoli.
Il lavoro è sviluppato in 8 capitoli : nel primo capitolo vengono discussi gli obiettivi
generali del lavoro svolto, le caratteristiche principali del software implementato, ed
una panoramica generale sui pacchetti e gli strumenti utlizzati per realizzare l'installer
ed effettuare la configurazione dei servizi ad esso correlati.
Nel secondo capitolo viene introdotto il monitoraggio delle reti, con particolare
attenzione al protocollo utilizzato per il monitoraggio ( SNMP ), il sistema scelto per
tale scopo ( Cacti ) e il tool utilizzato da quest'ultimo ( RRDTool ). Cacti riesce ad
interrogare tramite SNMP gli apparati monitorati, oltre a conservare i dati monitorati
in una base di dati, offre, grazie alla collaborazione di RRDTool, anche una
visualizzazione grafica delle informazioni. Infine vengono illustrate le caratteristiche
Vincenzo Masullo 566/2795
Pagina 8 di 265
di una piattaforma LAMP.
Nel terzo capitolo viene proposta una panoramica generale sulle caratteristiche del
portale realizzato per il monitoraggio della rete WiFi Unina, gli strumenti utilizzati per
la realizzazione del sito web e la configurazione del sistema di monitoraggio.
Successivamente viene affrontato il problema del porting dell'applicazione, su più
macchine virtuali, e come tale applicazione può essere utilizzata per gli altri Atenei.
Nel quarto capitolo vengono illustrate dettagliatamente le caratteristiche dell'installer
realizzato e menzionati tutti i pacchetti da installare affinchè il sistema di monitoraggio
sia configurato e installato correttamente. Sono evidenziate le differenze e le analogie
che presentano le tre versioni realizzate ( Debian-RedHat-Windows ). Inoltre vengono
analizzati i pacchetti utilizzati per la condivisione del codice sorgente, il bugtracker e
il servizio di mailing list : Subversion SVN, Bugzilla e Mailman.
Nel quinto capitolo viene fornita una guida d'uso per l'applicazione realizzata, con
screen-shots dimostrativi ( sono illustrati tutti gli screen shot delle versioni realizzate ),
sottolineando che, l'installazione dei pacchetti avviene tramite singolo pacchetto ( per
sistemi Debian e RedHat ) utilizzando il Repository delle rispettive distribuzioni ( ed i
comandi corrispondenti per le installazioni ). La versione Windows, invece, usufruisce
del pacchetto AppServ, un software completamente freeware.
Nel sesto capitolo sono riportate le considerazioni finali ed eventuali sviluppi futuri.
Una delle prerogative fondamentali del software realizzato, che risulta essere in
continuo sviluppo e perciò può essere continuamente migliorato.
Nell'Appendice vengono forniti i diagrammi UML più importanti, il codice sorgente,
la documentazione JavaDoc e una sezione HowTo contenente tutte le miniguide
realizzate e utilizzate per installare pacchetti e servizi.
Vincenzo Masullo 566/2795
Pagina 9 di 265
2. Monitoraggio di rete
Per valutare correttamente lo stato di un sistema complesso è necessario considerare :
gestione, manutenzione ed evoluzione del sistema stesso. Dunque il Monitoraggio
svolge un ruolo di primaria importanza nella vita ed evoluzione del sistema.
Le informazioni fornite da quest'ultimo devono essere esatte e rilevanti.
Distinguiamo due tipologie di monitoraggio : passivo e attivo.
Nel monitoraggio di tipo passivo, il sistema si occupa di aggregare le informazioni
fornitegli dalle entità della rete, le quali devono essere dotate di sistemi di
memorizzazione e offrire servizi per l'accesso ai dati. In quello di tipo attivo, invece,
raccolgono informazioni sullo stato della rete attraverso processi di interazione con la
rete stessa.
Il protocollo maggiormente utilizzato in tale ambito è quello SNMP, quindi è
opportuno trattarlo in maniera esaustiva.
2.1 Il Protocollo SNMP : Simple Network Management Protocol
L' SNMP è un protocollo di rete che permette di raccogliere dati, controllare e gestire
il funzionamento degli elementi di una rete di tipo TCP/IP, attraverso la rete stessa.
Nel 1995, per migliorare le imperfezioni venute alla luce con il passare degli anni,
venne definito l' SNMPv2, e nel 1998 l'ultima versione: l' SNMPv3. Quest'ultima
nacque per risolvere soprattutto problemi che riguardano la sicurezza.
L'SNMP è un protocollo di livello di applicazione che usa UDP come protocollo di
trasporto. E' stato preferito il protocollo UDP a TCP in modo da minimizzare il traffico
Vincenzo Masullo 566/2795
Pagina 10 di 265
di rete, infatti TCP essendo orientato alla connessione richiederebbe più risorse di rete.
L'aspetto negativo dell' UDP è che non si ha la certezza che il messaggio arrivi a
destinazione. Tale protocollo è stato scelto poichè l' SNMP è nato per gestire e
monitorare le prestazioni di rete e un'eventuale congestione di quest'ultima, sarebbe
aggravata dall'utilizzo di TCP. L' SNMP fa parte di un architettura il cui nome è INMF
Internet Network Management Framework, ed è composta da tre componenti
fondamentali :
1. sistema gestito ( managed object )
2. agente di gestione ( management agent )
3. sistema di gestione ( manager )
Il manager rappresenta l'applicazione remota che prende la decisione di gestione, in
ogni configurazione, quest'ultimo avvia il programma che gestisce SNMP. I sistemi
gestiti a loro volta, sono dotati di un programma di management agent, ospitano quindi
un agente di gestione. Lo stato del sottosistema gestito, è rappresentato dall'agente, il
quale, è responsabile dell'accesso alla base di dati MIB.
Il funzionamento di SNMP è molto semplice. La piattaforma della gestione di rete
invia interrogazioni (query) all'agente, quest'ultimo a sua volta risponde. Interrogazioni
e risposte si riferiscono a variabili accessibili da parte del management agent. Le
variabili d'agente sono memorizzate nella base di dati chiamata MIB, il management
agent ritrova la variabile nella MIB utilizzando un identificativo ( OID Object ID )
organizzato gerarchicamente.
Vincenzo Masullo 566/2795
Pagina 11 di 265
2.2 Cacti
Il sistema di monitoraggio scelto per la raccolta dei dati di esercizio per gli apparati di
rete è il software Open Source Cacti. Quest'ultimo interagisce con altri applicativi per
consentire, ad esempio, che i dati catturati dalla MIB siano conservati ed elaborati in
diversi modi. Cacti è un ottimo strumento di monitoraggio, utilizza come Web Server
Apache, che permette di visualizzare il lavoro effettuato tramite un browser. Inoltre
utilizza Php come estensione di Apache, il quale è un linguaggio di scripting concepito
per lo sviluppo di pagine web dinamiche, attualmente però è utilizzato per sviluppare
applicazioni web lato server e per scrivere script a linea di comando. Usufruisce anche
di un database Mysql, utile alla memorizzazione di alcuni parametri come i settaggi, il
poller e gli utenti registrati. Altro strumento software estremamente importante, che
offre l'interfaccia all'utente finale e si occupa di raccogliere e visualizzare graficamente
dati temporali è RRDTool. Quest'ultimo utilizza un database circolare ( Round
Robin ), che ha a disposizione un numero finito di elementi con un puntatore
all'elemento corrente, gli elementi vecchi saranno sovrascritti da quelli nuovi. Il
risultato delle interrogazioni SNMP sarà memorizzato in Round Robin Archives
(RRA) successivamente possono essere letti e utilizzati tali dati. Con il tempo questi
valori saranno sovrascritti da valori aggiornati.
Cacti è uno strumento completo , è preferibile usarlo rispetto ai suoi concorrenti per la
facilità di configurazione ed uso, inoltre la sua installazione è molto semplice. Sfrutta a
pieno le potenzialità di RRDTool e riesce a presentare grafici di buon livello e di
diverse tipologie.
Integra una serie di tool con lo scopo di fornire un sistema semplice e completo per il
monitoraggio passivo di reti informatiche.
Vincenzo Masullo 566/2795
Pagina 12 di 265
Cacti utilizza i seguenti tool:
•
Net-SNMP per le interrogazione SNMP
•
RRDTool per la persistenza e le presentazione dei grafici
•
piattaforma LAMP
Uno schema modulare di cacti è il seguente:
Figura 1: Struttura modulare di cacti
Le operazioni di Cacti possono essere divise in 3 parti :
1. Data Retrivial
2. Data Storage
3. Data Presentation
Vincenzo Masullo 566/2795
Pagina 13 di 265
Per la raccolta dei dati di esercizio, quindi per le interrogazioni ai vari dispositivi, cacti
utilizza il protocollo SNMP ( Simple Network Management Protocol ), il primo task
riguarda proprio questo, ossia il recupero dei dati. Tale compito è effettuato utilizzando
il suo poller che viene eseguito dallo scheduler del sistema operativo.
Per il Data Storage, cacti ultizza il database di RRDTool. L'RRD, acronimo di Round
Robin Database, è un database circolare, dove i dati saranno memorizzati in modo
molto compatto e non rimarranno nel tempo, ma saranno sovrascritti da dati
aggiornati. Una delle caratteristiche migliori di RRDTool è legata al terzo ed ultimo
compito, il Data Presentation, ossia la funzione grafica di built-in.
Ecco alcune schermate che riproducono il funzionamento di cacti, illustrando le
funzionalità più importanti.
Figura 2: Login Cacti
Vincenzo Masullo 566/2795
Pagina 14 di 265
Per la creazione di un Device è necessario riempire il campo contente la Descrizione
del Dispositivo ( un nome simbolico che identifica il dispositivo ). Campi
fondamentali sono quelli che contengono l'ip dell'host da monitorare, e quello
contentente la versione del protocollo SNMP. Gli altri paramentri in genere
contengono valori di default ( vengono usati quelli )
Figura 3: Creazione di un device
Vincenzo Masullo 566/2795
Pagina 15 di 265
Creato il Device è possibile associare a quest'ultimo un grafico:
Figura 4: Creazione grafico associato al device
Vincenzo Masullo 566/2795
Pagina 16 di 265
Inoltre per ogni host creato è possibile visualizzare l'elenco dei grafici realizzati :
Figura 5: Elenco grafici per un device
Vincenzo Masullo 566/2795
Pagina 17 di 265
2.3 RRDTool : Round -Robin Database Tool
RRDTool ( Round – Robin Database Tool ) è uno degli strumenti software
maggiormente usati nell'ambito del monitoraggio. Il compito principale di RRDTool è
l'archiviazione di serie temporali.
Le caratteristiche principali di RRDTool sono le seguenti :
•
dimensione costante dei file di archivio ( file RRD )
•
dump degli archivi in file XML
•
fetch di serie temporali parziali dagli archivi
•
rappresentazione dei dati per mezzo di grafici
Figura 6: Caratteristiche RRDTool
Vincenzo Masullo 566/2795
Pagina 18 di 265
2.4 LAMP : Linux-Apache-Mysql-Php
LAMP è l'acronimo di Linux Apache Mysql Php e indica l'ambiente libero ( e anche
gratuito ) di programmazione di applicazioni Web che è possibile costruire dalla
somma delle parti di queste eccezionali applicazioni a sorgente aperto ( open source ).
Di seguito vengono analizzati nel dettaglio le caratteristiche dei pacchetti che
costituisco la cosiddetta piattaforma LAMP.
Figura 7: Piattaforma LAMP
Vincenzo Masullo 566/2795
Pagina 19 di 265
2.4.1 Apache
Apache HTTP Server o più comunemente Apache è il nome dato alla piattaforma
server web modulare più diffusa in grado di operare sia sui sistemi Linux-Unix sia
quelli Windows-Microsoft. E' un software che realizza le funzioni di trasporto delle
informazioni, di internetwork e di collegamento, inoltre ha il vantaggio di offrire anche
funzioni di controllo sulla sicurezza come quelli che compie il proxy.
Il Web Server Apache presenta un'architettura modulare, quindi ad ogni richiesta del
client, vengono svolte funzioni specifiche da ogni modulo di cui è composto, come
unità indipendenti. Ciascun modulo si occupa di una funzionalità, ed il controllo è
gestito dal core.
Il Core è il programma principale composto da un ciclo sequenziale di chiamate ai
moduli. Il modulo Translation traduce la richiesta del client, mentre l'Access control
controlla eventuali richieste dannose. Il modulo MIME Tipe verifica il tipo di
contenuto mentre Response invia la risposta al client e attiva eventuali procedure, il
Logging invece tiene traccia di tutto quello che è stato fatto.
Il core suddivide la richiesta ai vari moduli in modo sequenziale, usando i parametri di
uscita di un modulo come parametri di accesso per l'altro, creando così l'illusione di
una comunicazione orizzontale fra i moduli ( pipeline software ). Sopra il ciclo del
core c'è un ulteriore ciclo di polling svolto da un demone, che interroga continuamente
le linee logiche da cui possono pervenire messaggi di richiesta.
Vincenzo Masullo 566/2795
Pagina 20 di 265
2.4.2 Php
Php è un linguaggio di scripting interpretato con licenza open source e libera,
originariamente concepito per la programmazione web, ovvero per la realizzazione di
pagine web dinamiche. E' utilizzato principalmente per sviluppare applicazioni web
lato server ma può essere usato anche per scrivere Script a riga di comando o
applicazioni standalone con interfaccia grafica. L'elaborazione del codice Php sul
server produce codice HTML da inviare al browser dell'utente che ne fa richiesta. Il
vantaggio di Php e di altri linguaggi web come ASP e .NET rispetto al classico HTML
derivano dalle differenze profonde che sussistono tra web dinamico e web statico.
La popolarità del linguaggio Php è in costante crescita, nel Giugno 2001 ha superato il
milione di siti che lo utilizzano. Nel 2002 più del 45% dei Server Apache utilizzavano
Php.
Php fondamentalmente è un linguaggio ad alto livello, come per quasi tutti i linguaggi
moderni, per molti versi riprende la sintassi del C ( come il Perl ). E' un linguaggio a
tipizzazione debole e dalla versione 5 migliora il supporto al paradigma della
programmazione ad oggetti. Grazie all'esistenza di numerosi API e innumerevoli
funzioni si interfaccia con moltissimi Database ( Mysql, Oracle, Firebird, IBM DB2 ) e
supporta numerose tecnologie come XML, SOAP, CORBA, FTP. Si integra molto
bene anche con altri linguaggi e piattaforme, come ad esempio Java e .NET.
Vincenzo Masullo 566/2795
Pagina 21 di 265
2.4.3 Mysql
Mysql è un Relational Database Management System ( RDBMS ) costituito da un
client con interfaccia a caratteri e un server, è disponibile sia per sistemi Unix-Linux
che per Windows, anche se in ambito Linux il suo utilizzo è più diffuso. Possiede
interfacce per diversi linguaggi, compreso un driver per ODBC, due driver Java, un
driver per Mono e .NET e una libreria per python.
Come detto in precedenza, la piattaforma LAMP è una delle più diffuse e installate su
internet per lo sviluppo di siti e apllicazioni web dinamiche, Mysql in tale ambito
svolge il ruolo di DBMS.
Esistono diversi strumenti per l'amministrazione di database Mysql, una delle
applicazioni più diffuse è phpMyAdmin, il quale necessita di un Web Server Apache e
il supporto del linguaggio Php, inoltre può essere utlizzato attraverso un qualsiasi
browser web.
Figura 8: phpMyAdmin
Vincenzo Masullo 566/2795
Pagina 22 di 265
3. Il Portale di monitoraggio della rete d'Ateneo
3.1 Il Software realizzato per UniNa
L'applicazione realizzata per Unina ha lo scopo di mostrare lo stato della rete in
qualsiasi momento. WiFed WebMon è il primo sistema di monitoraggio della rete
Unina disponibile su un portale web. I dati raccolti e messi a disposizione per gli utenti
sono i seguenti : il numero di persone connesse alla rete Wireless ed il numero di
Access Point attivi e altre informazioni come il traffico Tcp, Udp, Ip, Snmp e il
numero di autenticazioni avvenute con successo.
Tra i diversi sistemi di monitoraggio open source è stato scelto Cacti, per la semplicità
di configurazione, nonostante l'ottimo livello di affidabilità. Cacti interroga tramite
protocollo SNMP i dispositivi inseriti, conservando i dati in un database, grazie alla
collaborazione di RRDTool che permette la visualizzazione dei dati attraverso grafici
molto precisi e dettagliati.
Le sedi interessate al monitoraggio sono le seguenti : Monte Sant'Angelo, IngegneriaVia Claudio, Ingegneria-Agnano, Ingegneria-P.Tecchio, Zona Ospedaliera e Centro
Storico, ma si è scelto di offrire un monitoraggio più accurato sopratutto nella zona di
Fuorigrotta.
Vincenzo Masullo 566/2795
Pagina 23 di 265
Figura 9: Topologia rete UniNa
I linguaggi utilizzati per lo sviluppo dell'applicazione sono i seguenti :
•
HTML per la presentazione delle pagine ;
•
RRDTools per l'esportazione dei grafici e per le informazioni numeriche;
•
MySql per la creazione e l'utilizzo dei dati raccolti dalle interrogazioni;
•
PERL per la creazione di script;
•
BASH per l'aggiornamento delle immagini;
Vincenzo Masullo 566/2795
Pagina 24 di 265
Inoltre grazie all'utilizzo di un Web Server come Apache, e la disponibilità dei servizi
offerti da Cacti, è stato possibile integrare l'applicazione sul portale del monitoraggio
Unina, e rendere disponibile l'applicazione a tutti gli utenti.
Il sito del monitoraggio è stato realizzato utilizzando il CMS Joomla, grazie al quale è
stato possibile utilizzare il template di un sito già realizzato, e facilitare le operazioni
di creazione delle pagine web.
Figura 10: Home page Portale Monitoraggio
Vincenzo Masullo 566/2795
Pagina 25 di 265
Il lato amministratore è il seguente, prima e dopo effettuato il login.
Figura 11: Login
Figura 12: Lato Admin
Vincenzo Masullo 566/2795
Pagina 26 di 265
3.2 Porting dell' Applicazione WebMon
3.2.1 Introduzione
Le problematiche riscontrate durante la fase del porting di un portale già esistente, è
legato principalmente alla mancata conoscenza dei servizi da importare e
successivamente da configurare. Dunque prima di procedere con la fase di Porting, è
stato necessario studiare tutti i servizi e gli strumenti utilizzati, per la realizzazione del
sito web e la configurazione del sistema di monitoraggio.
L'applicazione originale era ripartita su tre macchine :
•
la wifed02 contentente i dispositivi WiFi
•
la wifed03 contenente i dispositivi wired e Joomla
•
il Server centrale che effettua il redirect alla wifed03
Inoltre poichè l'applicazione è supportata anche da una sezione che si occupa di fornire
le Statistiche dei dispositivi WiFi, è stato necessario caricare il DataServer sulla
macchina wifed02 e il DataClient sulla macchina wifed03.
Una volta familiarizzato con lo strumento di monitoraggio, nella fattispecie Cacti, in
particolare effettuando alcuni test sui dispositivi presenti nel Centro SCoPE,
opportunamente sbloccati, è stato possibile analizzare e capire dettagliatamente come è
stata sviluppata l'applicazione WebMon.
Vincenzo Masullo 566/2795
Pagina 27 di 265
Di seguito viene illustrato uno schema che riporta la suddivisione dei servizi e dei
pacchetti software sulle macchine prima di effettuare il porting.
Figura 13: Architettura Rete Netmon
Vincenzo Masullo 566/2795
Pagina 28 di 265
3.2.2 La soluzione scelta : VMware Workstation
Per effettuare il porting dell'applicazione si è scelto un Tool di virtualizzazione di
sistemi operativi. In particolare, grazie a VMware Workstation è possibile creare su
una macchina fisica, n macchine virtuali, sfruttando le risorse hardware della
macchina ospitante. Nel gergo della virtualizzazione, la macchina ospitante è chiamata
host, mentre quelle ospitati vengono chiamate guest.
Tale soluzione è un modo efficiente per effettuare testing, ma rappresenta anche
un'ottima scelta per emulare più macchine ( contenenti più servizi ) su un unico
sistema hardware.
VMware è senza dubbio una delle soluzioni più all'avanguardia per virtualizzare un
sistema operativo, ma è un programma che pur non trascurando l'utente medio, è più
adatto soprattutto ad un'utenza avanzata o professionale.
Inoltre permette di impostare a fondo ogni aspetto : dal quantitativo di memoria RAM
e video assegnati al sistema guest, alle modalità di condivisione della connessione di
rete, fino alle funzioni legate al controllo remoto, al cloning della macchina virtuale e
così via.
Con VMware Workstation la macchina virtuale viene usata attraverso una normale
finestra del sistema host, che si può impostare in modalità ridotta oppure a schermo
pieno, inoltre risulta molto comoda la possibilità di effettuare il drag and drop dei file
tra host e guest e l'opportunità di condividere cartelle tra i due sistemi. L'ottimo
Snapshot Manager consente di creare e gestire con grande facilità i punti di ripristino
per la macchina virtuale.
Di seguito viene illustrata la procedura effettuata per la creazione di una macchina
virtuale utilizzando il Tool in esame.
Vincenzo Masullo 566/2795
Pagina 29 di 265
Figura 14: VM-WorkStation Creazione macchina virtuale
Figura 15: VM-WorkStation Selezione Distribuzione
Vincenzo Masullo 566/2795
Pagina 30 di 265
Figura 16: VM-WorkStation Configurazione Macchina
Figura 17: VM-WorkStation Riepilogo Caratteristiche
Vincenzo Masullo 566/2795
Pagina 31 di 265
Innanzitutto si sceglie l'opzione per la creazione di una macchina virtuale, dopodichè
si passa alla modalità di installazione del Sistema Operativo. Si può scegliere di
installarlo tramite Unità DVD/CD oppure file disco immagine iso. A questo punto si
sceglie un nome per la nuova macchina virtuale e si effettuano i settaggi hardware
della macchina ( memoria ram, hard disk e modalità di rete ).
La macchina virtuale personalizzata è pronta per l'uso.
Vincenzo Masullo 566/2795
Pagina 32 di 265
3.2.3 Architettura finale
Il processo di porting effettuato, garantisce ai servizi la massima stabilità, fornendo
efficienza all'applicazione realizzata. Se in futuro si devono effettuare cambiamenti
all'applicazione è necessario operare sulle singole macchine create, contententi i
servizi implementati e configurati. Di seguito viene riportato uno schema che
visualizza la struttura finale delle macchine virtuali, elencando i servizi presenti su di
esse.
Figura 18: Architettura Rete Netmon Virtual Machine
Vincenzo Masullo 566/2795
Pagina 33 di 265
4. L'applicazione realizzata
4.1 Introduzione
4.1.1 Descrizione del problema
Il progetto per la realizzazione di un'installer multipiattaforma, che consenta di
installare e configurare pacchetti e servizi su diversi sistemi operativi è abbastanza
complesso.
Da un lato si può scegliere di utilizzare pacchetti già esistenti, che consentono di
creare installer ( IzPack, InstallCreator, ecc.. ). Esistono pacchetti open source ma
anche a pagamento, tale scelta però non garantisce sempre la massima portabilità.
Inoltre spesso questi pacchetti includono delle limitazioni, come ad esempio
nell'esposizione del logo o del nome della software house produttrice al termine di
ciascuna procedura di installazione.
Principalmente, proprio per queste limitazioni, si è scelto di realizzare un applicazione
Java, che come requisiti richieda esclusivamente la JDK ( Java Development Kit )
garantendo anche la massima portabilità.
L'IDE utilizzato per la realizzazione dell'installer è NetBeans 6.9, grazie hai tanti plugin e classi ( Framework Swing ) per la realizzazione dell'interfaccia grafica, è stato
possibile realizzare un'applicazione molto flessibile e dal punto di vista
dell'utilizzatore molto semplice e diretta.
Vincenzo Masullo 566/2795
Pagina 34 di 265
4.1.2 Soluzioni a confronto
Come detto in precedenza, esistono pacchetti che permettono di creare installer.
Analizziamo in questo paragrafo due possibili soluzioni : Izpack e InstallCreator.
Izpack
Questo pacchetto è completamente class-platform e genera un unico programma di
installazione, richiede esclusivamente la JVM per funzionare. E' pubblicato sotto i
termini della Apache Software License, ciò significa che si adatta alle proprie esigenze
con il minimo vincolo.
Caratteristiche principali :
•
basato su descrittori XML
•
utilizza la massima compressione degli archivi .jar
•
grande flessibilità e modularità
•
uninstaller creato automaticamente
•
pannello di input per l'utente molto flessibile
Vincenzo Masullo 566/2795
Pagina 35 di 265
Ecco alcune schermate che rendono l'idea sul livello di personalizzazione del
pacchetto :
Figura 19: IzPack Presentazione
Figura 20: IzPack Informazioni
Vincenzo Masullo 566/2795
Pagina 36 di 265
Clickteam Install Creator
Clickteam Install Creator è un programma completamente gratuito, che permette di
creare una procedura d'installazione personalizzata per i propri programmi o i propri
files. La sua interfaccia, accattivante graficamente e pratica da utilizzare, fa di
Clickteam Install Creator un'ottima alternativa alle più famose ed utilizzate soluzioni
commerciali. L'aspetto della procedura d'installazione che potrà essere creata con
questo programma, è assolutamente professionale. L'autocomposizione guidata
( wizard ), permette di scegliere, in pochi passi, tutti i files da includere nella
procedura di installazione e le varie preferenze. E' possibile impostare la cartella
d'installazione predefinita, inserire un contratto di licenza d'uso, aggiungere icone e
loghi personalizzati. Il programma mette a disposizione anche una completa procedura
per la disinstallazione.
Install Creator è completamente gratuito e può essere utilizzato anche per scopi
commerciali. L'unica "limitazione" consiste nell'esposizione del nome e del logo della
software house produttrice al termine di ciascuna procedura d'installazione. Ecco
alcune screen-shot che mostrano la bontà di questa applicazione :
Vincenzo Masullo 566/2795
Pagina 37 di 265
Figura 21: Install Creator Presentazione
Figura 22: Install Creator aggiungi files 1/2
Vincenzo Masullo 566/2795
Pagina 38 di 265
Figura 23: Install Creator aggiungi files 2/2
Vincenzo Masullo 566/2795
Pagina 39 di 265
4.2 Installer
4.2.1 Requisiti
L'unico requisito fondamentale per l'applicazione realizzata è la presenza della JDK (
Java Developement Kit ) sul sistema operativo in cui si va ad eseguire l'installer.
Da questo requisito segue il diagramma dei casi d'uso ( contestualizzato per i vari
sistemi operativi )
Figura 24: Use Case Diagram
Vincenzo Masullo 566/2795
Pagina 40 di 265
4.2.2 Architettura Generale
Il software è stato realizzato utilizzando principalmente il Framework Swing per Java
che mette a disposizione Classi e Metodi per la creazione e gestione di interfacce
grafiche. Le finestre ( JFrame ) che caratterizzano l'installer, sono costituite da
componenti come caselle di testo, bottoni, pannelli e tabelle.
Swing è indipendente dalla piattaforma sia in termini di linguaggio sia della sua
implementazione.
E' un Framework basato a componenti : la differenza tra oggetti e componenti è
leggera. Un componente è un oggetto con determinate caratteristiche di
comportamento conosciute e specificate. Gli oggetti Swing emettono eventi in modo
asincrono, hanno caratteristiche legate ad essi stessi, e rispondono ad un ben preciso
set di comandi ( specifico per componente ). In particolare i componenti Swing Java
Beans seguono le specifiche dell'architettura JavaBean.
Figura 25: MVC JavaBeans
Vincenzo Masullo 566/2795
Pagina 41 di 265
Di seguito viene riportato il diagramma delle classi dell'applicazione realizzata,
mentre nei paragrafi successivi saranno analizzate dettagliatamente la struttura delle
classi principali e i metodi che consentono l'installazione dei pacchetti ( compito
dell'installer ).
Figura 26: Class Diagram Generale
Vincenzo Masullo 566/2795
Pagina 42 di 265
4.2.3 Sviluppo del Software
Le tre versioni realizzate hanno in comune l'interfaccia grafica, poichè sono state
realizzate utilizzando il Framework Java Swing. Si differenziano nella fase di
installazione dei software, infatti, per la versione Debian e Redhat è previsto il lancio
dell'installazione attraverso appositi script bash, che permettono di scaricare ( dai
repository ) e installare i pacchetti scelti. Per la versione Windows, invece, vengono
utilizzati gli eseguibili ( inglobati nell'applicazione ), che vengono estratti e
successivamente lanciati, a questo punto è compito di Windows Installer gestire
l'installazione.
La struttura delle classi implementate che permettono di realizzare l'interfaccia grafica
dell'applicazione è costituita da diversi JFrame, della quale è stata effettuata la gestione
completa di tutti gli eventi collegati alla finestra visualizzata.
Di seguito viene riportato un frame realizzato, con il costruttore e i metodi principali.
Figura 27: Struttura JFrame
Vincenzo Masullo 566/2795
Pagina 43 di 265
Il JFrame è costituito da : JLabel, JButton, JTextField, JPanel.
Tutti questi componenti fanno parte del Framwork Swing, i metodi realizzati
garantiscono una gestione completa degli eventi e delle eventuali eccezioni legate ad
esso.
public Apache(String so,String home) {
super("apache2");
this.so=so;
this.home=home;
file .jar
// chiamata superclasse
// sistema operativo
// directory di esecuzione del
initComponents();
// inizializza componenti
addWindowListener(this);
// aggiunge ascoltatore
setSize(600,400);
// set dimensione frame
setLocationRelativeTo(null);
// posiziona il frame al centro
setCampo(so);
// set percorso programma
setResizable(false);
// l'utente non può ingrandire
la finestra
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
// rende visibile il frame
}
Nel costruttore vengono settati gli attributi della classe e vengono richiamati i metodi
che permettono di impostare le caratteristiche del Frame, la sua visibilità e
l'inizializzazione dei componenti collegati ad esso.
Di seguito viene riproposto il metodo che si occupa della gestione del bottone per il
passaggio e la visualizzazione del frame successivo.
Vincenzo Masullo 566/2795
Pagina 44 di 265
private void nextButtonActionPerformed(java.awt.event.ActionEvent evt) {
// next button
// controllo se il campo contenente il path non è vuoto
boolean c=false;
percorso=jTextFieldPercorso.getText();
if(u.isFieldEmpty(percorso)) // campo vuoto
{ m.stampaMex("Please enter the path where you installed the
program !"); }
else
{
c=u.controllo(percorso);
// controlla se il percorso esiste
if ( c )
{ // true
boolean a=percorso.contains("apache2");
se il percorso contiene apache2
installato
installato
// controllo
if ( a )
{ c=true; }
// set c a true = programma
else
{ c=false; }
// set c a false = programma non
}
}
if ( c )
//
true ----> passo al programma successivo
{
dispose();
Php pr= new Php(so,home);
// nome sistema operativo
}
else
{
// false programma non installato o percorso nn corretto
// lancio messaggio di errore
m.stampaMex("Wrong path or program is not installed !");
}
}
Vincenzo Masullo 566/2795
Pagina 45 di 265
Il Metodo seguente si occupa di lanciare gli script bash che lanciano l'installazione e la
configurazione dei pacchetti :
public void installSW() throws IOException
{
// conferma installazione
int risultato = JOptionPane.showConfirmDialog(this,"You want to
install apache2 on your
system ?","Install",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSA
GE);
if (risultato == JOptionPane.OK_OPTION)
{
// controllo il sistema operativo e lancio installazione
// debian apt-get install
// installo apache2
Process theProcess=null;
try
{
// lancio installazione apache
File s = new File (home,"risorse/script");
Runtime exec = Runtime.getRuntime();
exec.exec("gnome-terminal -x bash -c
"+s.getAbsolutePath()+"/apache2.sh;bash"); // lancio script che effettua
l'installazione del pacchetto
System.out.println(s); // test
// lancio miniguida con evince ( .pdf )
// operazione effettuata per far lanciare la guida,
il pacchetto può essere eseguito in qualsiasi
// posizione su qualsiasi macchina
File f = new File (home,"risorse/Guide");
theProcess = Runtime.getRuntime().exec("evince
file://" + f.getAbsolutePath() + "/Debian.pdf");
System.out.println(f); // test
apt-get install");
System.out.println("Installo Apache x Debian con
// test
}
catch(IOException e)
{
System.err.println("Error on exec() method");
e.printStackTrace();
Vincenzo Masullo 566/2795
Pagina 46 di 265
}
}
}
In prima istanza viene chiesto all'utente la conferma di installazione del pacchetto,
dopodichè, quando quest'ultimo accetta, viene lanciata la miniguida illustrata per
assistere l'utente durante l'installazione e la configurazione dei pacchetti.
La miniguida viene lanciata con il visualizzatore di Documenti per il formato .pdf
Evince, poi lo scritp bash si occupa di lanciare i rispettivi comandi ( apt-get install
oppure yum install ) per le installazioni in base al sistema operativo in suo.
A questo punto l'applicazione procede nell'installazione dei pacchetti da terminale,
l'utente deve inserire la password di root come da norma per i sistemi Linux.
La procedura è identica per tutti i servizi ( apache2-php-mysql-cacti ).
Ovviamente cambiano gli script lanciati con i rispettivi comandi da piattaforma a
piattaforma.
Di seguito viene mostrato il contenuto di uno Script Bash.
Vincenzo Masullo 566/2795
Pagina 47 di 265
#!/bin/bash
# installo mysql-server
sudo apt-get install mysql-server
# installo phpmyadmin
sudo apt-get install libapache2-mod-auth-mysql php5-mysql phpmyadmin
# modifico il file php.ini ( seguendo la guida )
cd /
sudo gedit /etc/php5/apache2/php.ini
# creo il link simbolico
sudo ln -s /usr/share/phpmyadmin /var/www/phpmyadmin
# riavvio web server
sudo /etc/init.d/apache2 restart
La direttiva al primo rigo invoca l'interprete bash che si occupa di lanciare i comandi
presenti nello script. Seguono una serie di comandi apt-get install che permettono di
installare i pacchetti dai repository passati come parametro, gli altri comandi invece si
occupano della configurazione dei servizi, come ad esempio il riavvio del web server.
Vincenzo Masullo 566/2795
Pagina 48 di 265
Figura 28: Miniguida Installer
La miniguida .pdf che supporta l'utente durante la configurazione dei pacchetti.
Il Codice Sorgente integrale è allegato nell'Appendice, mentre in formato elettronico
viene fornita la Documentazione JavaDoc, che descrive dettagliatamente il
significato di ogni classe e metodo.
Vincenzo Masullo 566/2795
Pagina 49 di 265
4.2.4 Architettura Completa
Figura 29: Architettura Completa
Il diagramma dei componenti di tutta l'applicazione racchiude tutti i componenti in
gioco. La maggior parte delle classi implementate sono JFrame, dunque utilizzano i
metodi del Framework Swing e usufruiscono di tutti i componenti di quest'ultimo,
come ad esempio i JButton e JText. L'applicazione per essere lanciata necessita della
presenza della JDK, inoltre grazie alla JVM a RunTime vengono lanciati gli Script
Bash. Infine il supporto del visualizzatore di documenti Evince garantisce l'apertura
dei file .pdf contenenti le miniguide di supporto all'applicazione.
Vincenzo Masullo 566/2795
Pagina 50 di 265
4.3 Condivisione codice e mailing-list
In questo paragrafo vengono analizzati e descritti i servizi implementati per supportare
lo sviluppo e il miglioramento del software realizzato.
•
Subversion SVN
controllo versione e condivisione codice
•
Mailman
creazione e gestione mailing list
•
Bugzilla
sistema di tracciamento dei difetti
4.3.1 Subversion SVN
Nel mondo del software libero, il CVS ( Concurrent Versioning System ) è
diffusissimo perchè permette lo sviluppo di software, mantiene al corrente di tutto il
lavoro e di tutti i cambiamenti di un insieme di file implementando un vero e proprio
sistema di controllo di versione. Utilizza un'architettura Client-Server : il server si
occupa di immagazzinare l'ultima versione del progetto e di fornirla ai client, questi
ultimi possono accedere in qualisiasi momento al codice del progetto e modificarlo.
Il software del server normalmente gira su Unix mentre i client possono girare su un
numero maggiore di sistemi operativi. Nella terminologia del CVS un singolo progetto
( insieme di relativi file ) è chiamato modulo. Il server immagazzina tutti i moduli in
un repository, una copia scaricata dal server da un client è chiamata working copy o
sandbox.
Come detto in precedenza, l'applicativo scelto per il controllo della versione è
Subversion SVN, naturale successore di CVS, ormai considerato superato. E' uno
strumento di sviluppo utile per gestire il lavoro collaborativo di più persone in
contemporanea sullo stesso progetto.
Il funzionamento è molto semplice, un Repository centralizzato contiene la "storia"
Vincenzo Masullo 566/2795
Pagina 51 di 265
del codice, l'operazione di commit permette ad ogni client di aggiornare la copia
presente nel repository, mentre il checkout permette di aggiornare la propria workingcopy con quella presente nel repository.
Figura 30: Struttura SVN
Il Repository contiene la storia del progetto, ogni client lavora sulla propria working
copy e successivamente può aggiornare la versione nel repository (commit ).
Figura 31: Operazione di Commit
Vincenzo Masullo 566/2795
Pagina 52 di 265
Uno dei client effettua l'operazione di commit ( aggiornamento ) della versione del
codice sorgente.
Figura 32: Operazione di Check-out
Un client effettua l'aggiornamento della propria working-copy scaricando dal
repository l'ultima versione del codice aggiornato ( check-out ).
Nell'appendice è allegata la guida per l'installazione e la configurazione di SVN
Subversion su Debian, con una introduzione dei comandi principali. ( par. 7.3.4 )
Vincenzo Masullo 566/2795
Pagina 53 di 265
Ecco un elenco delle caratteristiche principali di Subversion :
•
comprende gran parte delle caratteristiche di cvs
•
le directory, i cambi di nome e i metadati dei file sono sotto controllo versione
•
le commit sono vere transazioni atomiche, una commit interrotta non lascia il
repository in uno stato di incoerenza
•
come Server centale si può usare il Web server Apache tramite il protocollo
WebDAV
•
il branching e il tagging sono operazioni veloci, che richiedono un tempo
indipendente dalla dimensione dei dati
•
il progetto è nativamente client/server, ed è basato su una libreria stratificata
•
il protocollo client/server invia solo le differenze in entrambe le direzioni, e
quindi i costi di comunicazione sono proporzionali alla dimensione delle
modifiche, non alla dimensione dei dati
•
i file binari sono gestiti efficientemente
•
la licenza è Open Source, simile a quella di Apache
Vincenzo Masullo 566/2795
Pagina 54 di 265
4.3.2 Mailman GNU
Il software scelto per la creazione e gestione della Mailing list è Mailman ( GNU
General Public License ), quest'ultimo assegna ad ogni mailing list una propria pagina
web e permette agli utenti di sottoscrivere, cancellare o modificare le proprie azioni
direttamente da web, senza utilizzare complicate sintassi da spedire per email.
Possiede tutte le funzioni di gestione di mailing list, contenendo un sistema integrato
di archiviazione, un gateway mail-to-news, filtri anti-spam, ecc...
Mailman è compatibile con la maggior parte dei web server, browser web e mail
server. Gira su sistemi operativi Unix-like e richiede Python 1.5.2 o successivi e il
Compilatore C.
Figura 33: Home Page Mailing-List
Vincenzo Masullo 566/2795
Pagina 55 di 265
Figura 34: Iscrizione lista Utenti Generici
Figura 35: Amministratore lista Sviluppatori
Vincenzo Masullo 566/2795
Pagina 56 di 265
Ecco un elenco della caratteristiche più importanti di Mailman :
•
amministrazione della lista basata sul web per quasi tutti i compiti inclusa la
configurazione, la moderazione e la gestione degli account degli utenti
•
iscrizione, cancellazione e configurazione da parte dell'utente basata sul web.
L'utente può disabilitare temporaneamente il suo account, selezionare la
modalità digest, nascondere il proprio indirizzo di posta elettronica agli altri
utenti, ecc...
•
home page personalizzabile per ogni mailing list
•
gestione della privacy, possibilità di avere archivi privati visibili solo ai
membri, sottoscrizione chiusa, liste non visibili all'esterno
•
gestione automatica degli indirizzi bouncing ( ossia che hanno problemi di
consegna o che sono inesistenti )
•
archivio web automatico
•
filtro anti-spam integrato
•
autorisponditore automatico
•
supporto per domini virtuali
Nell'appendice è allegata la guida per l'installazione e la configurazione di
Mailman GNU, con una breve guida per gli amministratori e gli utenti delle liste
( par. 7.3.5 )
Vincenzo Masullo 566/2795
Pagina 57 di 265
Figura 36: Deployment Diagram Mailman
Vincenzo Masullo 566/2795
Pagina 58 di 265
4.3.3 Bugzilla
Bugzilla è un "sistema di tracciamento dei difetti" o "bug tracking system".
I risultati dei tracciamenti dei difetti consentiranno ai singoli o ai gruppi di sviluppatori
di tenere traccia dei bug in sospeso nei loro prodotti in maniera efficace. La maggior
parte dei sistemi di tracciamento degli errori nei software hanno dei costi di licenza
enormi, nonostante sia "libero", Bugzilla, presenta molto caratteristiche simili, se non
migliori, rispetto ai suoi concorrenti a pagamento. Bugzilla è diventato di conseguenza
il prodotto più diffuso tra le migliaia di sviluppatori di software.
Molte aziende stanno scoprendo che aumenta la produttività, aumenta la soddisfazione
dei clienti e migliora la comunicazione tra gli sviluppatori, inoltre, può contribuire
anche ad una riduzione dei costi.
I progetti di successo, spesso, sono il frutto di un'organizzazione di sviluppo e di
comunicazione. Ecco in breve cosa può fare Bugzilla :
•
track bug e modifiche al codice
•
comunicazione tra compagni di squadra
•
presentare e rivendere la path
•
gestire QoS ( qualità del servizio )
Figura 37: Deployment Diagram Bugzilla
Vincenzo Masullo 566/2795
Pagina 59 di 265
5. Guida d'uso all'applicazione realizzata
L'applicazione WiFi Web Monitoring Portal è stata realizzata utilizzando l'IDE
Netbeans 6.9. Il codice scritto è interamente in Java, la creazione di tre pacchetti
distinti, consente all'applicazione la possibilità di essere eseguita su più piattaforme di
sistemi operativi. Tale scelta consente la compatibilità su quasi tutta la totalità delle
macchine in uso. Ecco l'elenco dettagliato per sistema operativo.
Sistemi Windows
Windows CE
Windows 95
Windows 98
Windows Me (versione 4.9)
Windows 2000 (versione 5.0)
Windows XP (versione 5.1)
Windows Server 2003 e Windows XP
Professional x64 Edition (versione 5.2)
Windows Vista e Windows Server 2008
(versione 6.0)
Windows 7 Successore di Vista
Vincenzo Masullo 566/2795
Pagina 60 di 265
Sistemi Debian
Adamantix
Aplinux
Collax
Corel Linux
Damn Small Linux
Debian JP
Demonlinux
ESware Linux
Gibraltar
grml
Impi Linux
Linex
Linuxin
Morphix
RAYS LX
Vincenzo Masullo 566/2795
Pagina 61 di 265
Stonegate
Storm Linux
Ubuntu
UCS
Xandros
Sistemi Red Hat
Cent OS
Scientific Linux
X/OS Linux
Fedora
Startcom Enterprise Linux
White Box Enterprise Linux
Vincenzo Masullo 566/2795
Pagina 62 di 265
Screen-shots dell'Applicazione realizzata
Nel paragrafi seguenti vengo illustrate le caratteristiche generali dell'Installer e il
funzionamento per le versioni realizzate.
5.1 Windows-Package
Figura 38: Windows Home Page Applicazione
Vincenzo Masullo 566/2795
Pagina 63 di 265
Figura 39: Windows Errore caricamento logo
La prima pagina dell'applicazione contiene un breve riepilogo sulla caratteristiche del
software realizzato, inoltre è necessario inserire il percorso all'immagine del logo
dell'università, il software provvederà ad effettuare i dovuti controlli sul file inserito
( estensione file, dimensione file, ecc... ). Se il controllo va a buon file l'immagine sarà
caricata sul sito web del portale, dopodichè inizia il wizard di installazione dei
pacchetti.
Vincenzo Masullo 566/2795
Pagina 64 di 265
Figura 40: Windows Logo caricato
Figura 41: Windows Installazione AppServ
Vincenzo Masullo 566/2795
Pagina 65 di 265
A questo punto viene effettuato un controllo sulla macchina. Se non è presente nessun
pacchetto appartenente alla piattaforma LAMP, si procede all'installazione del
pacchetto AppServ, quest'ultimo include Apache2-Php5-Mysql, rappresenta un'ottima
soluzione per sistemi windows ( il pacchetto è free-ware ).
Figura 42: Windows AppServ non installato
Vincenzo Masullo 566/2795
Pagina 66 di 265
Figura 43: Windows Installazione AppServ 1/2
Figura 44: Windows Installazione AppServ 2/2
Vincenzo Masullo 566/2795
Pagina 67 di 265
Figura 45: Windows Installazione cacti
Completata l'installazione di AppServ, inizia la procedura di installazione e
configurazione del sistema di monitoraggio della rete ( Cacti ). L'applicazione si
occupa di decomprimere il pacchetto di Cacti, dopodichè l'utente provvederà a
spostare tale cartella nella directory www. Digitando su un browser web il seguente
indirizzo http://localhost/cacti viene lanciato il wizard di configurazione di cacti.
Infine c'è la sezione riservata al servizio di Mailing-list, che da la possibilità agli
utilizzatori del software, di contribuire al miglioramento e all'ottimizzazione
dell'applicazione realizzata.
Vincenzo Masullo 566/2795
Pagina 68 di 265
Figura 46: Windows Mailing List 1/3
Figura 47: Windows Mailing List 2/3
Vincenzo Masullo 566/2795
Pagina 69 di 265
Figura 48: Windows Mailing List 3/3
Vincenzo Masullo 566/2795
Pagina 70 di 265
5.2 Debian-Package
Per i Sistemi Debian è prevista l'installazione dei pacchetti mediante Repository.
L'installazione e la configurazione dei singoli pacchetti ( Apache – Php – Mysql –
Cacti ) viene effettuata grazie a degli Script bash creati ad hoc.
La prima pagina dell'applicazione contiene un breve riepilogo sulla caratteristiche del
software realizzato, inoltre è necessario inserire il percorso all'immagine del logo
dell'università, il software provvederà ad effettuare i dovuti controlli sul file inserito
( estensione file, dimensione file, ecc... ). Se il controllo va a buon file l'immagine sarà
caricata sul sito web del portale, dopodichè inizia il wizard di installazione dei
pacchetti.
Figura 49: Debian Home Page Applicazione
Vincenzo Masullo 566/2795
Pagina 71 di 265
Figura 50: Debian Errore caricamento logo
Figura 51: Debian Logo caricato
Vincenzo Masullo 566/2795
Pagina 72 di 265
Una volta caricato il Logo dell'Università ( viene caricato anche sul sito web ), viene
visualizzato l'elenco delle distribuzioni per la piattaforma Debian, dopodichè viene
effettuata l'installazione e la configurazione dei singoli pacchetti.
Figura 52: Debian Selezione Sistema Operativo
Vincenzo Masullo 566/2795
Pagina 73 di 265
Figura 53: Debian Installazione Apache 1/3
Figura 54: Debian Installazione Apache 2/3
Vincenzo Masullo 566/2795
Pagina 74 di 265
Figura 55: Debian Installazione Apache 3/3
A questo punto il sistema operativo ha il compito di controllore se è installato
Apache2, in caso contrario è possibile installare il pacchetto con il supporto della
miniguida :
Vincenzo Masullo 566/2795
Pagina 75 di 265
Figura 56: Debian Supporto Miniguida
Figura 57: Debian Installazione Php5
Vincenzo Masullo 566/2795
Pagina 76 di 265
Il medesimo controllo viene effettuato anche per gli altri pacchetti ( Php – Mysql –
Cacti )
Figura 58: Debian Installazione Mysql
Vincenzo Masullo 566/2795
Pagina 77 di 265
Figura 59: Debian Installazione cacti
Vincenzo Masullo 566/2795
Pagina 78 di 265
Figura 60: Debian Mailing List 1/2
Figura 61: Debian Mailing List 2/2
Vincenzo Masullo 566/2795
Pagina 79 di 265
Figura 62: Mailman Mailing List
Figura 63: Mailman Lista Sviluppatori
Vincenzo Masullo 566/2795
Pagina 80 di 265
5.3 RedHat-Package
Anche per i Sistemi Redhat è prevista l'installazione dei pacchetti mediante
Repository.
L'installazione e la configurazione dei singoli pacchetti ( Apache – Php – Mysql –
Cacti ) viene effettuata grazie a degli Script bash creati ad hoc.
La prima pagina dell'applicazione contiene un breve riepilogo sulla caratteristiche del
software realizzato, inoltre è necessario inserire il percorso all'immagine del logo
dell'università, il software provvederà ad effettuare i dovuti controlli sul file inserito
( estensione file, dimensione file, ecc... ). Se il controllo va a buon file l'immagine sarà
caricata sul sito web del portale, dopodichè inizia il wizard di installazione dei
pacchetti.
Figura 64: Redhat Home Page Applicazione
Vincenzo Masullo 566/2795
Pagina 81 di 265
Figura 65: Redhat Errore caricamento logo
Figura 66: Redhat Logo caricato
Vincenzo Masullo 566/2795
Pagina 82 di 265
Una volta caricato il Logo dell'Università ( viene caricato anche sul sito web ), viene
visualizzato l'elenco delle distribuzioni per la piattaforma Debian, dopodichè viene
effettuata l'installazione e la configurazione dei singoli pacchetti.
Figura 67: Redhat Selezione Sistema Operativo
Vincenzo Masullo 566/2795
Pagina 83 di 265
Figura 68: Redhat Installazione Apache 1/3
Figura 69: Redhat Installazione Apache 2/3
Vincenzo Masullo 566/2795
Pagina 84 di 265
Figura 70: Redhat Installazione Apache 3/3
Vincenzo Masullo 566/2795
Pagina 85 di 265
Il medesimo controllo viene effettuato anche per gli altri pacchetti ( Php – Mysql –
Cacti )
Figura 71: Redhat Installazione Php5
Figura 72: Redhat Installazione Mysql
Vincenzo Masullo 566/2795
Pagina 86 di 265
Figura 73: Redhat Installazione cacti
Figura 74: Redhat Wizard Cacti
Vincenzo Masullo 566/2795
Pagina 87 di 265
Figura 75: Redhat Mailing List 1/2
Figura 76: Redhat Mailing List 2/2
Vincenzo Masullo 566/2795
Pagina 88 di 265
Figura 77: Mailman Mailing List
Figura 78: Mailman Lista Utenti Generici
Vincenzo Masullo 566/2795
Pagina 89 di 265
6. Considerazioni e conclusioni
Il lavoro svolto presso il Centro SCoPE mi ha permesso, da un lato di rafforzare le
conoscenze sulla programmazione di base, in particolare l'utilizzo del linguaggio Java,
molto richiesto nel mondo del lavoro, dall'altro di acquisire concetti nuovi e allo stesso
tempo stimolanti, come il monitoraggio di sistemi di rete, la struttura di una
piattaforma LAMP e l'utilizzo di un tool che permette la creazione e la gestione di
macchine virtuali.
L'installer LAMP creato, adattato per la configurazione di sistemi di monitoraggio, con
le sue molteplici versioni, mi ha dato fonti di riflessione e di studio, sulle
caratteristiche dei sistemi operativi utilizzati, maturando in me, voglia di affrontare e
approfondire i problemi legati alla struttura interna dei vari sistemi operativi.
Il pacchetto software realizzato, oltre all'installazione della piattaforma LAMP,
utilizzatissima per le applicazioni web, è stato arricchito da una serie di applicativi,
che consentiranno in futuro di ottimizzare l'applicazione e successivamente
perfezionare il suo funzionamento ( grazie ai servizi Mailman, Subversion e Bugzilla
).
E' vero che il pacchetto installer realizzato rappresenta un'applicazione completa e con
supporto multipiattaforma, ma un'ulteriore grado di scalabiltà potrebbe essere
l'inserimento di una fase di disinstallazione, qualora l'utente abbia la necessità o
l'esigenza di rimuovere i pacchetti già installati sulla macchina ( possibili sviluppi
futuri ).
Dal punto di vista tecnico, il lavoro del Porting dell'applicazione Web Mon, mi ha
permesso di studiare in modo trasversale i problemi legati al monitoraggio di sistemi
di rete, applicati su macchine create appositamente, un'ottima soluzione per testing di
applicazioni e servizi di varie tipologie.
Vincenzo Masullo 566/2795
Pagina 90 di 265
Inoltre, poichè parte del lavoro svolto, è stato affrontato in collaborazione con altri
colleghi, questo mi ha permesso di maturare ulteriori esperienze e conoscenze nel
campo informatico e non solo.
La voglia di apprendere nuovi concetti e di acquisire una maggiore padronanza con gli
strumenti adoperati durante tutto l'iter dello stage, ha rafforzato la mia formazione in
campo informatico , pregogativa fondamentale, che mi ha consentito di portare avanti
e sviluppare serenamente questo lavoro di Tesi.
Vincenzo Masullo 566/2795
Pagina 91 di 265
7. Appendici
7.1 Diagrammi
Vengono riportati i diagrammi considerati di maggiore interesse. Tutti i diagrammi
realizzati sono forniti in allegato al presente documento, in formato elettronico.
7.1.1 UML-Use Case Diagram
Figura 79: Use Case Diagram
Vincenzo Masullo 566/2795
Pagina 92 di 265
7.1.2 UML-Component Diagram
Il diagramma riporta tutte le componenti dell'applicazione realizzata.
Figura 80: Component Diagram
Vincenzo Masullo 566/2795
Pagina 93 di 265
7.1.3 UML-Class Diagram
Sono riportati solo i Class Diagram ritenuti di maggiore interesse. Tutti i Class
Diagram realizzati solo allegati in formato elettronico al presente documento.
Figura 81: Apache Class Diagram
Vincenzo Masullo 566/2795
Pagina 94 di 265
Figura 82: Cacti Class Diagram
Figura 83: Home Class Diagram
Vincenzo Masullo 566/2795
Pagina 95 di 265
Figura 84: Mysql Class Diagram
Vincenzo Masullo 566/2795
Pagina 96 di 265
7.1.4 UML-Sequence Diagram
Installazione software e passaggio al frame successivo.
Figura 85: Installazione Software
Vincenzo Masullo 566/2795
Pagina 97 di 265
7.2 Documentazione JavaDoc
La documentazione JavaDoc è disponibile integralmente in formato elettronico.
Quest'ultima va a completare la documentazione tecnica realizzata costituita dai
Diagrammi UML e la documentazione interna. E' utile per il riuso del codice e
l'evolvibilità dell'applicazione realizzata.
Vincenzo Masullo 566/2795
Pagina 98 di 265
7.3 HowTo
Questa sezione contiene tutte le miniguide realizzate e utilizzate per installare i
pacchetti e i servizi che hanno caratterizzato lo svolgimento dell'attività di tirocinio.
Vengono proposte anche le miniguide realizzate per l'installazione dei pacchetti
presenti
nell'installer
(
rappresentano
un'alternativa
all'uso
dell'applicazione
realizzata ).
7.3.1 Debian Installer
apt-get install nomeProgramma
-- APACHE 2 --
Per installare Apache2 dal repository aprire il terminale e digitare il seguente
comando:
/> sudo apt-get install apache2
per verificare se l'installazione ha avuto successo cliccare sul seguente link
http://localhost
sarà visualizzato il seguente messaggio:
Vincenzo Masullo 566/2795
Pagina 99 di 265
it's work !
This is the default web page for this server.
The web server software is running but no content has been added, yet.
Web Server Apache2 installato con successo!
-- PHP --
Per installare php dal repository aprire il terminale e digitare il seguente comando:
/> sudo apt-get install php5 libapache2-mod-php5
riavviare apache2 pre farlo funzionare correttamente con php digitando il seguente
comando:
/> sudo /etc/init.d/apache2 restart
Restarting web server apache2
[ OK ]
... waiting
Test PHP
Creare un file di testo aprendo il terminale digitando il seguente comando:
/> sudo gedit /var/www/testphp.php
inserire la seguente riga nel file:
<?php phpinfo(); ?>
(Questo comando visualizza le info della versione php)
Digitare sul seguente link per visualizzare le info
http://localhost/testphp.php
saranno visualizzate le info sulla versione php appena installata
Vincenzo Masullo 566/2795
Pagina 100 di 265
PHP 5 Installato con successo!
-- MySQL --
Per installare MySQL dal repository aprire il terminale e digitare il seguente comando:
/> sudo apt-get install mysql-server
verrà chiesto per quale server installare mysql (selezionare apache2 ).
Poi sarà chiesto di immettere una password di root di MySQL.
---- OPZIONALE ---Per far si che gli altri computer della vostra rete vedano il server che avete creato,
dovrete prima modificare il "Bind Address". Iniziate aprendo il terminale per
modificare il file my.cnf.
gksudo gedit /etc/mysql/my.cnf
Cambiare la seguente linea
bindaddress = 127.0.0.1
E cambiate 127.0.0.1 con il vostro indirizzo IP.
---- FINE PARTE OPZIONALE ----- phpMyAdmin --
Per installare phpMyAdmin ( programma che serve a gestire i Database ) aprire il
terminale e digitare il seguente comando :
/> sudo apt-get install libapache2-mod-auth-mysql php5-mysql phpmyadmin
Dopo che questo è installato, il prossimo passo è far si che PHP lavori con MySQL.
Per fare ciò dobbiamo aprire un file che si chiama php.ini.
Per farlo digitare la seguente linea:
Vincenzo Masullo 566/2795
Pagina 101 di 265
/> sudo gedit /etc/php5/apache2/php.ini
;extension=mysql.so
In modo che assomigli a questa :
extension=mysql.so ( o anche extension=/path/to/extension/msql.so )
Infine creare un link simbolico per phpmyadmin, digitando da terminale il seguente
comando:
/> sudo ln -s /usr/share/phpmyadmin /var/www/phpmyadmin
Ora dobbiamo solo riavviare Apache 2 con il seguente comando :
/> sudo /etc/init.d/apache2 restart
LAMP è pronto per l'uso
-- Cacti --
Per installare Cacti aprire il terminale e digitare il seguente comando :
/> sudo apt-get install cacti-spine
Affinchè Cacti sia configurato correttamente è necessario che venga settato il poller,
aggiungere la seguente riga in /etc/crontab :
*/5 **** php /usr/share/cacti/site/poller.php > /dev/null 2>&1
Vincenzo Masullo 566/2795
Pagina 102 di 265
7.3.2 Redhat Installer
yum install nomeProgramma
-- APACHE 2 --
Per installare Apache2 dal repository aprire il terminale e digitare il seguente
comando:
/> yum install httpd
per verificare se l'installazione ha avuto successo cliccare sul seguente link
http://localhost
sarà visualizzata una pagina che informa l'utente che il Web Server è installato
correttamente.
Vincenzo Masullo 566/2795
Pagina 103 di 265
-- PHP --
Per installare php dal repository aprire il terminale e digitare il seguente comando:
/> yum install php
riavviare apache2 pre farlo funzionare correttamente con php digitando il seguente
comando:
/> service httpd restart
Restarting web server apache2
[ OK ]
... waiting
Test PHP
Creare un file di testo aprendo il terminale digitando il seguente comando:
/> gedit /var/www/testphp.php
inserire la seguente riga nel file:
<?php phpinfo(); ?>
(Questo comando visualizza le info della versione php)
Digitare sul seguente link per visualizzare le info
http://localhost/testphp.php
saranno visualizzate le info sulla versione php appena installata
PHP 5 Installato con successo!
Vincenzo Masullo 566/2795
Pagina 104 di 265
-- MySQL --
Per installare MySQL dal repository aprire il terminale e digitare il seguente comando:
/> yum install mysql-server mysql
verrà chiesto per quale server installare mysql (selezionare apache2 ).
Poi sarà chiesto di immettere una password di root di MySQL.
---- OPZIONALE ---Per far si che gli altri computer della vostra rete vedano il server che avete creato,
dovrete prima
modificare il "Bind Address". Iniziate aprendo il terminale per modificare il file
my.cnf.
gksudo gedit /etc/mysql/my.cnf
Cambiare la seguente linea
bindaddress = 127.0.0.1
E cambiate 127.0.0.1 con il vostro indirizzo IP.
---- FINE PARTE OPZIONALE ----- phpMyAdmin --
Per installare phpMyAdmin ( programma che serve a gestire i Database ) aprire il
terminale e digitare il seguente comando :
/> yum install phpmyadmin
Dopo che questo è installato, il prossimo passo è far si che PHP lavori con MySQL.
Per fare ciò dobbiamo aprire un file che si chiama php.ini.
Per farlo digitare la seguente linea:
/> gedit /etc/php5/apache2/php.ini
Vincenzo Masullo 566/2795
Pagina 105 di 265
;extension=mysql.so
In modo che assomigli a questa :
extension=mysql.so
( o anche extension=/path/to/extension/msql.so )
Infine creare un link simbolico per phpmyadmin, digitando da terminale il seguente
comando :
/> ln -s /usr/share/phpmyadmin /var/www/phpmyadmin
Ora dobbiamo solo riavviare Apache 2 con il seguente comando :
/> service httpd restart
LAMP è pronto per l'uso
-- Cacti --
Per installare Cacti aprire il terminale e digitare il seguente comando :
/> yum install cacti-spine
Affinchè Cacti sia configurato correttamente è necessario che venga settato il poller,
aggiungere la seguente riga in /etc/crontab :
*/5 **** php /usr/share/cacti/site/poller.php > /dev/null 2>&1
Vincenzo Masullo 566/2795
Pagina 106 di 265
7.3.3 Guida per il Porting
Porting del Portale del Monitoraggio
Le problematiche riscontrate durante la fase del porting di un portale già esistente, è
legato principalmente alla mancata conoscenza dei servizi da importare e
successivamente da configurare. Dunque prima di procedere con la fase di Porting, è
stato necessario studiare tutti i servizi e gli strumenti utilizzati, per la realizzazione del
sito web e la configurazione del sistema di monitoraggio.
L'applicazione originale era ripartita su tre macchine :
•
la wifed02 contentente i dispositivi WiFi
•
la wifed03 contenente i dispositivi wired e Joomla
•
il Server centrale che effettua il redirect alla wifed03
Vincenzo Masullo 566/2795
Pagina 107 di 265
Inoltre poichè l'applicazione è supportata anche da una sezione che si occupa di fornire
le Statistiche dei dispositivi WiFi, è stato necessario caricare il DataServer sulla
macchina wifed02 e il DataClient sulla macchina wifed03.
Una volta familiarizzato con lo strumento di monitoraggio, nella fattispecie Cacti, in
particolare effettuando alcuni test sui dispositivi presenti nel Centro SCoPE,
opportunamente sbloccati, è stato possibile analizzare e capire dettagliatamente come è
stata implementata e realizzata l'applicazione WebMon.
Si è scelto di importare tutto su un unico Server su cui è installato VMware
Workstation, su cui girano le macchine virtuali che contengono la gestione dei
dispositivi wifi, wired e le statistiche della wifi. Il Server è un INTEL Xeon dual, con
processore da 3,6 Ghz e 3 dischi Serial ATA Western Data con controller RAID 5 da
250 Hard disk l'uno, per una capacità totale di disco pari a 750 Gb e 4 Gb di RAM.
Vincenzo Masullo 566/2795
Pagina 108 di 265
Ecco la procedura dettagliata eseguita per effettuare il porting dei dispositivi su ogni
singola macchina virtuale :
Wifed02 : Guida al Porting
La macchina in esame è stata utilizzata per effettuare il monitoraggio dei dispositivi
WiFi della rete UniNa. Una volta installati tutti i pacchetti e i servizi, e replicata la
configurazione del sistema di monitoraggio, è stato necessario creare nuovamente i
grafici oggetto di monitoraggio. I dispositivi monitorati sono sette, per un totale di 64
grafici.
Di seguito viene riportata la procedura eseguita per effettuare il Porting sulla Macchina
Virtuale :
•
installazione Ubuntu Server 10.10
Dal sito ufficiale è stato effettuato il download della Versione Server
http://www.ubuntu-it.org/Ottenere_Ubuntu/download.shtml
ed è stata creata una nuova Macchina Virtuale attraverso l'interfaccia di VMware
•
aggiornamento indice pacchetti
/> sudo apt-get update
•
installazione del pacchetto ubuntu-desktop
/> sudo apt-get install ubuntu-desktop
•
installazione della JDK ( per l'esecuzione dei file .jar )
/> sudo apt-get install sun-java6-jdk
•
installazione software LAMP
Vincenzo Masullo 566/2795
Pagina 109 di 265
•
installazione e configurazione Cacti
Per l'installazione del Software LAMP e Cacti è stato utilizzato l'installer
WiFi Web Monitoring Portal
( oggetto principale del lavoro di Tesi )
disponibile nella sezione Download del Portale del Monitoraggio
http://wifed.scope.unina.it/
Seguire la guida per lanciare l'installar e installare correttamente tutti i pacchetti.
Installati tutti i pacchetti e i servizi è necessario effettuare alcune operazioni per
replicare la configurazione dei servizi presenti sulle macchina wifed02.
Cacti conserva dati e informazioni in un database creato durante l'installazione. Oltre
alle informazioni relativa alla struttura di base di cacti, ci sono tutti i template
importati dall'esterno che devono essere integrati nel nuovo sistema. Dunque è stato
necessario effettuare una copia del database di cacti :
/> mysqldump cacti> cacti.sql
a questo punto è possibile importare il database sulla macchina virtuale :
/> mysql cacti < cacti.sql
•
convertire tutti i file della cartella "rra" in file ".xml"
/> ls -1 *.rrd | awk '{print "rrdtool dump "$1" > "$1" .xml"}' | sh -x
•
zippare i file ".xml"
Vincenzo Masullo 566/2795
Pagina 110 di 265
/> tar -czvf /rrd.tgz *.rrd.xml
•
andare sul nuovo server e convertire tutti i file ".xml" in ".rrd"
/> ls -1 *.rrd.xml | sed 's/\.xml//' | awk'{print "rrdtool restore "$1".xml "$1}'
•
effettuare il login per accedere a cacti
A questo punto, per garantire l'esecuzione degli Script Perl realizzati è necessario
installare i moduli aggiuntivi di Perl per Apache2, con il seguente comando :
/> sudo apt-get install libapache2-mod-perl2
L'ultima fase del Porting prevede la creazione di tutti i Grafici associati ai device che
costituiscono la rete WiFi.
A questo punto il Porting è completato. E' necessario semplicemente riavviare i servizi
per far partire il poller e monitorare i dispositvi da questa nuova macchina virtuale :
/> sudo /etc/init.d/apache2 start
( per avviare il webServer )
/> sudo /etc/init.d/mysql start
( per avviare mysql )
Nota 1
E' necessario anche avviare gli script per aggiornare in tempo reale le immagini dei
grafici forniti da cacti.
Nota 2
Tale guida si riferisce esculsivamente a macchine Debian in particolare Ubuntu.
Si è scelto di usare questa distribuzione, per il buon livello di affidabilità offerto e
per la stabilità di questo sistema operativo open source.
Vincenzo Masullo 566/2795
Pagina 111 di 265
Wifed03 : Guida al Porting
Sulla seguente macchina invece è stato configurato il sistema di monitoraggio per i
dispositivi wired della rete UniNa. Anche per questa macchina è stato necessario
replicare la configurazione del sistema di monitoraggio, successivamente ricreare i
grafici oggetto del monitoraggio. In dispositivi monitorati sono quattro, per un totale di
16 grafici.
Di seguito viene riportata la procedura eseguita per effettuare il Porting su Macchina
Virtuale :
•
installazione Ubuntu Server 10.10
è stata utilizzata l'immagine precedentemente scaricata ( per la wifed02 )
•
aggiornarnamento indice pacchetti
/> sudo apt-get update
•
installazione del pacchetto ubuntu-desktop
/> apt-get install ubuntu-desktop
•
installazione della JDK ( per l'esecuzione dei file .jar )
/> sudo apt-get install sun-java6-jdk
•
installazione software LAMP
•
installazione e configurazione Cacti
Anche in questo caso è stato utilizzato l'installer
WiFi Web Monitoring Portal
Vincenzo Masullo 566/2795
Pagina 112 di 265
Poichè la wifed03 contiene il sito web, è stato necessario installare Joomla.
Per l'installazione del CMS seguire la mini-guida presente nell'appendice ( par.7.3.8)
A questo punto completato l'installazione di tutti i pacchetti e i servizi, così come è
stato effettuato per la wifed02, è necessario replicare la configurazione dei servizi, in
modo tale da poter effettuare il monitoraggio dei dispositivi wired.
Cacti conserva dati e informazioni in un database creato durante l'installazione. Oltre
alle informazioni relativa alla struttura di base di cacti, ci sono tutti i template
importati dall'esterno che devono essere integrati nel nuovo sistema. Dunque è stato
necessario effettuare una copia del database di cacti :
/> mysqldump cacti> cacti.sql
a questo punto è possibile importare il database sulla macchina virtuale :
/> mysql cacti < cacti.sql
•
convertire tutti i file della cartella "rra" in file ".xml"
/> ls -1 *.rrd | awk '{print "rrdtool dump "$1" > "$1" .xml"}' | sh -x
•
zippare i file ".xml"
/> tar -czvf /rrd.tgz *.rrd.xml
•
andare sul nuovo server e convertire tutti i file ".xml" in ".rrd"
/> ls -1 *.rrd.xml | sed 's/\.xml//' | awk'{print "rrdtool restore "$1".xml "$1}'
Vincenzo Masullo 566/2795
Pagina 113 di 265
•
effettuare il login per accedere a cacti
L'ultima fase del Porting prevede la creazione di tutti i Grafici associati ai device che
costituiscono la rete wired.
A questo punto il Porting è completato. E' necessario semplicemente riavviare i servizi
per far partire il poller e monitorare i dispositvi da questa nuova macchina virtuale :
/> sudo /etc/init.d/apache2 start
( per avviare il webServer )
/> sudo /etc/init.d/mysql start
( per avviare mysql )
Nota 1
E' necessario anche avviare gli script per aggiornare in tempo reale le immagini dei
grafici di cacti.
Vincenzo Masullo 566/2795
Pagina 114 di 265
Statistiche WiFi : Guida al Porting
Poichè il Portale Web usufruisce anche di una sezione riservata alla gestione e
visualizzazione di dati statistici per i dispositivi Wifi è stato necessario effettuare il
deploy del framework che sviluppa questo compito.
Preliminarmente è necessario installare Tomcat6 sulla macchina virtuale contenente la
gestioni dei dispositivi wired.
( utilizzare la guida in allegato per l'installazione di Tomcat6 par.7.3.7 )
Il framework realizzato consta di due principali sottosistemi :
•
il sottosistema di monitoraggio per la raccolta di informazioni sugli apparati di
rete
•
il sottosistema per la definizione e la rappresentazione di statistiche
Sulla wifed02 è necessario avviare il dataServer, mentre sulla wifed03 è necessario
avviare il dataClient. Inoltre solo su quest'ultima macchina è necessario installare e
configurare Tomcat.
Vincenzo Masullo 566/2795
Pagina 115 di 265
DataServer
Per ogni server di monitoraggio ( dove è installato cacti ) è necessario avviare un
DataServer. Il contenuto della cartella con cui è distribuito il DataServer è il seguente :
•
DataServer.jar
•
server_config.dtd
•
server_config.xml
Dopo aver inserito i dati di configurazione per il server, è possibile avviare il
DataServer. Supposto che si è posizionati nella cartella in cui risiede il file .jar, è
possibile eseguire il seguente comando bash :
/> java -jar DataServer.jar > logfile &
E'possibile conservare le informazioni di log in logfile.
Per terminare il DataServer è sufficiente uccidere il relativo processo. Tramite il
comando netstat -ltup è possibile conoscere l'elenco delle porte sulle quali vi sono
processi in ascolto. Da questo elenco si può identificare il PID del DataServer.
Successivamente è sufficiente uccidere il processo con il comando kill -9 <PID> dove
<PID> è l'identificativo del processo precedentemente identificato.
Vincenzo Masullo 566/2795
Pagina 116 di 265
DataClient
Il DataClient è costituito dai seguenti files :
•
dataclient_config.dtd
•
dataclient_config.xml
•
DataClient.jar
•
rrdb.sql
Per installare il database rrdb è possibile seguire i seguenti passi :
•
effettuare il login nella CLI ( Command Line Interface ) di MySQL tramite il
comando bash :
/> mysql -u <username> -p
Dove <username> è il nome di un utente con credenziali atte alla creazione di nuovi
database ed il parametro -p richiede l'inserimento della relativa password;
•
eseguire il seguente comando per l'esecuzione dello script sql :
mysql> source "</pathname/>rrdb.sql"
Dove </pathname/> è il percorso completo al file rrdb.sql
Come per il DataServer anche per il DataClient è necessario configurare il file
dataclient_config.xml.
L'esecuzione e la terminazione del DataClient è analoga a quella del DataServer. E'
quindi possibile digitare il seguente comando bash per eseguire il DataClient :
/> java -jar DataClient.jar > logfile &
Vincenzo Masullo 566/2795
Pagina 117 di 265
7.3.4 Subversion SVN
Questa guida permette di installare e configurare un Server CVS su sistemi Debian,
completa di autenticazione base e accesso tramite web. Si è scelto di installare
Subversion, poichè è considerato il successore di CVS.
Di seguito viene riportata la procedura di installazione tramite i Repository.
Per installare Subversion digitare il seguente comando da terminale :
/> sudo apt-get install subversion libapache2-svn
in questo modo saranno installate anche le librerie SVN per apache2.
Nel caso in cui il modulo non fosse abilitato automaticamente, digitare il seguente
comando per abilitare il modulo per apache2 :
/> sudo a2enmod dav_svn
Il prossimo step è la creazione del Repository svn per Subversion :
/> sudo svnadmin create /svn
A questo punto è necessario modificare il file di configurazione per il modulo
webdav/SVN con un editor di testo :
/> sudo /etc/apache2/mods-enabled/dav_svn.conf
Vincenzo Masullo 566/2795
Pagina 118 di 265
Il parametro Location del file di configurazione sta ad indicare la directory su cui
Subversion sarà accessibile :
<Location /svn>
la linea DAV deve essere decommentata per l'abilitazione del modulo DAV
DAV svn
il parametro SVNPath contiene l'equivalente del percorso in cui è stato creato il
repository attraverso il comando svnadmin :
SVNPath /svn
Di seguito viene riportata la procedura per attivare l'autenticazione, è necessario
decommentare le seguenti righe :
AuthType basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
Per creare un utente, con i relativi permessi di accesso al repository, è sufficiente
digitare il comando :
/> sudo htpasswd -cm /etc/apache2/dav_svn.passwd username
l'opzione -c deve essere usata solo per la creazione del primo utente.
A questo punto assicurarsi che Apache abbia i permessi in scrittura sulla directory /svn
tramite il seguente comando :
/> sudo chown -R www-data:www-data /svn
Alla fine del processo di configurazione è necessario riavviare Apache :
>shell sudo /etc/init.d/apache2 restart
Vincenzo Masullo 566/2795
Pagina 119 di 265
Se si desidera che venga richiesta l'autorizzazione anche per l'accesso in sola lettura,
basterà inserire la seguente riga nel file di configurazione, sotto la linea del parametro
AuthUserFile :
Require valid-user
Comandi per Subversion SVN
•
checkout è il comando che permette di creare una working copy sulla
repository. Con questo comando è anche possibile ripristinare una vecchia
versione.
svn checkout http://hostname/repository/<nome_repository> [nome_cartella]
•
commit consente di registrare le modifiche sulla repository, è obbligatorio
specificare un commetto ( risolto bug metodo installSW ).
svn commit -m "Risolto bug metodo installSW"
•
import per importare i file nella repository.
svn import /home/webmon file:///var/svn/repository -m "Importazione iniziale"
•
info permette di leggere tutte le informazioni riguardante il server e la working
copy.
svn info
Vincenzo Masullo 566/2795
Pagina 120 di 265
•
log permette di leggere i log di tutte le revisioni o di una in particolare se
specificata con -r.
svn log [ -r <numero_revisione> ]
•
update consente di aggiornare la working copy con l'ultima versione registrata
nella repository. Con questo comando è anche possibile ripristinare una vecchia
versione.
svn update
Vincenzo Masullo 566/2795
Pagina 121 di 265
7.3.5 Mailman
Mailman è un programma open source per la gestione di discussioni elettroniche e
newsletter. Molte mailing list open source (incluse tutte le mailing list di Ubuntu )
utilizzano Mailman come software. È molto potente e facile da installare.
Installazione
Fornisce un'interfaccia web per i compiti amministrativi e per gli utenti. È quindi
richiesto apache con il supporto mod_perl. Utilizza un server mail esterno per inviare e
ricevere le email. Funziona molto bene con i seguenti server mail:
 Postfix
 Exim
 Sendmail
 Qmail
In questa guida viene descritto come installare mailman, il server web è Apache2 e il
server mail Exim.
Vincenzo Masullo 566/2795
Pagina 122 di 265
Per installare Exim4, eseguire i seguenti comandi dal prompt del terminale:
sudo apt-get install exim4
sudo apt-get install exim4-base
sudo apt-get install exim4-config
Una volta installato exim4, i file di configurazione sono salvati nella directory
/etc/exim4. In Ubuntu, in modo predefinito, i file di configurazione di exim4 sono
divisi tra vari file. È possibile modificare questo comportamento cambiando la
seguente variabile nel file /etc/exim4/update-exim4.conf:
 dc_use_split_config='true'
Mailman
Per installare mailman da terminale digitare il seguente comando:
sudo apt-get install mailman
Questo copia i file di installazione nella directory /var/lib/mailman, gli script CGI nella
directory /usr/lib/cgi-bin/application, crea l'utente list e il gruppo list. Il proprietario
del processo mailman sar
Configurazione
Questa sezione assume che le applicazioni Mailman, apache2 e exim4 siano state
installate con successo. Ora è necessario configurarle.
Vincenzo Masullo 566/2795
Pagina 123 di 265
Apache2
Una volta installato apache2, è possibile aggiungere le seguenti righe al file
/etc/apache2/apache2.conf:
Alias /images/mailman/ "/usr/share/images/mailman/"
Alias /pipermail/ "/var/lib/mailman/archives/public/"
mailman utilizza apache2 per eseguire gli script CGI. Gli script CGI di mailman sono
installati all'interno della directory /usr/lib/cgi-bin/mailman. L'URL di mailman quindi
risulta http://hostname/cgi-bin/mailman/. È possibile apportare cambiamenti al file
/etc/apache2/apache2.conf per modificarne il comportamento.
Exim4
Una volta installato Exim4, è possibile avviare il server exim digitando il seguente
comando da terminale:
sudo apt-get /etc/init.d/exim4 start
Per poter utilizzare mailman con exim4, è necessario configurare exim4 per questo
scopo. Come precedentemente detto, in modo predefinito, exim4 utilizza file di
configurazione multipli di diversi tipi. Per maggiori informazioni fare riferimento al
sito web di Exim. Per avviare mailman è necessario aggiungere un nuovo file di
configurazione alle seguenti tipologie di configurazione:
 Main
 Transport
 Router
Exim crea un file di configurazione principale ordinando tutti questi piccoli file di
configurazione. L'ordine di questi file è molto importante.
Vincenzo Masullo 566/2795
Pagina 124 di 265
Main
Tutti i file di configurazione appartenenti al tipo main sono archiviati nella directory
/etc/exim4/conf.d/main/. È possibile aggiungere il seguente contenuto a un nuovo file
di configurazione chiamato 04_exim4-config_mailman:
# start
# Home dir for your Mailman installation -- aka Mailman's prefix
# directory.
# On Ubuntu this should be "/var/lib/mailman"
# This is normally the same as ~mailman
MM_HOME=/var/lib/mailman
#
# User and group for Mailman, should match your --with-mail-gid
# switch to Mailman's configure script. Value is normally "mailman"
MM_UID=list
MM_GID=list
#
# Domains that your lists are in - colon separated list
# you may wish to add these into local_domains as well
domainlist mm_domains=hostname.com
#
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#
# These values are derived from the ones above and should not need
# editing unless you have munged your mailman installation
#
# The path of the Mailman mail wrapper script
MM_WRAP=MM_HOME/mail/mailman
#
# The path of the list config file (used as a required file when
# verifying list addresses)
MM_LISTCHK=MM_HOME/lists/${lc::$local_part}/config.pck
# end
Vincenzo Masullo 566/2795
Pagina 125 di 265
Transport
Tutti i file di configurazione appartenenti al tipo transport sono archiviati nella
directory /etc/exim4/conf.d/transport/. È possibile aggiungere il seguente contenuto a
un nuovo file di configurazione chiamato 40_exim4-config_mailman:
mailman_transport:
driver = pipe
command = MM_WRAP \
'${if def:local_part_suffix \
{${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}} \
{post}}' \
$local_part
current_directory = MM_HOME
home_directory = MM_HOME
user = MM_UID
group = MM_GID
Router
Tutti i file di configurazione appartenenti al tipo router sono archiviati nella directory
/etc/exim4/conf.d/router/. È possibile aggiungere il seguente contenuto a un nuovo file
di configurazione chiamato 101_exim4-config_mailman:
mailman_router:
driver = accept
require_files = MM_HOME/lists/$local_part/config.pck
local_part_suffix_optional
local_part_suffix = -bounces : -bounces+* : \
-confirm+* : -join : -leave : \
-owner : -request : -admin
transport = mailman_transport
L'ordine dei file di configurazione main e transport può essere qualsiasi.
Vincenzo Masullo 566/2795
Pagina 126 di 265
L'ordine dei file di configurazione del tipo router deve essere lo stesso.
Questo particolare file deve apparire prima del file 200_exim4config_primary. Questi file contengono le stesse informazioni, ma il
primo ha la precedenza. Per maggiori informazioni fare riferimento alla
sezione «Riferimenti».
Mailman
Una volta installato mailman è possibile avviarlo digitando il seguente comando:
sudo /etc/init.d/mailman start
Quindi, è necessario creare la mailing list di base. Digitare il seguente comando per
creare la mailing list:
sudo /usr/sbin/newlist mailman
Enter the email address of the person running the list: bhuvan at ubuntu.com
Initial mailman password:
To finish creating your mailing list, you must edit your /etc/aliases (or
equivalent) file by adding the following lines, and possibly running the
`newaliases' program:
## mailman mailing list
mailman: "|/var/lib/mailman/mail/mailman post mailman"
mailman-admin: "|/var/lib/mailman/mail/mailman admin mailman"
mailman-bounces: "|/var/lib/mailman/mail/mailman bounces mailman"
mailman-confirm: "|/var/lib/mailman/mail/mailman confirm mailman"
mailman-join: "|/var/lib/mailman/mail/mailman join mailman"
mailman-leave: "|/var/lib/mailman/mail/mailman leave mailman"
mailman-owner: "|/var/lib/mailman/mail/mailman owner mailman"
mailman-request: "|/var/lib/mailman/mail/mailman request mailman"
mailman-subscribe: "|/var/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe mailman"
Hit enter to notify mailman owner..
Vincenzo Masullo 566/2795
Pagina 127 di 265
Dato che è stato configurato exim al riconoscimento di tutte le email in arrivo da
mailman, non è necessario inserire altre voci nel file /etc/aliases. Se sono state fatte
modifiche a file di configurazione, assicurarsi di riavviare i servizi modificati prima di
continuare.
Amministrazione
Si assume che sia stata fatta un'installazione di base. Gli script cgi di mailman si
trovano nella directory /usr/lib/cgi-bin/mailman/. Mailman fornisce uno strumento di
amministrazione basato sul web, per accedere alla relativa pagina, aprire con il
browser il seguente url:
http://hostname/cgi-bin/mailman/admin
La mailing list di base, mailman, comparirà in questa schermata. Facendo clic sul
nome della mailing list, verrà richiesta la password di autenticazione. Se viene inserita
la password corretta sarà possibile modificare le preferenze di amministrazione di
questa mailing list. È possibile creare una nuova mailing list usando l'utilità a riga di
comando (/usr/sbin/newlist). In alternativa, è possibile creare una nuova mailing list
usando l'interfaccia web.
Utenti
Mailman fornisce un'interfaccia web per gli utenti. Per accedere a questa pagina,
indirizzare il browser web al seguente URL:
http://hostname/cgi-bin/mailman/listinfo
La mailing list predefinita, mailman, compare a schermo. Facendo clic sul nome, viene
presentato il modulo di iscrizione. È possibile inserire il proprio indirizzo email, il
nome (opzionale) e la password per completare l'iscrizione. Viene così inviata una
email di invito all'indirizzo specificato. È possibile seguire le istruzioni contenute
nell'email per completare l'iscrizione.
Vincenzo Masullo 566/2795
Pagina 128 di 265
7.3.6 Bugzilla
Bugzilla è un bugtracker ( programma per rintracciare errori di programmazione )
general purpose ( cioè non dedicato ad un solo possibile utilizzo ) inizialmente
sviluppato e usato dalla squadra che ha prodotto Mozilla. Rilasciato come software
open source da Netscape Communications nel 1998, Bugzilla è stato adottato da varie
organizzazioni per utilizzarlo come strumento per rintracciare errori ( bugs ) per
progetti di prodotti sia open source sia proprietari.
Installazione
Prima di procedere con l'installazione è necessario controllare che sulla macchina
siano installati i seguenti pacchetti :
 Perl ( 5.8.1 o superiore )
 MySQL
 Apache2
Vincenzo Masullo 566/2795
Pagina 129 di 265
Perl
Verificare che Perl sia installato :
/> perl -v
se non è installato digitare da terminale :
/> sudo apt-get install perl
Apache2 e MySQL si possono installare utilizzando l'installer
- WiFi Web Monitoring Portal -
MySQL
E' necessario creare un utente “bugzilla” :
/> sudo useradd -d /home/bugzilla -m bugzilla
/> sudo passwd bugzilla
Creare un database con il nome “bugzilla” dando i privilegi all'utente bugzilla creato in
precedenza:
$ mysql -u root -p
mysql> create database bugzilla;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bugzilla |
+--------------------+
2 rows in set (0.00 sec)
mysql> grant all privileges on bugzilla.* to bugzilla@localhost;
Vincenzo Masullo 566/2795
Pagina 130 di 265
Bugzilla
Scaricare Bugzilla dal sito ufficiale : http://www.bugzilla.org
Estrarre il contenuto dell'archivio con il seguente comando :
/> sudo tar -xvf bugzilla-3.2.2.tar
spostare la cartella nella directory /usr/local/
/> sudo mv /download/bugzilla-3.2.2 /usr/local/
infine creare un link simbolico nella cartella /var/www/
/> sudo ln -s /usr/local/bugzilla-3.2.2 /var/www/bugzilla/
Moduli Perl
Bugzilla necessita di alcuni moduli per gli script Perl checksetup.pl . La prima cosa
che fa lo script è controllare che sia installata la versione giusta per i moduli.
Per verificare se i moduli aggiuntivi di Perl sono installati digitare il seguente
comando :
/> /usr/local/bugzilla-3.2.2 sudo ./checksetup.pl -check-modules
se non sono installati digitare il seguente comando :
/> /usr/local/bugzilla-3.2.2 sudo perl -MCPAN -e install
editare il file localconfig :
/> /usr/local/bugzilla-3.2.2 sudo gedit localconfig
cambiare il valore db_pass per l'utente “bugzilla”, inserire la password per l'utente
creato in precedenza per il database bugzilla
eseguire ancora lo script checksetup.pl
/> /usr/local/bugzilla-3.2.2 sudo ./checksetup.pl
Vincenzo Masullo 566/2795
Pagina 131 di 265
Configurare Apache2 per Bugzilla
Aggiungere la seguente direttiva nel file /etc/apache2/apache2.conf
Controllo installazione
Riavviare il webServer con il seguente comando :
/> sudo /etc/init.d/apache2 restart
al seguente indirizzo è possibile effettuare il login a Bugzilla :
http://localhost/bugzilla3/
Vincenzo Masullo 566/2795
Pagina 132 di 265
7.3.7 Tomcat
Apache Tomcat è un Servlet/JSP engine che non fa altro che contenere ed eseguire le
applicazioni Java Servlet e Java Server Page (JSP).
Non è l'unico Application Server per Servlet/JSP in circolazione, ma di sicuro è libero
ed è il contenitore di servlet utilizzato nell'implementazione ufficiale di riferimento per
il Java Servlet e le tecnologie Java Server Page sviluppate dalla Sun Microsystems.
Questa guida servirà ad installare Apache Tomcat utilizzando i pacchetti precompilati
di Ubuntu prelevabili dal repository Universe.
Accertarsi preliminarmente che siano installati i pacchetti java jre e jdk, in caso
contrario digitare il seguente comando :
/> sudo apt-get install sun-java6-jdk
A questo punto è possibile installare tomcat6 digitando il seguente comando da
terminale :
/> sudo apt-get install tomcat6
Creare uno script per init.d per fa si che il demone di tomcat venga attivato all'avvio o
comunque dia la possibilità di avviarlo, arrestarlo e riavviarlo.
Crearlo in /etc/init.d/tomcat con l'editor di testo preferito e copiare quanto segue :
Vincenzo Masullo 566/2795
Pagina 133 di 265
#!/bin/bash
#
# Startup script for the Tomcat server
#
# chkconfig: - 83 53
# description: Starts and stops the Tomcat daemon.
# processname: tomcat
# pidfile: /var/run/tomcat.pid
# See how we were called.
case $1 in
start)
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-sun/
export CLASSPATH=/usr/local/tomcat/lib/servlet-api.jar
export CLASSPATH=/usr/local/tomcat/lib/jsp-api.jar
export JRE_HOME=/usr/lib/jvm/java-1.6.0-sun/
echo "Tomcat is started"
sh /usr/local/tomcat/bin/startup.sh
;;
stop)
export JRE_HOME=/usr/lib/jvm/java-1.6.0-sun/
sh /usr/local/tomcat/bin/shutdown.sh
echo "Tomcat is stopped"
;;
restart)
export JRE_HOME=/usr/lib/jvm/java-1.6.0-sun/
sh /usr/local/tomcat/bin/shutdown.sh
echo "Tomcat is stopped"
sh /usr/local/tomcat/bin/startup.sh
echo "Tomcat is started"
;;
*)
echo "Usage: /etc/init.d/tomcat start|stop|restart"
;;
esac
exit 0
A questo punto è necessario dare i giusti permessi al file e renderlo eseguibile :
/> sudo chmod 775 /etc/init.d/tomcat
Avviare tomcat con il seguente comando :
/> sudo /etc/init.d/tomcat start
Se la configurazione è stata effettuata correttamente puntando all'indirizzo
http://localhost:8080 si dovrebbe avere la pagina di benvenuto di tomcat.
Vincenzo Masullo 566/2795
Pagina 134 di 265
Per amministrare Tomcat è necessario attivare Tomcat Manager. Per farlo basta
seguire questi semplici passi:
Aprire il file /usr/share/tomcat/conf/tomcat-users.xml con l'editor di testo preferito e
aggiungere l'utente (o gli utenti) con i ruoli di admin e manager.
Per creare i ruoli inserire tra i tag «<tomcat-users> ... </tomcat-users>»:
<role rolename="manager"/>
<role rolename="admin"/>
mentre per creare l'utente con i ruoli di admin e manager, inserire:
<user username="YOUR USERNAME " password="YOUR PASSWORD"
roles="admin,manager"/>
Per dare all'utente un unico ruolo, come admin, basta inserirne solo uno:
<user username="YOUR USERNAME " password="YOUR PASSWORD"
roles="admin"/>
Per accedere al pannello di controllo di tomcat manager digitare il seguente indirizzo
http://localhost:8080/manager con le credenziali appena create.
Vincenzo Masullo 566/2795
Pagina 135 di 265
7.3.8 Joomla
Per installare Joomla scaricare il file di Joomla dal sito ufficiale di Joomla :
http://www.joomla.it/
decomprimere il file in una cartella di nome joomla nel seguente
percorso /var/www/joomla dopodichè è possibile effettuare il setup di joomla
cliccando sul seguente link
http://localhost/joomla/
N.B. prima di effettuare il setup di joomla creare un database per Joomla, le
informazioni del database saranno richieste durante il setup di joomla
Accedere quindi a MySQL come amministratore da terminale:
/> mysql -u root -p
una volta effettuato l'accesso a MySQL è possibile creare il database :
/> CREATE DATABASE joomladatabase ;
Fatto questo, occorre creare l’utente che abbia accesso a questo database:
/> GRANT ALL on joomladatabase .* TO ’ utentejoomla ’@ ’ localhost
’IDENTIFIED BY ’ passwordjoomla ’;
Il comando significa “Permetti tutto quanto, in ogni tabella del database joom
ladatabase, all’utente locale utentejoomla, indentificato dalla password specificata”.
Gli apici vanno conservati, quindi se l’utente è per esempio gianni, bisogna scrivere
Vincenzo Masullo 566/2795
Pagina 136 di 265
’gianni’@’localhost’.
Per uscire da MySQL digitare il seguente comando :
/> quit
e si va nella pagina d’installazione di joomla digitando
http://localhost/joomla
Partirà in questo modo la canonica procedura d’installazione di joomla.
Vincenzo Masullo 566/2795
Pagina 137 di 265
7.4 Codice Sorgente
Di seguito vengono riportate tutte le classi implementate suddivise per pacchetti.
7.4.1 Debian-Package
7.4.1.1 Apache.java
package Debian_Version;
import
import
import
import
import
import
java.awt.event.WindowEvent;
java.awt.event.WindowListener;
java.io.File;
java.io.IOException;
java.util.logging.*;
javax.swing.*;
/**
*
* Classe per l'installazione di Apache2 ( JFrame Form )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Apache extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
private String so;
private String percorso;
( già settato )
private String home;
esecuzione del file .jar
Utility u=new Utility();
// eventuali messaggi di errore
// sistema operativo
// percorso inserito dell'utente
// contiene la directory di
// istanzio oggetto utility
/**
*
* Crea un oggetto Apache ( JFrame Form )
*
* @param so
* sistema operativo
*
* @param home
* directory di esecuzione del file .jar
*
*/
public Apache(String so,String home) {
Vincenzo Masullo 566/2795
Pagina 138 di 265
super("apache2");
this.so=so;
this.home=home;
file .jar
// chiamata superclasse
// sistema operativo
// directory di esecuzione del
initComponents();
// inizializza componenti
addWindowListener(this);
// aggiunge ascoltatore
setSize(600,400);
// set dimensione frame
setLocationRelativeTo(null);
// posiziona il frame al centro
setCampo(so);
// set percorso programma
setResizable(false);
// l'utente non può ingrandire
la finestra
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
// rende visibile il frame
}
{
/**
* Gestione pressione back button
*/
private void backButtonActionPerformed(java.awt.event.ActionEvent evt)
// back button torna alla selezione tipo installazione
dispose();
OS pr= new OS(so,home);
// nasconde il frame precedente
// selezione SO
}
{
/**
* Gestione pressione next button
*/
private void nextButtonActionPerformed(java.awt.event.ActionEvent evt)
// next button
// controllo se il campo contenente il path non è vuoto
boolean c=false;
percorso=jTextFieldPercorso.getText();
if(u.isFieldEmpty(percorso)) // campo vuoto
{ m.stampaMex("Please enter the path where you installed the
program !"); }
else
{
c=u.controllo(percorso);
Vincenzo Masullo 566/2795
// controlla se il percorso esiste
Pagina 139 di 265
if ( c )
{ // true
boolean a=percorso.contains("apache2");
se il percorso contiene apache2
installato
installato
// controllo
if ( a )
{ c=true; }
// set c a true = programma
else
{ c=false; }
// set c a false = programma non
}
}
if ( c )
//
true ----> passo al programma successivo
{
dispose();
Php pr= new Php(so,home);
// nome sistema operativo
}
else
{
// false programma non installato o percorso nn corretto
// lancio messaggio di errore
m.stampaMex("Wrong path or program is not installed !");
}
}
/**
* Gestione pressione cancel button
*/
private void cancelButtonActionPerformed(java.awt.event.ActionEvent
evt) {
// cancel button
u.uscita();
}
private void
jTextFieldPercorsoActionPerformed(java.awt.event.ActionEvent evt) {
}
/**
* Gestione ComboBox
*/
private void jComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
// comboBox
JComboBox cb = (JComboBox)evt.getSource();
String risp = (String)cb.getSelectedItem();
Vincenzo Masullo 566/2795
Pagina 140 di 265
if( risp.equals("no") )
{
// se si seleziona no
// controllo se il programma è installato
percorso=jTextFieldPercorso.getText();
prelevo il contenuto del label
potrebbe modificarlo
// in questo caso
// l'utente
// la directory
reale dell'installazione è la seguente :
// percorso =
"/etc/apache2";
boolean c=u.controllo(percorso);
percorso esiste
// controlla se il
if ( c )
{
m.stampaMex("The program is already installed !");
cb.setSelectedItem("yes"); //settaggio del comboBox a Si
}
else
{
try {
installSW();
installare il software
// si da all'utente la possibilità di
// effettua il controllo del sistema
operativo
cb.setSelectedItem("yes");
//settaggio del
comboBox "yes"
} catch (IOException ex) {
Logger.getLogger(Apache.class.getName()).log(Level.SEVER
E, null, ex);
}
}
}
}
/**
* Installazione del Software
* Lancia lo Script apache2.sh che si occupa di lanciare i comandi
Vincenzo Masullo 566/2795
Pagina 141 di 265
bash per installare il pacchetto di apache2
* e tutte le sue dipendenze. Inoltre lancia la Miniguida Debian.pdf (
utilizzando evince per aprire il documento ).
* La Guida è indispensabile all'utente per installare i Servizi.
*
*/
public void installSW() throws IOException
{
// conferma installazione
int risultato = JOptionPane.showConfirmDialog(this,"You want to
install apache2 on your
system ?","Install",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSA
GE);
if (risultato == JOptionPane.OK_OPTION)
{
// controllo il sistema operativo e lancio installazione
// debian apt-get install
// installo apache2
Process theProcess=null;
try
{
// lancio installazione apache
File s = new File (home,"risorse/script");
Runtime exec = Runtime.getRuntime();
exec.exec("gnome-terminal -x bash -c
"+s.getAbsolutePath()+"/apache2.sh;bash"); // lancio script che effettua
l'installazione del pacchetto
System.out.println(s); // test
// lancio miniguida con evince ( .pdf )
// operazione effettuata per far lanciare la guida,
il pacchetto può essere eseguito in qualsiasi
// posizione su qualsiasi macchina
File f = new File (home,"risorse/Guide");
theProcess = Runtime.getRuntime().exec("evince
file://" + f.getAbsolutePath() + "/Debian.pdf");
System.out.println(f); // test
apt-get install");
System.out.println("Installo Apache x Debian con
// test
}
catch(IOException e)
{
System.err.println("Error on exec() method");
e.printStackTrace();
Vincenzo Masullo 566/2795
Pagina 142 di 265
}
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
});
}
}
// Variables declaration - do not modify
private javax.swing.JButton backButton;
private javax.swing.JButton cancelButton;
private javax.swing.JComboBox jComboBox;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel6;
private javax.swing.JTextField jTextFieldPercorso;
private javax.swing.JTextField jTextFieldType;
private javax.swing.JButton nextButton;
// End of variables declaration
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
public void windowOpened(WindowEvent we) {
Vincenzo Masullo 566/2795
Pagina 143 di 265
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
/**
* Set percorso programma
*
* @param so
* sistema operativo
*/
public void setCampo(String so) {
if ( so.equals("Debian"))
{ jTextFieldPercorso.setText("/etc/apache2"); }
percorso installazione software ( apache )
// settaggio
}
}
Vincenzo Masullo 566/2795
Pagina 144 di 265
7.4.1.2 BrowserLaunch.java
package Debian_Version;
import javax.swing.JOptionPane;
import java.util.Arrays;
/**
*
* Lanciatore di Browser per Java
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class BrowserLaunch {
static final String[] browsers = { "google-chrome", "firefox", "opera",
"epiphany", "konqueror", "conkeror", "midori", "kazehakase",
"mozilla" };
static final String errMsg = "Error attempting to launch web browser";
/**
* Apre la pagina web ( URL ) sul Browser predefinito
*
* @param url
* indirizzo
*
*/
public static void openURL(String url) {
try { //attempt to use Desktop library from JDK 1.6+
Class<?> d = Class.forName("java.awt.Desktop");
d.getDeclaredMethod("browse", new Class[]
{java.net.URI.class}).invoke(
d.getDeclaredMethod("getDesktop").invoke(null),
new Object[] {java.net.URI.create(url)});
//above code mimicks: java.awt.Desktop.getDesktop().browse()
}
catch (Exception ignore) { //library not available or failed
String osName = System.getProperty("os.name");
try {
if (osName.startsWith("Mac OS")) {
Class.forName("com.apple.eio.FileManager").getDeclaredMethod
(
"openURL", new Class[] {String.class}).invoke(null,
new Object[] {url});
}
else if (osName.startsWith("Windows"))
Runtime.getRuntime().exec(
"rundll32 url.dll,FileProtocolHandler " + url);
else { //assume Unix or Linux
String browser = null;
Vincenzo Masullo 566/2795
Pagina 145 di 265
for (String b : browsers)
if (browser == null && Runtime.getRuntime().exec(new
String[]
{"which", b}).getInputStream().read() != -1)
Runtime.getRuntime().exec(new String[] {browser = b,
url});
if (browser == null)
throw new Exception(Arrays.toString(browsers));
}
}
catch (Exception e) {
JOptionPane.showMessageDialog(null, errMsg + "\n" +
e.toString());
}
}
}
}
7.4.1.3 Cacti.java
package Debian_Version;
import
import
import
import
import
import
import
java.awt.event.WindowEvent;
java.awt.event.WindowListener;
java.io.File;
java.io.IOException;
javax.swing.JComboBox;
javax.swing.JFrame;
javax.swing.JOptionPane;
/**
*
* Classe per l'installazione di Cacti ( JFrame Form )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Cacti extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
public String so;
private String type;
oppure Xampp )
private String percorso;
private String home;
file .jar
Utility u=new Utility();
Vincenzo Masullo 566/2795
// eventuali messaggi di errore
// sistema operativo
// tipo installazione ( single
// percorso inserito dell'utente
// percorso di esecuzione del
// istanzio oggetto utility
Pagina 146 di 265
/**
*
* Crea un oggetto Cacti ( JFrame Form )
*
* @param so
* sistema operativo
*
* @param home
* percorso esecuzione file .jar
*
*/
public Cacti(String so,String home) {
super("cacti");
this.so=so;
this.home=home;
// chiamata superclasse
// sistema operativo
// percorso esecuzione file
.jar
initComponents();
addWindowListener(this);
setSize(600,400);
setLocationRelativeTo(null);
//
//
//
//
inizializza componenti
aggiunge ascoltatore
set dimensione frame
posiziona il frame al
centro
setCampo(so);
// set percorso programma
setResizable(false);
// l'utente non può
ingrandire la finestra
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
// rende visibile il frame
}
/**
* Gestione pressione cancel button
*/
private void cancelButtonActionPerformed(java.awt.event.ActionEvent
evt) {
// cancel button
u.uscita();
}
{
/**
* Gestione pressione next button
*/
private void nextButtonActionPerformed(java.awt.event.ActionEvent evt)
// next button
percorso=jTextFieldPercorso.getText();
boolean c=false;
if(u.isFieldEmpty(percorso))
Vincenzo Masullo 566/2795
Pagina 147 di 265
{ m.stampaMex("Please enter the path where you installed the
program !"); }
else
{ c=u.controllo(percorso);
if ( c )
{
// true
boolean a=percorso.contains("cacti");
il percorso contiene cacti
if ( a )
{ c=true; }
else
{ c=false; }
// controllo se
// set c a true
// set c a false
}
}
if ( c )
{
dispose();
Mailing pr=new Mailing();
mailing-list
}
else
// passo alla schermata della
{ // lanciare messaggio di errore
m.stampaMex("Wrong path or program is not installed !");
}
}
/**
* Gestione ComboBox
*/
private void jComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
JComboBox cb = (JComboBox)evt.getSource();
String risp = (String)cb.getSelectedItem();
if( risp.equals("no") )
{
// controllo se il programma è installato
percorso=jTextFieldPercorso.getText();
// in questo caso
prelevo il contenuto del label
Vincenzo Masullo 566/2795
// l'utente potrebbe
Pagina 148 di 265
modificarlo
// la directory reale
dell'installazione è la seguente :
// percorso =
"/etc/cacti";
boolean c=u.controllo(percorso);
esiste
// controlla se il percorso
if ( c )
{
m.stampaMex("The program is already installed !");
cb.setSelectedItem("yes"); //settaggio del comboBox a Si
}
else
{
installSW();
}
}
cb.setSelectedItem("yes");
//settaggio del comboBox a Si
}
private void
jTextFieldPercorsoActionPerformed(java.awt.event.ActionEvent evt) {
}
/**
* Installazione del Software
* Lancia lo Script cacti.sh che si occupa di lanciare i comandi bash
per installare il pacchetto di cacti
* e tutte le sue dipendenze. Inoltre lancia la Miniguida Debian.pdf (
utilizzando evince per aprire il documento ).
* La Guida è indispensabile all'utente per installare i Servizi.
*
*/
public void installSW()
{
int risultato = JOptionPane.showConfirmDialog(this,"You want to
install cacti on your
system ?","Install",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSA
GE);
if (risultato == JOptionPane.OK_OPTION)
{
// installo cacti con apt-get install
Process theProcess=null;
Vincenzo Masullo 566/2795
Pagina 149 di 265
try
{
// lancio installazione cacti-spine
File s = new File (home,"risorse/script");
Runtime exec = Runtime.getRuntime();
exec.exec("gnome-terminal -x bash -c " +
s.getAbsolutePath() +"/cacti.sh;bash");
System.out.println(s); // test
// lancio miniguida installazione
File f = new File (home, "risorse/Guide");
theProcess = Runtime.getRuntime().exec("evince
file://" +f.getAbsolutePath() +"/Debian.pdf");
System.out.println(f);
/ test
System.out.println("Installo Cacti x
Debian");
// test
}
/
catch(IOException e)
{
System.err.println("Error on exec() method");
e.printStackTrace();
}
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
});
}
}
// Variables declaration - do not modify
private javax.swing.JButton backButton;
private javax.swing.JButton cancelButton;
private javax.swing.JComboBox jComboBox;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel8;
Vincenzo Masullo 566/2795
Pagina 150 di 265
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel10;
private javax.swing.JPanel jPanel11;
private javax.swing.JPanel jPanel14;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JPanel jPanel6;
private javax.swing.JPanel jPanel7;
private javax.swing.JPanel jPanel8;
private javax.swing.JTextField jTextFieldPercorso;
private javax.swing.JTextField jTextFieldType;
private javax.swing.JButton nextButton;
// End of variables declaration
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
public void windowOpened(WindowEvent we) {
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
/**
* Set percorso programma
Vincenzo Masullo 566/2795
Pagina 151 di 265
*
* @param so
* sistema operativo
*
*/
public void setCampo(String so) {
if ( so.equals("Debian"))
{ jTextFieldPercorso.setText("/etc/cacti"); }
percorso installazione software ( cacti )
// settaggio
}
}
7.4.1.4 Home.java
package Debian_Version;
import
import
import
import
import
java.awt.Image;
java.awt.event.WindowEvent;
java.awt.event.WindowListener;
javax.swing.ImageIcon;
javax.swing.JFrame;
/**
* Classe per l'home page dell'Applicazione ( JFrame Form )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Home extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
private boolean up=false;
)
private String sistemaO;
private String home;
viene lanciato il file .jar )
private Boolean error=false;
Utility u=new Utility();
// eventuale messaggio di errore
// flag upload logo ( true / false
// nome sistema operativo
// directory di esecuzione ( dove
// errore sistema operativo
// istanzio oggetto utility
/**
* Crea un oggetto Home ( JFrame Form )
*
*/
Vincenzo Masullo 566/2795
Pagina 152 di 265
public Home() {
centro
super("Setup");
initComponents();
addWindowListener(this);
setSize(700,470);
setLocationRelativeTo(null);
//
//
//
//
//
chiamata superclasse
inizializza componenti
aggiunge ascoltatore
set dimensione frame
posiziona il frame al
rilevaSO();
// String
s=System.getProperty("os.name");
--- rilevamento SO ---this.up=false;
// flag inserimento LOGO
università ( true / false )
backButton.setEnabled(false);
// back button non cliccabile
setCampo(sistemaO);
// setta il campo che
contiene il percorso del logo
setResizable(false);
// l'utente non può
ingrandire la finestra
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
// rende visibile il frame
}
/**
* Gestione pressione next button
*/
private void nextButtonActionPerformed(java.awt.event.ActionEvent evt)
{
if (error == true )
{
// messaggio sistema operativo incompatibile
m.stampaMex("Incompatible Operating System !");
dispose();
}
else
{
// permette di andare alla pagina del SO controllando se è stato
effettuato l'upload del logo
if (up == false)
// flag upload non effettuato
{
m.stampaMex("Please click UPLOAD for insert the picture !"); //
messaggio che invita a cliccare UPLOAD
}
else
{
Vincenzo Masullo 566/2795
Pagina 153 di 265
dispose();
selezioneSO(sistemaO);
// nome del sistema operativo
}
}
}
/**
* Gestione pressione cancel button
*/
private void cancelButtonActionPerformed(java.awt.event.ActionEvent
evt) {
u.uscita();
}
/**
* Gestione pressione upload button
*/
private void uploadButtonActionPerformed(java.awt.event.ActionEvent
evt) {
boolean c=false;
String percorso=jTextFieldLogo.getText();
presente nel campo
System.out.println(percorso);
// prendo il percorso
// test stampa percorso
if (error == true )
{
// messaggio sistema operativo incompatibile
m.stampaMex("Incompatible Operating System !");
dispose();
}
else
{
if(u.isFieldEmpty(percorso))
{ // campo vuoto
m.stampaMex("Please enter the path of the picture !");
esiste
else
{ c=u.controlloFile(percorso);
}
}
// controllo se il file
if ( c )
{
// effettuo controlli sul file inserito nel percorso
Image img = new ImageIcon(percorso).getImage();
Vincenzo Masullo 566/2795
Pagina 154 di 265
int width = img.getWidth(null);
int height = img.getHeight(null);
System.out.println(width);
System.out.println(height);
percorso.toLowerCase();
// test
// test
// controllo dimensione file max 200*200
if (( width<= 200 ) && ( height <= 200 ))
{
// controllo estensione file ( tipo )
if (percorso.endsWith(".gif") ||
percorso.endsWith(".png") || percorso.endsWith(".jpg"))
{
jLabel2.setIcon(new
javax.swing.ImageIcon(percorso));
// inserisco LOGO
up=true; // flag immagine inserita
jPanel4.setVisible(false);
System.out.println("Immagine Inserita OK");
messaggio test
}
else
{
m.stampaMex(" ERROR exension file !");
//
}
//
}
//
estensione errata
}
else
{
m.stampaMex(" ERROR The file is too big !");
immagine troppo grande
}
else
{
// lanciare messaggio di errore
m.stampaMex("Wrong path or file is not exists !");
file nn trovato
//
}
}
}
private void jTextFieldLogoActionPerformed(java.awt.event.ActionEvent
evt) {
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
Vincenzo Masullo 566/2795
Pagina 155 di 265
}
}
});
// Variables declaration - do not modify
private javax.swing.JButton backButton;
private javax.swing.JButton cancelButton;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabelCountFrame;
private javax.swing.JLabel jLabelTitle;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextField jTextFieldLogo;
private javax.swing.JTextPane jTextPaneMenu;
private javax.swing.JButton nextButton;
private javax.swing.JButton uploadButton;
// End of variables declaration
/**
* Set campo per il LOGO dell'Università
*
* @param so
* sistema operativo
*/
public void setCampo(String so) {
}
if ( so.equals("Linux"))
{ jTextFieldLogo.setText("/var/www/joomla/images/logoUnina.gif");
// settaggio percorso immagine
else
{
// se il sistema non è linux lancio messaggio errore
jTextFieldLogo.setText("Incompatible Operating System");
this.error=true;
}
}
/**
* Rileva il Sistema Operativo in uso, s contiene il nome del Sistema
Operativo
Vincenzo Masullo 566/2795
Pagina 156 di 265
*/
public void rilevaSO()
{
//
****
modificare qua ****
per effettuare i test sui sistemi operativi
// sistemaO contiene il nome del sistema operativo in uso
this.sistemaO=System.getProperty("os.name");
// --rilevamento reale ---// nel caso di ubuntu s=Linux
// sistemaO="win";
this.home=System.getProperty("user.dir");
directory di esecuzione del file .jar
System.out.println(home);
esecuzione
System.out.println(sistemaO);
nome completo
//
contiene la
//
test directory di
//
test stampo il
}
/**
* Lancia il JFrame OS, che visualizza l'elenco dei Sistemi Operativi
per quella distribuzione
*
* @param sistemaO
* sistema operativo
*/
public void selezioneSO(String sistemaO)
{
// ------ LINUX SO ----if ( sistemaO.equals("Linux") )
{
// lancio il frame per la selezione del SO
OS pr=new OS("Linux",home);
}
}
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*/
public void windowClosing(WindowEvent we) {
u.uscita();
Vincenzo Masullo 566/2795
Pagina 157 di 265
}
public void windowOpened(WindowEvent we) {
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
}
7.4.1.5 Mailing.java
package Debian_Version;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
/**
*
* Classe per consentire il servizio di mailing list ( mailman ) ( JFrame
Form )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Mailing extends JFrame implements WindowListener {
Utility u=new Utility();
Messaggio m=new Messaggio("0");
// eventuali messaggi di errore
/**
Vincenzo Masullo 566/2795
Pagina 158 di 265
*
* Costruttore della Classe Mailing ( JFrame Form )
*
*/
public Mailing() {
super("mailing list");
initComponents();
addWindowListener(this);
setSize(650,410);
setLocationRelativeTo(null);
//
//
//
//
inizializza componenti
aggiunge ascoltatore
set dimensione frame
posiziona il frame al
centro
setResizable(false);
// l'utente non può
ingrandire la finestra
setVisible(true);
// rende visibile il frame
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
private void noButtonActionPerformed(java.awt.event.ActionEvent evt) {
u.uscita();
}
private void yesButtonActionPerformed(java.awt.event.ActionEvent evt) {
// in questo punto va gestita la comunicazione con il Server di
mailmman
// per inserire l'università nella Mailing list
// tale sistema CVS consente la condivisione del codice in
esame, tutti gli utenti
// presenti nella lista possono partecipare al miglioramento e
al svilutto del software.
MyApp my = new MyApp("Mailman");
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
m.stampaMex("Thanks for collaboration");
dispose();
}
/**
* @param args the command line arguments
Vincenzo Masullo 566/2795
Pagina 159 di 265
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
});
}
}
public void windowOpened(WindowEvent we) {
}
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JPanel jPanel1;
Vincenzo Masullo 566/2795
Pagina 160 di 265
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextPane jTextPaneMenu;
private javax.swing.JButton noButton;
private javax.swing.JButton yesButton;
// End of variables declaration
}
7.4.1.6 Main.java
package Debian_Version;
/**
*
* Classe che istanzia oggetti di tipo Home
*
* @version 1.0
* @author Vincenzo Masullo
*
*/
public class Main {
public static void main(String[] args) {
Home h=new Home();
// Crea un istanza di Home
}
7.4.1.7 Messaggio.java
package Debian_Version;
import javax.swing.JOptionPane;
/**
*
* Classe che lancia i Messaggi di Errore e altre comunicazioni all'utente
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
class Messaggio {
String codice;
/**
*
Vincenzo Masullo 566/2795
Pagina 161 di 265
* @param cod
*
*
*/
public Messaggio(String cod){
codice=cod;
}
/**
* Stampa messaggio di errore
*
* @param messaggio
* messaggio di errore
*/
void stampaMex(String messaggio){
JOptionPane.showMessageDialog(null, messaggio, "Warning",
JOptionPane.INFORMATION_MESSAGE);
}
}
7.4.1.8 MyApp.java
package Debian_Version;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
/**
* Lancia il frame che permette di lanciare il Browser ( JFrame Form )
* ( usato per le mailing list )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class MyApp extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
private String software;
// eventuali messaggi di errore
/**
* Costruttore della classe MyApp
*
* @param
* s contiene la strunga del Software
Vincenzo Masullo 566/2795
Pagina 162 di 265
*
*/
public MyApp(String s) {
super(" Browser ");
alla superclasse
software =s;
initComponents();
inizializza componenti
addWindowListener(this);
ascoltatore
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setResizable(false);
non può ingrandire la finestra
setVisible(true);
frame visibile
setLocationRelativeTo(null);
this.pack();
setCampo(software);
}
// chiamata
// Mailman
//
// aggiungi
// l'utente
// rende il
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// in base al frame in cui ci si trova si va alla sua home page
// o inseriemo dirattamente il link per il download oppure il link
della home page
BrowserLaunch.openURL(jTextField1.getText().trim());
dispose();
}
{
private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt)
}
/**
*
* Setta l'indirizzo per il software scelto
*
* @param software
*
*/
public void setCampo(String software) {
// http://httpd.apache.org/
-- home page --if ( software.equals("Apache"))
{ //jTextField1.setText("http://apache.fastbull.org/httpd/httpd-2.
0.63.tar.gz");
jTextField1.setText("file:///home/vincent/Scrivania/Software");
Vincenzo Masullo 566/2795
Pagina 163 di 265
}
// http://www.gnu.org/software/mailman/index.html
-- home page
--
if ( software.equals("Mailman"))
{
jTextField1.setText("http://143.225.85.34/cgibin/mailman/listinfo");
// jTextField1.setText("http://localhost/cgibin/mailman/listinfo");
// m.stampaMex("Thanks for your cooperation !");
// dispose();
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
}
});
}
public void main_pr() {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JTextField jTextField1;
// End of variables declaration
public void windowClosing(WindowEvent we) {
}
dispose();
public void windowOpened(WindowEvent we) {
}
public void windowClosed(WindowEvent we) {
Vincenzo Masullo 566/2795
Pagina 164 di 265
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
}
7.4.1.9 Mysql.java
package Debian_Version;
import
import
import
import
import
import
import
java.awt.event.WindowEvent;
java.awt.event.WindowListener;
java.io.File;
java.io.IOException;
javax.swing.JComboBox;
javax.swing.JFrame;
javax.swing.JOptionPane;
/**
*
* Classe per l'installazione di Mysql ( JFrame Form )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Mysql extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
private String so;
private String percorso;
dell'utente
Vincenzo Masullo 566/2795
// eventuali messaggi di errore
// sistema operativo
// percorso inserito
Pagina 165 di 265
private String home;
file .jar
Utility u=new Utility();
// percorso di esecuzione del
/**
*
* Crea un oggetto Mysql ( JFrame Form )
*
* @param so
* sistema operativo
*
* @param home
* percorso di esecuzione del file .jar
*
*/
public Mysql(String so,String home) {
super("mysql");
this.so=so;
this.home=home;
del file .jar
// istanzio oggetto utility
centro
initComponents();
addWindowListener(this);
setSize(600,400);
setLocationRelativeTo(null);
// chiamata superclasse
// sistema operativo
// percorso di esecuzione
//
//
//
//
inizializza componenti
aggiunge ascoltatore
set dimensione frame
posiziona il frame al
setCampo(so);
// set percorso programma
setResizable(false);
// l'utente non può
ingrandire la finestra
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
// rende visibile il frame
}
private void
jTextFieldPercorsoActionPerformed(java.awt.event.ActionEvent evt) {
}
/**
* Gestione pressione cancel button
*/
private void cancelButtonActionPerformed(java.awt.event.ActionEvent
evt) {
// cancel button
u.uscita();
}
{
/**
* Gestione pressione back button
*/
private void backButtonActionPerformed(java.awt.event.ActionEvent evt)
Vincenzo Masullo 566/2795
Pagina 166 di 265
// back button
dispose();
Php pr= new Php(so,home);
// istanzio oggetto Php
}
/**
* Gestione ComboBox
*/
private void jComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
JComboBox cb = (JComboBox)evt.getSource();
String risp = (String)cb.getSelectedItem();
if( risp.equals("no") )
{
// controllo se il programma è installato
percorso=jTextFieldPercorso.getText();
prelevo il contenuto del label
modificarlo
dell'installazione è la seguente :
"/etc/mysql";
boolean c=u.controllo(percorso);
percorso esiste
//
in questo caso
//
l'utente potrebbe
//
la directory reale
//
percorso =
// controlla se il
if ( c )
{
m.stampaMex("The program is already installed !");
cb.setSelectedItem("yes"); //settaggio del comboBox a Si
}
else
{
installSW();
}
}
}
{
cb.setSelectedItem("yes");
//settaggio del comboBox a Si
/**
* Gestione pressione next button
*/
private void nextButtonActionPerformed(java.awt.event.ActionEvent evt)
Vincenzo Masullo 566/2795
Pagina 167 di 265
// next button
boolean c=false;
percorso=jTextFieldPercorso.getText();
if(u.isFieldEmpty(percorso))
{ m.stampaMex("Please enter the path where you installed the
program !"); }
else
{ c=u.controllo(percorso);
if ( c )
{
// true
boolean a=percorso.contains("mysql");
il percorso contiene mysql
if ( a )
{ c=true; }
else
{ c=false; }
// controllo se
// set c a true
// set c a false
}
}
if ( c )
{
dispose();
Cacti pr= new Cacti(so,home); // istanzio oggetto Cacti
}
else
{ // lanciare messaggio di errore
m.stampaMex("Wrong path or program is not installed !");
}
}
/**
*
* Installazione del Software
* Lancia lo Script mysql.sh che si occupa di lanciare i comandi bash
per installare il pacchetto di mysql
* e tutte le sue dipendenze. Inoltre lancia la Miniguida Debian.pdf (
utilizzando evince per aprire il documento ).
* La Guida è indispensabile all'utente per installare i Servizi.
*
*/
public void installSW()
{
int risultato = JOptionPane.showConfirmDialog(this,"You want to
install mysql on your
Vincenzo Masullo 566/2795
Pagina 168 di 265
system ?","Install",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSA
GE);
if (risultato == JOptionPane.OK_OPTION)
{
//installo MySQL con apt-get install
Process theProcess=null;
try
{
// lancio installazione apache
File s = new File (home,"risorse/script");
Runtime exec = Runtime.getRuntime();
exec.exec("gnome-terminal -x bash -c " +
s.getAbsolutePath() +"/mysql.sh;bash"); // lancio script che installa
mysql
System.out.println(s); // test
// lancio miniguida per l'installazione
File f = new File (home, "risorse/Guide");
theProcess = Runtime.getRuntime().exec("evince
file://" +f.getAbsolutePath() +"/Debian.pdf");
System.out.println(f); // test
System.out.println("Installo MySQL x Debian");
}
catch(IOException e)
{
System.err.println("Error on exec() method");
e.printStackTrace();
}
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
});
}
}
Vincenzo Masullo 566/2795
Pagina 169 di 265
// Variables declaration - do not modify
private javax.swing.JButton backButton;
private javax.swing.JButton cancelButton;
private javax.swing.JComboBox jComboBox;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel5;
private javax.swing.JPanel jPanel6;
private javax.swing.JTextField jTextFieldPercorso;
private javax.swing.JTextField jTextFieldType;
private javax.swing.JButton nextButton;
// End of variables declaration
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
public void windowOpened(WindowEvent we) {
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
Vincenzo Masullo 566/2795
Pagina 170 di 265
}
/**
* Set percorso programma in base al sistema operativo
*
* @param so
* sistema operativo
*/
public void setCampo(String so) {
if ( so.equals("Debian"))
{ jTextFieldPercorso.setText("/etc/mysql"); }
// settaggio
percorso installazione software ( mysql )
}
}
7.4.1.10 OS.java
package Debian_Version;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
/**
*
* Classe che visualizza l'elenco dei sistemi operativi della distribuzione
DEBIAN ( JFrame Form )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class OS extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
private String so;
Utility u=new Utility();
private String home;
esecuzione del file .jar
//
//
//
//
eventuali messaggi di errore
sistema operativo DEBIAN
istanzio oggetto utility
contiene la directory di
/**
* Costruttore della Classe OS
*
* @param so
Vincenzo Masullo 566/2795
Pagina 171 di 265
* sistema operativo
*
* @param home
* directory di esecuzione del file .jar
*
*/
public OS(String so,String home) {
super("Operating System");
this.so=so;
this.home=home;
del file .jar
centro
// chiamata superclasse
// sistema operativo
// directory di esecuzione
initComponents();
addWindowListener(this);
setSize(560,430);
setLocationRelativeTo(null);
//
//
//
//
inizializza componenti
aggiunge ascoltatore
set dimensione frame
posiziona il frame al
setResizable(false);
// l'utente non può
ingrandire la finestra
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
// rende visibile il frame
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel3 = new javax.swing.JPanel();
jLabel4 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel1 = new javax.swing.JLabel();
jLabelTitle = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
jTextPane1 = new javax.swing.JTextPane();
type1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE)
;
jLabel4.setText("2 of 7");
jLabel1.setIcon(new
javax.swing.ImageIcon(getClass().getResource("/immagini/debianlogo2.png"))); // NOI18N
NOI18N
jLabelTitle.setFont(new java.awt.Font("DejaVu Sans", 3, 24)); //
jLabelTitle.setText("
Operating System");
jTextPane1.setEditable(false);
jTextPane1.setText("- Adamantix\n- Aplinux\n- Collax\n- Corel
Vincenzo Masullo 566/2795
Pagina 172 di 265
Linux\n- Damn Small Linux\n- Debian JP\n- Demonlinux\n- ESware Linux\nGibraltar\n- grml\n- Impi Linux\n- Linex\n- Linuxin\n- Morphix\n- RAYS
LX\n- Stonegate\n- Storm Linux\n- Ubuntu\n- UCS\n- Xandros");
jScrollPane1.setViewportView(jTextPane1);
type1.setText("Debian");
type1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
type1ActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel3Layout = new
javax.swing.GroupLayout(jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Align
ment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.Gro
upLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addGap(189, 189, 189)
.addGroup(jPanel3Layout.createParallelGroup(javax.s
wing.GroupLayout.Alignment.LEADING)
.addComponent(type1,
javax.swing.GroupLayout.PREFERRED_SIZE, 129,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel2)))
.addGroup(jPanel3Layout.createSequentialGroup()
.addGap(83, 83, 83)
.addComponent(jLabelTitle,
javax.swing.GroupLayout.PREFERRED_SIZE, 339,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(35, 35, 35)
.addComponent(jLabel4))
.addGroup(jPanel3Layout.createSequentialGroup()
.addGap(144, 144, 144)
.addComponent(jScrollPane1,
javax.swing.GroupLayout.PREFERRED_SIZE, 225,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(jPanel3Layout.createSequentialGroup()
.addGap(174, 174, 174)
.addComponent(jLabel1)))
.addContainerGap(544, Short.MAX_VALUE))
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Align
ment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.Gro
upLayout.Alignment.LEADING)
.addComponent(jLabel4)
Vincenzo Masullo 566/2795
Pagina 173 di 265
.addGroup(jPanel3Layout.createSequentialGroup()
.addComponent(jLabelTitle)
.addGap(37, 37, 37)
.addComponent(jLabel1)
.addGap(37, 37, 37)
.addComponent(jScrollPane1,
javax.swing.GroupLayout.PREFERRED_SIZE, 76,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(32, 32, 32)
.addComponent(type1,
javax.swing.GroupLayout.PREFERRED_SIZE, 29,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(42, 42, 42)
.addComponent(jLabel2)))
.addContainerGap(1154, Short.MAX_VALUE))
);
javax.swing.GroupLayout layout = new
javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE
ADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel3,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE
ADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel3,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(182, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void type1ActionPerformed(java.awt.event.ActionEvent evt) {
this.so="Debian";
// settaggio Debian
// lancio installazione apache2
Vincenzo Masullo 566/2795
Pagina 174 di 265
dispose();
Apache pr= new Apache(so,home);
// instanzio oggetto Apache
// ( lancio il nuovo frame )
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
});
}
}
public void windowOpened(WindowEvent we) {
}
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
Vincenzo Masullo 566/2795
Pagina 175 di 265
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabelTitle;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextPane jTextPane1;
private javax.swing.JButton type1;
// End of variables declaration
}
7.4.1.11 Php.java
package Debian_Version;
import
import
import
import
import
import
import
java.awt.event.WindowEvent;
java.awt.event.WindowListener;
java.io.File;
java.io.IOException;
javax.swing.JComboBox;
javax.swing.JFrame;
javax.swing.JOptionPane;
/**
*
* Classe per l'installazione di Php ( JFrame Form )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Php extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
private String so;
private String percorso;
dell'utente
private String home;
esecuzione del file .jar
Utility u=new Utility();
// eventuali messaggi di errore
// sistema operativo
// percorso inserito
// contiene il percorso di
// istanzio oggetto utility
/**
*
* Crea un oggetto Php ( JFrame Form )
*
* @param so
* sistema operativo
*
* @param home
* percorso esecuzione file .jar
Vincenzo Masullo 566/2795
Pagina 176 di 265
*
*/
public Php(String so,String home) {
super("php5");
this.so=so;
this.home=home;
file .jar
// chiamata superclasse
// sistema operativo
// percorso esecuzione
initComponents();
// inizializza componenti
addWindowListener(this);
// aggiunge ascoltatore
setSize(600,400);
// set dimensione frame
setLocationRelativeTo(null);
// posiziona il frame al centro
setCampo(so);
// set percorso programma
setResizable(false);
// l'utente non può ingrandire
la finestra
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
// rende visibile il frame
}
/**
* Gestione pressione next button
*/
private void nextButtonActionPerformed(java.awt.event.ActionEvent evt)
{
// next button
boolean c=false;
percorso=jTextFieldPercorso.getText();
if(u.isFieldEmpty(percorso))
{ m.stampaMex("Please enter the path where you installed the
program !"); }
else
{ c=u.controllo(percorso);
if ( c )
{
// true
boolean a=percorso.contains("php5");
percorso contiene php5
if ( a )
{ c=true; }
else
{ c=false; }
// controllo se il
// set c a true
// set c a false
}
}
Vincenzo Masullo 566/2795
Pagina 177 di 265
if ( c )
{
dispose();
Mysql pr= new Mysql(so,home);
}
else
{ // lanciare messaggio di errore
m.stampaMex("Wrong path or program is not installed !");
}
}
private void
jTextFieldPercorsoActionPerformed(java.awt.event.ActionEvent evt) {
}
/**
* Gestione ComboBox
*/
private void jComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
JComboBox cb = (JComboBox)evt.getSource();
String risp = (String)cb.getSelectedItem();
if( risp.equals("no") )
{
// controllo se il programma è installato
percorso=jTextFieldPercorso.getText();
il contenuto del label
// in questo caso prelevo
// l'utente potrebbe
modificarlo
dell'installazione è la seguente :
// la directory reale
// percorso =
"/etc/php5";
boolean c=u.controllo(percorso);
percorso esiste
// controlla se il
if ( c )
{
m.stampaMex("The program is already installed !");
cb.setSelectedItem("yes");
//settaggio del comboBox
"yes"
}
else
{
installSW();
Vincenzo Masullo 566/2795
Pagina 178 di 265
}
}
cb.setSelectedItem("yes");
}
{
//settaggio del comboBox "yes"
/**
* Gestione pressione back button
*/
private void backButtonActionPerformed(java.awt.event.ActionEvent evt)
// back button
dispose();
Apache pr= new Apache(so,home);
}
/**
* Gestione pressione cancel button
*/
private void cancelButtonActionPerformed(java.awt.event.ActionEvent
evt) {
// cancel button
u.uscita();
}
private void jTextFieldTypeActionPerformed(java.awt.event.ActionEvent
evt) {
}
/**
* Installazione del Software
* Lancia lo Script php5.sh che si occupa di lanciare i comandi bash
per installare il pacchetto di php5
* e tutte le sue dipendenze. Inoltre lancia la Miniguida Debian.pdf (
utilizzando evince per aprire il documento ).
* La Guida è indispensabile all'utente per installare i Servizi.
*
*/
public void installSW()
{
int risultato = JOptionPane.showConfirmDialog(this,"You want to
install php5 on your
system ?","Install",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSA
GE);
if (risultato == JOptionPane.OK_OPTION)
{
//installo PHP con apt-get install
Vincenzo Masullo 566/2795
Pagina 179 di 265
Process theProcess=null;
try
{
// lancio installazione php
File s = new File (home,"risorse/script");
Runtime exec = Runtime.getRuntime();
exec.exec("gnome-terminal -x bash -c " +
s.getAbsolutePath() +"/php5.sh;bash"); // lancio script che installa il
pacchetto
System.out.println(s); // test
// lancio miniguida installazione
File f = new File (home, "risorse/Guide");
theProcess = Runtime.getRuntime().exec("evince
file://" +f.getAbsolutePath() +"/Debian.pdf");
System.out.println(f); // test
System.out.println("Installo PHP x Debian");
}
catch(IOException e)
{
System.err.println("Error on exec() method");
e.printStackTrace();
}
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
}
}
});
// Variables declaration - do not modify
private javax.swing.JButton backButton;
private javax.swing.JButton cancelButton;
private javax.swing.JComboBox jComboBox;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JPanel jPanel1;
Vincenzo Masullo 566/2795
Pagina 180 di 265
private javax.swing.JPanel jPanel11;
private javax.swing.JPanel jPanel2;
private javax.swing.JTextField jTextFieldPercorso;
private javax.swing.JTextField jTextFieldType;
private javax.swing.JButton nextButton;
// End of variables declaration
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
public void windowOpened(WindowEvent we) {
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
/**
* Set percorso programma
*
* @param so
* sistema operativo
*/
public void setCampo(String so) {
if ( so.equals("Debian"))
{ jTextFieldPercorso.setText("/etc/php5"); }
percorso installazione software ( php )
Vincenzo Masullo 566/2795
// settaggio
Pagina 181 di 265
}
}
7.4.1.12 Utility.java
package Debian_Version;
import java.io.File;
import javax.swing.JOptionPane;
/**
*
* La Classe Utility fornisce alcuni metodi che permettono di controllare
se i campi dei form sono vuoti
* oppure se un file esiste o meno, ad altre utility varie.
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Utility {
/**
* Controllo se il campo è vuoto
*
* @param value
* stringa da controllare
*
*/
public static boolean isFieldEmpty(String value){
if(value!=null && value.equals(""))
return true;
return false;
}
/**
* Controllo se il programma è installato
*
* @param percorso
* stringa da controllare
*
*/
public boolean controllo(String percorso)
{
String indirizzo = percorso;
boolean exists = (new File(indirizzo)).exists();
// definisco exists come booleano (true/false) e attraverso la
classe File e il methodo exists che verifica l'esistenza del file indicato
Vincenzo Masullo 566/2795
Pagina 182 di 265
if (exists) {
// se il file esiste questo controllo ritorna un valore uguale
a true
}
System.out.println("Il file esiste");
return true;
// test true
else {
System.out.println("Il file non esiste"); // test false
return false;
}
}
/**
* Controllo se è un file ( isFile )
*
* @param percorso
* stringa da controllare
*/
public boolean controlloFile(String percorso)
{
String indirizzo = percorso;
boolean isFile = (new File(indirizzo)).isFile();
// definisco exists come booleano (true/false) e attraverso la
classe File e il methodo exists che verifica l'esistenza del file indicato
if (isFile) {
// se il file esiste questo controllo ritorna un valore
uguale a true
System.out.println("Il file esiste"); // test true
return true;
}
else {
System.out.println("Il file non esiste"); // test false
return false;
}
}
/**
* Gestisce l'uscita dall'applicazione
*/
public void uscita()
{
int risultato = JOptionPane.showConfirmDialog(null,"Setup has not
completed. Are you sure want to exit ?","Setup
incomplete",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
if (risultato == JOptionPane.OK_OPTION)
System.exit(0);
Vincenzo Masullo 566/2795
Pagina 183 di 265
}
}
Vincenzo Masullo 566/2795
Pagina 184 di 265
7.4.1.13 Script-Bash
apache2.sh
#!/bin/bash
# installo web server apache2
sudo apt-get install apache2
cacti.sh
#!/bin/bash
# installo cacti-spine
sudo apt-get install cacti-spine
# settaggio del poller
cd /
sudo gedit /etc/crontab
mysql.sh
#!/bin/bash
# installo mysql-server
sudo apt-get install mysql-server
# installo phpmyadmin
sudo apt-get install libapache2-mod-auth-mysql php5-mysql phpmyadmin
# modifico il file php.ini ( seguendo la guida )
cd /
sudo gedit /etc/php5/apache2/php.ini
# creo il link simbolico
sudo ln -s /usr/share/phpmyadmin /var/www/phpmyadmin
# riavvio web server
sudo /etc/init.d/apache2 restart
php5.sh
#!/bin/bash
# installo php5
sudo apt-get install php5 libapache2-mod-php5
# riavvio web server
sudo /etc/init.d/apache2 restart
Vincenzo Masullo 566/2795
Pagina 185 di 265
# creazione e editor del file testphp.php
# si deve inserire <?php phpinfo(); ?>
( seguendo la guida )
sudo gedit /var/www/testphp.php
Vincenzo Masullo 566/2795
Pagina 186 di 265
7.4.2 Redhat-Package
7.4.2.1 Apache.java
package RedHat_Version;
import
import
import
import
import
import
java.awt.event.WindowEvent;
java.awt.event.WindowListener;
java.io.File;
java.io.IOException;
java.util.logging.*;
javax.swing.*;
/**
*
* Classe per l'installazione di Apache2 ( JFrame Form )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Apache extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
private String so;
private String percorso;
( già settato )
private String home;
file .jar
Utility u=new Utility();
// eventuali messaggi di errore
// sistema operativo
// percorso inserito dell'utente
// percorso di esecuzione del
// istanzio oggetto utility
/**
*
* Crea un oggetto Apache ( JFrame Form )
*
* @param so
* sistema operativo
*
* @param home
* percorso di esecuzione del file .jar
*/
public Apache(String so,String home) {
super("apache2");
this.so=so;
this.home=home;
Vincenzo Masullo 566/2795
// chiamata superclasse
// sistema operativo
// percorso di esecuzione del
Pagina 187 di 265
file .jar
initComponents();
// inizializza componenti
addWindowListener(this);
// aggiunge ascoltatore
setSize(600,400);
// set dimensione frame
setLocationRelativeTo(null);
// posiziona il frame al centro
setCampo(so);
// set percorso programma
setResizable(false);
// l'utente non può ingrandire
la finestra
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
// rende visibile il frame
}
/**
* Gestione pressione back button
*/
private void backButtonActionPerformed(java.awt.event.ActionEvent evt)
{
// back button torna alla selezione del sistema operativo
dispose();
OS pr= new OS(so,home);
// nasconde il frame precedente
// torna alla selezione del SO
}
/**
* Gestione pressione next button
*/
private void nextButtonActionPerformed(java.awt.event.ActionEvent evt)
{
// next button
// controllo se il campo contenente il path non è vuoto
boolean c=false;
percorso=jTextFieldPercorso.getText();
if(u.isFieldEmpty(percorso)) // campo vuoto
{ m.stampaMex("Please enter the path where you installed the
program !"); }
else
{
c=u.controllo(percorso);
// controlla se il percorso esiste
if ( c )
{ // true
boolean a=percorso.contains("httpd");
il percorso contiene httpd
Vincenzo Masullo 566/2795
// controllo se
Pagina 188 di 265
installato
installato
if ( a )
{ c=true; }
// set c a true = programma
else
{ c=false; }
// set c a false = programma non
}
}
if ( c )
// true ----> passo al programma successivo
{
dispose();
Php pr= new Php(so,home); // nome sistema operativo e
percorso esecuzione file .jar
}
else
{
// false programma non installato o percorso nn corretto
// lanciare messaggio di errore
m.stampaMex("Wrong path or program is not installed !");
}
}
/**
* Gestione pressione cancel button
*/
private void cancelButtonActionPerformed(java.awt.event.ActionEvent
evt) {
// cancel button
u.uscita();
}
private void
jTextFieldPercorsoActionPerformed(java.awt.event.ActionEvent evt) {
}
/**
* Gestione ComboBox
*/
private void jComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
// comboBox
JComboBox cb = (JComboBox)evt.getSource();
String risp = (String)cb.getSelectedItem();
if( risp.equals("no") )
{
// se si seleziona no
// controllo se il programma è installato
Vincenzo Masullo 566/2795
Pagina 189 di 265
percorso=jTextFieldPercorso.getText();
prelevo il contenuto del label
potrebbe modificarlo
// in questo caso
// l'utente
// la directory
reale dell'installazione è la seguente :
// percorso =
"/etc/apache2";
boolean c=u.controllo(percorso);
percorso esiste
// controlla se il
if ( c )
{
m.stampaMex("The program is already installed !");
cb.setSelectedItem("yes"); //settaggio del comboBox a Si
}
else
{
try {
installSW();
installare il software
// si da all'utente la possibilità di
cb.setSelectedItem("yes");
//settaggio del
comboBox "yes"
} catch (IOException ex) {
Logger.getLogger(Apache.class.getName()).log(Level.SEVER
E, null, ex);
}
}
}
}
/**
* Installazione del Software
* Lancia lo Script apache2.sh che si occupa di lanciare i comandi
bash per installare il pacchetto di apache2
* e tutte le sue dipendenze. Inoltre lancia la Miniguida RedHat.pdf (
utilizzando evince per aprire il documento ).
* La Guida è indispensabile all'utente per installare i Servizi.
*
*/
Vincenzo Masullo 566/2795
Pagina 190 di 265
public void installSW() throws IOException
{
// conferma installazione
int risultato = JOptionPane.showConfirmDialog(this,"You want to
install apache2 on your
system ?","Install",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSA
GE);
if (risultato == JOptionPane.OK_OPTION)
{
// redhat yum install
// installo apache
Process theProcess=null;
try
{
// lancio installazione apache
File s = new File (home,"risorse/script");
Runtime exec = Runtime.getRuntime();
exec.exec("gnome-terminal -x bash -c
"+s.getAbsolutePath()+"/apache2.sh;bash");
System.out.println(s); // test
// lancio miniguida con evince ( .pdf )
// operazione effettuata per far lanciare la guida,
il pacchetto può essere eseguito in qualsiasi
// posizione su qualsiasi macchina
// lancio miniguida installazione con evince
File f = new File (home,"risorse/Guide");
theProcess = Runtime.getRuntime().exec("evince
file://" +f.getAbsolutePath() +"/RedHat.pdf");
System.out.println(f); // test
System.out.println("Installo Apache x RedHat con
yum install");
// test
}
catch(IOException e)
{
System.err.println("Error on exec() method");
e.printStackTrace();
}
}
}
Vincenzo Masullo 566/2795
Pagina 191 di 265
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
}
}
});
// Variables declaration - do not modify
private javax.swing.JButton backButton;
private javax.swing.JButton cancelButton;
private javax.swing.JComboBox jComboBox;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel6;
private javax.swing.JTextField jTextFieldPercorso;
private javax.swing.JTextField jTextFieldType;
private javax.swing.JButton nextButton;
// End of variables declaration
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
public void windowOpened(WindowEvent we) {
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
Vincenzo Masullo 566/2795
Pagina 192 di 265
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
/**
* Set percorso programma
*
* @param so
* sistema operativo
*/
public void setCampo(String so) {
if ( so.equals("RedHat"))
{
jTextFieldPercorso.setText("/etc/httpd");
percorso installazione software ( httpd )
}
// settaggio
}
}
Vincenzo Masullo 566/2795
Pagina 193 di 265
7.4.2.2 BrowserLaunch.java
package RedHat_Version;
import javax.swing.JOptionPane;
import java.util.Arrays;
/**
*
* Lanciatore di Browser per Java
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class BrowserLaunch {
static final String[] browsers = { "google-chrome", "firefox", "opera",
"epiphany", "konqueror", "conkeror", "midori", "kazehakase",
"mozilla" };
static final String errMsg = "Error attempting to launch web browser";
/**
* Apre la pagina web ( URL ) sul Browser predefinito
*
* @param url
* indirizzo
*
*/
public static void openURL(String url) {
try { //attempt to use Desktop library from JDK 1.6+
Class<?> d = Class.forName("java.awt.Desktop");
d.getDeclaredMethod("browse", new Class[]
{java.net.URI.class}).invoke(
d.getDeclaredMethod("getDesktop").invoke(null),
new Object[] {java.net.URI.create(url)});
//above code mimicks: java.awt.Desktop.getDesktop().browse()
}
catch (Exception ignore) { //library not available or failed
String osName = System.getProperty("os.name");
try {
if (osName.startsWith("Mac OS")) {
Class.forName("com.apple.eio.FileManager").getDeclaredMethod
(
"openURL", new Class[] {String.class}).invoke(null,
new Object[] {url});
}
else if (osName.startsWith("Windows"))
Runtime.getRuntime().exec(
"rundll32 url.dll,FileProtocolHandler " + url);
else { //assume Unix or Linux
String browser = null;
for (String b : browsers)
Vincenzo Masullo 566/2795
Pagina 194 di 265
String[]
url});
if (browser == null && Runtime.getRuntime().exec(new
{"which", b}).getInputStream().read() != -1)
Runtime.getRuntime().exec(new String[] {browser = b,
if (browser == null)
throw new Exception(Arrays.toString(browsers));
}
}
catch (Exception e) {
JOptionPane.showMessageDialog(null, errMsg + "\n" +
e.toString());
}
}
}
}
Vincenzo Masullo 566/2795
Pagina 195 di 265
7.4.2.3 Cacti.java
package RedHat_Version;
import
import
import
import
import
import
import
java.awt.event.WindowEvent;
java.awt.event.WindowListener;
java.io.File;
java.io.IOException;
javax.swing.JComboBox;
javax.swing.JFrame;
javax.swing.JOptionPane;
/**
*
* Classe per l'installazione di Cacti ( JFrame Form )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Cacti extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
public String so;
private String percorso;
private String home;
file .jar
Utility u=new Utility();
//
//
//
//
eventuali messaggi di errore
sistema operativo
percorso inserito dell'utente
percorso esecuzione del
// istanzio oggetto utility
/**
*
* Crea un oggetto Cacti ( JFrame Form )
*
* @param so
* sistema operativo
*
* @param home
* percorso di esecuzione del file .jar
*
*/
public Cacti(String so,String home) {
super("cacti");
this.so=so;
this.home=home;
file .jar
centro
// chiamata superclasse
// sistema operativo
// percorso esecuzione del
initComponents();
addWindowListener(this);
setSize(600,400);
setLocationRelativeTo(null);
//
//
//
//
setCampo(so);
// set percorso programma
Vincenzo Masullo 566/2795
inizializza componenti
aggiunge ascoltatore
set dimensione frame
posiziona il frame al
Pagina 196 di 265
setResizable(false);
// l'utente non può
ingrandire la finestra
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
// rende visibile il frame
}
{
/**
* Gestione pressione back button
*/
private void backButtonActionPerformed(java.awt.event.ActionEvent evt)
// back button
dispose();
Mysql pr= new Mysql(so,home);
// torno al frame di mysql
}
/**
* Gestione pressione cancel button
*/
private void cancelButtonActionPerformed(java.awt.event.ActionEvent
evt) {
// cancel button
u.uscita();
}
/**
* Gestione pressione next button
*/
private void nextButtonActionPerformed(java.awt.event.ActionEvent evt)
{
// next button
percorso=jTextFieldPercorso.getText();
boolean c=false;
if(u.isFieldEmpty(percorso))
{ m.stampaMex("Please enter the path where you installed the
program !"); }
else
Vincenzo Masullo 566/2795
Pagina 197 di 265
{ c=u.controllo(percorso);
if ( c )
{
// true
boolean a=percorso.contains("cacti");
il percorso contiene cacti
if ( a )
{ c=true; }
else
{ c=false; }
// controllo se
// set c a true
// set c a false
}
}
if ( c )
{
dispose();
Mailing pr=new Mailing();
}
else
{
}
// lancio frame per le mailing-list
// lanciare messaggio di errore
m.stampaMex("Wrong path or program is not installed !");
}
/**
*
Gestione ComboBox
*/
private void jComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
JComboBox cb = (JComboBox)evt.getSource();
String risp = (String)cb.getSelectedItem();
if( risp.equals("no") )
{
// controllo se il programma è installato
percorso=jTextFieldPercorso.getText();
prelevo il contenuto del label
modificarlo
dell'installazione è la seguente :
"/etc/cacti";
Vincenzo Masullo 566/2795
// in questo caso
// l'utente potrebbe
// la directory reale
// percorso =
Pagina 198 di 265
boolean c=u.controllo(percorso);
// controlla se il percorso
esiste
if ( c )
{
m.stampaMex("The program is already installed !");
cb.setSelectedItem("yes"); //settaggio del comboBox a Si
}
else
{
installSW();
}
}
}
cb.setSelectedItem("yes");
//settaggio del comboBox a Si
private void
jTextFieldPercorsoActionPerformed(java.awt.event.ActionEvent evt) {
}
/**
* Installazione del Software
* Lancia lo Script cacti.sh che si occupa di lanciare i comandi bash
per installare il pacchetto di cacti
* e tutte le sue dipendenze. Inoltre lancia la Miniguida RedHat.pdf (
utilizzando evince per aprire il documento ).
* La Guida è indispensabile all'utente per installare i Servizi.
*
*/
public void installSW()
{
int risultato = JOptionPane.showConfirmDialog(this,"You want to
install cacti on your
system ?","Install",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSA
GE);
if (risultato == JOptionPane.OK_OPTION)
{
// Installo Cacti per RedHat
Process theProcess=null;
try
{
Vincenzo Masullo 566/2795
// installazione di Cacti
File s = new File (home,"risorse/script");
Runtime exec = Runtime.getRuntime();
Pagina 199 di 265
exec.exec("gnome-terminal -x bash -c " +
s.getAbsolutePath() +"/cacti.sh;bash");
System.out.println(s); // test
// lancio miniguida di supporto all'installazione
File f = new File (home, "risorse/Guide");
theProcess = Runtime.getRuntime().exec("evince
file://" +f.getAbsolutePath() +"/RedHat.pdf");
System.out.println(f); // test
System.out.println("Installo Cacti x RedHat");
}
catch(IOException e)
{
System.err.println("Error on exec() method");
e.printStackTrace();
}
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
});
}
}
// Variables declaration - do not modify
private javax.swing.JButton backButton;
private javax.swing.JButton cancelButton;
private javax.swing.JComboBox jComboBox;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel8;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel10;
private javax.swing.JPanel jPanel11;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JPanel jPanel7;
private javax.swing.JPanel jPanel8;
private javax.swing.JTextField jTextFieldPercorso;
private javax.swing.JTextField jTextFieldType;
private javax.swing.JButton nextButton;
// End of variables declaration
Vincenzo Masullo 566/2795
Pagina 200 di 265
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
public void windowOpened(WindowEvent we) {
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
/**
* Set percorso programma
*
* @param so
* sistema operativo
*/
public void setCampo(String so) {
if ( so.equals("RedHat"))
{ jTextFieldPercorso.setText("/etc/cacti"); }
campo /etc/cacti
// set
}
Vincenzo Masullo 566/2795
Pagina 201 di 265
}
7.4.2.4 Home.java
package RedHat_Version;
import
import
import
import
import
java.awt.Image;
java.awt.event.WindowEvent;
java.awt.event.WindowListener;
javax.swing.ImageIcon;
javax.swing.JFrame;
/**
*
* Classe per l'home page dell'Applicazione per sistemi RedHat ( JFrame
Form )
*
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Home extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
private boolean up=false;
private String sistemaO;
private String home;
.jar
private Boolean error=false;
Utility u=new Utility();
//
//
//
//
eventuale messaggio di errore
flag upload ( true / false )
nome sistema operativo
percorso di esecuzione del file
// errore sistema operativo
// istanzio oggetto utility
/**
*
* Crea un oggetto Home
*
*/
public Home() {
centro
super("Setup");
initComponents();
addWindowListener(this);
setSize(700,470);
setLocationRelativeTo(null);
//
//
//
//
//
chiamata superclasse
inizializza componenti
aggiunge ascoltatore
set dimensione frame
posiziona il frame al
rilevaSO();
// String
s=System.getProperty("os.name");
--- rilevamento SO ---this.up=false;
// flag inserimento LOGO
( true / false )
backButton.setEnabled(false);
// back button non cliccabile
Vincenzo Masullo 566/2795
Pagina 202 di 265
setCampo(sistemaO);
// setta il campo che
contiene il percorso del logo
setResizable(false);
// l'utente non può
ingrandire la finestra
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
// rende visibile il frame
}
{
/**
* Gestione pressione back button
*/
private void backButtonActionPerformed(java.awt.event.ActionEvent evt)
// back button inattivo
}
/**
* Gestione pressione next button
*/
private void nextButtonActionPerformed(java.awt.event.ActionEvent evt)
{
// permette di andare alla pagina del SO controllando se è stato
effettuato l'upload del logo
if ( error == true )
{
// messaggio sistema operativo incompatibile
m.stampaMex("Incompatible Operating System !");
dispose();
}
else{
if (up == false) // flag upload non effettuato
{
m.stampaMex("Please click UPLOAD for insert the picture !");
}
else
{
dispose();
Vincenzo Masullo 566/2795
Pagina 203 di 265
}
selezioneSO(sistemaO);
// sistema operativo
}
}
/**
* Gestione pressione cancel button
*/
private void cancelButtonActionPerformed(java.awt.event.ActionEvent
evt) {
u.uscita();
}
/**
* Gestione pressione upload button
*/
private void uploadButtonActionPerformed(java.awt.event.ActionEvent
evt) {
boolean c=false;
String percorso=jTextFieldLogo.getText();
presente nel campo
System.out.println(percorso);
// prendo il percorso
// test
if ( error == true )
{
// messaggio sistema operativo incompatibile
m.stampaMex("Incompatible Operating System !");
dispose();
}
else
{
if(u.isFieldEmpty(percorso))
{ // campo vuoto
m.stampaMex("Please enter the path of the picture !");
esiste
else
{ c=u.controlloFile(percorso);
}
}
// controllo se il file
if ( c )
{
// effettuo alcuni controlli sul file inserito
Image img = new ImageIcon(percorso).getImage();
int width = img.getWidth(null);
int height = img.getHeight(null);
Vincenzo Masullo 566/2795
Pagina 204 di 265
System.out.println(width);
System.out.println(height);
percorso.toLowerCase();
// test
// test
// controllo dimensione file max 200*200
if (( width<= 200 ) && ( height <= 200 ))
{
// controllo estensione file ( tipo )
if (percorso.endsWith(".gif") ||
percorso.endsWith(".png") || percorso.endsWith(".jpg"))
{
jLabel2.setIcon(new
javax.swing.ImageIcon(percorso));
// inserisco LOGO
up=true; // flag immagine inserita
jPanel4.setVisible(false);
System.out.println("Immagine Inserita OK");
}
estensione errata
else
{
m.stampaMex(" ERROR exension file !");
}
else
{
m.stampaMex(" ERROR The file is too big !");
immagine troppo grande
}
else
{
// lanciare messaggio di errore
m.stampaMex("Wrong path or file is not exists !");
nn trovato
}
//
}
//
// file
}
}
}
private void jTextFieldLogoActionPerformed(java.awt.event.ActionEvent
evt) {
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
});
}
Vincenzo Masullo 566/2795
Pagina 205 di 265
}
// Variables declaration - do not modify
private javax.swing.JButton backButton;
private javax.swing.JButton cancelButton;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabelCountFrame;
private javax.swing.JLabel jLabelTitle;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextField jTextFieldLogo;
private javax.swing.JTextPane jTextPaneMenu;
private javax.swing.JButton nextButton;
private javax.swing.JButton uploadButton;
// End of variables declaration
/**
* Set campo per il LOGO dell'Università
*
* @param so
* sistema operativo
*
*/
public void setCampo(String so) {
}
if ( so.equals("Linux"))
{ jTextFieldLogo.setText("/var/www/joomla/images/logoUnina.gif");
// percorso immagine da caricare
else
{
// errore nel caso in cui il sistema non è RedHat
jTextFieldLogo.setText("Incompatible Operating System");
this.error=true;
}
}
/**
* Rileva il SO in uso, s contiene il nome del SO
*/
public void rilevaSO()
{
Vincenzo Masullo 566/2795
Pagina 206 di 265
//
****
modificare qua ****
per effettuare i test sui sistemi operativi
// sistemaO contiene il nome del sistema operativo in uso
this.sistemaO=System.getProperty("os.name");
// --rilevamento reale ---// nel caso di ubuntu s=Linux
//
String s="RedHat";
// this.sistemaO="win";
// simulazione red hat
this.home=System.getProperty("user.dir");
percorso di esecuzione del file .jar
System.out.println(home);
esecuzione file .jar
System.out.println(sistemaO);
completo
// contiene il
//
test percorso di
//
test stampo il nome
}
/**
* Lancia installazione SW per sistemi RED HAT
*
* @param sistemaO
* sistema operativo
*
*/
public void selezioneSO(String sistemaO)
{
// ------ LINUX SO ----if ( sistemaO.equals("Linux") )
{
// lancio il frame per la selezione del SO
OS pr=new OS("RedHat",home);
}
}
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
Vincenzo Masullo 566/2795
Pagina 207 di 265
public void windowOpened(WindowEvent we) {
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
}
7.4.2.5 Mailing.java
package RedHat_Version;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
/**
*
* Classe per consentire il servizio di mailing list ( mailman ) ( JFrame
Form )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Mailing extends JFrame implements WindowListener {
Utility u=new Utility();
Messaggio m=new Messaggio("0");
Vincenzo Masullo 566/2795
// oggetto utility
// eventuali messaggi di errore
Pagina 208 di 265
/**
*
* Costruttore della Classe Mailing ( JFrame Form )
*
*/
public Mailing() {
super("mailing list");
// chiamata alla
superclasse
initComponents();
// inizializza componenti
addWindowListener(this);
// aggiunge ascoltatore
setSize(650,410);
// set dimensione frame
setLocationRelativeTo(null);
// posiziona il frame al
centro
setResizable(false);
// l'utente non può
ingrandire la finestra
setVisible(true);
// rende visibile il frame
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
private void noButtonActionPerformed(java.awt.event.ActionEvent evt) {
u.uscita();
}
private void yesButtonActionPerformed(java.awt.event.ActionEvent evt) {
// in questo punto va gestita la comunicazione con il Server di
mailmman
// per inserire l'università nella Mailing list
// tale sistema CVS consente la condivisione del codice in
esame, tutti gli utenti
// presenti nella lista possono partecipare al miglioramento e
al svilutto del software.
MyApp my = new MyApp("Mailman");
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Vincenzo Masullo 566/2795
Pagina 209 di 265
m.stampaMex("Thanks for collaboration");
dispose();
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
}
}
});
public void windowOpened(WindowEvent we) {
}
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
Vincenzo Masullo 566/2795
Pagina 210 di 265
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextPane jTextPaneMenu;
private javax.swing.JButton noButton;
private javax.swing.JButton yesButton;
// End of variables declaration
}
7.4.2.6 Main.java
package RedHat_Version;
/**
*
* Classe che istanzia oggetti di tipo Home
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Main {
public static void main(String[] args) {
Home h=new Home();
// Crea un istanza di Home
}
}
7.4.2.7 Messaggio.java
package RedHat_Version;
Vincenzo Masullo 566/2795
Pagina 211 di 265
import javax.swing.JOptionPane;
/**
*
* Classe che lancia i Messaggi di Errore e altre comunicazioni all'utente
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
class Messaggio {
String codice;
/**
*
* @param cod
*
*
*/
public Messaggio(String cod){
codice=cod;
}
/**
* Stampa messaggio di errore
*
* @param messaggio
* messaggio di errore
*/
void stampaMex(String messaggio){
JOptionPane.showMessageDialog(null, messaggio, "Warning",
JOptionPane.INFORMATION_MESSAGE);
}
}
7.4.2.8 MyApp.java
package RedHat_Version;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
/**
* Lancia il frame che permette di lanciare il Browser ( JFrame Form )
* ( usato per le mailing list )
*
* @version 1.0
Vincenzo Masullo 566/2795
Pagina 212 di 265
* @author Vincenzo Masullo 566/2795
*
*/
public class MyApp extends JFrame implements WindowListener {
private String software;
/**
* Costruttore della classe MyApp
*
* @param
* s contiene la strunga del Software
*
*/
public MyApp(String s) {
super("Browser");
// chiamata alla
superclasse
software =s;
// Mailman
initComponents();
// inizializza
componenti
addWindowListener(this);
// aggiungi
ascoltatore
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setResizable(false);
// l'utente non può
ingrandire la finestra
setLocationRelativeTo(null);
setVisible(true);
this.pack();
setCampo(software);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jTextField1 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
;
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE)
jTextField1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField1ActionPerformed(evt);
}
});
jButton1.setText("ok");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
Vincenzo Masullo 566/2795
Pagina 213 di 265
}
jButton1ActionPerformed(evt);
});
jLabel1.setText("Click OK to go Mailing-list");
javax.swing.GroupLayout jPanel1Layout = new
javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align
ment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jTextField1,
javax.swing.GroupLayout.PREFERRED_SIZE, 256,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.RELATED, 35, Short.MAX_VALUE)
.addComponent(jButton1,
javax.swing.GroupLayout.PREFERRED_SIZE, 76,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(22, 22, 22))
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(49, 49, 49)
.addComponent(jLabel1,
javax.swing.GroupLayout.PREFERRED_SIZE, 283,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(69, Short.MAX_VALUE))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align
ment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.Gro
upLayout.Alignment.BASELINE)
.addComponent(jTextField1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jButton1))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.UNRELATED)
.addComponent(jLabel1,
javax.swing.GroupLayout.PREFERRED_SIZE, 39,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE))
);
javax.swing.GroupLayout layout = new
javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
Vincenzo Masullo 566/2795
Pagina 214 di 265
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE
ADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE
ADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(39, 39, 39))
);
pack();
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// in base al frame in cui ci si trova si va alla sua home page
// o inseriemo dirattamente il link per il download oppure il link
della home page
BrowserLaunch.openURL(jTextField1.getText().trim());
dispose();
}
{
private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt)
}
/**
*
* Setta l'indirizzo per il software scelto
*
* @param software
*
*/
private void setCampo(String software) {
// http://httpd.apache.org/
-- home page --if ( software.equals("Apache"))
Vincenzo Masullo 566/2795
Pagina 215 di 265
{ //jTextField1.setText("http://apache.fastbull.org/httpd/httpd-2.
0.63.tar.gz");
jTextField1.setText("file:///home/vincent/Scrivania/Software");
}
// http://www.gnu.org/software/mailman/index.html
--
-- home page
if ( software.equals("Mailman"))
{
jTextField1.setText("http://143.225.85.34/cgibin/mailman/listinfo");
// jTextField1.setText("http://localhost/cgibin/mailman/listinfo");
// m.stampaMex("Thanks for your cooperation !");
// dispose();
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
});
}
}
public void main_pr() {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
}
}
});
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JTextField jTextField1;
// End of variables declaration
public void windowClosing(WindowEvent we) {
Vincenzo Masullo 566/2795
Pagina 216 di 265
}
dispose();
public void windowOpened(WindowEvent we) {
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
}
7.4.2.9 Mysql.java
package RedHat_Version;
import
import
import
import
import
import
import
java.awt.event.WindowEvent;
java.awt.event.WindowListener;
java.io.File;
java.io.IOException;
javax.swing.JComboBox;
javax.swing.JFrame;
javax.swing.JOptionPane;
/**
*
* Classe per l'installazione di Mysql ( JFrame Form )
*
* @version 1.0
* @author Vincenzo Masullo
*
*/
public class Mysql extends JFrame implements WindowListener {
Vincenzo Masullo 566/2795
Pagina 217 di 265
Messaggio m=new Messaggio("0");
private String so;
private String percorso;
dell'utente
private String home;
file .jar
Utility u=new Utility();
// eventuali messaggi di errore
// sistema operativo
// percorso inserito
// percorso di esecuzione del
/**
*
* Crea un oggetto Mysql ( JFrame Form )
*
* @param so
* sistema operativo
*
* @param home
* percorso di esecuzione del file .jar
*
*/
public Mysql(String so,String home) {
super("mysql");
this.so=so;
this.home=home;
del file .jar
// istanzio oggetto utility
centro
initComponents();
addWindowListener(this);
setSize(600,400);
setLocationRelativeTo(null);
// chiamata superclasse
// sistema operativo
// percorso di esecuzione
//
//
//
//
inizializza componenti
aggiunge ascoltatore
set dimensione frame
posiziona il frame al
setCampo(so);
// set percorso programma
setResizable(false);
// l'utente non può
ingrandire la finestra
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
// rende visibile il frame
}
private void
jTextFieldPercorsoActionPerformed(java.awt.event.ActionEvent evt) {
}
/**
* Gestione pressione cancel button
*/
private void cancelButtonActionPerformed(java.awt.event.ActionEvent
Vincenzo Masullo 566/2795
Pagina 218 di 265
evt) {
}
{
// cancel button
u.uscita();
/**
* Gestione pressione back button
*/
private void backButtonActionPerformed(java.awt.event.ActionEvent evt)
// back button
dispose();
Php pr= new Php(so,home);
}
/**
* Gestione ComboBox
*/
private void jComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
JComboBox cb = (JComboBox)evt.getSource();
String risp = (String)cb.getSelectedItem();
if( risp.equals("no") )
{
// controllo se il programma è installato
percorso=jTextFieldPercorso.getText();
prelevo il contenuto del label
modificarlo
dell'installazione è la seguente :
"/etc/mysql";
boolean c=u.controllo(percorso);
percorso esiste
//
in questo caso
//
l'utente potrebbe
//
la directory reale
//
percorso =
// controlla se il
if ( c )
{
m.stampaMex("The program is already installed !");
cb.setSelectedItem("yes"); //settaggio del comboBox a Si
}
else
{
installSW();
}
Vincenzo Masullo 566/2795
Pagina 219 di 265
}
}
{
cb.setSelectedItem("yes");
//settaggio del comboBox a Si
/**
* Gestione pressione next button
*/
private void nextButtonActionPerformed(java.awt.event.ActionEvent evt)
// next button
boolean c=false;
percorso=jTextFieldPercorso.getText();
if(u.isFieldEmpty(percorso))
{ m.stampaMex("Please enter the path where you installed the
program !"); }
else
{ c=u.controllo(percorso);
if ( c )
{
// true
boolean a=percorso.contains("mysql");
il percorso contiene mysql
if ( a )
{ c=true; }
else
{ c=false; }
// controllo se
// set c a true
// set c a false
}
}
if ( c )
{
dispose();
Cacti pr= new Cacti(so,home); // lancio il frame di
installazione di Cacti
}
else
{ // lanciare messaggio di errore
m.stampaMex("Wrong path or program is not installed !");
}
}
/**
*
* Installazione del Software
Vincenzo Masullo 566/2795
Pagina 220 di 265
* Lancia lo Script mysql.sh che si occupa di lanciare i comandi bash
per installare il pacchetto di mysql
* e tutte le sue dipendenze. Inoltre lancia la Miniguida RedHat.pdf (
utilizzando evince per aprire il documento ).
* La Guida è indispensabile all'utente per installare i Servizi.
*
*/
public void installSW()
{
int risultato = JOptionPane.showConfirmDialog(this,"You want to
install mysql on your
system ?","Install",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSA
GE);
if (risultato == JOptionPane.OK_OPTION)
{
// installo MySQL per RedHat con yum install
Process theProcess=null;
try
{
// lancio script che installa Mysql
File s = new File (home,"risorse/script");
Runtime exec = Runtime.getRuntime();
exec.exec("gnome-terminal -x bash -c " +
s.getAbsolutePath() +"/mysql.sh;bash");
System.out.println(s); // test
// lancio miniguida per il supporto
all'installazione
File f = new File (home, "risorse/Guide");
theProcess = Runtime.getRuntime().exec("evince
file://" +f.getAbsolutePath() +"/RedHat.pdf");
System.out.println(f); // test
System.out.println("Installo MySQL x RedHat");
}
catch(IOException e)
{
System.err.println("Error on exec() method");
e.printStackTrace();
}
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
Vincenzo Masullo 566/2795
Pagina 221 di 265
});
}
}
// Variables declaration - do not modify
private javax.swing.JButton backButton;
private javax.swing.JButton cancelButton;
private javax.swing.JComboBox jComboBox;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel5;
private javax.swing.JPanel jPanel6;
private javax.swing.JTextField jTextFieldPercorso;
private javax.swing.JTextField jTextFieldType;
private javax.swing.JButton nextButton;
// End of variables declaration
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
public void windowOpened(WindowEvent we) {
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
Vincenzo Masullo 566/2795
Pagina 222 di 265
}
public void windowDeactivated(WindowEvent we) {
}
/**
* Set percorso programma in base al sistema operativo
*
* @param so
* sistema operativo
*/
public void setCampo(String so) {
if ( so.equals("RedHat"))
{
jTextFieldPercorso.setText("/var/lib/mysql");
percorso installazione software ( mysql )
}
// settaggio
}
}
7.4.2.10 OS.java
package RedHat_Version;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
/**
*
* Classe che visualizza l'elenco dei sistemi operativi della distribuzione
DEBIAN ( JFrame Form )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class OS extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
private String so;
RED HAT
Utility u=new Utility();
private String home;
Vincenzo Masullo 566/2795
// eventuali messaggi di errore
// sistema operativo DEBIAN o
// istanzio oggetto utility
// contiene il percorso di
Pagina 223 di 265
esecuzione del file .jar
/**
* Costruttore della Classe OS
*
* @param so
* sistema operativo
*
* @param home
* directory di esecuzione del file .jar
*
*/
public OS(String so,String home) {
super("Operating System");
this.so=so;
this.home=home;
del file .jar
centro
initComponents();
addWindowListener(this);
setSize(560,430);
setLocationRelativeTo(null);
// chiamata superclasse
// sistema operativo
// percorso di esecuzione
//
//
//
//
inizializza componenti
aggiunge ascoltatore
set dimensione frame
posiziona il frame al
setResizable(false);
// l'utente non può
ingrandire la finestra
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
// rende visibile il frame
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void type1ActionPerformed(java.awt.event.ActionEvent evt) {
// ----- RedHat ----this.so="RedHat";
Apache2
dispose();
Apache pr= new Apache(so,home);
Vincenzo Masullo 566/2795
// lancio frame installazione
Pagina 224 di 265
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
}
}
});
public void windowOpened(WindowEvent we) {
}
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabelTitle;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextPane jTextPane1;
private javax.swing.JButton type1;
Vincenzo Masullo 566/2795
Pagina 225 di 265
// End of variables declaration
}
7.4.2.11 Php.java
package RedHat_Version;
import
import
import
import
import
import
import
java.awt.event.WindowEvent;
java.awt.event.WindowListener;
java.io.File;
java.io.IOException;
javax.swing.JComboBox;
javax.swing.JFrame;
javax.swing.JOptionPane;
/**
*
* Classe per l'installazione di Php ( JFrame Form )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Php extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
private String so;
private String percorso;
dell'utente
private String home;
file .jar
Utility u=new Utility();
// eventuali messaggi di errore
// sistema operativo
// percorso inserito
// percorso di esecuzione del
// istanzio oggetto utility
/**
*
* Costruttore : crea un oggetto Php
*
* @param so
* sistema operativo
*
* @param home
* percorso di esecuzione del file .jar
*
*/
public Php(String so,String home) {
super("php5");
Vincenzo Masullo 566/2795
// chiamata superclasse
Pagina 226 di 265
this.so=so;
this.home=home;
// sistema operativo
// percorso esecuzione del file
.jar
initComponents();
// inizializza componenti
addWindowListener(this);
// aggiunge ascoltatore
setSize(600,400);
// set dimensione frame
setLocationRelativeTo(null);
// posiziona il frame al centro
setCampo(so);
// set percorso programma
setResizable(false);
// l'utente non può ingrandire
la finestra
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
// rende visibile il frame
}
/**
* Gestione pressione next button
*/
private void nextButtonActionPerformed(java.awt.event.ActionEvent evt)
{
// next button
boolean c=false;
percorso=jTextFieldPercorso.getText();
if(u.isFieldEmpty(percorso))
{ m.stampaMex("Please enter the path where you installed the
program !"); }
else
{ c=u.controllo(percorso);
if ( c )
{
// true
boolean a=percorso.contains("php.d");
il percorso contiene php.d
if ( a )
{ c=true; }
else
{ c=false; }
// controllo se
// set c a true
// set c a false
}
}
Vincenzo Masullo 566/2795
Pagina 227 di 265
if ( c )
{
dispose();
Mysql pr= new Mysql(so,home); // passo al frame di
installazione di Mysql
}
else
{ // lanciare messaggio di errore
m.stampaMex("Wrong path or program is not installed !");
}
}
private void
jTextFieldPercorsoActionPerformed(java.awt.event.ActionEvent evt) {
}
/**
* Gestione ComboBox
*/
private void jComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
JComboBox cb = (JComboBox)evt.getSource();
String risp = (String)cb.getSelectedItem();
if( risp.equals("no") )
{
// controllo se il programma è installato
percorso=jTextFieldPercorso.getText();
// in questo caso prelevo
il contenuto del label
modificarlo
// l'utente potrebbe
// la directory reale
dell'installazione è la seguente :
// percorso =
"/etc/php5";
boolean c=u.controllo(percorso);
percorso esiste
"yes"
// controlla se il
if ( c )
{
m.stampaMex("The program is already installed !");
cb.setSelectedItem("yes");
//settaggio del comboBox
}
else
{
installSW();
Vincenzo Masullo 566/2795
Pagina 228 di 265
}
}
cb.setSelectedItem("yes");
//settaggio del comboBox "yes"
}
/**
* Gestione pressione back button
*/
private void backButtonActionPerformed(java.awt.event.ActionEvent evt)
{
// back button
dispose();
Apache pr= new Apache(so,home);
}
// si torna indietro ad Apache
/**
* Gestione pressione cancel button
*/
private void cancelButtonActionPerformed(java.awt.event.ActionEvent
evt) {
// cancel button
u.uscita();
}
private void jTextFieldTypeActionPerformed(java.awt.event.ActionEvent
evt) {
}
/**
* Installazione del Software
* Lancia lo Script php5.sh che si occupa di lanciare i comandi bash
per installare il pacchetto di php5
* e tutte le sue dipendenze. Inoltre lancia la Miniguida Debian.pdf (
utilizzando evince per aprire il documento ).
* La Guida è indispensabile all'utente per installare i Servizi.
*
*/
public void installSW()
{
int risultato = JOptionPane.showConfirmDialog(this,"You want to
install php5 on your
system ?","Install",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSA
GE);
if (risultato == JOptionPane.OK_OPTION)
{
Vincenzo Masullo 566/2795
Pagina 229 di 265
// installo PHP per RedHat con yum install
Process theProcess=null;
try
{
// installo php
File s = new File (home,"risorse/script");
Runtime exec = Runtime.getRuntime();
exec.exec("gnome-terminal -x bash -c " +
s.getAbsolutePath() +"/php5.sh;bash"); // script che installa php
System.out.println(s); // test
// lancio la miniguida di installazione
File f = new File (home, "risorse/Guide");
theProcess = Runtime.getRuntime().exec("evince
file://" +f.getAbsolutePath() +"/RedHat.pdf");
System.out.println(f); // test
System.out.println("Installo PHP x RedHat");
}
catch(IOException e)
{
System.err.println("Error on exec() method");
e.printStackTrace();
}
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
}
}
});
// Variables declaration - do not modify
private javax.swing.JButton backButton;
private javax.swing.JButton cancelButton;
private javax.swing.JComboBox jComboBox;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JPanel jPanel1;
Vincenzo Masullo 566/2795
Pagina 230 di 265
private javax.swing.JPanel jPanel2;
private javax.swing.JTextField jTextFieldPercorso;
private javax.swing.JTextField jTextFieldType;
private javax.swing.JButton nextButton;
// End of variables declaration
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
public void windowOpened(WindowEvent we) {
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
/**
* Set percorso programma
*
* @param so
* sistema operativo
*
*/
public void setCampo(String so) {
if ( so.equals("RedHat"))
Vincenzo Masullo 566/2795
Pagina 231 di 265
{
jTextFieldPercorso.setText("/etc/php.d");
installazione software ( php )
// settaggio percorso
}
}
}
7.4.2.12 Utility.java
package RedHat_Version;
import java.io.File;
import javax.swing.JOptionPane;
/**
*
* La Classe Utility fornisce alcuni metodi che permettono di controllare
se i campi dei form sono vuoti
* oppure se un file esiste o meno, ad altre utility varie.
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Utility {
/**
* Controllo se il campo è vuoto
*
* @param value
* stringa da controllare
*
*/
public static boolean isFieldEmpty(String value){
if(value!=null && value.equals(""))
return true;
return false;
}
/**
* Controllo se il programma è installato
*
* @param percorso
* stringa da controllare
*
*/
Vincenzo Masullo 566/2795
Pagina 232 di 265
public boolean controllo(String percorso)
{
String indirizzo = percorso;
boolean exists = (new File(indirizzo)).exists();
// definisco exists come booleano (true/false) e attraverso la
classe File e il methodo exists che verifica l'esistenza del file indicato
if (exists) {
// se il file esiste questo controllo ritorna un valore uguale
a true
System.out.println("Il file esiste"); // test true
return true;
}
else {
System.out.println("Il file non esiste"); // test false
return false;
}
}
/**
* Controllo se è un file ( isFile )
*
* @param percorso
* stringa da controllare
*/
public boolean controlloFile(String percorso)
{
String indirizzo = percorso;
boolean isFile = (new File(indirizzo)).isFile();
// definisco exists come booleano (true/false) e attraverso la
classe File e il methodo exists che verifica l'esistenza del file indicato
if (isFile) {
// se il file esiste questo controllo ritorna un valore
uguale a true
System.out.println("Il file esiste"); // test true
return true;
}
else {
System.out.println("Il file non esiste"); // test false
return false;
}
}
/**
* Gestisce l'uscita dall'applicazione
*/
public void uscita()
{
Vincenzo Masullo 566/2795
Pagina 233 di 265
int risultato = JOptionPane.showConfirmDialog(null,"Setup has not
completed. Are you sure want to exit ?","Setup
incomplete",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
if (risultato == JOptionPane.OK_OPTION)
System.exit(0);
}
}
Vincenzo Masullo 566/2795
Pagina 234 di 265
7.4.2.13 Script-Bash
#!/bin/bash
#
#
#
#
sudocfg ()
questo script permette di modificare il file /etc/sudoers
l'utente che lo esegue ha i permessi di root e può eseguire
sudo yum install nomePacchetto
echo "
"
echo " *** Questa è la configurazione guidata di sudo
***"
echo " *** grazie a questo mini-setup è possibile abilitare l'utente
***"
echo " *** per eseguire comandi >/sudo yum install nomePacchetto
***"
echo "
"
echo " N.B. lo Script deve essere lanciato come utente root
"
echo "
"
echo " Digita il tuo nome utente "
read nomeutente
echo " Digita nuovamente per confermare che sia corretto"
read nomeutente2
if [[ $nomeutente == $nomeutente2 ]]
then
echo "Aggiungo la riga di configurazione nel
file /etc/sudoers...."
echo "$nomeutente ALL=(ALL) ALL" >> /etc/sudoers
echo "La configurazione è completata, ora puoi utilizzare
WebMon correttamente con il comando 'yum install nomePacchetto'"
exit 1
else
echo "I nomi digitati non sono uguali, è necessario
rieseguire lo script"
echo "e inserire un nome utente"
exit 1
fi
#!/bin/bash
# installo web server apache2
sudo yum install httpd
# avviare web server
sudo /etc/init.d/httpd start
# messaggio restituito :
# chkconfig httpd on
Vincenzo Masullo 566/2795
Pagina 235 di 265
#!/bin/bash
# installo cacti-spine
sudo yum install cacti
# settaggio del poller
sudo gedit /etc/crontab
#!/bin/bash
# installo mysql-server
sudo yum install mysql-server mysql
# avvio mysql
sudo /etc/init.d/mysqld start
# chkconfig mysqld on
# affinchè mysql usi php
sudo yum install php-mysql
# riavvio web server
sudo /etc/init.d/httpd restart
# riavvio mysql
sudo /etc/init.d/mysqld restart
# installo phpmyadmin
sudo yum install phpmyadmin
# serve per settare la password per l'utente root
mysql_secure_installation
# riavvio web server
sudo /etc/init.d/httpd restart
# modifico il file php.ini
( seguendo la guida )
# creo il link simbolico
# riavvio web server
#!/bin/bash
# installo php5
sudo yum install php
# riavvio web server
sudo /etc/init.d/httpd restart
Vincenzo Masullo 566/2795
Pagina 236 di 265
# creazione e editor del file testphp.php
# si deve inserire <?php phpinfo(); ?>
( seguendo la guida )
sudo gedit /var/www/html/testphp.php
Vincenzo Masullo 566/2795
Pagina 237 di 265
7.4.3 Windows-Package
7.4.3.1 AppServ.java
package Windows_Version;
import
import
import
import
import
import
import
import
import
import
java.awt.event.WindowEvent;
java.awt.event.WindowListener;
java.util.logging.Level;
java.util.logging.Logger;
javax.swing.JComboBox;
javax.swing.JFrame;
javax.swing.JOptionPane;
java.io.*;
java.util.*;
java.util.zip.*;
/**
*
*
Per AppServ il modello del Frame è diverso
*
decidere se uniformare il modello del Frame
*
( stile linux - apache - php - mysql )
*
*
Compatibilità Windows XP Server2003 Vista XP Seven
*
*
@version 1.0
*
@author Vincenzo Masullo 566/2795
*
*/
public class AppServ extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
errore
private String so;
private boolean ins=false;
private String percorso;
dell'utente
private String home;
Utility u=new Utility();
/**
*
*
*
*
*
*
*
*
*
// eventuale messaggio di
// sistema operativo
// flag inserimento immagine
// percorso inserito
// directory di esecuzione
// oggetto utility
Crea un nuovo oggetto AppServ ( JFrame Form )
@param so
sistema operativo
@param home
directory di esecuzione
Vincenzo Masullo 566/2795
Pagina 238 di 265
*/
public AppServ(String so,String home) {
super("AppServ");
this.so=so;
this.home=home;
esecuzione
// chiamata superclasse
// sistema operativo
// directory di
initComponents();
// inizializza
componenti
addWindowListener(this);
// aggiunge ascoltatore
setSize(600,450);
// set dimensione frame
setLocationRelativeTo(null);
// posiziona il frame
al centro
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
backButton.setEnabled(false);
// back button non
cliccabile
setResizable(false);
// l'utente non può
ingrandire la finestra
// setLocation(0,0);
// setta il frame in
alto a sinistra
this.setVisible(true);
// rende visibile il
frame
}
/**
* Gestione pressione cancel button
*/
private void cancelButtonActionPerformed(java.awt.event.ActionEvent
evt) {
u.uscita();
}
{
/**
* Gestione pressione back button
*/
private void backButtonActionPerformed(java.awt.event.ActionEvent evt)
// back button inattivo
}
/**
* Gestione pressione next button
*/
private void nextButtonActionPerformed(java.awt.event.ActionEvent evt)
{
// controllo se il campo contenente il path non è vuoto
boolean c=false;
Vincenzo Masullo 566/2795
Pagina 239 di 265
percorso=jTextFieldPercorso.getText();
if(u.isFieldEmpty(percorso)) // campo vuoto
{ m.stampaMex("Please enter the path where you installed the
program !"); }
else {
c=u.controllo(percorso);
// controlla se il percorso esiste
if ( c ) {
// true
boolean a=percorso.contains("AppServ");
il percorso contiene AppServ
if ( a ) {
c=true; }
else {
c=false; }
// controllo se
// set c a true
// set c a false
}
}
if ( c )
// true --> passo a cacti
{
dispose();
Cacti pr= new Cacti(so,home);
}
else {
// false
// lanciare messaggio di errore
m.stampaMex("Wrong path or program is not installed !");
}
}
private void
jTextFieldPercorsoActionPerformed(java.awt.event.ActionEvent evt) {
}
/**
* Gestione ComboBox
*/
private void jComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
// comboBox
Vincenzo Masullo 566/2795
Pagina 240 di 265
JComboBox cb = (JComboBox)evt.getSource();
String risp = (String)cb.getSelectedItem();
if( risp.equals("no") ) {
// se si seleziona no
// controllo se il programma è installato
percorso=jTextFieldPercorso.getText();
prelevo il contenuto del label
modificarlo
// in questo caso
// l'utente potrebbe
// la directory reale
dell'installazione è la seguente :
boolean c=u.controllo(percorso);
percorso esiste
// C:\AppServ
// controlla se il
if ( c ) {
m.stampaMex("The program is already installed !");
cb.setSelectedItem("yes"); //settaggio del comboBox a yes
}
else {
try {
installSW();
cb.setSelectedItem("yes"); //settaggio del comboBox a
yes
} catch (IOException ex) {
Logger.getLogger(AppServ.class.getName()).log(Level.SEV
ERE, null, ex);
}
}
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
}
}
});
Vincenzo Masullo 566/2795
Pagina 241 di 265
/**
* Installazione del Software
* Effettua l'estrazione del file .exe e lancia l'installazione del
pacchetto attraverso il metodo exec della classe Runtime
*
*/
public void installSW() throws IOException
{
// conferma installazione
int risultato = JOptionPane.showConfirmDialog(this,"You want to
install AppServ on your
system ?","Install",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSA
GE);
if (risultato == JOptionPane.OK_OPTION)
{
// ------
WINDOWS ----------
if ( so.equals("Windows") )
{
Process theProcess1=null;
try {
File s = new File (home,"risorse\\Guide");
System.out.println(home);
theProcess1=Runtime.getRuntime().exec("cmd /c
start \"\" \"" + s.getAbsolutePath() + "\\Windows-Guide-AppServ.pdf");
System.out.println(home+"\\risorse\\Guide\\Windows-GuideSingoli.pdf");
File f = new File (home);
System.out.println(home);
ZipFile zipFile = new ZipFile(f.getAbsolutePath()
+"\\risorse\\appserv-win32-2.5.5.zip");
Enumeration entries = zipFile.entries();
while(entries.hasMoreElements())
{
ZipEntry entry = (ZipEntry)entries.nextElement();
then children.
entry.getName());
purposes.
if(entry.isDirectory()) {
// Assume directories are stored parents first
System.err.println("Extracting directory: " +
// This is not robust, just for demonstration
(new File(entry.getName())).mkdir();
continue;
Vincenzo Masullo 566/2795
Pagina 242 di 265
}
System.out.println("Extracting file: " + entry.getName());
copyInputStream(zipFile.getInputStream(entry),
new BufferedOutputStream(new
FileOutputStream(entry.getName())));
}
zipFile.close();
}
catch (IOException e) {
System.err.println("Unhandled exception:");
e.printStackTrace();
return;
}
// installo apache per WINDOWS
Process theProcess2=null;
try
{
// lancio installazione
File f = new File (home);
System.out.println(home);
theProcess2 = Runtime.getRuntime().exec("cmd.exe
start /c \""+f.getAbsolutePath()+"\\appserv-win32-2.5.5.exe\"");
System.out.println("Installo Apache x Windows");
}
catch(IOException e)
{
System.err.println("Error on exec() method");
e.printStackTrace();
}
}
}
}
// Variables declaration - do not modify
private javax.swing.JButton backButton;
private javax.swing.JButton cancelButton;
private javax.swing.JComboBox jComboBox;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
Vincenzo Masullo 566/2795
Pagina 243 di 265
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel4;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextField jTextFieldPercorso;
private javax.swing.JTextPane jTextPane1;
private javax.swing.JButton nextButton;
// End of variables declaration
/**
* Metodo che serve per l'estrazione del file .zip
*
* @param in
*
* @param out
*/
public static final void copyInputStream(InputStream in, OutputStream out)
throws IOException
{
byte[] buffer = new byte[1024];
int len;
while((len = in.read(buffer)) >= 0)
out.write(buffer, 0, len);
in.close();
out.close();
}
public void windowOpened(WindowEvent we) {
}
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
Vincenzo Masullo 566/2795
Pagina 244 di 265
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
}
7.4.3.2 BrowserLaunch.java
package Windows_Version;
import javax.swing.JOptionPane;
import java.util.Arrays;
/**
*
* Browser Launch for Java
* Utility class to open a web page from a Swing application
* in the user's default browser.
* Supports: Mac OS X, GNU/Linux, Unix, Windows XP/Vista/7
* String url = "http://www.google.com/";<br>    
* BrowserLaunch.openURL(url)
*
*/
public class BrowserLaunch {
static final String[] browsers = { "google-chrome", "firefox", "opera",
"epiphany", "konqueror", "conkeror", "midori", "kazehakase",
"mozilla" };
static final String errMsg = "Error attempting to launch web browser";
/**
* Opens the specified web page in the user's default browser
* @param url A web address (URL) of a web page (ex:
"http://www.google.com/")
*/
public static void openURL(String url) {
try { //attempt to use Desktop library from JDK 1.6+
Class<?> d = Class.forName("java.awt.Desktop");
d.getDeclaredMethod("browse", new Class[]
{java.net.URI.class}).invoke(
d.getDeclaredMethod("getDesktop").invoke(null),
new Object[] {java.net.URI.create(url)});
Vincenzo Masullo 566/2795
Pagina 245 di 265
//above code mimicks: java.awt.Desktop.getDesktop().browse()
}
catch (Exception ignore) { //library not available or failed
String osName = System.getProperty("os.name");
try {
if (osName.startsWith("Mac OS")) {
Class.forName("com.apple.eio.FileManager").getDeclaredMethod
(
"openURL", new Class[] {String.class}).invoke(null,
new Object[] {url});
}
else if (osName.startsWith("Windows"))
Runtime.getRuntime().exec(
"rundll32 url.dll,FileProtocolHandler " + url);
else { //assume Unix or Linux
String browser = null;
for (String b : browsers)
if (browser == null && Runtime.getRuntime().exec(new
String[]
{"which", b}).getInputStream().read() != -1)
Runtime.getRuntime().exec(new String[] {browser = b,
url});
if (browser == null)
throw new Exception(Arrays.toString(browsers));
}
}
catch (Exception e) {
JOptionPane.showMessageDialog(null, errMsg + "\n" +
e.toString());
}
}
}
}
7.4.3.3 Home.java
package Windows_Version;
import
import
import
import
import
java.awt.Image;
java.awt.event.WindowEvent;
java.awt.event.WindowListener;
javax.swing.ImageIcon;
javax.swing.JFrame;
/**
*
* Classe per l'home page dell'Applicazione per Sistemi Windows ( JFrame
Form )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
Vincenzo Masullo 566/2795
Pagina 246 di 265
*
*/
public class Home extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
private boolean up=false;
private String sistemaO;
private Boolean error=false;
Utility u=new Utility();
private String home;
//
//
//
//
//
//
eventuale messaggio di errore
flag upload ( true / false )
nome sistema operativo
errore sistema operativo
istanzio oggetto utility
nome utente del SO
/**
* Crea un oggetto Home
*
*/
public Home() {
centro
super("Setup");
initComponents();
addWindowListener(this);
setSize(700,470);
setLocationRelativeTo(null);
//
//
//
//
//
chiamata superclasse
inizializza componenti
aggiunge ascoltatore
set dimensione frame
posiziona il frame al
rilevaSO();
// String
s=System.getProperty("os.name");
--- rilevamento SO ---this.up=false;
// flag inserimento LOGO
( true / false )
backButton.setEnabled(false);
// back button non cliccabile
setCampo(sistemaO);
// setta il campo che
contiene il percorso del logo
setResizable(false);
// l'utente non può
ingrandire la finestra
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
// rende visibile il frame
}
{
/**
* Gestione pressione back button
*/
private void backButtonActionPerformed(java.awt.event.ActionEvent evt)
// back button inattivo
}
/**
* Gestione pressione next button
Vincenzo Masullo 566/2795
Pagina 247 di 265
*/
private void nextButtonActionPerformed(java.awt.event.ActionEvent evt)
{
// permette di andare alla pagina del SO controllando se è stato
effettuato l'upload del logo
if (error == true )
{
// messaggio sistema operativo incompatibile
m.stampaMex("Incompatible Operating System !");
dispose();
}
else
{
if (up == false) // flag upload non effettuato
{
m.stampaMex("Please click UPLOAD for insert the picture !");
}
else
{
dispose();
selezioneSO(sistemaO);
Operativo
}
// contiene il nome del Sistema
}
}
/**
* Gestione pressione cancel button
*/
private void cancelButtonActionPerformed(java.awt.event.ActionEvent
evt) {
u.uscita();
}
/**
* Gestione pressione upload button
*/
private void uploadButtonActionPerformed(java.awt.event.ActionEvent
evt) {
boolean c=false;
String percorso=jTextFieldLogo.getText();
presente nel campo
System.out.println(percorso);
Vincenzo Masullo 566/2795
// prendo il percorso
// stampa test
Pagina 248 di 265
if (error == true )
{
// messaggio sistema operativo incompatibile
m.stampaMex("Incompatible Operating System !");
dispose();
}
else
{
if(u.isFieldEmpty(percorso))
{ // campo vuoto
m.stampaMex("Please enter the path of the picture !");
esiste
else
{ c=u.controlloFile(percorso);
}
}
// controllo se il file
if ( c )
{
// controllo immagine
Image img = new ImageIcon(percorso).getImage();
int width = img.getWidth(null);
int height = img.getHeight(null);
System.out.println(width);
System.out.println(height);
percorso.toLowerCase();
// stampa test
// stampa test
// controllo dimensione file max 200*200
if (( width<= 200 ) && ( height <= 200 ))
{
// controllo estensione file ( tipo )
if (percorso.endsWith(".gif") ||
percorso.endsWith(".png") || percorso.endsWith(".jpg"))
{
jLabel2.setIcon(new
javax.swing.ImageIcon(percorso));
// inserisco LOGO
up=true; // flag immagine inserita
jPanel4.setVisible(false);
System.out.println("Immagine Inserita OK");
}
else
{
m.stampaMex(" ERROR extension file !");
}
//
estensione errata
}
else
{
m.stampaMex(" ERROR The file is too big !");
Vincenzo Masullo 566/2795
}
//
Pagina 249 di 265
immagine troppo grande
}
else
{
// lanciare messaggio di errore
m.stampaMex("Wrong path or file is not exists !");
nn trovato
// file
}
}
}
private void jTextFieldLogoActionPerformed(java.awt.event.ActionEvent
evt) {
}
// Variables declaration - do not modify
private javax.swing.JButton backButton;
private javax.swing.JButton cancelButton;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabelCountFrame;
private javax.swing.JLabel jLabelTitle;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextField jTextFieldLogo;
private javax.swing.JTextPane jTextPaneMenu;
private javax.swing.JButton nextButton;
private javax.swing.JButton uploadButton;
// End of variables declaration
/**
* Set campo per il Logo dell'Università
*
* @param so
* sistema operativo
*
*/
public void setCampo(String so) {
if ( so.equals("Win"))
{ jTextFieldLogo.setText(home+"\\logo_unina.gif"); }
settaggio campo contenente percorso immagine
Vincenzo Masullo 566/2795
//
Pagina 250 di 265
else
{
// se il sistema non è windows lancio messaggio errore
jTextFieldLogo.setText("Incompatible Operating System");
this.error=true;
}
}
/**
* Rileva il SO in uso, s contiene il nome del Sistema Operativo
*
*/
public void rilevaSO()
{
// s contiene il nome del sistema operativo in uso
String s=System.getProperty("os.name");
caratteri
//String s="linux";
sistemaO=s.substring(0,3);
//
prendo solo i primi 3
System.out.println(s);
//
test stampo il nome completo
home=System.getProperty("user.dir");
directory di esecuzione
System.out.println(home);
// per ottenere la
// test
}
/**
* Lancia installazione SW per sistemi WINDOWS
*
* @param sistemaO
* sistema operativo
*/
public void selezioneSO(String sistemaO)
{
// ------ WINDOWS SO = Win
( installo singolarmente i SW )
AppServ oppure percorso normale
if ( sistemaO.equals("Win") )
{
// Apache pr= new Apache("Windows",home);
si vuole lanciare le installazioni singole
Vincenzo Masullo 566/2795
// nel caso in cui
Pagina 251 di 265
// effettuo installazione del pacchetto AppServ
AppServ pr=new AppServ("Windows",home);
}
}
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*/
public void windowClosing(WindowEvent we) {
u.uscita();
}
public void windowOpened(WindowEvent we) {
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
}
Vincenzo Masullo 566/2795
Pagina 252 di 265
7.4.3.4 Mailing.java
package Windows_Version;
import
import
import
import
java.awt.event.WindowEvent;
java.awt.event.WindowListener;
javax.swing.JFrame;
javax.swing.JOptionPane;
/**
*
* Classe per consentire il servizio di mailing list ( mailman ) ( JFrame
Form )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Mailing extends JFrame implements WindowListener {
Utility u=new Utility();
Messaggio m=new Messaggio("0");
errore
// istanzio oggetto utility
// eventuali messaggi di
/**
*
* Costruttore della Classe Mailing ( JFrame Form )
*
*/
public Mailing() {
super("Monitoring");
initComponents();
addWindowListener(this);
setSize(650,420);
setLocationRelativeTo(null);
//
//
//
//
//
chiamata superclasse
inizializza componenti
aggiungi ascoltatore
set dimensione frame
posiziona il frame al
centro
setResizable(false);
// l'utente non può
ingrandire la finestra
// setLocation(0,0);
// setta il frame in alto a
sinistra
setVisible(true);
// rende visibile il frame
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
private void yesButtonActionPerformed(java.awt.event.ActionEvent evt) {
Vincenzo Masullo 566/2795
Pagina 253 di 265
// qua deve essere gestita l'aggiunta dell'università alla mailing
list
// gestire add in mailing list
MyApp my = new MyApp("Mailman");
// m.stampaMex("Thank you for collaboration !");
// dispose();
}
private void noButtonActionPerformed(java.awt.event.ActionEvent evt) {
// uscire dall'applicazione
u.uscita();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
m.stampaMex("Thank you for collaboration !");
dispose();
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Mailing().setVisible(true);
}
});
}
public void main_pr() {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
}
}
});
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
Vincenzo Masullo 566/2795
Pagina 254 di 265
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextPane jTextPaneMenu;
private javax.swing.JButton noButton;
private javax.swing.JButton yesButton;
// End of variables declaration
public void windowOpened(WindowEvent e) {
}
/**
* Gestisce l'uscita dall'applicazione
*
* @param we
* evento
*/
public void windowClosing(WindowEvent e) {
u.uscita();
}
public void windowClosed(WindowEvent e) {
}
public void windowIconified(WindowEvent e) {
}
public void windowDeiconified(WindowEvent e) {
}
public void windowActivated(WindowEvent e) {
}
public void windowDeactivated(WindowEvent e) {
}
}
Vincenzo Masullo 566/2795
Pagina 255 di 265
7.4.3.5 Main.java
package Windows_Version;
/**
* Classe che istanzia oggetti di tipo Home
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Main {
public static void main(String[] args) {
Home h=new Home();
// Crea un istanza di Home
}
}
7.4.3.6 Messaggio.java
package Windows_Version;
import javax.swing.JOptionPane;
/*
* Messaggio.java
* Classe che lancia i messaggi
*
* @version 1.0
* @author Vincenzo Masullo
*/
class Messaggio {
String codice;
public Messaggio(String cod){
codice=cod;
}
/**
* Stampa messaggio di errore
*
* @param messaggio
* messaggio di errore
*/
void stampaMex(String messaggio){
JOptionPane.showMessageDialog(null, messaggio, "Warning",
JOptionPane.INFORMATION_MESSAGE);
}
}
Vincenzo Masullo 566/2795
Pagina 256 di 265
7.4.3.7 MyApp.java
package Windows_Version;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
/**
* Lancia il frame che permette di lanciare il Browser ( usato per le
mailing list )
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class MyApp extends JFrame implements WindowListener {
Messaggio m=new Messaggio("0");
private String software;
// eventuali messaggi di errore
/** Creates new form MyApp */
public MyApp(String s) {
super(" Browser ");
alla superclasse
software =s;
initComponents();
inizializza componenti
addWindowListener(this);
ascoltatore
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setResizable(false);
non può ingrandire la finestra
setVisible(true);
frame visibile
setLocationRelativeTo(null);
this.pack();
setCampo(software);
}
// chiamata
// Mailman
//
// aggiungi
// l'utente
// rende il
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jTextField1 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE)
Vincenzo Masullo 566/2795
Pagina 257 di 265
;
jTextField1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField1ActionPerformed(evt);
}
});
jButton1.setText("ok");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jLabel1.setText("Click OK to go Mailing-list");
javax.swing.GroupLayout jPanel1Layout = new
javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align
ment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jTextField1,
javax.swing.GroupLayout.PREFERRED_SIZE, 256,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.RELATED, 37, Short.MAX_VALUE)
.addComponent(jButton1,
javax.swing.GroupLayout.PREFERRED_SIZE, 76,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(22, 22, 22))
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(76, 76, 76)
.addComponent(jLabel1,
javax.swing.GroupLayout.PREFERRED_SIZE, 239,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(86, Short.MAX_VALUE))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align
ment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.Gro
upLayout.Alignment.BASELINE)
.addComponent(jTextField1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jButton1))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
Vincenzo Masullo 566/2795
Pagina 258 di 265
.RELATED, 24, Short.MAX_VALUE)
.addComponent(jLabel1,
javax.swing.GroupLayout.PREFERRED_SIZE, 39,
javax.swing.GroupLayout.PREFERRED_SIZE))
);
javax.swing.GroupLayout layout = new
javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE
ADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE
ADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(39, 39, 39))
);
pack();
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// in base al frame in cui ci si trova si va alla sua home page
// o inseriemo dirattamente il link per il download oppure il link
della home page
BrowserLaunch.openURL(jTextField1.getText().trim());
dispose();
}
private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt)
{
}
private void setCampo(String software) {
Vincenzo Masullo 566/2795
Pagina 259 di 265
// http://httpd.apache.org/
-- home page --if ( software.equals("Apache"))
{ //jTextField1.setText("http://apache.fastbull.org/httpd/httpd-2.
0.63.tar.gz");
jTextField1.setText("file:///home/vincent/Scrivania/Software");
}
// http://www.gnu.org/software/mailman/index.html
-- home page
--
if ( software.equals("Mailman"))
{
jTextField1.setText("http://143.225.85.34/cgibin/mailman/listinfo");
// jTextField1.setText("http://localhost/cgibin/mailman/listinfo");
// m.stampaMex("Thanks for your cooperation !");
// dispose();
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
}
});
}
public void main_pr() {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JTextField jTextField1;
// End of variables declaration
public void windowClosing(WindowEvent we) {
}
dispose();
Vincenzo Masullo 566/2795
Pagina 260 di 265
public void windowOpened(WindowEvent we) {
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
}
7.4.3.8 Utility.java
package Windows_Version;
import java.io.File;
import javax.swing.JOptionPane;
/**
*
* La Classe Utility fornisce alcuni metodi che permettono di controllare
se i campi dei form sono vuoti
* oppure se un file esiste o meno, ad altre utility varie.
*
* @version 1.0
* @author Vincenzo Masullo 566/2795
*
*/
public class Utility {
/**
* Controllo se il campo è vuoto
*
Vincenzo Masullo 566/2795
Pagina 261 di 265
* @param value
* stringa da controllare
*
*/
public static boolean isFieldEmpty(String value){
if(value!=null && value.equals(""))
return true;
return false;
}
/**
* Controllo se il programma è installato
*
* @param percorso
* stringa da controllare
*
*/
public boolean controllo(String percorso)
{
String indirizzo = percorso;
boolean exists = (new File(indirizzo)).exists();
// definisco exists come booleano (true/false) e attraverso la classe
File e il methodo exists che verifica l'esistenza del file indicato
if (exists) {
// se il file esiste questo controllo ritorna un valore uguale a true
System.out.println("Il file esiste"); // test true
return true;
}
else {
System.out.println("Il file non esiste"); // test false
return false;
}
}
/**
* Controllo se è un file ( isFile )
*
* @param percorso
* stringa da controllare
*
*/
public boolean controlloFile(String percorso)
{
String indirizzo = percorso;
boolean isFile = (new File(indirizzo)).isFile();
// definisco exists come booleano (true/false) e attraverso la classe
File e il methodo exists che verifica l'esistenza del file indicato
Vincenzo Masullo 566/2795
Pagina 262 di 265
if (isFile) {
// se il file esiste questo controllo ritorna un valore uguale a true
System.out.println("Il file esiste"); // test true
return true;
}
else {
System.out.println("Il file non esiste"); // test false
return false;
}
}
/**
* Gestisce l'uscita dall'applicazione
*
*/
public void uscita()
{
int risultato = JOptionPane.showConfirmDialog(null,"Setup has not
completed. Are you sure want to exit ?","Setup
incomplete",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
if (risultato == JOptionPane.OK_OPTION)
System.exit(0);
}
}
Vincenzo Masullo 566/2795
Pagina 263 di 265
8.Bibliografia e Sitografia
[1] Ian Sommerville - Software Engineering - Addison-Wesley, VIII ed.
[2] Bruce Eckel - Thinking in Java - vol. 1,2,3 - Pearson Education, IV ed.
[3] Andrew S.Tenenbaum - Computer Networks - Prentice Hall, IV ed.
[4] SNMP
http://www.net-snmp.org/
[5] Cacti
http://www.cacti.net
[6] RRDTool
http://oss.oetiker.ch/rrdtool/
[7] Apache2
http://it.wikipedia.org/wiki/Apache_HTTP_Server
[8] Apache2
http://www.apache.org/
[9] Php
http://it.wikipedia.org/wiki/PHP
[10] Mysql
http://it.wikipedia.org/wiki/MySQL
[11] Mysql
http://www.mysql.com/
[12] Mailman
http://list.org
[13] Mailman
http://www.freeonline.org/articolo_linux_dtml/a-106/
[14] phpMyAdmin http://www.phpmyadmin.net/home_page/index.php
[15] CVS
http://it.wikipedia.org/wiki/Concurrent_Versions_System
[16] Subversion
http://subversion.tigris.org/
[17] Bugzilla
http://www.bugzilla.org/
[18] Joomla
http://www.joomla.it/
[19] HTML
http://www.html.it/
[20] JavaSwing
http://it.wikipedia.org/wiki/Swing_(Java)
[21] VMware
http://www.vmware.com/products/workstation/
[22] Debian
http://www.debian.org/
[23] Redhat
http://www.redhat.com/
Vincenzo Masullo 566/2795
Pagina 264 di 265
[24] Tomcat
http://tomcat.apache.org/
Vincenzo Masullo 566/2795
Pagina 265 di 265