Szkriptek: Python, Perl, Bash, ...

[MEGOLDVA] rsync logjának feldolgozása

Sziasztok,

Egy olyan problémába ütköztem, hogy adott egy többszörös rsync script, ami loggolásra kerül, és szeretném összesíteni az átvitt file-oknak a nagyságát. Azt hittem, hogy ez elég egyszerű lesz, mert egyszerűen greppelem azt a sort ami kiírja minden egyes rsync file átvitelének méretét, és összeadom. Ez ugye egyszerű:
 

cat rsync.log | grep "transferred file" | cut -d" " -f 5 | awk '{ SUM += $1} END { print SUM }'

Viszont a probléma, hogy nem konzekvensen van a mértékegység, hiszen ez lehet K, M és G is hozzáírva, így nem tudja összeadni, vagyis ezek bár sed-el ki lehetne törölni, de ugye a helyiértéket is hozzá kellene igazítani mielőtt összeadom.
Tud valaki erre egy "egyszerű" megoldást?

Python WTF! ezt meg igy hogy?

Biztos en vagyok a hulye, de ezt nem ertem, hogy itt mi tortenik a dict-el a func hivasok kozott:

def parse(params,d={}):
    for p in params.split(";"):
        k,v=p.split("=",1)
        d[k]=v
    return d

x=parse("a=1;b=2")
print(x)
y=parse("c=3")
print(y)
z=parse("d=4;e=5")
print(z)

# ./wtf.py

{'a': '1', 'b': '2'}
{'a': '1', 'b': '2', 'c': '3'}
{'a': '1', 'b': '2', 'c': '3', 'd': '4', 'e': '5'}

ugye itt azt varnam, hogy mindig csak az aktualis parse() hivas eredmenye keruljon bele a returned dict-be, de a korabbiak hogy kerulnek oda pl. a z-be az a:1 ?

igen, tudom hogy ha a d={} nem a parameterekbe lenen hanem a def utani sorban akkor mukodik, de az volt a cel, hogy opcionalisan meg lehessen adni egy mar letezo dict-et, hogy abba parsoljon bele.

Python dataset max 20MB

Sziasztok,

Van egy Python szkriptünk, amiben dataset-et használunk, viszont az adat, ami be akarunk vele tölteni, több, mint dataset maximális mérete. Ezeket szétszedtük ezresével és úgy töltjük be. Tudtok valami módot arra, hogy 20MB-nál nagyobb méretű adatot töltsünk be Pythonnal? 

SonarCube warning

Sziasztok,

 

Egyszeru os.system('echo "xxxx--------------------------------"') sorra Warningot dob a SonarCube.

ezt irj:

Make sure that executing this OS command is safe here.
Using shell interpreter when executing OS commands is security-sensitive python:S4721

Hogy lehetne ezt orvosolni?

 

Koszonet elore a segitsegert.

Ardi

szám ellenőrzés

Van egy számozott listám, melyet egy tömbbe rakok.
A tömb végén meghatároztam az utolsó számot.
        max_number=$(( index - 1 ))

A lista:        
01 foo
02 foo
...
89 foo

A bash szkript megkér hogy válasszak egy számot a listából, majd elemzi a választott számot.
        read -r choice
        number_check=$(echo "${choice}" | grep -E '^[0-9]{2}|0')

A 0-ra szükségem van, viszont a többi egyjegyű számok nem kellenek. mivel a lista is kétjegyű. Ezért a regex.
Így két legyet ütök egy csapásra, Ha betűt adok meg, nem fogadja el.
Viszont van egy ilyen ellenőrző is:
    if (( choice > max_number )); then
Lefut ugyan de hibát dob. Ezért elrejtem a hibaüzenetet. Bár jó lenne megoldani.
    if (( choice > max_number )) >/dev/null 2>&1; then
S itt vannak a gondok. 
Próbálkoztam ezzel is:
    if [ ${choice} -gt ${max_number} ]; then
de a 08, 09 oktális decimális keverés miatt hibát dob, amennyiben a 08 vagy a 09-es kerül kiválasztásra.
 

read -r choice
number_check=$(echo "${choice}" | grep -E '^[0-9]{2}|0')            
if [ "${number_check}" != "" ]; then
#     if (( choice > max_number )) >/dev/null 2>&1; then
    if (( choice > max_number )); then                
       clear
    else
        if [ "${choice}" = "0" ]; then
            clear
            exit
        else
            minden rendben
        fi
    fi
else
    clear
fi

exif feldolgozás

A cél hogy kinyerjem a képből a GPS adatok alapján a város (helység) nevét, de sajna kis problémába ütköztem. Vannak képek melyek egyáltalán nem tartalmazzák a GPS adatokat, ezeket kapásból kihagynám a feldolgozásból.

if true; then
    exiftool -p '$GPSDateStamp' $1 2>&1 | grep -v "not defined"
    echo "nincs gps adat"
    exit 
else
    echo "van gps adat"
fi    

De ez így nem is működik. Akkor is az első ág hajtódik végre ha - auuu talán éppen azért mert a $1 is az első ágban van? Befejezem a mondatot - ha van GPS adat.
A lényeg hogy jó lenne ideiglenes fájlok nélkül feldolgozni a képeket. (xml, json) A Google maps API-hoz regisztráció kell, s most azt kihagynám. Ellenben az OSM működik.
Haladjunk sorjában. Az első probléma hogy a sima 

exiftool -n -p '$GPSLatitude' IMG_20160716_085603.jpg

is hibát dob

44.27358625
Warning: [minor] Unrecognized MakerNotes - IMG_20160716_085603.jpg
 

Ha csak simán ki iratom: 
$ exiftool -n IMG_20160716_085603.jpg

GPS Date/Time                   : 2016:07:16 05:56:02Z
GPS Latitude                    : 44.27358625
GPS Longitude                   : 28.6205234444444
Focal Length                    : 3.16
GPS Position                    : 44.27358625 28.6205234444444

Az exiftool verziója: 
$ rpm -qa | grep ExifTool
perl-Image-ExifTool-12.0.0-1.2.mga8
 

Ezek a képek többnyire androidos telefonnal készültek. A hibaüzenetek ellenére a következő megoldás működik.

lat="$(exiftool -n -p '$GPSLatitude' $1)"
lon="$(exiftool -n -p '$GPSLongitude' $1)"

#curl -s "https://nominatim.openstreetmap.org/reverse?format=json&lat=${lat}&lon=${lon}&addressdetails=1" | jq -r .address.town $1
curl -s "https://nominatim.openstreetmap.org/reverse?format=json&lat=${lat}&lon=${lon}&addressdetails=1" | jq -r .address.city $1

A -n kapcsoló feldolgozhatóbb formában adja a GPS adatokat, a -p lenne a felelős a speciális kiírásért. Viszont emiatt van hibaüzenet. De most grep és awk ? - szvsz lassú lenne.
Még itt is kell majd egy feltétel vizsgálat, mert érdekes módon van ahol nem is létezik a city mező, hanem a town mezőben található a város neve. Ezt vajon hogyan dolgozzam fel? A sima if then vajon itt hogyan működne? Hiszen ezek a json válaszon belül vannak. Szvsz csak akkor működne ha ideiglenes fájlt hoznék létre. 

A végső cél a képekből kinyert információk alapján létrehozni egy ilyesmi mappa struktúrát. 

Kameramodell/Város/év/év-hónap/kép 

Jelenleg van egy működő megoldásom a város nélküli feldolgozásra

exiftool -r -progress -d '%Y/%Y-%m/PIC_%Y%m%d_%H%M%S%%-c.%%le' '-filename<${make}_${model}/${datetimeoriginal}' .

A progress elhagyásával gyorsabb persze, de így látni hogy dolgozik. Ide kellene majd befűznöm valahogy a város mappa létrehozását. Viszont azt már tudom hogy a -d '%Y/%Y-%m/PIC_%Y-%m-%d_%H:%M:%S' közé nem lehet semmit beszúrni, mert azt simán hozzáteszi a fájlnévhez. Ez adja a 2019/2019-03/PIC_2019-03-23_145832 mappaszerkezetet és fájlnevet. Vagyis még előtte a -drectory kapcsolóval kell majd behatóbban foglalkoznom.

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?