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" &gt; "$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" &gt; "$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> &nbsp; &nbsp; * 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