<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.ixheim.de/index.php?action=history&amp;feed=atom&amp;title=Vici_python_examples</id>
	<title>Vici python examples - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ixheim.de/index.php?action=history&amp;feed=atom&amp;title=Vici_python_examples"/>
	<link rel="alternate" type="text/html" href="https://wiki.ixheim.de/index.php?title=Vici_python_examples&amp;action=history"/>
	<updated>2026-11-12T20:07:09Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Xinux Wiki</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://wiki.ixheim.de/index.php?title=Vici_python_examples&amp;diff=16137&amp;oldid=prev</id>
		<title>Thomas: Die Seite wurde geleert.</title>
		<link rel="alternate" type="text/html" href="https://wiki.ixheim.de/index.php?title=Vici_python_examples&amp;diff=16137&amp;oldid=prev"/>
		<updated>2017-12-18T17:24:15Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde geleert.&lt;/p&gt;
&lt;a href=&quot;https://wiki.ixheim.de/index.php?title=Vici_python_examples&amp;amp;diff=16137&amp;amp;oldid=16136&quot;&gt;Änderungen zeigen&lt;/a&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.ixheim.de/index.php?title=Vici_python_examples&amp;diff=16136&amp;oldid=prev</id>
		<title>Thomas: Die Seite wurde neu angelegt: „ &lt;pre&gt; # This python script is *not* required to setup and run a tunnel, # rather it shows how an external python script can bring a tunnel up / down and monit…“</title>
		<link rel="alternate" type="text/html" href="https://wiki.ixheim.de/index.php?title=Vici_python_examples&amp;diff=16136&amp;oldid=prev"/>
		<updated>2017-12-18T17:23:50Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „ &amp;lt;pre&amp;gt; # This python script is *not* required to setup and run a tunnel, # rather it shows how an external python script can bring a tunnel up / down and monit…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# This python script is *not* required to setup and run a tunnel,&lt;br /&gt;
# rather it shows how an external python script can bring a tunnel up / down and monitor its status.&lt;br /&gt;
&lt;br /&gt;
import vici&lt;br /&gt;
import multiprocessing&lt;br /&gt;
import collections&lt;br /&gt;
import time&lt;br /&gt;
# NOTE: unless you are root you will need to do the following: sudo chmod 777 /var/run/charon.vici&lt;br /&gt;
&lt;br /&gt;
# Edit target_connections in the VState to include the VPN connections you would like to keep alive&lt;br /&gt;
# if this connection is dropped for some reason it will be re-started automatically by the python script&lt;br /&gt;
&lt;br /&gt;
class VState(object):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;holds the VPN state&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self.alive = True&lt;br /&gt;
        self.session = vici.Session()&lt;br /&gt;
        self.possible_connections = []&lt;br /&gt;
        self.target_connections = [&amp;#039;rw-2&amp;#039;]&lt;br /&gt;
        self.active_connections = []&lt;br /&gt;
    &lt;br /&gt;
class StrongSwan(object):&lt;br /&gt;
    def __init__(self,  queue = None):&lt;br /&gt;
        self.state = VState()&lt;br /&gt;
        self.get_possible_connections()&lt;br /&gt;
    &lt;br /&gt;
    def process_control_connection_in(self):&lt;br /&gt;
        &amp;#039;&amp;#039;&amp;#039;handle incoming mavlink packets&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
        pass&lt;br /&gt;
    &lt;br /&gt;
    def check_interfaces(self):&lt;br /&gt;
        state = self.state&lt;br /&gt;
        for vpn_conn in state.session.list_sas():&lt;br /&gt;
            for key in state.active_connections:&lt;br /&gt;
		try:&lt;br /&gt;
                   print &amp;#039;key&amp;#039;, key&lt;br /&gt;
                   print vpn_conn[key]&lt;br /&gt;
                   print vpn_conn[key][&amp;#039;established&amp;#039;]&lt;br /&gt;
                   print vpn_conn[key][&amp;#039;state&amp;#039;]&lt;br /&gt;
                   print vpn_conn[key][&amp;#039;local-host&amp;#039;]&lt;br /&gt;
                   print vpn_conn[key][&amp;#039;remote-host&amp;#039;]&lt;br /&gt;
		except:&lt;br /&gt;
		   pass&lt;br /&gt;
                &lt;br /&gt;
                try:&lt;br /&gt;
                    child = vpn_conn[key][&amp;#039;child-sas&amp;#039;]&lt;br /&gt;
                    if child == {}:&lt;br /&gt;
                        child = None&lt;br /&gt;
                except:&lt;br /&gt;
                    print &amp;#039;tunnel not connected at child level!&amp;#039;&lt;br /&gt;
                    child = None&lt;br /&gt;
                &lt;br /&gt;
                if child is not None:&lt;br /&gt;
                    for child_key in child:&lt;br /&gt;
                        &lt;br /&gt;
                        print &amp;#039;time: &amp;#039;, time.time(), &amp;#039;child key&amp;#039;, child_key, child[child_key][&amp;#039;bytes-in&amp;#039;], child[child_key][&amp;#039;bytes-out&amp;#039;]&lt;br /&gt;
                     &lt;br /&gt;
                        #print &amp;#039;packets&amp;#039;&lt;br /&gt;
                        #print &amp;#039;in: &amp;#039;, child[child_key][&amp;#039;packets-in&amp;#039;]&lt;br /&gt;
                        #print &amp;#039;out: &amp;#039;, child[child_key][&amp;#039;packets-out&amp;#039;]&lt;br /&gt;
                         &lt;br /&gt;
                        #print &amp;#039;bytes&amp;#039;&lt;br /&gt;
                        #print &amp;#039;in: &amp;#039;, child[child_key][&amp;#039;bytes-in&amp;#039;]&lt;br /&gt;
                        #print &amp;#039;out: &amp;#039;, child[child_key][&amp;#039;bytes-out&amp;#039;]&lt;br /&gt;
                     &lt;br /&gt;
                        #print child[child_key][&amp;#039;mode&amp;#039;]&lt;br /&gt;
                        #print &amp;#039;ip: &amp;#039;, child[child_key][&amp;#039;local-ts&amp;#039;]&lt;br /&gt;
                        #print child[child_key][&amp;#039;remote-ts&amp;#039;]&lt;br /&gt;
                        #print &amp;#039;key: &amp;#039;, child[child_key][&amp;#039;rekey-time&amp;#039;]&lt;br /&gt;
                        #print &amp;#039;life: &amp;#039;, child[child_key][&amp;#039;life-time&amp;#039;]&lt;br /&gt;
                    &lt;br /&gt;
                &lt;br /&gt;
                if key in state.target_connections and child is None:&lt;br /&gt;
                    self.connection_down(key)&lt;br /&gt;
                    self.connection_up(key)&lt;br /&gt;
        &lt;br /&gt;
        for key in state.target_connections:&lt;br /&gt;
            if key not in state.active_connections:&lt;br /&gt;
                #the connection is inactive&lt;br /&gt;
                self.connection_up(key)&lt;br /&gt;
                &lt;br /&gt;
        &lt;br /&gt;
    def connection_up(self, key):&lt;br /&gt;
        state = self.state&lt;br /&gt;
        print &amp;#039;up: &amp;#039;, key&lt;br /&gt;
	sa = collections.OrderedDict()&lt;br /&gt;
	sa[&amp;#039;child&amp;#039;] = key&lt;br /&gt;
	sa[&amp;#039;timeout&amp;#039;] = &amp;#039;2000&amp;#039;&lt;br /&gt;
	sa[&amp;#039;loglevel&amp;#039;] = &amp;#039;0&amp;#039;&lt;br /&gt;
	rep =state.session.initiate(sa)&lt;br /&gt;
	rep.next()&lt;br /&gt;
	rep.close()&lt;br /&gt;
	&lt;br /&gt;
        #TODO: handle errors, log?&lt;br /&gt;
        &lt;br /&gt;
    def connection_down(self, key):&lt;br /&gt;
        state = self.state&lt;br /&gt;
        print &amp;#039;down: &amp;#039;, key&lt;br /&gt;
	sa = collections.OrderedDict()&lt;br /&gt;
	sa[&amp;#039;ike&amp;#039;] = key&lt;br /&gt;
	sa[&amp;#039;timeout&amp;#039;] = &amp;#039;2000&amp;#039;&lt;br /&gt;
	sa[&amp;#039;loglevel&amp;#039;] = &amp;#039;0&amp;#039;&lt;br /&gt;
	rep =state.session.terminate(sa)&lt;br /&gt;
	rep.next()&lt;br /&gt;
	rep.close()&lt;br /&gt;
    &lt;br /&gt;
	#TODO: handle errors, log?&lt;br /&gt;
&lt;br /&gt;
    def get_possible_connections(self):&lt;br /&gt;
        &amp;#039;&amp;#039;&amp;#039;reset and repopulate possible connections based on /etc/ipsec.conf&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
        state = self.state&lt;br /&gt;
        state.possible_connections = []&lt;br /&gt;
        for conn in state.session.list_conns():&lt;br /&gt;
            for key in conn:&lt;br /&gt;
                state.possible_connections.append(key)&lt;br /&gt;
        &lt;br /&gt;
        print &amp;#039;p&amp;#039;,state.possible_connections&lt;br /&gt;
                &lt;br /&gt;
    def get_active_connections(self):&lt;br /&gt;
        state = self.state&lt;br /&gt;
        state.active_connections = []&lt;br /&gt;
        &lt;br /&gt;
        for conn in state.session.list_sas():&lt;br /&gt;
            for key in conn:&lt;br /&gt;
                state.active_connections.append(key)&lt;br /&gt;
        &lt;br /&gt;
        print &amp;#039;a&amp;#039;, state.active_connections&lt;br /&gt;
                &lt;br /&gt;
    def is_alive(self):&lt;br /&gt;
        return self.state.alive&lt;br /&gt;
&lt;br /&gt;
def main_loop():&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;main processing loop&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
    #make a strongSwan control object&lt;br /&gt;
    VPN = StrongSwan()&lt;br /&gt;
    while VPN.is_alive():&lt;br /&gt;
        VPN.process_control_connection_in()&lt;br /&gt;
        VPN.get_possible_connections()&lt;br /&gt;
        VPN.get_active_connections()&lt;br /&gt;
        VPN.check_interfaces()&lt;br /&gt;
        time.sleep(1.0)&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
    #run main loop as a process&lt;br /&gt;
    main = multiprocessing.Process(target=main_loop)&lt;br /&gt;
    main.start()&lt;br /&gt;
    main.join() &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
</feed>