środa, 30 stycznia 2013

Bugzilla + nginx

Wszystko zaczęło się od pytań - Jaki system raportowania błędów jest najlepszy? Który mi najbardziej odpowiada? Padło na Bugzillę. Rozwiązanie - wydawałoby się - idealne dla potrzeb pojedynczego developera.

Instalacja samej aplikacji przebiegła dość sprawnie. Bugzilla została napisana w Perl'u więc do systemu musiałem doinstalować masę nowych modułów Perla gdyż nigdy go w taki sposób nie używałem. Po instalacji i radości z działającej konfiguracji przy użyciu SQLite, dość szybko okazało się że jedyny tryb w jakim Bugzilla może działać na moim serwerze to CGI. We wszystkich możliwych miejscach starałem się stosować uWSGI, w tym przypadku dążyłem do uruchomienia aplikacji na PSGI. Niestety wspierane są tylko cgi i mod_perl dla Apache. Na szczęście sam Nginx jak i uWSGI umożliwiają uruchamianie skryptów jako CGI. Niestety po skonfigurowaniu ich w taki sposób okazało się ze na otwarcie strony głównej Bugzilli trzeba czekać aż 3 sekundy (serwer nie jest aż tak słaby).

Rozpoczęła się walka :)

Google szybko odpowiedziało zgłoszeniem błędu do samej Bugzilli: https://bugzilla.mozilla.org/show_bug.cgi?id=316665 (można zwrócić uwagę że dodane zostało w 2005 roku ;) ). W zgłoszeniu znajduje się patch który umożliwia uruchomienie Bugzilli w trybie FastCGI (oraz możliwe PSGI).

Ten sam patch można znaleźć na GitHub'ie: https://github.com/Stackato-Apps/bugzilla/blob/master/psgi.patch . Po nagłówku łatki można stwierdzić że napisana została na podstawie wersji 4.0.3 (aktualnie najnowszą jest 4.2.4).

Łatka nie aplikowała się poprawnie dla najnowszej wersji więc na jej podstawie stworzyłem nową . Kolejnym krokiem było dobranie opcji dla uwsgi i uruchomienie serwisu. Aplikacja wstała - wszystko wyglądało na poprawnie działające - do chwili gdy zechciałem się zalogować. W logach zauważyłem występowanie jakiegoś błędu autentykacji "brak danych" dodatkowo strona która powinna była się wyświetlić (z informacją o niepoprawnym haśle/loginie) została ucięta w pół.

Podążając nowym tropem - brakiem danych w POST'ie po stronie serwera, szczęśliwym trafem dotarłem na kolejne zgłoszenie błędu, tym razem dla CGI-Emulate-PSGI.

Okazuje się że problemem jest właśnie to - aplikacja nie otrzymuje danych z POST'a gdy używane jest uWSGI, naprawienie tego wydaje się być proste.. ale kompletnie nie znam Perl'a :) Dochodzi jeszcze dziwny błąd obcinający stronę który może ale nie musi być związany z pierwszym.

Emulacja PSGI zastosowana w łatce używa modułów Plack'a więc została jeszcze możliwość uruchomienia aplikacji bez korzystania z uWSGI - czyli na FastCGI do którego wsparcie jest dodane do Nginx'a.

Na skróty

Czyli Bugzill'a działająca na FastCGI w szybki sposób.

  • Pobieramy kod Bugzill'i
  • Aplikujemy łatkę fastcgi
  • Konfigurujemy Bugzillę poprzez checksetup.pl
  • Konfigurujemy Nginx'a i uruchamiamy serwis Plack (pliki i komendy w dziale poniżej)

W systemach Gentoo można dodać glorpen-overlay w którym znajduje się ebuild aplikujący wspominaną wcześniej łatkę.

Końcowa konfiguracja

Dla Nginx:

#pozostałość z cgi - ale dlaczego by tego nie zostawić?
location ~ ^(.*\.(jpe?g|gif|css|js|png|ico))$ {
        alias /srv/bugzilla/app/$1;
}

location  /  {
        include        fastcgi_params;
        fastcgi_param  SCRIPT_NAME      "";
        fastcgi_pass   unix:///srv/bugzilla/fastcgi.socket;
}

Uruchomienie Plack'a:

#!/bin/bash

d="/srv/bugzilla"
plackup -s FCGI -S "${d}"/fastcgi.socket "${d}"/app/app.psgi --pid "${d}"/plackup.pid -D

i na koniec wyłączenie serwera Plack:

#!/bin/bash

kill `cat /srv/bugzilla/plackup.pid`

środa, 23 stycznia 2013

Automatyczna konfiguracja Windows, cz.3

Tym razem przedstawię ustawienia rejestru które można zmienić by IE7 nie zadawało pytań przy pierwszym uruchomieniu lub pierwszych wykonaniach danej czynności.

Plik ten został przetestowany na obrazie IE VHD z Windows Vista i IE7. Dla innych systemów będzie prawdopodobnie wymagana zmiana ID użytkownika dla którego chcemy zmienić ustawienia. W poniższym przykładzie jest to S-1-5-21-4099969203-747351341-4178853743-1000.

Windows Registry Editor Version 5.00

[HKEY_USERS\S-1-5-21-4099969203-747351341-4178853743-1000\Software\Microsoft\Internet Explorer\InformationBar]
"FirstTime"=dword:00000000

[HKEY_USERS\S-1-5-21-4099969203-747351341-4178853743-1000\Software\Microsoft\Internet Explorer\IntelliForms]
"AskUser"=dword:00000000
"PSMigrated"=dword:00000001

[HKEY_USERS\S-1-5-21-4099969203-747351341-4178853743-1000\Software\Microsoft\Internet Explorer\Main]
"Do404Search"=hex:00,00,00,00
"Save_Session_History_On_Exit"="no"
"Search Page"="http://google.com"
"Start Page"="http://google.com"
"SearchMigrated"=dword:00000000
"RunOnceHasShown"=dword:00000001
"RunOnceComplete"=dword:00000001
"Use FormSuggest"="no"
"Error Dlg Displayed On Every Error"="no"
"Friendly http errors"="no"
"SmoothScroll"=dword:00000000
"AutoSearch"=dword:00000000

Po imporcie zostaną zmienione takie funkcje jak:

  • google zostanie ustawione jako strona główna i wyszukiwarka
  • wyłączone zostaną "przyjazne błędy http", czyli zobaczymy prawdziwe odpowiedzi serwera
  • import zakładek zostanie ominięty

piątek, 18 stycznia 2013

Automatyczna konfiguracja Windows, cz.2

Tym razem przedstawię sposób na automatyczne przejście przez proces wyboru typu sieci (publiczna, domowa, itp). Jest to dość przydatne podczas przygotowywania systemu do współpracy z Selenium Grid.

W poniższych przykładach węzeł ControlSet001 można zastąpić CurrentControlSet jeśli system był chociaż raz uruchamiany, w przeciwnym razie, gdy np. ściągnęliśmy obraz IE VHD i przygotowywujemy go do pierwszego uruchomienia klucz CurrentControlSet nie będzie jeszcze istniał.

W obu przypadkach efektem ominięcia wyboru typu sieci będzie oznaczenie danej sieci jak publiczna.

Windows 7

Tutaj sprawa jest prosta, należy zaimportować poniższy plik do rejestru i cieszyć się brakiem pytania o typ sieci.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Network\NetworkLocationWizard]
"HideWizard"=dword:00000001

Windows Vista

W systemie Vista ominięcie ekranu wyboru jest trochę bardziej skomplikowane. Nie istnieją żadne ustawienia rejestru (z tego co mi wiadomo) które pozwalają na automatyczne ustawienie typu sieci. Pozostaje więc napisanie skryptu VBS.

Set objShell = CreateObject("WScript.Shell")

'wait for window
While objShell.APpActivate ("Set Network Location") = FALSE
Wscript.Sleep 1000
Wend

While objShell.APpActivate ("Set Network Location") = TRUE
Wscript.Sleep 1000

'close window
objShell.Sendkeys "{ESC}"

Wend

Powyższy skrypt czeka na pojawienie się okna o nazwie Set Network Location po czym zamyka je klawiszem ESC.

W przypadku gdy chcemy by system został skonfigurowany juz przy pierwszym uruchomieniu trzeba jeszcze dodać poniższy wpis do rejestru by skrypt został automatycznie uruchomiony.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce]
"glorpen_reg"="C:\\glorpen\\network_type.vbs"

Wpisy pod kluczem RunOnce są uruchamiane tylko raz - po wykonaniu ich wpisy są usuwane.

wtorek, 8 stycznia 2013

Automatyczna konfiguracja Windows, cz.1

Będzie to krótka seria przedstawiająca skrypty i ustawienia rejestru pozwalające na konfigurację systemów Windows Vista i 7. W tym artykule przedstawię sposób na automatyczną zmianę tematu wyglądu.

Oba poniżej podane pliki należy zapisać z rozszerzeniem vbs.

Wersja dla Windows7

Po uruchomieniu skryptu zostanie otwarte okno personalizacji w którym automatycznie zostanie zastosowany wybrany temat a następnie okno zostanie zamknięte kombinacją klawiszy Alt+f,c (w menu Plik / Zamknij).

'win7_theme.vbs

Set objShell = CreateObject("WScript.Shell")
Theme = """" & "C:\Windows\Resources\Ease of Access Themes\classic.theme" & """"
objShell.Run(cstr("control desk.cpl,,@themes /Action:OpenTheme /file:" & theme))

While objShell.APpActivate ("Personalization") = FALSE
       Wscript.Sleep 1000
Wend

While objShell.APpActivate ("Personalization") = TRUE
       Wscript.Sleep 2000
       objShell.Sendkeys "%fc"
Wend

Wersja dla Windows Vista

Po uruchomieniu skryptu zostanie otwarte okno wyboru tematu (skrypt będzie czekał aż takowe się pojawi). Wybrany temat zostanie zmieniony na ten podany w kodzie, a następnie zostanie wysłane naciśnięcie klawisza Enter.

'winVista_theme.vbs

Set objShell = CreateObject("WScript.Shell")

Theme = """" & "C:\Windows\Resources\Themes\Windows Classic.theme" & """"

objShell.Run(cstr("control desk.cpl,,@themes /Action:OpenTheme /file:" & theme))

While objShell.APpActivate ("Theme Settings") = FALSE
Wscript.Sleep 1000
Wend

While objShell.APpActivate ("Theme Settings") = TRUE
Wscript.Sleep 1600
objShell.Sendkeys "{ENTER}"
Wend