DS-Manager (fast) geknackt: Start/Stop-Tabelle

Status
Für weitere Antworten geschlossen.

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Mich hat wie alle hier, das automatische Einschalten beschäftigt und ich hoffe, dass ich jetzt eine 'kleine' Lösung gefunden habe.

Voraussetzungen:

1] eine DS, die auch automatisch einschalten unterstützt
2] man ist bereits per DS-Manager angemeldet

Dann kann man die Poweron und Poweroff-Zeiten usw. wie folgt in einem neuen Browserfenster (dran denken, die Cookies müssen da sein) per URL setzten:

https://IP_der_DS:5001/webman/modules/powermgr.cgi?action=apply&scpoweron=on&scpoweron_date=0,1,2&scpoweron_hour=8&scpoweron_minute=18&scpoweroff=on&scpoweroff_date=0%2C1%2C2%2C3%2C4%2C5%2C6&scpoweroff_hour=17&scpoweroff_minute=7&idletime=10&usb_idletime=0&dualfanspeed=highfan

Vielleicht kann das jemand nachvollziehen und bestätigen.

Offen wäre jetzt noch die automatische Anmeldung, damit man per wget eine Fernsteuerung aus eine Shellskript vornehmen kann. Wenn das auch perfekt wäre, dann könnte man mehrere solcher Aufrufe (natürlich immer mit anderen Zeiten) per crond und/oder shutdown-Skript vorbereiten, um immer das nächste Herunterfahren und das nächste Aufwecken zu steuern.

Ich brauche nicht zu sagen, dass auch andere Einstellungen des DS-Managers auf diese Weise fernsteuerbar wären.

Das ganze hab ich jetzt mit der Beta getestet. Es geht auch bei den früheren Versionen - es kann nur sein, dass man etwas kürze URLs nehmen muss, weil die weniger Felder haben.

Herausbekommen hab ich das im FF per Firebug-Analyse der GET/POST-Strings. Es gab vor langer Zeit mal einen Beitrag hier im Forum, wo genau dieses Thema schon einmal angeschnitten wurde.

Also Stand der Dinge: per 3rdpartyApps geht es, solange diese in einem Browser auf ist.

Itari
 
Zuletzt bearbeitet:

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Cool, noch ein Weg für auto On/Off ;)
Was passiert eigentlich wenn man die URL so aufruft? Werden da cronjobs geschrieben? Ich möchte das ungern auf meinem Mailserver testen

Gruss

tobi
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Es wird genau das gemacht, was auch beim Ausfüllen des Webseite im DS-Manager gemacht wird, also auch cronjobs ...

Itari
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Gelöst:

1] IPKG wget
2] Anmeldung mit (Passwort muss natürlich angepasst werden):

Rich (BBCode):
wget --keep-session-cookies --save-cookies=cookie --cookies=on --no-check-certificate 'https://192.168.2.190:5001//webman/modules/login.cgi?username=admin&passwd=XXXX'

3] Einstellung der Werte (wie vorher) mit:

Rich (BBCode):
wget --no-check-certificate --cookies=on --keep-session-cookies --load-cookies=cookie 'https://192.168.2.190:5001/webman/modules/powermgr.cgi?action=apply&scpoweron=on&scpoweron_date=0&scpoweron_hour=8&scpoweron_minute=19&scpoweroff=on&scpoweroff_date=0&scpoweroff_hour=17&scpoweroff_minute=19&idletime=10&usb_idletime=0&dualfanspeed=highfan'

Falls man in einem Browser als admin im DS-Manager eingeloggt ist, fliegt man da natürlich raus, weil man ja nur 1x als admin angemeldet sein kann.

Eine Kontrolle in der DS-Manager-Seite zeigt, dass die Werte erfolgreich übernommen worden sind.

Da nun die Fernsteuerung mit den beiden wget-Aufrufen perfekt ist, kann man sich nun überlegen, wann man die Shutdown bzw. Aufweckzeiten neu setzt. Ich denke, direkt nach dem Starten des Systems wäre das sinnvollste - dann wäre wohl ein rc.Skript (/usr/syno/etc/rc.d/S99zzz.sh) nicht schlecht.

Die Werte fürs Stoppen und Starten könnten vielleicht in dieser Form notieren:

Rich (BBCode):
poweroff_date,poweroff_hour,poweroff_minute,poweron_date,poweron_hour,poweron_minute
...

Wobei poweroff_date/poweron_date = 0..6 für die Wochentage wäre

Itari
 
Zuletzt bearbeitet:

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Ich hab noch ein wenig weiter gearbeitet und mir die Steuerungsdatei überlegt:

/usr/syno/etc/powermgt.conf:

Rich (BBCode):
0 19 00 1 12 00
1 22 00 2 08 00
3 23 30 4 09 45

enthält jetzt die Stop/Start-Zeiten.

Liest sich so:

1.Zeile: stop sonntags um 19:00 - start montags um 12:00
2.Zeile: stop montags um 22:00 - start dienstags um 8:00
3.Zeile: stop mittwochs um 23.30 - start donnerstags um 9:45

Ein Shell-Skript könnte dies nun auslesen:

Rich (BBCode):
d=$(date +%w%H%M)
while read line
do
set $line
if [ "$d" -lt "$1$2$3" ] ; then
found=$line
break
fi
done </usr/syno/etc/powermgt.conf
[ -z "$found" ] && found=$(head -1 /usr/syno/etc/powermgt.conf)
set $found
wget --no-check_certificate --cookies=on --keep-session-cookies --save-cookies=cookie "https://IP_Adresse_der_DS:5001/webman/modules/login.cgi?username=admin&passwd=XXXX"
wget --no-check-certificate --cookies=on --keep-session-cookies --load-cookies=cookie "https://IP_Adresse_der_DS:5001/webman/modules/powermgr.cgi?action=apply\&idletime=10\&usb_idletime=\&dualfanspeed=highfan\&scpoweron=on\&scpoweroff=on\&scpoweron_date=$3\&scpoweron_hour=$4\&scpoweron_minute=$\&scpoweroff_date=$0\&scpoweroff_hour=$1\&scpoweroff_minute=$2"

Die wget-Aufrufe müssen natürlich den Werten entsprechen, die man für seine DS, seine Firmware-Version und seinen Vorstellungen (z.B. idletime) hat. Deswegen gibt es auch keine universelle Lösung, die man einfach abschreiben kann. Man kann noch ein wenig mit der URL spielen; es kann sein, dass man gar nicht die IP-Adresse braucht, sondern nur den Pfad ... hab ich aber jetzt nicht getestet.

Wenn man dieses Skript dann ausgiebig getestet hat, kann man sich das als S99zzz.sh in der /usr/syno/etc/rc.d speichern. Dann wird es nach jedem Systemstart ausgeführt und setzt die Werte gemäß Tabelle für den nächsten Lauf.

Wie immer geht alles auf eigene Kappe. :D Das Skript ist GPL3.

Itari
 

brakeprofi

Benutzer
Mitglied seit
14. Okt 2008
Beiträge
200
Punkte für Reaktionen
0
Punkte
16
Ich kann den Sinn irgendwie noch nicht richtig verstehen. Kann mir das mal jemand näher erläutern :)
 

thedude

Benutzer
Mitglied seit
30. Nov 2009
Beiträge
2.244
Punkte für Reaktionen
2
Punkte
84
Viele DS können sich selbst hoch und runterfahren. Zu vom User gewünschten Zeiten. Leider kann man nur eine Zeit fürs hochfahren und eben eine fürs runterfahren einstellen. Man kann nicht sagen Montags bis Freitags hochfahren um 8:00 uns Samstag-Sonntag um 10:00. Selbiges gillt fürs runterfahren. Mit Itaris Hack geht das.

gruss
dude
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Hier sein Skript (ungefähr die 15. Zeile von unten):

Rich (BBCode):
#!/bin/ash

log()
{
	d=$(date)
	prog=$(basename $0)
	msg=$@
	echo "$d | $prog | $msg" >> /var/packages/AdvancedPowerManager/target/log
}

load_defaults()
{
	log "load_defaults"
	day=0; while [ $day -le 6 ]; do
		eval DAY${day}_ON=\"none\"
		eval DAY${day}_OFF=\"none\"
		day=$(expr $day + 1)
	done
}

load_config()
{
	log "load_config"
	while read line; do
		var=$(echo $line | cut -f1 -d'=')
		val=$(echo $line | cut -f2- -d'=')
		eval $var=\"$val\"
	done < /var/packages/AdvancedPowerManager/target/config/default
}

compute_now()
{
	now=$(date)
	case $(echo $now | awk '{ print $1 }') in
	'Mon')
		DAY=1
		;;
	'Tue')
		DAY=2
		;;
	'Wed')
		DAY=3
		;;
	'Thu')
		DAY=4
		;;
	'Fri')
		DAY=5
		;;
	'Sat')
		DAY=6
		;;
	'Sun')
		DAY=0
		;;
	*)
		exit 1
		;;
	esac
	time=$(echo $now | awk '{ print $4 }')
	HOUR=$(expr $(echo $time | cut -f1 -d":") + 0)
	MINUTE=$(expr $(echo $time | cut -f2 -d":") + 0)
	# XXX This is not precise enough for corner cases
	log "compute_now: $DAY $HOUR $MINUTE"
}

find_next_action()
{
	action="$1"
	# Check for DAY first
	day=${DAY}
	eval curval="\$DAY${day}_${action}"
	if [ "$curval" != "none" ]; then
		hour=$(expr $(echo $curval | cut -c1-2) + 0)
		min=$(expr $(echo $curval | cut -c3-4) + 0)
		if [ $hour -gt $HOUR -o \( $hour -eq $HOUR -a $min -gt $MINUTE \) ]; then
			log "find_next_action($1): day $day, time $curval"
			return $day
		fi
	fi

	# Check for next days otherwise
	i=1; while [ $i -le 6 ]; do
		day=$(expr \( ${DAY} + $i \) % 7)
		eval curval="\$DAY${day}_${action}"
		if [ "$curval" != "none" ]; then
			log "find_next_action($1): day $day, time $curval"
			return $day
		fi
		i=$(expr $i + 1)
	done

	# We didn't find any next action
	log "find_next_action($1): no action"
	return 99
}

read_bios()
{
	setup_env
	output=$(send_command "action=load")
	cleanup_env

	rcpower=$(echo "$output" | grep "\"RCPowerConfig\"" | sed 's/.* : \(.*\),/\1/')
	case $rcpower in
	'true')
		rcpower="on"
		;;
	'false')
		rcpower="off"
		;;
	*)
		exit 1
		;;
	esac
	fan=$(echo "$output" | grep "\"dualfanspeed\"" | sed 's/.* : "\(.*\)",/\1/')
	idle=$(echo "$output" | grep "\"idletime\"" | sed 's/.* : \(.*\),/\1/')
	usbidle=$(echo "$output" | grep "\"usb_idletime\"" | sed 's/.* : \(.*\)/\1/')

	echo "&RCPowerConfig=$rcpower&dualfanspeed=$fan&idletime=$idle&usb_idletime=$usbidle"
	log "read_bios: $rcpower $fan $idle $usbidle"
}

program_bios()
{
	log "program_bios"
	powermgr_stdin="action=apply"
	powermgr_stdin="${powermgr_stdin}$(read_bios)"

	case "$ACTION" in
	'STARTUP')
		# If DS is starting, we want to program the next shutdown first, then
		# the wakeup following that shutdown (in case a power failure appears)
		find_next_action "OFF"
		day=$?
		if [ $day -eq 99 ]; then
			powermgr_stdin="${powermgr_stdin}&scpoweroff_date=0"
			powermgr_stdin="${powermgr_stdin}&scpoweroff_hour=0"
			powermgr_stdin="${powermgr_stdin}&scpoweroff_minute=0"
		else
			eval curval="\$DAY${day}_OFF"
			DAY=$day
			HOUR=$(expr $(echo $curval | cut -c1-2) + 0)
			MINUTE=$(expr $(echo $curval | cut -c3-4) + 0)
			powermgr_stdin="${powermgr_stdin}&scpoweroff=on&scpoweroff_date=${DAY}"
			powermgr_stdin="${powermgr_stdin}&scpoweroff_hour=${HOUR}"
			powermgr_stdin="${powermgr_stdin}&scpoweroff_minute=${MINUTE}"
		fi

		find_next_action "ON"
		day=$?
		if [ $day -eq 99 ]; then
			powermgr_stdin="${powermgr_stdin}&scpoweron_date=0"
			powermgr_stdin="${powermgr_stdin}&scpoweron_hour=0"
			powermgr_stdin="${powermgr_stdin}&scpoweron_minute=0"
		else
			eval curval="\$DAY${day}_ON"
			DAY=$day
			HOUR=$(expr $(echo $curval | cut -c1-2) + 0)
			MINUTE=$(expr $(echo $curval | cut -c3-4) + 0)
			powermgr_stdin="${powermgr_stdin}&scpoweron=on&scpoweron_date=${DAY}"
			powermgr_stdin="${powermgr_stdin}&scpoweron_hour=${HOUR}"
			powermgr_stdin="${powermgr_stdin}&scpoweron_minute=${MINUTE}"
		fi
		;;
	'SHUTDOWN')
		# If DS is shutting down, we need to program the next wakeup only
		find_next_action "ON"
		day=$?
		if [ $day -eq 99 ]; then
			powermgr_stdin="${powermgr_stdin}&scpoweron=off"
		else
			eval curval="\$DAY${day}_ON"
			DAY=$day
			HOUR=$(expr $(echo $curval | cut -c1-2) + 0)
			MINUTE=$(expr $(echo $curval | cut -c3-4) + 0)
			powermgr_stdin="${powermgr_stdin}&scpoweron=on&scpoweron_date=${DAY}"
			powermgr_stdin="${powermgr_stdin}&scpoweron_hour=${HOUR}"
			powermgr_stdin="${powermgr_stdin}&scpoweron_minute=${MINUTE}"
		fi
		;;
	*)
		exit 1
		;;
	esac

	setup_env
	output=$(send_command "${powermgr_stdin}")
	cleanup_env

	success=$(echo "$output" | grep "\"success\"" | sed 's/.* : \(.*\)/\1/')
	log "program_bios: $success"
	case $success in
	'true')
		;;
	'false')
		exit 1
		;;
	*)
		exit 1
		;;
	esac
}

setup_env()
{
	if [ -z "$HTTP_COOKIE" ]; then
		cu_file="/tmp/current.users"
		adminline=$(grep ":admin:" $cu_file 2>/dev/null)
		if [ $? -ne 0 -o -z "$adminline" ]; then
			export REMOTE_ADDR="0.0.0.0"
			cookie="ADVPOWER"
			export HTTP_COOKIE="id=$cookie"
			up=$(uptime | awk '{ print 3 }')
			upmin=$(expr $(echo $up | cut -f1 -d":") \* 3600 + $(echo $up | cut -f2 -d":") \* 60)
			echo "$REMOTE_ADDR:admin:$cookie:$upmin:$upmin:1" >> $cu_file
			NEED_CLEANUP=y
		else
			export REMOTE_ADDR=$(echo "$adminline" | cut -f1 -d":")
			export HTTP_COOKIE="id=$(echo "$adminline" | cut -f3 -d":")"
		fi
	fi
}

cleanup_env()
{
	if [ -n "$NEED_CLEANUP" ]; then
		grep -v "ADVPOWER" $cu_file > $cu_file.clean
		mv $cu_file.clean $cu_file
	fi
}

send_command()
{
	stdin="$1"
	export CONTENT_LENGTH=$(echo -n "$stdin" | wc -c) 
	echo -n "$stdin" | /usr/syno/synoman/webman/modules/powermgr.cgi
	return $?
}

case "X$1" in
'Xstart' | 'X')
	ACTION="STARTUP"
	;;
'Xstop')
	ACTION="SHUTDOWN"
	;;
*)
	exit 1
	;;
esac

load_defaults
load_config
compute_now
program_bios

exit 0

Itari
 

kloeserk

Benutzer
Mitglied seit
23. Jan 2008
Beiträge
18
Punkte für Reaktionen
0
Punkte
0
Stromschalter Ein/Aus ???

Hallo,
ich habe im Menu Stromschalter nur geplantes Ausschalten, aber kein Einschalten (obwohl die Online Hilfe anderes behauptet)

RS407, DM2.3


Irgendwelche Tipps ?

habe das 3rd party Package geladen (siehe Thread oben), wie installiert man das ?

Danke !

kloeserk:confused:
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Da das zeitgesteuerte Starten von der Hardware unterstützt werden muss, gibt es Modelle (z.B. meine DS207+) bei denen es gar nicht geht.

Itari
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat