]> git.llucax.com Git - software/pymin.git/blob - pymin/services/ppp/__init__.py
c57960069f3e2a08e18b37147328726418b36cc4
[software/pymin.git] / pymin / services / ppp / __init__.py
1 # vim: set encoding=utf-8 et sw=4 sts=4 :
2
3 from os import path
4
5 from pymin.seqtools import Sequence
6 from pymin.dispatcher import Handler, handler, HandlerError
7 from pymin.services.util import Restorable, ConfigWriter \
8                                 ,TransactionalHandler, DictSubHandler, call
9
10 __ALL__ = ('PppHandler')
11
12 class Error(HandlerError):
13     r"""
14     Error(command) -> Error instance :: Base ConnectionHandler exception class.
15
16     All exceptions raised by the ConnectionHandler inherits from this one, so you can
17     easily catch any ConnectionHandler exception.
18
19     message - A descriptive error message.
20     """
21     pass
22
23 class ConnectionError(Error, KeyError):
24     r"""
25     ConnectionError(hostname) -> ConnectionError instance
26
27     This is the base exception for all connection related errors.
28     """
29
30     def __init__(self, connection):
31         r"Initialize the object. See class documentation for more info."
32         self.message = u'Connection error: "%s"' % connection
33
34 class ConnectionNotFoundError(ConnectionError):
35     def __init__(self, connection):
36         r"Initialize the object. See class documentation for more info."
37         self.message = u'Connection not found error: "%s"' % connection
38
39 class Connection(Sequence):
40
41     def __init__(self, name, dev, username=None, password=None):
42         self.name = name
43         self.dev = dev
44         self.username = username
45         self.password = password
46
47     def as_tuple(self):
48         return (self.name, self.dev, self.username, self.password)
49
50     def update(self, dev=None, username=None, password=None):
51         if dev is not None:
52             self.dev = dev
53         if username is not None:
54             self.username = username
55         if password is not None:
56             self.password = password
57
58
59 class ConnectionHandler(DictSubHandler):
60
61     handler_help = u"Manages connections for the ppp service"
62
63     _dict_subhandler_attr = 'conns'
64     _dict_subhandler_class = Connection
65
66 class PppHandler(Restorable, ConfigWriter, TransactionalHandler):
67
68     handler_help = u"Manage ppp service"
69
70     _persistent_attrs = ('conns')
71
72     _restorable_defaults = dict(
73         conns  = dict(),
74     )
75
76     _config_writer_files = ('options.X','pap-secrets','nameX')
77     _config_writer_tpl_dir = path.join(path.dirname(__file__), 'templates')
78
79     def __init__(self, pickle_dir='.', config_dir='.'):
80         r"Initialize Ppphandler object, see class documentation for details."
81         self._persistent_dir = pickle_dir
82         self._config_writer_cfg_dir = config_dir
83         self._config_build_templates()
84         self._restore()
85         self.conn = ConnectionHandler(self)
86
87     @handler('Starts the service')
88     def start(self, name):
89         if name in self.conns:
90             #call(('pon', name))
91             print ('pon', name)
92         else:
93             raise ConnectionNotFoundError(name)
94
95     @handler('Stops the service')
96     def stop(self, name):
97         if name in self.conns:
98             #call(('poff', name))
99             print ('poff', name)
100         else:
101             raise ConnectionNotFoundError(name)
102
103     @handler('Reloads the service')
104     def reload(self):
105         for conn in self.conns.values():
106             self.stop(conn.name)
107             self.start(conn.name)
108
109     def _write_config(self):
110         r"_write_config() -> None :: Generate all the configuration files."
111         vars = dict(conns=self.conns)
112         self._write_single_config('pap-secrets','pap-secrets',vars)
113         for conn in self.conns.values():
114             vars = dict(conn=conn)
115             self._write_single_config('nameX',conn.name, vars)
116             self._write_single_config('options.X','options.' + conn.name, vars)
117
118
119 if __name__ == '__main__':
120     p = PppHandler()
121     p.conn.add('test2','tty2','luca','luca')
122     p.commit()
123     print p.conn.list()
124     print p.conn.show()