]> git.proxmox.com Git - mirror_ifupdown2.git/blob - ifupdown2/addons/xfrm.py
xfrm id
[mirror_ifupdown2.git] / ifupdown2 / addons / xfrm.py
1 #!/usr/bin/python
2 #
3 # Copyright 2019 Voleatech GmbH. All rights reserved.
4 # Author: Sven Auhagen, sven.auhagen@voleatech.de
5 #
6
7 import os
8 import glob
9 import socket
10
11 from ipaddr import IPNetwork, IPv6Network
12
13 try:
14 from ifupdown2.ifupdown.iface import *
15 from ifupdown2.ifupdown.utils import utils
16 from ifupdown2.ifupdown.netlink import netlink
17
18 from ifupdown2.ifupdownaddons.LinkUtils import LinkUtils
19 from ifupdown2.ifupdownaddons.modulebase import moduleBase
20
21 import ifupdown2.ifupdown.statemanager as statemanager
22 import ifupdown2.ifupdown.policymanager as policymanager
23 import ifupdown2.ifupdown.ifupdownflags as ifupdownflags
24 import ifupdown2.ifupdown.ifupdownconfig as ifupdownconfig
25 except ImportError:
26 from ifupdown.iface import *
27 from ifupdown.utils import utils
28 from ifupdown.netlink import netlink
29
30 from ifupdownaddons.LinkUtils import LinkUtils
31 from ifupdownaddons.modulebase import moduleBase
32
33 import ifupdown.statemanager as statemanager
34 import ifupdown.policymanager as policymanager
35 import ifupdown.ifupdownflags as ifupdownflags
36 import ifupdown.ifupdownconfig as ifupdownconfig
37
38
39 class xfrm(moduleBase):
40 """ ifupdown2 addon module to create a xfrm interface """
41 _modinfo = {'mhelp' : 'xfrm module creates a xfrm interface for',
42 'attrs' : {
43 'xfrm-id' :
44 { 'help' : 'xfrm id',
45 'validrange' : ['1', '65535'],
46 'example': ['xfrm-id 1']
47 },
48 'xfrm-physdev':
49 {'help': 'xfrm physical device',
50 'example': ['xfrm-physdev lo']
51 },
52 },
53 }
54
55
56 def __init__(self, *args, **kargs):
57 moduleBase.__init__(self, *args, **kargs)
58 self.ipcmd = None
59
60 def get_dependent_ifacenames(self, ifaceobj, ifacenames_all=None):
61
62 parent_int = self._get_parent_ifacename(ifaceobj)
63 if parent_int:
64 return [parent_int]
65
66 return None
67
68 def _get_parent_ifacename(self, ifaceobj):
69 if ifaceobj.get_attr_value('xfrm-physdev'):
70 av_attr = ifaceobj.get_attr_value_first('xfrm-physdev')
71 return av_attr
72
73 return None
74
75 def _get_xfrmid(self, ifaceobj):
76 if ifaceobj.get_attr_value('xfrm-id'):
77 av_attr = ifaceobj.get_attr_value_first('xfrm-id')
78 return av_attr
79
80 return None
81
82 def _get_xfrm_name(self, ifaceobj):
83 return ifaceobj.name
84
85 @staticmethod
86 def _is_my_interface(ifaceobj):
87 return ifaceobj.get_attr_value_first('xfrm-id')
88
89 def _up(self, ifaceobj):
90 """
91 Up the XFRM Interface
92 """
93 # Create a xfrm device on this device and set the virtual
94 # router mac and ip on it
95 link_created = False
96 xfrm_ifacename = self._get_xfrm_name(ifaceobj)
97 physdev = self._get_parent_ifacename(ifaceobj)
98 xfrmid = self._get_xfrmid(ifaceobj)
99 if not self.ipcmd.link_exists(xfrm_ifacename):
100 try:
101 netlink.link_add_xfrm(physdev, xfrm_ifacename, xfrmid)
102 except:
103 self.ipcmd.link_add_xfrm(physdev, xfrm_ifacename, xfrmid)
104 link_created = True
105 else:
106 current_attrs = self.ipcmd.link_get_linkinfo_attrs(ifaceobj.name)
107 xfrmid_cur = current_attrs.get('xfrm-id', None)
108 physdev_cur = current_attrs.get('xfrm-physdev', None)
109 # Check XFRM Values
110 if xfrmid != xfrmid_cur or physdev != physdev_cur:
111 # Delete and recreate
112 self.ipcmd.link_delete(xfrm_ifacename)
113 try:
114 netlink.link_add_xfrm(physdev, xfrm_ifacename, xfrmid)
115 except:
116 self.ipcmd.link_add_xfrm(physdev, xfrm_ifacename, xfrmid)
117 link_created = True
118
119 def _down(self, ifaceobj, ifaceobj_getfunc=None):
120 """
121 Down the XFRM Interface
122 """
123 try:
124 xfrm_ifacename = self._get_xfrm_name(ifaceobj)
125 self.ipcmd.link_delete(xfrm_ifacename)
126 except Exception, e:
127 self.log_warn(str(e))
128
129 def _query_check(self, ifaceobj, ifaceobjcurr):
130 if not self.ipcmd.link_exists(ifaceobj.name):
131 return
132 ifaceobjcurr.status = ifaceStatus.SUCCESS
133
134 def _query_running(self, ifaceobjrunning):
135 if not self.ipcmd.link_exists(ifaceobjrunning.name):
136 return
137
138 # Operations supported by this addon (yet).
139 _run_ops = {
140 'pre-up': _up,
141 'post-down': _down,
142 'query-checkcurr': _query_check,
143 'query-running': _query_running,
144 }
145
146 def get_ops(self):
147 return self._run_ops.keys()
148
149 def _init_command_handlers(self):
150 if not self.ipcmd:
151 self.ipcmd = LinkUtils()
152
153 def run(self, ifaceobj, operation, query_ifaceobj=None, **extra_args):
154 op_handler = self._run_ops.get(operation)
155
156 if not op_handler:
157 return
158
159 if operation != 'query-running' and not self._is_my_interface(ifaceobj):
160 return
161
162 self._init_command_handlers()
163 if operation == 'query-checkcurr':
164 op_handler(self, ifaceobj, query_ifaceobj)
165 else:
166 op_handler(self, ifaceobj)