]> git.proxmox.com Git - mirror_ifupdown2.git/blob - addons/ppp.py
Merge pull request #80 from BarbarossaTM/tunnel-fixes-master
[mirror_ifupdown2.git] / addons / ppp.py
1 #!/usr/bin/python
2
3 try:
4 import os
5 import ifupdown.statemanager as statemanager
6 import ifupdown.ifupdownflags as ifupdownflags
7 import logging
8 import hashlib
9 from ifupdown.iface import *
10 from ifupdown.utils import utils
11 from ifupdownaddons.modulebase import moduleBase
12 from ifupdownaddons.iproute2 import iproute2
13 from ifupdown.netlink import netlink
14 from ifupdown.exceptions import moduleNotSupported
15 except ImportError, e:
16 raise ImportError (str(e) + "- required module not found")
17
18 class ppp (moduleBase):
19 _modinfo = { 'mhelp' : 'create/configure ppp interfaces',
20 'attrs' : {
21 'provider' :
22 { 'help' : 'Provider file in ppp',
23 'validvals' : ['<text>'],
24 'required' : True,
25 'example' : ['dsl-provider']},
26 'ppp-physdev' :
27 { 'help' : 'Physical underlay device to use for ppp if any',
28 'validvals' : ['<interface>'],
29 'required' : False,
30 'example' : ['ppp-physdev eth1']},
31 }
32 }
33
34
35 def __init__ (self, *args, **kargs):
36 moduleBase.__init__ (self, *args, **kargs)
37 if not os.path.exists('/usr/bin/pon'):
38 raise moduleNotSupported('module init failed: no /usr/bin/pon found')
39 self.ipcmd = None
40
41 def _is_my_interface (self, ifaceobj):
42 if ifaceobj.addr_method == "ppp" and ifaceobj.get_attr_value_first ('provider'):
43 return True
44 return False
45
46 def _up (self, ifaceobj):
47 '''
48 Up the PPP connection
49 '''
50 provider = ifaceobj.get_attr_value_first ('provider')
51 old_config = None
52 old_provider = None
53
54 try:
55 ppp_file = os.path.join('/etc/ppp/peers', provider)
56 if not os.path.isfile(ppp_file):
57 self.log_warn('Invalid ppp provider file does not exist')
58 return
59
60 # Load state data
61 saved_ifaceobjs = statemanager.statemanager_api.get_ifaceobjs(ifaceobj.name)
62 if saved_ifaceobjs:
63 old_provider = saved_ifaceobjs[0].get_attr_value_first ('provider')
64 old_config = saved_ifaceobjs[0].get_attr_value_first ('provider_file')
65
66 config = hashlib.sha256(open(ppp_file, 'rb').read()).hexdigest()
67 # Always save the current config files hash
68 ifaceobj.update_config('provider_file', config)
69
70 if not self.ipcmd.link_exists(ifaceobj.name):
71 utils.exec_commandl(['/usr/bin/pon', provider], stdout=None, stderr=None)
72 elif old_config and old_config != config:
73 # Restart on config change
74 utils.exec_commandl(['/usr/bin/poff', provider], stdout=None, stderr=None)
75 utils.exec_commandl(['/usr/bin/pon', provider], stdout=None, stderr=None)
76 elif old_provider and old_provider != provider:
77 # Restart on provider change
78 utils.exec_commandl(['/usr/bin/poff', old_provider], stdout=None, stderr=None)
79 utils.exec_commandl(['/usr/bin/pon', provider], stdout=None, stderr=None)
80
81 except Exception, e:
82 self.log_warn (str (e))
83
84 def _down (self, ifaceobj):
85 if not ifupdownflags.flags.PERFMODE and not self.ipcmd.link_exists (ifaceobj.name):
86 return
87 try:
88 provider = ifaceobj.get_attr_value_first ('provider')
89 utils.exec_commandl(['/usr/bin/poff', provider], stdout=None, stderr=None)
90 except Exception, e:
91 self.log_warn (str (e))
92
93 def get_dependent_ifacenames(self, ifaceobj, ifacenames_all=None):
94 if not self._is_my_interface(ifaceobj):
95 return None
96
97 device = ifaceobj.get_attr_value_first ('ppp-physdev')
98 if device:
99 return [device]
100
101 return None
102
103 def _query_check (self, ifaceobj, ifaceobjcurr):
104 if not self.ipcmd.link_exists(ifaceobj.name):
105 return
106
107 ifaceobjcurr.status = ifaceStatus.SUCCESS
108
109 def _query_running(self, ifaceobjrunning):
110 if not self.ipcmd.link_exists(ifaceobjrunning.name):
111 return
112
113 # Operations supported by this addon (yet).
114 _run_ops = {
115 'pre-up' : _up,
116 'post-down' : _down,
117 'query-checkcurr' : _query_check,
118 'query-running' : _query_running,
119 }
120
121 def get_ops (self):
122 return self._run_ops.keys()
123
124 def _init_command_handlers (self):
125 if not self.ipcmd:
126 self.ipcmd = iproute2 ()
127
128 def run (self, ifaceobj, operation, query_ifaceobj = None, **extra_args):
129 op_handler = self._run_ops.get (operation)
130 if not op_handler:
131 return
132
133 if operation != 'query-running' and not self._is_my_interface (ifaceobj):
134 return
135
136 self._init_command_handlers ()
137 if operation == 'query-checkcurr':
138 op_handler (self, ifaceobj, query_ifaceobj)
139 else:
140 op_handler (self, ifaceobj)