Synology-Forum.nl

Tweaks / Addons A.K.A. The Underground => Algemeen => Topic gestart door: Pippin op 26 november 2015, 11:07:48

Titel: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 26 november 2015, 11:07:48
Mijn UPS hangt via USB aan de NAS en functioneert goed.
De UPS server functie is actief en functioneert met behulp van WinNUT client (https://code.google.com/p/winnut/downloads/list) op de PC ook prima.

Ik heb ook een satelliet-ontvanger waarvoor geen NUT als plugin beschikbaar is.
Van de week had ik een request daarvoor gedaan maar om onbekende reden gaat dat niets worden.

Dus ik zoek naar een manier om dat middels een script op de DS te doen.
DS gaat afsluiten omdat de stroom wegvalt, voert script uit dat via ssh de ontvanger afsluit.
Op zichzelf simpel :-)
Ik weet het is niet de mooiste oplossing maar beter dan niets.

Als ik het goed begrijp worden scripts die in  /usr/local/etc/rc.d/scriptnaam.sh liggen tijdens shutdown uitgevoerd.
Het shutdown command voor de ontvanger is shutdown -h now

Het script:
#!/bin/sh

ssh root@192.168.11.14 shutdown -h now

Dit werkt niet omdat:
key_verify failed for server_host_key

Dus hoe krijg ik die key in het script of moet die ergens op de DS gekopieerd worden en het script aangepast worden zodat die key gelezen wordt?

B.v.d.

Titel: Re: Shutdownscript via LAN
Bericht door: Pippin op 26 november 2015, 13:53:49

Geen idee wat ik aan het doen ben, probeer wat van voorbeelden in elkaar te prutsen :-)

Even los van dat ssh key gedoe, probeer ik uit te vogelen hoe een script uit te voeren tijdens shutdown van de NAS.
Het volgende heb ik:
#!/bin/sh

cd "/o"

case "$1" in

    stop)
        /o/gigablueups.sh
        ;;
    *)
        echo "Usage: $0 {stop}"
        exit 1
        ;;
esac
opgeslagen als gbshutdown.sh in /usr/local/etc/rc.d

gigablueups.sh bevat:
#!/bin/sh

ssh root@192.168.11.14 shutdown -h now

Lijkt het ergens op of lijkt het nergens op?
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 26 november 2015, 19:29:01
Het key probleem is opgelost, was een kwestie van de key van de DS, kopiëren naar de ontvanger.
Inloggen via een script is dus geen probleem meer.

Nu het script nog dat via ssh inlogt met "root@192.168.11.14" naar de ontvanger en het commando "shutdown -h now" geeft voordat de DS afgesloten wordt door stroomuitval.

Het dreigt wederom een eenzaam topic te worden :-)
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Birdy op 26 november 2015, 20:55:12
Tja, ik heb niet zo'n UPS ding en satelliet-ontvanger anders zat ik allang te testen. ;D
Nu ff niet eenzaam dus. ;)
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 26 november 2015, 21:23:15

Ja, scripts is niets voor mij.
Moet even pauze doen anders heb ik dadelijk geen haren meer op m`n hoofd :-)
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 26 november 2015, 21:27:03
Heb je geen UPS @Birdy??? Jawel toch?
Ontvanger en UPS is niet nodig om het script te schrijven maar effe pauze nu :)
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Birdy op 26 november 2015, 21:44:36
Citaat
Jawel toch?
Nope ;D
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Handige Harry op 27 november 2015, 09:31:38
@Birdy heeft een noodaggregaat
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Briolet op 27 november 2015, 10:04:07
Dus hoe krijg ik die key in het script

Geen idee, maar normaal wordt die key bij de eerste inlog op je host gezet nadat je handmatig een bevestiging gedaan hebt. Op de mac wordt die key dan opgeslagen in ~/.ssh/known_hosts

Bij elke volgende inlog hoef je niets meer met de key te doen. Anderzijds verwacht ik dat je die inlog ook al vaker met de hand getest hebt en de key al geïmporteerd is.
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 27 november 2015, 11:26:56
@Briolet
Het key probleem is al opgelost, zie eerdere post hier boven.
Het script op de DS heeft nu via ssh toegang tot de ontvanger, dus de key van de DS heb ik gekopieerd naar de ontvanger.

Het is mij nu daadwerkelijk zelf gelukt met het volgende in /usr/local/etc/rc.d/S90upsshutdowngb.sh
Dat overleeft updates.
#!/bin/sh

ssh root@192.168.11.14 "/sbin/shutdown -h now"

Dus als de DS afsluit, sluit nu ook de ontvanger af.
Nadeel is dat elke keer dat de DS afsluit ook de ontvanger afsluit, dus niet alleen bij stroomuitval.
Maar hij draait sinds er SSD`s inzitten 24/7, dus valt dan wel weer mee.

Bij de buren kreeg ik het voorstel om het in /usr/syno/bin/synoups in te voegen.
Dan zal de ontvanger alleen afsluiten bij stroomuitval als ik het goed begrijp.
Nadeel is dat het geen updates overleeft.
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Briolet op 27 november 2015, 14:28:49
Kun je niet een check in je script opnemen om te kijken of de UPS actief is of het moment van shutdown?

Met het commando: "upsc ups" zie je alle parameters van de ups. Als een van de laatste regels zie ik nu: "ups.timer.shutdown: -1". Ik kan me voorstellen dat daar op het moment van shutdown de waarde 0 staat.
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 27 november 2015, 17:05:00

Ja, dat weet ik. Je kunt ook parameters wijzigen en die blijven dan behouden voor zover er geen parameters tussen zitten die ook via DSM in te stellen zijn.
Maar goed, dat idee heb ik ook gehad maar hoe zet je dat om in een script?
Dat moet elke 5 sec? draaien om "bij te blijven", is dat dan wel wenselijk?
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Basalt op 01 december 2015, 20:05:03
Dat moet elke 5 sec? draaien om "bij te blijven", is dat dan wel wenselijk?
Je hoeft toch alleen tijdens de shutdown te kijken waarom dat is?
Als de ups.status niet OL (Oooh,eLLL=OnLine) is, dan is de shutdown waarschijnlijk ivm lage batterijspanning.
Zie onderstaande snippet hoe je dat zou kunnen gebruiken.
if [ `/usr/syno/bin/upsc ups ups.status` != "OL" ]; then echo "Niet op netspanning"; fi
Succes,
Erik
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 01 december 2015, 23:19:26
Goeie tip!

OL=Online
OL CHRG=Online Charging
OB=On Battery
LB=Low Battery

Zit dit dan goed in elkaar?
#!/bin/sh

if [ `/usr/syno/bin/upsc ups ups.status` != "OB" ]; then ssh root@192.168.11.14 "/sbin/shutdown -h now"; fi
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 01 december 2015, 23:31:39

Ahaa, dan zou dus als de UPS en de NAS weer hoog komen, dit ook moeten werken.
#!/bin/sh

if [ `/usr/syno/bin/upsc ups ups.status` != "OL CHRG" ]; then "ether-wake -i bond0 MAC-adres"; fi

Edit:
Bij nader inzien is dat niet handig want als men niet thuis is staat de boel aan incl. TV nadat de stroom terug is.
De TV gaat dan aan door de sat-ontvanger via HDMI-CEC.
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Basalt op 02 december 2015, 12:32:50
Zit dit dan goed in elkaar?
#!/bin/sh
if [ `/usr/syno/bin/upsc ups ups.status` != "OB" ]; then ssh root@192.168.11.14 "/sbin/shutdown -h now"; fi

 :?: :!: Je wilt toch juist dat die shutdown van het andere systeem wordt uitgevoerd als de UPS niet meer online is (en dus op wel batterij draait?)
Vandaar mijn voorstel voor != "OL" ...
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 02 december 2015, 12:57:02

Denk dat het kwartje aan het vallen is :)

!= "OL"  betekent dan dus "niet OL" ?
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 02 december 2015, 13:39:48

Never mind :)

Heb inmiddels kunnen testen en != "OL" betekent niet OL.
Het werkt nu zoals bedoelt, helemaal goed, dank U.
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Briolet op 02 december 2015, 14:53:22
"!= OL" is niet helemaal correct, want dan kan hij ook bij de status "= OL CHRG" een shutdown doen terwijl hij dan ook on-line is.


Ik ken de syntax van dit script taaltje niet. Is het volgende goed?

if [[ `/usr/syno/bin/upsc ups ups.status` != "OL"]  && [`/usr/syno/bin/upsc ups ups.status` != "OL CHRG"]]; then ssh root@192.168.11.14 "/sbin/shutdown -h now"; fi
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 02 december 2015, 14:59:23

Das een goeie ja.

Wat is syntax?  ;D
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Birdy op 02 december 2015, 15:08:56
In computer science, the syntax of a computer language is the set of rules that defines the combinations of symbols that are considered to be a correctly structured document or fragment in that language. (https://en.wikipedia.org/wiki/Syntax_(programming_languages))  ;)
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 02 december 2015, 15:13:08

 :lol: :lol:
Het was om aan te geven hoeveel ik van scripts weet.
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Birdy op 02 december 2015, 15:22:26
Zo leer je nog wat.
Overigens jij probeert het tenminste.....gaat (komt) goed ;D
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Basalt op 02 december 2015, 15:27:18
Dit script taaltje is gewoon de command shell , je kunt het in een ssh sessie zo uitvoeren ;)

Met onderstaande code pak je alles wat met OL begint. Let op dat achter -eq een nul staat (geen Oooh).
if [ `/usr/syno/bin/upsc ups ups.status|/bin/grep -c "^OL"` -eq 0 ]; then echo "Niet op netspanning"; fi
Overigens is het de vraag of je bij "online charging" wel/niet het andere systeem wilt afsluiten: ik zou kiezen om het wel te doen (dus alleen op OL testen zoals mijn eerste voorstel) omdat het charging aangeeft dat er pas geleden ook al een netspanning onderbreking was, better save than sorry.

EDIT: path toegevoegd aan grep
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 02 december 2015, 18:53:14

Nu dacht ik dat het werkte omdat ik het teste door gewoon de DS af te sluiten.
Dat werkt dan ook wel echter de DS gaat bij stroomuitval in standby en dus alles wordt unmount :-( AAAAAH
Stekker van de UPS eruit en de NAS doet in principe niets meer door de standby.
Effe weer  :lol: ;D

Bij de buren kreeg ik het voorstel om het in /usr/syno/bin/synoups in te voegen.
Dan zal de ontvanger alleen afsluiten bij stroomuitval als ik het goed begrijp.
Nadeel is dat het geen updates overleeft.
Ga hier maar eens in snuffelen...
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Basalt op 02 december 2015, 19:24:04
Je kunt ervoor kiezen om na enige tijd op accu een shutdown uit voeren. Dan werkt het script wel, neem ik aan *)
Voordeel van shutdown is dat je zelf kunt beoordelen wanneer je het beste/veiligste de NAS weer kunt opstarten.
Nadeel is dat je dan wel aanwezig moet zijn.

*) EDIT: nu ik nogmaals kijk zie ik dat de UPS een shutdown krijgt. Mogelijk dat de NAS dan vanuit Safe Mode gewoon zonder shutdown wordt uitgeschakeld.
Uitproberen ?
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 02 december 2015, 19:43:04

Dan gaat abrupt de spanning eraf en werkt dan niet.
Ik ga maar eens op zoek in /usr/syno/bin/synoups of ik het moment kan vinden wanneer dat script het command geeft in safemode te gaan. Als ik dan daarvoor jou script invoeg gaat het misschien...
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Basalt op 02 december 2015, 19:55:24
Dan gaat abrupt de spanning eraf en werkt dan niet.
:'( Daar was ik al bang voor

Ik ga maar eens op zoek in /usr/syno/bin/synoups of ik het moment kan vinden wanneer dat script het command geeft in safemode te gaan. Als ik dan daarvoor jou script invoeg gaat het misschien...
Als je Syno in Safe Mode gaat dan hoef je toch niet meer naar de UPS status te kijken, en kan je zondermeer het andere systeem "shutdownen" ?
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 02 december 2015, 20:08:25

Ja, dat bedoel ik ook eigenlijk :)
Dus zonder de status af te vragen.
Effe koffie pakken en dan maar eens kijken of ik daar wijs uit word.
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 02 december 2015, 20:15:01
Citaat
UPSSafeMode() {
   if [ -f $SZF_SAFEMODE ]; then
      return
   fi
     ssh root@192.168.11.14 "/sbin/shutdown -h now"
   $SYNOBOOTBIN --is-shutdown
   if [ $? -eq 0 ]; then
      SYSLOG "[UPS] System is shutting down. Ignore onbattery event."
      return
   fi

   SYSLOG "[UPS] Check Boot Status."
   $SYNOBOOTBIN --is-ready
   while [ $? -ne 0 ]
   do
      sleep 2
      $SYNOBOOTBIN --is-ready
   done

   St=`UPSStatusGet`
   if [ "$St" = "OL" ]; then
      echo "WARNING: UPS is On-Line"
      return
   fi
   echo "$1" > $SZF_SAFEMODE

   /usr/syno/bin/synologset1 sys warn 0x11300011
   SYSLOG "[UPS] Server is going to Safe Mode. It will stop all services and umount all volumes."

   if [ "yes" = "$RUN_HA" ]; then
      $SZF_HA_RC ups-safemode
   fi

   $SYNOBOOTBIN --set-safe-shutdown
   reboot
   sync; sync; sync;

   echo "Stop all services and umount all volumes" >> $SZF_SAFEMODE
   UPSShutdown
}
Spanning valt weg, ontvanger gaat uit (deep sleep), NAS gaat in standby, UPS blijft spanning verzorgen.
Spanning komt terug, NAS doet volledige restart, ontvanger blijft in deep sleep en TV gaat dan niet aan.
Tot zover dus gelukt.

Maar nu... Niemand thuis, stroomstoring duurt lang en de accu raakt helemaal leeg, UPS sluit zich af.
Apparaten dus spanningsloos.
Spanning komt terug, UPS gaat aan, NAS start op, ontvanger start op en de TV gaat aan door HDMI-CEC, leuk als je op vakantie bent.
De ontvanger onthoud niet de laatste status, dat heb ik getest.

Dus nu nog de juiste plaats in synoups zoeken waar ik
sleep 120 #Om de ontvanger tijd te geven eerst op te starten
ssh root@192.168.11.14 "/sbin/shutdown -h now"
kan invoegen.
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Basalt op 02 december 2015, 22:51:39
Lijkt mij aan het einde van UPSRestart().
Roep daar een script aan met & erachter, daarmee wordt die in de achtergrond gezet en kan de aanroeper van UPSRestart() verder gaan.
Door de wachttijd mee te geven kan je hetzelfde script ook bij shutdown gebruiken (dan 0 ipv 120), de & is dan niet echt nodig.
Citaat
UPSRestart() {
        if [ ! -f $SZF_SAFEMODE ]; then
                return
        fi
        echo "UPS back on-line, so wait to reboot" >> $SZF_SAFEMODE
        sleep 30
        St=`UPSStatusGet`
        timeout=$((3*60))

        if [ "$St" = "OL" ]; then
                SYSLOG "[UPS] Check Safe Mode Done."
                while [ ! -f $SZF_SAFEMODE_DONE ] && [ $timeout -gt 0 ]
                do
                        sleep 2
                        timeout=`expr $timeout - 2`
                done

                if [ "yes" = "$RUN_HA" ]; then
                        $SZF_HA_RC ups-restart &
                fi
                synologset1 sys warn 0x11300012
                SYSLOG "UPS back to On-Line and reboot."
                $SYNOBOOTBIN --unset-safe-shutdown
                telinit 6
               /pathnaarscriptfile/scriptfile 120&
        fi
}

De scriptfile ziet er dan zó uit (voor de zekerheid path toegevoegd, je kent de environment immers niet)
Citaat
#!/bin/sh
/bin/sleep $1 #Wacht zonodig om de ontvanger tijd te geven eerst op te starten
/usr/bin/ssh root@192.168.11.14 "/sbin/shutdown -h now"
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Basalt op 02 december 2015, 22:58:30
[...]ontvanger start op en de TV gaat aan door HDMI-CEC, leuk als je op vakantie bent.
Maar laat je tijdens de vakantie de TV op standby staan?
Bij mij gaat die elke avond echt uit.
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Basalt op 02 december 2015, 23:07:16
Lijkt mij aan het einde van UPSRestart().
[...]
Citaat
UPSRestart() {
[...]
        if [ "$St" = "OL" ]; then
[...]
               /pathnaarscriptfile/scriptfile 120&
        fi
}
Ik zie nu dat er kennelijk geen rekening wordt gehouden met "OL CHRG".
Misschien toch beter om de script onder de "fi" aan te roepen ?
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 02 december 2015, 23:31:52
:) Top dat je helpt.
Die plaats had ik precies ook in gedachten maar toen dacht ik, hoe weet het script nou, nadat de DS spanningsloos is geweest, dat het die opdracht moet uitvoeren? Ja, ik krijg mijn hoofd er nog niet goed omheen  :D

Ik heb dus je eerdere script, dat naar OL en OL CHRG kijkt, genomen en laat dat nu tijdens opstarten uitvoeren.
Dus in combinatie met synoups.
Dat ben ik nu aan het testen maar duurt even want de UPS houd het lang vol moet ik zeggen...
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 03 december 2015, 10:22:29

Het UPS gebeuren werkt nu maar...... lees even verder.
Synoups aangepast zoals onder UPSSafeMode() { in Reactie #29
Dan in /usr/local/etc/rc.d/S90upsstartgb.sh
#!/bin/sh
sleep 60
if [ `/usr/syno/bin/upsc ups ups.status|/bin/grep -c "^OL"` -eq 0 ]; then echo ssh root@192.168.11.14 "/sbin/shutdown -h now"; fi

Het starten van de TV door HDMI-CEC is ook opgelost.
In het menu van de ontvanger kun je aangeven wat ie moet doen na opstarten en ook na stroomuitval.
Daar heb ik voor beide aangeven dat ie in standby moet en dat werkt.
Wist wel dat dat er was maar schoot me laat in gedachten :)

Er dient zich nu een ander probleem aan. Mijn modem hangt ook aan de UPS.
Nadat de boel spanningsloos is geweest, vanwege een lege accu, is als eerste de ontvanger gestart nadat de spanning weer terug is.
De modem en NAS volgen dan echter de ontvanger heeft geen connectiviteit ook niet als ik per menu de adapter opnieuw start.
Dit lijkt mij een bug in de ontvanger, de rest van de apparaten hebben er geen moeite mee dat het modem laat online is.
De enigste manier is de ontvanger uit te schakelen (deep sleep) vervolgens schakelaar op de achterzijde uit en weer aan.
Ontvanger start op en heeft weer connectiviteit.

Ben er dus nog niet helemaal :(
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Stephan296 op 03 december 2015, 10:39:25
Die adapter moet je toch ook met een commando kunnen herstarten.
Dus op dezelfde wijze als je afsluit commando.
Ik denk maar even hardop mee ;-)
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 03 december 2015, 11:25:19

Ja, daar heb ik ook aan gedacht maar nog niet geprobeerd want ik denk dat per menu de adapter herstarten hetzelfde doet?
En de enigste manier is de ontvanger van de spanning af te halen om weer connectiviteit te krijgen.
Ik denk dat er een probleem in de drivers zit en heb nu de vraag op een ander forum gesteld.
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Basalt op 03 december 2015, 20:56:24
Misschien een DHCP probleem?
Wat als je de ontvanger een vast P adres geeft?
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 03 december 2015, 21:06:05

Alle apparaten thuis hebben een vast IP buiten het DHCP bereik, de gasten via een oude router DHCP.
Mijn vermoeden is dat de ontvanger er niet mee kan omgaan dat het modem online is.
Dat is dus een issue van de ontvanger.

Maar als het goed is wordt er vanavond geprobeerd het te repliceren door één van de image-bouwers van de ontvanger, even afwachten wat daar uitkomt. Als het een driver probleem is zie ik het voorlopig somber in.
Titel: Re: Voor het afsluiten een script uitvoeren
Bericht door: Pippin op 04 december 2015, 12:09:59

De imagebouwer laat nog op zich wachten maar ik heb inmiddels een oplossing gevonden.
In het menu van de ontvanger kun je aangeven wat ie doet na stroomuitval en/of opstarten.
Door die allebei op "Standy" te zetten krijgt ie wel verbinding met het modem.
Dat maakt het opstartscript overbodig en is dus alleen de aanpassing in synoups nodig.
Ben er nu wel tevreden mee.

Allen bedankt voor het meedenken.