wtorek, 30 czerwca 2009
Pisanie skryptów administracyjnych z wykorzystaniem języka Ruby.
poniedziałek, 29 czerwca 2009
Tworzenie spersonalizowanej paczki instalacyjnej przeglądarki Mozilla Firefox dla systemu windows. Część I.
Do utworzenia paczki instalacyjnej będzie nam potrzebne narządko 7-zip oraz najnowsza wersja instalatora Firefox.
Po ściągnięciu i zainstalowaniu 7-zip, rozpakowujemy za jego pomocą instalkę Firefox. Jest to samorozpakowujące się archiwum 7z.
Teraz możemy przyjrzeć się zawartości archiwum. Znajduje się tu:
- katalog localized
-plik browserconfig.properties
Ustawiamy odpowiedniu stronę startową zmieniając wpis
browser.startup.homepage/moja.strona.startowa
Opis parametrów znajduje się w bazie wiedzy fundacji Mozilla:
browser.startup.homepage
browser.startup.page=3
browser.startup.page
Browser.sessionstore.resume=true
browser.sessionstore.resume_session
Browser.sessionstore.enabled=true
Browser.sessionstore.enabled
Browser.sessionstore.resume_from_crash=true
Browser.sessionstore.resume_from_crash
Wybrałem tylko nieliczne z dostępnych właściwości - te które zamierzam ustawić globalnie dla wszystkich instalacji Firefoxa.
-plik localized\defaults\profileprefs.js
Tutaj możemy ustawić pozostałe właściwości. I znów kłania się nam strona mozilla fundation
-plik localized/crashreporter.ini - komunikat po awaryjnym wyłączeniu (w UTF8)
-katalog localized/searchplugins - pliki xml ze zdefiniowanymi usługami wyszukiwania (prawdopodobnie pole szukaj w przeglądarce). Można tu poeksperymentować jeśli ma się swoje wiki.
Ustawień jest całe mnóstwo ich rozpoznanie pozostawiam na później, gdy będzie to potrzebne.
- katalog nonlocalized
- plik nonlocalized\defaults\pref\firefox.js
Jeśli użytkownik nie ma prawa aktualizacji aplikacji - a tak często się zdarza -warto wyłączyć automatyczne aktualizacje (przecież pilnujemy ich w firmie centralnie)
pref("app.update.enabled", false);
Możemy również wyłączyć podpowiadanie frazy wyszukiwania, za pomocą:
pref("browser.search.suggest.enabled",false);
- katalog optional
Można wyłączyć wysyłanie raportów po nieprawidłowym zamknięciu firefoxa. W tym celu należy usunąć katalog optional\extensions\talkback@mozilla.org
Mając przygotowaną paczkę, możemy przystąpić do jej cichej instalacji na stacjach roboczych. Po skopiowaniu na stację roboczą wystarczy wydać polecenie:
setup.exe /S
Można opcjonalnie podać ścieżkę do pliku .ini, w którym możemy ustawić parametry instalatora - po informacje odsyłam do Mozilla wiki
niedziela, 28 czerwca 2009
Oracle Text nie działa (Error DRG-10700: preference does not exist: CTXSYS.DEFAULT_LEXER)
Użytkownik CTXSYS istnieje, Oracle Text się identyfikuje jako:
SQL> CREATE INDEX ap_values_idx ON asset_property(value) INDEXTYPE IS CTXSYS.CONTEXT
2 ;
CREATE INDEX ap_values_idx ON asset_property(value) INDEXTYPE IS CTXSYS.CONTEXT
*
ERROR at line 1:
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-10700: preference does not exist: CTXSYS.DEFAULT_LEXER
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 364
SQL> select * from ctx_version;
VER_DICT VER_CODE
---------- ----------
10.2.0.1.0 10.2.0.1.0
czyli jakby był (poprawnie) zainstalowany, a jednak czegoś mu brakuje.
Warto zwrócić uwagę na linię preference does not exist: CTXSYS.DEFAULT_LEXER. Nie zainstalowano wymaganych domyślnych ustawień językowych (warto zajrzeć tu). W celu instalacji należy uruchomić plik drdefXX.sql, gdzie XX to wersja językowa z której chcemy skorzystać. W moim wypadku będzie to us. Szukam pliku:
# cd /usr/lib/oracleJest. Spróbujmy wykonać skrypt:
# find -name drdef*
./app/oracle/product/10.2.0/server/ctx/admin/defaults/drdefe.sql
./app/oracle/product/10.2.0/server/ctx/admin/defaults/drdefptb.sql
./app/oracle/product/10.2.0/server/ctx/admin/defaults/drdefzhs.sql
./app/oracle/product/10.2.0/server/ctx/admin/defaults/drdefja.sql
./app/oracle/product/10.2.0/server/ctx/admin/defaults/drdefko.sql
./app/oracle/product/10.2.0/server/ctx/admin/defaults/drdefzht.sql
./app/oracle/product/10.2.0/server/ctx/admin/defaults/drdeff.sql
./app/oracle/product/10.2.0/server/ctx/admin/defaults/drdefd.sql
./app/oracle/product/10.2.0/server/ctx/admin/defaults/drdefi.sql
./app/oracle/product/10.2.0/server/ctx/admin/defaults/drdefus.sql
# su - oraclexeI mamy działający Oracle Text.
$
sqlplus ctxsys/<password> @./app/oracle/product/10.2.0/server/ctx/admin/defaults/drdefus.sql
SQL*Plus: Release 10.2.0.1.0 - Production on Sun Jun 28 10:13:46 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
Creating lexer preference...
PL/SQL procedure successfully completed.
Creating wordlist preference...
PL/SQL procedure successfully completed.
Creating stoplist...
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
Creating default policy...
PL/SQL procedure successfully completed.
Jeszcze o zalecie portage
Powoduje to, że w dystrybucjach typu debian, ubuntu, suse, etc. instalacja i zarządzanie tymi pakietami to droga przez mękę (patrz np. tu). W gentoo instalacja takiego pakietu to wydanie polecenia emerge skype. System doda skype do listy zainstalowanych pakietów i w momencie gdy pojawi się nowsza wersja pakietu nastąpi jego automatyczna aktualizacja.
Może to i niewiele - powiedzą co poniektórzy - jednak gdy takich pakietów przybywa w systemie i trzeba pamiętać o ich ręcznej aktualizacji -ponieważ żaden rpm, apt nie poinformuje nas o tym)- administrator musi o tym pamiętać - a z tym to bywa różnie. Można oczywiście tworzyć dodatkowe procedury żeby o tym niezapomnieć, tylko że po co?
KISS - Keep It Simple Stupid - to według mnie jedna z podstawowych zasad jakimi powinien kierować się w swojej pracy administrator.
sobota, 27 czerwca 2009
Instalacja pakietów w dystrybucji gentoo na przykładzie serwera subversion. Część I
Proponuję zajrzeć tu ponieważ nie zamierzam wiernie przeklajać treści, które bardzo dobrze opisują system portage:
- portage - wikipedia
- oficjalna dokumentacja Gentoo
Ponieważ przy pisaniu bloga mam zamiar prowadzić swoją listę zalet i wad Gentoo - dopisuję pierwszą zaletę:
- Rewelacyjny system zarządzania instalacją oprogramowania - Portage.
Co tak naprawdę przemawia do mnie w portage?
- na pewno to, że za jego pomocą (korzystając z repoozytorium systemowego - głównego) zainstaluję pakiety typu mplayer, skype, kadu, adobe acrobat, itd. A moje działanie ograniczy się w najprostszym wypadku do wydania polecenia (przy instalacji skype):
emerge skype- to, że gdy instaluję nowy pakiet widzę na podstawie USE-flag jakie możliwości mi daje lub jaką ma mniej więcej funkcjonalność (ale o tym za chwilę - omówię to na przykładzie).
System sam za mnie ściągnie pakiet z sieci i go zainstaluje. Spróbujcie zrobić to samo w innej dystrybucji. Nie znam takiej. W każdej z przez mnie testowanych (a było ich wiele) wymagane jest dodanie nowych repozytoriów, które nie zawsze dają powody żeby im kompletnie ufać (są to często repozytoria prowadzone przez osoby prywatne lub organizacje nieściśle związane z fundacją/firmą/etc. prowadzącą daną dystrybucję) - a to przecież musimy zrobić żeby zainstalować pakiet, którego nie ma w repozytorium dystrybucji.
- dodatkowo przy aktualizacji danego pakietu USE-flagi dają mi szybko wgląd w to jak w pakiecie zmieniła się funkcjonalność. Zapewnione to jest przez kolorowanie obsługiwanych przez pakiet flag i odpowiednie oznaczenie nowych flag w danej wersji softu.
- pakiety podzielone na kategorie
- możesz skonfigurować system dokładnie pod swoją architekturę sprzętową. Większość dystrybucji dostarcza pakiety skompilowanie pod i386, co poniektóre dodają i686. Tu możemy skorzystać z pełnych możliwości jakich nam dostarcza nasz hardware (choć musimy oczywiście wiedzieć co robimy)
Wadą Gentoo, która niejednej osobie dała się we znaki jest:
- konieczność kompilacji wszystkiego - spowalnia to zdecydowanie czas instalacji (choć widziałem pakety binarne, które wykonywały czynności okołoinstalacyjne nieraz dłużej niż zajmowała kompletna instalacja pod Gentoo). Na kompilację są sposoby (ccache, distcc) lub tworzenie pakietów (pkg, rpm) - kompilacja na jednej maszynie i rozprowadzenie skompilowanego pakietu na pozostałe maszyny. Gentoo posiada do tego ciekawy mechanizm, z którego muszę się przyznać nie korzystałem - catalyst
Z pozostałych warto powiedzieć o:
- rozmiarze, który drzewo portage zajmuje na dysku.
... dobra wracam do głównego nurtu
Część praktyczna
Zacznijmy więc instalację subversion.
Zakładam, że mamy skonfigurowany system portage (o tym opowiem następnym razem dość szczegółowo). Główny plik konfiguracyjny instalatora Gentoo - polecenia emerge - to plik /etc/make.conf.
A więc do dzieła:
# emerge --ask --verbose subversionOjoj, troszkę tego jest. Pięć pakietów do instalacji. Dlaczego? Ponieważ instalacja subversion wymusza na portage'u konieczność instalacji dodatkowych pakietów, od których zależy poprawne funkcjonowanie subversion. Skupmy się wyłącznie na linijce z interesującym nas programem:
lub zamienie z krótkimi opcjami (gdy już nabierzemy wprawy):
# emerge --av subversion
These are the packages that would be merged, in order:
Calculating dependencies... done!
[ebuild N ] dev-db/sqlite-3.6.13 USE="threadsafe -debug -doc -soundex -tcl" 2,716 kB
[ebuild N ] net-misc/neon-0.28.4 USE="nls ssl zlib -doc -expat -gnutls -kerberos -pkcs11 -socks5" LINGUAS="-cs -de -fr -ja -nn -pl -ru -tr -zh_CN" 758 kB
[ebuild N ] virtual/perl-MIME-Base64-3.07 0 kB
[ebuild N ] dev-perl/URI-1.35 94 kB
[ebuild N ] dev-util/subversion-1.6.2 USE="apache2 berkdb dso nls perl python webdav-neon -bash-completion -ctypes-python -debug -doc -emacs -extras -gnome-keyring -java -ruby -sasl -test -vim-syntax -webdav-serf" 5,343 kB
Total: 5 packages (5 new), Size of downloads: 8,910 kB
Would you like to merge these packages? [Yes/No]
[ebuild N ] dev-util/subversion-1.6.2 USE="apache2 berkdb dso nls perl python webdav-neon -bash-completion -ctypes-python -debug -doc -emacs -extras"Pierwsza część - w nawiasach kwadratowych mowi nam o statusie pakietu. W naszym wypadku jest to nowy pakiet (literka N). Pozostałe możliwe oznaczenia to:
U - update (zostanie zainstalowany pakiet w nowszej wersji)
F - fetch (pakiet źródłowy musi być ściągniety przez użytkownika, np. w wypadku sun-java-1.4, ponieważ musimy zaakceptować licencję na stronie SUNa. Podobnie jest z wieloma innymi pakietami np. Oracle'a. Jednak lepsze to niż nie mieć pakietu w repozytorium i samemu się borykać z jego ręczną instalacją)
f - fetch (jak poprzednio z tą różnicą, że pakiet jest już ściągnięty)
D - downgrade (zostanie zainstalowana starsza wersja pakietu - dzieje się to najczęściej gdy zainstalowany był pakiet zamaskowany)
S - pakiet slotowany (instalujemy inną wersję danego pakietu bez odinstalowywania istniejących w systemie- np. sun-jre-1.4, sun-jre-1.5 mogą być zainstalowane obok siebie w systemie i zamiennie używane w zależności od potrzeb)
R - reinstalacja (pakiet będzie przeinstalowany - numer wersji pozostaje ten sam)
I - interactive (wymagana interakcja z użytkownikiem - hmm chyba się z takim nie spotkałem - domyślam się, że może chodzić o akceptację umowy licencyjnej, etc.)
B - blocked (instalacja pakietu blokowana przez inny zainstalowany pakiet)
b - blocked (instalacja blokowana przez inny pakiet, jednak system portage rozwiąże automatycznie ten problem)
W nawiasie pojawia się też tajemniczy wyraz ebuild - jest to program, bezpośredni interfejs do systemu portage. Emerge instalując pakiety tak naprawdę wywołuje w odpowiedniej sekwencji program ebuild z właściwym parametrem (man ebuild).
W dalszej części linijki mamy nazwę pakietu wraz z wersją (subversion-1.6.2) poprzedzoną nazwą kategorii do której został on zaliczony (dev-util - narzędzia developerskie). Informacje te odzwierciedlają strukturę, która znajduje się w katalogu /usr/portage, gdzie znajduje się całe drzewo portage (ciekawskich zachęcam do sprawdzenia).
Kolejna część to:
USE="apache2 berkdb dso nls perl python webdav-neon -bash-completion -ctypes-python -debug -doc -emacs -extras"
Jest to informacja na temat flag USE (funkcjonalności), które pakiet obsługuje. Znak '-' minus mówi nam, że dana funkcjonalność nie zostanie włączona w bieżącej instalacji. Flagi w większości wypadków są opisowe. Jednak jeżeli dana flaga nic nam nie mówi możemy użyć polecenia euse:
# euse -i nlsOpis euse - zostawiam do następnego razu. Jest już późno.
global use flags (searching: nls)
************************************************************
[+ D ] nls - Adds Native Language Support (using gettext - GNU locale utilities)
local use flags (searching: nls)
************************************************************
[+ D ] nls (app-portage/eix):
Support foreign language messages (experimental; currently only de)
[+ D ] nls (net-analyzer/rrdtool):
Enable native language support (using intltool)
[+ D ] nls (net-irc/rbot):
Build and install translation for the messages coming from the bot and its plugins (through dev-ruby/ruby-gettext).
piątek, 26 czerwca 2009
Zdalny pipe
W pierwszej linijce pakujemy (bez kompresji) zadaną jako drugi parametr listę plików, pierwszym parametrem jest w tym wypadku znak '-' często używany jeśli chcemy uzyskać coś na STDOUT zamiast zapisać gdzieś w pliku, gdy program to umożliwia. Tak więc znak '-' informuje polecenie tar, że zamiast zapisywać tworzone archiwum do pliku ma wyrzucić wynik na standardowe wyjście (czyli w linuksie plik o deskryptorze 1).tar cf - whatever | ssh remotehost " ( cd /some/path ; tar xf - ) "
ssh remotehost "( cd /somewhere ; tar cf - something ) " | tar xf -
Następnie mamy | czyli przekierowanie/przekazanie standardowego wyjścia poprzednio wykonywanej komendy (opisanej już jedyneczki) na standardowe wejście kolejnej komendy (STDIN - czyli deskryptor pliku o identyfikatorze 0 [zero])
Kolejnym poleceniem jest wywołanie ssh - nawiąż połączenie z hostem remotehost i wykonaj polecenia podane jako kolejny parametr. Podajemy je w cudzysłowiu, żeby bash w trakcie przetwarzania nie potraktował spacji jako separatora kolejnych argumentów (pewnie poleciałyby błedy - można spróbować - na pewno coś 'chorego' się stanie. O interpretacji linii poleceń przez shell to może innym razem - jak ktoś z czytelników będzie bardzo tego chciał).
Pozostaje więc ostatnia część:
cd /some/path ; tar xf -To już dosyć proste - zmieniamy ścieżkę i rozpakowujemy archiwum poleceniem tar (x - extract). Pojawia się znowu magiczny minus. W wypadku rozpakowywania (jak co poniektórzy pewnie się domyślają) minus mówi o tym, że źródłem z którego należy czytać nie jest plik a standardowe wejście (przytaczane wcześniej zero).
Drugi przypadek pozostawiam do samodzielnej analizy. W razie problemów i pytań służę pomocą
Do samodzielnej lektury polecam wikipedię
- wersja angielska
- polska - też jest ale jest dużo mniej informacji
echo $?Jeżeli program wykonał się poprawnie - nie pojawiły się błędy - to status powinien być równy 0 [zero]. W przypadku problemów będzie to cyfra różna od zero - to co będzie oznaczać zależy już od programu. Warto sprawdzać tą zmienną pisząc skrypty - przez co możemy przerwać je w odpowiednim momencie, gdy coś pójdzie nie tak a nie zostawić wszystko dalszemu biegowi wypadków.
A co w wypadku gdy łączymy kilka poleceń w pipe? Jak wykryć, że któreś (nieostatnie) polecenie wykonało się niepoprawnie?
Odpowiedź w przyszłym blogu...
Może warto poszukać samemu?
Czekam na komentarze...
czwartek, 25 czerwca 2009
kopiowanie plików na zdalne serwery
- SCP
Najprościej można tak:
scp plik_lokalny [user@]host_zdalny:/sciezka/w/filesystemie [-p 22]
-p 22 to port na który łączymy się ze zdalnym hostem.
Popatrz tez w man. Warto z tego polecenia często korzystać - szczególnie na początku, gdy system kryje w sobie mnóstwo tajemnic.
i pojedynczy plik jest skopiowany o ile użytkownik może pisać w określonej zdalnej lokalizacji.
Skopiowaliśmy pojedynczy plik. A co jeśli chcemy skopiować część struktury katalogów. Powiedzmy podkatalog '/home/foo'. Użyjmy przełącznika -r (recursive). Musimy uważać jedynie na symlinki (o tym innym razem) ponieważ scp podąży za tymi linkami i zamiast skopiować informację o linku - przeniesie nam całą zawartość, na którą wskazuje symlink - a to może kosztować sporo miejsca i powielić nam struktury w filesystemie. Zamiast -r często warto najpierw skompresować zawartość, którą zamierzamy przenieść i nie przejmować się problemami związanymi z użyciem przełącznika -r.
Przypomniało mi się jeszcze o dd. Można też w pipe puścić wejście dd i z drugie strony tunelu ssh zapisać do pliku wynikowego. Ale o tym może innym razem.
Jest jeszcze conajmnie jeden problem, który jest związany z użyciem scp. Mianowicie gdy coś nam przerwie transmisję, to możemy śmiało zaczynać kopiowanie od zera - nic się nie da zrobić (przynajmniej tak mi się wydaje).
Warto wtedy pomyśleć o użyciu
- rsync
Jako przykład, z którego korzystałem przed chwilką podam:
rsync galeria.tar.bz2 -ave ssh ssh.linuxway.eu:/home/galeria.tar.bz2
Zgłębienie składni pozostawiam czytelnikowi.
