]>
git.proxmox.com Git - mirror_ifupdown2.git/blob - ifupdown2/addons/xfrm.py
3 # Copyright 2019 Voleatech GmbH. All rights reserved.
4 # Author: Sven Auhagen, sven.auhagen@voleatech.de
11 from ipaddr
import IPNetwork
, IPv6Network
14 from ifupdown2
.ifupdown
.iface
import *
15 from ifupdown2
.ifupdown
.utils
import utils
16 from ifupdown2
.ifupdown
.netlink
import netlink
18 from ifupdown2
.ifupdownaddons
.LinkUtils
import LinkUtils
19 from ifupdown2
.ifupdownaddons
.modulebase
import moduleBase
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
26 from ifupdown
.iface
import *
27 from ifupdown
.utils
import utils
28 from ifupdown
.netlink
import netlink
30 from ifupdownaddons
.LinkUtils
import LinkUtils
31 from ifupdownaddons
.modulebase
import moduleBase
33 import ifupdown
.statemanager
as statemanager
34 import ifupdown
.policymanager
as policymanager
35 import ifupdown
.ifupdownflags
as ifupdownflags
36 import ifupdown
.ifupdownconfig
as ifupdownconfig
39 class xfrm(moduleBase
):
40 """ ifupdown2 addon module to create a xfrm interface """
41 _modinfo
= {'mhelp' : 'xfrm module creates a xfrm interface for',
45 'validrange' : ['1', '65535'],
46 'example': ['xfrm-id 1']
49 {'help': 'xfrm physical device',
50 'example': ['xfrm-physdev lo']
56 def __init__(self
, *args
, **kargs
):
57 moduleBase
.__init
__(self
, *args
, **kargs
)
60 def get_dependent_ifacenames(self
, ifaceobj
, ifacenames_all
=None):
62 parent_int
= self
._get
_parent
_ifacename
(ifaceobj
)
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')
75 def _get_xfrmid(self
, ifaceobj
):
76 if ifaceobj
.get_attr_value('xfrm-id'):
77 av_attr
= ifaceobj
.get_attr_value_first('xfrm-id')
82 def _get_xfrm_name(self
, ifaceobj
):
86 def _is_my_interface(ifaceobj
):
87 return ifaceobj
.get_attr_value_first('xfrm-id')
89 def _up(self
, ifaceobj
):
93 # Create a xfrm device on this device and set the virtual
94 # router mac and ip on it
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
):
101 netlink
.link_add_xfrm(physdev
, xfrm_ifacename
, xfrmid
)
103 self
.ipcmd
.link_add_xfrm(physdev
, xfrm_ifacename
, xfrmid
)
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)
110 if xfrmid
!= xfrmid_cur
or physdev
!= physdev_cur
:
111 # Delete and recreate
112 self
.ipcmd
.link_delete(xfrm_ifacename
)
114 netlink
.link_add_xfrm(physdev
, xfrm_ifacename
, xfrmid
)
116 self
.ipcmd
.link_add_xfrm(physdev
, xfrm_ifacename
, xfrmid
)
119 def _down(self
, ifaceobj
, ifaceobj_getfunc
=None):
121 Down the XFRM Interface
124 xfrm_ifacename
= self
._get
_xfrm
_name
(ifaceobj
)
125 self
.ipcmd
.link_delete(xfrm_ifacename
)
127 self
.log_warn(str(e
))
129 def _query_check(self
, ifaceobj
, ifaceobjcurr
):
130 if not self
.ipcmd
.link_exists(ifaceobj
.name
):
132 ifaceobjcurr
.status
= ifaceStatus
.SUCCESS
134 def _query_running(self
, ifaceobjrunning
):
135 if not self
.ipcmd
.link_exists(ifaceobjrunning
.name
):
138 # Operations supported by this addon (yet).
142 'query-checkcurr': _query_check
,
143 'query-running': _query_running
,
147 return self
._run
_ops
.keys()
149 def _init_command_handlers(self
):
151 self
.ipcmd
= LinkUtils()
153 def run(self
, ifaceobj
, operation
, query_ifaceobj
=None, **extra_args
):
154 op_handler
= self
._run
_ops
.get(operation
)
159 if operation
!= 'query-running' and not self
._is
_my
_interface
(ifaceobj
):
162 self
._init
_command
_handlers
()
163 if operation
== 'query-checkcurr':
164 op_handler(self
, ifaceobj
, query_ifaceobj
)
166 op_handler(self
, ifaceobj
)