Jeśli mamy router na Linux'ie możemy sobie poradzić czymś takim:
tcpdump -i eth1 -t -q tcp[tcpflags]=tcp-syn | awk -v TIME="date +'%Y:%m:%d.%T'" 'function Time(t){ TIME | getline t; close(TIME); return t }{print Time() " " $2 " > " $4}' >> net.log
Z pliku tworzonego w powyższy sposóp np. możemy wyciągnąć listę miejsc z którymi nawiązano połączenie:
cat net.log | grep SPRAWDZANY_HOST | awk '{print $4}' | sort | uniq -c
Ewentualnie możemy odfiltrować za pomocą grep'a: np. grep -v "http\|pop3" albo grep -v "google\|gadu"
czwartek, 29 stycznia 2009
środa, 28 stycznia 2009
Linux full backup & restore w praktyce 2
Sytuacja wyjściowa - mamy serwer na FC6.
Chcemy go zwirtualizować do środowiska testowego w ramach Virtual PC 2007.
Konfiguracja dysków/partycji:
------------------------------------------------------------------------
#fdisk -l
Disk /dev/hda: 10.1 GB, 10110320640 bytes
255 heads, 63 sectors/track, 1229 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 13 104391 83 Linux
/dev/hda2 14 1229 9767520 8e Linux LVM
#df -H
System plików rozm. użyte dost. %uż. zamont. na
/dev/mapper/VolGroup00-LogVol00
9,2G 3,0G 5,8G 34% /
/dev/hda1 104M 17M 82M 18% /boot
tmpfs 131M 0 131M 0% /dev/shm
#lvm
lvs Display information about logical volumes
lvm> lvs
LV VG Attr LSize Origin Snap% Move Log Copy%
LogVol00 VolGroup00 -wi-ao 8,78G
LogVol01 VolGroup00 -wi-ao 512,00M
dumpconfig Dump active configuration
lvm> dumpconfig
devices {
dir="/dev"
scan="/dev"
filter="a/.*/"
cache="/etc/lvm/.cache"
write_cache_state=1
sysfs_scan=1
md_component_detection=1
}
activation {
missing_stripe_filler="/dev/ioerror"
reserved_stack=256
reserved_memory=8192
process_priority=-18
mirror_region_size=512
mirror_log_fault_policy="allocate"
mirror_device_fault_policy="remove"
}
global {
umask=63
test=0
activation=1
proc="/proc"
locking_type=1
fallback_to_clustered_locking=1
fallback_to_local_locking=1
locking_dir="/var/lock/lvm"
}
shell {
history_size=100
}
backup {
backup=1
backup_dir="/etc/lvm/backup"
archive=1
archive_dir="/etc/lvm/archive"
retain_min=10
retain_days=30
}
log {
verbose=0
syslog=1
overwrite=0
level=0
indent=1
command_names=0
prefix=" "
}
#vgdisplay
--- Volume group ---
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 9,31 GB
PE Size 32,00 MB
Total PE 298
Alloc PE / Size 297 / 9,28 GB
Free PE / Size 1 / 32,00 MB
VG UUID auUAps-FNGc-LzyH-nrlD-kIGs-DBEl-zneb6r
# lvdisplay
--- Logical volume ---
LV Name /dev/VolGroup00/LogVol00
VG Name VolGroup00
LV UUID RPJr3U-bMrm-R0dk-TrYi-QHYU-q0qd-tlRVIu
LV Write Access read/write
LV Status available
# open 1
LV Size 8,78 GB
Current LE 281
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:0
--- Logical volume ---
LV Name /dev/VolGroup00/LogVol01
VG Name VolGroup00
LV UUID rRaoSO-38zd-q2mU-Od5y-tCV2-CsWx-TL3M2r
LV Write Access read/write
LV Status available
# open 1
LV Size 512,00 MB
Current LE 16
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:1
#cat /etc/fstab
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
------------------------------------------------------------------------
Przede wszystkim przygotowujemy zrzuty plików naszego systemu który chcemy przenieść:
tar cvpjf /root/backup/backup_all.tar.bz2 --exclude=/proc --exclude=/boot --exclude=/lost+found --exclude=/root/backup/backup_all.tar.bz2 --exclude=/mnt --exclude=/sys /
tar cvpjf /root/backup/backup_boot.tar.bz2 /boot
Tak przygotowane obrazy udostępniamy przez SSH maszynie docelowej.
Do całego procesu "przywracania" serwera w wirtualnym środowisku użyjemy Sidux'a.
Podczas odpalania naszego LiveCD w parametrach uruchomieniowych dopisujemy ' xmodule=vesa' celem zapewnienia kompatybilnosci z naszym środowiskiem testowym w postaci VirtualPC 2007.
Opdalamy terminal na prawach root'a
Przygotowujemy nasz dysk wirtualny z VirtualPC za pomocą fdiska.
Zakładamy dwie partycje podstawowe :
/dev/sda1 - 100MB - docelowo na ext3 - ustawiamy flagę BOOT
/dev/sda2 - reszta miejsca - docelowo na Linux LVM
czyli pierwsza partycja:
#fdisk /dev/sda
>n
>1
>+100M
>a
>1
druga partycja:
>n
>2
>
>
>t
>2
>8e
>w
Upewniamy się że wszystko OK:
#fdisk -l /dev/sda
Następnie:
pvcreate /dev/sda2
vgcreate VolGroup00 /dev/sda2
lvcreate -L 15G -n LogVol00 VolGroup00
lvcreate -L 512M -n LogVol01 VolGroup00
Formatujemy:
mkfs.ext3 /dev/mapper/VolGroup00-LogVol00
mkswap /dev/mapper/VolGroup00-LogVol01
swapon /dev/mapper/VolGroup00-LogVol01
Podłączamy naszą partycję docelową dla plików:
mkdir /mnt/dysk
mount /dev/mapper/VolGroup00-LogVol00 /mnt/dysk
Podłączamy nasze źródło plików:
mkdir /mnt/backup
sshfs root@host:/root/backup /mnt/backup
Rozpakowujemy pliki:
tar xvpfj /mnt/backup/backup_all.tar.bz2 -C /mnt/dysk/
Podłączamy naszą partycję docelową boot:
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot
Rozpakowujemy pliki:
tar xvpfj /mnt/backup/backup_boot.tar.bz2 -C /mnt/
Odmontowujemy backup co by nas nie korciło:
umount /mnt/backup
Odtwarzamy katalogi wyłączone z backupowania:
cd /mnt/dysk
mkdir proc
mkdir lost+found
mkdir mnt
mkdir sys
Zmianie delikatnie uległa struktura dysków, zatem musimy się ewentualnie przyjrzeć plikom
/boot/grubmenu.lst
/etc/fstab
/etc/mtab
/etc/blkid/blkid.tab
/etc/blkid/blkid.tab.old
/etc/lvm/.cache
W związku z wystąpieniem błędu "fsck.ext3 Unable to resolve 'LABEL=/boot'" koniecznym okazało się wykonanie poleceń:
e2label /dev/hda1 /boot
tune2fs -L /boot /dev/hda1
Prawdopodobnie jedno z powyższych jest zbędne :)
Równie prawdopodobna jest konieczność utworzenia na dysku /dev/mapper/VolGroup00-LogVol00 katalogu /boot
Odmontowujemy wszystkie podłączone zasoby i reboot
Ustawiamy ponownie GRUB'a na dysku /dev/sda1
- odpalamy LiveCD
- w bootmenu - 2x ESC
- wciskamy 'c' - linia komend grub'a
- root (hd0,0)
- setup (hd0)
- halt
Odłączamy obraz LiveCD i bootujemy się z naszego wirtualnego dysku. Żeby nic się nie mieszało w naszej infrastrukturze odłączamy sieć dla wirtualnej maszyny.
Wskazówka: przy problemach z grafiką parametr grub'a 'vga=769' powoduje uruchomienie w rozdzielczosci 640x40x8bit.
Wskazówka#2: przy problemach z zalogowaniem się, parametr grub'a 'single' powoduje uruchomienie w trybie linux single user
Potencjalne problemy:
1) podczas logowania w CLI jest dokonywana autoryzacja, ale nie startuje nam bash i wracamy do logowania:
Last login Thu Aug 30 19:17:23 on tty1
audit (1188526650.254:17): avc: denied {entrypoint} for pid=2575 comm= "login
" name="bash" dev=dm-0 ino=107315213 scontext= user_u: system_r: hotplug_t: s0 tcont
ext= system_u: object_r: file_t: s0 tclass= file
login: no shell: Permission denied.
login: couldn't exec shell script: Permission Denied
Wskazówka: http://forums.fedoraforum.org/showthread.php?p=857325
Przyczyny:
Archiving Files with star
http://docs.fedoraproject.org/selinux-user-guide/f10/en-US/sect-Security-Enhanced_Linux-Maintaining_SELinux_Labels_-Archiving_Files_with_star.html
The UnOfficial SELinux FAQ
http://www.crypt.gen.nz/selinux/faq.html
Rozwiązanie nieeleganckie:
wyłączenie SELinuxa w /etc/selinux/config poprzez ustawienie dyrektywy SELINUX=disabled
Rozwiązanie bardziej eleganckie (prawdopodobnie):
pierwotna archiwizacja plików przez polecenie:
#star -xattr -H=exustar -c -f output.tar [files]
2) inne sposoby wgrania bootmanager'a:
Następnie przełączamy się do nowego środowiska:
mount --bind /dev/ /mnt/dysk/dev/
mount -t proc proc /mnt/dysk/proc/
Podmieniamy główny system plików na tą partycję:
chroot /mnt/dysk/ /bin/bash
W zależności od posiadanego bootmenedżera:
nano /etc/lilo.conf
Po czym:
lilo -v
lub
nano /boot/grub/menu.lst
grub-install --no-floppy --recheck /dev/sda1
exit
reboot
Jeśli komputer nie wystartował, ponownie uruchamiamy LiveCD:
mkdir /mnt/dysk
mount /dev/sda1 /mnt/dysk
grub-install --no-floppy --recheck --root-directory=/mnt/dysk /dev/sda1
------------------------------------------------------------------------
Garść wiedzy:
Tutaj tutorial dotyczący przebudowy partycji:
http://www.unixy.pl/forum/viewtopic.php?p=6427
I niejako przy okazji dotyczący przywracania GRUB'a
http://www.szarp.com.pl/howto/howto/html/grub-rescue.html
Deaktywacja LVM'a:
http://forums13.itrc.hp.com/service/forums/questionanswer.do?admit=109447627+1233063550888+28353475&threadId=1046794
PLD+LVM mini HOWTO:
http://bilbo.sgw.art.pl/doku.php?id=lvm
Jak ustawić LVM, jak robić snapshoty oraz automatycznie powiększać LVM
http://devrandom.pl/2008/12/lvm/
Tu jeszcze o narzędziach dotyczących dysków:
http://blog.oddied.net/2008/05/13/tutorial-od-uuid-do-label-w-ubuntu/
Chcemy go zwirtualizować do środowiska testowego w ramach Virtual PC 2007.
Konfiguracja dysków/partycji:
------------------------------------------------------------------------
#fdisk -l
Disk /dev/hda: 10.1 GB, 10110320640 bytes
255 heads, 63 sectors/track, 1229 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 13 104391 83 Linux
/dev/hda2 14 1229 9767520 8e Linux LVM
#df -H
System plików rozm. użyte dost. %uż. zamont. na
/dev/mapper/VolGroup00-LogVol00
9,2G 3,0G 5,8G 34% /
/dev/hda1 104M 17M 82M 18% /boot
tmpfs 131M 0 131M 0% /dev/shm
#lvm
lvs Display information about logical volumes
lvm> lvs
LV VG Attr LSize Origin Snap% Move Log Copy%
LogVol00 VolGroup00 -wi-ao 8,78G
LogVol01 VolGroup00 -wi-ao 512,00M
dumpconfig Dump active configuration
lvm> dumpconfig
devices {
dir="/dev"
scan="/dev"
filter="a/.*/"
cache="/etc/lvm/.cache"
write_cache_state=1
sysfs_scan=1
md_component_detection=1
}
activation {
missing_stripe_filler="/dev/ioerror"
reserved_stack=256
reserved_memory=8192
process_priority=-18
mirror_region_size=512
mirror_log_fault_policy="allocate"
mirror_device_fault_policy="remove"
}
global {
umask=63
test=0
activation=1
proc="/proc"
locking_type=1
fallback_to_clustered_locking=1
fallback_to_local_locking=1
locking_dir="/var/lock/lvm"
}
shell {
history_size=100
}
backup {
backup=1
backup_dir="/etc/lvm/backup"
archive=1
archive_dir="/etc/lvm/archive"
retain_min=10
retain_days=30
}
log {
verbose=0
syslog=1
overwrite=0
level=0
indent=1
command_names=0
prefix=" "
}
#vgdisplay
--- Volume group ---
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 9,31 GB
PE Size 32,00 MB
Total PE 298
Alloc PE / Size 297 / 9,28 GB
Free PE / Size 1 / 32,00 MB
VG UUID auUAps-FNGc-LzyH-nrlD-kIGs-DBEl-zneb6r
# lvdisplay
--- Logical volume ---
LV Name /dev/VolGroup00/LogVol00
VG Name VolGroup00
LV UUID RPJr3U-bMrm-R0dk-TrYi-QHYU-q0qd-tlRVIu
LV Write Access read/write
LV Status available
# open 1
LV Size 8,78 GB
Current LE 281
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:0
--- Logical volume ---
LV Name /dev/VolGroup00/LogVol01
VG Name VolGroup00
LV UUID rRaoSO-38zd-q2mU-Od5y-tCV2-CsWx-TL3M2r
LV Write Access read/write
LV Status available
# open 1
LV Size 512,00 MB
Current LE 16
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:1
#cat /etc/fstab
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
------------------------------------------------------------------------
Przede wszystkim przygotowujemy zrzuty plików naszego systemu który chcemy przenieść:
tar cvpjf /root/backup/backup_all.tar.bz2 --exclude=/proc --exclude=/boot --exclude=/lost+found --exclude=/root/backup/backup_all.tar.bz2 --exclude=/mnt --exclude=/sys /
tar cvpjf /root/backup/backup_boot.tar.bz2 /boot
Tak przygotowane obrazy udostępniamy przez SSH maszynie docelowej.
Do całego procesu "przywracania" serwera w wirtualnym środowisku użyjemy Sidux'a.
Podczas odpalania naszego LiveCD w parametrach uruchomieniowych dopisujemy ' xmodule=vesa' celem zapewnienia kompatybilnosci z naszym środowiskiem testowym w postaci VirtualPC 2007.
Opdalamy terminal na prawach root'a
Przygotowujemy nasz dysk wirtualny z VirtualPC za pomocą fdiska.
Zakładamy dwie partycje podstawowe :
/dev/sda1 - 100MB - docelowo na ext3 - ustawiamy flagę BOOT
/dev/sda2 - reszta miejsca - docelowo na Linux LVM
czyli pierwsza partycja:
#fdisk /dev/sda
>n
>1
>+100M
>a
>1
druga partycja:
>n
>2
>
>
>t
>2
>8e
>w
Upewniamy się że wszystko OK:
#fdisk -l /dev/sda
Następnie:
pvcreate /dev/sda2
vgcreate VolGroup00 /dev/sda2
lvcreate -L 15G -n LogVol00 VolGroup00
lvcreate -L 512M -n LogVol01 VolGroup00
Formatujemy:
mkfs.ext3 /dev/mapper/VolGroup00-LogVol00
mkswap /dev/mapper/VolGroup00-LogVol01
swapon /dev/mapper/VolGroup00-LogVol01
Podłączamy naszą partycję docelową dla plików:
mkdir /mnt/dysk
mount /dev/mapper/VolGroup00-LogVol00 /mnt/dysk
Podłączamy nasze źródło plików:
mkdir /mnt/backup
sshfs root@host:/root/backup /mnt/backup
Rozpakowujemy pliki:
tar xvpfj /mnt/backup/backup_all.tar.bz2 -C /mnt/dysk/
Podłączamy naszą partycję docelową boot:
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot
Rozpakowujemy pliki:
tar xvpfj /mnt/backup/backup_boot.tar.bz2 -C /mnt/
Odmontowujemy backup co by nas nie korciło:
umount /mnt/backup
Odtwarzamy katalogi wyłączone z backupowania:
cd /mnt/dysk
mkdir proc
mkdir lost+found
mkdir mnt
mkdir sys
Zmianie delikatnie uległa struktura dysków, zatem musimy się ewentualnie przyjrzeć plikom
/boot/grubmenu.lst
/etc/fstab
/etc/mtab
/etc/blkid/blkid.tab
/etc/blkid/blkid.tab.old
/etc/lvm/.cache
W związku z wystąpieniem błędu "fsck.ext3 Unable to resolve 'LABEL=/boot'" koniecznym okazało się wykonanie poleceń:
e2label /dev/hda1 /boot
tune2fs -L /boot /dev/hda1
Prawdopodobnie jedno z powyższych jest zbędne :)
Równie prawdopodobna jest konieczność utworzenia na dysku /dev/mapper/VolGroup00-LogVol00 katalogu /boot
Odmontowujemy wszystkie podłączone zasoby i reboot
Ustawiamy ponownie GRUB'a na dysku /dev/sda1
- odpalamy LiveCD
- w bootmenu - 2x ESC
- wciskamy 'c' - linia komend grub'a
- root (hd0,0)
- setup (hd0)
- halt
Odłączamy obraz LiveCD i bootujemy się z naszego wirtualnego dysku. Żeby nic się nie mieszało w naszej infrastrukturze odłączamy sieć dla wirtualnej maszyny.
Wskazówka: przy problemach z grafiką parametr grub'a 'vga=769' powoduje uruchomienie w rozdzielczosci 640x40x8bit.
Wskazówka#2: przy problemach z zalogowaniem się, parametr grub'a 'single' powoduje uruchomienie w trybie linux single user
Potencjalne problemy:
1) podczas logowania w CLI jest dokonywana autoryzacja, ale nie startuje nam bash i wracamy do logowania:
Last login Thu Aug 30 19:17:23 on tty1
audit (1188526650.254:17): avc: denied {entrypoint} for pid=2575 comm= "login
" name="bash" dev=dm-0 ino=107315213 scontext= user_u: system_r: hotplug_t: s0 tcont
ext= system_u: object_r: file_t: s0 tclass= file
login: no shell: Permission denied.
login: couldn't exec shell script: Permission Denied
Wskazówka: http://forums.fedoraforum.org/showthread.php?p=857325
Przyczyny:
Archiving Files with star
http://docs.fedoraproject.org/selinux-user-guide/f10/en-US/sect-Security-Enhanced_Linux-Maintaining_SELinux_Labels_-Archiving_Files_with_star.html
The UnOfficial SELinux FAQ
http://www.crypt.gen.nz/selinux/faq.html
Rozwiązanie nieeleganckie:
wyłączenie SELinuxa w /etc/selinux/config poprzez ustawienie dyrektywy SELINUX=disabled
Rozwiązanie bardziej eleganckie (prawdopodobnie):
pierwotna archiwizacja plików przez polecenie:
#star -xattr -H=exustar -c -f output.tar [files]
2) inne sposoby wgrania bootmanager'a:
Następnie przełączamy się do nowego środowiska:
mount --bind /dev/ /mnt/dysk/dev/
mount -t proc proc /mnt/dysk/proc/
Podmieniamy główny system plików na tą partycję:
chroot /mnt/dysk/ /bin/bash
W zależności od posiadanego bootmenedżera:
nano /etc/lilo.conf
Po czym:
lilo -v
lub
nano /boot/grub/menu.lst
grub-install --no-floppy --recheck /dev/sda1
exit
reboot
Jeśli komputer nie wystartował, ponownie uruchamiamy LiveCD:
mkdir /mnt/dysk
mount /dev/sda1 /mnt/dysk
grub-install --no-floppy --recheck --root-directory=/mnt/dysk /dev/sda1
------------------------------------------------------------------------
Garść wiedzy:
Tutaj tutorial dotyczący przebudowy partycji:
http://www.unixy.pl/forum/viewtopic.php?p=6427
I niejako przy okazji dotyczący przywracania GRUB'a
http://www.szarp.com.pl/howto/howto/html/grub-rescue.html
Deaktywacja LVM'a:
http://forums13.itrc.hp.com/service/forums/questionanswer.do?admit=109447627+1233063550888+28353475&threadId=1046794
PLD+LVM mini HOWTO:
http://bilbo.sgw.art.pl/doku.php?id=lvm
Jak ustawić LVM, jak robić snapshoty oraz automatycznie powiększać LVM
http://devrandom.pl/2008/12/lvm/
Tu jeszcze o narzędziach dotyczących dysków:
http://blog.oddied.net/2008/05/13/tutorial-od-uuid-do-label-w-ubuntu/
Instalacja PHPList
1. Miejsce docelowe \\NASZSERWER\HTDOCS\PHPLIST
2. Kopiujemy z paczki zawartość public_html\lists
3. Tworzymy bazę danych
phplist z utf8_bin
phplist / naszehasło
Żeby nie pojawił się błąd:
Database error 1071 while doing query Specified key was too long; max key length is 1000 bytes
http://forums.phplist.com/viewtopic.php?=&p=27451
w structure.php ustawiamy
"user_blacklist_data" => array(
"email" => array("varchar(233) not null unique","Email"),
4. Ustawiamy config.php
$language_module = "polish.inc";
$database_host = "localhost";
$database_name = "phplist";
$database_user = "phplist";
$database_password = 'naszehasło';
$installation_name = 'PHPlist';
$table_prefix = "phplist_";
$usertable_prefix = "phplist_user_";
$pageroot = '/phplist';
$adminpages = '/phplist/admin';
5. http://naszserwer/phplist/admin/
Wybieramy Initialise database
6. http://naszserwer/phplist/admin/?page=setup
wykonujemy pozostałe wstępne czynności konfiguracyjne
a. nowe hasło superadmina - HasłoSU
7. utworzenie nowej skrzynki pocztowej
newsletter@naszadomena.pl
adduser -d /home/naszpodkatalog/newsletter -g naszagrupa -m -p HasłoNews newsletter
/etc/mail/virtusertable - dodajemy użytkownika newsletter
makemap hash virtusertable < virtusertable
8. konfigurujemy config.php podając namiary na serwer SMTP i POP3 (dla bounces)
$bounce_mailbox_host = 'pop.naszserwer.pl';
$bounce_mailbox_user = 'newsletter';
$bounce_mailbox_password = 'HasłoNews';
define("PHPMAILERHOST",'smtp.naszserwer.pl');
$phpmailer_smtpuser = 'newsletter';
$phpmailer_smtppassword = 'HasłoNews';
9. Ustawiamy na 0 dyrektywę define ("TEST",0); by sprawdzić czy wiadomości są dostarczane
10. Plik polish.inc - zmieniamy kodowania na utf-8
2. Kopiujemy z paczki zawartość public_html\lists
3. Tworzymy bazę danych
phplist z utf8_bin
phplist / naszehasło
Żeby nie pojawił się błąd:
Database error 1071 while doing query Specified key was too long; max key length is 1000 bytes
http://forums.phplist.com/viewtopic.php?=&p=27451
w structure.php ustawiamy
"user_blacklist_data" => array(
"email" => array("varchar(233) not null unique","Email"),
4. Ustawiamy config.php
$language_module = "polish.inc";
$database_host = "localhost";
$database_name = "phplist";
$database_user = "phplist";
$database_password = 'naszehasło';
$installation_name = 'PHPlist';
$table_prefix = "phplist_";
$usertable_prefix = "phplist_user_";
$pageroot = '/phplist';
$adminpages = '/phplist/admin';
5. http://naszserwer/phplist/admin/
Wybieramy Initialise database
6. http://naszserwer/phplist/admin/?page=setup
wykonujemy pozostałe wstępne czynności konfiguracyjne
a. nowe hasło superadmina - HasłoSU
7. utworzenie nowej skrzynki pocztowej
newsletter@naszadomena.pl
adduser -d /home/naszpodkatalog/newsletter -g naszagrupa -m -p HasłoNews newsletter
/etc/mail/virtusertable - dodajemy użytkownika newsletter
makemap hash virtusertable < virtusertable
8. konfigurujemy config.php podając namiary na serwer SMTP i POP3 (dla bounces)
$bounce_mailbox_host = 'pop.naszserwer.pl';
$bounce_mailbox_user = 'newsletter';
$bounce_mailbox_password = 'HasłoNews';
define("PHPMAILERHOST",'smtp.naszserwer.pl');
$phpmailer_smtpuser = 'newsletter';
$phpmailer_smtppassword = 'HasłoNews';
9. Ustawiamy na 0 dyrektywę define ("TEST",0); by sprawdzić czy wiadomości są dostarczane
10. Plik polish.inc - zmieniamy kodowania na utf-8
poniedziałek, 26 stycznia 2009
niedziela, 25 stycznia 2009
piątek, 23 stycznia 2009
Newsletter dla całej firmy
Aktualnie poszukuję rozwiązania umożliwiającego gromadzenie bazy danych email klientów z podziałem na grupy, jednocześnie pozwalającego na wysyłanie newsletterów (najlepiej w HTML'u). Kandydaci:
Krishanletter, PHPList (instrukcja) oraz dyskusja.
Druga ścieżka: Exchange o ile da się podpiąć klientom spoza domeny / LDAP o ile klienci mogą edytować wpisy.
Krishanletter, PHPList (instrukcja) oraz dyskusja.
Druga ścieżka: Exchange o ile da się podpiąć klientom spoza domeny / LDAP o ile klienci mogą edytować wpisy.
czwartek, 22 stycznia 2009
Linux full backup & restore w praktyce
Potrzebne będą: Sidux oraz podstawowa wiedza. Ewentualne drugie źródło wiedzy.
Przy problemach z uruchamianiem Sidux'a (np. w VirtualPC 2007) przydatna będzie lista opcji startowych
Przy problemach z uruchamianiem Sidux'a (np. w VirtualPC 2007) przydatna będzie lista opcji startowych
BT3, kismet, airodump-ng i TP-Link TL-WN551G
Edytujemy /usr/local/etc/kismet.conf
Dodajemy gdzieś na początku linię:
source=madwifi_ag,wifi0,AtherosABG
Tryb klienta karty przestawiany poleceniami:
wlanconfig ath0 destroy
wlanconfig ath0 create wlandev wifi0 wlanmode sta
Airodumpa uruchamiamy poleceniem:
airodump-ng --write /naszkataloggdzies/naszplik --channel x --ivs wifi0
Połączmy naszą kartę ze sprawdzanym AP'kiem:
aireplay-ng -1 0 -e SSID -a MAC_AP -h MAC_NASZEJ_KARTY wifi0
MAC'a naszej karty uzyskamy m.in. poprzez:
macchanger -s ath0
Minitutorial: włam na WLAN
Dodajemy gdzieś na początku linię:
source=madwifi_ag,wifi0,AtherosABG
Tryb klienta karty przestawiany poleceniami:
wlanconfig ath0 destroy
wlanconfig ath0 create wlandev wifi0 wlanmode sta
Airodumpa uruchamiamy poleceniem:
airodump-ng --write /naszkataloggdzies/naszplik --channel x --ivs wifi0
Połączmy naszą kartę ze sprawdzanym AP'kiem:
aireplay-ng -1 0 -e SSID -a MAC_AP -h MAC_NASZEJ_KARTY wifi0
MAC'a naszej karty uzyskamy m.in. poprzez:
macchanger -s ath0
Minitutorial: włam na WLAN
środa, 21 stycznia 2009
BackTrack 3 - instalacja na dysku twardym
Przede wszystkim ściągamy LiveCD.
Następnie bootujemy BT3 (osobiście dla tego przypadku preferuję tryb tekstowy).
Logujemy się oczywiście ...
cfdisk
czyli zakładamy partycję na / oraz na swapa. Ustawiamy bootowalną. Reboot ...
Nową partycję formatujemy w ReiserFS (u mnie /dev/hda1):
mkreiserfs /dev/hda1
Różne inne sztuczki:
umount /dev/hda*
cd /
mkdir mnt/backtrack
mount /dev/hda* /mnt/backtrack
mkswap /dev/hda2
swapon /dev/hda2 (ewentualnie swapoff/swapon)
mkdir /mnt/backtrack/boot/
cp --preserve -R /{bin,dev,home,pentest,root,usr,etc,lib,opt,sbin,var} /mnt/backtrack/
Trochę potrwa i miejsca też zeżre :)
mkdir /mnt/backtrack/{mnt,proc,sys,tmp}
mount --bind /dev/ /mnt/backtrack/dev/
mount -t proc proc /mnt/backtrack/proc/
cp /boot/vmlinuz /mnt/backtrack/boot/
chroot /mnt/backtrack/ /bin/bash
nano /etc/lilo.conf
Wpisujemy co poniżej:
lba32
boot /dev/hda
prompt
timeout=60
change-rules
reset
vga=791
image = /boot/vmlinuz
root = /dev/hda1
label = backtrack3_final
Po czym:
lilo -v
exit
reboot
Przerobiłem na własnej skórze na podstawie poniższych:
http://kin.calvin.free.fr/blog/?p=16
http://forums.remote-exploit.org/showthread.php?t=14751
Następnie bootujemy BT3 (osobiście dla tego przypadku preferuję tryb tekstowy).
Logujemy się oczywiście ...
cfdisk
czyli zakładamy partycję na / oraz na swapa. Ustawiamy bootowalną. Reboot ...
Nową partycję formatujemy w ReiserFS (u mnie /dev/hda1):
mkreiserfs /dev/hda1
Różne inne sztuczki:
umount /dev/hda*
cd /
mkdir mnt/backtrack
mount /dev/hda* /mnt/backtrack
mkswap /dev/hda2
swapon /dev/hda2 (ewentualnie swapoff/swapon)
mkdir /mnt/backtrack/boot/
cp --preserve -R /{bin,dev,home,pentest,root,usr,etc,lib,opt,sbin,var} /mnt/backtrack/
Trochę potrwa i miejsca też zeżre :)
mkdir /mnt/backtrack/{mnt,proc,sys,tmp}
mount --bind /dev/ /mnt/backtrack/dev/
mount -t proc proc /mnt/backtrack/proc/
cp /boot/vmlinuz /mnt/backtrack/boot/
chroot /mnt/backtrack/ /bin/bash
nano /etc/lilo.conf
Wpisujemy co poniżej:
lba32
boot /dev/hda
prompt
timeout=60
change-rules
reset
vga=791
image = /boot/vmlinuz
root = /dev/hda1
label = backtrack3_final
Po czym:
lilo -v
exit
reboot
Przerobiłem na własnej skórze na podstawie poniższych:
http://kin.calvin.free.fr/blog/?p=16
http://forums.remote-exploit.org/showthread.php?t=14751
Problem - odbiorca wiadomości z Outlooka otrzymuje załącznik "Untitled Attac.dat" zamiast np. wpisu z kalendarza
Przyczyna:
MailScanner na serwerze poczty analizuje wiadomości między innymi poprzez "głęboką" analizę wysyłanych załączników.
Outlook wszelkie informacje własne "wymieniane z innymi Outlookami" wysyła w postaci załącznika winmail.dat.
Plik ten ma format archiwum TNEF i na serwerze poczty może być rozpakowany w celu sprawdzenia zawartości.
Jak wierzę, w zależności od konfiguracji programu, załącznik może być złożony z powrotem i zamieszczony jako nowy załącznik.
W naszym przypadku powodowało to dostarczenie "nieczytelnego" pliku i brak oczekiwanege rezultatu.
Należało w pliku konfiguracyjnym MailScanner'a zmienić dyrektywę "Use TNEF Contents" z "replace" na "no"
W kwestii wiary - mam nadzieję, że poniższa konfiguracja nie obniża bezpieczeństwa. Problem na pewno rozwiązuje.
# Expand TNEF attachments using an external program (or a Perl module)?
# This should be "yes" unless the scanner you are using (Sophos, McAfee) has
# the facility built-in. However, if you set it to "no", then the filenames
# within the TNEF attachment will not be checked against the filename rules.
Expand TNEF = yes
# When the TNEF (winmail.dat) attachments are expanded, should the
# attachments contained in there be added to the list of attachments in
# the message?
# If you set this to "add" or "replace" then recipients of messages sent
# in "Outlook Rich Text Format" (TNEF) will be able to read the attachments
# if they are not using Microsoft Outlook.
#
# no => Leave winmail.dat TNEF attachments alone.
# add => Add the contents of winmail.dat as extra attachments, but also
# still include the winmail.dat file itself. This will result in
# TNEF messages being doubled in size.
# replace => Replace the winmail.dat TNEF attachment with the files it
# contains, and delete the original winmail.dat file itself.
# This means the message stays the same size, but is usable by
# non-Outlook recipients.
#
# This can also be the filename of a ruleset.
Use TNEF Contents = no
# Some versions of Microsoft Outlook generate unparsable Rich Text
# format attachments. Do we want to deliver these bad attachments anyway?
# Setting this to yes introduces the slight risk of a virus getting through,
# but if you have a lot of troubled Outlook users you might need to do this.
# We are working on a replacement for the TNEF decoder.
# This can also be the filename of a ruleset.
Deliver Unparsable TNEF = no
MailScanner na serwerze poczty analizuje wiadomości między innymi poprzez "głęboką" analizę wysyłanych załączników.
Outlook wszelkie informacje własne "wymieniane z innymi Outlookami" wysyła w postaci załącznika winmail.dat.
Plik ten ma format archiwum TNEF i na serwerze poczty może być rozpakowany w celu sprawdzenia zawartości.
Jak wierzę, w zależności od konfiguracji programu, załącznik może być złożony z powrotem i zamieszczony jako nowy załącznik.
W naszym przypadku powodowało to dostarczenie "nieczytelnego" pliku i brak oczekiwanege rezultatu.
Należało w pliku konfiguracyjnym MailScanner'a zmienić dyrektywę "Use TNEF Contents" z "replace" na "no"
W kwestii wiary - mam nadzieję, że poniższa konfiguracja nie obniża bezpieczeństwa. Problem na pewno rozwiązuje.
# Expand TNEF attachments using an external program (or a Perl module)?
# This should be "yes" unless the scanner you are using (Sophos, McAfee) has
# the facility built-in. However, if you set it to "no", then the filenames
# within the TNEF attachment will not be checked against the filename rules.
Expand TNEF = yes
# When the TNEF (winmail.dat) attachments are expanded, should the
# attachments contained in there be added to the list of attachments in
# the message?
# If you set this to "add" or "replace" then recipients of messages sent
# in "Outlook Rich Text Format" (TNEF) will be able to read the attachments
# if they are not using Microsoft Outlook.
#
# no => Leave winmail.dat TNEF attachments alone.
# add => Add the contents of winmail.dat as extra attachments, but also
# still include the winmail.dat file itself. This will result in
# TNEF messages being doubled in size.
# replace => Replace the winmail.dat TNEF attachment with the files it
# contains, and delete the original winmail.dat file itself.
# This means the message stays the same size, but is usable by
# non-Outlook recipients.
#
# This can also be the filename of a ruleset.
Use TNEF Contents = no
# Some versions of Microsoft Outlook generate unparsable Rich Text
# format attachments. Do we want to deliver these bad attachments anyway?
# Setting this to yes introduces the slight risk of a virus getting through,
# but if you have a lot of troubled Outlook users you might need to do this.
# We are working on a replacement for the TNEF decoder.
# This can also be the filename of a ruleset.
Deliver Unparsable TNEF = no
wtorek, 20 stycznia 2009
Wardriving w teorii
Minitutorial, whoppix aka whax, sniffer, sniffer dedykowany, minitutorial na elektrodzie, videotutorial jak łamać WEP, drobne wskazówki, dyskusja, dedykowany program ElcomSoft'u, WPA rainbow tables, inne rainbow tables, alternatywne narzędzie z wykorzystaniem CUDA.
Czas zajrzeć na allegro.pl po antenę :) Karta bowiem już jest.
Szczegóły kart, specjalne sterowniki oraz jakaś dyskusja.
Czas zajrzeć na allegro.pl po antenę :) Karta bowiem już jest.
Szczegóły kart, specjalne sterowniki oraz jakaś dyskusja.
Identyfikacja i testowanie sprzętu PC pod Linuksem
W szczególności informacje na temat podłączonych dysków:
http://www.linuxdlafirm.pl/linux_podstawy/instalacja_urzadzen_pod_linuksem/identyfikacja_i_testowanie_sprzetu_pc_pod_linuksem_2.html
http://www.linuxdlafirm.pl/linux_podstawy/instalacja_urzadzen_pod_linuksem/identyfikacja_i_testowanie_sprzetu_pc_pod_linuksem_2.html
poniedziałek, 19 stycznia 2009
Jak nie powinna wyglądać domena?
www.obwodnicapolnocnaaglomeracjitrojmiejskiej.pl
Nie daj Boże być w potrzebie połączenia się ze stroną z telefonu komórkowego :)
Nie daj Boże być w potrzebie połączenia się ze stroną z telefonu komórkowego :)
sobota, 17 stycznia 2009
Squid - jak wyczyścić cache
squid stop
albo lepiej
squid -k kill
cd /var/spool/squid
rm -rf *
squid -z
squid start
albo lepiej
squid -k kill
cd /var/spool/squid
rm -rf *
squid -z
squid start
czwartek, 15 stycznia 2009
Symfony - dzień drugi
Opisujemy strukturę bazy danych w pliku config/schema.yml
Następnie tworzymy bazę: mysqladmin -uroot -pmYsEcret create jobeet
Wywołujemy polecenie:
php symfony configure:database "mysql:host=localhost;dbname=jobeet" root mYsEcret
które tak na prawdę zapisuje informacje o dostępie do bazy w pliku config/databases.yml co możemy wszak wykonać ręcznie :)
Wykonujemy polecenie: php symfony propel:build-sql
które przygotowuje dla nas skrypty SQL tworzące strukturę naszej bazy danych. Wyniki przechowywane w katalogu data/sql/ - tutaj data/sql/lib.model.schema.sql
Ostatecznie wywołujemy: php symfony propel:insert-sql
które tworzy naszą bazę danych. Należy uważać (choć jest stosowny alert) - wykonanie tego polecenia usuwa dotychczasowe tabele.
Na marginesie: opis polecenia uzyskamy przez zastowanie parametru help np. php symfony help propel:insert-sql
Generujemy klasy PHP mapujące naszą relacyjną bazę danych na obiekty: php symfony propel:build-model
W wyniku powyższego w katalogu lib/model/ tworzone są skrypty zawierające po cztery klasy na każdą z tabel naszej bazy danych.
Np. dla tabeli jobeet_job:
- JobeetJob - obiekt tej klasy to pojedyńczy rekord tabeli
- BaseJobeetJob - klasa z której dziedziczy klasa JobeetJob. Za każdym wywołaniem propel:build-model klasa ta jest nadpisywana, więc wszystkie modyfikacje muszą znajdować się w ramach JobeetJob
- JobeetJobPeer - klasa zawierająca statyczne metody zwracające kolekcje rekordów
- BaseJobeetJobPeer - analogicznie dla klasy BaseJobeetJob
Edycja kolumn dla rekordów odbywa się poprzez wywoływanie metod get/set:
$job = new JobeetJob();
$job->setPosition('Web developer');
$job->save();
echo $job->getPosition();
$job->delete();
Definiowanie kluczy obcych (złączeń?) odbywa się poprzez linkowanie obiektów:
$category = new JobeetCategory();
$category->setName('Programming');
$job = new JobeetJob();
$job->setCategory($category);
Wracając do głównego wątku, dwa powyższe kroki oraz inne użyteczne wyniki można uzyskać prościej i bez konieczności potwierdzenia poprzez:
php symfony propel:build-all --no-confirmation
Jedną z zalet Symfony jest ponoć brak konieczności korzystania z instrukcji require / include. Koszt jaki trzeba za to udogodnienie ponieść jest niewielki, ale trzeba pamiętać że za każdym razem gdy dodamy nową klasę należy wyczyścić cache frameworka. Ponieważ wygenerowaliśmy sporo klas, wykonajmy:
php symfony cache:clear
lub w skrócie:
php symfony cc
Potrzebujemy jeszcze wstępnie wypełnionych tabel. Do tego celu możemy zastosować "skrypty" YAML umieszczane w katalogu data/fixtures/ oraz zadanie propel:data-load
Kiedy potworzymy już odpowiednie pliki wywołujemy: php symfony propel:data-load
Ewentualni zakładamy combo: propel:build-all-load wykonuje nam akcje propel:build-all oraz propel:data-load
Podział obowiązujący w ramach naszego dzieła: projekt -> aplikacje -> moduły
gdzie moduł to zestaw kodu PHP realizujący jakieś pojedyńcze zadanie np. zestaw operacji jakie użytkownik może wykonać na obiekcie reprezentującym zestaw danych z bazy.
Poznawany framework potrafi automatycznie generować moduły umożliwiające podstawowe operacje na danych z bazy w ramach wskazanego modelu:
php symfony propel:generate-module --with-show --non-verbose-templates frontend job JobeetJob
Powyższe utworzyło moduł job w ramach aplikacji frontend application dla modelu danych JobeetJob. W katalogu apps/frontend/modules/job/ utworzone zostały podkatalogi: actions/ oraz templates/
Plik actions/actions.class.php zawiera definicje wszystkich możliwych akcji dla modułu job:
index wyświetla rekordy tabeli
show wyświetla pola i ich wartości dla wskazanego rekordu
new wyświetla formularz do założenia nowego rekordu
create tworzy nowy rekord
edit wyświetla formularz do edycji istniejącego rekordu
update aktualizuje rekord w oparciu o wprowadzone dane
delete usuwa rekord z bazy
W dosłownym tłumaczeniu (zrozumienie zostawiam sobie na później):
Symfony potrzebuje tekstowej reprezentacji kategorii. Reprezentacja obiektu PHP jest definiowana przy pomocy metody magicznej__toString() i powinna być zdefiniowana dla każdej klasy modelu np. dla JobeetCategory:
// lib/model/JobeetCategory.php
class JobeetCategory extends BaseJobeetCategory
{
public function __toString()
{
return $this->getName();
}
}
Następnie tworzymy bazę: mysqladmin -uroot -pmYsEcret create jobeet
Wywołujemy polecenie:
php symfony configure:database "mysql:host=localhost;dbname=jobeet" root mYsEcret
które tak na prawdę zapisuje informacje o dostępie do bazy w pliku config/databases.yml co możemy wszak wykonać ręcznie :)
Wykonujemy polecenie: php symfony propel:build-sql
które przygotowuje dla nas skrypty SQL tworzące strukturę naszej bazy danych. Wyniki przechowywane w katalogu data/sql/ - tutaj data/sql/lib.model.schema.sql
Ostatecznie wywołujemy: php symfony propel:insert-sql
które tworzy naszą bazę danych. Należy uważać (choć jest stosowny alert) - wykonanie tego polecenia usuwa dotychczasowe tabele.
Na marginesie: opis polecenia uzyskamy przez zastowanie parametru help np. php symfony help propel:insert-sql
Generujemy klasy PHP mapujące naszą relacyjną bazę danych na obiekty: php symfony propel:build-model
W wyniku powyższego w katalogu lib/model/ tworzone są skrypty zawierające po cztery klasy na każdą z tabel naszej bazy danych.
Np. dla tabeli jobeet_job:
- JobeetJob - obiekt tej klasy to pojedyńczy rekord tabeli
- BaseJobeetJob - klasa z której dziedziczy klasa JobeetJob. Za każdym wywołaniem propel:build-model klasa ta jest nadpisywana, więc wszystkie modyfikacje muszą znajdować się w ramach JobeetJob
- JobeetJobPeer - klasa zawierająca statyczne metody zwracające kolekcje rekordów
- BaseJobeetJobPeer - analogicznie dla klasy BaseJobeetJob
Edycja kolumn dla rekordów odbywa się poprzez wywoływanie metod get/set:
$job = new JobeetJob();
$job->setPosition('Web developer');
$job->save();
echo $job->getPosition();
$job->delete();
Definiowanie kluczy obcych (złączeń?) odbywa się poprzez linkowanie obiektów:
$category = new JobeetCategory();
$category->setName('Programming');
$job = new JobeetJob();
$job->setCategory($category);
Wracając do głównego wątku, dwa powyższe kroki oraz inne użyteczne wyniki można uzyskać prościej i bez konieczności potwierdzenia poprzez:
php symfony propel:build-all --no-confirmation
Jedną z zalet Symfony jest ponoć brak konieczności korzystania z instrukcji require / include. Koszt jaki trzeba za to udogodnienie ponieść jest niewielki, ale trzeba pamiętać że za każdym razem gdy dodamy nową klasę należy wyczyścić cache frameworka. Ponieważ wygenerowaliśmy sporo klas, wykonajmy:
php symfony cache:clear
lub w skrócie:
php symfony cc
Potrzebujemy jeszcze wstępnie wypełnionych tabel. Do tego celu możemy zastosować "skrypty" YAML umieszczane w katalogu data/fixtures/ oraz zadanie propel:data-load
Kiedy potworzymy już odpowiednie pliki wywołujemy: php symfony propel:data-load
Ewentualni zakładamy combo: propel:build-all-load wykonuje nam akcje propel:build-all oraz propel:data-load
Podział obowiązujący w ramach naszego dzieła: projekt -> aplikacje -> moduły
gdzie moduł to zestaw kodu PHP realizujący jakieś pojedyńcze zadanie np. zestaw operacji jakie użytkownik może wykonać na obiekcie reprezentującym zestaw danych z bazy.
Poznawany framework potrafi automatycznie generować moduły umożliwiające podstawowe operacje na danych z bazy w ramach wskazanego modelu:
php symfony propel:generate-module --with-show --non-verbose-templates frontend job JobeetJob
Powyższe utworzyło moduł job w ramach aplikacji frontend application dla modelu danych JobeetJob. W katalogu apps/frontend/modules/job/ utworzone zostały podkatalogi: actions/ oraz templates/
Plik actions/actions.class.php zawiera definicje wszystkich możliwych akcji dla modułu job:
index wyświetla rekordy tabeli
show wyświetla pola i ich wartości dla wskazanego rekordu
new wyświetla formularz do założenia nowego rekordu
create tworzy nowy rekord
edit wyświetla formularz do edycji istniejącego rekordu
update aktualizuje rekord w oparciu o wprowadzone dane
delete usuwa rekord z bazy
W dosłownym tłumaczeniu (zrozumienie zostawiam sobie na później):
Symfony potrzebuje tekstowej reprezentacji kategorii. Reprezentacja obiektu PHP jest definiowana przy pomocy metody magicznej__toString() i powinna być zdefiniowana dla każdej klasy modelu np. dla JobeetCategory:
// lib/model/JobeetCategory.php
class JobeetCategory extends BaseJobeetCategory
{
public function __toString()
{
return $this->getName();
}
}
A gdy już założę własną Firmę ...
... to być może skorzystam z potencjału poniższych:
http://ifirma.pl/index.php/home/poznaj-serwis/o-systemie-ifirmapl/mozliwosci-ifirma-pl
http://www.mikrofirmy.pl/
http://ifirma.pl/index.php/home/poznaj-serwis/o-systemie-ifirmapl/mozliwosci-ifirma-pl
http://www.mikrofirmy.pl/
środa, 14 stycznia 2009
Hyper-V w kontekście mapowania portów COM -> Named Pipe
http://www.ravichaganti.com/blog/?p=65
Z tego co wyczytałem, na dzień dzisiejszy nie ma możliwości zamapowania fizycznego portu hosta na port w maszynie wirtualnej :(
Z tego co wyczytałem, na dzień dzisiejszy nie ma możliwości zamapowania fizycznego portu hosta na port w maszynie wirtualnej :(
wtorek, 13 stycznia 2009
Symfony - dzień pierwszy
Przygotowanie środowiska testowego: Debian 4.0r6 + XAMPP 1.7
wget http://heanet.dl.sourceforge.net/sourceforge/xampp/xampp-linux-1.7.tar.gz
tar xvfz xampp-linux-1.7.tar.gz -C /opt
Uruchamianie serwerów poprzez: /opt/lampp/lampp start
Ewentualne podstawowe zabezpieczanie: /opt/lampp/lampp security
W pliku .bashrc użytkownika na którym pracujemy dodajemy linię:
export PATH=$PATH:/opt/lampp/bin/
Następnie przechodzimy do instalacji Symfony:
mkdir -p /home/sfprojects/jobeet
cd /home/sfprojects/jobeet
mkdir -p lib/vendor
cd lib/vendor
wget http://www.symfony-project.org/get/symfony-1.2.2.tgz
tar zxpf symfony-1.2.2.tgz
mv symfony-1.2.2 symfony
rm symfony-1.2.2.tgz
cd ../..
php lib/vendor/symfony/data/bin/check_configuration.php
No i na pierwszy ogień należy w /opt/lampp/etc/php.ini ustawić:
short_open_tag = Off
magic_quotes_gpc = Off
register_globals = Off
I restart serwerów:
/opt/lampp/lampp stop
/opt/lampp/lampp start
Ponowne sprawdzenie:
php lib/vendor/symfony/data/bin/check_configuration.php
Nieźle, ale do pełni szczęścia doinstalujemy Alternative PHP Cache (APC)
Przede wszystkim potrzebujemy paczki developerskiej dla XAMMP'a:
wget http://garr.dl.sourceforge.net/sourceforge/xampp/xampp-linux-devel-1.7.tar.gz
tar xvfz xampp-linux-1.7.tar.gz -C /opt
apt-get install autoconf
Np. w katalogu domowym użytkownika:
wget http://pecl.php.net/get/APC-3.0.19.tgz
tar xvf APC-3.0.19.tgz
cd APC-3.0.19/
/opt/lampp/bin/phpize
./configure
make
make install
W pliku /opt/lampp/etc/php.ini dodajemy poniższe linie:
extension="apc.so"
apc.enabled="1"
apc.shm_size="30"
Ponowny restart serwerów (stop/start) i oby ostatecznie sprawdzamy po stronie konsoli:
cd /home/sfprojects/jobeet/
php lib/vendor/symfony/data/bin/check_configuration.php
Powinno już być bez błędów / ostrzeżeń. Ewentualnie upewniamy się poprzez wywołanie: "php -m" czy moduł APC został załadowany.
Następnie sprawdzamy check_configuration.php poprzez wywołanie z poziomu przeglądarki. Wystarczy skopiować plik i wywołać poprzez wpisanie odpowiedniego URL'a. Jeśli wszystko jest OK zobaczymy coś na kształt:
********************************
* *
* symfony requirements check *
* *
********************************
php.ini used by PHP: /opt/lampp/etc/php.ini
** Mandatory requirements **
OK requires PHP >= 5.2.4
OK php.ini: requires zend.ze1_compatibility_mode set to off
** Optional checks **
OK PDO is installed
OK PDO has some drivers installed: sqlite, pgsql, mysql, sqlite2
OK PHP-XML module installed
OK XSL module installed
OK can use token_get_all()
OK can use mb_strlen()
OK can use iconv()
OK can use utf8_decode()
OK has a PHP accelerator
OK php.ini: short_open_tag set to off
OK php.ini: magic_quotes_gpc set to off
OK php.ini: register_globals set to off
OK php.ini: session.auto_start set to off
Sprawdzamy wersję Symfony:
php lib/vendor/symfony/data/bin/symfony -V
Generujemy szkielet naszego projektu:
php lib/vendor/symfony/data/bin/symfony generate:project jobeet
Powyższe tworzy skrót 'symfony' dzięki czemu mniej wklepujemy w linii komend.
Projekt = zbiór aplikacji korzystających z tego samego modelu danych.
Generujemy szkielet aplikacji 'frontend'
php symfony generate:app --escaping-strategy=on --csrf-secret=UniqueSecret frontend
W pliku konfiguracyjnym dla projektu config/ProjectConfiguration.class.php zmieniamy linię z require_once na:
require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
co zapewni nam lepszą przenośność projektu na inne serwery.
Aby nasz projekt był widoczny z przeglądarki, na warsztat bierzemy plik /opt/lampp/etc/httpd.conf i na samym końcu dodajemy:
# Ta linia może wystąpić tylko raz
NameVirtualHost 10.0.0.14:8080
Listen 10.0.0.14:8080
DocumentRoot "/home/sfprojects/jobeet/web"
DirectoryIndex index.php
AllowOverride All
Allow from All
Alias /sf /home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf
AllowOverride All
Allow from All
Adres 10.0.0.14 wynika tylko stąd, że środowisko Debian+Symfony jest uruchamiane jako maszyna wirtualna, natomiast sprawdzanie aplikacji odbywać się będzie w ramach fizycznego systemu operacyjnego.
Restartujemy serwery i sprawdzamy jak chula: http://10.0.0.14:8080/index.php/
Następnie sprawdzamy jak działa nasze środowisko developerskie: http://10.0.0.14:8080/frontend_dev.php/ - nie działa.
Komunikat "You are not allowed to access this file. Check frontend_dev.php for more information." otrzymaliśmy z powodu łączenia się z innej maszyny. Edytujemy ten plik, wpisując zamiast 127.0.0.1 adres IP maszyny z której sprawdzać będziemy działanie naszego projektu.
Teoretycznie całe środowisko jest już gotowe. Warto jednak (zgodnie z tutorialem) poświęcić jeszcze 10 min na zapoznanie się z atakami XSS oraz CSRF, a także poznać zagadnienie wersjonowania aplikacji, co też teraz uczynię.
Przede wszystkim należy znaleźć hosting. Z braku doświadczenia wybrałem http://xp-dev.com/. Zakładamy konto np. 'repo'. Logujemy się. W menu Subversion wybieramy Create a new repository. Nadajemy nazwe np. 'jobeet'
Nasze repozytorium znajduje się pod adresem: https://svn.xp-dev.com/svn/repo_jobeet
Przydałby się jakiś klient: apt-get install subversion
I pobierzmy testowo (check out?) nasze puste repozytorium do katalogu jsr:
svn co https://svn.xp-dev.com/svn/repo_jobeet jsr
Jeśli wszystko jest OK, możemy skasować katalog jsr.
Następnie tworzymy standardową strukturę katalogów repozytorium:
svn mkdir -m "utworzona domyslna struktura katalogow" https://svn.xp-dev.com/svn/repo_jobeet/trunk https://svn.xp-dev.com/svn/repo_jobeet/tags https://svn.xp-dev.com/svn/repo_jobeet/branches
Checkout'ujemy pusty katalog trunk/:
cd /home/sfprojects/jobeet
svn co https://svn.xp-dev.com/svn/repo_jobeet/trunk/ .
Czyścimi cache i log:
rm -rf cache/* log/*
Ustawiamy na wszelki wypadek uprawnienia:
chmod 777 cache/ log/
Importujemy katalogi i pliki:
svn add *
Ustawiamy ignorowanie cache:
svn propedit svn:ignore cache
Otworzy się edytor. Wpisujemy * by ignorowana była cała zawartość i zapisujemy.
Podobnie dla katalogu log:
svn propedit svn:ignore log
I ostatecznie importujemy do repozytorium nasz projekt:
svn import -m "import poczatkowy" . https://svn.xp-dev.com/svn/repo_jobeet/trunk
wget http://heanet.dl.sourceforge.net/sourceforge/xampp/xampp-linux-1.7.tar.gz
tar xvfz xampp-linux-1.7.tar.gz -C /opt
Uruchamianie serwerów poprzez: /opt/lampp/lampp start
Ewentualne podstawowe zabezpieczanie: /opt/lampp/lampp security
W pliku .bashrc użytkownika na którym pracujemy dodajemy linię:
export PATH=$PATH:/opt/lampp/bin/
Następnie przechodzimy do instalacji Symfony:
mkdir -p /home/sfprojects/jobeet
cd /home/sfprojects/jobeet
mkdir -p lib/vendor
cd lib/vendor
wget http://www.symfony-project.org/get/symfony-1.2.2.tgz
tar zxpf symfony-1.2.2.tgz
mv symfony-1.2.2 symfony
rm symfony-1.2.2.tgz
cd ../..
php lib/vendor/symfony/data/bin/check_configuration.php
No i na pierwszy ogień należy w /opt/lampp/etc/php.ini ustawić:
short_open_tag = Off
magic_quotes_gpc = Off
register_globals = Off
I restart serwerów:
/opt/lampp/lampp stop
/opt/lampp/lampp start
Ponowne sprawdzenie:
php lib/vendor/symfony/data/bin/check_configuration.php
Nieźle, ale do pełni szczęścia doinstalujemy Alternative PHP Cache (APC)
Przede wszystkim potrzebujemy paczki developerskiej dla XAMMP'a:
wget http://garr.dl.sourceforge.net/sourceforge/xampp/xampp-linux-devel-1.7.tar.gz
tar xvfz xampp-linux-1.7.tar.gz -C /opt
apt-get install autoconf
Np. w katalogu domowym użytkownika:
wget http://pecl.php.net/get/APC-3.0.19.tgz
tar xvf APC-3.0.19.tgz
cd APC-3.0.19/
/opt/lampp/bin/phpize
./configure
make
make install
W pliku /opt/lampp/etc/php.ini dodajemy poniższe linie:
extension="apc.so"
apc.enabled="1"
apc.shm_size="30"
Ponowny restart serwerów (stop/start) i oby ostatecznie sprawdzamy po stronie konsoli:
cd /home/sfprojects/jobeet/
php lib/vendor/symfony/data/bin/check_configuration.php
Powinno już być bez błędów / ostrzeżeń. Ewentualnie upewniamy się poprzez wywołanie: "php -m" czy moduł APC został załadowany.
Następnie sprawdzamy check_configuration.php poprzez wywołanie z poziomu przeglądarki. Wystarczy skopiować plik i wywołać poprzez wpisanie odpowiedniego URL'a. Jeśli wszystko jest OK zobaczymy coś na kształt:
********************************
* *
* symfony requirements check *
* *
********************************
php.ini used by PHP: /opt/lampp/etc/php.ini
** Mandatory requirements **
OK requires PHP >= 5.2.4
OK php.ini: requires zend.ze1_compatibility_mode set to off
** Optional checks **
OK PDO is installed
OK PDO has some drivers installed: sqlite, pgsql, mysql, sqlite2
OK PHP-XML module installed
OK XSL module installed
OK can use token_get_all()
OK can use mb_strlen()
OK can use iconv()
OK can use utf8_decode()
OK has a PHP accelerator
OK php.ini: short_open_tag set to off
OK php.ini: magic_quotes_gpc set to off
OK php.ini: register_globals set to off
OK php.ini: session.auto_start set to off
Sprawdzamy wersję Symfony:
php lib/vendor/symfony/data/bin/symfony -V
Generujemy szkielet naszego projektu:
php lib/vendor/symfony/data/bin/symfony generate:project jobeet
Powyższe tworzy skrót 'symfony' dzięki czemu mniej wklepujemy w linii komend.
Projekt = zbiór aplikacji korzystających z tego samego modelu danych.
Generujemy szkielet aplikacji 'frontend'
php symfony generate:app --escaping-strategy=on --csrf-secret=UniqueSecret frontend
W pliku konfiguracyjnym dla projektu config/ProjectConfiguration.class.php zmieniamy linię z require_once na:
require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
co zapewni nam lepszą przenośność projektu na inne serwery.
Aby nasz projekt był widoczny z przeglądarki, na warsztat bierzemy plik /opt/lampp/etc/httpd.conf i na samym końcu dodajemy:
# Ta linia może wystąpić tylko raz
NameVirtualHost 10.0.0.14:8080
Listen 10.0.0.14:8080
DocumentRoot "/home/sfprojects/jobeet/web"
DirectoryIndex index.php
AllowOverride All
Allow from All
Alias /sf /home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf
AllowOverride All
Allow from All
Adres 10.0.0.14 wynika tylko stąd, że środowisko Debian+Symfony jest uruchamiane jako maszyna wirtualna, natomiast sprawdzanie aplikacji odbywać się będzie w ramach fizycznego systemu operacyjnego.
Restartujemy serwery i sprawdzamy jak chula: http://10.0.0.14:8080/index.php/
Następnie sprawdzamy jak działa nasze środowisko developerskie: http://10.0.0.14:8080/frontend_dev.php/ - nie działa.
Komunikat "You are not allowed to access this file. Check frontend_dev.php for more information." otrzymaliśmy z powodu łączenia się z innej maszyny. Edytujemy ten plik, wpisując zamiast 127.0.0.1 adres IP maszyny z której sprawdzać będziemy działanie naszego projektu.
Teoretycznie całe środowisko jest już gotowe. Warto jednak (zgodnie z tutorialem) poświęcić jeszcze 10 min na zapoznanie się z atakami XSS oraz CSRF, a także poznać zagadnienie wersjonowania aplikacji, co też teraz uczynię.
Przede wszystkim należy znaleźć hosting. Z braku doświadczenia wybrałem http://xp-dev.com/. Zakładamy konto np. 'repo'. Logujemy się. W menu Subversion wybieramy Create a new repository. Nadajemy nazwe np. 'jobeet'
Nasze repozytorium znajduje się pod adresem: https://svn.xp-dev.com/svn/repo_jobeet
Przydałby się jakiś klient: apt-get install subversion
I pobierzmy testowo (check out?) nasze puste repozytorium do katalogu jsr:
svn co https://svn.xp-dev.com/svn/repo_jobeet jsr
Jeśli wszystko jest OK, możemy skasować katalog jsr.
Następnie tworzymy standardową strukturę katalogów repozytorium:
svn mkdir -m "utworzona domyslna struktura katalogow" https://svn.xp-dev.com/svn/repo_jobeet/trunk https://svn.xp-dev.com/svn/repo_jobeet/tags https://svn.xp-dev.com/svn/repo_jobeet/branches
Checkout'ujemy pusty katalog trunk/:
cd /home/sfprojects/jobeet
svn co https://svn.xp-dev.com/svn/repo_jobeet/trunk/ .
Czyścimi cache i log:
rm -rf cache/* log/*
Ustawiamy na wszelki wypadek uprawnienia:
chmod 777 cache/ log/
Importujemy katalogi i pliki:
svn add *
Ustawiamy ignorowanie cache:
svn propedit svn:ignore cache
Otworzy się edytor. Wpisujemy * by ignorowana była cała zawartość i zapisujemy.
Podobnie dla katalogu log:
svn propedit svn:ignore log
I ostatecznie importujemy do repozytorium nasz projekt:
svn import -m "import poczatkowy" . https://svn.xp-dev.com/svn/repo_jobeet/trunk
poniedziałek, 12 stycznia 2009
Sendmail - naprowadzenie na założenie nowego konta
/etc/mail/virtusertable
makemap hash virtusertable < virtusertable
makemap hash virtusertable < virtusertable
wtorek, 6 stycznia 2009
Podstawowe typy ataków na strony WWW
google.pl + SQL Injection | Cross Site Scripting (XSS) | Header Tampering | Path Traversal
Do poznania jest także narzędzie: http://sqlninja.sourceforge.net/sqlninjademo1.html
Do poznania jest także narzędzie: http://sqlninja.sourceforge.net/sqlninjademo1.html
Hyper-V Manager - Access Denied - o co chodzi?
Jeżeli korzystamy z Windows Hyper-V Server 2008 i chcemy nim zarządzać z poziomu Visty przez snap-in do MMC, a uzyskujemy poniższy komunikat w ramach Hyper-V Managera:
HYPER-V MANAGER ACCESS DENIED UNABLE TO ESTABLISH COMMUNICATION BETWEEN
rozwiązanie znajdziemy tutaj: http://blog.augustoalvarez.com.ar/category/virtualization/
a w skrócie chodzi o to co poniżej (w ramach Visty):
Now that the server is properly configured for remote management, you have to run a simple procedure to fix this common error:
a. On “Run” insert “DCOMCNFG“. Click OK
b. Expand “Component Services“, expand “Computers“. Right click on “My Computer” and click on “Properties” (imagen)
c. Now click on “COM Security”
d. In “Access Permission” click “Edit Limits”
e. Select “ANONYMOUS LOGON” in “Group or User Name“. In the column “Allow“, set the “Permissions for User” with “Remote Access“.
HYPER-V MANAGER ACCESS DENIED UNABLE TO ESTABLISH COMMUNICATION BETWEEN
rozwiązanie znajdziemy tutaj: http://blog.augustoalvarez.com.ar/category/virtualization/
a w skrócie chodzi o to co poniżej (w ramach Visty):
Now that the server is properly configured for remote management, you have to run a simple procedure to fix this common error:
a. On “Run” insert “DCOMCNFG“. Click OK
b. Expand “Component Services“, expand “Computers“. Right click on “My Computer” and click on “Properties” (imagen)
c. Now click on “COM Security”
d. In “Access Permission” click “Edit Limits”
e. Select “ANONYMOUS LOGON” in “Group or User Name“. In the column “Allow“, set the “Permissions for User” with “Remote Access“.
Squid Transparent Proxy - przykładowa konfiguracja Squid'a
http_port 8080 transparent
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
cache_mem 64 MB
cache_swap_low 80
cache_swap_high 100
maximum_object_size 32768 KB
minimum_object_size 0 KB
maximum_object_size_in_memory 128 KB
ipcache_size 16384
fqdncache_size 0
cache_replacement_policy heap LFUDA
memory_replacement_policy heap GDSF
cache_dir ufs /var/spool/squid 6144 12 256
access_log /var/log/squid/access.log squid
cache_log /dev/null
cache_store_log none
dns_nameservers 208.67.222.222 208.67.220.220
hosts_file /etc/hosts
refresh_pattern -i \.(gif|jpg|jpeg|png|html|bmp|ico|css) 0 50% 7200 reload-into-ims
refresh_pattern -i \.(zip|gz|bz2|exe|rar|mp3|mpg|avi|wmv|vqf|ogg) 43200 100% 43200 reload-into-ims
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern . 0 20% 4320
half_closed_clients off
acl all src 0.0.0.0/0.0.0.0
acl siec src 10.0.0.0/255.255.255.0
acl ZA-DUZO maxconn 500
http_access deny ZA-DUZO siec
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 # https
acl SSL_ports port 563 # snews
acl SSL_ports port 873 # rsync
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 631 # cups
acl Safe_ports port 873 # rsync
acl Safe_ports port 901 # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
http_access allow siec
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all
http_reply_access allow all
icp_access allow all
cache_effective_group proxy
visible_hostname naszadomenajakas.pl
log_icp_queries off
store_avg_object_size 16 KB
store_objects_per_bucket 36
buffered_logs on
reload_into_ims on
acl FTP proto FTP
always_direct allow FTP
strip_query_terms off
coredump_dir /var/spool/squid
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
cache_mem 64 MB
cache_swap_low 80
cache_swap_high 100
maximum_object_size 32768 KB
minimum_object_size 0 KB
maximum_object_size_in_memory 128 KB
ipcache_size 16384
fqdncache_size 0
cache_replacement_policy heap LFUDA
memory_replacement_policy heap GDSF
cache_dir ufs /var/spool/squid 6144 12 256
access_log /var/log/squid/access.log squid
cache_log /dev/null
cache_store_log none
dns_nameservers 208.67.222.222 208.67.220.220
hosts_file /etc/hosts
refresh_pattern -i \.(gif|jpg|jpeg|png|html|bmp|ico|css) 0 50% 7200 reload-into-ims
refresh_pattern -i \.(zip|gz|bz2|exe|rar|mp3|mpg|avi|wmv|vqf|ogg) 43200 100% 43200 reload-into-ims
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern . 0 20% 4320
half_closed_clients off
acl all src 0.0.0.0/0.0.0.0
acl siec src 10.0.0.0/255.255.255.0
acl ZA-DUZO maxconn 500
http_access deny ZA-DUZO siec
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 # https
acl SSL_ports port 563 # snews
acl SSL_ports port 873 # rsync
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 631 # cups
acl Safe_ports port 873 # rsync
acl Safe_ports port 901 # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
http_access allow siec
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all
http_reply_access allow all
icp_access allow all
cache_effective_group proxy
visible_hostname naszadomenajakas.pl
log_icp_queries off
store_avg_object_size 16 KB
store_objects_per_bucket 36
buffered_logs on
reload_into_ims on
acl FTP proto FTP
always_direct allow FTP
strip_query_terms off
coredump_dir /var/spool/squid
poniedziałek, 5 stycznia 2009
Jak wyłączyć wyszukiwanie drukarek w Windows XP?
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"NoNetCrawling"=dword:00000001
Inne sposoby: http://www.wss.pl/WindowsSBS/frmThread.aspx?tid=57805
Inne przydatne wpisy do rejestru: http://pliki.akk.net.pl/images/REG/system.reg
"NoNetCrawling"=dword:00000001
Inne sposoby: http://www.wss.pl/WindowsSBS/frmThread.aspx?tid=57805
Inne przydatne wpisy do rejestru: http://pliki.akk.net.pl/images/REG/system.reg
Subskrybuj:
Posty (Atom)
Archiwum bloga
-
►
2012
(16)
- ► października (2)
-
►
2011
(51)
- ► października (1)
-
▼
2009
(190)
- ► października (2)
-
▼
stycznia
(27)
- Logowanie ruchu sieciowego
- IPSec - tutorial
- Linux full backup & restore w praktyce 2
- Instalacja PHPList
- Certyfikaty Microsoft
- Photoshop i inne - dobry zestaw tutoriali
- Różne CMS'y
- Newsletter dla całej firmy
- HTML Url Encoding Reference
- Linux full backup & restore w praktyce
- BT3, kismet, airodump-ng i TP-Link TL-WN551G
- BackTrack 3 - instalacja na dysku twardym
- Problem - odbiorca wiadomości z Outlooka otrzymuje...
- Wardriving w teorii
- Jak sprawdzić kod produktu / klucz instalacyjny np...
- Identyfikacja i testowanie sprzętu PC pod Linuksem
- Jak nie powinna wyglądać domena?
- Squid - jak wyczyścić cache
- Symfony - dzień drugi
- A gdy już założę własną Firmę ...
- Hyper-V w kontekście mapowania portów COM -> Named...
- Symfony - dzień pierwszy
- Sendmail - naprowadzenie na założenie nowego konta
- Podstawowe typy ataków na strony WWW
- Hyper-V Manager - Access Denied - o co chodzi?
- Squid Transparent Proxy - przykładowa konfiguracja...
- Jak wyłączyć wyszukiwanie drukarek w Windows XP?