Nowa, własna skórka graficzna dla CMS GetSimple

Domyślne szablony graficzne oferowany przez społeczność cms-a GetSimple (jest ich 2) jest z "epoki" internetu, gdzie wujek google nie zwracał uwagi na responsywność, skalowalność itp w urządzeniach mobilnych. Od pewnego czasu monopolista google dyktuje nam jak mamy tworzyć, pisać i być może za niedługo jak się ubierać i co jeść aby być "żywym".

Zlinczowany wytycznymi googla jak i znudzeniem obecnym motywem postanowiłem stworzyć swój motyw.

Wytczne jakie sobie postawiłem to style musiały być oparte o jakiś lekki framework css.

Wybór padł na ultra prosty framework Skeleton. Jest naprawdę lekki (około 400 lini kodu)

Obecnie strona skaluje się dosyć dobrze na urządzeniach mobilnych.

Z pewnością coś się jeszcze urodzi ale na razie pozostaję przy nowym motywie

Czas epoki unix-a - konwersja

Bash Czas w Linuksie liczymy wg tzw epoki unix-a. Co to znaczy?

Jeśli wydamy komendę w Linuksie (terminal)

 date "+%s"

to otrzymamy wynik

1574511413

który nie jest czytelny dla człowieka. Przyzwyczajeni jesteśmy do innego schematu przedstawiania daty i czasu. Czas który widzimy pokazuje ile sekund upłyneło od daty 1970-01-01 00:00:00 UTC.

Aby odczytać czas zapisany w notacji unix-owej możemy użyć komendy

date -d @1574511413

Możemy również użyć perla

perl -e 'print scalar(localtime(1574511413)), "\n"'

Z zapisem bardzo często można się spotkać w bazach danych lub logach.

Jak można wykorzystać konwersję w locie?

Przeglądając logi mojego pihole możemy użyć jednolinijkowca awk

Najpierw wgląd jak wygląda standardowe wyjście:

1574514699|192.168.80.11|POST /admin/list.php?l=black HTTP/1.1|200|20907
1574514700|192.168.80.11|GET /admin/img/donate.gif HTTP/1.1|200|3592
1574514700|192.168.80.11|GET /admin/scripts/pi-hole/php/get.php?list=black&_=1574514700224 HTTP/1.1|200|88
1574514717|192.168.80.11|POST /admin/scripts/pi-hole/php/sub.php HTTP/1.1|200|0

Teraz wykonujemy polecenie:

awk -F"|"  '{ $1=strftime("%F %T",$1); print }' /var/log/lighttpd/access.log

Funkcja strftime nie jest dostepna w standardowym awk. Jak wykonamy polecenie pokaże nam się błąd:

error: "function strftime never defined"

Musimy doinstalować gawk. Na raspberrypi zainstalowanego mam Resbiana (Debian) wykonamy więc:

apt get install gawk

Następnie można wykonać ponownie polecenie

awk -F"|"  '{ $1=strftime("%F %T",$1); print }' /var/log/lighttpd/access.log

Wynik, który nam się ukaże to:

2019-11-23 14:11:37 192.168.80.11 GET /admin/style/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2 HTTP/1.1 200 18028
2019-11-23 14:11:37 192.168.80.11 GET /admin/img/logo.svg HTTP/1.1 200 1649
2019-11-23 14:11:39 192.168.80.11 POST /admin/list.php?l=black HTTP/1.1 200 20907
2019-11-23 14:11:40 192.168.80.11 GET /admin/img/donate.gif HTTP/1.1 200 3592
2019-11-23 14:11:40 192.168.80.11 GET /admin/scripts/pi-hole/php/get.php?list=black&_=1574514700224 HTTP/1.1 200 88
2019-11-23 14:11:57 192.168.80.11 POST /admin/scripts/pi-hole/php/sub.php HTTP/1.1 200 0

Kontrola sesji użytkowników w Linuksie

Często słyszy się, że w terminalu/konsoli ciężko zarządza się zalogowanymi użytkownikami.

To prawda - jeśli myślimy w perspektywie zarządzania Windowsami. W Linuksie też znajdziemy narzędzia, które pozwalają nam sprawnie zarządzać użytkownikami.

Jest kilka możliwości. Pierwsza to znajome narzędzie who

Za man-em who - show who is logged on

Jeśli chcemy zobaczyć kto jest zalogowany w systemie to wydajemy komendę:

who

root@raspberrypi:~# who
     pi      pts/0       2019-11-09 13:54 (192.168.80.42)
     user1   pts/1       2019-11-09 15:13 (192.168.80.42)

Jest to tylko poglądowa informacja. Aby zobaczyć trochę więcej informacji na temat sesji użytkownika wydajemy polecenie:

root@raspberrypi:~# who -a
           start systemu 1970-01-01 01:00
           LOGIN     tty1        2019-11-09 12:33              473 id=tty1
           run-level 3 2019-11-09 12:33
           pi      - pts/0       2019-11-09 13:54  .          794 (192.168.80.42)
           user1   + pts/1       2019-11-09 15:13 00:07       1066 (192.168.80.42)

Pierwsza kolumna informuje kto jest zalogowany

Druga kolumna informuje do jakiego pseudoterminala lub terminala dany użytkownik został przypisany.

Trzecia kolumna informuje czas kiedy zostało to uczynione.

Czwarta jaki jest PID procesu (będzie ważny jeśli będziemy niedelikatnie podziękować użytkownikowi)

Piąta kolumna informuje skąd nastąpiło logowanie (może to być adres IP lub lokalny terminal czyli tty)

Jeśli chcemy osunąć sesję użytkownika to wydajemy polecenie:

kill PID czyli w moim przypadku kill 1066

polecenie who z opcją -H pokazuje ładnie nam nagłówki kolumn.

Jak wiemy w systemie są nie tylko użytkownicy tzw standardowi (założeni przez administratora) ale również systemowi. Tworzeni są zazwyczaj na potrzeby konkretnych aplikacji.

Aby ich wyświetlić wydajemy polecenie:

who -Hl ##l jak lolek

Drugim narzedziem jest komenda w. Jest bardziej bogatszą wersją w informacje ale brakuje jej jednej ważnej informacji PID procesu. Trzeba szukać jaki proces ma użytkownik pseudoerminala/terminala.

ps -ef |awk '$9 ~ /pts/ { print $0 }'

bądź

ps -ef |awk '$9 ~ /pts/ || $6 ~ /tty/ { print $0 }'

Zdecydowanie polecam ostatnie polecenie. Ma najwięcej możliwość i związany jest z wraz z wprowadzeniem systemd.

Komenda loginctl -l pokazuje sesje użytkowników

Aby wyświetlić więcej informacji dotyczących sesji wykonujemy polecenie:

loginctl session-status id_sesji

Aby ubić sesję uzytkownika wydajemy polecenie:

loginctl terminate-session id_sesji

lub

loginctl kill-session id_sesji

Wirtualizacja KVM - udostępnianie katalogu pomiedzy hostem i gościem

Aby udostepnić katalog pomiędzy hostem (maszyna, która zarządza maszynami wirtualizacyjnymi), a gościem (maszyna wirtualna) wykonujemy:

  • na hoscie zakładamy katalog
mkdir /share

nadajemy uprawnienia

chmod 777 /share
  • na hoście uruchamiamy virt-manager i otwieramy szczegóły maszyny wirtualnej (ikona żarówki)
  • na samym dole klikamy przycisk "dodaj sprzet" i wybieramy "system plików"
  • po prawej stronie w sterowniku wybieramy Default
  • Tryb wybieram Squash
  • ścieżka żródłowa to ścieżka do założonego wcześniej katalogu (/share)
  • w ścieżce docelowej wpisujemy /shares (nazwa może być jakakolwiek)
  • startujemy maszynę wirtualną i zakładamy katalog np: /share
  • w systemie gościa wykonujemy montowanie:
mount -t 9p -o trans=virtio,version=9p2000.L /nazwa_nadana_w_virt-manager_w_pozycji_sciezka_docelowa /katalog_zalozony_w_systemie_goscia

czyli:

mount -t 9p -o trans=virtio,version=9p2000.L /shares /share

Bash - wyświetlenie plików w strukturze podobnych katalogów

Wyświetlenie plików (lub wpisanie ich do pliku) w pewnej usystematyzowanej strukturze katalogów.

Katalogów jest bardzo dużo ja na potrzeby przykładu utworzyłem katalog-120 do katalog-130. Praca ręczna nigdy nie zostanie wzięta pod uwagę więc trzeba zrobić automat.

Musimy wyświetlić pliki z pewnego przedziału np katalog-120 do katalog-129. Rozwiązań zapewne jest nieskończenie wiele.

  • Pierwsze rozwiązanie wykorzystuje printf
printf "$PWD/%s\n" katalog-12[0-9]/*


/home/tk/skrypty/bash/lab/katalog-120/file2-1
/home/tk/skrypty/bash/lab/katalog-122/file2-1
/home/tk/skrypty/bash/lab/katalog-123/plik1
/home/tk/skrypty/bash/lab/katalog-125/plik5_1
/home/tk/skrypty/bash/lab/katalog-126/file6-1

Jeśli chcielibyśmy wypisać same nazwy plików to wynik wkładamy do pętli i poddajemy pod narzędzie basename.

for i in $(printf "$PWD/%s\n" katalog-12[0-9]/*);do basename $i;done
  • Drugie rozwiązanie wykorzystuje narzędzie find (moim zdaniem bardziej uniwersalna ponieważ działa również jeśli w katalogach są podkatalogi)
find ./katalog-12[0-6] -type f -exec basename {} \;

file2-1
file2-1
plik1
plik5_1
file6-1
  • Trzecie rozwiązanie wykorzystuje narzędzie ls
ls -1 katalog-12[0-7]/* |tr "\n" "\0" |xargs -0 -n 1 basename

bądź krócej:

ls katalog-12[0-7]/* |xargs -n 1 basename
  • I kolejna wariacja
for i in $(find . -print |grep "katalog-12[0-9]");do [[ -f $i ]] && basename $i;done
  • Bonus w postaci kodu w perl-u
#!/usr/bin/perl
use strict;
use warnings;
use File::Basename;

my @files = glob('/home/tk/skrypty/bash/lab/katalog-12[0-5]/*');
foreach (@files) {
        print basename($_), "\n";
}

Certyfikat dla usługi IIS

Certyfikat dla usługi IIS

Opublikowano 9 lip 2019

Przeprowadzamy proces generowania wniosku (możliwości są dwie)

  • Generowanie wniosku na stronie podmiotu u którego kupujemy certyfikat
  • Na własnym komputerze. Ja realizuję to narzędziem openssl

Wysyłamy wniosek do podmiotu u którego kupujemy certyfikat

Po pewnym czasie otrzymujemy prośbę o potwierdzenie, że chcemy kupić certyfikat (wiadomość pochodzi od podmiotu, który generuje certyfikat - u mnie był to RapidSSL)

W końcu dostajemy certyfikat, klucz i certyfikat RootCA

Teraz przystępujemy do konwersji certyfikatu z formatu .pem do .pfx

openssl pkcs12 -export -out certyfikat-naszadomena.pfx -inkey klucz.key -in certyfikat-naszadomena.pem -certfile RootCA.pem

Podczas konwertowania zostaniemy poproszeni o ustanowienie hasła. Powinniśmy go teraz ustanowić.

Przekonwertowany certyfikat kopiujemy na serwer Windows. Klikamy prawym przyciskiem myszy i instalujemy certyfikat. (Wybieramy Local machine, wpisujemy hasło i zaznaczamy opcję Automatically select the certificate store based on the type of certificate). Po zainstalowaniu certyfikatu wchodzimy do Internet Information Services. W panelu po lewej rozwijamy IIS->Sites->Default Web Site i klikamy aby zaznaczyć. Po prawej w panelu wybieramy Bindings..

Pokaże nam się lista na jakich portach nasłuchuje usługa www. Powinno być 80 i 443 (jeśli nie ma to ją tworzymy). Zaznaczamy pozycję 443 i edytujemy. W pozycji SSL Certificate klikamy Select i wybieramy certyfikat, który zainstalowaliśmy wcześniej. Akceptujemy i certyfikat jest podmieniony.

Bash - pobieranie wartości z pliku xml

Czasami potrzebujemy przetworzyć plik xml. Najprawdopodobniej wszystkie liczące się języki programowania mają w swoich zasobach funkcje, które takie operacje realizują. Jeśli chodzi o bash-a to jest trochę inaczej ale jak na środowisko Linuksa przystało zrealizować to zadanie możemy różnymi innymi narzędziami.

W systemie (u mnie OpenSuse 15.1) instalujemy potrzebne narzędzie:

sudo zypper in xmlstarlet

Za plik xml posłuży nam ogólnodostępny plik w serwisie GDDKiA (Generalna Dyrekcja Dróg Krajowych i Autostrad) umieszczony tutaj: https://www.gddkia.gov.pl/dane/zima_html/utrdane.xml

W podanym pliku mamy umieszczone dane z remontów, prac w całej Polsce na drogach administrowanych przez GDDKiA.

Mnie interesuje ile prowadzonych jest inwestycji w poszczególnych województwach. Taką informację możemy wydobyć w bashu tzw jednolinijkowcem.

curl -s -q https://www.gddkia.gov.pl/dane/zima_html/utrdane.xml |xmlstarlet sel -t -m "utrudnienia" -m "utr" -v "woj" -n |sort |uniq -c |sort -k1 -r

Wynik jaki dostanemy to:

65 mazowieckie
56 małopolskie
36 kujawsko-pomorskie
35 zachodniopomorskie
30 śląskie
28 wielkopolskie
24 lubuskie
22 warmińsko-mazurskie
19 lubelskie
17 podkarpackie
15 świętokrzyskie
13 opolskie
13 łódzkie
11 pomorskie
11 podlaskie
11 dolnośląskie

Serwer www Apache z autoryzacją w Active Directory

Apache

Laboratorium
  • Windows Server 2016 - Active Directory (SATKAS.LOCAL)
  • Linux SUSE Standard Enterprise 15 - usługa www oparta o httpd
Operacje na Windows Server

Na Windows Server mamy utworzoną domenę SATKAS.LOCAL. Tworzymy grupę apache i użytkowników wedle uznania. Dodajemy użytkowników do grupy apache. Utworzyłem w grupie apache jeszcze jednego użytkownika, który odpowiedzialny będzie za powiązanie nazwy DN podczas fazy wyszukiwania. Nazwałem użytkownika Server Web (konto suse@satkas.local)

Operacje na SUSE Linux

Zainstalowany mamy serwer www httpd. Uaktywniamy moduły odpowiedzialne za autoryzację w bazie ldap. Są to: ldap i authnz_ldap

Można to zrobić w yast2 (Network Services->HTTP Server). Po czym wykonujemy alt+M (wchodzimy do sekcji Moduły) i z listy wybieramy wspomniane moduły wykonując na nich alt+t (zmień status). Wychodzimy wprowadzając alt+k i alt+z

Można powyższą operację wykonać bezpośrednio w pliku /etc/sysconfig/apache2 dopisując do sekcji

APACHE_MODULES="authz_host actions alias authz_user authz_groupfile authn_file auth_basic autoindex cgi dir env expires include log_config mime negotiation setenvif userdir ldap authnz_ldap ssl php7 authn_core reqtimeout socache_shmcb authz_core"

odpowiednie moduły ldap

Teraz trzeba skonfigurować miejsce w systemie plików do którego dostęp będzie na hasło z Active Directory.

Domyślnie w SUSE tzw DirectoryRoot serwera webowego znajduje się w:

/srv/www/htdocs (odpowiada za to plik konfiguracyjny w /etc/apache2/default-server.conf)

Tworzymy sobie katalog

mkdir /srv/www/htdoc/sec

Tworzymy zawartość katalogu

touch /srv/www/htdoc/sec/index.html
echo "Strona z uwzględnieniem autoryzacji w AD" > /srv/www/htdoc/sec/index.html

Edytujemy plik /etc/apache2/default-server.conf i tworzymy nową sekcję Directory (zaraz pod aktualną sekcją Directory)

<Directory /srv/www/htdocs/sec>
          AuthLDAPBindDN "CN=Server Web,CN=Users,DC=satkas,DC=local"
          AuthLDAPBindPassword xxxxxxx
          AuthLDAPURL "ldap://satkas.local/CN=Users,DC=satkas,DC=local?sAMAccountName?sub?(objectClass=*)"
          AuthType Basic
          AuthName "SATKAS.LOCAL Authentication"
          AuthBasicProvider ldap
          AuthLDAPGroupAttributeIsDN on
          Require ldap-group CN=apache,CN=Users,DC=satkas,DC=local
</Directory>

Po zapisaniu zmian wystarczy zrestartować usługę www

systemctl restart apache2

Autoryzujemy się użytkownikami z grupy (w AD) apache