🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Rechner herunterfahren per Makro

Alles zur Programmierung im LibreOffice.
Sephan
Beiträge: 153
Registriert: Mi 26. Jan 2011, 13:16

Re: Rechner herunterfahren per Makro

Beitrag von Sephan » So 7. Jul 2013, 14:30

Hm, also bei mir reicht es nicht die lck Dateien zu löschen.
Anscheinend ist eine andere Datei relevanter:
/.config/libreoffice/4/user/registrymodifications.xcu

Diese kann man aber nicht einfach löschen, da sie auch noch andere Konfigurationen enthält. Zum Beispiel die Einstellungen für die Makrosicherheit.

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Rechner herunterfahren per Makro

Beitrag von gogo » So 7. Jul 2013, 15:29

ich schrieb:
... das anlegen von lck-Dateien verhindern ...
denn wenn der User gar keine Schreibrechte auf der Datei hat, dann wird in LO die Datei immer schreibgeschützt geöffnet. Und in Verzeichnissen in denen ein User kein Schreibrecht hat kann auch keine Datei angelegt werden. Das Problem mit der registrymodifications.xcu ist mir bekannt - man müsste den Eintrag vor dem nächsten Start von LO entfernen - aber das ist dann doch ein bisserl zu viel Herumgepfusche.
Ziel sollte es sein, LO ordnungsgemäß zu beenden, dann gibt's auch hinterher keine Probleme.

Das Herunterfahren des Rechners verlangt übrigens nicht grundlos root-Rechte. Auch wenn man selbst weiß, dass alles ok ist bedeutet das noch lange nicht, dass das System für ein shutdown bereit ist. Wenn Du den Rechner wirklich "nach den Regeln der Kunst" herunterfahren willst, dann kannst Du das nicht aus LO heraus machen, sondern die Vorgehensweise muss Folgende sein:
Ein Programm, das den Rechner herunterfahren kann muss überprüfen ob LO (und alle anderen vor dem Shutdown zu beendenden Prozesse) beendet wurde, dann kann das Shutdown eingeleitet werden. Nicht umsonst braucht man in LO für die Kontrolle von vielen Systemprozessen eigene Listener (z.B. bei Druckvorgängen).

edit:

Folgendes Makro funktioniert:

Code: Alles auswählen

sub ShutDown_from_LO
stardesktop.terminate
on error resume next
shell("~/sd_scrpt",0,,false)
end sub
wobei "sd_scrpt" eine ausführbare Datei im Home-Verzeichnis des aktuellen Benutzers ist und folgendermaßen aussieht:

Code: Alles auswählen

#!/bin/sh
echo DasPasswortDesUsers | /usr/bin/sudo -S shutdown -hP now
exit 0
Das Script sollte aber unbedingt angepasst werden, denn unverschlüsselte Passwörter in Scriptdateien sind ein enormes Sicherheitsrisiko!
So weit ich gesehen habe gibt's dann nur noch ein Problem: Java wird mit dem stardesktop.terminate-Befehl nicht richtig beendet, d.h. es wird jedesmal ein Crash Report im Userverzeichnis angelegt, aber es kommt sonst zu keinem Fehler.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Sephan
Beiträge: 153
Registriert: Mi 26. Jan 2011, 13:16

Re: Rechner herunterfahren per Makro

Beitrag von Sephan » Mo 8. Jul 2013, 09:24

Und wo liegt der Vorteil bei deiner Lösung oben im Vergleich zu der von mir genutzten Variante, der von F3K Total vorgestellten deiner hier http://www.libreoffice-forum.de/viewtop ... =10#p22335

Wie bekommt man eigentlich das hin:
1. Das Makro muss außerhalb der Base-Datei gespeichert sein (z.B. in einer Extension)

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Rechner herunterfahren per Makro

Beitrag von gogo » Mo 8. Jul 2013, 09:59

Sephan hat geschrieben:Da steht aber auch: "Manche Komponententypen unterstützen das Interface XCloseable nicht. Ein Beispiel ist die Basic-IDE." Jedenfalls funktioniert das dort erwähnte Beispiel leider nicht :(

Code: Alles auswählen

sub Datenbank_schliessen(oEvent)
   oEvent.Source.Model.Parent.Parent.Parent.Parent.close(true)
end sub
funtkioniert
Sephan hat geschrieben:Wie bekommt man eigentlich das hin:
1. Das Makro muss außerhalb der Base-Datei gespeichert sein (z.B. in einer Extension)
unter Extras/Makros/Makros verwalten/LibreOffice Basic gibt's einen Punkt: "Meine Makros" und eine Bibliothek "Standard". Makros die da gespeichert werden sind nicht in Dokumenten (Base, Calc, Writer ...) gespeichert, sondern in Deinem User-Verzeichnis - daher außerhalb der "odb". So ein Makro läuft "außerhalb" Deines Dokumentes, d.h. es kann auch Dein Dokument schließen, denn das Makro ist ja nicht Teil des Dokumentes, und kann daher das Dokument xyz beenden und wird dann selbst fehlerfrei beendet. Daher habe ich die Zeile: "on error resume next" im shutdown-Makro drin.

Code: Alles auswählen

sub ShutDown_from_LO
stardesktop.terminate
on error resume next
shell("~/sd_scrpt",0,,false)
end sub
Der Shell-Aufruf killt ja auch das was vom Makro noch läuft (stardesktop.terminate beendet in diesem Fall nur 'fast' alles). Nimm die Zeile raus, und Du wirst die entsprechende Fehlermeldung bekommen.

Am schönsten wäre es den Stardesktop über die UNO-Bridge zu beenden. In dieser wird nämlich das Beenden des Desktops genau so gemacht, wie es das jeweilige Betriebssystem erfordert. - aber leider kann ich Dir dazu nichts sagen, da ich da auch ganz blank bin
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Rechner herunterfahren per Makro

Beitrag von gogo » Mo 8. Jul 2013, 10:56

... Basic-IDE ...
sry - hatte mich verlesen ich dachte Base-IDE, allerdings sollte die Basic-IDE sowieso nicht in einem Frame geöffnet sein.
außerdem: wenn "Manche Komponententypen unterstützen das Interface XCloseable nicht", dann werden sie's auch nicht benötigen - andernfalls würden sie vermutlich ;)
Komponenten die mit .close nicht zu beenden sind werden dann wohl durch den stardesktop.terminate gekillt, ohne dass es schädlich ist.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Sephan
Beiträge: 153
Registriert: Mi 26. Jan 2011, 13:16

Re: Rechner herunterfahren per Makro

Beitrag von Sephan » Mo 8. Jul 2013, 11:26

Gut, dass dus sagst, denn ich hab auch Base gelesen :oops:

Sephan
Beiträge: 153
Registriert: Mi 26. Jan 2011, 13:16

Re: Rechner herunterfahren per Makro

Beitrag von Sephan » Mo 8. Jul 2013, 13:53

Ich habe jetzt mal auch dein Skript von hier probiert:
http://www.libreoffice-forum.de/viewtop ... =20#p22340

Das beendet zwar LibreOffice startet aber mein Skript nicht.

Allgemein habe ich das Problem, dass sich LibreOffice nicht beendet wenn ich das Skript daraus starte. Wahrscheinlich weil ein Handle offen bleibt. Aber so habe ich es jetzt, basierend auf F3K Total Skript, zum Laufen gebraucht:

Code: Alles auswählen

Sub Beenden

'System Shutdown
if msgbox ("Soll die Statistik beendet und der Computer heruntergefahren werden?",36,"Shutdown") = 6 then

'Get Path
	sFolderUrl =replace(ThisDatabasedocument.url,ThisDatabasedocument.Title,"")
	'msgbox sFolderUrl

'Detect OS & start suitable shutdown script
	OS = GetGUIType()
   	if OS = 1 then
       	sfolder = sFolderUrl 'Pfad der Batch Datei (darf keine Leerzeichen oder Sonderzeichen enthalten)
       	surl = sfolder + "/shutdown.bat"
      	sfolderpath = convertfromurl(sfolder)
       	sPath = convertfromurl(surl)
       	Shell(sPath,4,sfolderpath)
	endif
    if OS = 4 then
       	sfolder = sFolderUrl 'Pfad der Shell-Skript Datei (darf keine Leerzeichen oder Sonderzeichen enthalten)
       	surl = sfolder + "/shutdown.sh"
       	sfolderpath = convertfromurl(sfolder)
       	sPath = convertfromurl(surl)
       	Shell(sPath,4,sfolderpath)
    endif

 	oController = ThisDatabaseDocument.CurrentController
 	oController.closeSubComponents
 	oController.ActiveConnection.close()
	oDoc = ThisDatabaseDocument
	oDoc.store()
	oDoc.close(True)
	stardesktop.terminate
endif
END Sub
Allerdings bekommt man so gut wie jedesmal die Dokumentenwiederherstellung, weswegen ich jetzt immer die registrymodifications.xcu durch eine Musterdatei von mir ersetze. Vor dieser Lösung konnte sich LibreOffice nie beenden wenn ich auch noch mein Shellskript daraus aufgerufen habe, weswegen ich dann immer mit 'pkill -15 oosplash && pkill -15 soffice.bin' LO zu Leibe rücken musste.

Ich stelle mir allerdings gerade die Frage, welche Lösung die sicherste ist. Die oben, die zwar LO beenden kann, aber fast zwangsläufig zur Dokumentenwiederherstellung führt, oder meine davor, die sehr selten eine Dokumentenwiederherstellung hat, bei der ich aber LO killen muss.

Wie seht ihr das?

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Rechner herunterfahren per Makro

Beitrag von gogo » Mo 8. Jul 2013, 14:53

Das beendet zwar LibreOffice startet aber mein Skript nicht.
Das wäre durchaus möglich, wenn der .terminate-Befehl auch das Dokument beendet in welchem das Makro gespeichert ist, allerdings würde ich eher vermuten, dass sPath bzw. sfolderpath nicht korrekt sind. In meinem Script ist nämlich kein Dateiname angegeben, der steht schon beim Pfad dabei, das sollte zwar bei allen UNIX-Systemen reichen, aber wer weiß... . Lass' einfach mal ein Skript laufen, das den Ubuntu-Taschenrechner startet (gcalculator oder so ähnlich) und beende das Makro vor dem "oController = ThisDatabaseDocument.CurrentController" (z.B. mit "exit sub"). Dann ist der Shell-Aufruf mal geklärt.
Je nach Desktopumgebung muss u.U. der Shell-Befehl auch anders aussehen. Manche Shells brauchen spezielle Übergabeparameter, z.B. "lxterminal -e galculator" etc.

Zum Beenden des Dokumetes und von LO sollte das Makro immer außerhalb eines Dokumentes gespeichert werden - das ist auf jeden Fall einfacher (und um ein ganzes Eck schöner) als jedesmal die registrymodifications.xcu zu ersetzen! Nachdem mir nicht klar ist welche Infos in der registrymodifications.xcu überhaupt drinstehen, würde ich die Datei niemals blanko ersetzen!

Eventuell würdest Du Dir leichter tun, wenn das shutdown-script shutdown erst nach dem Beenden von LO startet. Der Linux-shutdown-Befehl bietet ja die Möglichkeit des verzögernten Shutdowns, evtl. kannst Du vor dem shutdown auch ein "sleep 5" einbauen, das verzögert einfach um 5 Sekunden, garantiert aber nicht, dass alles bestens ist!
Du solltest evtl. die Datei auch nicht shutdown.sh nennen - das könnte auch mal zu Problemen führen.

btw:
"oController.ActiveConnection.close()" und ein paar Millisekunden nachher "oDoc.store()"
ist nicht ganz Ohne. Ich hab' mir damit mal eine Datenbank zerschossen und konnte sie nur mit Entzippen, Austauschen einer Datei und Neukomprimieren noch retten!

Was funktioniert denn am Makro "sub ShutDown_from_LO" nicht? Die "sub Datenbank_schliessen(oEvent)" musst Du natürlich einbauen ...

Code: Alles auswählen

sub CloseDB_and_ShutDown_from_LO(oEvent)

   oEvent.Source.Model.Parent.Parent.Parent.Parent.close(true)

   if msgbox("Beenden und Herunterfahren?",4)=6 then
      ' hier gegebenenfalls offene Frames suchen und schliessen bevor der .terminate-Befehl kommt
      stardesktop.terminate
      on error resume next
      shell("~/sd_scrpt",0,,false)
   end if

end sub
Zu Guter Letzt noch Diesen hier: http://www.oooforum.org/forum/viewtopic ... f6207ff897 schon etwas in die Jahre gekommen, aber das sollte nach meinem Dafürhalten auch funktionieren.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Sephan
Beiträge: 153
Registriert: Mi 26. Jan 2011, 13:16

Re: Rechner herunterfahren per Makro

Beitrag von Sephan » Di 9. Jul 2013, 00:43

Wie kann ich denn ein Makro außerhalb von Base speichern und wie dann darauf zugreifen?

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Rechner herunterfahren per Makro

Beitrag von gogo » Di 9. Jul 2013, 10:35

Extras/Makros/Makros verwalten/LibreOffice Basic gibt's einen Punkt: "Meine Makros" und eine Bibliothek "Standard" - öffnen und einfach das Makro reinschreiben...

Dann dem Button das Makro zuweisen - genau so wie Du ein Dokument-Internes zuweisen würdest.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten