Szkriptek: Python, Perl, Bash, ...

apccontrol + gammu-smsd-inject = segfault

Sziasztok!

apcupsd által küldött értesítésekről szeretnék SMS-t kapni.

Beállítottam a gammu-smsd -t, kézzel futtatva a szkriptet működik is rendesen:

#!/bin/bash
SMS_NUMBERS="36XX1234567 36YY7654321"
read message
for NUMBER in $SMS_NUMBERS; do
        echo "$message" | /usr/bin/gammu-smsd-inject TEXT $NUMBER
done

Ha ezt a szkriptet egy echo után pipe-olom, megjön az sms (echo "valami" | script.sh)

Ha ugyanezt a szkriptet ugyanígy meghívom pl (Debian10) az /etc/apcupsd/onbattery szkriptből, sefaultot kapok.

Jun  2 08:14:09 infranms kernel: [81885.423160] gammu-smsd-inje[28584]: segfault at 0 ip 00007fbf851da49b sp 00007ffcfedc90f0 error 4 in libc-2.28.so[7fbf850f4000+148000]
Jun  2 08:14:09 infranms kernel: [81885.423168] Code: 00 00 0f 29 ac 24 a0 00 00 00 0f 29 b4 24 b0 00 00 00 0f 29 bc 24 c0 00 00 00 64 48 8b 04 25 28 00 00 00 48 89 44 24 18 31 c0 <8b> 03 25 00 80 00 00 75 56 48 8b 93 88 00 00 00 64 4c 8b 04 25 10

Miért csinálhatja ezt?

Szerk: ha a gammu-smsd-inject -et direktben az /etc/apcupsd/onbattery szkriptből (kiiktatva a saját szkriptet), akkor is segfault az eredémy.

A $MSG értéke amúgy ennyi lenne "infranms UPS UPSINFRA Power Failure !!!" Semmi extra karakter, < 160 karakter.

regex kérdés, vagy más megoldás?

Vizsgálatot végeznék a percre. User megadja a percet, de szeretném leellenőrizni hogy jól adta-e meg. Bonyolítja a dolgot hogy a perc ugye lehet egyjegyű, 17:5 vagy kétjegyű 17:05, de az óra szintén ugyanez. 5:22 vagy 05:22 

A feldolgozás miatt nekem kétjegyű szám kell. perc esetén gondoltam erre, de nem igazán jó. 

printf "Add meg a percet (0-59): "
read minute

regex="(^[+]?[0-9]|1[0-9]|5[0-9])\b"
if [[ ${minute} =~ ${regex} ]]; then
    if [[ ! -z ${minute} ]]; then
        minute="$(printf "%02d" $((10#${minute})))"
    fi
        echo "A perc jó: ${minute}"
else 
        echo "A perc nem jó: ${minute}"
fi

Ha itt a perc mondjuk 5, akkor az eredmény 05 lesz. Ha 05-öt írok be, akkor nem lesz jó. Nézegettem ezt is: https://regex101.com/r/dU5qB5/1
De még nem jöttem rá.

lehet hardlinkelt fájlokról listát készíteni?

Azt szeretném, hogy a fájlrendszeren lévő könyvtárakról meg tudjam állapítani, hogy van-e olyan hardlinkelt fájl bennük, aminek valamelyik példánya a könyvtáron kívül van.

A célom az, hogy a backup lemezről néhány könyvtárat másik fájlrendszerre mozgatnék át, de nem szeretném azt, hogy a régiben is és az újon is foglaljon egy-egy példányt egy olyan fájl, ami eddig egy példányban létezett, két (vagy több linkkel).

Nem ismerek olyan eszközt, ami ezt így alapból megmondaná nekem. Ti igen?

Magamtól úgy állnék talán hozzá, hogy megkeresném find-dal azokat a fájlokat, amiknek egyáltalán van hardlinkje (gondolom -links +1), aztán mindre futtatok egy ls -li parancsot, inode szerint sorbarendezem a sorokat és aztán valahogy megszámolom, hogy egy adott inode számhoz annyi sor tartozik-e, mint amennyi linket az ls kiírt hozzá.

Van ennél a vacakolós megoldásnál kevesebbet pepecselős?

[Megoldva] Google Pythonból

Sziasztok,

az alábbi szkript tökéletesen működött még a múlt héten, most meg semmi. Vajon a Google változtatott valamit, hogy nem akar  többé működni?

from bs4 import BeautifulSoup
import requests, logging

agent = 'Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) \
        Gecko/20100101 Firefox/24.0'
headers = {'User-Agent': agent}
base = "https://www.google.com/search?q="
logging.basicConfig(level=logging.DEBUG)


def get_lyrics(pattern):
    url = base + pattern
    req = requests.get(url, headers=headers, timeout=10)
    soup = BeautifulSoup(req.content, "html.parser")
    lyrics = soup.find_all("div", attrs={"jsname": "U8S5sf"})
    text = []
    for i in range(0, len(lyrics)):
        stripped = []
        stripped += lyrics[i].stripped_strings
        if "…" not in stripped:
            text += stripped
            text += " "
    return text

A lényeg az, hogy egy szerző - dal + lyrics stringre (pl: "nena - irgendwie irgendwo irgendwann lyrics") feldobta a dal szövegét. Tökéletesen működött kb 90%-os sikerrel találta meg a szöveget, még nagyon ismeretlen előadók esetében is.

Sajnos ennek egy hete vége, ha lefuttatom csak az alábbi, semmitmondó hibaüzenet jön:

DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): www.google.com
DEBUG:urllib3.connectionpool:https://www.google.com:443 "GET /search?q=nena%20%20irgendwie%20irgendwo%20irgendwann%20lyrics HTTP/1.1" 200 None

Van valakinek valamilyen ötlete mit változtathatott a gugli, hogy többé nem megy?

[ Megoldva ] Automatikus dátumformaváltás vagy sh mágia?

Van egy sh scriptem, ami háromféle tevékenységet csinál, attól függően, hogy az aktuális nap 3-mal osztva milyen maradékot ad.

Ez évek óta rendben fut is. A következő kóddal számolom a maradékot:

#!/bin/sh
DAY=`date +%j`
CLASS=$(($DAY % 3))

Ma reggelre azonban ez a kód már nem fut le, a következő hibaüzenetet adja:

arithmetic expression: expecting EOF: "008 % 3"

Gyanítom, a hiba ott lehet, hogy nem 8 az osztandó, hanem 008. De miért is? Hogyan is történhetett ez? Vagy eddig ez miért nem volt hiba? Ráadásul automatikus frissítés sincs a háttérben, így még az upgrade sem lehet a változás forrás.

Tipp? Nálam sz@ródott el valami, vagy ez már nálatok is hibára fut? És hogyan javíthatom?

fájlok mappák átnevezése

Kicsit feladták a leckét. Van vagy 5 évnyi adat melyben figyelmetlenségből akadnak olyan mappa és fájlnevek melynek az elején vagy a végén egy vagy több szóköz található. Nos ezeket lehetetlen kiírni NTFS meghajtóra. Eddig azért nem volt gond mert az adatmentés is ext4 fájlrendszerre került.

IFS=$'\n'
# ez törli a szóközöket a nevek elejéről
find . -depth -name ' *' | while read f; do
    mv "$f" "$(dirname "$f")/$(basename "$f" | sed 's/^ *//;s/ *$//')"
done

# ez törli a szóközöket a nevek végéről
find . -depth -name '* ' | while read f; do
    mv "$f" "$(dirname "$f")/$(basename "$f" | sed 's/^ *//;s/ *$//')"
done

Kitaláltam ezt, de vannak olyan nevek is sajnos, melyek nem betűkkel kezdődnek hanem mondjuk :-tal. Az ilyen speciális nem odavaló karaktereket hogyan lehetne törölni? Erre most nem fog az agyam. Bár nem tudom hogy az ilyenek gondot okozhatnak-e a Windowsnak . Ha nem, akkor akár maradhat is.

majdnem azonos sorok

Hogyan tudnám eltávolítani a majdnem egyező sorokat a fájlból parancs(ok) segítségével?

teszt.txt

AMC:714000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:251:111+112:63
AMC HD:314000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:101:34+35:72
ATV:362000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:5300:5301:35
ATV HD:378000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:101:5401:36
ATV Spirit:330000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:4800:4801:37
ATV Spirit HD:330000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:4900:4901:38
AXN:706000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:510:501+504:56
BBC earth:706000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:491:497+493+494:150
 

Egyértelműen nincs szükségem a két azonos csatornából az SD változatra. De pl. az AXN-ből nincs HD, annak meg kell maradnia.

Ez: 

grep -hFv "$(grep ' HD' teszt.txt | cut -d: -f1)" teszt.txt

pont a HD-ket szedi ki. A -v nélkül meg eltűnik az is ami megmaradhatna. Próbálkoztam awk,sed-del, de lehet rossz paraméterekkel. 

bash versus python

Sziasztok!

Volt egy egyéjszakás kalandom, amikor is hirtelen felindulásból bash -ban megírtam egy weboldal generálást PoC célzattal.

Ez anyira jól sikerült, hogy utána tovább írtam, bonyolítottam, aztán még jobban bonyolítottam, és most ott tartok, hogy van cirka 80+ kilobyte -nyi bash kódom, ami bár átlátható, de nem túl szép. Egy rakat for ciklus, benne echo, aztán megint for, meg döntések a kapott GET/POST paraméterek alapján, valamint helyi fileok olvasgatása és írása.

SQL vagy más adatbázis nincs használatban, mert olyan kevés (néhány kilobyte) adattal dolgozik, hogy az bőven belefér a file cache -be, így a "grep -F foobar alma.txt" valójában a memóriából megy, nem tekintve  grep forkolásának az idejét. De ebből sincs sok, mert a program az elején beolvassa mindent egy monstre asszociatív bash tömbbe, és utána a sok echo meg for már innen dolgozik, nem nyúlunk a lemezhez. Bash string manipulációk, illetve sed/awk még előfordul, ez utóbbiak bizonyára rosszat tesznek a performanciának, de valójában ezekből sincs olyan rengeteg. (Mondjuk azt nem tuom, hogy mennyi a rengeteg, na mindegy.)

A gondom azzal van, hogy a jelenlegi jellemzően 4-7 másodperces HTML renderelési időt sokallom.

Úgy vélem, hogy két út áll előttem.

1, a jó módszer, hogy újraírom az egésze pythonban, a jelenlegi célt figyelembe véve, de teljesen más módszertannal, vagyis nem tartok meg a jelenlegi kódból semmit. Ez elég sok időbe kerülne, ami pedig nincs.

2, Ezért arra gondoltam, hogy mi lenne, ha nem találnám fel újra a spanyolviaszt, hanem a jelenleg működő, kitesztelt, azonban lassúcska üzleti logikát másolnám át pythonba? Vagyis a bash echo helyett python print, bash if [[ helyett if ( és az awk/sed helyett a python string műveleteket hsználnám.

Mit gondoltok, ez nagyságrendileg mennyit gyorsíthat egy 80-90% -ban echo -t használó bash kódon?

Van ezzel valakinek tapasztalata?

képek kicsinyítése

Egy szkriptet kéne faragnom, ami úgy működik, hogy egy adott mappába beteszik a sok jpg képet, és azokat melyek nagyobbak mint 400kb, azokat átméretezné max 400kb-ra egy új néven. Ezt meg tudom oldani. Viszont sokszor lusták kitörölni a már elkészült kisebb méretű jpg képeket, és újra elindítják a scriptet. S ekkor újra generálódik a már létező kis kép újabb néven.

Most ez van:

for files in *.jpg *.JPG; do 
  convert -verbose ${files} -define jpeg:extent=400kb k_${files}
done

Hogy álljak neki? find kellene, if then? De bele lehet tenni egy ciklus közepébe? Esetleg helyezzem át az origin, és a kis képeket egy külön mappába a munka végén?

ansible: dict hozzadása dict.value-hoz.

Sziasztok

adott egy ansible-playbook

benne a következő deklarációval:

vars:
   gyumolcsok:
      alma:
        szin: piros
        forma: gomb
      korte:
         szin: sargas
         forma: korte 
      szilva:
         szin: lila
         forma: tojasdad

   kosar:
     alma:
     korte:

kell egy eljaras aminek a vegen a kosar tartalma ez lesz:

kosar:
  alma:
    szin: piros
    forma: gomb
  korte:
    szin: saragas
    forma: korte

vagyis egyszeruen foglalmazva egy nagy adatbazisbol ki kell masolnom egy dict-et (gyumolcsok.alma)  es a kosar.alma.value  -t erre (gyumolcsok.alma) modositani.