poniedziałek, 17 grudnia 2012

Wowza/HTTPWelcomeBanner - zamiennik dla com.wowza.wms.http.HTTPServerVersion


Poniższy moduł umożliwia zmianę domyślnego providera HTTP dla serwera Wowzy. Domyślny provider wyświetla baner z informacjami o wersji Wowzy np:

Wowza Media Server 3 Monthly Edition 3.5.0 build2989

Moduł it.socha.wms.http.WelcomeBanner umożliwia zmianę tej odpowiedzi na inną. Dostępne są trzy możliwości - none - brak (pusta strona), html - html osadzony w pliku konfiguracyjnym i file - zawartość pliku.

Konfiguracja w pliku VHost.xml:

<HTTPProvider>
        <BaseClass>it.socha.wms.http.WelcomeBanner</BaseClass>
        <RequestFilters>*</RequestFilters>
        <AuthenticationMethod>none</AuthenticationMethod>
        <Properties>
                <Property>
                    <Name>banner</Name>
                    <!-- none,html,file -->
                    <Value>html</Value>
                </Property>
                <Property>
                    <Name>html</Name>
                    <Value><![CDATA[<html><head><title>WOWZA</title></head><body>WOWZA</body></html>]]></Value>
                </Property>
                <Property>
                    <Name>file</Name>
                    <!-- full path to the file -->
                    <Value>/storage/cdn/serwis/welcome/welcome.html</Value>
                </Property>
        </Properties>
</HTTPProviders>


banner - none,html, file
html - "statyczny" html - musi być podany w bloku <![CDATA[ ]]>
file - określa ścieżkę do pliku

Plik jar należy umieścić w folderze lib.

Download


poniedziałek, 29 października 2012

XEN - instalacja CentOS

CentOS 5.x

Konfiguracja VM:
name = "centos-5-install"
memory = "2048"
disk = [ 'phy:/dev/vm/xen-centos-install-root,xvda,w', 'phy:/dev/e.vm/xen-centos-install-swap,xvdb,w' ]
vif = [ 'mac=00:16:3e:4c:ec:4e, bridge=eth0, vifname=vmcinst' ]
vcpus=2
#on_reboot  = 'restart'
#on_crash   = 'restart'
#bootloader = 'pygrub'
 on_reboot  = 'shutdown'
on_crash   = 'shutdown'
kernel = "/boot/xen/vmlinuz"
ramdisk = "/boot/xen/initrd.img"
extra = "vnc vncpassword=YOURPSW headless ip=YOURIP netmask=X.X.X.X gateway=GATEWAYIP dns=X.X.X.X ksdevice=eth0 method=http://ftp.icm.edu.pl/pub/linux/distributions/centos/5.4/os/i386/ lang=en_US keymap=us"

czwartek, 20 września 2012

Pytanie rekrutacyjne - ciekawy pomysł

Ostatnio natrafiłem na ofertę pracy dla sys admin-a z ciekawym zapisem. W treści ogłoszenia było zadanie zapisane w base64:

Mile widziane
  - aHR0cDovL3d3dy5leGFtcGxlLnBsL2l3YW5hY29va2llCg==
Zapis zmieniony w stosunku do ogłoszenia.

Po odkodowaniu tego za pomocą base64:

echo aHR0cDovL3d3dy5leGFtcGxlLnBsL2l3YW5hY29va2llCg==  |  base64 -d

Otrzymałem:
   http://www.example.pl/iwanacookie


Za pomocą curl-a:

 curl -v  -s http://www.example.pl/iwanacookie

Otrzymałem nagłówki:

 HTTP/1.1 302 Found
 Date: Thu, 20 Sep 2012 11:26:54 GMT
 Server: Apache
 Set-Cookie: question=YmVnaW4gNjQ0IHRlc3QKTTBFSUguMyUhNjI5MzY3T1k7PVQhMDRRX19fQS1gIU8iMzcwJjVKRCYpJUZcIiVOKiMqNzBTPF0pNVU8UApNYC9QImBdRkkoYCI0Q0BgYGBgYGBgVGBgIzBgI1UjMCxAXElCIUgjMkhgIjhgYDMhLGBgJDo+QSxgRjNgCk1gYCImOmAvXVBgYDAoYGAkKjlYQihgQihAYCIoSCpgXEFJRiYsUydUMUpJPkk7UF1UTzQsMFlcXEgwMCYKTTkhPlNBI1JYVS1RWVRWJE5AVEA4VV1QMEArJ01WTDhMWCRZJVZcKl9eUUEyWDknSytRLiFVXkReLFEpLwpNLFlCNCRQKTtUV0tEMEUuUlBfMyI0RjYsK1VgXUZbMyNDMz5RTzJASFpJTyJDTEJbUDBgYDAoYGAkLydECio3PEQ0WDQpIVteNlc9YGBgCmAKZW5kCg==; Expires=Tue, 01 Jan 2013 00:00:00 GMT
Content-Length: 203
Content-Type: text/html; charset=iso-8859-1
Z tego wyciągnąłem cookie i ponownie puściłem przez base64:

echo "[base64 z question]" | base64 -d
 W wyniku otrzymałem:
 begin 644 test
M0EIH.3%!629367OY;=T!04Q___A-`!O"370&5JD&)%F\"%N*#*70S<])5U
M`/P"`]FI(`"4C@```````T``#0`#U#0,@\IB!H#2H`"8``3!,``$:>A,`F3`
M``"&:`/]P``0(``$*9XB(`B(@`"(H*`\AIF&,S'T1JI>I;P]TO4,0Y\\H00&
M9!>SA#RXU-QYTV$N@T@8U]P0@+'MVL8LX$Y%V\*_^QA2X9'K+Q.!U^D^,Q)/
M,YB4$P);TWKD0E.RP_3"4F6,+U`]F[3#C3>QO2@HZIO"CLB[P0``0(``$/'D
*7`
end
Czyli plik "uuencoded":

echo "[base64 z question]" | base64 -d  |  uudecode

W wyniku otrzymałem plik binary "test" o długości 235 znaków.

file test
# test: bzip2 compressed data, block size = 900k
Dalej:
bzip2 -d -c test >test.1
file test.1
# test.1: gzip compressed data, from Unix, max compression
Pliczek wynikowy miał 11 MB. Niezła kompresja (235 -> 11MB).
I ostatecznie:
 gzip -d -c test.1
Dało w wyniku:
(let* (
    (x  '( (1 2 (3 4 5) 6)  7  8  (9 10) ) )
  )
  ; use car/caaa..r/cd..r here to get 4 from x, append solution to your job application
)
Czyli kod w Lisp.

Co do działania tego kodu to:

http://stackoverflow.com/questions/12510086/lisp-code-how-to-run-this-example

Odpowiedzi:

(car (cdr (car (cdr (cdr (car x))))))

(let* ((x '((1 2 (3 4 5) 6) 7 8 (9 10))))
   (cadr (caddar x)))
Podsumowując. Super zadanie :)

sobota, 15 września 2012

Moje boje z Varnish-em

 

 Wprowadzenie


 Post ten ma na celu gromadzenie wiedzy związanej z Varnish-em.
Wpis ten otyczy wersji 3.x Varnisha. Będę tu gromadził rozwiązania, które sam opracowałem, linki do blogów czy innej dokumentacji.

 

Źródła zewnętrzene

 

https://www.varnish-cache.org/docs/trunk/  - dokumentacja
https://www.varnish-software.com/static/book/  - podręcznik
http://planet.varnish-cache.org/ - agregator blogów na temat Varnisha.


SHMLOG

 

Log warto utrzymywać na ramdysku. Rozmiar w zależności od wielkości bufora dla logów. Konfiguracja dla fstab:

tmpfs                   /var/lib/varnish        tmpfs   defaults,noatime,size=100M 0 0


Błędy LostHeader 


Ostatnio napotkałem problem z backendem, który (w wyniku błędu) generował dużą ilość nagłówków. W wyniku poszukiwań rozwiązania tego problemu opiszę parametry konfiguracyjne, które mogą się przydać przy tym błędzie. Błąd LostHeader jest spowodowany przekroczeniem domyślnych ustawień (pamięć), które są przeznaczone na potrzeby przetwarzania zapytań i odpowiedzi HTTP.

Parametry konfiguracyjne można ustawiać z linii poleceń przy uruchamianiu Varnisha za pomocą parametry -p lub z poziomu interfejsu CLI (varnishadm lub varnish w trybie debug).

sess_workspace - ilość pamięci (w bajtach) przeznaczona na potrzeby komunikacji HTTP (nagłówki) i operacji związanych z nagłówkami. Domyślnie 65536. Na chwilę obecną przy żadnym projekcie nie musiałem zwiększać tego parametru.

http_resp_hdr_len - maksymalna długość nagłówka (całej linii ze znakami końca wiersza). Domyślnie 8192

http_resp_size - maksymalna ilość pamięci przeznaczonej do obsługi odpowiedzi (do przetwarzania nagłówków). Odpowiedź backendu (włącznie do pustej linii oddzielającej nagłówki od danych) nie może przekroczyć tego rozmiaru. Domyślna wartość to 32768.

http_max_hdr - maksymalna liczba obsługiwanych nagłówków w zapytaniach od klienta lub odpowiedziach z backendów. Domyślna wartość to 64 linie. Pierwsza linia odpowiedzi (np. "HTTP/1.1 200 OK") zajmuję 5 linii (pól nagłówków). Zmiana tej wartości pozwoliła na na rozwiązanie problemu z błędem LostHeader (przy czym kod w backendzie został poprawiony również).

Przykłady konfiguracji:
 
-p sess_workspace=262144  -p http_resp_size=65536 -p http_resp_hdr_len=8192 -p http_max_hdr=128

Źródła zewnętrzne opisujące podobne problemy:

Device detect (mobile)


Rozwiązanie na poziomie Varnish-a (VCL) wykrywające rodzaj urządzenia (przeglądarki).
https://github.com/varnish/varnish-devicedetect/
Wykorzystuję to w jednym z produkcyjnych projektów i na razie nie mam zastrzeżeń.
Przykład użycia w vcl_recv():
        if(req.http.host == "www.domena.pl") {
                call devicedetect;
                if(!req.http.referer ~ "(^http://m.domena.pl|^http://www.domena.pl)") {
                        if (req.http.X-UA-Device ~ "^mobile" || req.http.X-UA-device ~ "^tablet") {
                                error 750 "http://m.domena.pl/";
                        }
                }
        }
Powyższy kod działa w oparciu o logikę:
Jeśli następuję wejście na stronę główną i urządzenia mobilnego i nie jest to odwołanie ze strony mobilnej lub głównej to przekieruj na stronę mobilną.
 Powyższe wykorzystaniu modułu było oparte o już istniejącej logice zaimplementowanej po stronie backendu (PHP).


Procedura błędu


Wykorzystuję funkcję error do wykonywania przekierowań i generowania własnych stron odpowiedzi.

sub vcl_error {
        if (obj.status == 750) {
                // Redirection
                set obj.http.Location=obj.response;
                set obj.http.Content-Type="Content-Type: text/html";
                set obj.status=302;
                set obj.response="Moved Temporarily";
                return(deliver);
        } elseif (obj.status == 751) {
                // Synthetic page generation
                set obj.http.Content-Type="Content-Type: text/html; charset=utf-8";
                set obj.status=200;
                synthetic obj.response;
                set obj.response="OK";
                return(deliver);
        } elseif (obj.status == 503) {
                set obj.http.Content-Type="Content-Type: text/html; charset=utf-8";
                synthetic "Technical Difficulties";
                set obj.response="Internal Server Error";
                return(deliver);
        }
}
Wywołania:

# Przekierowanie
error 750 "http://www.domena.pl" + req.url;

# Generacja odpowiedzi
error 751 "kod htmlKomunikat";
Ostania cześć powyższego kodu odpowiada za generację prostego komunikatu o błędzie zamiast domyślnego generowanego przez Varnish-a.

ESI


Przy przetwarzaniu ESI w logu pojawią się komunikat błędu:

"No ESI processing, first char not"

Rozwiązanie to dodanie parametru esi_syntax=0x1 (np. -p esi_syntax=0x1)

 

Wydajność w Linuxie


http://www.mail-archive.com/varnish-misc@projects.linpro.no/msg01571.html


sobota, 25 sierpnia 2012

MegaCli ściąga

Wszystko razem:

MegaCli -AdpAllInfo -aALL 

Informacje na temat BBU:
MegaCli -AdpBbuCmd -GetBbuStatus -aALL

Wyciszenie alarmu:

 MegaCli -AdpSetProp -AlarmSilence -aALL

Usunięcie dysku:

MegaCli -PDOffline -PhysDrv [E:S] -a0
MegaCli -PDMarkMissing -PhysDrv [E:S] -a0
Lista dysków:

MegaCli -PDList -a0
 Dyski logiczne:

MegaCli -LDInfo -Lall -a0

Progress odbudowy dysku:

MegaCli -PDRbld -ShowProg -PhysDrv [252:2] -a0

wtorek, 31 lipca 2012

Debian Squeeze, XEN i hotplugpath.sh

W Debianie 6.0 brakuję skryptu hotplugpath.sh w /etc/xen/scripts.

Objawy  to nie działanie drbd: dla dyrektywy disk czy problemy z bridgem.


cat <<EOF >/etc/xen/scripts/hotplugpath.sh; chmod +x /etc/xen/scripts/hotplugpath.sh
SBINDIR="/usr/sbin"
BINDIR="/usr/bin"
LIBEXEC="/usr/lib/xen/bin"
LIBDIR="/usr/lib64"
SHAREDIR="/usr/share"
PRIVATE_BINDIR="/usr/lib64/xen/bin"
XENFIRMWAREDIR="/usr/lib/xen/boot"
XEN_CONFIG_DIR="/etc/xen"
XEN_SCRIPT_DIR="/etc/xen/scripts"
EOF

sobota, 30 czerwca 2012

Debian install/SSH

Instalacja systemu Debian poprzez SSH (netboot).

Wersja netboot instalatora:

Squeeze:
http://ftp.pl.debian.org/debian/dists/squeeze/main/installer-amd64/current/images/netboot/

kernel: http://ftp.pl.debian.org/debian/dists/squeeze/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux
initrd:  http://ftp.pl.debian.org/debian/dists/squeeze/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz

Wheezy:
http://ftp.pl.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/netboot/

Konfiguracja GRUB:

title DebianInstallOverSSH
        root (hd0,0)
        kernel /debian/linux auto=true priority=critical locale=en_US language=en country=PL interface=eth0  netcfg/confirm_static=true hostname=debian domain=socha.it netcfg/disable_dhcp=true url=http://pkg.socha.it/debian/netconsole.txt netcfg/get_nameservers=8.8.8.8 netcfg/get_ipaddress=IP netcfg/get_netmask=NETMASK netcfg/get_gateway=GW
        initrd /debian/initrd.gz

preseed: http://pkg.socha.it/debian/netconsole.txt

d-i anna/choose_modules string network-console
d-i network-console/password password debinstall
d-i network-console/password-again password debinstall
d-i console-keymaps-at/keymap select us
d-i keyboard-configuration/xkb-keymap select us
 
ssh installer@IP

pass: debinstall

piątek, 27 kwietnia 2012

Instalacja XEN-a na eco.atman.pl (ATMAN)


Konfiguracja XEN w systemie Debian 6.x na serwerach dedykowanych EcoSerwer (http://eco.atman.pl)


Na chwilę obecną nie znam powodu dlaczego nie działa standardowa konfiguracja XEN w trybie bridge (działa bez problemu na serwerach OVH i HETZNER).

Instalacja systemu XEN w Debianie zgodnie z instrukcją: http://wiki.debian.org/Xen

 

Konfiguracja interfejsów (bridge)


 /etc/network/interfaces:


  iface peth0 inet manual
  auto eth0
  iface eth0 inet static
          address IP
          netmask NETMASK
          network NETWORK
          broadcast BROADCAST
          gateway GATEWAY
          dns-nameservers 8.8.8.8
          dns-search vm.socha.it
          bridge_ports peth0
          bridge_stp off
          bridge_maxwait 0
          bridge_fd 0
          up /sbin/sysctl -p /etc/sysctl.d/xen.conf
          up /sbin/ip route add IP1/32 dev eth0
          up /sbin/ip route add IP2/32 dev eth0
          …
          up /sbin/ip route add IPN/32 dev eth0

  IP – podstawowy numer IP serwera
  IP1 – dodatkowy adres IP
  IP2 – dodatkowy adres IP
  IPN – jw.

Interfejs peth0 to fizyczny interfejs serwera. Nazwa została ustawiona poprzez udev 
(/etc/udev/rules.d/70-persistent-net.rules)

Zawartość pliku /etc/sysctl.d/xen.conf:
  net.ipv4.ip_forward = 1
  net.ipv4.conf.all.rp_filter = 0
  net.ipv4.conf.default.rp_filter = 0
  net.bridge.bridge-nf-call-ip6tables = 0
  net.bridge.bridge-nf-call-iptables = 0
  net.bridge.bridge-nf-call-arptables = 0

W pliku /etc/xen/xend-config.sxp  wpis „(network-script network-bridge)” musi być nieaktywny  (tak jest domyślnie ustawione po instalacji).

 

 Konfiguracja domU


             /etc/xen/vm/vhost:
name = "vhost"
memory = "2048"
disk = [ 'phy:/dev/vm/vhost-root,xvda,w', 'phy:/dev/vm/vhost-swap,xvdb,w' ]
vif = [ 'mac=00:16:3e:XX:XX:XX, bridge=eth0,vifname=vif0' ]
vcpus=2
on_reboot = 'restart'
on_crash = 'restart'
bootloader="pygrub" 

CENTOS
           
            /etc/sysconfig/network-scripts/ifcfg-eth0:
           
DEVICE=eth0
ONBOOT=yes
IPADDR=IP1
NETMASK=255.255.255.255
NM_CONTROLLED=no
TYPE=Ethernet

/etc/sysconfig/network-scripts/route-eth0:

GATEWAY dev eth0
default via GATEWAY dev eth0

DEBIAN

/etc/network/interfaces:

auto eth0
iface eth0 inet static
        address IP1
        netmask 255.255.255.255
        up /sbin/ip route add GATEWAY dev eth0
        up /sbin/ip route add default via GATEWAY