This way it can be used by the client as well
Signed-off-by: Guido Trotter <[email protected]>
---
daemons/ganeti-confd | 18 ++++++------------
lib/confd/__init__.py | 30 +++++++++++++++++++++++++++++-
lib/errors.py | 8 ++++++++
3 files changed, 43 insertions(+), 13 deletions(-)
diff --git a/daemons/ganeti-confd b/daemons/ganeti-confd
index f64c796..22e1637 100755
--- a/daemons/ganeti-confd
+++ b/daemons/ganeti-confd
@@ -43,6 +43,7 @@ from ganeti import daemon
from ganeti import ssconf
from ganeti.asyncnotifier import AsyncNotifier
from ganeti.confd.server import ConfdProcessor
+from ganeti.confd import PackMagic, UnpackMagic
class ConfdAsyncUDPServer(daemon.AsyncUDPSocket):
@@ -69,23 +70,16 @@ class ConfdAsyncUDPServer(daemon.AsyncUDPSocket):
# this method is overriding a daemon.AsyncUDPSocket method
def handle_datagram(self, payload_in, ip, port):
-
- if len(payload_in) < len(constants.CONFD_MAGIC_FOURCC):
- logging.debug("Received a query which is too short to be true")
- return
-
- magic_number = payload_in[:4]
- query = payload_in[4:]
-
- if magic_number != constants.CONFD_MAGIC_FOURCC:
- logging.debug("Received a query with an unknown magic number")
+ try:
+ query = UnpackMagic(payload_in)
+ except errors.ConfdMagicError, err:
+ logging.debug(err)
return
answer = self.processor.ExecQuery(query, ip, port)
if answer is not None:
- payload_out = ''.join([constants.CONFD_MAGIC_FOURCC, answer])
try:
- self.enqueue_send(ip, port, payload_out)
+ self.enqueue_send(ip, port, PackMagic(answer))
except errors.UdpDataSizeError:
logging.error("Reply too big to fit in an udp packet.")
diff --git a/lib/confd/__init__.py b/lib/confd/__init__.py
index 786de1b..4a8ac78 100644
--- a/lib/confd/__init__.py
+++ b/lib/confd/__init__.py
@@ -19,6 +19,34 @@
# 02110-1301, USA.
-"""Ganeti confd library
+"""Ganeti confd client/server library
"""
+
+from ganeti import constants
+
+
+_FOURCC_LEN = 4
+
+
+def PackMagic(payload):
+ """Prepend the confd magic fourcc to a payload.
+
+ """
+ return ''.join([constants.CONFD_MAGIC_FOURCC, payload])
+
+
+def UnpackMagic(payload):
+ """Unpack and check the confd magic fourcc from a payload.
+
+ """
+ if len(payload) < _FOURCC_LEN:
+ raise errors.ConfdMagicError("UDP payload too short to contain the"
+ " fourcc code")
+
+ magic_number = payload[:_FOURCC_LEN]
+ if magic_number != constants.CONFD_MAGIC_FOURCC:
+ raise errors.ConfdMagicError("UDP payload contains an unkown fourcc")
+
+ return payload[_FOURCC_LEN:]
+
diff --git a/lib/errors.py b/lib/errors.py
index 663bc02..9136c5e 100644
--- a/lib/errors.py
+++ b/lib/errors.py
@@ -297,6 +297,14 @@ class ConfdRequestError(GenericError):
"""
+class ConfdMagicError(GenericError):
+ """A magic fourcc error in Ganeti confd.
+
+ Errors processing the fourcc in ganeti confd datagrams.
+
+ """
+
+
class UdpDataSizeError(GenericError):
"""UDP payload too big.
--
1.5.6.5