Szkriptek: Python, Perl, Bash, ...

Devpi alternatíva

Sziasztok!

 

Jelenleg devpi-t használok pypi cacheléshez és saját python csomag repository-ra.

Van ennél jobb vagy szofisztikáltabb megoldás, esetleg plusz funkcionalitású termék vagy opensource megoldás?

Nem lenne hátrány ha jól integrálható lenne a következőkel: jira, jenkins, azure pipeline, github 

 

Köszi,

 

Zoli

grep perl szűrés

Adott egy html fájl,  melyből kiszeretném szűrni a vastagon szedett verziószámot.
<td><a href="/pub/valami/kiadás/99.0b5/">2.0b3/</a></td>

Az alábbi paranccsal majdnem sikerül, de ott marad a verziószám utáni / jel. 

curl -s "webcím" | grep -oP "(?<=>)[^<]+"

Ezt lehetne még a regex-szel szűrni, vagy sed kell utána?

Ruby / Watir / Selenium probléma

Sziasztok.

Van egy Sinatrában megírt webalkalmazás, aminek időnként más oldalakról kell pdf doksikat letölteni.
Ehhez a Watir gem-et használom az alábbi módon:

    profile = Selenium::WebDriver::Firefox::Profile.new
    profile['browser.download.dir'] = workdir
    profile['browser.download.folderList'] = 2
    profile['browser.helperApps.neverAsk.saveToDisk'] = 'application/pdf'
    profile["pdfjs.disabled"] = true
    profile["pdfjs.firstRun"] = false

    browser = Watir::Browser.new :firefox, headless: true, options: {profile: profile}

    url_list.each do |url|
      browser.goto url
      browser.execute_script 'AdatBetolto()'
      browser.button(id: 'PDFLetoltes').wait_until(&:enabled?).click
    end
    while ( Dir["#{workdir}/*.crdownload"].count>0 || Dir["#{workdir}/*.pdf"].count<documents.count) do
      sleep 0.3
    end
    browser.close

Az egész egy Alpine Linuxból összerakott docker konténerben fut.
Mivel a chromium + chromium-chromedriver gyakran kifagyott, ezért firefox + geckodriver párost tettem fel.

Ahol fejlesztettem, (natív vason futó Debian 10.13, docker-ce 20.10.18, zfs) minden rendben ment.
Az éles rendszerben (xen-ben futó Debian 11.5, docker.io 20.10.5, overlayfs) viszont sajnos százával gyűlnek fel WebExtension és Web Content nevű zombi  processzek, ami miatt kénytelen vagyok rendszeresen újraindítani a konténert.

/ # ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.2  1.4 197768 119968 ?       Ssl  21:06   0:04 /usr/local/bin/ruby /www/main.rb
root          76  0.2  0.0      0     0 ?        Z    21:36   0:01 [Web Content] <defunct>
root          96  0.1  0.0      0     0 ?        Z    21:36   0:00 [WebExtensions] <defunct>
root         164  0.0  0.0      0     0 ?        Z    21:36   0:00 [Web Content] <defunct>
root         254  0.3  0.0      0     0 ?        Z    21:38   0:01 [Web Content] <defunct>
root         277  0.1  0.0      0     0 ?        Z    21:38   0:00 [WebExtensions] <defunct>
root         337  0.0  0.0      0     0 ?        Z    21:38   0:00 [Web Content] <defunct>
root         369  0.0  0.0   1664  1056 pts/0    Ss   21:41   0:00 /bin/sh
root         383  0.0  0.0   1708   828 pts/0    R+   21:44   0:00 ps aux


/ # pstree -p
ruby(1)-+-Web Content(76)
        |-Web Content(164)
        |-Web Content(254)
        |-Web Content(337)
        |-WebExtensions(96)
        |-WebExtensions(277)
        |-{background_thr*}(7)
        |-{background_thr*}(8)
        |-{background_thr*}(10)
        `-{utils.rb:158}(12)

Az éles rendszer kialakítására sajnos nincs ráhatásom, én csak a docker image-et adom.
Ettől függetlenül meglepne, ha a két hosting rendszer közötti különbség ilyen szinten beleszólna a konténer működésébe.
Mit lehetne még szoftver oldalról tenni, hogy ne szaporodjanak a zombik?

[MEGOLDVA] Select menü létrehozása fzf-el scriptben

Sziasztok,

Egy ideje használom egyszerűbb dolgokhoz az fzf parancsot, mint pl apt installhoz, vagy pont a remove-hoz hogy egy listát kiad, és kiválasztva enterrel eltávolítja, vagy épp telepíti. Viszont szeretnék egy olyan shell scriptet létrehozni, ahol megadott szövegek közül lehetne válogatni, és a kiválasztott esetén különböző parancsokat futtatna le. Ezt eddig egy olyan scripttel oldottam meg, ahol egy echo paranccsal kiírta, hogy pl:

1. NGINX
2. SAMBA
3. BACKUP

és utána case parannccsal megoldottam, hogy attól függően hogy milyen számot írtam be, annak megfelelően lefutott egy parancsok sorozata (jelen esetben ssh-s csatlakozás a megadott szerverre, esetleg előtte egy vpn-es csatlakozás.

Viszont ez tök jó lenne, ha fzf-el megtudnám valósítítani, hogy egy listából ugyanúgy fzf-el kurozorral kiválasztom melyik szerverről legyen szó (név alapján), és enter-el kiválasztva az ahhoz tartozó egyedi parancsokat futtatná le.
Erre van valamilyen mód fzf esetén?

 

Megoldás:

No csináltam egy megoldást. A sokadik keresésben találtam egy teljesen más fzf-es használatot. De a gondolkodásmódja viszont használhatónak tűnt, és azt felhasználva meg is tudtam oldani. A lényege, hogy létrehoztam egy file-t, amibe felsoroltam a menüpontokat és a hozzájuk tartozó parancsokat amit le kell futtatni a kiválasztáskor. Ezeket elválasztottam egy kettősponttal, tehát a kettőspont lett a delimiter. Például

BACKUP:ssh name@ip -p 8911 -i ~/.ssh/user
ICINGA:nmcli connection up userlaptop > /dev/null;ssh name@ip -i ~/.ssh/user;nmcli connection down userlaptop > /dev/null
REMOTE:ssh name@ip -i ~/.ssh/user

Aztán csináltam egy scriptet ami ezt tartalmazza:

#!/bin/bash

file="/path/server.txt"
selection1=$(cut -f1 -d ':' ${file} | fzf --prompt='Válassz szervert: ' --layout=reverse --no-multi)
selection2=$(grep $selection1 ${file} | cut -f2 -d ':')

eval "$selection2"

 

Definiáltam a file változóban ezt a szöveges filet, amiben az adatokat vannak. A selection változó tartalmazza azt a szerver nevet amit kiválasztottam az fzf menüjével. A selection 2 változó meg tartalmazza a kiválasztott szerverhez kapcsolódó parancsokat. Ezután parancsként értelmezem a selection2 függvény tartalmát. Lehetne bash -c -vel is futtatni, de így független a shelltől.

Globális objektumok a shellben

Hi,

Arra felmerült bennem az igény arra hogy akár hol vagyok a filerendszerben, jó lenne ha lenne olyan globális valami amit bárhonnan elérek és mondjuk egy előre beállított pathot jelent.

Tehát valami ilyesmit akarok

> glob X ~/X/y/z
> pwd 
/home/iwanabeguru/a/b/c
> touch X/w
> ls X
w

Létezik ilyesmi valami linux feature, shell feature vagy terminál emulátor feature gyanánt?

 

Köszönöm!

[megoldva] jegy.mav.hu - menetrend ellenorzese

A problema: jegyet akarok vasarolni Dec. 23-ara, de "Jelenleg érvényes menetrendünk 2022. december 10.-ig tart. December 11.-től az új, 2022/2023 évi menetrend lesz érvényes, mely sajnos még nem került meghírdetésre. Az elmúlt évek tapasztalatai alapján novemberben várható, de kérjük folyamatosan ellenőrizze rendszerünket."

Szoval vagy kezzel bokodom minden nap, tobbszor is (nemzetkozi jegy, az adott viszonylatra, az altalam vagyott kocsiosztalyra igen vegesek a helyek), vagy esszel er az ember.

Kotorasztam par post jsont, de mindre ezt kaptam:

~/S $ wget --post-file=/tmp/b --header=Content-Type:application/json https://jegy-a.mav.hu/IK_API_PROD/api/OfferRequestApi/GetOfferRequest
--2022-10-05 14:05:11--  https://jegy-a.mav.hu/IK_API_PROD/api/OfferRequestApi/GetOfferRequest
Resolving jegy-a.mav.hu (jegy-a.mav.hu)... 185.180.72.231
Connecting to jegy-a.mav.hu (jegy-a.mav.hu)|185.180.72.231|:443... connected.
HTTP request sent, awaiting response... 400 Bad Request
2022-10-05 14:05:11 ERROR 400: Bad Request.

Persze eleg hulye vagyok az effelehez, szoval biztos van ra megoldas, csak en nem tudom.

Otletek? Vagy marad a manualis check naponta?

 

-----------------------------------------------------------------------------------------------------

Naszoval, ez lett: https://bitbucket.org/oroce/elvira-api/wiki/Home

Bar ~10 eves, mukodik, es a szamomra tokeletes. Ha menetrenden kivuli datumra keresek, ures tomb jon vissza, egyebkent meg a menetrend. Momentan ennel tobbre nincs is szuksegem.

bing háttérkép és KDE

Írtam magamnak egy kis bash scriptet, mely a Bingről leszedi az aktuális képet. S ezt használom háttérképnek.
Eddig nem foglalkoztam azzal a résszel, hogy milyen időpontban jön ki az aznapi kép. Úgy vettem észre hogy olyan reggel 8:30 tájékán.
De mi van akkor, ha már korábban bekapcsoltam a gépet, és mivel nincs új kép, így nincs is mit lecserélni. 
Viszont eljön az idő, és lehetne képet cserélni, de hogyan?
Nos elvileg ezt is megoldottam. Az időzítést a systemd --user-re bíztam, mely óránként lefuttatja a scriptet. 
De érdekes módon csak akkor vált képet, ha manuálisan indítom a scriptet. Ha a systemd, akkor nem.
Tudom hogy a KDE-nek van ilyen featuréja, de én egy kicsit megspékeltem, és a kép nevét ráiratom a képre hogy mit is látunk.
Közvetlenül a Microsoft Bing vízjel alá. A mai napon (2022/09/24) ez a felirat látható: Acadia National Park, Maine, USA 
A feliratot ezzel teszem rá.
 

convert "${workdir}/${picName}.${ext}" -pointsize 20 -fill white -undercolor '#00000080' -gravity SouthEast -fill white -annotate +97+110 "${picName}" "${workdir}/${wallpaperName}.${ext}"

A KDE háttérképet ezzel a paranccsal módosítanám:

qdbus org.kde.plasmashell /PlasmaShell org.kde.PlasmaShell.evaluateScript "
                var allDesktops = desktops();
                print (allDesktops);
                for (i=0;i<allDesktops.length;i++) {
                    d = allDesktops[i];
                    d.wallpaperPlugin = \"org.kde.image\";
                    d.currentConfigGroup = Array(\"Wallpaper\", \"org.kde.image\", \"General\");
                    d.writeConfig(\"Image\", \"file:${bingDir}/${wallpaperName}.${ext}\")}"

S ez a konzolban kiadva le is cseréli a képet, systemd-ből futtatva viszont nem. Holott felhasználó nevében fut.
Hogy lehetne ezt kontrollálni, hogy mi történik? Vagy valami log? Bash szkript, de a -x nem vezet eredményre, mert a qdbus látszólag hiba nélkül lefut. Nincs hibaüzenet.

awk

Sziasztok!

 

hogy tudom azt awk progfile-lal megtenni, hogy egy fajlbol amiben kapcsos zarojelek tomege van,

ha 2 osszetartozo kapcsos zarolej kozott van az en keresett szovegem, akkor irja ki nekem az osszetartozo kapcsos zarojelek kozotti resz(eke)t?

u.i. a kapcsos zarojelek lehetnek egy masik kapcsos zarojelben is.

[megoldva] szavakat keresek

Időnként meg kellene keresnem néhány angol szót pár száz karaktersorban.

Mivel ritkán jön ez a feladat, eddig leginkább szemmel futottam át a listát, de minden egyes alkalommal eszembe jutott, hogy automatizálnám.

Na ma tettem egy próbát. Feltettem a Debianból a cracklib-runtime csomagot, amiben van egy cracklib-check parancs, ami ügyesen megmondja hosszabb szavakról, hogy benne vannak-e a könyvtárban vagy nem.

A gondom az, hogy csak 6 betűs vagy hosszabb szavakat hajlandó keresni.

$ cracklib-check
alive
alive: it is too short

Nekem 3, 4 és 5 betűs szavakat is meg kellene találnom. Nem találok beállítási lehetőséget vagy paramétert, ahol a minimum szóhosszt meg lehetne változtatni.

Mielőtt valaki azzal jönne, hogy 6 karakternél rövidebb jelszó túl rövid, leszögezném, hogy nem jelszóként használt karaktersorokról van szó.

Valaki tudja-e, hogy a) hogy lehet a cracklibet arra rábeszélni, hogy rövidebb szavakat is megvizsgáljon, vagy b) mi mást használhatnék, ami kb. ugyanezt tudja, de rövidebb szavakra is?

iRedMail backup

Szeretném megköszönni a segítőkész embereknek, hogy elláttak jótanácsokkal. Külön köszönet a zstd beküldőjének, több mint 7-szeres a sebesség, és jól is tömörít.

Összeraktam ollóztam és módosítottam az iRedMail mentő scriptet. Ha valaki bármilyen optimalizálást hibát vagy bármit tud az ne tartsa magába. Némi magyarázattal fűszerezve kérem szépen.

Van egy aggasztó rész, ami a régebbi biztonsági másolatokat törli, ott az a fránya rm -rf. Megfelelőek a paraméterei, de ha valaki biztonságosabbá tudja tenni, az írja le kérem. Ettől engem ráz a hideg.

Frissítem a topikot, a neve az lesz hogy iRedMail backup. Más cím javaslatok is jöhetnek.

Köszönök mindent.

A backup.txt fájlt még bővítem.

Csomag függöség alap telepítésen felül certbot és zstd.

backup.txt

# CRLF érzékeny a tar, ezért a sorok végén csak LF lehet!
# Egyéb domainek DKIM aláírásai miatt módosult
/etc/amavis/conf.d/50-user
# DKIM kulcsok
/var/lib/dkim
# Let's Encrypt 
/etc/letsencrypt
/etc/ssl/certs/iRedMail.crt
/etc/ssl/private/iRedMail.key
# Alapértelmezett email könyvtár
/var/vmail/vmail1

backup_iredmail.sh

#!/usr/bin/env bash

export PATH='/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin'

# Ennyi napig nem törli az előző biztonsági másolatotokat. 
# Az alapértelmezett nap 3.
KEEP_DAYS='3'

# Törölje a régi biztonsági másolatokat? YES ha igen.
export REMOVE_OLD_BACKUP='NO'

# Hol tárolja a biztonsági másolatokat.
export BACKUP_ROOTDIR="/home/backup/iredmail"

# Dátum. A biztonsági másolat fájl nevéhez és az adatbázis biztonsági másolat
# könyvtárai eléréséhez szükséges.
export CMD_DATE='/bin/date'
export YEAR="$(${CMD_DATE} +%Y)"
export MONTH="$(${CMD_DATE} +%m)"
export DAY="$(${CMD_DATE} +%d)"

# Az adatbázis biztonsági másolatokat könyvtárai.
# Ezt az iRedMail 3 óra 1 perc és 4 óra 1 perckor hozza létre.
export DATABASE_BACKUP_ROOTDIR="/var/vmail/backup"
export POSTGRESQL_BACKUP_DIR="${DATABASE_BACKUP_ROOTDIR}/pgsql/${YEAR}/${MONTH}/${DAY}"
export SOGO_BACKUP_FILE="${DATABASE_BACKUP_ROOTDIR}/sogo/${YEAR}/${MONTH}/${DAY}.tar.bz2"

# Biztonsági mentés mappa
export BACKUP_DIR="${BACKUP_ROOTDIR}/${YEAR}/${MONTH}/${DAY}"

# Mappa ellenőrzés, ha nem létezik létrehozza.
[ ! -d ${BACKUP_DIR} ] && mkdir -p ${BACKUP_DIR} 2>/dev/null

# Log fájl
export TIME="$(${CMD_DATE} +%H-%M-%S)"
export TIMESTAMP="${YEAR}-${MONTH}-${DAY}-${TIME}"
export LOGFILE="${BACKUP_DIR}/${TIMESTAMP}.log"

# Log fájl inicializálás
echo "* Starting at: ${YEAR}-${MONTH}-${DAY}-${TIME}." >${LOGFILE}
echo "* Backup directory: ${BACKUP_DIR}." >>${LOGFILE}

# Fájl, ami tartalmaza a menteni kívánt fájlokat és könyvtárakat.
export BACKUP_FILE='backup.txt'

# Biztonsági másolat státusza
export BACKUP_SUCCESS='YES'

if [ X"$?" == X'0' ]; then
    # Virtuális gépen 2 VCPU esetén a -T1 az optimális
    time tar -I "zstd -T1 -1" -cf ${BACKUP_DIR}/iredmail.tar.zst --exclude='#*' -T ${BACKUP_FILE} ${POSTGRESQL_BACKUP_DIR} ${SOGO_BACKUP_FILE} >>${LOGFILE}
else
    export BACKUP_SUCCESS='NO'
fi

# Fájl méret hozzáfűzése a log fájlhoz.
export CMD_DU='du -sh'
echo -e "* File size:\n----" >>${LOGFILE}
cd ${BACKUP_DIR} && \
${CMD_DU} *zst >>${LOGFILE}
echo "----" >>${LOGFILE}

# Biztonsági másolat státusz hozzáfűzése a log fájlhoz.
echo "* Backup completed (Success? ${BACKUP_SUCCESS})." >>${LOGFILE}

# A biztonsági másolat befejeztével emailben érkeznek ezek az adatok.
if [ X"${BACKUP_SUCCESS}" == X'YES' ]; then
    echo -e "\n[OK] Backup successfully completed.\n"
else
    echo -e "\n[ERROR] Backup completed with ERRORS.\n" 1>&2
fi

# Régi bizonsági másolat könyvtárak.
shift_year=$(date --date="${KEEP_DAYS} days ago" "+%Y")
shift_month=$(date --date="${KEEP_DAYS} days ago" "+%m")
shift_day=$(date --date="${KEEP_DAYS} days ago" "+%d")
export REMOVED_BACKUP_DIR="${BACKUP_ROOTDIR}/${shift_year}/${shift_month}/${shift_day}"
export REMOVED_BACKUP_MONTH_DIR="${BACKUP_ROOTDIR}/${shift_year}/${shift_month}"
export REMOVED_BACKUP_YEAR_DIR="${BACKUP_ROOTDIR}/${shift_year}"

# Régebbi biztonsági másolatok törlése
if [ X"${REMOVE_OLD_BACKUP}" == X'YES' -a -d ${REMOVED_BACKUP_DIR} ]; then
    echo -e "* Old backup found. Deleting: ${REMOVED_BACKUP_DIR}." >>${LOGFILE}
    rm -rf ${REMOVED_BACKUP_DIR} >> ${LOGFILE} 2>&1
    rmdir ${REMOVED_BACKUP_MONTH_DIR} 2>/dev/null
    rmdir ${REMOVED_BACKUP_YEAR_DIR} 2>/dev/null
fi

# A biztonsági másolat befejeztével emailben érkeznek ezek az adatok.
echo "* Backup log: ${LOGFILE}:"
cat ${LOGFILE}