mirror of
				https://github.com/CumulusNetworks/ifupdown2.git
				synced 2024-05-06 15:54:50 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			159 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/python3
 | |
| 
 | |
| import os
 | |
| import hashlib
 | |
| 
 | |
| try:
 | |
|     from ifupdown2.lib.addon import Addon
 | |
|     import ifupdown2.ifupdown.statemanager as statemanager
 | |
| 
 | |
|     from ifupdown2.ifupdown.iface import *
 | |
|     from ifupdown2.ifupdown.utils import utils
 | |
| 
 | |
|     from ifupdown2.ifupdownaddons.modulebase import moduleBase
 | |
| 
 | |
|     from ifupdown2.ifupdown.exceptions import moduleNotSupported
 | |
| except (ImportError, ModuleNotFoundError):
 | |
|     from lib.addon import Addon
 | |
|     import ifupdown.statemanager as statemanager
 | |
| 
 | |
|     from ifupdown.iface import *
 | |
|     from ifupdown.utils import utils
 | |
| 
 | |
|     from ifupdownaddons.modulebase import moduleBase
 | |
| 
 | |
|     from ifupdown.exceptions import moduleNotSupported
 | |
| 
 | |
| 
 | |
| class ppp(Addon, moduleBase):
 | |
|     """
 | |
|     ifupdown2 addon module to configure ppp
 | |
|     """
 | |
|     _modinfo = {
 | |
|         'mhelp': 'create/configure ppp interfaces',
 | |
|         'attrs': {
 | |
|             'provider': {
 | |
|                 'help': 'Provider file in ppp',
 | |
|                 'validvals': ['<text>'],
 | |
|                 'required': True,
 | |
|                 'example': ['dsl-provider']
 | |
|             },
 | |
|             'ppp-physdev': {
 | |
|                 'help': 'Physical underlay device to use for ppp if any',
 | |
|                 'validvals': ['<interface>'],
 | |
|                 'required': False,
 | |
|                 'example': ['ppp-physdev eth1']
 | |
|             },
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     def __init__(self, *args, **kargs):
 | |
|         Addon.__init__(self)
 | |
|         moduleBase.__init__(self, *args, **kargs)
 | |
|         if not os.path.exists('/usr/bin/pon'):
 | |
|             raise moduleNotSupported('module init failed: no /usr/bin/pon found')
 | |
| 
 | |
|     @staticmethod
 | |
|     def _is_my_interface(ifaceobj):
 | |
|         return ifaceobj.addr_method == "ppp" and ifaceobj.get_attr_value_first('provider')
 | |
| 
 | |
|     def _up(self, ifaceobj):
 | |
|         """
 | |
|         Up the PPP connection
 | |
|         """
 | |
|         provider = ifaceobj.get_attr_value_first('provider')
 | |
|         old_config = None
 | |
|         old_provider = None
 | |
| 
 | |
|         try:
 | |
|             ppp_file = os.path.join('/etc/ppp/peers', provider)
 | |
|             if not os.path.isfile(ppp_file):
 | |
|                 self.log_warn('Invalid ppp provider file does not exist')
 | |
|                 return
 | |
| 
 | |
|             # Load state data
 | |
|             saved_ifaceobjs = statemanager.statemanager_api.get_ifaceobjs(ifaceobj.name)
 | |
|             if saved_ifaceobjs:
 | |
|                 old_provider = saved_ifaceobjs[0].get_attr_value_first('provider')
 | |
|                 old_config = saved_ifaceobjs[0].get_attr_value_first('provider_file')
 | |
| 
 | |
|             config = hashlib.sha256(open(ppp_file, 'rb').read()).hexdigest()
 | |
|             # Always save the current config files hash
 | |
|             ifaceobj.update_config('provider_file', config)
 | |
| 
 | |
|             if not self.cache.link_exists(ifaceobj.name):
 | |
|                 try:
 | |
|                     # This fails if not running
 | |
|                     utils.exec_user_command('/bin/ps ax | /bin/grep pppd | /bin/grep -v grep | /bin/grep ' + provider)
 | |
|                 except Exception:
 | |
|                     utils.exec_commandl(['/usr/bin/pon', provider], stdout=None, stderr=None)
 | |
| 
 | |
|             if old_config and old_config != config:
 | |
|                 # Restart on config change
 | |
|                 utils.exec_commandl(['/usr/bin/poff', provider], stdout=None, stderr=None)
 | |
|                 utils.exec_commandl(['/usr/bin/pon', provider], stdout=None, stderr=None)
 | |
|             elif old_provider and old_provider != provider:
 | |
|                 # Restart on provider change
 | |
|                 utils.exec_commandl(['/usr/bin/poff', old_provider], stdout=None, stderr=None)
 | |
|                 utils.exec_commandl(['/usr/bin/pon', provider], stdout=None, stderr=None)
 | |
| 
 | |
|         except Exception as e:
 | |
|             self.log_warn(str(e))
 | |
| 
 | |
|     def _down(self, ifaceobj):
 | |
|         """
 | |
|         Down the PPP connection
 | |
|         """
 | |
|         try:
 | |
|             provider = ifaceobj.get_attr_value_first('provider')
 | |
|             # This fails if not running
 | |
|             utils.exec_user_command('/bin/ps ax | /bin/grep pppd | /bin/grep -v grep | /bin/grep ' + provider)
 | |
|             utils.exec_commandl(['/usr/bin/poff', provider], stdout=None, stderr=None)
 | |
|         except Exception as e:
 | |
|             self.log_warn(str(e))
 | |
| 
 | |
|     def get_dependent_ifacenames(self, ifaceobj, ifacenames_all=None):
 | |
|         if not self._is_my_interface(ifaceobj):
 | |
|             return None
 | |
| 
 | |
|         device = ifaceobj.get_attr_value_first('ppp-physdev')
 | |
| 
 | |
|         if device:
 | |
|             return [device]
 | |
| 
 | |
|         return None
 | |
| 
 | |
|     def _query_check(self, ifaceobj, ifaceobjcurr):
 | |
|         if not self.cache.link_exists(ifaceobj.name):
 | |
|             return
 | |
|         ifaceobjcurr.status = ifaceStatus.SUCCESS
 | |
| 
 | |
|     def _query_running(self, ifaceobjrunning):
 | |
|         if not self.cache.link_exists(ifaceobjrunning.name):
 | |
|             return
 | |
| 
 | |
|     # Operations supported by this addon (yet).
 | |
|     _run_ops = {
 | |
|         'pre-up': _up,
 | |
|         'down': _down,
 | |
|         'query-checkcurr': _query_check,
 | |
|         'query-running': _query_running,
 | |
|     }
 | |
| 
 | |
|     def get_ops(self):
 | |
|         return self._run_ops.keys()
 | |
| 
 | |
|     def run(self, ifaceobj, operation, query_ifaceobj=None, **extra_args):
 | |
|         op_handler = self._run_ops.get(operation)
 | |
| 
 | |
|         if not op_handler:
 | |
|             return
 | |
| 
 | |
|         if operation != 'query-running' and not self._is_my_interface(ifaceobj):
 | |
|             return
 | |
| 
 | |
|         if operation == 'query-checkcurr':
 | |
|             op_handler(self, ifaceobj, query_ifaceobj)
 | |
|         else:
 | |
|             op_handler(self, ifaceobj)
 |