Pexpect - OpenVPN als Subprozess starten funktioniert nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
defiance
User
Beiträge: 6
Registriert: Montag 21. April 2008, 02:29

Hallo,

ich möchte in einem Python Skript eine VPN Verbindung mit OpenVPN starten. Mein Code dazu lautet:

Code: Alles auswählen

#hashvalue und eventid sind zuvor im Programm definiert
openvpn = pexpect.spawn ('/usr/sbin/openvpn /etc/openvpn/client.conf')
openvpn.logfile = sys.stdout
openvpn.expect ('Enter Auth Username:')
time.sleep (1)
openvpn.sendline(eventid)
openvpn.expect ('Enter Auth Password:')
time.sleep (1)
openvpn.sendline(hashvalue)
time.sleep (30)
if openvpn.isalive():
		print "VPN geschlossen"
		openvpn.close()
Allerding funktioniert das auf diese Weise nicht wie gewünscht. Er startet das Programm und macht die Ein- und Ausgabe. Hier der Auszug von der Console eines Beispiels:

Code: Alles auswählen

USB-Stick angeschlossen
Enter Auth Username:22
22
Enter Auth Password:66f095b4d4e9c1875f74e35a895f30a97a00ae83
VPN geschlossen
Programm beenden
Wenn ich OpenVPN über das Init Skript starte anstatt das Programm direkt zu starten, funktioniert es. Jedoch verliere ich die Kontrolle über den Prozess und kann ihn nicht mehr schließen.
In dieser Version, scheint das Problem zu sein, dass auf Clientseite der Socket geschlossen wird, allerdings verstehe ich nicht warum. Hat jemand schon einmal etwas ähnliches programmiert und kennt die Lösung des Problems? An OpenVPN selber liegt es nicht, da ich von der Konsole aus normal gestartet werden kann. Anbei noch die Logfiles, falls sie euch mehr Aufschluss geben sollten als mir.

Der Fehler auf Seite des Server lautet:

Code: Alles auswählen

Sun May  4 00:42:04 2008 192.168.0.2:32770 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
Sun May  4 00:42:04 2008 192.168.0.2:32770 TLS Error: TLS handshake failed
Sun May  4 00:42:04 2008 192.168.0.2:32770 SIGUSR1[soft,tls-error] received, client-instance restarting
Und auf Serverseite:

Code: Alles auswählen

Sun May  4 00:39:05 2008 IMPORTANT: OpenVPN's default port number is now 1194, based on an official port number assignment by IANA.  OpenVPN 2.0-beta16 and earlier used 5000 as the default port.
Sun May  4 00:39:05 2008 WARNING: No server certificate verification method has been enabled.  See http://openvpn.net/howto.html#mitm for more info.
Sun May  4 00:39:05 2008 LZO compression initialized
Sun May  4 00:39:05 2008 Control Channel MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
Sun May  4 00:39:05 2008 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
Sun May  4 00:39:05 2008 Local Options hash (VER=V4): '41690919'
Sun May  4 00:39:05 2008 Expected Remote Options hash (VER=V4): '530fdded'
Sun May  4 00:39:05 2008 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
Sun May  4 00:39:05 2008 UDPv4 link local: [undef]
Sun May  4 00:39:05 2008 UDPv4 link remote: 192.168.0.1:1194
Sun May  4 00:39:05 2008 TLS: Initial packet from 192.168.0.1:1194, sid=fb2451e4 59eb9a81
Sun May  4 00:39:05 2008 VERIFY OK: depth=1, /C=DE/ST=RLP/L=KOBLENZ/O=SpogaSystem/OU=UniKo/CN=SpogaCA/emailAddress=hstridde@uni-koblenz.de
Sun May  4 00:39:05 2008 VERIFY OK: depth=0, /C=DE/ST=RLP/O=SpogaSystem/OU=UniKo/CN=SpogaServer/emailAddress=hstridde@uni-koblenz.de
Sun May  4 00:39:05 2008 TCP/UDP: Closing socket
Sun May  4 00:39:05 2008 SIGHUP[hard,] received, process restarting
Sun May  4 00:39:05 2008 OpenVPN 2.0.9 i486-pc-linux-gnu [SSL] [LZO] [EPOLL] built on Jan 21 2007
Sun May  4 00:39:05 2008 Restart pause, 2 second(s)
Sun May  4 00:39:05 2008 SIGINT[hard,init_instance] received, process exiting

defiance
User
Beiträge: 6
Registriert: Montag 21. April 2008, 02:29

Hallo,


das Problem hat sich doch noch lösen lassen. Der neue Code lautet nun ganz simpel:
Zum starten:

Code: Alles auswählen

pexpect.run ("/etc/init.d/openvpn start", events={'Starting virtual private network daemon: clientEnter Auth Username:':eventid+"\n", 'Enter Auth Password:':hashvalue+"\n"})
Zum Beenden

Code: Alles auswählen

pexpect.run ("/etc/init.d/openvpn stop")
Bei dieser Variante verliere ich auch nicht die Kontrolle über den Prozess und kann ihn somit entweder wieder im Programm oder über die Konsole beenden.
Antworten