RSS Feed

‘php’ Category

  1. Upgrade Lenny -> Squeeze i niedziałające PHP

    Marzec 30, 2012 by 0verlord

    Zaatakował mnie w sumie dość debilny, ale i szybko naprawialny problem. . Aktualizowałem jeden serwer z Lennyego na Squeeze, jako że nastąpił koniec wsparcia dla starego stabla.

    Aktualizacja przebiegła bez najmniejszych problemów, bo w sumie na tym hoście tylko wiatr wieje, a i to czasem.
    Po aktualizacji jedyna aplikacja, która tam była zamiast parsować PHP, pozwalała je pobrać. Problem niby znany – brak obsługi php w Apaczu. Ale nie do końca. Moduły były, wszystko dobrze pokonfigurowane, ale zamiast wyświetlać – ściągał. Co ciekawe, phpmyadmin działał bez zarzutów.
    Po wiązance kwiatów polskich w kierunku Boga Nieprzewidzianych Problemów, jeeeeest, znalaaazłem.

    Jest sobie plik ładujący podstawowy konfig do php, konkretnie ten:

    host:~# cat /etc/apache2/mods-available/php5.conf 
    <IfModule mod_php5.c>
        <FilesMatch "\.ph(p3?|tml)$">
    	SetHandler application/x-httpd-php
        </FilesMatch>
        <FilesMatch "\.phps$">
    	SetHandler application/x-httpd-php-source
        </FilesMatch>
        # To re-enable php in user directories comment the following lines
        # (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
        # prevents .htaccess files from disabling it.
        <IfModule mod_userdir.c>
            <Directory /home/*/public_html>
                php_admin_value engine Off
            </Directory>
        </IfModule>
    </IfModule>
    

    Co on robi? Ano wyłącza php w katalogach userów, jeżeli moduł userdir jest załadowany. U mnie był. Zmyliło mnie, że ta aplikacja miała swój własny vhost. Ale już DocumentRoot łapie się w ścieżkę z wyłączonym php. Zakomentowałem, zrestartowałem i ruszyło.

    Słowo o bezpieczeństwie takiego podejścia. Ma to sens, jeżeli mamy hosta, w którym są użytkownicy, którzy korzystają z userdir i wrzucają tam różne skrypty, które mogą być dziurawe albo z powodu nadmiaru dobrych chęci mogą przywiesić hosta, jak się zapętlą na śmierć. Jeżeli mamy tylko jedną aplikację i brak innych użytkowników, można sobie wyłączać. Jeżeli mamy userów, warto się zastanowić, zanim zakomentujemy te linijki. Z drugiej strony, skoro pod Lennym działało i nagle przestało to pewnie usernia zacznie protestować.


  2. Instalacja Symfony z Postgresem na hostingu nazwa.pl

    Styczeń 28, 2012 by 0verlord

    W skrócie, da się, chociaż obiłem się o kilka problemów.

    Z wrzuceniem witryny do katalogu nie ma problemu, załatwiamy wszystko z activeadmina. Panel jest na tyle sensowny, że nie przygniata i szybko można go ogarnąć.

    Problemy:

    1. Trzeba dobrze uważać przy tworzeniu bazy, bo konfigurator może nas obdarzyć niestandardowym portem Postgresa. Ja dostałem np. 5443 zamiast domyślnego 5432. Objawia się to tak, że mimo, wydawałoby się, poprawnie skonfigurowanych parametrów w databases.yml dostajemy Permission Denied.

    2. Nasz katalog domowy, a co za tym idzie katalog, w którym siedzi Symfony, a który należy podać w ProjectConfgurationClass.php wygląda jakoś tak: /home/<nazwa konta>/ftp/. Jak sprawdzić, jak wygląda nasz katalog? Najlepiej wrzucając do katalogu przeznaczonego na witrynę prosty „skrypcik” w php, który nam pokaże co trzeba. Wygląda on np. tak:
    <?php
    echo getcwd() . "\n";
    ?>

    I ładnie pokazuje odpowiedni katalog.

    3. Błędy. Jak na każdym hostingu, nie mamy dostępu do logów serwera www, a czasem wersje _dev aplikacji nie wystarczają, żeby pokazać cokolwiek sensownego i naprowadzającego na właściwy błąd. Na nazwie można to zrobić, podając do pliku .htaccess w głównym katalogu projektu takie wpisy:

    php_value display_errors 1
    php_value display_startup_errors 1
    php_value display_errors On
    php_value error_reporting E_ALL
    php_value error_log /katalog/projektu/symfony/web/error.log

    Co to robi? Włącza raportowanie php, domyślnie wyłączone na nazwie. Oczywiście należy to zakomentować jak już postawimy aplikację w całości, żeby niepotrzebnie nie pokazywać błędów. Ale wyjaśnienia wymaga jeszcze ostatnia linijka, ta ze ścieżką.
    Chodzi tutaj o to, żeby stworzył się log w katalogu domyślnie widocznym pod główną domeną, żeby można było na osobnej zakładce oglądać błędy. Ten katalog trzeba dopasować do tego, co pokazuje php z punktu nr 2. Jeżeli ktoś pomyli ścieżki, i plik nie będzie widoczny z sieci, zawsze można go pobrać przez ftp. Ciężko dostępny log dalej loguje, i jest lepszy niż brak logów w ogóle.

    To, że dało się włączyć logowanie, to całkiem ciekawy ficzers nazwy. Na home.pl taka sztuczka raczej by nie przeszła, ale i nie sprawdzałem. Na home.pl natomiast jest inny problem z symfony, opisany dokładnie tutaj.


  3. Vtiger 5.3, instalacja na home.pl i błąd przy logoucie

    Grudzień 10, 2011 by 0verlord

    Stawiam Vtigera 5.3 dla klienta. Pierwszy zgrzyt, to home.pl, ale poradziłem sobie łopatologicznie, tj. upload pliku do katalogu, phpshell i unzip. PHPShell, bo z jakiegoś powodu zapychanie plików po ftp na home.pl działa koszmarnie wolno. Tj. jak pcham jeden wielki plik, to bez problemów, pcha się błyskawicznie. Natomiast zapchanie archiwum pełnego małych pliczków trwa wieki.

    Instalator vtigerowy można sobie z miejsca odpuścić. Nie zadziała z kilku powodów:
    1. nie umie stworzyć bazy, co bym nie zmieniał i tak przerywa w połowie. Internet sugeruje wiele rozwiązań – w wersji 5.3 żadne mi nie zadziało.
    2. z jakiegoś powodu wykrywa katalog główny jako // (dwa slashe), potem próbuje czytać z tego katalogu, a że go nie znajduje – rzuca błędem. Konkretnie $root_directory = '/';
    3. defaultowo w podkatalogu nie ma katalogu tmp. Trzeba dodać. Ale jeżeli się tego nie walczyło z home.pl to się tego nie wie, więc instalator się wywali.

    Proponuję zatem rozwiązanie następujące:
    1. zainstalować sobie na normalnym linuxie i uruchomić instalator.
    2. odpowiedzieć na wszystkie pytania i skonfigurować sobie instalkę
    3. na home.pl wypakować czystą wersję i odpowiednio spreparować config.inc.php
    4. wgrać dumpa ze świeżej instalki, ale nie przez phpmyadmina (czyli przez web), bo też mi się to nie udało – import pluł, że plik jest za duży. Za duży, pewnie. 750kb to za dużo.
    5. skopiować pliki z lokalnej instalki:
    tabdata.php parent_tabdata.php user_privileges/sharing_privileges_cyferka.php i user_privileges/user_privileges_cyferka.php – jak tego nie skopiujemy, dostaniemy komunikat o braku któregoś z nich, najczęściej z numerkiem 1.
    6. odpalić i tadam.wav

    No i generalnie będzie działać, z kilkoma wyjątkami. Nie da się wylogować, bo się wysypie i kilka modułów administracyjnych też nie będzie działać – np. edytor konfiguracji. Przy logoucie error będzie wyglądał jak niżej:

    Warning: require_once(modules/VtigerBackup/VtigerBackup.php) [function.require-once]: failed to open stream: No such file or directory in /modules/Users/Logout.php on line 29

    Fatal error: require_once() [function.require]: Failed opening required 'modules/VtigerBackup/VtigerBackup.php' (include_path='/include/htmlpurifier/library:.:/:/usr/local/php/pear5') in /modules/Users/Logout.php on line 29

    i rzeczywiście – nie ma tego skrypciku.

    Tu mnie naprowadzili: http://forums.vtiger.com/viewtopic.php?t=40319

    Ten plik to jest część podstawowych modułów vtigera, i normalnie instalator je wypakowuje – o ile zakończy sukcesem cała akcję. Ale jak to zrobić na home?

    Curlftp naszym kolegą. Montujemy sobie katalog z witryną po ftpfs.
    Wypakowujemy sobie instalkę, wchodzimy do
    packages/vtiger/mandatory
    i to właśnie tam siedzi to, czego nam brakuje.
    Teraz część trudniejsza. Po odpakowaniu, archiwa z modułami zawierają dwa katalogi: modules i templates. Modulesy wypakowujemy do głównego katalogu ze stroną, a templates do ./Smarty/templates, wg schematu, np. dla ConfigEditor.
    ./Smarty/templates/modules/ConfigEditor/index.tpl
    Czyli w katalogu ./Smarty/templates/modules zakładamy katalog taki jak nazwa wypakowanego modułu.
    Można też prościej – w końcu instalowaliśmy lokalną wersję, żeby mieć bazę. Kopiujemy z lokalnie działającego vtigera katalog.
    Smarty/templates oraz
    modules/

    W końcu to te same pliki i ta sama wersja i tylko odpowiednio 2.3- i 20MB.

    Potem można sobie doinstalować np. polski język, np.stąd, ale to już po zalogowaniu przez managera modułów. Najlepiej zrobić to na końcu, ponieważ templejty, którymi będziemy mieszać, nadpisują niektóre pliki z tłumaczeniami.

    Amen.


  4. LMS i odzyskiwanie z backupu

    Grudzień 2, 2011 by 0verlord

    Sytuacja jak zazwyczaj: pada mi host z lmsem, backup się zrobił i odzyskał. Trzeba po prostu odzyskać, bez upgrade i innych takich tam sztuczek. No to jadę – przenoszę bazy, ale mysql < baza.sql rzuca permission denierem i wymaganiami super usera. Dokładnie takimi erorrami rzucało: Napotkano błędy w bazie danych!
    Zapytanie: CREATE FUNCTION lms_current_user() RETURNS int(11) NO SQL
    RETURN @lms_current_user;
    Błąd: You do not have the SUPER privilege and binary logging is enabled
    (you *might* want to use the less safe log_bin_trust_function_creators
    variable)
    Zapytanie: CREATE VIEW customersview AS SELECT c.* FROM customers c
    WHERE NOT EXISTS ( SELECT 1 FROM customerassignments a JOIN
    excludedgroups e ON (a.customergroupid = e.customergroupid) WHERE
    e.userid = lms_current_user() AND a.customerid = c.id)
    Błąd: FUNCTION lms.lms_current_user does not exist

    Przywróciłem bazę z doc/lms.mysql, ale nie pomogło, dalej pluło errorami z customerviewsem.
    Wujek google skierowął mnie tu.

    W skrócie: uwaliłem viewsy, wszystkie:
    CREATE VIEW nas AS
    SELECT n.id, inet_ntoa(n.ipaddr) AS nasname, d.shortname, d.nastype AS type,
    d.clients AS ports, d.secret, d.community, d.description
    FROM nodes n
    JOIN netdevices d ON (n.netdev = d.id)
    WHERE n.nas = 1;

    CREATE VIEW vnodes_mac AS
    SELECT nodeid, GROUP_CONCAT(mac SEPARATOR ',') AS mac
    FROM macs GROUP BY nodeid;

    CREATE VIEW vnodes AS
    SELECT n.*, m.mac
    FROM nodes n
    LEFT JOIN vnodes_mac m ON (n.id = m.nodeid);

    CREATE VIEW vmacs AS
    SELECT n.*, m.mac, m.id AS macid
    FROM nodes n
    JOIN macs m ON (n.id = m.nodeid);

    CREATE VIEW customersview AS
    SELECT c.* FROM customers c
    WHERE NOT EXISTS (
    SELECT 1 FROM customerassignments a
    JOIN excludedgroups e ON (a.customergroupid = e.customergroupid)
    WHERE e.userid = lms_current_user() AND a.customerid = c.id);

    i dodałem funkcję:
    CREATE FUNCTION lms_current_user() RETURNS int(11) NO SQL RETURN @lms_current_user;.

    Wszystko oczywiście po dodaniu bazy i usera do niej.Chciałem też odpowiednio okomentować w blogu z linka przydatne informacje, a tutaj niespodzianka:

    WordPress database error: [INSERT command denied to user 'xxx'@'localhost' for table 'wp_comments']

    Życie. Więc podziękuję tu:

    Thenks meeeen, I loveeee youuuuu 😀 (i napraw sobie zapomnianego worpdressa ;-))

    EDIT: wszystkie viewsy trzeba skasować, jak leci wszystkie, tj.

    DROP VIEW IF EXISTS nas;
    DROP VIEW IF EXISTS vnodes_mac;
    DROP VIEW IF EXISTS vnodes;
    DROP VIEW IF EXISTS vmacs;
    DROP VIEW IF EXISTS customersview;

    W sumie ciekawe, dlaczego dump nie odtworzył viewsów. Ale nie chce mi się szukać.


  5. Postgresql, lms.current_user i błąd

    Sierpień 19, 2011 by 0verlord

    Szybko o LMSie, postgresie i bugu będącego efektem niedoczytania konfiguracji.

    Dokumentacja mówi, żeby: Wymagane jest dodanie wpisu w postgresql.conf: custom_variable_classes = 'lms'

    Natomiast nie mówi, co się stanie, jeżeli tego wpisu nie będzie. Oczywiście, można z sourca wyczytać nie? 😛

    Efekt wygląda tak:
    Zapytanie: SELECT set_config('lms.current_user', '1', false)
    Błąd: BŁĄD: nierozpoznany parametr konfiguracyjny "lms.current_user"
    Zapytanie: SELECT COUNT(id) AS total, COUNT(CASE WHEN status = 3 THEN 1 END) AS connected, COUNT(CASE WHEN status = 2 THEN 1 END) AS awaiting, COUNT(CASE WHEN status = 1 THEN 1 END) AS interested FROM customersview WHERE deleted=0
    Błąd: BŁĄD: nierozpoznany parametr konfiguracyjny "lms.current_user"
    Zapytanie: SELECT SUM(a.value)*-1 AS debtvalue, COUNT(*) AS debt FROM (SELECT SUM(value) AS value FROM cash LEFT JOIN customersview ON (customerid = customersview.id) WHERE deleted = 0 GROUP BY customerid HAVING SUM(value) < 0 ) a
    Błąd: BŁĄD: nierozpoznany parametr konfiguracyjny "lms.current_user"

    Dodajemy wpis, o którym mowa w docku i error znika.


  6. cpanel, cpanel, ty wuju czyli jak sobie cichaczem zabić pocztę

    Marzec 9, 2011 by 0verlord

    Klikałem dla customera przekierowanie domeny. Niestety ewidentnie jego provider miał jakąś starszą wersję, która miała kilka irytujących ficzersów. Np. dla zaparkowanej domeny nie można było zmienić katalogu, na który była kierowana. Można to było zrobić tylko raz przy dodawaniu domeny. Nowsze cpanele mają już spokojnie możliwość przeklikania katalogu pod wybraną domenę, ten nie miał.

    Szukałem i szukałem, w końcu odparkowałem domenę. Powitał mnie groźny komunikat o usunięciu domeny z dnsów, nawet się przestraszyłem. Potem dodałem z powrotem domenę na odpowiedni katalog.

    No i byłoby fajnie, gdyby nie to, że poszedł cascade delete na wszystko związane z parkowaną domeną. Np. na forwardera poczty z domeny parkowanej na prawdziwą. I w ten sposób, panu klientowi wybuchła poczta funkcjonalnej części firmy. Ehh…