Etykiety

linux (14) php (14) Laravel (9) mysql (9) Hardware (8) Windows (6) sieci (5) PowerShell (4) software (4) MariaDB (3) apache (3) hosting (3) html (3) Microsoft (2) bezpieczeństwo LAN (2) cygwin (2) Akcesoria (1) CMS (1) Laptop (1) Open Office (1) drupal 7 (1) gpg (1) jquery (1) sieci LAN (1) xml (1) zabezpieczenie sieci LAN (1)

wtorek, 27 grudnia 2016

Aktualizacja serwera MariaDB z wersji 5.5 do wersji 10.1 w systemach Red Hat, Centos i Fedora

Aktualizacja pakietu MariaDB z wersji 5.5 do wersji 10.1 może wydawać się czynnością banalną, bo takową w rzeczywistości jest, lecz powikłania jej nieprawidłowego wykonania mogą spędzać sen z powiek niejednemu adminowi.
Ponieważ wewnętrzne struktury tabeli baz danych sporo się różnią pomiędzy tymi dwoma wersjami pakietów, kluczowe znaczenie w tej procedurze ma uruchomienie programu mysql_upgrade tuż po zainstalowaniu nowych wersji oprogramowania i uruchomieniu serwera MariaDB, ale tylko jeśli aktualizacja miała miejsce w systemach Red Hat, Fedora lub Centos, ponieważ pakiety oprogramowania w systemach Ubuntu i Debian wykonują tą czynność automatycznie i samodzielnie.
Przygotowałem ten krótki artykuł, ponieważ w ostatnim czasie zbyt wielu użytkowników Linuxa kontaktowało się ze mną w związku z problemami, które występowały po przejściu z wersji 5.5 do 10.1 pakietu MariaDB. Najbardziej zdesperowani byli Ci, którzy zatrudnieni są w dużych korporacjach, gdzie aktualizowano jednocześnie więcej serwerów. Niektorzy z nich wpadali w prawdziwy szał gdy serwer MariaDB nie uruchamiał się tuż po aktualizacji.
Najczęściej występujące problemy po aktualizacji z wersji 5.5 do wersji 10.1 to nie tylko brak możliwości uruchomienia serwera MariaDB, lecz także inne przykre błędy, uniemożliwiające normalne korzystanie z baz danych.
Przykładowe problemy występujące po błędnie wykonanej aktualizacji pakietu, na podstawie dziennika logów MariaDB:
[ERROR] mysqld: Can't lock aria control file '/var/lib/mysql/aria_log_control' for exclusive use, error: 11. Will retry for 30 seconds [ERROR] mysqld: Got error 'Could not get an exclusive lock; file is probably in use by another process' when trying to use aria control file '/var/lib/mysql/aria_log_control' [ERROR] Plugin 'Aria' init function returned error. [ERROR] Plugin 'Aria' registration as a STORAGE ENGINE failed. [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11 [ERROR] InnoDB: Could not open or create the system tablespace. If you tried to add new data files to the system tablespace, and it failed here, you should now edit innodb_data_file_path in my.cnf back to what it was, and remove the new ibdata files InnoDB created in this failed attempt. InnoDB only wrote those files full of zeros, but did not yet use them in any way. But be careful: do not remove old data files which contain your precious data! [ERROR] Plugin 'InnoDB' init function returned error. [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. [ERROR] /usr/sbin/mysqld: unknown option '--log-slow-queries' [ERROR] Aborting

Aktualizacja MariaDB z wersji 5.5 do wersji 10.1 w systemach Red Hat, Fedora i Centos - zalecana procedura krok po kroku


1. Tworzymy plik /etc/yum.repos.d/MariaDB.repo, którego zawartość powinna wyglądać tak:
[mariadb] name = MariaDB
baseurl = http://yum1.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
2. Wykonujemy kopię zapasową wszystkich baz danych MariaDB. Przykładowo w następujący sposób:
[root@amanda /]# mysqldump -c --all-databases -p > backup_27122016.sql
3. Usuwamy wersje 5.5 pakietu oprogramowania MariaDB
[root@amanda /]# yum remove mariadb mariadb-server
4. Instalujemy nowe wersje oprogramowania
[root@amanda /]# yum install MariaDB-client MariaDB-server MariaDB-shared MariaDB-common
5. Uruchamiamy serwer
[root@amanda /]# systemctl start mariadb
6. Aktualizujemy strukturę istniejących tabeli MariaDB
[root@amanda /]# mysql_upgrade -p
Przykładowy wynik uruchomienia programu mysql_upgrade:


Zobacz film: aktualizacja MariaDB z 5.5 do 10.1 - jak to zrobić krok po kroku!


W przypadku prawidłowego wykonania procedury aktualizacyjnej pakiet MariaDB nie powinien sprawiać jakichkolwiek problemów. Powodzenia!

niedziela, 24 lipca 2016

Jak automatycznie pobierać kursy walut NBP ?

Automatyczne pobieranie kursów poszczególnych walut z sieci to niekiedy złożone zadanie, z którym jednak każdy zawodowy twórca systemów informatycznych prędzej czy później musi się zmierzyć.
W niniejszym artykule, który przeznaczony jest dla średnio zaawansowanych i zaawansowanych programistów, chciałbym przestawić uproszczoną wersję opracowanej przeze mnie i wielokrotnie zastosowanej w wielu środowiskach produkcyjnych, metodę pobierania z sieci średniego kursu danej waluty z wybranej daty oraz automatycznego wstawiania tej wartości do formularza HTML w aplikacjach web.

Kursy walut z API NBP
Kursy walut dla aplikacji web - API NBP - Jak to działa


Jak dobrze wiadomo, w aplikacjach o charakterze finansowym, bądź biznesowym, dość często pojawia się konieczność wpisywania aktualnego kursu danej waluty do przetwarzanego na serwerze formularza. Po co więc za każdym razem wchodzić na witrynę Narodowego Banku Polskiego NBP, szukać tam tabeli kursów z danego dnia, odczytywać z niej wartości i przepisywać, bądź kopiować i wklejać do formularza, skoro można w sposób w pełni zautomatyzowany pobierać wartości kursów i wstawiać je do fomularza web za jednym wciśnięciem przycisku? Zautomatyzowane rozwiązanie może okazać się bardzo przydatne, szczególnie w przypadku konieczności codziennego, częstego odczytu wartości kursów walut, np. w aplikacjach web związanych z eksportem i fakturowaniem.
Przedstawiona tutaj metoda automatycznego pobierania średniego kursu Euro, obowiązującego dla konkretnej daty, wymaga zastosowania zarówno skryptów jQuery - po stronie przeglądarki - jak i skryptów php po stronie serwera oraz uproszczonego, przykładowego kodu html, koniecznego do osadzenia w nim formularza.
Chciałbym z góry zaznaczyć, że działającym przykładem zastosowania przedstawionego tutaj rozwiązania jest witryna Kursy Walut mojego autorstwa.

Założenia wstępne


Przedstawiony w niniejszym artykule przykład jest zupełnie "nagi" i ma służyć jedynie jako materiał szkoleniowy. Nie zastosowałem w nim żadnych dodatkowych funkcji, oprócz tych, które są niezbędne do zwyczjnego zadziałania mechanizmu. Aby jednak mechanizm mógł mieć zastosowanie w środowisku produkcyjnym, powinien on zostać opatrzony przez programistę w należyte środki bezpieczeńśtwa.

Skąd pobierać kursy walut?


Jedynym wiarygodnym źródłem kursów walut jest Narodowy Bank Polski. Jak powszechnie wiadomo, NBP od bardzo dawna udostępnia na swojej oficjalnej witrynie tabele kursów walut. Od dość niedawna jednak została uruchomiona dodatkowa poddomena NBP http://api.nbp.pl/, pod którą są umieszczane kursy walut w formatach .xml oraz .json dla celów programistycznych. Stąd właśnie będziemy pobierać kursy dla celów przedstawionego tutaj przykładu. Pliki API NBP są generowane po stronie serwera NBP, w sposób zależny od zapytania HTTP wysłanego przez klienta. Warto wstępnie zapoznać się z różnymi, możliwymi parametrami zapytań: http://api.nbp.pl/#kursyParams. Wstępne zapoznanie się z instrukcjami znajdującymi się w witrynie API NBP znacznie ułatwi zrozumienie mojego przykładu.

Jak to działa?


Pod adresem http://api.nbp.pl/api/exchangerates/rates/A/EUR/ znajdują się dane aktualnie obowiązującego średniego kursu Euro. Aby jednak uzyskać informacje dotyczące kursu Euro dla konkretnie wybranej daty, należy dołączyć datę do zapytania, np. http://api.nbp.pl/api/exchangerates/rates/A/EUR/2016-07-22
Należy zwrócić uwagę na fakt, iż możemy w ten sposób uzyskać pliki z danymi kursów, zarówno w formacie JSON jak i XML. Aby zrobiło się trochę ciekawiej, w niniejszym przykładzie posługuję się formatem XML!

Aby uzyskać informacje o kursach w formacie XML należy dodać odpowiedni parametr do naszego przykładowego zapytania: http://api.nbp.pl/api/exchangerates/rates/A/EUR/2016-07-22?format=xml

Gdy klikamy w przycisk "Pobierz i wstaw" w formularzu, którego źródło HTML przedstawiam poniżej, osadzony w sekcji HEAD kod jQuery wywołuje skrypt php api_nbp_tab_A_xml.php, przekazując mu interesującą nas datę w zmiennej $_POST. Skrypt php sprawdza czy szukany przez nas plik xml istnieje w lokalnym katalogu, a jeśli nie, to stara się go uzyskać ze zdalnego serwera NBP. Jeśli plik ze średnim kursem naszej przykładowej waluty, dla wybranej daty, nie został już uprzednio skopiowany na nasz lokalny katalog, skrypt php api_nbp_tab_A_xml.php stara się odnaleźć takowy zdalny plik kursu średniego Euro dla wybranej przez nas daty, wywołując odpowiednie zapytanie HTTP. Jeśli plik zostaje odnaleziony na zdalnym serwerze, skrypt php kopiuje go do lokalnego katalogu /xml, jeśli natomiast plik nie zostaje odnaleziony, wówczas skrypt zwraca odpowiedni komunikat.

W kolejnym etapie skrypt jQuery wysyła lokalne zapytanie XMLHttpRequest, tworząc objekt tej klasy, w celu odniesienia się do ewentualnie skopiowanego lokalnego pliku, po czym, jeśli odpowiedź lokalnego sewera jest pozytywna i plik jest "gotowy" - czyli mamy:
xhttp.readyState == 4 && xhttp.status == 200
, wówczas następuje przetwarzanie zawartości pliku poprzez funkcje getRates() i wydobywanie z niego interesujących nas wartości, które są wstawiane do formularza poprzez:
$("#kurs_euro1").val(rateInt);
$("#kurs_euro2").val(rateDec);
$("#kurs-result").html(tab);
$("#tabela_nbp").val(tab);


Formularz HTML




CSS



Kod jQuery




Skrypt PHP


Oto zawartość wywoływanego przez powyższy kod jQuery skryptu api_nbp_tab_A_xml.php:
define('XML_FILES_PATH', $_SERVER['DOCUMENT_ROOT']."xml/");

function isValidDate($date) {
$d = DateTime::createFromFormat('Y-m-d', $date);
return $d && $d->format('Y-m-d') === $date;
}

function URL_exists($url){
$headers=get_headers($url);
return stripos($headers[0],"200 OK")?true:false;
}

// Jeżeli data jest prawidłowa
if (isValidDate($_POST['data'])) {

// Jeżeli plik xml jeszcze nie istnieje w lokalnym katralogu
if(!file_exists(XML_FILES_PATH.$_POST['data'].".xml")) {

// Jeżeli istnieje dokument xml
if(URL_exists("http://api.nbp.pl/api/exchangerates/rates/A/EUR/".$_POST['data']."?format=xml")) copy("http://api.nbp.pl/api/exchangerates/rates/A/EUR/".$_POST['data']."?format=xml", XML_FILES_PATH.$_POST['data'].".xml");
else die('Tabela nie została odnaleziona!');

if (file_exists(XML_FILES_PATH.$_POST['data'].".xml")) die('Zaimportowano tabelę!'); else die('Proba zaimportowania tabeli nie powiodła się!');

} else die('Tabela istnieje!');

} else die('Proszę wybrać datę!'); -


Działający przykład


Działający przykład przedstawionej tutaj metody można przetestować pod adresem http://kursy-walut.info


Czy artykuł okazał się pomocny?


Jeśli artykuł spodobał się lub okazał się pomocny uprzejmie proszę o udostępnianie go w sieci. W razie pytań służę pomocą. Proszę o komentarze.

sobota, 23 kwietnia 2016

Odzyskiwanie hasła admina Drupal 7

Odzyskiwanie hasła admina w systemie zarządzania zawartością Drupal 7 jest bardzo proste, pod warunkiem, iż system jest w stanie wysłać nam wiadomość z nowym hasłem dostępu. Niestety, nie zawsze wszystko idzie po najlepszej myśli. Od długiego czasu administruję bardzo dużą ilością witryn www, z których spora część to strony oparte na systemie Drupal, więc zdarza mi się niekiedy, iż hasła admina do danej witryny po prostu nie pamiętam, a system z tej lub owej przyczyny nie jest w stanie wysłać mi wiadomości z nowym hasłem, bądź stary adres poczty elektronicznej już od dawna nie jest aktualny, więc hasło nie dociera. Tak czy inaczej, w praktyce tego typu sytuacje mają często miejsce.

Opiszę tutaj jak odzyskać hasło admina do systemu CMS Drupal 7 w przypadku pojawienia się kłopotów z wysłaniem nowego hasła w wiadomości email i nie mając dostępu do Shell'a. Zakładam tutaj jednak możliwość dostępu do katalogu www poprzez FTP, a także dostęp do bazy danych poprzez phpMyAdmin.

Odzyskiwanie hasła admina - Drupal 7



W systemie Drupal 6, w którym hasło admina zabezpieczane było w tabeli bazy danych SQL algorytmem kryptograficznym MD5, odzyskanie hasła w sytuacji opisanej powyżej wiązało się jedynie z wydaniem jednego polecenia SQL w interfejsie phpMyAdmin, np:
 
update users set pass = md5('newpass') where uid = 1;

W systemie Drupal 7, gdzie hasła użytkowników haszowane są za pomocą o wiele bezpieczniejszego od MD5 algorytmu sha512, sytuacja nieco się komplikuje, lecz odzyskanie hasła jest możliwe nadal w sposób dość banalny, pod warunkiem, że wiemy jak to zrobić. Jak więc odzyskać hasło admina Drupal 7 gdy system nie wysyła poczty? Ponadto, skoro nie mamy dostępu do Shell'a to nie możemy wygenerować zahaszowanego ciągu znaków nowego hasła, korzystając ze specjalnego skryptu znajdującego się zestawie skryptów Drupal 7, tak aby wygenerowany w ten sposób ciąg znaków wpisać później do kolumny o nazwie pass w tabeli users, w wierszu odpowiednim użytkownikowi admin, czyli o wartości uid = 1 . Gdy dostęp do Shell'a jest możliwy, wówczas z poziomu głównego katalogu Drupal ciąg znaków odpowiadający zahaszowanemu hasłu można wygenerować w ten oto sposób:

cd scripts;
password-hash.sh 'nowehasloadmina'

Jedyne co nam pozostaje, w sytuacji gdy nie mamy dostępu do Shell'a, a wiadomości z nowym hasłem nie są wysyłane przez system Drupal, to utworzenie skryptu php z odpowiednią zawartością, przesłanie go na główny katalog systemu Drupal poprzez ftp i uruchomienie skryptu w przeglądarce. Oto jaką treść powinien zawierać nasz magiczny skrypt php, który po uruchomieniu w przeglądarce wyświetli nam ciąg znaków odpowiadający zahaszowanemu hasłu:
<?php
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
require_once 'includes/common.inc';
require_once 'includes/password.inc';
echo user_hash_password('nowehasloadmina');
die();
?>

Otrzymany w ten sposób ciąg znaków należy wprowadzić do kolumny o nazwie pass, w tabeli users, po uprzednim uwierzytelnieniu się w interfejse phpMyAdmin, wydając następujące polecenie SQL:
update users set pass = 'zahaszowanehasloadmina' where uid = 1;

To wszystko na dziś i mam nadzieję, że artykuł okaże się pomocny. Jeśli tak, to z góry dziękuję za udostępnianie.