oki doki danke für das Weihnachts Präsent, werde ich berücksichtigen,
dir auch frohe Weihnachten
oki doki danke für das Weihnachts Präsent, werde ich berücksichtigen,
dir auch frohe Weihnachten
okidoki, vielen Dank noch mal für die Verbesserungen
klappt super
wünsche geruhsamme Feiertage
Komisch, hab es eben noch mal bisl umgestelt, dachte so hätte ich es gestern schon gehabt, nun funktionierts. Vielleicht sollte ich damit aufhören soetwas um 2Uhr in der Nacht anzufangen lach.
#include <WindowsConstants.au3>
#include <sendmessage.au3>
#include <GuiConstants.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <Excel.au3>
#include <array.au3>
#include <GuiComboBox.au3>
#include <FileConstants.au3>
#include <File.au3>
#include <WinAPI.au3>
#NoTrayIcon
HotKeySet("ESC", "_Exit")
Global $siniFile = StringTrimRight(@AppDataDir, 3) & "ini"
; Create GUI
$GUI = GUICreate("Test", 400, 40, 600, 40, $WS_POPUP, $WS_EX_LAYERED)
if not FileExists($siniFile) Then
_StandardPos()
endif
_GUIRestorePositions($GUI, $siniFile)
GUISetBkColor(0xABCDEF)
; Create Boxes
Local $cmb01 = GUICtrlCreateCombo('', 10, 10, 150, 20)
Local $cmb02 = GUICtrlCreateCombo('', 170, 10, 50, 20)
Local $cmb03 = GUICtrlCreateCombo('', 230, 10, 50, 20)
Local $cmb04 = GUICtrlCreateCombo('', 290, 10, 200, 20)
_WinAPI_SetLayeredWindowAttributes($GUI, 0xABCDEF, 250)
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_GUISavePositions($GUI, $siniFile)
Exit
Case $GUI_EVENT_PRIMARYDOWN
_SendMessage($GUI, $WM_SYSCOMMAND, 0xF012, 0)
EndSwitch
WEnd
Func _Exit()
Exit
EndFunc
Func _GUISavePositions($hGUI, $sConfigFile, $sSectName = "Window Positions")
Local $aGUI_Pos = WinGetPos($hGUI)
If @error Then Return 0
IniWrite($sConfigFile, $sSectName, "Left", $aGUI_Pos[0])
IniWrite($sConfigFile, $sSectName, "Top", $aGUI_Pos[1])
IniWrite($sConfigFile, $sSectName, "Width", $aGUI_Pos[2])
IniWrite($sConfigFile, $sSectName, "Height", $aGUI_Pos[3])
Return 1
EndFunc
Func _GUIRestorePositions($hGUI, $sConfigFile, $sSectName = "Window Positions", $iDefWidth = 700, $iDefHeight = 40)
Local $iGUI_Left = IniRead($sConfigFile, $sSectName, "Left", -1)
Local $iGUI_Top = IniRead($sConfigFile, $sSectName, "Top", -1)
Local $iGUI_Width = IniRead($sConfigFile, $sSectName, "Width", $iDefWidth)
Local $iGUI_Height = IniRead($sConfigFile, $sSectName, "Height", $iDefHeight)
If $iGUI_Left = -1 Then $iGUI_Left = (@DesktopWidth / 2) - ($iGUI_Width / 2)
If $iGUI_Top = -1 Then $iGUI_Top = (@DesktopHeight / 2) - ($iGUI_Height / 2)
Return WinMove($hGUI, "", $iGUI_Left, $iGUI_Top, $iGUI_Width, $iGUI_Height)
EndFunc
Func _StandardPos()
; Get screen dimensions
Local $iScreenWidth = @DesktopWidth
Local $iScreenHeight = @DesktopHeight
; Calculate window position (centered horizontally, positioned from the bottom)
Local $iWindowWidth = 800
Local $iWindowHeight = 40
Local $iWindowX = ($iScreenWidth - $iWindowWidth) / 2
Local $iWindowY = $iScreenHeight - $iWindowHeight - 3; Adjust 50 to change the gap from the bottom
; Set window position
WinMove($GUI, "", $iWindowX, $iWindowY, $iWindowWidth, $iWindowHeight)
_GUISavePositions($GUI, $siniFile)
EndFunc
Alles anzeigen
lg noch und ein gesegnetes Fest
ok danke,
Zu Punkt 1, Du meinst wirklich ich kann dass Winmove mit meiner GUIRestore Function verbinden?
Zum zweiten Punkt, ist schon klar, da müsste ne Bedingung rein, irgendwie hatte ich da auch erst eine, das hatte ihn nicht interessiert, ist hier wohl im meinem Post wieder verschwunden.
lg und Danke
Hallo allerseits,
ich bräuchte mal die freundlcihe Unterstützung unserer GUI xperten. Ich habe eine transparente Eingabe GUI erstellt, die beim Verschieben die Position speichert. Soweit so gut. Bei ersten öffnen soll die GUI aber (also wenn noch keine INI Datei existiert relativ am unteren Bildschirmrand mittig sein, irgendwi3 klappt das noch nicht. Vielleicht sieht ja jemand den Fehler.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WINAPI.au3>
#include <sendmessage.au3>
#include <GuiConstants.au3>
#NoTrayIcon
HotKeySet("ESC", "_Exit")
Global $ConfigFile = StringTrimRight(@ScriptFullPath, 3) & "ini"
;Create GUI
$GUI = GUICreate("Test", 400, 40, 600, 40, $WS_POPUP, $WS_EX_LAYERED)
if not FileExists($ConfigFile) Then ;kein configfile
_StandardPos()
endif
_GUIRestorePositions($GUI, $ConfigFile)
GUISetBkColor(0xABCDEF)
;Create Boxes
Local $cmb01 = GUICtrlCreateCombo('', 10, 10, 150, 20)
Local $cmb02 = GUICtrlCreateCombo('', 170, 10, 50, 20)
Local $cmb03 = GUICtrlCreateCombo('', 230, 10, 50, 20)
Local $cmb04 = GUICtrlCreateCombo('', 290, 10, 200, 20)
_WinAPI_SetLayeredWindowAttributes($GUI, 0xABCDEF, 250)
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_GUISavePositions($GUI, $ConfigFile)
Exit
Case $GUI_EVENT_PRIMARYDOWN
_SendMessage($GUI, $WM_SYSCOMMAND, 0xF012, 0)
EndSwitch
WEnd
Func _Exit()
Exit
EndFunc
Func _GUISavePositions($hGUI, $sConfigFile, $sSectName="Window Positions")
Local $aGUI_Pos = WinGetPos($hGUI)
If @error Then Return 0
IniWrite($sConfigFile, $sSectName, "Left", $aGUI_Pos[0])
IniWrite($sConfigFile, $sSectName, "Top", $aGUI_Pos[1])
IniWrite($sConfigFile, $sSectName, "Width", $aGUI_Pos[2])
IniWrite($sConfigFile, $sSectName, "Height", $aGUI_Pos[3])
Return 1
EndFunc
Func _GUIRestorePositions($hGUI, $sConfigFile, $sSectName="Window Positions", $iDefWidth=700, $iDefHeight=40)
Local $iGUI_Left = IniRead($sConfigFile, $sSectName, "Left", -1)
Local $iGUI_Top = IniRead($sConfigFile, $sSectName, "Top", -1)
Local $iGUI_Width = IniRead($sConfigFile, $sSectName, "Width", $iDefWidth)
Local $iGUI_Height = IniRead($sConfigFile, $sSectName, "Height", $iDefHeight)
If $iGUI_Left = -1 Then $iGUI_Left = (@DesktopWidth / 2) - ($iGUI_Width / 2)
If $iGUI_Top = -1 Then $iGUI_Top = (@DesktopHeight / 2) - ($iGUI_Height / 2)
Return WinMove($hGUI, "", $iGUI_Left, $iGUI_Top, $iGUI_Width, $iGUI_Height)
EndFunc
Func _StandardPos()
; Get screen dimensions
Local $iScreenWidth = @DesktopWidth
Local $iScreenHeight = @DesktopHeight
;Calculate window position (centered horizontally, positioned from the bottom)
Local $iWindowWidth = 800
Local $iWindowHeight = 40
Local $iWindowX = ($iScreenWidth - $iWindowWidth) / 2
Local $iWindowY = $iScreenHeight - $iWindowHeight - 3; Adjust 50 to change the gap from the bottom
EndFunc
Alles anzeigen
Danjke schon mal
lg und ein frohes Fest
Hallo liebe Forengemeunde. Ich hab mal ne ganz duselige Frage. Nach einer Neuinstallation funktioniert ein Teil eines grösseren Scriptes nicht mehr, was ich auf diesen´m Rechner entwickelt hatte. Auf allen anderen funktioniert dieser Aufruf. Diese Batchdatei ist auch per Doppelklick aufzurufen also innerhalb der sicheren Zone und ohne Sicherheitsfenster, also daran liegt es nicht. Aber diese Batch wird ums Verrecken nicht gestartet, hat irgend jemand ne Idee? ich bin am Vezweifeln. Der Aufruf sieht so aus:
Global $Freigaben = "\\LA-DFS.domain.de\Freigaben\"
Global $InvP = $Freigaben & "Austausch-Daten\spez\inv2"
; Löschen der vorhandenen Datei
FileDelete($InvP & '\summary.csv')
; Ausführen der Batch-Datei mit RunWait
Runwait(@ComSpec & ' /c "' & $InvP & '\CSV-Merge2.bat"', $InvP, @SW_HIDE)
vielen Dank schon mal und eine schöne Woche noch
ja das hatte ich schon gemacht;) hatte nur teilweise etwas gebracht, dann kam zwar die Info aber der Copybefehl ging nicht. Aber denke mal mit der Trennung ist jetzt jetzt die sauberste Lösung.
lg und einen schönen Anend noch
so ich habe das ganze mal in 2 Prozesse gezogen und das ganze in eine Function gezogen, so wird erst kurz die Authentifizierung gecheckt und dann kommt der Rest. Vielleicht nicht schön aber ist ne Lösung:
#include <File.au3>
#include <MsgBoxConstants.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>
#include <WinAPIFiles.au3>
HotKeySet("{ESC}", "AbortScript") ; Abbrechen mit Escape-Taste
Global $usb = _checkBackVolume()
$width = 40
$height = 10
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Pfade bitte ggf. anpassen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Global $ServerIP = "x.x.x.x"
Global $bash = 'C:\cygwin64\bin\bash.exe'
Local $targetPath = "/cygdrive/" & $usb & "/linuxback/koha/"
Local $sourcePath = "/var/backup/"
Local $sourcePath2 = "/"
Local $sourcePath3 = "/"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_checkDomain()
_CheckAndCreateBacksServerFolder()
_Authcheck()
_ProgressGUI()
;MAIN
; Kopierbefehl
Local $bashCommand = $bash & ' -l -c "rsync -azP --delete --progress -e /usr/bin/ssh.exe root@' & $serverIP & ':' & $sourcePath & ' ' & $targetPath & '"'
ConsoleWrite("Bash-Befehl: " & $bashCommand & @CRLF) ; Konsolenausgabe
RunWait($bashCommand, "", @SW_HIDE)
_MoveProgressBar()
_ErfolgsMSG()
_MoveProgressBar()
_MoveProgressBar()
_MoveProgressBar()
GUIDelete()
; Funktionen für GUI
Func _ProgressGUI()
; Erstellen Sie ein GUI-Fenster mit Fortschrittsbalken
GUICreate("Backup vom Server wird geholt", 300, 100)
GUISetState(@SW_SHOW)
GUICtrlCreateLabel("Backup vom Server wird geholt", 10, 10, 280, 20) ; Text für Fortschrittsanzeige
GUICtrlSetFont(-1, 12, 800) ; Schriftgröße 12 und fett (800)
Global $ProgressBar = GUICtrlCreateProgress(10, 40, 280, 30, $PBS_MARQUEE) ; Fortschrittsbalken
GUICtrlCreateLabel("Escape zum Abbrechen", 10, 75, 280, 20, $SS_CENTER) ; Text am unteren Rand
GUICtrlSetFont(-1, 10, 800) ; Schriftgröße 10 und fett (800)
EndFunc
Func _MoveProgressBar()
For $i = 1 To 100 Step 10;Bewegung Balken
GUICtrlSendMsg($ProgressBar, $PBM_SETPOS, $i, 0)
Sleep(500) ; Ändere die Schlafdauer je nach Fortschrittsgeschwindigkeit
Next
EndFunc
Func _ErfolgsMSG()
$sMessage = "Backup wurde vom Server geholt!"
SplashTextOn("", $sMessage, 260, 40, @DesktopWidth - 280, @DesktopHeight - 50, $DLG_TEXTLEFT + $DLG_NOTITLE + $DLG_MOVEABLE, "Arial", 11, "")
_Speak("Das Backup vom KOHA Server wurde gesichert")
Sleep(9000)
SplashOff()
EndFunc
Func _Speak($text)
$oSp = ObjCreate("SAPI.SpVoice")
$oSp.Speak($Text)
EndFunc
Func _checkDomain()
; Überprüfen, ob der Server 192.168.100.33 im LAN erreichbar ist
If Ping("192.168.100.33", 1000) Then
ToolTip("Der verwendete PC darf sich nicht in der Domäne befinden, bitte offenes LAN nutzen !!!", 0, 0)
Sleep(2000) ; 2 Sekunden warten
ToolTip("") ; Tooltip ausblenden
SplashTextOn("", "Bitte offenes WLAN nutzen und noch mal probieren", 300, 110, @DesktopWidth - 320, @DesktopHeight - 80, $DLG_TEXTLEFT + $DLG_NOTITLE + $DLG_MOVEABLE, "Arial", 11, "")
Sleep(3000) ; 3 Sekunden warten
SplashOff()
Exit ; Beenden Sie das Skript, wenn der DC erreichbar ist, da kein SSH
EndIf
EndFunc
Func _checkBackVolume()
Local $var = DriveGetDrive("all")
If Not @error Then
For $i = 1 To $var[0]
Local $search = FileExists($var[$i] & "\backupmedium1.txt") ; Beachten Sie den Backslash "\"
If $search Then
$usb = StringUpper(StringLeft($var[$i], 1)) ; Ersten Buchstaben des Laufwerks in Großbuchstaben
ExitLoop
EndIf
Next
If $usb = '' Then
SoundPlay("C:\Windows\Media\Windows-Hardwarefehler.wav") ; Warnton abspielen
_Speak("Bitte schließen Sie das Backup-Medium an")
MsgBox(16, "Fehler", "Kein Backup-Volume gefunden")
Exit
EndIf
EndIf
Return $usb
EndFunc
Func _CheckAndCreateBacksServerFolder()
Local $sFolderPath = $usb & ":\linuxback\koha"
ConsoleWrite("Überprüfe und erstelle Ordner: " & $sFolderPath & @CRLF)
If Not FileExists($sFolderPath) Then
DirCreate($sFolderPath)
If Not FileExists($sFolderPath) Then
ConsoleWrite("Fehler: Der Ordner konnte nicht erstellt werden: " & $sFolderPath & @CRLF)
MsgBox(16, "Fehler", "Der Ordner konnte nicht erstellt werden: " & $sFolderPath)
Exit
EndIf
EndIf
EndFunc
Func _Authcheck()
Local $iPID = Run(@ComSpec & " /c " & 'C:\cygwin64\bin\bash.exe -l -c "/usr/bin/ssh.exe root@x.x.x.x"', @SystemDir, @SW_HIDE, $STDERR_MERGED) ; $STDERR_CHILD + $STDOUT_CHILD)
Local $sOutput = ""
Do
$sOutput &= StdOutRead($iPID)
Until @error
;MsgBox($MB_SYSTEMMODAL, "Stderr or stdout Read:", $sOutput)
If StringInStr($sOutput, "failed") Then
MsgBox($MB_SYSTEMMODAL, "Auth", "Überprüfen Sie denn SSH Host-key!")
exit
Else
SplashTextOn("", "Authentifizierung ok", 150, 35, @DesktopWidth - 150, 10, $DLG_TEXTLEFT + $DLG_NOTITLE + $DLG_MOVEABLE, "Arial", 11)
Sleep(2000) ; 2 Sekunden lang Popup anzeigen
SplashOff()
Endif
EndFunc
Func AbortScript() ; Abbruchfunktion
Local $pidToClose = "bash.exe" ; Ersetze diese Zeile durch die PID, die du beenden möchtest
If ProcessExists($pidToClose) Then
ProcessClose($pidToClose)
EndIf
; Beende das Skript
Exit
EndFunc
Alles anzeigen
Danke noch mal für die Anregungen und noch einen schönen Sonntag
danke erstmal, wie gesagt die Prüfung hatte schon funktioniert, aber mit der Schleife funktioniert Run nicht sondern nur Runwait, ich persönlich vermute ja ein Timing Problem. Leider ist die Dokumentation was das korrekte Auslesen des Rückgabeweetes angeht leider mehr als rudimentät:(
Also momentan läuft das Kopieren, aber nun liest er nur noch leere Werte aus:
Local $bashCommand = $bash & ' -l -c "rsync -azP --delete --progress -e /usr/bin/ssh.exe root@' & $serverIP & ':' & $sourcePath & ' ' & $targetPath & '"'
ConsoleWrite("Bash-Befehl: " & $bashCommand & @CRLF) ; Konsolenausgabe
Local $iPID = RunWait($bashCommand, "", @SW_show, $STDERR_CHILD + $STDOUT_CHILD)
;Check Authentifizierung
While 1
$sLine = StdoutRead($STDOUT_CHILD)
If @error Then ExitLoop
$strOut &= $sLine
WEnd
Sleep ( 700 )
$strErr = StdoutRead($iPID)
;MsgBox(262144,"Title", $strErr)
If StringInStr($strErr, "rec") Then
SplashTextOn("", "Authentifizierung ok", 150, 35, @DesktopWidth - 150, 10, $DLG_TEXTLEFT + $DLG_NOTITLE + $DLG_MOVEABLE, "Arial", 11)
Sleep(2000) ; 2 Sekunden lang Popup anzeigen
SplashOff()
Else
MsgBox(16, '', 'Überprüfen Sie den SSL-Schlüssel !')
exit
EndIf
;_Authcheck($iPID)
_MoveProgressBar()
_ErfolgsMSG()
_MoveProgressBar()
_MoveProgressBar()
_MoveProgressBar()
GUIDelete()
Alles anzeigen
lg
schönen Sonntag
vielen Dank für den Hinweis, werde ich mal checken. Irgendwie scheint das Thema StdOut komplizierter als ich dachte. Das hatte ich schon verbeseert in
geht aber auch nichte gesagt mit Run bricht der Befehl sofort ab
Also ich will es noch mal klarer formulieren, ist eigentlich ganz simpel was ich mcöhte. Es wird ein Kopierbefehl ausgeführt. Dieser läuft auch, sehe ich daran, dass Dateien kopiert werden. Als Kriterium dass etwas schief läuft nehme ich den Text der bei Beginn des bash Prozesses gezeigt wird, wenn ein SSH key vorliegt errscheint da Receiving File List. Woher ich dass weiss? ich habe den rsyncbefehl mit den richtigen Pfaden auf der Komanozeile abgesetzt. Wenn dieser Text erscheint soll er eine msg bringen Authentifizierung ok wenn nicht dann dass ein Fehler passiert ist. Hoffe ich habe mich jetzt klarer ausgedrückt;) Ich ging bislang davon aus, dass man das mit stdout speichern kann, aber dass bleibt bei mir immer leer.
lg und schöne WE
Also noch mal den Hauptteil, die variable $stdout scheint immer leer zu sein, egal ob Receive erscheint oder nicht:
#include <File.au3>
#include <MsgBoxConstants.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>
#include <WinAPIFiles.au3>
HotKeySet("{ESC}", "AbortScript") ; Abbrechen mit Escape-Taste
Global $usb = _checkBackVolume()
Global $rueckgabe = ''
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Pfade bitte ggf. anpassen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Global $ServerIP = "87.106.128.49"
Global $bash = 'C:\cygwin64\bin\bash.exe'
Local $targetPath = "/cygdrive/" & $usb & "/linuxback/koha/"
Local $sourcePath = "/var/backup/"
Local $sourcePath2 = "/"
Local $sourcePath3 = "/"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_checkDomain()
_CheckAndCreateBacksServerFolder()
_ProgressGUI()
;MAIN
; Kopierbefehl
Local $bashCommand = $bash & ' -l -c "rsync -azP --delete --progress -e /usr/bin/ssh.exe root@' & $serverIP & ':' & $sourcePath & ' ' & $targetPath & '"'
ConsoleWrite("Bash-Befehl: " & $bashCommand & @CRLF) ; Konsolenausgabe
Local $iPID = RunWait($bashCommand, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
If @error Then
MsgBox(16, '', 'Fehler beim Ausführen des Befehls')
Exit
EndIf
Local $sStdOut = ""
Local $authOKFound = False
If StdOutRead($ipid,True) Then $rueckgabe &= StdERead($ipid)
;MsgBox(262144,"Title", $rueckgabe)
While 1
$sStdOut &= StdoutRead($iPID)
Sleep(2000)
MsgBox(262144,"Title", $sStdOut)
If @error Then ExitLoop
If not StringInStr($sStdOut, "receiving") Then
ConsoleWrite("Authentifizierung ok" & @CRLF)
$authOKFound = True
SplashTextOn("", "Authentifizierung ok", 300, 50, @DesktopWidth - 320, 30, $DLG_TEXTLEFT + $DLG_NOTITLE + $DLG_MOVEABLE, "Arial", 11, 4000) ; 4 Sekunden lang Popup anzeigen
Sleep(4000) ; Sicherstellen, dass das Popup ausreichend Zeit hat, um angezeigt zu werden
SplashOff()
ExitLoop
EndIf
Wend
If Not $authOKFound Then
MsgBox(16, '', 'Keine Authentifizierung möglich, Sie verfügen nicht über entsprechende RSA Schlüssel')
Exit
EndIf
_MoveProgressBar()
_ErfolgsMSG()
_MoveProgressBar()
_MoveProgressBar()
_MoveProgressBar()
GUIDelete()
Alles anzeigen
jetzt scheint es zu funktionieren, es muss natürlich RunWait heissen, aber nun sagt er mir wenn der Job fertif kopiert hat Kein Schlüssel vorhanden, stimmt da was nicht an der Reihenfolge, oder hab ich das ganze verkompliziert?
ich habe den Checkblock noch mal rausgenommen und en ursprünglichen Run begefel rei genommen, mit dem gehts :
Local $bashCommand = $bash & ' -l -c "rsync -azP --delete --progress -e /usr/bin/ssh.exe root@' & $serverIP & ':' & $sourcePath & ' ' & $targetPath & '"'
ConsoleWrite("Bash-Befehl: " & $bashCommand & @CRLF) ; Konsolenausgabe
RunWait($bashCommand, "", @SW_show)
aber mit dem bekomm ich das mit der Überprüfung nicht hin:(
ah ok dann weiss ich Bescheid, werde ich noch einbauen, danke Dir. Ich habe das ganze noch mal neu aufgerollt, da mir nicht gefallen hat dass die Dteien hier immer komplett neu runtergeholt werden und das mit dem Passwort so noch nicht optimal war. Deshalb habe ich jetzt auf rsync umgeschwenkt, ist ja wohl ne gängige Praxis bei der Serversicherung. Zudem habe ich entsprechende RSA Schlüssel erzeugt und ausgetauscht. Mein Script funktioniert auch schon soweit. Nun kam ich noch auf die bescheuerte Idee die $stdout auslesen zu wollen, um über den Text Receiving entsprechende Meldungen auszugeben, dass evtl. ein Key Problem vorliegt. Die Fehlermeldungen kommen jtzt zwar aber der Kopierjob funktioniert so leider nicht. Vielleicht sieht ja jemand den Fehler,
#include <File.au3>
#include <MsgBoxConstants.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>
#include <WinAPIFiles.au3>
HotKeySet("{ESC}", "AbortScript") ; Abbrechen mit Escape-Taste
Global $usb = _checkBackVolume()
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Pfade bitte ggf. anpassen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Global $ServerIP = "0.0.0.0"
Global $bash = 'C:\cygwin64\bin\bash.exe'
Local $targetPath = "/cygdrive/" & $usb & "/linuxback/koha/"
Local $sourcePath = "/var/backup/"
Local $sourcePath2 = "/"
Local $sourcePath3 = "/"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_checkDomain()
_CheckAndCreateBacksServerFolder()
_ProgressGUI()
;MAIN
; Kopierbefehl
Local $bashCommand = $bash & ' -l -c "rsync -azP --delete --progress -e /usr/bin/ssh.exe root@' & $serverIP & ':' & $sourcePath & ' ' & $targetPath & '"'
ConsoleWrite("Bash-Befehl: " & $bashCommand & @CRLF) ; Konsolenausgabe
Local $iPID = Run($bashCommand, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) ; Ausühren des Befehls
If @error Then
MsgBox(16, '', 'Fehler beim Ausführen des Befehls')
Exit
EndIf
Local $sStdOut = ""
Local $authOKFound = False
While 1
$sStdOut &= StdoutRead($iPID)
If @error Then ExitLoop
If StringInStr($sStdOut, "receiving") Then
ConsoleWrite("Authentifizierung ok" & @CRLF)
$authOKFound = True
SplashTextOn("", "Authentifizierung ok", 300, 50, @DesktopWidth - 320, 30, $DLG_TEXTLEFT + $DLG_NOTITLE + $DLG_MOVEABLE, "Arial", 11, 4000) ; 4 Sekunden lang Popup anzeigen
Sleep(4000) ; Sicherstellen, dass das Popup ausreichend Zeit hat, um angezeigt zu werden
SplashOff()
ExitLoop
EndIf
Wend
If Not $authOKFound Then
MsgBox(16, '', 'Keine Authentifizierung möglich, Sie verfügen nicht über entsprechende RSA Schlüssel')
Exit
EndIf
_MoveProgressBar()
_ErfolgsMSG()
_MoveProgressBar()
_MoveProgressBar()
_MoveProgressBar()
GUIDelete()
Func _ProgressGUI()
; Erstellen Sie ein GUI-Fenster mit Fortschrittsbalken
GUICreate("Backup vom Server wird geholt", 300, 100)
GUISetState(@SW_SHOW)
GUICtrlCreateLabel("Backup vom Server wird geholt", 10, 10, 280, 20) ; Text für Fortschrittsanzeige
GUICtrlSetFont(-1, 12, 800) ; Schriftgröße 12 und fett (800)
Global $ProgressBar = GUICtrlCreateProgress(10, 40, 280, 30, $PBS_MARQUEE) ; Fortschrittsbalken
GUICtrlCreateLabel("Escape zum Abbrechen", 10, 75, 280, 20, $SS_CENTER) ; Text am unteren Rand
GUICtrlSetFont(-1, 10, 800) ; Schriftgröße 10 und fett (800)
EndFunc
Func _MoveProgressBar()
For $i = 1 To 100 Step 10;Bewegung Balken
GUICtrlSendMsg($ProgressBar, $PBM_SETPOS, $i, 0)
Sleep(500) ; Ändere die Schlafdauer je nach Fortschrittsgeschwindigkeit
Next
EndFunc
Func _ErfolgsMSG()
$sMessage = "KOHA APACHE-Server, Backup wurde geholt!"
SplashTextOn("", $sMessage, 300, 110, @DesktopWidth - 320, @DesktopHeight - 80, $DLG_TEXTLEFT + $DLG_NOTITLE + $DLG_MOVEABLE, "Arial", 11, "")
_Speak("Das Backup vom KOHA Server wurde gesichert")
Sleep(9000)
SplashOff()
EndFunc
Func _Speak($text)
$oSp = ObjCreate("SAPI.SpVoice")
$oSp.Speak($Text)
EndFunc
Func _checkDomain()
; Überprüfen, ob der Server 192.168.100.33 im LAN erreichbar ist
If Ping("192.168.100.33", 1000) Then
ToolTip("Der verwendete PC darf sich nicht in der Domäne befinden, bitte offenes LAN nutzen !!!", 0, 0)
Sleep(2000) ; 2 Sekunden warten
ToolTip("") ; Tooltip ausblenden
SplashTextOn("", "SSH Port gesperrt!!!", 300, 110, @DesktopWidth - 320, @DesktopHeight - 80, $DLG_TEXTLEFT + $DLG_NOTITLE + $DLG_MOVEABLE, "Arial", 11, "")
Sleep(3000) ; 3 Sekunden warten
SplashOff()
Exit ; Beenden Sie das Skript, wenn der DC erreichbar ist, da kein SSH
EndIf
EndFunc
Func _checkBackVolume()
Local $var = DriveGetDrive("all")
If Not @error Then
For $i = 1 To $var[0]
Local $search = FileExists($var[$i] & "\backupmedium1.txt") ; Beachten Sie den Backslash "\"
If $search Then
$usb = StringUpper(StringLeft($var[$i], 1)) ; Ersten Buchstaben des Laufwerks in Großbuchstaben
ExitLoop
EndIf
Next
If $usb = '' Then
SoundPlay("C:\Windows\Media\Windows-Hardwarefehler.wav") ; Warnton abspielen
_Speak("Bitte schließen Sie das Backup-Medium an")
MsgBox(16, "Fehler", "Kein Backup-Volume gefunden")
Exit
EndIf
EndIf
Return $usb
EndFunc
Func _CheckAndCreateBacksServerFolder()
Local $sFolderPath = $usb & ":\linuxback\koha"
ConsoleWrite("Überprüfe und erstelle Ordner: " & $sFolderPath & @CRLF)
If Not FileExists($sFolderPath) Then
DirCreate($sFolderPath)
If Not FileExists($sFolderPath) Then
ConsoleWrite("Fehler: Der Ordner konnte nicht erstellt werden: " & $sFolderPath & @CRLF)
MsgBox(16, "Fehler", "Der Ordner konnte nicht erstellt werden: " & $sFolderPath)
Exit
EndIf
EndIf
EndFunc
Func AbortScript() ; Abbruchfunktion
Exit
EndFunc
Alles anzeigen
Vielen Dank noch mal
lg und schönes WE
ok ich habs jetzt erst mal, wenn noch Anregungen gerne. Mit Regex schau ich demnächst mal
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.16.1
Author: myName
Script Function:
Template AutoIt script.
#ce ----------------------------------------------------------------------------
; Script Start - Add your code below here
Opt('MustDeclareVars', 1)
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIFiles.au3>
Global $PSCommand, $password, $pid, $output, $errorOutput, $line, $tries = 0
Global Const $maxfails = 3
Global Const $ServerIP = "x.x.x.x"
;LINUX COMMANDS
Global Const $Command2 = 'systemctl start apache2'
; Datei "log.txt" löschen, falls vorhanden
FileDelete("C:\log.txt")
_precheck()
While 1
$output = ""
$errorOutput = ""
; Benutzer zur Eingabe des Passworts auffordern
$Password = InputBox("Anmeldeinformationen", "Geben Sie Ihr Passwort ein:", "", "*")
;Es wurde Abbrechen geklickt
If @error = 1 then ExitLoop
; Stellen Sie sicher, dass ein Passwort eingegeben wurde
If $Password = "" Then
MsgBox(16, "Fehler", "Kein Passwort eingegeben.")
ExitLoop
EndIf
;Anzahl Versuche hochzählen
$tries += 1
; Starten Sie PowerShell und übergeben Sie das Passwort
;StartSSH
_startSSH()
;SSHcommand
$PSCommand &= 'Invoke-SSHCommand -SSHSession $Session -Command \"' & $Command2 & '\" ; '
;SSH Sessioin beenden
_EndSSH()
$pid = Run($PSCommand, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
While 1
$line = StdoutRead($pid)
If @error Then ExitLoop
$output &= $line
WEnd
While 1
$line = StderrRead($pid)
If @error Then ExitLoop
$errorOutput &= $line
WEnd
If StringInStr($errorOutput, "Permission denied (keyboard-interactive)") Then
MsgBox(16, "Fehler", "Zugriff verweigert. Bitte überprüfen Sie das Passwort.")
;Prüfen ob zu viele Fehlversuche erreicht wurden.
If $tries = $maxfails then ExitLoop
Else
FileWrite("C:\log.txt", $output)
MsgBox(0, "Info", "Server wurde neu gestartet. Weitere Informationen finden Sie in C:\log.txt.")
ExitLoop
EndIf
WEnd
Func _StartSSH()
$PSCommand = 'powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "'
$PSCommand &= '$Username = \"root\" ; ' ; Hier ist der Benutzername festgelegt
$PSCommand &= '$Password = ConvertTo-SecureString -String \"' & $Password & '\" -AsPlainText -Force ; '
$PSCommand &= '$Credential = New-Object System.Management.Automation.PSCredential($Username, $Password) ; '
$PSCommand &= '$Session = New-SSHSession -ComputerName \"' & $ServerIP & '\" -Credential $Credential -Port 22 ; '
EndFunc
Func _EndSSH()
$PSCommand &= 'Remove-SSHSession -SSHSession $Session ; "'
EndFunc
Func _ErrorHandling()
EndFunc
Func _precheck()
If Not FileExists("C:\Program Files\PuTTY\pscp.exe") Then
ToolTip("Die Datei 'C:\Program Files\PuTTY\pscp.exe' wird jetzt bereitgestellt!", 0, 0)
Sleep(2000) ; 2 Sekunden warten
ToolTip("") ; Tooltip ausblenden
; Hier MSI-Installation durchführen
_InstallPSCP()
EndIf
; Überprüfen, ob der Server 192.168.100.33 im LAN erreichbar ist
; If Ping("192.168.100.33", 1000) Then
; ToolTip("Der verwendete PC darf sich nicht in der Domäne befinden, bitte offenes LAN nutzen !!!", 0, 0)
; Sleep(2000) ; 2 Sekunden warten
; ToolTip("") ; Tooltip ausblenden
; EndIf
; Überprüfen, ob der Server 192.168.100.50 im LAN erreichbar ist
If Ping("192.168.100.33", 1000) Then
ToolTip("Der verwendete PC darf sich nicht in der Domäne befinden, bitte offenes LAN nutzen !!!", 0, 0)
Sleep(2000) ; 2 Sekunden warten
ToolTip("") ; Tooltip ausblenden
SplashTextOn("", "Bitte offenes WLAN nutzen und noch mal probieren", 300, 110, @DesktopWidth - 320, @DesktopHeight - 80, $DLG_TEXTLEFT + $DLG_NOTITLE + $DLG_MOVEABLE, "Arial", 11, "")
Sleep(3000) ; 3 Sekunden warten
SplashOff()
Exit ; Beenden Sie das Skript, wenn der Server erreichbar ist
EndIf
EndFunc
Alles anzeigen
klingt gut, werde ich mich mal mit befassen, wenn mehr Zeit. Aber ich weiss jetzt warum es neulich nicht funktionierte, weil ich es in der Domänenumgebung versehentlich gestarten hatte, und da ist ssh leider gesperrt. Also kommt bei Fehleingabe des Passwortes der Text server wurde neu gestartet, passiet natürlich nix. Also fehlt nur noch ne Abfrage dass er dass dann nicht bringt sondern ein Fenster Bitte nicht in der Domänenumgebung verrwenden, also wenn Bedingung server 192.168.100.50 erreichbar (Domänenserver) aber an welche Stelle, dass ist hier die Frage
lg
und schönen Abend noch
Also mit dem Regex Ansatz müsste ich mich noch mal bei Gelegenheit genauer befassen, denke es muss aber auch nciht so kompliziert funktionieren, wenn man das auch mit stdout erledigen kann. So und nun habe ich noch mal geschaut und nun funktioniert komischerweise wieder meine vorversion bzw, auch deine angepasste Version, ganz merkwürdig.
lg
okidoki recht herzlichen Dank, werde ich morgen gleich mal testen
lg und schönen Abend noch