Zarządzanie i integracja aplikacji Java EE

Slides:



Advertisements
Podobne prezentacje
Graficzny klient SVN graficzny klient SVN integrujący się z powłoką systemu dostępny tylko dla systemu Windows - do pobrania z
Advertisements

Usługi sieciowe Wykład 5 DHCP- debian
ZAPORY SIECIOWE Firewall – ściana fizycznie oddzielająca silnik od pasażerów w samochodzie Sposób zabezpieczenia komputera/sieci przed osobami niepowołanymi.
Bramka zabezpieczająca VPN
Sieci komputerowe Usługi sieciowe Piotr Górczyński 27/09/2002.
Kamil Smitkiewicz Bezpieczeństwo w PHP.
1 Linux jako system wielozadaniowy i wielodostępny.
ADAM Active Directory w trybie aplikacyjnym
Autor Roman Jędras Prowadzący: dr inż. Antoni Izworski Przedmiot:
SIECI KOMPUTEROWE (SieKom) PIOTR MAJCHER WYŻSZA SZKOŁA ZARZĄDZANIA I MARKETINGU W SOCHACZEWIE Zarządzanie.
SIECI KOMPUTEROWE (SieKom) PIOTR MAJCHER WYŻSZA SZKOŁA ZARZĄDZANIA I MARKETINGU W SOCHACZEWIE INSTALACJA.
WITAM NA SZKOLENIU Porady na dziś i jutro.
Zarządzanie konfiguracją Doskonalenie Procesów Programowych Wykład 6 Copyright, 2001 © Jerzy.
Obsługa serwera zdalnego przez klienta FTP
Systemy operacyjne.
Proxy (WWW cache) Sieci Komputerowe
Czym jest ISA 2004 Microsoft Internet Security and Acceleration Server 2004 jest zaawansowaną zapora filtrującą ruch w warstwie aplikacji. Razem z zaporą.
Wzorce projektowe w J2EE
Artur Szmigiel Paweł Zarębski Kl. III i
SAMBA JAKO SERWER PLIKÓW
1 Podstawy informatyki H. P. Janecki- 2006_ Systemy Operacyjne W6.
POŁĄCZENIE MODEMOWE 1. Połączenie modemowe w Ubuntu.
USŁUGA FTP 1. Definicja FTP. FTP (File Transfer Protocol, ang. protokół transmisji plików) jest protokołem typu klient-serwer, który umożliwia przesyłanie.
SIEĆ P2P 1. Definicja sieci równouprawnionej. To taka sieć, która składa się z komputerów o takim samym priorytecie ważności, a każdy z nich może pełnić.
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
Konfiguracja kont w programie Adobe Dreamweaver
Protokół Komunikacyjny
MODEL WARSTWOWY PROTOKOŁY TCP/IP
Tworzenie nowych kont lokalnych i domenowych, oraz zarządzanie nimi
Linux - polecenia.
Prezentacja i szkolenie
Sieci komputerowe.
Sieciowe Systemy Operacyjne
Programowanie obiektowe – zastosowanie języka Java SE
Sieciowe systemy operacyjne - UNIX
Administracja serwerami sieciowymi Linux Serwer FTP
Sieć oparta o serwer Ubuntu 12.10
mgr inż. Mariola Stróżyk
Linux w sieci Konfigurowanie interfejsu sieciowego.
Integracja iStore z programem Subiekt GT
SYSTEMY OPERACYJNE Adresowanie IP cz3.
Systemy zarządzania treścią Wykład 5
Etapy uruchamiania systemu Pliki konfiguracyjne
Sieci komputerowe.
Projektowanie stron WWW
Narzędzia klienta usługi archiwizacji Warsztaty „Usługa powszechnej archiwizacji” Michał Białoskórski, CI TASK Bartłomiej Balcerek, WCSS.
Podstawy programowania
Konfiguracja VPN Klienta – Windows 7
System plików.
Andrzej Majkowski 1 informatyka +. 2 Bezpieczeństwo protokołu HTTP Paweł Perekietka.
Podstawy języka skryptów
1. Logowanie z usługą Active Directory. a) logowanie do domeny Windows 2003 Server odbywa się znacznie szybciej niż w poprzednich wersjach. b) nie ma odwołania.
Piotr Czapiewski Wydział Informatyki ZUT. Web Services Description Language.
Sposoby zdalnego sterowania pulpitem
Projektowanie obiektowe. Przykład: Punktem wyjścia w obiektowym tworzeniu systemu informacyjnego jest zawsze pewien model biznesowy. Przykład: Diagram.
ASP.NET Dostęp do bazy danych z poziomu kodu Elżbieta Mrówka-Matejewska.
InMoST Wielkopolska sieć współpracy w zakresie innowacyjnych metod wytwarzania oprogramowania Termin realizacji: – Innowacyjne metody.
Maven II Jakub Wojtaszczyk Piotr Tabor
Instalacja klucza HASP.
Wydział Matematyki, Informatyki i Architektury Krajobrazu
Sponsorzy: Media:. Sponsorzy: Media: MBUM 9/11/2017 Mikrotik Beer User Meeting Integracja uwierzytelniania tunelu L2TP/IPsec z Microsoft Active Directory.
PODSTAWOWE ZARZĄDZANIE KOMPUTERAMI Z SYSTEMEM WINDOWS
Linux ssh.
AudaPad / AudaShare AudaShare PRO (2.8)
PROGRAMY DO KONTROLI RODZICIELSKIEJ
Sieci komputerowe Usługi sieciowe 27/09/2002.
PROGRAMY DO KONTROLI RODZICIELSKIEJ
Programowanie obiektowe – zastosowanie języka Java SE
Wskaż wybrany krok lub kliknij Enter aby dowiedzieć się więcej.
Aplikacje i usługi internetowe
Zapis prezentacji:

Zarządzanie i integracja aplikacji Java EE Przemysław Nowak

Literatura Bezpieczeństwo w Unixie i Internecie, Simson Garfinkel, Gene Spafford, O’Reilly & Associates, Inc. Wydawnictwo RM, 1997 Nie tylko wirusy - hacking, cracking, bezpieczeństwo Internetu, Andrzej Dudek, Wydawnictwo Helion Polityka bezpieczeństwa i ochrony informacji. Tadeusz Kifner , Wydawnictwo Helion http://hacking.pl/ http://www.loc.gov/global/internet/security.html http://www.tisc2001.com pl.comp.security comp.os.linux.security comp.os.ms-windows.nt.admin.security comp.os.netware.security comp.security.unix i wiele innych ...

konfiguracja, administracja systemu Unix (Linux) konfiguracja, administracja systemu

System Unix MULTICS - 1960, AT&T, GE, MIT, projekt DARPA 1969 - Unix (PDP 7) 1970 - PDP 11 1973 - język C 1978 - Unix BSD 1979 - Unix AT&T SVR3 1988 - Unix SVR4, Unix OSF/1

System Unix - rodzina Unix Siódmego Wydania BSD System V3 OSF/1 FreeBSD SCO Unix BSD/OS Solaris SunOS AIX Linux

Linux - inicjowanie systemu reset, BIOS ładowanie programu rozruchowego ładowanie jądra (LILO, LoadLin) inicjalizacja obszarów roboczych jądra, sprzętu, systemu plików, terminali, montowanie dysków (dmesg) init (inittab) rc.d (styl BSD i System V) procesor Pentium po resecie rozpoczyna pracę w „trybie rzeczywistym” od adresu FFFF0 (BIOS POST), następnie jest czytany program startowy z MBR głównego dysku lub dyskietki (podobnie CD-ROM el-torito), następnie ładuje się jądro, ustawiane są deskryptory segmentów dla trybu wirtualnego, włączany jest tryb wirtualny... When an Intel based computer system is turned on, the BIOS goes through a simple procedure that triggers the booting of an operating system. The BIOS reads the first physical sector of the disk into memory locations 0000:7C00 through 0000:7DFF and performs a JMP to it. On hard disks, the first physical sector is the Master Boot Record. For floppy drives, the first physical sector is the Boot Sector. The master boot record is needed for hard disks because hard disks can be partitioned into multiple logical drives. The BIOS does not care whether it is loading a master boot record or a boot sector. When booting from hard disks, the master boot record moves itself to 0000:0600, and then overwrites it's original location (0000:7C00) with the boot sector. When booting from a floppy drive, which has no partitioning information and therefore no master boot record, only the boot sector is effectively loaded. The master boot record program is simpler to follow in comparison to the boot sector program (examples of both programs for DOS based systems may be obtained in commented assembler source from the author's web page). A DOS boot sector program actually overwrites sections of itself in order to squeeze BIOS data into the 512 byte block of usable memory. Why it does this instead of simply using another region of memory to store the BIOS data is beyond me. The boot sector is a somewhat ugly assembler program to look at. When the boot sector is executed, none of the DOS interrupt handlers are in place yet. Everything must be done through the BIOS. The actual code in the boot sector varies depending on the operating system, yet it always attempts to boot the operating system. Note that the format of the disk is irrelevant, as the boot sector program uses only physical addresses and low level BIOS functions to access the drives.

/etc/inittab /etc/inittab Plik definiuje czynności które proces init powinien wykonywać gdy system przechodzi na poszczególne poziomy pracy. identyfikator : poziomy_startu : akcja : proces si::sysinit:/etc/rc.d/rc.sysinit pf::powerfail:/sbin/genpowerfail start c1:1235:respawn:/sbin/agetty 38400 tty1 linux /etc/rc.d/rc.sysinit Skrypt uruchamiany przy starcie systemu. Powinien zawierać podstawową inicjalizację systemu, taką jak przyłączanie lokalnych i systemowych partycji, włączanie ograniczeń dla użytkowników, ustawienie zegara systemowego czy załadowanie modułów systemu. 'Identyfikator' jest sekwencją max. do czterech znaków identyfikującą rekord danych w pliku. 'Poziomy_startu' podają listę poziomów, przy przejściu na które ma być uruchamiany dany proces. 'Akcja' opisuje akcję, która ma zostać podjęta, a 'proces' specyfikuje proces do uruchomienia.

Skrypty startowe (SystemV) /etc/rc.d/init.d/ Katalog zawierający skrypty uruchamiające i zatrzymujące poszczególne serwisy i demony podczas przejść pomiędzy różnymi poziomami startu. /etc/rc.d/rcX.d/ Katalogi zawierające dowiązania do tych skryptów z katalogu /etc/rc.d/init.d/, które mają zostać uruchomione bądź zatrzymane przy przejściu na konkretny poziom startu systemu. X oznacza numer poziomu startu. /etc/rc.d/rc Skrypt wykonywany przy zmianie poziomu startu systemu. Uruchamia wszystkie skrypty z odpowiedniego katalogu /etc/rc.d/rcX.d, podając im parametr w zależności od pierwszej litery w nazwie dowiązania: S oznacza, że skrypt ma uruchomić dany serwis lub demona, zaś K znaczy, że serwis ten należy zamknąć. /etc/rc.d/rc.local Skrypt wykonywany jako ostatni przy starcie systemu. Może uruchamiać różne dodatkowe procesy. /etc/profile Plik zawiera ustawienia zmiennych środowiskowych przy starcie systemu.

Skrypty Bourne’a nigdy SUID, jeżeli tak jednak być musi należy napisać C wrapper wywołujący (exec) skrypt jedna z pierwszych instrukcji: IFS= następna w kolejności: PATH=........ (bo inaczej te zmienne są dziedziczone) csh nie używać! problemy z wieloma rzeczami... (http://www.ooblick.com/text/CshProgrammingConsideredHarmful.ht ml)

Linux - podstawowe elementy jądro, funkcje systemowe, moduły jądra procesy i wątki, sygnały, identyfikatory procesów, inne atrybuty zarządzanie pamięcią system plików, prawa dostępu, rodzaje plików urządzenia fizyczne sieć, konfiguracja, usługi użytkownicy, grupy, kontrola dostępu, uprawnienia, użytkownik root, jądro - zapewnia przełączanie między programami, przydziela pamięć, obsługuje urządzenia fizyczne, zapewnia usługi w postaci funkcji systemowych jądro monolityczne i mikrojądro, moduły proces 0 - samo jądro (szeregowanie zadań), proces 1 - init, każdy proces (oprócz 0) posiada proces macierzysty, procesy mogą być uszeregowane w grupy, proces posiada 3 identyfikatory, proces posiada także deskryptory otwartych plików, priorytet (nice), ograniczenie wielkości pliku, środowisko: zmienne - katalog bieżący i ścieżki, umask atrybuty pliku: nazwa, właściciel, grupa, prawa dostępu, licznik dowiązań, SUID, GUID, i-węzły, katalogi urządzenia znakowe i blokowe, dyski, terminale protokół IP, konfiguracja interfejsu sieciowego (ifconfig), adresy (/etc/hosts, DNS), usługi (/etc/services, /etc/inetd), zdalne terminale (telnet), dostęp do plików (ftp, nfs), poczta elektroniczna, usługi adresowe, data i czas, zdalne wywoływanie procdur lista użytkowników (/etc/passwd), identyfikatory i hasła (/etc/passwd, /etc/shadow), zmiana tożsamości (su), katalog domowy, powłoka (shell), przynależność do grup (/etc/groups), uprawnienia użytkownika root (UID 0)

System plików UNIXa Blok startowy Blok specjalny Bloki struktur i-node Bloki danych 1 2... dysk (partycja) jest podzielony na bloki system plików posługuje się pojęciem i-node i-node (i-węzeł) odpowiada plikowi, katalogowi lub innym obiektom (pliki specjalne, gniazdka, kolejki FIFO) Blok specjalny zawiera informacje dotyczące całego systemu plików (rozmiar bloku, liczba bloków, typ systemu plików, liczba i-węzłów, prawa dostępu i czas ostatniej zmiany...) Lista i-węzłów zaczyna się od bloku o numerze 2. I-węzły są numerowane od 1, ale węzła o numerze 1 nie używa żaden plik - może on być używany przez listę uszkodzonych bloków dyskowych. Główny katalog dysku zaczyna się od i-węzła o numerze 2.

Budowa i-node Prawa dostępu Blok danych Właściciel Blok danych Rozmiar Czasy ... Blok danych Blok danych ... Bezpośrednie wskazania bloków danych Blok danych Blok pośredni Blok danych Dwustopniowe wskazanie pośrednie Blok danych Trójstopniowe wskazanie pośrednie Blok danych

Użytkownicy i ich działania identyfikatory hasła grupy superużytkownik (root) system plików i uprawnienia użytkowników programy SUID i GUID polecenie chown /etc/passwd - baza danych o użytkownikach i ich hasłach (w nowszych systemach /etc/shadow) Nazwa - dowolny ciąg znaków (od 1 do 8, czasem więcej, zaleca się litery i cyfry, nazwy zawierające znaki specjalne mogą być źródłem problemów) Hasło - dowolny ciąg znaków (od 1 do 8, czasem więcej, nie zaleca się jedynie znaków kontrolnych, które mogą być interpretowane przez terminal), w pliku /etc/passwd (lub /etc/shadow) w postaci zaszyfrowanej (hasła użytkownika używa się jako klucza algorytmu DES i szyfruje się 25 razy dane zerowe, w procesie szyfrowania uwzględnia się „sól” - jedną z 4096 wartości) wynik szyfrowania (64 bity) zamienia się na 11 znaków, dodaje 2 znaki „soli” i zapisuje w pliku /etc/passwd. Niektóre systemy sieciowe (np.. NIS, NIS+ firmy Sun operują na sieciowej wersji bazy danych /etc/passwd) Zmiana hasła - program passwd (zaleca się sprawdzić możliwość logowania po zmianie hasła), można wymuszać „silne” hasła, okresową zmianę hasła „Złe hasła” = drzwi otwarte Zapisywanie haseł - hasło nie może wyglądać jak hasło! Hasła jednorazowe, tokeny Używanie haseł w kilku miejscach Identyfikatory użytkowników i grup (/etc/groups) Konto superużytkownika - każde konto z UID równym 0 Znajdowanie programów z SUID i SGID: find / \(-perm -004000 -o -perm -002000 \) -type f -print Znajdowanie plików urządzeń: find / \( -type c -o -type b \) -exec ls -l {} \;

Użytkownicy - plik /etc/passwd Plik zawierający dane o użytkownikach systemu i ich hasłach. Informacja jest podana następująco: identyfikator : zaszyfrowane_hasło : numer_użytkownika : numer_grupy : katalog_domowy : interpretator_poleceń Hasła są podane w postaci zaszyfrowanej. tomek:&1$2fg5zZ#$1$mTx/.Y5:505:501:/home/tomek/:/bin/bash Ze względu na bezpieczeństwo zaszyfrowane hasła mogą być umieszczane w pliku /etc/shadow, z prawami do czytania tylko dla administratora systemu, wówczas w pliku /etc/passwd w ich miejsce umieszcza się '*'.

Linux - logowanie użytkowników init inittab fork, exec getty getty getty ..... exec podanie nazwy użytkownika login passwd chdir, setgid, setuid, exec shell podanie hasła (jeżeli potrzebne) sh

/etc/bashrc Plik zawiera ustawienia niektórych zmiennych środowiskowych oraz synonimów wspólnych dla wszystkich użytkowników.

Ochrona kont użytkowników konta bez haseł tomek::101:100:Tomasz Bezhasla:/home/tomek:/bin/bash konta grupowe martwe konta usermod ... konta domyślne news:x:9:13:news:/usr/lib/news: konta uruchamiające jedno polecenie date::99:100:date:/tmp:/sbin/date konta z ograniczonymi interpreterami (bash -r) tomek::101:100:Tomasz Ograniczony:/home/tomek:/bin/bash -r konta z ograniczonym systemem plików tomek::101:100:Tomasz Ograniczony:/home/tomek:* ograniczenia pory logowania bash -r (rbash) nie można zmieniać katalogu przez cd nie można zmieniać wartości zmiennych środowiskowych SHELL, PATH, ENV, BASH_ENV nie można używać / w nazwach programów używać przekierowywania strumieni >, <, >>, &>, >& używać exec aby zmienić używany interpreter poleceńte oraz inne ograniczenia te ograniczenia są nieaktywne w skryptach uruchomionych za pośrednictwem bash

Grupy użytkowników /etc/group Plik zawiera informacje o grupach użytkowników w systemie. Każda linia jest formatu: identyfikator_grupy : zaszyfrowane_hasło : numer_grupy : lista_użytkowników users::501:tomek,jurek,ania

Złe hasła imiona i nazwiska osób (rodziny, szefów, znajomych, dzieci), zwierząt imiona postaci bajkowych (np. frodo, gandalf itp.) nazwa systemu operacyjnego i komputera numery telefonów, numery rejestracyjne samochodów daty urodzenia inne informacje dające się łatwo zdobyć (np. adresy) nazw użytkowników w żadnej postaci (np. pisanych wielkimi literami lub podwójnie) słów ze słowników (także z innych języków) nazw własnych (miejsc, państw, krain geograficznych) wyrazów składających się z powtórzonej jednej litery (np. aaaaaaaa), prostych wzorów (np. qwerty) każdego z powyższych napisanych wspak każdego z powyższych z dołączoną jedna cyfrą

Dobre hasła wielkie i małe litery jednocześnie cyfry i/lub znaki interpunkcyjne pomieszane z literami zawierają pewne znaki kontrolne lub spacje są łatwe do zapamiętania są przynajmniej siedmioznakowe dają się szybko wpisać

Specjalne metody identyfikacji Hasła jednorazowe (np. OPIE - One time Password In Everything) Tokeny (np. SecurID firmy Secure Dynamics, NetSecure firmy Digital Pathways) systemy wykorzystujące cechy biofizyczne użytkowników

Ochrona konta root bezpieczne terminale grupa wheel /etc/securetty /etc/suauth root:user1,usr2:OWNPASS root:ALL EXCEPT GROUP WHEEL:DENY usr1:user10:NOPAS /etc/securetty - plik zawierający nazwy terminali, z których administrator może się logować do systemu.

Uprawnienia użytkownika root zmiana wartości nice dowolnego procesu wysyłanie dowolnych sygnałów do dowolnych procesów zmiana ograniczeń systemowych (max. czas CPU, max.rozmiary plików itp..) włączanie i wyłączanie rozliczania zmiana identyfikatora na dowolnego użytkownika (polecenie su) wylogowywanie użytkowników oraz przeładowywanie systemu zalogowanie się pomimo istnienia pliku /etc/nologin ustawianie czasu dostęp do wszystkich urządzeń odczyt i zmiana dowolnego obszaru pamięci tworzenie plików urządzeń w dowolnych miejscach systemu plików (mknod)

Uprawnienia użytkownika root (cd) uruchamianie usług sieciowych na „zaufanych” portach rekonfiguracja sieci włączanie trybu „promiscous” interfejsu sieciowego odczyt, zmiana, usuwanie plików i programów uruchamianie dowolnego programu montowanie i odmontowywanie systemu plików dodawanie, usuwanie, zmiana kont użytkowników regulowanie ograniczeń miejsca na dysku i ustawianie systemu rozliczania używanie polecenia chroot zapisywanie plików pomimo 100% zapełnienia dysku

Uprawnienia użytkownika root (czego root nie może) dokonywać zmian w systemie plików zamontowanym „read only” - ale może pisać do „surowego” urządzenia lub zamontować dysk „read/write” odmontować system plików zawierający otwarte pliki lub w którym jakiś proces ma swój bieżący katalog odszyfrować zawartość pliku /etc/passwd - ale może zmodyfikować program login, tak aby hasła użytkowników były logowane, może też poleceniem passwd zmienić hasło konta z powyższych wynikają pewne przesłanki: wybrane pliki należy zapisywać na nośnikach wymiennych ważne pliki należy szyfrować jeżeli to możliwe, dyski należy montować w trybie „read only” należy tworzyć kopie zapasowe działającego systemu

Konfigurowanie systemu Linux

Konfiguracja typowe urządzenia i linki do nich (mouse, modem, cdrom, zip) punkty montowania dysków (szczególnie wymiennych) drukarka interfejs sieciowy konfiguracja autoryzacja ftp, telnet, ssh i inne usługi poczta (mime) nfs, samba, ncp (klient, server) ppp httpd X server linuxconf i inne

Typowe urządzenia i linki do nich (mouse, modem, cdrom, zip) /dev/mouse -> /dev/psaux (dla gpm) /dev/modem -> /dev/ttyS0 (dla minicom) /dev/cdrom -> /dev/hdc /dev/sda4 -> /dev/zip wiele programów odwołuje się do urządzeń fizycznych w „standardowy” sposób, dla ułatwienia sobie życia należy utworzyć linki na ogół można również znienić prawa dostępu do tych urządzeń, tak aby użytkownicy mogli ich używać np: ln -s /dev/ttyS0 /dev/modem

Punkty montowania dysków /etc/fstab, /etc/mtab Np.: /dev/fd0 /mnt/floppy auto user,noauto 0 1 /dev/cdrom /mnt/cdrom iso9660 ro,user,noauto 0 1 /dev/zip /mnt/zip vfat user,noauto,exec 0 1 /dev/hda1 /mnt/win vfat user,noauto 0 1 server:/export /mnt/server nfs defaults mount /mnt/cdrom mount -t iso9660 -o ro,user,noauto /dev/cdrom /mnt/cdrom /etc/fstab - zawiera statyczne informacje o różnych systemach plików przyłączonych do systemu. Jest on czytany przez programy ale nie zmieniany. Każda linia ma postać: s_block_dev mount_point fstype mntops freq passno s_block_dev - specjalne urządzenie blokowe lub zdalny system plików, który ma zostać przyłączony. mount_point - punkt przyłączenia danego systemu plików w drzewie katalogów. fstype - typ systemu plików, np. ext2 albo msdos. Typ systemu plików „auto” - wygodne dla dyskietek z systemami „msdos” i „vfat” oraz dla automounter'ów - próbowane są wszystkie rozpoznawalne typy na podstawie „superblock”, można usystematyzować poszukiwania plikiem /etc/filesystems mntops - opcje używane przy przyłączaniu danego systemu plików. Różne typy systemów plików używają specyficznych dla siebie opcji (należy czytać manual - polecenie mount) freq - parametr używany przez komendę dump. passno - parametr używany przez program fsck do ustalenia kolejności sprawdzania systemów plików. /etc/mtab - aktualna lista zamontowanych systemach plików (podobnie jak /proc/mounts). Są to wiadomości zmieniane dynamicznie przez komendy mount i unmount. Format danych jest taki sam jak w pliku /etc/fstab.

Drukarki z portem równoległym (/dev/lp0), szeregowym (/dev/ttyS0), USB (/dev/usb/lp0), drukarki sieciowe tzw. drukarki GDI (Windows) na ogół nie są obsługiwane! Postscript lub ghostscript oprócz lpd czasem używane są również takie systemy jak LPRng jest możliwe skonfigurowanie drukarki tak, aby drukowała na drukarkach sieciowych innego systemu wykorzystującego lpd, samba oraz ncp drukarką może być fax-modem z oprogramowaniem (np.. efax, mgetty) aby ustawić „standardową” drukarkę należy zdefiniować zmienną środowiska (np.. dla bash) PRINTER="printer_name"; export PRINTER

LPD - Line Printer Deamon lpd - spooling system (lpd, lpr, lpq, lpc, lprm) baza danych - /etc/printcap # LOCAL djet500 lp|dj|deskjet:sd=/var/spool/lpd/dj:mx#0:lp=/dev/lp0:sh:

CUPS - Common UNIX Printing System obsługuje IPP (Internet Printing Protocol) administracja, konfiguracja, status itp. przez WWW lub przez lpadmin obsługa szyfrowania (TLS i SSL) obsługa rozliczania (zadania/strony) sterowanie dostępem dla użytkowników obsługa PPD (PostScript Printer Description) API oraz biblioteki konfiguracja klienta - /etc/cups/client.conf

Interfejs sieciowy ifconfig lo 127.0.0.1 route add -host 127.0.0.1 lo ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up route add -net 192.168.1.0 netmask 255.255.255.0 eth0 route add default gw 192.168.1.1 eth0 /etc/services, /etc/protocols /etc/inetd.conf ftp stream tcp nowait root /usr/sbin/wu.ftpd -l -i -a - v telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd istotne informacje zawierają również pliki: /etc/services, /etc/protocols, /etc/networks

Interfejs sieciowy cd.. /etc/host.equiv, ~/.rhosts Demon tcpd: logowanie i sterowanie dostępem (/etc/host.allow, /etc/host.deny) # <service list>: <host list> [: command] /etc/hosts, /etc/networks, /etc/nsswitch.conf, /etc/resolv.conf masquarading, firewall - będzie jeszcze o tym mowa.... ipchains, iptables ipchains -A forward -s 192.168.1.0/24 -j MASQ

Interfejs sieciowy - filtr pakietów Warstwa aplikacji Programy klientów i serwerów Zapora sieciowa Źrodłowe i docelowe porty TCP/UDP Znaczniki stanu połączeń TCP Źródłowe i docelowe adresy IP Komunikaty ICMP Warstwa transportowa TCP, UDP Warstwa sieci IP, ICMP Warstwa łącza danych adresy MAC Sprzęt

ipchains (kernel 2.2.x) Suma kontrolna Poprawność Łańcuch wejściowy Demaskarada DENY DENY DENY / REJECT Łańcuch przekazujący Decyzja o rutingu Łańcuch wyjściowy DENY / REJECT DENY / REJECT Proces lokalny

iptables (kernel 2.4.x) Suma kontrolna Poprawność Decyzja o rutingu DROP DROP Decyzja o rutingu Łańcuch przekazujący Decyzja o rutingu DROP / REJECT Łańcuch wyjściowy Łańcuch wejściowy DROP / REJECT DROP / REJECT Proces lokalny

Interfejs sieciowy cd.. Serwer ftp: - /etc/ftpusers wu.ftpd, proftpd... anonymous ftp -> wydzielony system plików i chroot e-mail: serwer - sendmail, qmail klient - mail, pine fetchmail nfs: /etc/fstab, /etc/exports /home 192.168.0.0/255.255.255.0 (rw, no_root_squash)

Interfejs sieciowy cd.. DNS: bind /etc/named.conf bind uruchamiany na poziomie uprzywilejowania nadzorcy, zwykłego użytkownika, w pułapce chroot traffic shaper tc

Interfejs sieciowy cd.. samba: /etc/smb.conf dial-in server: mgetty ppp: /usr/sbin/pppd, /etc/ppp/*, /etc/inittab http: /usr/lib/apache/*

Program routed uruchamiany przy starcie systemu (ze skryptów rc.d) sprawdza, które interfejsy sieciowe są skonfigurowane i czynne (muszą być co najmniej 2) wysyła i odbiera w pętli komunikaty oraz modyfikuje tablice rutowania w jądrze /etc/gateways - dodatkowy plik konfiguracyjny net/host - trasa wiedzie do sieci/komputera nazwa1 - nazwa sieci lub komputera (/etc/networks, /etc/hosts, DNS lub vv.xx.yy.zz) nazwa2 - nazwa rutera pośredniczącego (opis jw) wartość - liczba przeskoków passive - ruter nie wymienia informacji poprzez RIP, trasa do niego jest instalowana w jądrze po starcie routed i nigdy się nie zmienia, nie jest też rozgłaszana active - ruter wymienia informacji poprzez RIP, trasa do niego jest traktowana identycznie jak trasy zidentyfikowane poprzez interfejsy sieciowe external - ruter zewnętrzny (pasywny), informuje routed że inny proces będzie się zajmował tą ścieżką i nie należy jej ani uwzględniać, ani rozgłaszać ani używać (użyteczne gdy dwa rutery mają dostęp do tego samego rutera zewnętrznego) <net | host> nazwa1 gateway nazwa2 metric wartość <passive | active | external>

Program gated obsługuje protokoły wewnętrzne RIP, OSPF, Hello, ISIS obsługuje protokoły zewnętrzne EGP, BGP mogą być uruchomione jednocześnie różne protokoły ścieżki wyznaczone przez protokół wewnętrzny mogą być publikowane przez protokół zewnętrzny polecenia konfiguracyjne w jednym pliku za pomocą spójnej składni

Program gated - konfiguracja (1) zawartość pliku /etc/gated.conf emulacja routed rip yes ; - emulacja routed „pasywnego” rip yes { nobroadcast ; } ;

Program gated - konfiguracja (2) Protokół RIP i OSPF interfaces { interface le0 passive ; } ; autonomoussystem 283 ; snmp yes ; rip yes { broadcast ; defaultmetric 5 ; interface le version 2 multicast ; ospf yes { traceoptions lsabuild protocol; monauthkey "XXXXXXXX" ; backbone { authtype simple ; interface al. { priority 2 ; } ; interface le { authkey "YYYYYYYY" ; }; static { default gateway 132.236.200.200 preference 140 retain ; rip broadcast - rozgłaszanie nawet wtedy jeżeli jest tylko jeden interfejs sieciowy rip defaultmetric - miara odległości dla ścieżek otrzymanych od innych protokołów ospf traceoptions lsabuild - śledzenie budowy komunikatów LSA (Link State Advertisement) ospf monauthkey - hasło dla monitorowania programem ospf_monitor ospf backbone - definicja obszaru ospf backbone priority - priorytet przy wyborze jako ruter dedykowany ospf backbone authkeu - hasło autoryzacji pakietów ospf static - ścieżka statyczna static preference - preferencja ścieżki static retain - ścieżka ma być wykorzystywana nawet gdy nie działa gated

Program gated - konfiguracja (3) export proto ospfase type 1 { proto bgp as 2021 { ALL metric 1; }; proto direct { }; export proto bgp as 2021 { proto ospfase { ospf yes { area 0.0.0.2 { authtype none; networks { 119.0.0.0 mask 255.0.0.0; }; interface 119.2.128.18 cost 1 { retransmitinterval 5; transitdelay 1; priority 1; hellointerval 10; routerdeadinterval 40; }; interface 119.4.128.18 retransmitinterval 5; transitdelay 1; priority 1; hellointerval 10; }; backbone { interface 19.1.1.19 retransmitinterval 5; transitdelay 1; priority 1; hellointerval 60; routerdeadinterval 180; }; Szkielet OSPF (Area 0.0.0.0) Ruter ID: 19.1.1.18 AS: 1019 bgp yes { preference 50; group type External peeras 2021 { peer 21.5.1.21 ; }; IGP peeras 1019 peer 19.1.1.19 ; BGP IGP 19.1.1.19 119.2.128 Ruter A 119.2.128.18 interfaces { options all passive; }; autonomoussystem 1019; routerid 19.1.1.18; rip no; hello no; egp no; OSPF Area: 0.0.0.2 119.4.128 119.4.128.18 bgp group type external peeras - bgp jest używany jako klasyczny protokół bramki brzegowej (wszyscy sąsiedzi z grupy należą do zewnętrznego AS) bgp group type external peeras .... peer - sąsiad o numerze jest członkiem grupy 21.1.1.21 BGP External: do AS 2021

X Server programy do konfiguracji: XF86Setup, XConfigurator, xf86config /etc/inittab id:4:initdefault: x1:4:wait:/etc/rc.d/rc.4 ~/.xinitrc, ~/.xsession ~/.Xdefaults XF86Setup: konfiguracja sprzętu (myszka, karty graficzna, monitor) xdm, kdm, gdm - program zastępujący login, uruchamiany (np.) .ze skryptu rc.4 xinit - „surowy” start Xwindows (umożliwia wybór manager X spośród wielu dostępnych - KDE, GNOME, FVWM, itp.) startx - skrypt uruchamiający Xwindows ~/.xinitrc - skrypt inicjalizacyjny (zawiera listę poleceń wykonywanych przy starcie) ~/.Xdefaults - ustawienia systemu X (lista czcionek, rozmiary i położenie okien, kolory itp..)

Demony systemowe cron bind syslogd, klogd inetd i inne

Konfiguracja cron’a - crontab /etc/crontab minuty godzina dzień_miesiąca miesiąc dzień_tygodnia program_do_wykonania znak '*' oznacza wykonanie o każdej dozwolonej wartości dla danego pola, można podawać listy wartości i zakresy plik crontab zawiera instrukcje dla demona cron służącego do uruchamiania różnych programów o ściśle określonych porach. Plik powinien ustawiać potrzebne zmienne systemowe: ścieżka interpretatora poleceń (SHELL), który ma być użyty do wykonania podanych dalej programów, ścieżki dostępu do tych programów (PATH), ewentualnie także nazwa użytkownika, do którego ma być wysyłana poczta będąca wynikiem wykonania podanych poleceń (MAILTO). Następne linie opisują kiedy i jakie programy powinny być uruchamiane. Uwaga: do edycji pliku należy stosować polecenie crontab -e zamiast normalnej edycji.

Sciany ogniowe (firewall) (1) atak sieciowy

Sciany ogniowe (firewall) (2) www nieuzasadnione korzystanie z zasobów sieciowych

Sciany ogniowe (firewall) (3) blokowanie dostępu do całej sieci z określonych miejsc w Internecie monitorowanie komunikacji, nawet rejestrowanie całej wymiany danych (nieocenione w przypadkach analizy zdarzeń) szyfrowanie/deszyfrowanie ruchu pomiędzy oddziałami organizacji ściana ogniowa pozwala na filtrowanie pakietów

Filtracja pakietów (1) filtracja na podstawie typu protokołu (np. blokowanie komunikatów ICMP) filtracja poziomu warstwy sieciowej (IP) przekazanie pakiety na podstawie adresów IP nadawcy i/lub odbiorcy filtracja poziomu warstwy transportowej (na podstawie numerów portów - rodzajów usług) filtracja na poziomie warstwy aplikacji (serwery proxy) NAT (masquarading) - ukrywanie struktury sieci

Filtracja pakietów (2) filtracja statyczna filtracja dynamiczna reguły „sztywno” ustalone, duża szybkość działania, mała elastyczność filtracja dynamiczna zasady zmieniane w czasie funkcjonowania systemu (odblokowywanie połączeń „na żądanie”), analiza ruchu i blokowanie wykrytych ataków

NAT B A C NAT nie istnieje fizyczne połączenie komputerów A i B oraz A i C, przesyłane pakiety są modyfikowane w komputerze realizującym NAT - zmiana adresów IP z punktu widzenia komputera A komunikuje się on wyłącznie z komputerem realizującym NAT, nie ma on żadnych informacji o strukturze sieci lokalnej w sieci lokalnej można używać adresów prywatnych 10.x.x.x, 192.168.x.x, ...

NAT

NAT - konfiguracja

Zastosowanie NAT Korzyści: redukcja zapotrzebowania na adresy publiczne łatwość organizacji sieci używając adresów prywatnych przezroczystość (dla niektórych aplikacji) bezpieczeństwo Wady: złożone dostosowanie niektórych protokołów (np. FTP) brak skalowania wprowadzenie dodatkowych węzłów sieci (multihomed networks) brak fizycznego połączenia end-to-end dla zapewnienia bezpieczeństwa potrzebny IPsec

Firewall - architektura DMZ Serwer ftp, http, news, DNS DMZ Strefa zdemilitaryzowana Strefa zdemilitaryzowana chroni klientów sieci lokalnej przed atakami wymierzonymi w serwery świadczące usługi publiczne. Ochrona serwerów i sieci lokalnej jest niezależna.

Zapory sieciowe (firewall) - pożądane cechy Wybór odpowiednich filtrów (pakietów, połączeń, usług itp.) Odporność na ataki Wydajność Monitorowanie sieci Dodatki (VPN, legalizacja i autoryzacja) Uwaga: zapory nie chronią przed atakami z wewnątrz sieci!

Firewall sieciowy Warstwa aplikacji Zapora sieciowa Programy serwera i klienta Zapora sieciowa Warstwa transportowa TCP, UDP źródłowe i docelowe porty TCP/UDP znaczniki stanu połączeń TCP Warstwa sieci IP, ICMP. IGMP źródłowe i docelowe adresy IP protokoły ICMP, IGMP.... Warstwa łącza danych MAC źródłowe i docelowe adresy sprzętowe Sprzęt

Netfilter CRC Poprawność DROP DROP Pre-Routing Forward Post-Routing DROP / REJECT Input Output DROP / REJECT DROP / REJECT Lokalny proces

Netfilter - Przyklad (1)

Netfilter - Przyklad (2) DMZ: Mail server SMTP to external Accept SMTP from internal and external Accept POP-3 from internal Name server Send DNS to external Accept DNS from internal, external and packet filter box Web server Accept HTTP from internal and external Rsync access from internal Packet Filter box: PING any network TRACEROUTE any network Access DNS Internal: Allow WWW, ftp, traceroute, ssh to external Allow SMTP to Mail server Allow POP-3 to Mail server Allow DNS to Name server Allow rsync to Web server Allow WWW to Web server Allow ping to packet filter box

Netfilter - Przyklad (3) for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done iptables -A INPUT -i ! lo -j DROP iptables -A OUTPUT -i ! lo -j DROP iptables -A FORWARD -j DROP ifconfig eth0 192.84.219.0 netmask 255.255.255.0 ifconfig eth1 192.168.1.0 netmask 255.255.255.0 pppd route add default ppp0 iptables -N internal-dmz iptables -N external-dmz iptables -N internal-external iptables -N dmz-internal iptables -N dmz-external iptables -N external-internal iptables -N icmp-accept iptables -N NEVER iptables -N LOGDROP

Netfilter - Przyklad (4) iptables -A NEVER -j LOG --log-level alert --log-prefix "filter ERROR: ” iptables -A NEVER -j DROP iptables -A LOGDROP -m limit -j LOG --log-prefix "filter: ” iptables -A LOGDROP -j DROP iptables -A FORWARD -i eth1 -o eth0 -j internal-dmz iptables -A FORWARD -i eth1 -o ppp0 -j internal-external iptables -A FORWARD -i eth0 -o ppp0 -j dmz-external iptables -A FORWARD -i eth0 -o eth1 -j dmz-internal iptables -A FORWARD -i ppp0 -o eth0 -j external-dmz iptables -A FORWARD -i ppp0 -o eth1 -j external-internal iptables -A FORWARD -j NEVER iptables -A icmp-accept -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A icmp-accept -p icmp --icmp-type source-quench -j ACCEPT iptables -A icmp-accept -p icmp --icmp-type time-exceeded -j ACCEPT iptables -A icmp-accept -p icmp --icmp-type parameter-problem -j ACCEPT

Netfilter - Przyklad (5) iptables -A internal-dmz -p tcp -d $MAILSERVER --dport smtp -j ACCEPT iptables -A internal-dmz -p tcp -d $MAILSERVER --dport pop-3 -j ACCEPT iptables -A internal-dmz -p udp -d $NAMESERVER --dport domain -j ACCEPT iptables -A internal-dmz -p tcp -d $NAMESERVER --dport domain -j ACCEPT iptables -A internal-dmz -p tcp -d $WEBSERVER --dport www -j ACCEPT iptables -A internal-dmz -p tcp -d $WEBSERVER --dport rsync -j ACCEPT iptables -A internal-dmz -p icmp -j icmp-accept iptables -A internal-dmz -j LOGDROP ptables -A external-dmz -p tcp -d $MAILSERVER --dport smtp -j ACCEPT iptables -A external-dmz -p udp -d $NAMESERVER --dport domain -j ACCEPT iptables -A external-dmz -p tcp -d $NAMESERVER --dport domain -j ACCEPT iptables -A external-dmz -p tcp -d $WEBSERVER --dport www -j ACCEPT iptables -A external-dmz -p icmp -j icmp-accept iptables -A external-dmz -j DROP

Netfilter - Przyklad (6) iptables -A internal-external -p tcp --dport www -j ACCEPT iptables -A internal-external -p tcp --dport ssh -j ACCEPT iptables -A internal-external -p udp --dport 33434:33500 -j ACCEPT iptables -A internal-external -p tcp --dport ftp -j ACCEPT iptables -A internal-external -p tcp --dport 1024:65535 -j ACCEPT iptables -A internal-external -p icmp --icmp-type ping -j ACCEPT iptables -A internal-external -j LOG iptables -A internal-external -j REJECT iptables -A dmz-internal -p tcp ! --syn -s $MAILSERVER smtp -j ACCEPT iptables -A dmz-internal -p udp -s $NAMESERVER domain -j ACCEPT iptables -A dmz-internal -p tcp ! --syn -s $NAMESERVER domain -j ACCEPT iptables -A dmz-internal -p tcp ! --syn -s $WEBSERVER www -j ACCEPT iptables -A dmz-internal -p tcp ! --syn -s $WEBSERVER rsync -j ACCEPT iptables -A dmz-internal -p icmp -j icmp-accept iptables -A dmz-internal -j NEVER

Netfilter - Przyklad (7) iptables -A dmz-external -p tcp -s $MAILSERVER smtp -j ACCEPT iptables -A dmz-external -p udp -s $NAMESERVER domain -j ACCEPT iptables -A dmz-external -p tcp -s $NAMESERVER domain -j ACCEPT iptables -A dmz-external -p tcp ! --syn -s $WEBSERVER www -j ACCEPT iptables -A dmz-external -p icmp -j icmp-accept iptables -A dmz-external -j NEVER iptables -A external-internal -p tcp ! --syn --sport www -j ACCEPT iptables -A external-internal -p tcp ! --syn --sport ssh -j ACCEPT iptables -A external-internal -p tcp ! --syn --sport ftp -j ACCEPT iptables -A external-internal -p tcp ! --syn --sport 1024:65535 -j ACCEPT iptables -A external-internal -p icmp --icmp-type pong -j ACCEPT iptables -A external-internal -j DROP iptables -N external-if iptables -N dmz-if iptables -N internal-if

Netfilter - Przyklad (8) iptables -A INPUT -i ppp0 -j external-if iptables -A INPUT -i eth0 -j dmz-if iptables -A INPUT -i eth1 -j internal-if iptables -A external-if -p icmp --icmp-type pong -j ACCEPT iptables -A external-if -j icmp-accept iptables -A external-if -j DROP iptables -A dmz-if -p tcp ! --syn -s $NAMESERVER 53 -j ACCEPT iptables -A dmz-if -p udp -s $NAMESERVER 53 -j ACCEPT iptables -A dmz-if -p icmp --icmp-type pong -j ACCEPT iptables -A dmz-if -j icmp-accept iptables -A dmz-if -j NEVER iptables -A internal-if -p icmp --icmp-type ping -j ACCEPT iptables -A internal-if -p icmp --icmp-type pong -j ACCEPT iptables -A internal-if -j icmp-accept iptables -A internal-if -j LOGDROP iptables -D 1 input; iptables -D 1 forward; iptables -D 1 output

Apache + JAVA + TOMCAT

Instalacja serwera Apache 2 Aktualizacja oprogramowania apt-get update apt-get –u upgrade Instalacja serwera www apt-get install apache2 apt-get install libapache2-mod-jk

Apache 2 Pliki konfiguracyjne serwera www znajdują się w katalogu /etc/apache2. Strony dostępne na serwerze można znaleźć w podkatalogu /etc/apache2/sites-available. W przypadku definiowania pojedynczego Virtual hosta można tego dokonać bezpośrednio w pliku /etc/apache2/apache2.conf

Instalacja Javy Pakiet do pobrania: http://www.oracle.com/technetwork/java/javase/downloads/index.html W celu dokonania instalacji należy: mv jdk-6u24-linux-i586.bin /usr/local chmod +x jdk-6u24-linux-i586.bin ./jdk-6u24-linux-i586.bin rm jdk-6u24-linux-i586.bin

Konfiguracja W pliku /etc/profile dodać export JAVA_HOME=/usr/local/java Zmodyfikować zmienna PATH do postaci: if [ "`id -u`" -eq 0 ]; then PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/ bin:/usr/local/java/bin" else PATH="/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/local/java/ bin" fi

Instalacja serwera Apache Tomcat Aplikacja dostępna pod adresem http://tomcat.apache.org/download-70.cgi Po pobraniu należy wykonać: mv apache-tomcat-7.0.12.tar.gz /usr/local/; cd /usr/local/ tar zxvf apache-tomcat-7.0.12.tar.gz ls -s apache-tomcat-7.0.12 tomcat Z poziomu konsoli: cd /usr/local/tomcat/bin/ chmod 755 shutdown.sh startup.sh

workers.properties # This file provides minimal jk configuration properties needed to # connect to Tomcat. # # We define a worker named ‘default’ #workers.tomcat_home=/usr/locale/tomcat/ workers.java_home=/usr/local/java/ ps=/ worker.list=default worker.default.port=8009 worker.default.host=localhost worker.default.type=ajp13 worker.default.lbfactor=1

Apache -> Tomcat W pliku apache2.conf # mod_jk config # workers.properties JkWorkersFile /etc/apache2/workers.properties# Where to put jk logs JkLogFile /var/log/apache2/jk.log # Set the jk log level [debug/error/info] JkLogLevel info # Select the log format JkLogStampFormat “[%a %b %d %H:%M:%S %Y] “ #JkOptions indicate to send SSL KEY SIZE, JkOptions +ForwardKeySize +ForwardURICompat –ForwardDirectories # JkRequestLogFormat set the request format JkRequestLogFormat “%w %V %T”

Virtual Host /etc/apache2/sites-available: <VirtualHost *:80> ServerName test.dmcs.pl ServerAdmin webmaster@dmcs.pl JkMount /* default JkMount /*.jsp default DirectoryIndex index.jsp index.html # Globally deny access to the WEB-INF directory <LocationMatch ‘.*WEB-INF.*’> AllowOverride None deny from all </LocationMatch> </VirtualHost>

Apache restart /etc/init.d/apache2 stop /usr/local/tomcat-5.5.25/bin/startup.sh /etc/init.d/apache2 start

Apache ANT

ANT Producent: Apache Software Foundation System operacyjny: GNU/Linux, Windows, Mac OS, BeOS Pierwsze wydanie: 19 lipca 2000 Aktualna wersja stabilna: 1.8.2

Czym jest ANT ? Narzędzie, służące do zautomatyzowania procesu budowy oprogramowania. Podobne do programu Make Napisany w Javie do wykorzystania z programami napisanymi w tym języku. Co najważniejsze, jest to open-source na licencji Apache Software Fundation. Apache Ant to narzędzie służące do zautomatyzowania procesu budowy oprogramowania. Podobne do programu Make ale napisane w języku Java do wykorzystania przede wszystkim z programami napisanymi w tym języku. Od razu zauważalną różnicą pomiędzy Ant i Make jest to, że Ant używa plików w formacie XML do opisu procesu budowy i jego zależności, gdzie Make ma własny format Makefile. Domyślnie plik XML nazywa się build.xml. Ant jest jednym z projektów Apache Software Foundation.

Ant a Make ? W pliku Makefile czynności określone jako komendy powłoki – zależne od platformy Ant rozwiązuje ten problem Użycie XML‘a i pliku build.xml Jednym z głównych celów Ant było rozwiązanie problemu przenośności Make. W pliku Makefile czynności potrzebne do stworzenia target są określone jako komendy powłoki, które są zależne od platformy. Ant rozwiązuje ten problem dostarczając dużą ilość wbudowanych funkcji, co gwarantuje identyczne zachowanie na wszystkich platformach. Np. w ww. pliku build.xml target clean kasuje rekursywnie folder classes. W pliku Makefile byłoby to zapisane w następujący sposób:

Schemat build.xml <project name="project_name" basedir="." default="default" <property name="src" value="./src" /> <target name="default"> <task1 param1="value" /> <task2> <type param="value" /> </task2> </target> </project>

Przykładowy build.xml <?xml version="1.0"?> <project name="Hello" default="compile"> <target name="clean" description="remove intermediate files"> <delete dir="classes"/> </target> <target name="compile" description="compile the Java source code to class files"> <mkdir dir="classes"/> <javac srcdir="." destdir="classes"/> <target name="jar" depends="compile" description="create a Jar file for the application"> <jar destfile="hello.jar"> <fileset dir="classes" includes="**/*.class"/> <manifest> <attribute name="Main-Class" value="HelloProgram"/> </manifest> </jar> </project> Poniżej znajduje się przykładowy plik build.xml dla prostej aplikacji "Hello, world" napisanej w języku Java. Definiuje trzy targets – clean, compile, jar, każdy z nich ma dołączony opis. Target jar ma opisany cel compile jako zależność. To mówi programowi Ant że zanim rozpocznie target jar musi ukończyć target compile. Każdy target to czynności jakie musi wykonać Ant żeby zbudować dany target. Np. do zbudowania target compile Ant musi najpierw stworzyć folder o nazwie classes (Ant stworzy go jeżeli jeszcze nie istnieje), po czym odwoła się do kompilatora Javy

ANT wymagania - JDK 1.2 lub nowsza download - http://ant.apache.org najnowsza wersja - Ant 1.8.2 (27-December- 2010 )

Do czego można użyć ANT’a? Ant możne pobierać kod źródłowy systemu kontroli wersji CVS, Subversion, Synergy, Perforce, ClearCase i wiele innych Ant można skompilować kod źródłowy Ant pozwala na przeprowadzanie testów jednostkowych JUnit3, JUnit4, TestNG lub dowolną aplikację testową Ant może pakować skompilowany kod i zasoby jars, wars, ears, tars, zips Ant może obsłużyć zależności pomiędzy target’ami Ant zawiera ponad 80 podstawowych zadań, a 60 opcjonalnych zadań Istnieje ponad 100 narzędzi firm trzecich i zadania pisemne na Ant Ant rozszerzeń można łatwo napisane dla innych unikalnych problem

Ant – przykładowa instalacja rozpakować apache-ant-1.8.2-bin.tar.gz do /usr/local/ant export ANT_HOME=/usr/local/ant exportJAVA_HOME=/usr/local/java export PATH=$PATH:$ANT_HOME/bin

Ant terminologia (1) project: <project> jest element najwyższego poziomu w skrypt Ant <project> ma trzy atrybuty opcjonalne: name nazwa projektu default domyślnego celu używać, gdy nie jest zdefiniowany cel basedir katalog bazowy, z którego wykonywane są ścieżki

Ant terminologia (2) target: Każdy projekt definiuje zero lub więcej target’ów target jest zbiorem zadań, które mają być zrealizowane Podczas uruchamiania Ant’a, można wybrać target(s), które będą wykonane Gdy żaden target nie jest wywołany, zostanie wykonany domyślnym target mogą być wykonywane warunkowo mogą być zdefiniowane zależności między target’ami

przykład <target name="A"/> <target name="B" depends="A"/> <target name="C" depends="A"/> <target name="D" depends="B,C"/> Załóżmy, że chcemy wykonać cel D, który zależy od B i C C zależy od A B zależy od A więc najpierw jest wykonywany A, następnie B, następnie C i na końcu D

Ant terminologia (3) tasks task jest to fragment kodu, który może być wykonany task może mieć wiele atrybutów Ant zawiera ponad 80 podstawowych zadań i 60 opcjonalnych Istnieje ponad 100 zadań firm trzecich napisanych dla Ant rozszerzenia Ant (zadania) mogą być z łatwością napisane innych unikalnych problem

Ant terminologia (4) Properties properties ma nazwę i wartość (case-sensitive) properties mogą być stosowane w wartości atrybutów zadania Odbywa się to poprzez umieszczenie nazwy pomiędzy "$ {" i "}" w wartości atrybutu Np., jeśli jest właściwość "builddir„ o wartości „build", może być wykorzystana w atrybucie: ${builddir}/classes . Jest to rozwijane w czasie wykonywania do postaci: build/classes Ant umożliwia dostęp do wszystkich właściwości systemu, jak gdyby zostały zdefiniowane przy użyciu <PROPERTY> zadania. Na przykład, $ {os.name} rozszerza się do nazwy systemu operacyjnego. Lista właściwości systemu patrz Javadoc z System.getProperties

Własności wbudowane Ant umożliwia dostęp do wszystkich właściwości systemu, jak gdyby zostały zdefiniowane przy użyciu <PROPERTY> zadania. Na przykład, $ {os.name} rozszerza się do nazwy systemu operacyjnego. Ant ma kilka wbudowanych właściwości: basedir - bezwzględną ścieżkę do projektu bazowego katalogu (zgodnie z atrybutem basedir z <project>) ant.file - ścieżkę bezwzględną buildfile ant.version - wersja Ant ant.project.name - nazwa projektu, który jest aktualnie wykonywany, ale jest w atrybut name <project> ant.java.version Lista właściwości systemu patrz Javadoc z System.getProperties

Ant dostępne środowiska WSAD / RAD / Eclipse Ant zbudowany jest na tych IDE Wszystkie posiadają wyspecjalizowane "Ant View" z linii poleceń Automatyzacja środowiska (CruiseControl) Wymaga JDK W dalszej części tej rozmowy będzie przy założeniu, że w linii poleceń jest używany, ale wszystko będzie nadal działać w IDE

Wiersz poleceń Ant ant [ options ] [ target-names ] uruchamia target określony nazwa i te od których zależy można podać wiele nazw oddzielonych spacjami -D opcja określa właściwość, która może być wykorzystana przez cele i zadania. np. -Dproperty-name=property-value ant -help wymienia inne opcje wiersza polecenia

Podstawowe zadania <copy> <concat> <delete> <filter> <fixcrlf> <get> <mkdir> <move> <replace> <sync> <tempfile> <touch>

Zadania kompilacji <javac> Kompiluje określony plik źródłowy <apt> Uruchomienie narzędzia procesor adnotacji (apt), a następnie opcjonalnie kompiluje kod <rmic> Uruchamia rmic kompilator

Zadania archwizacji <zip> , <unzip> tworzy plik zip. <jar> , <unjar> buduje plik jar <war> , <unwar> rozszerzenie pliku Jar na, archiwum www

Zadania testowe <junit> Działa z badań w ramach testów JUnit. <junitreport> Łączy poszczególne pliki XML generowane przez zadania Junit i generuje arkusz raportu.

Zadania własności <dirname> Ustawia własności do wartości ostatniego elementu ścieżki. <loadfile> Ładuje plik do własności. <propertyfile> Tworzy lub modyfikuje pliki własności. <uptodate> Ustawia właściwość, jeżeli dany plik jest nowszy niż docelowy zestaw plików źródłowych.

Inne zadania <echo> tekst Echoes do System.out lub do pliku. <javadoc> Generuje kod dokumentacji za pomocą narzędzia javadoc. <sql> Wykonuje szereg instrukcji SQL poprzez JDBC do bazy danych.

Usuwanie, tworzenie i kopiowanie Najważniejsze elementy pliku build.xml <deltree dir="${build}"/> <mkdir dir="${build}/${src}" /> <copy todir="${build}/${src}"> <fileset dir="${src}"> <include name="*.xml"/> <exclude name="index.xml"/> </fileset> </copy>

Komendy systemowe Ant umożliwia wykonywanie komend systemowych.  <exec failonerror="true" executable="/bin/mimic_cmd">     <arg value='"startDaemon()"' />  </exec>

Apache MAVEN

Maven Producent: Apache Software Foundation Pierwsze wydanie: 25th June 2007 Aktualna wersja stabilna: 3.0.3

Literatura • Maven: The Definitive Guide http://www.sonatype.com/books/maven- book/reference/public-book.html • Developing with Eclipse and Maven http://www.sonatype.com/m2eclipse/documentatio n/download-book?file=books/m2eclipse-book.pdf • Opisy wtyczek http://maven.apache.org

Czym jest Apache Maven Narzędzie automatyzującym budowę programowania na platformę Java. Funkcjonalności realizowane poprzez wtyczki automatycznie pobierane przy ich pierwszym wykorzystaniu. Plik określający sposób budowy aplikacji nosi nazwę POM-u (ang. Project Object Model).f

Cele Mavena Budowanie oprogramowania ma zakończyć się osiągnięciem wybranego przez budującego celu. Dostępnych celów jest wiele. Pula celów nie jest bezpośrednio określona przez twórcę POM-a, lecz przez wtyczki rozszerzające funkcjonalność Mavena. Poszczególne cele mogą wymagać wcześniejszej realizacji innych celów, np. cel package (zbudowanie paczki dystrybucyjnej) wymaga uprzedniej realizacji compile (kompilacja kodów źródłowych) oraz test (uruchomienie testów automatycznych). tak jak ma to miejsce w przypadku Anta lub Make'a,

Cykle życia (1) Mianem głównego cyklu życia projektu określa się uszeregowanych kolejno osiem najważniejszych z punktu widzenia budowy aplikacji celów. Powodzenie każdego kolejnego celu uzależnione jest od pomyślnej realizacji celów znajdujących się wcześniej w cyklu: validate - sprawdzenie, czy projekt jest poprawny i czy wszystkie niezbędne informacje zostały określone compile - kod źródłowy jest kompilowany test - przeprowadzane są testy jednostkowe

Cykle życia (2) package - budowana jest paczka dystrybucyjna integration-test - zbudowany projekt umieszczany jest w środowisku testowym, gdzie przeprowadzane są testy integracyjne verify - sprawdzenie, czy paczka jest poprawna install - paczka umieszczana jest w repozytorium lokalnym - może być używana przez inne projekty jako zależność deploy - paczka umieszczana jest w repozytorium zdalnym (opublikowana)

Co to POM ? POM, czyli Project Object Model, to dokument XML-owy kompleksowo opisujący projekt. POM nie tylko precyzuje szczegóły budowy produktu, ale też może przechowywać informacje o zespole programistów, zastosowanych systemach wspomagających rozwój oprogramowania. W Mavenie dokument POM nosi nazwę pom.xml.

Przykład POM (1) <project> <modelVersion>4.0.0</modelVersion> <!-- Podstawowe informacje dla Mavena  <groupId>...</groupId> <artifactId>...</artifactId> <version>...</version> <packaging>...</packaging> <dependencies>...</dependencies> <parent>...</parent> <dependencyManagement>...</dependencyManagement> <modules>...</modules> <properties>...</properties>

Przykład POM (2) <!-- Ustawienia budowania --> <build>...</build> <!-- Ustawienia generowania strony HTML z dokumentacją i raportami --> <reporting>...</reporting>

Przykład POM (3) <!-- Ogólne informacje o projekcie --> <name>...</name> <description>...</description> <url>...</url> <inceptionYear>...</inceptionYear> <licenses>...</licenses> <organization>...</organization> <developers>...</developers> <contributors>...</contributors>

Przykład POM (4) </project> <!-- Ustawienia środowiska tworzenia projektu --> <issueManagement>...</issueManagement> <ciManagement>...</ciManagement> <mailingLists>...</mailingLists> <scm>...</scm> <prerequisites>...</prerequisites> <repositories>...</repositories> <pluginRepositories>...</pluginRepositories> <distributionManagement>...</distributionManagement> <profiles>...</profiles> </project>

Powiązania pomiędzy plikami POM Agregacja - Mechanizm mający na celu rozbicie dużego projektu na podprojekty (moduły), by ułatwić zarządzanie źródłami. POM głównego projektu agreguje POM-y modułów, te zaś mogą agregować POM-y swoich podmodułów itd. Dziedziczenie - Każdy POM ma rodzica, którym jest inny dokument POM. Eliminuje to potrzebę jawnego określania wszystkich elementów w POM-ie każdego modułu Zależność Dziedziczenie- - jeżeli dana opcja nie została sprecyzowana w konkretnym POM-ie, to jest ona pobierana z rodzica. Jeżeli rodzic również jej nie określa, to z rodzica rodzica itd, ponieważ dziedziczenie POM-ów jest przechodnie. Jeżeli rodzic nie jest podany wprost, to jest nim tzw. Super POM - dokument określający domyślną konfigurację. Nie należy mylić dziedziczenia z agregacją - dziedziczenie to mechanizm mający na celu ograniczenie powielania treści POM-ów, podczas gdy agregacja ma na celu modularyzację projektu. Dziedziczenie jest niezależne od podziału projektu na moduły, choć oba mechanizmy bardzo często występują razem.

Tworzenie POM Programista może napisać POM-a samodzielnie od podstaw, prościej jednak użyć Mavena, który potrafi wygenerować prostego POM-a samodzielnie: mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=my-app

Wtyczki Większość funkcjonalności Mavena dostępna jest za pośrednictwem wtyczek. Każda z wtyczek posiada wyspecyfikowane cele które może realizować. Dany cel może być wywołany używając poniższej składni: mvn [nazwa-wtyczki]:[nazwa-celu] Przykładowo kompilacji kodu można dokonać wywołując mvn compile:compile.

Generowanie raportów Jedną z funkcjonalności Mavena jest zautomatyzowana generacja strony internetowej projektu. Strona, oprócz ogólnych informacji ustalanych na podstawie POM-a, zawiera również zbiór raportów dokumentujących projekt. W skład raportów wchodzą najczęściej Javadoc, kody źródłowe itd.

Maven a Ant Apache Ant jest innym narzędziem na platformę Java automatyzującym proces budowy oprogramowania. Pracując z Antem, programista tworzy skrypt (Buildfile) określający krok po kroku sposób budowy programu. W Mavenie natomiast określa raczej co ma zostać zbudowane i w jaki sposób, niż kiedy i w jakiej kolejności. Kolejność wykonywania poszczególnych faz jest ustalana przez Mavena. Maven wydaje się być mniej elastyczny niż Ant, nie jest to jednak prawdą, gdyż ostatecznie można nakazać Mavenowi wywołanie Anta. Na korzyść Mavena przemawia fakt, że stworzenie i utrzymanie pliku POM wymaga zwykle znacznie mniej pracy, niż Antowego Buildfile'a.

Instalacja Mavena

Konfiguracja środowiska Pobierz Maven2 ze strony http://maven.apache.org Zainstaluj Maven2 w maven_home Dodaj ścieżkę maven_home/bin do PATH (uwaga Linux/Windows) Ustal lokalizację JDK w zmiennej środowiskowej JAVA_HOME

Maven z Netbeans Zainstaluj plugin Maven w NetBeans (Tools → Plugins) Sprawdź czy w Tools → Options → Miscellaneous znajduje się zakładka Maven Na zakładce Maven podać lokalizację maven_home (o ile NetBeans sam nie wykrył Maven-a po PATH)

Maven z Eclipse • Pobierz plik archiwum z Eclipse. Dla przykładowej instalacji jako baza posłużyła wersja Eclipse 3.5 JavaEE (Galileo) • Zainstaluj Mylyn dla Eclipse 3.5: http://download.eclipse.org/tools/mylyn/update/e3.5 • Zainstaluj AspectJ dla Eclipse 3.5 http://download.eclipse.org/tools/ajdt/35/update • Zainstaluj Subclipse 1.6 http://subclipse.tigris.org/update_1.6.x • Zainstaluj GEF dla Eclipse 3.5 http://download.eclipse.org/tools/gef/updates/releases/ • Zainstaluj m2eclipse http://m2eclipse.sonatype.org/update/

Maven z Eclipse • W konfiguracji Eclipse jako masznę JAVA podać tę z pakietu JDK (eclipse.ini), np.: -vm e:\Programs\Java\jdk1.6.0_14\bin\javaw.exe • Dodać ścieżkę w Window → Preferences → Maven → Installations do katalogu w którym zainstalowano maven2 • Uwaga! Warto wyłączyć automatyczne budowanie projektu w Eclipse

Tworzenie projektu

Informacje wstępne • Projekty można tworzyć z poziomu: – Środowiska programistycznego – Linii poleceń i samego maven-a • Projekty tworzy się na podstawie tzw. archetypów np.: – Dla aplikacji bazującej na spring – Dla modułu EJB – Dla aplikacji WEB itd. • Środowisko programistyczne tak naprawdę wykorzystuje te archetypy i mavena do utworzenia określonego typu projektu

Projekt nadrzędny (POM) Utworzyć nowy projekt Maven File → New → Project (Alt+Shift+N) Wybrać Maven Project Wybrać archetyp (można przeszukiwać listę) groupId: org.codehouse.mojo.archetypes artifactId: pom-root

Docelowa struktura projektów

SuperPOM Jest to podstawowa konfiguracja dostarczana przez konkretną dystrybucję maven Kolejne wydanie maven może używać nowszych wtyczek (o wyższych numerach wersji) niż to z którego aktualnie korzystasz. Jeżeli coś działało w wersji, której do tej pory używałeś, to nie znaczy że będzie działało w wersji nowszej. Wniosek: zawsze podawaj numery wersji wtyczek w pom.xml

Projekt nadrzędny (POM) Do podania są następujące wartości: lokalizacja projektu na dysku grupId artifactId (nazwa projektu w IDE) wersja Plik pom.xml powinien mieć następującą postać: <modelVersion>4.0.0</modelVersion> <groupId>project.samples</groupId> <artifactId>NazwaProjektu</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <name>NazwaProjektu Multi Project</name> <url>http://maven.apache.org</url>

Projekt typu JEE 5 Enterprise (EAR) Projekt typu EAR składa (ang. assembly) dostępne moduły (artefakty) w archiwum EAR File → New Project (Ctrl+Shift+N) Wybrać Maven Project i Next Rozwinąć listę: Archetypes from Remote Maven Repositories (można wpisywać nazwę archetypu – Quick Search) Wybrać z listy: JEE 5 EAR Archetype i Next Podać: nazwę projektu, lokalizację, grupę, wersję i zatwierdzić Finish

Projektu typu UTILITY (JAR) File → New Project (Ctrl+Shift+N) Wybrać Maven Project i Next Wybrać Maven Quickstart Archetype i Next Podać: nazwę projektu, lokalizację, grupę, wersję i zatwierdzić Finish Zmienić wersję Java na wymaganą, np.:1.5 (Project →Properties → Sources)

Projekt JEE 5 EJB (JAR) File → New Project (Ctrl+Shift+N) Wybrać Maven Project i Next Rozwinąć listę Archetypes from Remote Maven Repositories Wybrać z listy JEE 5 ejb jar archetype (można wpisywać nazwę archetypu – Quick Search) i Next Podać nazwę projektu, lokalizację, grupę, wersję i zatwierdzić Finish

Projekt JEE 5 Web (WAR) File → New Project (Ctrl+Shift+N) Wybrać Maven Project i Next Rozwinąć listę Archetypes from Remote Maven Repositories Wybrać z listy JEE 5 web application archetype (można wpisywać nazwę archetypu – Quick Search) i Next Podać nazwę projektu, lokalizację, grupę i wersję, zatwierdzić Finish Z Project → Properties → Frameworks dodać framework web którego będziemy używać w projekcie

Konfiguracja projektu EAR Dodaj jako zależności moduł ejb i moduł web <dependency> <groupId>pl.test.was</groupId> <artifactId>WebModule</artifactId> <version>1.0-SNAPSHOT</version> <type>war</type> </dependency> <artifactId>EjbModule</artifactId> <type>ejb</type>

Konfiguracja maven-ear-plugin Dodaj do pliku pom wtyczkę maven-ear-plugin W konfiguracji wtyczki należy dopisać: <modules> <webModule> <groupId>pl.test.was</groupId> <artifactId>WebModule</artifactId> </webModule> <ejbModule> <artifactId>EjbModule</artifactId> </ejbModule> </modules> Powyższe moduły zostaną załączone do archiwum EAR w formie spakowanej (jar i war) EAR może zawierać 0..1 moduł WEB (war), 0..N modułów EJB (jar) i 0..N innych bibliotek JAR

Budowa aplikacji EJB3/3.1 W przypadku gdy chcemy aby moduły EJB i WEB nie były umieszczane razem w formie jednej aplikacji EAR, to pojawia się problem związany z zależnościami. Aplikacja WEB musi zawierać część kodu aplikacji EJB, a dokładniej specyfikację interfejsów komponentów EJB z których będzie korzystać. Projekt Maven dla EJB musi więc, oprócz zbudowania aplikacji EJB, wygenerować także archiwum jar zawierające te interfejsy.

Konfiguracja maven-ejb-plugin Ustawić wartość generateClient na true Wskazać w <clientIncludes> co ma zostać umieszczone w kliencie <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ejb-plugin</artifactId> <configuration> <generateClient>true</generateClient> <clientIncludes> <!--Dołącz do klienta tylko "zdalne interfejsy"--> <clientInclude> pl/test/sos/ejb/endpoint/*Remote.class </clientInclude> </clientIncludes> <ejbVersion>3.0</ejbVersion> </configuration> </plugin>

Konfiguracja projektu WEB W projekcie aplikacji WEB należy dodać zależność względem wcześniej wygenerowanego klienta aplikacji EJB – wartość <type> ustawiona na ejb-client <dependency> <groupId>${project.groupId}</groupId> <artifactId>EjbModule</artifactId> <version>${EjbModule.ver}</version> <type>ejb-client</type> </dependency> Maven wie, że nie należy dołączać archiwum jar z aplikacją EJB tylko archiwum jar klienta tej aplikacji. Zwróć uwagę na możliwość zastosowania: parametru EjbModule.ver, który zostały zdefiniowany w pliku konfiguracyjnym nadrzędnego projektu maven (pom) parametru standardowego project.groupId

PARAMETRY

Parametry standardowe Odwołanie do parametru ma postać ${nazwa_parametru} Standardowo dostępne wartości: project.* - wartości z Maven POM settings.* - ustawienia z settings.xml env.* - zmienne środowiskowe java.lang.System

Parametry standardowe: project • Najczęściej wykorzystywane wartości project.* – artifactId – groupId – version – build.* • directory • sourceDirectory

Parametry standardowe: settings Generalnie bardzo rzadko wykorzystuje się w ustawieniach projektu wartości z settings.xml Najczęściej wykorzystywane wartości z settings.* localRepository offline Za to bardzo wygodnie jest tam wpisać dane uwierzytelniające w sekcji <servers> dla wykorzystywanych serwerów podanych w sekcji <distributionManagement> pliku pom.xml

Parametry standardowe: env Najczęściej wykorzystywane wartości env.* path home java_home Jeżeli to tylko możliwe, powinno się używać wartości dostępnych poprzez java.lang.System

Parametry standardowe: java.lang.System Wartości bardzo często wykorzystywane Najbardziej popularne to: java.version java.home user.home user.dir line.separator file.separator os.*

Parametry użytkownika • Można definiować własne parametry • Wykorzystywane podczas konfiguracji projektu i przy filtrowaniu • Przykład definicji: <properties> <EJBModule.ver>1.0-SNAPSHOT</EJBModule.ver> <WEBModule.ver>1.0-SNAPSHOT</WEBModule.ver> </properties> • Przykład użycia: <dependency> <groupId>pl.szsk.was</groupId> <artifactId>WebModule</artifactId> <version>${WEBModule.ver}</version> <type>war</type> </dependency>

Filtrowanie Proces podstawiania wartości parametrów w plikach W pliku musi znajdować się odwołanie do parametru w postaci ${nazwa_parametru} Pozwala na zmianę treści plików konfiguracyjnych czy też samych plików źródłowych aplikacji np: Konfiguracja połączenia do bazy danych Adres WebService w adnotacji Proces filtrowania musi zostać jawnie uaktywniony. SUPERPOM ma domyślne ustawienia jak poniżej: <resources> <resource>src/main/resources</resource> <filtering>true</filtering> </resources>

Filtrowanie: przykład filtrowania źródeł <resources> <resource> <directory>src/main/java</directory> <filtering>true</filtering> <!-- domyślnie zasoby są kopiowane do target/classes --> <targetPath>../filtered-sources</targetPath> </resource> <!—trzeba podać też katalog z normalnymi plikami zasobów, inaczej ich nie skopiuje--> <directory>src/main/resources</directory> </resources>

Generowanie strony projektu

Generowanie strony projektowej (Site) • Sekcja <reporting >: konfiguracja raportów generowanych na potrzeby projektu <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> <version>2.1.2</version> </plugin> <artifactId>maven-javadoc-plugin</artifactId> <version>2.6</version> <configuration> <aggregate>true</aggregate> </configuration> </plugins> </reporting>

Generowanie strony projektowej (Site) W przypadku projektu wielomodułowego, strona będzie generowana z osobna dla każdego projektu. Raporty można zintegrować ustawiając wartość aggregate na true. Agregacja następuje dopiero po wykonaniu celu site:deploy • Dla celu site:deploy należy skonfigurować distributionManagement, tzn miejsce w którym zostanie umieszczona strona projektu. Może być to także okalizacja na serwerze plików czy też www (transport np.: scp). <distributionManagement> <site> <id>Test</id> <url>file://d://javaProg//docs</url> </site>

Konfiguracja serwerów: przykład • Plik pom.xml <distributionManagement> <site> <id>Test</id> <name>Test Site</name> <url>scp://nazwa_serwera/sciezka_do_np_public_html/</url> </site> </distributionManagement> • Plik settings.xml <servers> <server> <username>uzytkownik</username> <password>haslo</password> <filePermissions>664</filePermissions> <directoryPermissions>775</directoryPermissions> <configuration></configuration> </server> </servers>

Informacje o projekcie: przykład <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> <version>2.1.2</version> <reportSets> <reportSet> <reports> <report>index</report> <report>project-team</report> <report>dependencies</report> <report>dependency-convergence</report> <report>dependency-management</report> <report>plugin-management</report> <report>plugins</report> <report>summary</report> <report>scm</report> </reports> </reportSet> </reportSets> </plugin> Informacje brane są z plików pom.xml.

Listę członków zespołu projektowego bądź też organizacji należy umieścić w sekcji <developers>. Można też stworzyć dodatkową listę w sekcji <contributors> dla osób bądź jednostek przekazujących coś na rzecz projektu. Jeżeli generowane są raporty z scm (np. changelog) to id powinno być zgodne z loginem w tym systemie. <developers> <developer> <id>test</id> <name>test user</name> <email>test@gmail.com</email> <organization>Technical University of Lodz</organization> <organizationUrl>http://www.p.lodz.pl</organizationUrl> <timezone>CET</timezone> <roles> <role>kierownik projektu</role> <role>pracownik</role> </roles> </developer> </developers>

Informacje o projekcie: summary • Dane podstawowe o projekcie <name>Test</name> <description>Opis projektu</description> <url>http://strona_domowa_projektu</url> • Warto wpisać dane jednostki organizacyjnej. Informacja ta jest umieszczana dodatkowo w wielu raportach np.: javadoc <organization> <name>Technical University of Lodz</name> <url>http://www.p.lodz.pl</url> </organization>

Informacje o projekcie: scm Wyświetlane są podstawowe informacje o systemie scm użytym w projekcie, oraz jak z niego korzystać. Wymaga podania stosownych url w sekcji scm: <scm> <connection>scm:svn:svn://adres_repozytorium</connection> <url>http://adres_www_repozytorium</url> </scm> Można też w tej sekcji ustalić developerConnection dla scm. Ten url wykorzystywany jest przy operacjach zapisu connection jest tylko dla operacji oczytu url jest wykorzystywany w wielu raportach do podlinkowania plików źródłowych (o ile w ogóle system scm udostępnia pliki np. po http)

Informacje o projekcie: scm Skonfigurowanie sekcji scm pozwala z poziomu Maven wykonywać operacje w systemie scm np. commit, update itd. Wiele innych wtyczek bazuje na scm

Raporty na stronie projektowej W sekcji <reporting> można dodać wiele wtyczek generujących pożyteczne raporty. We wcześniej przedstawionym przykładzie znajdował się maven- javadoc-plugin W większości z nich należy zwrócić uwagę na sposób kodowania źródeł i sposób kodowania generowanego raportu. Domyślnie przyjmowane jest ISO-8859-1 Do ustalenia tych wartości warto zdefiniować w pliku pom parametry np. <source.enc> czy też <source.ver>, jak w przykładzie na kolejnym slajdzie. Parametry te powinny być także użyte np. w konfiguracji maven- compiler-plugin

Problemy przy generowaniu strony • Z uwagi na złożoność generowania strony projektowej, może pojawić się wyjątek OutOfMemoryError. Należy wtedy zmienić ustawienia maszyny wirtualnej dla maven set MAVEN_OPTS=-Xmx1024m -Xms512m - XX:PermSize=256m -XX:MaxPermSize=512m mvn site

Praca z repozytorium

Konfiguracja klienta svn po ssh • Założenia – Dostęp do repozytorium poprzez svn+ssh – Uwierzytelnianie z wykorzystaniem klucza prywatnego • Potrzebne są następujące programy – klient subversion (np. Collabnet) – putty (do konfiguracji ssh) – plink (do utworzenia połączenia ssh) – puttygen (gdy chcemy generować klucze)

Konfiguracja klienta svn po ssh • Wygodnie jest do PATH dodać ścieżkę do katalogu z zainstalowanymi programami putty, puttygen i plink (w tym przypadku nawet bardzo wskazane) oraz svn • W profilu użytkownika w Application Data\Subversion (%APPDATA%\Subversion) znajduje się plik konfiguracyjny config. Ustawienia można także wprowadzić z poziomu rejestru – patrz plik README • Domyślnie svn poszukuje ssh do nawiązania połączenia svn+ssh. Zmieniamy to na plink.exe w sekcji [tunnels] [tunnels] ssh = plink.exe

Konfiguracja połączenia svn po ssh • Uruchomić putty • Skonfigurować sesję – Session: • hostname: uzytkownik@serwer • connection type: SSH • session name: nazwa_sesji – Connection/SSH • Wybrać wersję protokołu – najlepiej v2 – Connection/SSH/Auth • Wskazać lokalizację pliku z kluczem prywatnym • Zapisać sesję z poziomu Session

Test i konfiguracja maven • Wykonać dowolne polecenie svn na repozytorium np.: svn ci svn+ssh://nazwa_sesji/lokalizacja_repo • Konfiguracja maven: <scm> <connection>scm:svn:svn+ssh://nazwa_sesji/lokalizacja_repo</connection> <developerConnection>scm:svn:svn+ssh://nazwa_sesji/lokalizacja_repo</deve loperConnection> <url>http://nazwa_serwera_web_svn/lokalizacja_repo</url> </scm> • Wykonać polecenie: mvn scm:checkin -Dmessage="test" • Jeżeli wszystko przebiegło pomyślnie oznacza to, że maven został prawidłowo skonfigurowany do pracy z repozytorium

BUDOWA PLANOWANEGO WYDANIA APLIKACJI

Konfiguracja wtyczki maven-release-plugin Przez „wydanie” rozumiemy utworzenie planowanej finalnej wersji projektu Jeżeli skonfigurowano projekt zgodnie z wcześniejszymi slajdami to jest on praktycznie gotów do użycia tej wtyczki • Wtyczka nie wymaga wtedy dodatkowej konfiguracji, aczkolwiek można to zrobić. <plugin> <artifactId>maven-release-plugin</artifactId> <version>2.0-beta-9</version> </plugin>

Cele wtyczki release:clean – usunięcie informacji (dodatkowych plików) po wykonaniu release:prepare release:prepare – przygotowanie wydania w SCM. release:rollback – wycofanie zmian z ostatniego wydania release:perform – wykonanie wydania z systemu SCM release:stage – wykonanie wydania do innego repozytorium albo katalogu release:branch – utworzenie rozgałęzienia aktualnego projektu z aktualizacją numerów wersji

Przygotowanie wydania, cel: prepare • Sprawdzenie zgodności źródeł z repozytorium (<scm>) • Zmiana numerów wersji w plikach pom.xml (część interaktywna, możliwy jest tryb wsadowy) • Zmiana informacji w <scm> tak aby odpowiadała nowej lokalizacji wydania w repozytorium, np. w systemie svn katalog tags • Wykonanie testów • Zatwierdzenie zamian w repozytorium (tags) • Podniesienie numerów wersji z jednoczesnym dodaniem SNAPSHOT • Zatwierdzenie zmian w repozytorium dla wersji rozwojowej np. w systemie svn katalog trunk

Inne przydatne cele projektowe Po wykonaniu celu prepare dobrze jest wykonać clean, celem usunięcia tymczasowych kopii plików pom.xml i informacji o przygotowanym ostatnim wydaniu W przypadku problemów z dokończeniem przygotowania wydania, gdy wykonane zostały zmiany w repozytorium można wycofać te zmiany przy pomocy celu rollback Można jednak po dokonaniu poprawek w konfiguracji kontynuować przygotowanie wydania przy pomocy celu prepare (takie jest domyślne ustawienie dla wtyczki, które oczywiście można zmienić)

Wydanie projektu, cel: perform Pobranie ostatniego wydania projektu Wykonanie celów: – deploy – umieszczenie artefaktów projektowych w repozytorium maven – site-deploy – umieszczenie strony projektowej na dedykowanym serwerze

Hudson

„Ręczna” integracja

Automatyczna integracja

Ciągła integracja CI, Ciągła integracja (ang. Continous Integration) – zestaw zaleceń i praktyk, które mają skrócić czas dostarczenia oprogramowania do użytkowników dzięki usprawnieniu integracji kodu.

CI - zalety Repozytorium kodu Automatyzacja build-ów Automatyzacja testów Commit codziennie, build co noc Izolacja środowiska testowego od produkcyjnego Szybkie build-y, wyniki dostępne dla każdego Automatyzacja instalacji

Systemy CI Hudson - https://hudson.dev.java.net Apache Continuum - http://continuum.apache.org CruiseControl - http://cruisecontrol.sourceforge.net/ LuntBuild - http://luntbuild.javaforge.com/ TeamCity - http://www.jetbrains.com/teamcity/index.html

CI - 2008

CI - 2009

Hudson - instalacja i uruchomienie java -jar hudson.war deploy w kontenerze Tomcat Dostęp: http://localhost:8080 Instalacja Hudson‘a jest wyjątkowo prosta. Wystarczy posiadać kontener servlet‘ów – może to być na przykład Apache Tomcat. W przypadku Tomcat‘a wystarczy jedynie przekopiować ściągnięty ze strony producenta plik hudson.war do katalogu webapps. Następnie uruchamiamy Tomcat‘a i to już wszystko! Przy standardowej konfiguracji Hudson powinien być dostępny pod adresem http://localhost:8080/hudson. Konfiguracja Hudson‘a odbywa się poprzez Manage Hudson/System Configuration dostępne z głównej stronie. Minimalne ustawienia, jakie należy wprowadzić, to między innymi: lokalizacja instalacji JDK lokalizacja instalacji Ant/Maven konfiguracja serwera SMTP z którego będzie korzystał Hudson Instalacji plugin‘ów należy dokonać poprzez opcję Manage Hudson/Manage Plugins. Po zainstalowaniu wtyczek należy zrestartować serwer aplikacji. W tym momencie powinniśmy posiadać już Hudson‘a w postaci pozwalającej nam na osiągnięcie wyżej wskazanych celów. Teraz czeka nas jeszcze trochę pracy poza ACI związanej z czynnościami, które należy wykonać nawet, jeżeliby projekt nie korzystał z dobrodziejstw CI.

HUDSON - zalety Prosta instalacja, Prosta obsługa, Możliwość obsługi dowolnych projektów (Ant, Maven, Make), Powiadomienia przez RSS/email/komunikator, Build-y w środowisku rozproszonym, Wtyczki wyświetlające raporty, metryki itp., Wykresy w postaci trendów.

Wtyczki SCM - integracja z systemami zarządzania kodem (inne niż SVN, CVS), Build triggers - wyzwalacze, Build tools - integracja z narzędziami do buildów, Build wrappers - dodatkowe operacje przed / po buildzie, Build notifiers - dodatkowe powiadomienia, Slave controllers - dodatkowe opcje zarządzania rozproszeniem obliczeń, Build reports - raporty, statystyki, wykresy, External site integrations - integracja z systemami zewn. Np. JIRA, Artifact uploaders - zarządzanie artefaktami, Page decorators - ozdobniki.

Tworzenie zadania Hudson‘a (1) Mając już gotowy projekt wraz z działającym skryptem budującym należy utworzyć zadanie Hudsona: z głównego panelu sterowania Hudson wybieramy opcję New Job określamy nazwę dla tworzonego zadania wybieramy free-style jako rodzaj projektu i przechodzimy do następnego ekranu, gdzie wpiszemy pozostałe szczegóły wybieramy system kontroli wersji z którego będzie korzystał Hudson (w naszym przypadku będzie to Subversion) jako warunek wywołania procesu integracji (Build Triggers) wybieramy cykliczne odpytywanie repozytorium (Poll SCM) w harmonogramie wpisujemy łańcuch znaków zgodny z formatem crond (np. */2 * * * * – odpytywanie co 2 minuty)

Tworzenie zadania Hudson‘a (2) następnie definiujemy, co właściwie będzie oznaczać dla Hudson‘a zbudowanie aplikacji – w naszym przypadku chcemy, aby było to wywołanie przy pomocy Ant‘a domyślnego celu zdefiniowanego w skrypcie budowania (zaznaczamy Invoke Ant) przyszedł czas na określenie czynności, które zostaną wykonane po zakończeniu budowania aplikacji – zgodnie z wcześniejszymi ustaleniami będzie interesowało nas: zachowanie artefaktów (validator.jar) z procesu budowania (Archive the artifacts) opublikowanie wyników testów jednostkowych (Publish JUnit test result report) opublikowanie wyników pokrycia kodu testami (Record Emma coverage report) opublikowanie wyników sprawdzenia jakości kodu przy użyciu checkstyle‘a (Report violations) wysłanie informacji o integracji, która się nie powiodła (E-mail Notification)

Dodatkowe zdania uzyskanie zbudowanej wersji aplikacji z konkretnego build‘a analiza zmienności w czasie różnych parametrów opisujących aplikację w celu określenia trendów (np. procentowe pokrycie testami kodu źródłowego) zatwierdzenie zmian w repozytorium, które spowodują niebudowanie się aplikacji spowoduje wysłanie maila na wskazany adres

Podsumowanie Hudson stanowił bardzo ważne ogniwo w procesie wytwarzania, dla większości standardowych zastosowań powinien być odpowiedni. pozostając bardzo intuicyjny oraz łatwy w konfiguracji dostarcza możliwości na zupełnie wystarczającym poziomie zaawansowania.