Szkriptek: Python, Perl, Bash, ...

Bash szkriptből levél letöltése és feldolgozása

Erre a feladatra kérnék egy kis segítséget! (Ötlet, kulcsszavak, linkek, hasonló probléma megoldására, stb.)

Egy konkrét külső szolgáltatónál lévő mailboxból a leveleket kell letölteni és az esetleges mellékleteket kimenteni egy könyvtárba. Mindezt Linuxon bash shell szkriptből, amit cronból futtatnék.
Hab lenne a tortán, ha a feladó e-mailcime szerint (esetleg a levél tárgya szerint) külön alkönyvtárba mentené a mellékleteket. De ez tényleg csak extra, meg tudok lenni nélküle. Annyi előnye lenne, hogy ha több felhasználó is küldene azonos fájlnévvel mellékletet, akkor azok ne írják egymást felül.
A levél törzs tartalma egyelőre nem érdekes! :)

A mailbox hozzáférési adatai felhasználói név és jelszó természetesen ismert. Viszont a pop3-on megkövetelt az SSL/TLS használata. A levelet a letöltés után a mailboxból el kell(ene) távolítani, tehát ne maradjon meg az örökkévalóságnak a szerveren.

[MEGOLDVA]awk magic

hello

keszul egy lista egy lekerdezesbol es levelet kell kuldenem az erintett embereknek.
a listam ami igy nez ki:


gecos: teszt jakab-joska
mail: teszt.jakab.joska@example.com

gecos: service User
mail: service_user@example.com

gecos: test ember
mail: ember.test@example.com

.....
eddig ezt hoztam ossze gAWK-val:

awk -F: '{ /^$/ getline x; $0 = ($0 x); {print $2;} }'

sajnos ez nem a legjobb mert ilyesmi kimenetet keszit:

test joska-pistamail
sytem User
sys_user@example.com
test embermail
test jakab
jakab.test@example.com
....

megj.: nincsenek ures sorok csak a ----code---- blok nem szereti a nem ures sorokat email cim utan :(.

a levelkuldesre talaltam a system parancsot https://www.gnu.org/software/gawk/manual/gawk.html#I_002fO-Functions
de azt nem tudom hogy miert jelenik meg mail nehany nev vegen es hogy hogyan is kene a system parancsot hasznalnom. probaltam valtozokba menteni az neveket es email cimeket de ahogy lattam az END szekcióban csak az utolso ertek jelenik meg, eseteben az utolso nev es mail cim.

tud valaki segiteni?

pip install pygps

Sziasztok.

Adott:
Arch szerver, AP-ként működtetve, virtualhost, csillog-villog minden, Raspberry zero (2), no meg a tárgyban megadott 3 szó terminálban kiadva.

ssh-n felcsatlakoztam, gondoltam ahhoz, hogy pythonban is írhassak mindenfélét, felfestem az Arch-ra is a pygps-t, ha már debianokon elvagyok vele.
Hát, nem megy, de miért? Csúnyán beszélek tán?

Ezt írja:


# pip install pynmea2 
Collecting pynmea2
  Downloading pynmea2-1.7.1.tar.gz
Installing collected packages: pynmea2
  Running setup.py install for pynmea2
Successfully installed pynmea2-1.7.1
[Na... root@nmea-bridge pacman.d]# pip install pygps  
Collecting pygps
  Downloading pyGPs-1.3.3.tar.gz (10.3MB)
    100% |################################| 10.3MB 2.6kB/s 
Collecting numpy (from pygps)
  Downloading numpy-1.11.3.zip (4.7MB)
    100% |################################| 4.7MB 5.4kB/s 
Collecting scipy>=0.13 (from pygps)
  Downloading scipy-0.18.1.tar.gz (13.1MB)
    100% |################################| 13.1MB 2.1kB/s 

    Complete output from command python setup.py egg_info:
    /bin/sh: svnversion: command not found
    /bin/sh: svnversion: command not found
    non-existing path in 'numpy/distutils': 'site.cfg'
    Could not locate executable gfortran
    Could not locate executable f95
    Could not locate executable ifort
    Could not locate executable ifc
    Could not locate executable lf95
    Could not locate executable pgfortran
    Could not locate executable f90
    Could not locate executable f77
    Could not locate executable fort
    Could not locate executable efort
    Could not locate executable efc
    Could not locate executable g77
    Could not locate executable g95
    Could not locate executable pathf95
    don't know how to compile Fortran code on platform 'posix'
    _configtest.c:1:5: warning: conflicting types for built-in function 'exp'
     int exp (void);
         ^
    _configtest.o: In function `main':
    /tmp/easy_install-9oplsa9s/numpy-1.12.0rc2/_configtest.c:6: undefined reference to `exp'
    collect2: error: ld returned 1 exit status
    _configtest.c:1:5: warning: conflicting types for built-in function 'exp'
     int exp (void);
         ^
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code -9 in /tmp/pip-build-p0ffv8nz/scipy

Perl alapú keretrendszer

Üdv,

Tud valaki Perl alapú, használható fejlesztői keretrendszert az alábbi kritériumokkal?
- kicsi, egyszerű
- gyors fejlesztést tesz lehetővé (értsd: ne napokig kelljen nyomzni egy "hello word"-höz)
- a szerverkörnyeztre nem érzékeny (értsd: nem kell 1000 extra csomagot telepíteni, hogy egyáltalán elinduljon)
- 90%-ban Shell appok készítéséhez
- HTML alapú oldalakhoz ha felhasználható az se baj
- adatbáziskezelés támogatás
- esetleg MVC szemlélettel

ui: ha PHP alapon keresnék akkor a CakePHP vagy a Symfony állna a legközelebb

Raspberry Pi kamera kezelés pythonból

Üdv!

Van RPi kamerához ez a python modul:
http://picamera.readthedocs.io

Remekül működik is, csak én nem ép szokványos módon használom és ez némi gondot okoz.
Az egész egy Tornado websocket szerver része. Ha kap egy kérést a szerver, pl. hogy készítsen egy képet, akkor készít egy képet és visszaküldi a kliensnek.
Eddig remekül működik is a dolog.

Hogy megkönnyítsem a fejlesztést, használom a tornado autoreload megoldását arra, hogy kódváltoztatás esetén ne kelljen leállítanom és újraindítanom a szervert, azaz ezzel Ő maga újraindítja magát ha változik valamelyik .py fájl tartalma.
Ez is remekül működik, csak akkor nem ha a kamera kódjáról van szó!

Ha egyszer már használta a program a kamerát és változtatok raja, és újra használni akarom a kamerát, akkor kilép a program és ezt az üzenetet kapom:

* failed to open vchiq instance

Nagyon rossz, mert így mégiscsak manuálisan kell újraindítanom minden változtatás után a progit.

Azt felfedeztem már, hogy az első kamera használat után a /dev/vchiq tartalma kibővül, ilyenekkel:

Service 2: OPEN (ref 1) 'GCMD' remote 0 (msg use 0/3840, slot use 0/15)
Service 3: OPEN (ref 1) 'DISP' remote 10 (msg use 0/3840, slot use 0/15)
Service 4: OPEN (ref 1) 'UPDH' remote 18 (msg use 0/3840, slot use 0/15)
Service 5: OPEN (ref 1) 'TVSV' remote 34 (msg use 0/3840, slot use 0/15)
Service 6: OPEN (ref 1) 'TVNT' remote 42 (msg use 0/3840, slot use 0/15)
Service 7: OPEN (ref 1) 'CECS' remote 50 (msg use 0/3840, slot use 0/15)
Service 8: OPEN (ref 1) 'CECN' remote 58 (msg use 0/3840, slot use 0/15)

Ha a tornado autoreloadjával újrafordul a python kód, akkor is megmaradnak ezek a bejegyzések.
Viszont ha kilövőm akkor eltűnnek és a kövi kamera használatig nem is jönnek létre.

Gondolom ezért kapom a fenti hibaüzenetet, mert használatban van az eszköz.

Próbáltam a /dev/vchiq törölni, majd újra létrehozni, amikor újrafordul a python kód, de ez sem segített, mert egyből visszaáll a tartalma is.

Tehát arra kellene nekem valami megoldás, hogy a kamerát tudjam úgymond resetelni.
Van valami tippetek erre?

fájlméret változásának figyelése BASH-ban [megoldva]

Sziasztok.

Tárgy szóban ezt találtam ki egy logfile méretváltozásának ultraprimitív figyelésére:

#!/bin/bash

aa (){
a=`ls -l /opt/gps.minicom | awk 'BEGIN {FS=" "}{print $5}'`
echo $a
}

bb (){
b=`ls -l /opt/gps.minicom | awk 'BEGIN {FS=" "}{print $5}'`
echo $b
}

while [ "$a"-"$b" != "0" ]; do
aa
sleep 4
bb
echo "$a"-"$b" novekedik
done

exit 0

szerintetek szebben megoldható ez?
Mert ez nekem működik ugyan, de nem tetszik. Ronda.

könyvtárstruktúrából rekurzív fájlmozgatás {megoldva}

Sziasztok.

Mai rohanó világunkban az ember siet.
Ennek szellemében kísérletet tettem arra, hogy mezei mc-ben egy fényképezőgépből kivett sd kártyáról átmozgassam csak a filmeket egy célkönyvtárba. Nos, ez nem egyszerű mc-vel, mégha szűrőkkel listázom a paneleket, akkor sem megy nekem. Nem tudom miért, de nem érdekelt már.

Elkezdtem scriptet írni unalmamban.

ls -R | grep -v JPG | sed 's/:/\//'
Ez listázza a könyvtár MOV-jait, melyből kis kézi szerkesztéssel kész a listácska. Ezután szabadítanám rá az awk-t, ami megírja a scriptet stb.

Kérdés:
hogyan kell az ls-t rábeszélni fájlok listázására, hogy kitegye a fájlnév elé a teljes elérési utat?

[Megoldva] Bash rekurzió

Ugyan megoldottam a gondomat, de érdekel az, hogy miért nem működött egy korábbi script változatom. A picike scriptem annyit csinál, hogy ssh-n keresztül felmásol a router-em RAM-jába file-okat. Az rsync nem jó, mert nincs elég hely ahhoz, hogy a router-re feltegyem az rsync-et. A lényeg, hogy szimbolikus linket is kell másolni. A program rekurzívan bejárja az alkönyvtárakat. Ez a változat működik:
#!/bin/bash

BASE='/tmp'

copy() {
    unset list
    i=0
    while read -r; do
        list[i++]="$REPLY"
    done < <(ls -1)
    lenlist=$i
    i=0
    while [ $i -lt $lenlist ]; do
        file="${list[i++]}"
        len=${#file}
        if cd "$file" &>/dev/null; then
            ssh locsemege@router "
                cd \"$BASE/$dir\"
                mkdir \"$file\"
            "
            dir+="/$file"
            (copy)
            dir="${dir%/*}"
            cd ..
            continue
        fi
        if [ -h "$file" ]; then
            ssh locsemege@router "
                cd \"$BASE/$dir\"
                ln -s \"`readlink $file`\" \"$file\"
                "
            continue
        fi
        if [ "${file:len-1}" != '~' ]; then
            scp -C "$file" locsemege@router:"$BASE/$dir/$file"
        fi
    done
}

ssh locsemege@router 'rm -Rf /tmp/www; mkdir /tmp/www'
dir='www'
cd /home/locsemege/router/www
copy

A gondom az, hogy amennyiben nem másoltam az aktuális file listát egy tömbbe, hanem akár pipe-oltam

ls -1 | while read -r; do
...
done

akár process helyettesítést használtam

while read -r; do
...
done < <(ls -1)

akár a file listát irányítottam a ciklusba


list="`ls -1`"
while read -r; do
...
done <<<"$list"

az történt, hogy amikor a legmélyebb ciklusból visszatért a copy függvény, az őt hívó ciklusból is azonnal kilépett. Debugoltam, az utóbbi esetben a file lista nem sérült, a visszatérés után megvolt. Pedig a rekurzív hívást gömbölyded zárójelbe írva subshellben teszem: (copy). A változók ennek megfelelően nem is íródnak felül, a jelenlegi programverzió működik.

Az a gyanúm, az átírányításkor lehet valami olyasmi, hogy a rekurzión belül a file descriptorok esetében nincs mentés, vagy nem tudom, lényeg, hogy ha a belső read visszatér EOF-fal, a külső, hívó ciklus is azonnal visszatér, tehát hiába vannak még a listának feldolgozatlan elemei a read EOF-fal tér vissza. Pedig nem szeretném. Azt nem mondom, hogy nem kéne, mert nyilván én nem tudok valamit.

Az utolsó feltételben azért vizsgálom a filenév utolsó karaktereként a tilde jelet, mert az editor által létrehozott backup file-okat nem szeretném a router-re másolni.

Miért nem működtek a triviális programváltozataim, miért kellett egy tömbből feldolgoznom a listaelemeket rekurzív hívás esetén, miért nem működött az átirányítás?

Megoldás.

Végtelen ciklusú Perl script IO

Egy végtelen ciklusban futtatott perl-scipttel szeretnék külső eszköz állapotáról logot csinálni.
A gondom csak annyi, hogy eddigi tapasztalataim szerint a véges idő alatt lefutó scritpeknél is a változások futási idő alatt nem íródnak ki a fizikai tárra (a std outputon is csak a script lefutása után jelenik meg az összes kiírt adat), egy végtelen ciklusban futó script esetén ez alapvető probléma.
Jelenleg, ha végtelen ciklusban futtatom a programot, semmi nem jelenik meg a képernyőn, sem a fájlban, amibe az adatokat kiírnám, ha ctrl+c-vel megállítom, akkor az adatok elvesznek, az uzenetek sem érkeznek meg a std outputra.
Ez így kell, hogy legyen, vagy valamely módon kikényszeríthetem a fizikai adatmozgatást menet közben?
Kösz: Bálint

keresek : shell-ből email (.eml fájl) letöltés és "feltöltés" (küldés) távoli levelező szerverről-szerverre

(ha nem jó helyre raktam a témát kérlek javasoljatok, és igen, kerestem google-ön, de valószínűleg rossz kulcsszavakkal)

A megoldandó feladat:

- shell script-ből futtatható (opcionálisan se érdekel GUI, cron-os futtatás a cél)

- pop3 (vagy imap) és smtp távoli szerverekkel kapcsolódik

- új leveleket .eml fájlba letölti

- egy mappába rakott .eml fájlokat feltölti smtp-re (és kezeli a küldés sikerességét, sikeresség után shell script-et futtat, vagy másik mappába pakolja a fájlokat)

- 1 gmail-es címmel lesz használva, nem cél összetettebb profilkezelés

- jelszavakat biztonságosan kezeli (nem paraméterként kéri be futtatáskor)

(nem kell: olvasottsági visszajelzés, és egyéb eseménykezelés)

(opcionálisan: naplózik, vagy események után shell script-eket hív meg, pl. új email letöltésekor)

- - - - -

Szerk.:

- ha a letöltést és a feltöltést külön program végzi nem gond

- a feltöltés fontosabb, a letöltésre már most részben automatizálható a thunderbird