]>
Commit | Line | Data |
---|---|---|
ca42da72 SA |
1 | #!/usr/bin/python |
2 | # | |
c5e4ed15 | 3 | # Copyright 2019 Voleatech GmbH. All rights reserved. |
4 | # Author: Sven Auhagen, sven.auhagen@voleatech.de | |
ca42da72 SA |
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' : { | |
bff520b1 | 43 | 'xfrm-id' : |
ca42da72 SA |
44 | { 'help' : 'xfrm id', |
45 | 'validrange' : ['1', '65535'], | |
bff520b1 | 46 | 'example': ['xfrm-id 1'] |
ca42da72 SA |
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): | |
bff520b1 SA |
76 | if ifaceobj.get_attr_value('xfrm-id'): |
77 | av_attr = ifaceobj.get_attr_value_first('xfrm-id') | |
ca42da72 SA |
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): | |
bff520b1 | 87 | return ifaceobj.get_attr_value_first('xfrm-id') |
ca42da72 SA |
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) | |
bff520b1 | 107 | xfrmid_cur = current_attrs.get('xfrm-id', None) |
ca42da72 SA |
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) |