sobota, 21 listopada 2009

Błąd przy instalacji Traca: No such file or directory: '/var/lib/trac/.egg-cache/VERSION

Co robimy:
Dodajemy do konfiguracji vhosta w apache'u:

PythonOption PYTHON_EGG_CACHE /tmp

Jeżeli w katalogu z projektami istnieje katalog .egg-cache - usuwamy go. Później wystarczy restart apache'a.

środa, 18 listopada 2009

Zapisywanie uprawnień do plików i katalogów

Czasami przydatną rzeczą okazuje się archiwizacja uprawnień do plików i katalogów. Możemy to zrobić komendą:

# getfacl nazwa_pliku

Możemy spróbować zdobyc uprawnienia rekurecyjnie w całym podkatalogu, a wynik zapisać w pliku:

# getfacl katalog > /tmp/files.acl

Jeżeli z jakiegoś powodu potrzebujemy przywrócić uprawnienia do poprzednich - robimy to komendą:

# setfacl --restore=/tmp/files.acl

Zadanie domowe:
- przeglądnąć man setfacl i getfacl
- potestować we własnym zakresie różne opcje(jak zawsze)

piątek, 13 listopada 2009

ORA-01658: unable to create INITIAL extent for segment in tablespace string

Brakło miejsca przy rozszerzaniu pliku należącego do przestrzeni tabel (TABLE SPACE). Jeżeli została użyta opcja opcja AUTOEXTEND (przy tworzeniu takiego plikunp. ALTER DATABASE DATAFILE 'pelna_sciezka_do_pliku' AUTOEXTEND ON NEXT 10M;) - to prawdopodobnie zabrakło miejsca na partycji, w której znajduje się powyższy plik. W przeciwnym razie powodem jest przekroczenie rozmiaru pliku (gdy nie używamy opcji AUTOEXTEND) - wtedy musimy ręcznie zwiększyć jego rozmiar, np. tak:

ALTER DATABASE DATAFILE 'pelna_sciezka_do_pliku' RESIZE 500M;

Gentoo - problemy przy kompilacji KDE4 - błąd libtool: link: `/usr/lib/libogg.la' is not a valid libtool archive

Ponieważ pakiety KDE4 w Gentoo w końcu zostały zakwalifikowane jak pakiety stabilne - postanowiłem sobie zaktualizować system instalując przy okazji środowisko grficzne KDE4. Niestety przy kompilacji pakietu pojawia się powyższy błąd:

/bin/grep: /usr/lib/libogg.la: No such file or directory
/bin/sed: can't read /usr/lib/libogg.la: No such file or directory
libtool: link: `/usr/lib/libogg.la' is not a valid libtool archive
make: *** [libgstvorbis.la] Error 1
*
* ERROR: media-plugins/gst-plugins-vorbis-0.10.23 failed.
* Call stack:
* ebuild.sh, line 49: Called src_compile
* environment, line 2289: Called gst-plugins-base_src_compile
* environment, line 1665: Called die
* The specific snippet of code:
* emake || die "compile failure"
* The die message:
* compile failure
*
* If you need support, post the topmost build error, and the call stack if relevant.
* A complete build log is located at '/var/log/portage/media-plugins:gst-plugins-vorbis-0.10.23:20091113-071732.log'.
* The ebuild environment file is located at '/var/tmp/portage/media-plugins/gst-plugins-vorbis-0.10.23/temp/environment'.
*


Żeby pozbyć się problemów instalujemy pakiet dev-util/lafilefixer, a następnie go uruchamiamy:

# lafilefixer --justfixit


Następnie można kontynuować aktualizację.

Zadanie domowe:
- poszukać informacji o plikach .la
- przeglądnąć dowolny plik libtool .la

poniedziałek, 9 listopada 2009

Jak sprawdzić z skąd instancja Oracle'a wzięła parametry startowe?

Z którego typu parametrów uruchomieniowych korzysta twoja instancja? Zmieniłeś je w PFILE'u a instancja dalej się uruchamia ze starymi ustawieniami - więc zapewne jest to SPFILE? Nie chcesz zgadywać?

Uruchamiamy konsolę:

sqlplus / as sysdba
SELECT DECODE (value, NULL,'PFILE', 'SPFILE') "Init File Type" FROM v$parameter WHERE name = 'spfile';


I już wiemy.
Ogólnie zasada jest taka - wartość value = NULL oznacza, że baza nie korzysta z określonego typu pliku inicjalizacyjnego. Jeżeli w obydwu przypadkach wartość kolumny VALUE jest NULLem - to baza danych używa PFILE.

Możemy też łatwo znaleźć lokalizację pliku za pomocą:

select value from v$parameter where name like 'spfile';


lub

SHOW PARAMETER SPFILE;

piątek, 6 listopada 2009

Secure FTP - bezpieczne FTP w praktyce

Nie mam zamiaru opowiadać tu o słabościach protokołu FTP i problemach związanych z konfiguracją takowego serwera. Lepiej pójść na skróty i skorzystać z gotowego, lepszego i prostszego rozwiązania (KISS) jakim jest SFTP. Mając zainstalowany serwer SSH (prawie na pewno będzie to openSSH) dostajemy taką możliwość gratis.

Najprostszym a zarazem najszybszym sposobem jest stworzenie konta i ustawienie domyślnego shella na binarkę serwera sftp - najczęściej jest to sftp-server (w debianie - /usr/lib/sftp-server, w Gentoo - /usr/lib/misc/sftp-server, w innych - poszukajcie sobie sami). Zakładamy konto:

useradd -m -s /usr/lib/misc/sftp-server username


Pozostaje jeszcze dodać sftp-server do listy dozwolonych powłok (shell) zgłoszeniowych (debilne tłumaczenie - login shells), np. tak:

echo "/usr/lib/misc/sftp-server" >> /etc/shells


Szybko i prosto zdefiniowaliśmy serwer SFTP. Jedyne co można zarzucić temu rozwiązaniu to możliwość poruszania się użytkownika po całym filesystemie - w miarę oczywiście posiadanych uprawnień - a tego nie zawsze chcemy.

Drugim sposobem, który jest może trudniejszy w konfguracji jest udostępnienie jedynie dostępu do serwera sftp z możliwością chrootowania katalogu użytkownika (chroot).
Zmieniamy w /etc/ssh/sshd_config

Subsystem sftp internal-sftp

# These lines must appear at the *end* of sshd_config
Match User username
ChrootDirectory /home/userhome
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no


Restartujemy sshd (/etc/init.d/sshd restart) i już.
Waryo pamiętać o ustawieniu shella użytkownika na /sbin/nologin

Bardzo ważne jest ustawienie właściciela i grupy na katalogu do którego będzie ograniczone środowisko robocze użytkownika na root oraz ustawienie odpowiednich uprawnień aby umożliwić użytkownikowi zapis w tym katalogu.

ps. Zamiast Match User można użyć np. Match Group - polecam poczytanie manuala sshd.

Oracle na Centosie

Zainstalowałem sobie testowego Oracle'a na wirtualnej maszynie. Przy instalacji patch'a wywalił mi komunikat:

[root@centosik Disk1]# ./runInstaller -silent -responseFile response/patchset.rsp
Starting Oracle Universal Installer...

Checking installer requirements...

Checking operating system version: must be redhat-3, SuSE-9, SuSE-10, redhat-4, redhat-5, UnitedLinux-1.0, asianux-1, asianux-2 or asianux-3
Failed <<<<

Exiting Oracle Universal Installer, log for this session can be found at /home/oracle/oraInventory/logs/installActions2009-11-01_12-56-26PM.log


Jak się można domyślić "enterprajsowe" sprawdzenie dystrybucji to naprawdę skomplikowane zadanie.
Jak uruchomić patcha mimo wszystko? A na przykład tak:

echo "Red Hat Linux release 5" > /etc/redhat-release

i już działa - dystrybucja jest w porządku - "enterprajs" rządzi

ps. wszystko jak się wydaje zależy od wersji oracle. Swego czasu musiałem mieć w pliku redhat-release wpis np. redhat-4

czwartek, 5 listopada 2009

Ruby - zabawy z gem chronic

Ostatnio popełniłem skrypt do generowania statystyk z backupów wykonanych w określonych przedziałach czasowych. Uznałem, że bardzo wygodnie było by udostępnić elastyczny mechanizm umożliwiający podanie okresu na podstawie którego ma byc wygenerowana statystyka.

Tu z pomocą przychodzi gem w Ruby co się zowie 'chronic'. Najpierw zainstalujmy gema (niestety nie ma go w portage'u - przynajmniej głownym repo):

gem install chronic


I już mamy gema.
Pobawmy się tym trochę w irb (interaktywny interpreter Ruby - czy jakkolwiek to nazwać)
ja@komp ~ $ irb
irb(main):001:0> require 'chronic'
=> true
irb(main):002:0> Chronic.parse("yesterday")
=> Wed Nov 04 12:00:00 +0100 2009
irb(main):003:0> Chronic.parse("yesterday").class
=> Time
irb(main):004:0>


Jak widać chronic zwraca obiekt klasy Time - klasa wbudowana w Ruby (standard library). Umożliwia nam to proste operowanie w kodzie np. do generowania zapytań SQL (klauzula where time ...)

Oczywiście to dopiero początek:

irb(main):005:0> Chronic.parse("last friday")
=> Fri Oct 30 12:00:00 +0100 2009
irb(main):006:0> Chronic.parse("last friday at 5pm")
=> Fri Oct 30 17:00:00 +0100 2009
irb(main):007:0> Chronic.parse("last month")
=> Fri Oct 16 12:30:00 +0200 2009
irb(main):008:0> Chronic.parse("last wednesday")
=> Wed Nov 04 12:00:00 +0100 2009


To zaledwie parę przykładów - tak żeby pokazać co potrafi sparsować chronic.
Ważnym parametrem przy parsowaniu jest kontekst czasu - w skrócie czy chronic ma szukać w pasującej do opisu daty przeszłości czy w przyszłości:

irb(main):010:0> Chronic.parse("wednesday", :context => :past)
=> Wed Nov 04 12:00:00 +0100 2009
irb(main):011:0> Chronic.parse("wednesday", :context => :future)
=> Wed Nov 11 12:00:00 +0100 2009
irb(main):012:0> Chronic.parse("wednesday")
=> Wed Nov 11 12:00:00 +0100 2009


Jak widać domyślnym kontekstem jest :future.

Opcja :now umożliwia zdefiniowanie daty, która ma być przez parser traktowana jako data aktualna (odnośnik czasowy w stosunku do którego ma być wykonane obliczenie). Domyślnie jest to czas bieżący:

irb(main):024:0> Chronic.parse("wednesday 4:00", :now => Time.local(2005, 1, 1))
=> Wed Jan 05 16:00:00 +0100 2005


Opcja :ambiguous_time_range umożliwia określenie przedziału czasowego, w którym będzie poszukiwana punkt w czasie - zobaczmy to na przykładzie:

irb(main):024:0> Chronic.parse("wednesday 4:00", :now => Time.local(2005, 1, 1))
=> Wed Jan 05 16:00:00 +0100 2005
irb(main):020:0> Chronic.parse("wednesday 6:00", :ambiguous_time_range => 5)
=> Wed Nov 11 06:00:00 +0100 2009
irb(main):021:0> Chronic.parse("wednesday 4:00", :ambiguous_time_range => 5)
=> Wed Nov 11 16:00:00 +0100 2009


Określiłem przeszukiwany przedział czasowy na 5am-5pm - jak widać zwrócone czasy zawierają się w zdefiniowanym przeze mnie przedziale.

Pozostaje jeszcze opcja :guess - to już pozostawiam czytelnikowi

Przydatne linki:
Chronic gem

Na nowym portalu:
Gemcutter gems - chronic

Jak utworzyć nowy dysk dla vmware

Zabrakło mi miejsca na dysku wirtualnej maszyny wmware.
Ponieważ nie mam na stacji pełnej wersji VmWare a jedynie vmplayera - nie mogłem skorzystać z interfejsu graficznego do prostej operacji jaką jest dodanie nowego dysku.
Trochę googlowania i jest rozwiązanie (dla tych co mają zainstalowane qemu).

Nowy, czysty dysk można utworzyć poleceniem:

qemu-img create -f vmdk disk2.vmdk 15G Formating 'disk2.vmdk', fmt=vmdk, size=15728640 kB


Później wystarczy jedynie dodanie tego dysku do konfiguracji maszyny wirtualnej. W tym celu musimy wyedytować plik o rozszerzeniu .vmx. Jest to plik tekstowy. W zależności od typu wygenerowanego dysku tworzymy odpowiedni wpis. W moim przypadku był to dysk IDE więc dodałem dwie linijki:

ide1:0.present = "TRUE"
ide1:0.fileName = "disk2.vmdk"