Archiwum kategorii: dev

Go / Golang – instalacja na Centos 7

Red Hat Enterprise Edition, a co za tym idzie również Centos są znane z dość konserwatywnego podejścia do wersji dostępnych pakietów.
Kiedy piszę tę notatkę, w oficjalnym repozytorium CentOS dostępny Go dostępne jest w wersji 1.8.3, natomiast najnowszy stabilny release Go to wersja 1.10.
Oczywiście instalacja ze źródeł, czy też z tar.gz z binarkami to żaden problem, ale nie po to wymyślono pakiety, żeby wszystko robić na około. Są na szczęście ‚dobrzy ludzie’, którzy pomyśleli o zrobieniu repozytorium z aktualnymi paczkami, można je znaleźć pod adresem: https://go-repo.io/

Ściągawka do instalacji repo:

(root)

rpm --import https://mirror.go-repo.io/centos/RPM-GPG-KEY-GO-REPO
curl -s https://mirror.go-repo.io/centos/go-repo.repo | tee /etc/yum.repos.d/go-repo.repo
yum install golang

Ściągawka do konfiguracji środowiska:
(user do kodowania)

mkdir -p ~/go/{bin,pkg,src}
echo 'export GOPATH="$HOME/go"' >> ~/.bashrc
echo 'export PATH="$PATH:${GOPATH//://bin:}/bin"' >> ~/.bashrc

Centos 7 + apache httpd >=2.4 + mod_wsgi + Python 3 + falcon

Odpalałem ostatnio prostą aplikacyjkę napisaną w pythonie 3 z wykorzystaniem frameworka falcon. Troszkę było kombinowania.
Nie poruszam tutaj kompletnie kwestii uprawnień, selinuxa itd. Zakładam też działające apache httpd i skonfigurowanego vhosta.

  1. Dodaj repozytorium IUS do Centosa 7

    yum install https://centos7.iuscommunity.org/ius-release.rpm
  2. Zainstaluj Python 3.6, mod_wsgi i pip.

    yum install python36u-mod_wsgi python36u-pip
  3. Stwórz środowisko wirtualne ‚app1’ potrzebne do uruchomienia aplikacji. Ścieżka przykładowa.

    sudo mkdir -p /srv/pythonenvs
    cd /srv/pythonenvs
    python3.6 -m venv app1
  4. Aktywuj venv dla swojej sesji

    source app1/bin/activate
  5. Zainstaluj falcona i wszystkie inne zależności

    (app1)$ pip install falcon
  6. Zakładam, że aplikację masz w katalogu /srv/app1/www, a ‚entry point’ to main.py. Bardzo ważne! Aplikacja musi się przedstawiać serwerowi wsgi jako ‚application’. To znaczy, że w kodzie falcon musi być odpalony w następujący sposób:

    api = application = falcon.API()
  7. Dodaj do konfiguracji vhosta:

    WSGIDaemonProcess app1 python-path=/srv/app1/www/ python-home=/srv/pythonenvs/app1
    WSGIProcessGroup app1
    WSGIScriptAlias / /srv/app1/www/main.py
    <Directory /srv/app1/www/>
    Require all granted
    </Directory>
  8. Teraz tylko restart httpd:

    systemctl restart httpd

bash extglob odkrycie tygodnia :)

extglob czyli odpalenie „regexów” wewnątrz basha. Przykładowo proste kasowanie z excludem

[szydell@example test]$ ls
aaa1.txt aaa2.txt aaa3.txt aaa4.txt aaa5.txt aaa6.txt aaa7.txt aaa8.txt aaa9.txt bbb1.txt bbb2.txt bbb3.txt bbb4.txt bbb5.txt bbb6.txt bbb7.txt bbb8.txt bbb9.txt test1.txt test2.txt test3.txt test4.txt test5.txt

Chcemy wywalić *.txt z pominięciem aaa5.txt

[szydell@example test]$ shopt -s extglob
[szydell@example test]$ rm !(aaa5).txt
[szydell@example test]$ ls
aaa5.txt

[bash]Rekursywna zmiana rozszerzeń plików.

Załóżmy, że mamy dużo plików o jakimś tam rozszerzeniu rozsianych w dużej ilości katalogów.
I chcemy tym wszystkim plikom zmienić rozszerzenie na jakieś inne.
np
test/bb/plik2.jpeg
test/cc/plik4.jpeg
test/cc/plik3.jpeg
test/cc/plik5.jpeg
test/aa/plik.jpeg
test/aa/dd/plik7.jpeg

chcemy te pliki. jpeg zmienić na .jpg

Rozwiązanie:
find test -name *.jpeg | awk -F '.' '{OFS=FS;var=$0;$(NF)="";print var" "$0"jpg"}' | xargs -n 2 mv

BASH: Proste, ustandaryzowane logowanie z poziomu skryptów (przy użyciu sysloga)

Do tego niebywale trudnego zadania, służy aplikacja logger.

usage: logger [-is] [-f file] [-p pri] [-t tag] [-u socket] [ message ... ]

Jak widać składnia jest bardzo trudna, także przykłady

[szydell@centos ~]$ logger "Się popsuło"
[root@centos ~]# cat /var/log/messages
...
Apr 25 09:01:42 centos szydell: Się popsuło

-f /katalog/nazwapliku.log – logowanie do konkretnego pliku (zadbaj o uprawnienia)
-t SIAKISTAG – zamiast logowania jaki user uruchomił, zaloguje taga

rm z pipe’m, czyli jak posprzątać po przypadkowym wypakowaniu archiwum nie tam gdzie się chciało

Czasem w ramach roztargnienia zdarza się nam narozrabiać. Ja dzisiaj rozpakowałem sobie archiwum w miejsce, w którym mam sporo innych plików… Zrobił się konkretny bajzel, także trzeba było posprzątać.

Pierwsze co mi przyszło do głowy, to wyświetlić zawartość archiwum, użyć | rm -rf i tyle, ale okazuje się, że nie da się tak przekazać listy plików do rm i koniec. Jak zawsze z pomocą przyszedł Pan Gugiel, a właściwe rozwiązanie problemu to:

tar -tf nazwaarchiwum.tar | xargs rm -f

Proste.

bash/sed parser .ini

Potrzebowałem dzisiaj prosty parser, dla pliku konfiguracyjnego w moim skrypcie pisanym w bashu. Padło na .ini i genialne wygooglowane rozwiązanie

 

#!/bin/bash
CONFIG_FILE="config.ini"
SECTION="section_1"

eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
          -e 's/;.*$//' \ -e 's/[[:space:]]*$//' \
          -e 's/^[[:space:]]*//' \
          -e "s/^\(.*\)=\([^\"']*\)$/\1=\"\2\"/" \
          < $CONFIG_FILE \
          | sed -n -e "/^\[$SECTION\]/,/^\s*\[/{/^[^;].*\=.*/p;}"`

Co ważne autor pomysłu udostępnia go zgodnie z zasadami licencji WTFPL. 😉

Oryginał dostępny tu: http://www.tuxz.net/blog/archives/2011/10/19/parse__ini_files_with_bash_and_sed/

Lua: Operacje na tablicach

Kolejna ściągawka składniowa.

Zadeklarowanie tablicy:

    NazwaZmiennej = {}

Zadeklarowanie tablicy z początkowymi danymi:

    NazwaZmiennej = {"tekst 1", 3, InnaTablica= {"pole w innej tablicy","drugie pole w innej tablicy"},"kolejny napis w glownej tablicy"}

Push:

    a = {}

    table.insert(a,"jakiś tekst")

 

Pop:

    table.remove(a,1)

Ile elementów ma tablica?

    print(table.getn{10,2,4})          -- 3
    print(table.getn{10,2,nil})        -- 2
    print(table.getn{10,2,nil; n=3})   -- 3
    print(table.getn{n=1000})          -- 1000

    a = {}
    print(table.getn(a))               -- 0
    table.setn(a, 10000)
    print(table.getn(a))               -- 10000

    a = {n=10}
    print(table.getn(a))               -- 10
    table.setn(a, 10000)
    print(table.getn(a))               -- 10000

inną opcją jest użycie operatora #. Ma on jednak jedną wadę! Nie liczy, tylko wyświetla wartość najwyższego indeksu:

    t = {"a", "b", "c"}
    = #t
    3

Pętla po parach w tablicy:

    t = {"a", "b", [123]="foo", "c", name="bar", "d", "e"}
    for k,v in pairs(t) do print(k,v) end
    1       a
    2       b
    3       c
    4       d
    5       e
    123     foo
    name    bar

można też wykorzystać ipairs. Gwarantuje to, że zawsze otrzymamy rekordy w poprawnej kolejności. To rozwiązanie wyświetla jednak tabelę tylko po indeksach, nie po kluczach.

    t = {"a", "b", "c"}
    for i, v in ipairs(t) do print(i, v) end
    1       a
    2       b
    3       c

Czytaj dalej Lua: Operacje na tablicach