Szkriptek: Python, Perl, Bash, ...

Klónozó shell script segítség

Shellből nem vagyok valami jó, sőt inkább semennyire sem vagyok. Általában összeollózom azt ami épp megoldja a problémámat.

Egy olyan script kellene nekem ami egy fájt másol több fájlnak.
Egy Eye-Fi kártyát szeretnék tesztelni, és kellene hozzá egy raklap kép, úgy gondoltam hogy egyszerűbb ha 1 képet ráteszek sokszor és meglátom hogy reagál, stb... Ezek a képek csak fájlnévben lennének mások.

Tehát van most KEP.jpg
Létre kellene jönnie a DSC00001.jpg, DSC00002.jpg, DSC00003.jpg,.... DSC01000.jpg-nek

Szívesen venném ha valaki megoldaná a problémámat és segítene.

amixer beállítás

Tisztelt nagyérdemű!

Még sajnos sok minden hiányos előttem a bash programozását tekintve, és most nem tudom miként lehetne változóba tenni a Line szöveget:
amixer -c0 cset iface=MIXER,name='Input Source',index=0 'Line' >/dev/null 2>&1
Ugyanis a Line lehet itt "Front Mic", vagy "Rear Mic" is
Az input="Line" - ${input} ebben az esetben nem jött be.
Nyilván azért, mert ez az amixer belső dolgaira vonatkozik.

Viszont talán van ennél jobb megoldás is:


case "${input_source}" in
"line") amixer -c0 cset iface=MIXER,name='Input Source',index=0 'Line' >/dev/null 2>&1 ;;
"fmic") amixer -c0 cset iface=MIXER,name='Input Source',index=0 'Front Mic' >/dev/null 2>&1 ;;
"rmic") amixer -c0 cset iface=MIXER,name='Input Source',index=0 'Rear Mic' >/dev/null 2>&1 ;;
esac

Python program müködési zavar

Írtam egy viszonylag egyszerű saját cégünk igényeit kiszolgáló szállítólevél programot Pythonban PySide Qt-vel, MySQL adatbázist használva.
Egy start.sh nevű szkript indítja, melynek tartalma a következő:


#!/bin/bash

cd /opt/Szallitolevel/
/usr/bin/python szallito.py

Ha ezt a felhasználó konzolabalkból indítja így: "/opt/Szallitolevel/start.sh" akkor a program úgy működik ahogy terveztem.
Ellenben, ha egy parancsikont hozok létre a felhasználó asztalán ugyanerre a start.sh-ra, és azzal indítom akkor nem hajlandó a törzsadatokba új tételt felvenni, illetve módosítani. Új mérlegjegyet viszont ilyenkor is helyesen készít.
Mit kellene elkövetni azzal az indítóikonnal? Illetve hol melyik logban keressek ilyenkor esetlegesen hibaüzenetet?
Az operációs rendszer Ubuntu 11.04

[megoldva] Makefile kivalasztott rule valtozoja?

Udv!

Mar orak ota turom a guglit, de lehet hogy rossz kulcsszavakat keresek, esetleg nincs is ilyen...

szoval van olyan valtozo vagy modszer amivel a Makefile aktualis rule-jat le tudom kerdezni?

valami olyasmi kene nekem, hogy

a "make bigyo" parancsra igaz legyen a feltetel:

ifeq ($(RULE),bigyo)
blabla...
endif

bash "pipefail" helyettesítése POSIX-ban

Sziasztok!

Régóta írogatok egyszerű shell scripteket bash-ban, és egy ideje elkezdtem foglalkozni a POSIX kompatibilitással (csak hobbi). Egész mostanáig alig volt problémám ezzel, a legtöbb bash dolog amivel találkoztam, könnyen elhagyható, max. kicsit többet kell gépelni, vagy nem olyan szép tőle ránézésre a program.

Most viszont olyan dologgal találkoztam, ami számomra alapvető funkció, és a POSIX-ban nincs: a pipefail kapcsoló. Nélküle egy egyszerű kis bash script is akár tízszeres méretűvé és totál átláthatatlanná válhat, ha átírom. Nagyon kényelmes és "tömör" dolog ugyanis az egy pipe-pal megoldható dolgokat egy pipe-pal megoldani :) , és aztán megnézni, volt-e hiba valahol, és külön lekezelni a dolgot. Ez pipefail nélkül így nem lehetséges.

Tapasztalt sh programozók, van erre valami egyszerű megoldás POSIX-ban?

[Megoldva]$HOSTNAME hol van hol nincs :(

Ahogy a címben írtam, több kis shell scriptet írtam, ezek screen alatt futnak. Az egyikben egy kis case struktúra argumentuma, és hibátlanul működik, a másikban csak echo -va van és mintha üres lenne. Ez nem rendszer globális? Ha az adott screen session -ben kilépek és kiadok egy ilyen parancsot "/bin/echo $HOSTNAME" szépen kiírja, a scriptből meg üres ... Nem értem?
Már nem tusom hányszor néztem át a scriptet - nem látok hibát (mit lehet ezen elszúrni, azonkívül hogy elírom, és egy nemlétező üres változót használ az echo).

OpenWrt ddns-scripts

OpenWrt 10.03-1 RC5 verzióval szenvedek a ddns-scripts csomaggal és a dyndns-sel.A dyndns.com -on átírtam a hosztomhoz tartozó IP-t egy random másik IP-re, ami -elvileg- tekinthető úgy mintha a saját dinamikus IP-m változott volna meg.

A naplófájlból az látszik hogy valamiért ha "$current_ip" != "$registered_ip", akkor is a

/usr/lib/ddns/dynamic_dns_updater.sh

szkript else ágába kerül a vezérlés, és ezért nem megy a frissítés.

Hogyan teszteltem:

Ezeket a fájlokat rakta fel a ddns-scripts:

# opkg files ddns-scripts 
Package ddns-scripts (1.0.0-14) is installed on root and has the following files:
/etc/hotplug.d/iface/25-ddns
/usr/lib/ddns/url_escape.sed
/usr/lib/ddns/dynamic_dns_updater.sh
/usr/lib/ddns/services
/etc/config/ddns
/usr/lib/ddns/dynamic_dns_functions.sh

Az

/usr/lib/ddns/dynamic_dns_updater.sh

fájlhoz naplózást adtam hozzá:


@@ -264,11 +264,19 @@
 	verbose_echo "current system ip = $current_ip"
 	verbose_echo "registered domain ip = $registered_ip"
 
+	logger -t dynamic_dns_updater.sh "Running IP check..."
+	logger -t dynamic_dns_updater.sh "Current IP: $current_ip"
+	logger -t dynamic_dns_updater.sh "Registered IP: $registered_ip"
+	logger -t dynamic_dns_updater.sh "Comparing Current IP and Registered IP ..."
+	
 
 	if [ "$current_ip" != "$registered_ip" ]  || [ $force_interval_seconds -lt $time_since_update ]
 	then
 		verbose_echo "update necessary, performing update ..."
 
+		logger -t dynamic_dns_updater.sh "They are different."
+		logger -t dynamic_dns_updater.sh "$( echo "$service_id" | tr '[a-z]' '[A-Z]' ): Update necessary, performing update ..."
+
 		#do replacement
 		final_url=$update_url
 		for option_var in $ALL_OPTION_VARIABLES
@@ -293,6 +301,7 @@
 		verbose_echo "Update Output:"
 		verbose_echo "$update_output"
 		verbose_echo ""
+		logger -t dynamic_dns_updater.sh "Update output for ddns-scripts service $( echo "$service_id" | tr '[a-z]' '[A-Z]' ) is: $update_output."
 
 		#save the time of the update
 		current_time=$(monotonic_time)
@@ -310,6 +319,12 @@
 		verbose_echo "update unnecessary"
 		verbose_echo "time since last update = $human_time_since_update hours"
 		verbose_echo "the time is now $human_time"
+
+		logger -t dynamic_dns_updater.sh "They are equal."
+		logger -t dynamic_dns_updater.sh "$( echo "$service_id" | tr '[a-z]' '[A-Z]' ): Update UNnecessary." 
+		logger -t dynamic_dns_updater.sh "Time since last update: $human_time_since_update hours."
+		logger -t dynamic_dns_updater.sh "Time is now: $human_time."
+
 	fi
 
 	#sleep for 10 minutes, then re-check ip && time since last update

A következő a szituáció:

A frissítés működik, ha az

ACTION=ifup INTERFACE=wan /sbin/hotplug-call iface

paranccsal újrainicializálom a WAN interfészt. (Hotplug event.)

Ekkor -gondolom- ez hajtódik végre:

# cat /etc/hotplug.d/iface/25-ddns
#!/bin/sh

. /usr/lib/ddns/dynamic_dns_functions.sh

if [ "$INTERFACE" = "wan" ] && [ "$ACTION" = "ifup" ]
then
	start_daemon_for_all_ddns_sections
fi

Normál üzem esetén úgy csinálták az OpenWrt -sek hogy cron helyett a

/bin/sh /usr/lib/ddns/dynamic_dns_updater.sh dyndns_szappantarto 0

elmegy sleep-be

$check_interval_seconds

időre (

/usr/lib/ddns/dynamic_dns_updater.sh

).

Ilyenkor, bár az

nslookup $domainem

már a webes felületen módosított IP-t adja vissza, a frissítés nem történik meg.

A saját IP-met (Current IP) ezzel tudom meg:

# cat /etc/getwanip.sh 
#!/bin/sh

wget -qO- ifconfig.me/ip

A router így tudja meg a Registered IP-t (

/usr/lib/ddns/dynamic_dns_updater.sh

):

registered_ip=$(echo $(nslookup "$domain" 2>/dev/null) |  grep -o "Name:.*" | grep -o "$ip_regex") 

)

Olyan emberek segítségét szeretném kérni, akinek van OpenWrt-je és tesztelni is tud, ugyanis a vonatkozó szkriptek más fájlokat is source -olnak, így nem láttam értelmét hogy ide beilleszek vagy 10 oldalnyi kódot.

[MEGOLDVA]freedns karbantartó script

Dinamikus DNS szolgáltatót váltottam - freedns.afraid.org - free és nagyon komolynak tűnik. Amint beregisztráltam magamat rögtön működött! :D
Viszont nem találok hozzá használható IP karbantartó programot. (A Debian az inadyn csomagot tartja, de nem működik - pedig tuti mindent úgy adok meg ahogy a manual írja). Kicsit beletúrtam a freedns által ajánlott klienasek listájába és találtam egy roppant egyszerű kis shell scriptet (szerintem ash -al s működik a wget -et használja) viszont ez sem működik (kicsit módosítottam rajta bevezettem az "ACTUAL_FILE" változót - nem látom okát miért is kellene ennek root-ként futnia):


#! /bin/sh
##############################################################################
#
#  application name: dnsactual
#  other files: dnsactual.conf (keeps the last updated ip)
#               dnsactual.log  (register date & time of the actualization)
#  Author: Ernest Danton
#  Date: 01/29/2007
##############################################################################
# ACTUAL_FILE=/etc/freedns/dnsactual.conf
ACTUAL_FILE="actual_ip.conf"
#
if test -f $ACTUAL_FILE
  then
  CacheIP=$(cat $ACTUAL_FILE)
fi
#echo $CacheIP
CurreIP=$(wget http://freedns.afraid.org/dynamic/check.php -o /dev/null -O /dev/stdout | grep Detected | cut -d : -f 2 | cut -d '<' -f 1 | tr -d " ")
#echo $CurreIP
if [ "$CurreIP" = "$CacheIP" ]
then
  # Both IP are equal
  echo "Update not required..."
else
  # The IP has change
  echo "Updating http://free.afraid.org with " $CurreIP
  wget http://freedns.afraid.org/dynamic/update.php?xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -o dev/null -O /dev/stdout
  echo `date`  "Updating log with IP " $CurreIP >> dnsactual.log
fi
# rm -f /etc/freedns/dnsactual.conf
> $ACTUAL_FILE
echo $CurreIP > $ACTUAL_FILE 

Az update "eredménye" ERROR: Invalid URL (2) , persze, mi az ördög az a sok "x" a címben?
Gondolom, a login felületet úgy akarná pótolni, hogy az (az én felhasználó nevemmel és jelszavammal) mindig ugyan oda mutat - hova is? Hogy tudnám ezt megszerezni? Egyszerűen nem találom a honlapon ezt a lapot. Valaki tudja hogy kéne ezt? Használja ezt a scriptet valaki?