]> git.stg.codes - stg.git/commitdiff
SMUX plugin code separated to SNMP helper functions and core logic
authorMaxim Mamontov <faust.madf@gmail.com>
Mon, 25 Jul 2011 18:52:18 +0000 (21:52 +0300)
committerMaxim Mamontov <faust.madf@gmail.com>
Mon, 25 Jul 2011 18:52:18 +0000 (21:52 +0300)
projects/stargazer/plugins/other/smux/Makefile
projects/stargazer/plugins/other/smux/handlers.cpp
projects/stargazer/plugins/other/smux/pen.h [new file with mode: 0644]
projects/stargazer/plugins/other/smux/smux.cpp
projects/stargazer/plugins/other/smux/smux.h
projects/stargazer/plugins/other/smux/utils.cpp [new file with mode: 0644]
projects/stargazer/plugins/other/smux/utils.h [new file with mode: 0644]

index 82c6af9a873a1f1c0b86152f38514e5215036a9d..e94fdcda5d8d8c47e31e2f547dd7c38741bb8fd2 100644 (file)
@@ -7,6 +7,7 @@ PROG = mod_smux.so
 SRCS =  smux.cpp \
        sensors.cpp \
        handlers.cpp \
+       utils.cpp \
        asn1/DisplayString.c \
        asn1/PhysAddress.c \
        asn1/IfEntry.c \
index 5a8c917d7a5c01927faaa56ca92ed84420399af4..bc8b60eb6ab721d73a3628bf00b134736bbc6618 100644 (file)
@@ -1,25 +1,13 @@
-#include "asn1/OpenPDU.h"
-#include "asn1/ClosePDU.h"
-#include "asn1/RReqPDU.h"
 #include "asn1/GetRequest-PDU.h"
 #include "asn1/GetResponse-PDU.h"
 #include "asn1/VarBindList.h"
 #include "asn1/VarBind.h"
-#include "asn1/OBJECT_IDENTIFIER.h"
-#include "asn1/ber_decoder.h"
-#include "asn1/der_encoder.h"
 
 #include "stg/common.h"
 
+#include "utils.h"
 #include "smux.h"
 
-std::string OI2String(OBJECT_IDENTIFIER_t * oi);
-int SendGetResponsePDU(int fd, GetResponse_PDU_t * getResponse);
-int SendGetResponseErrorPDU(int fd,
-                            const PDU_t * getRequest,
-                            int errorStatus,
-                            int errorIndex);
-
 bool SMUX::CloseHandler(const SMUX_PDUs_t * pdus)
 {
 printfd(__FILE__, "SMUX::CloseHandler()\n");
@@ -159,81 +147,3 @@ SendGetResponseErrorPDU(sock, &pdus->choice.set_request,
                         PDU__error_status_readOnly, 0);
 return false;
 }
-
-std::string OI2String(OBJECT_IDENTIFIER_t * oi)
-{
-std::string res;
-
-int arcs[1024];
-int count = OBJECT_IDENTIFIER_get_arcs(oi, arcs, sizeof(arcs[0]), 1024);
-
-if (count > 1024)
-    return "";
-
-for (int i = 0; i < count; ++i)
-    {
-    res += ".";
-    std::string arc;
-    strprintf(&arc, "%d", arcs[i]);
-    res += arc;
-    }
-
-return res;
-}
-
-int SendGetResponsePDU(int fd, GetResponse_PDU_t * getResponse)
-{
-asn_enc_rval_t error;
-
-char buffer[1024];
-error = der_encode_to_buffer(&asn_DEF_GetResponse_PDU, getResponse, buffer,
-                             sizeof(buffer));
-
-if (error.encoded == -1)
-    {
-    printfd(__FILE__, "Could not encode GetResponsePDU (at %s)\n",
-            error.failed_type ? error.failed_type->name : "unknown");
-    return -1;
-    }
-else
-    {
-    write(fd, buffer, error.encoded);
-    printfd(__FILE__, "GetResponsePDU encoded successfully to %d bytes\n",
-            error.encoded);
-    }
-return 0;
-}
-
-int SendGetResponseErrorPDU(int fd,
-                            const PDU_t * getRequest,
-                            int errorStatus,
-                            int errorIndex)
-{
-asn_enc_rval_t error;
-GetResponse_PDU_t msg;
-
-memset(&msg, 0, sizeof(msg));
-
-msg.request_id = getRequest->request_id;
-asn_long2INTEGER(&msg.error_status, errorStatus);
-asn_long2INTEGER(&msg.error_index, errorIndex);
-
-char buffer[1024];
-error = der_encode_to_buffer(&asn_DEF_GetResponse_PDU, &msg, buffer,
-                             sizeof(buffer));
-
-if (error.encoded == -1)
-    {
-    printfd(__FILE__, "Could not encode GetResponsePDU for error (at %s)\n",
-            error.failed_type ? error.failed_type->name : "unknown");
-    return -1;
-    }
-else
-    {
-    write(fd, buffer, error.encoded);
-    printfd(__FILE__,
-            "GetResponsePDU for error encoded successfully to %d bytes\n",
-            error.encoded);
-    }
-return 0;
-}
diff --git a/projects/stargazer/plugins/other/smux/pen.h b/projects/stargazer/plugins/other/smux/pen.h
new file mode 100644 (file)
index 0000000..45989bd
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __PEN_H__
+#define __PEN_H__
+
+#define PEN_PREFIX ".1.3.6.1.4.1.38313"
+
+#endif
index bd83f1ab38b914a5da9d4792eb74f466b85f2c98..14f47da3c5e5b21b2f11b9e0a4d3d6fba2982ed6 100644 (file)
 #include <vector>
 #include <algorithm>
 
-#include "asn1/OpenPDU.h"
-#include "asn1/ClosePDU.h"
-#include "asn1/RReqPDU.h"
-#include "asn1/GetRequest-PDU.h"
-#include "asn1/GetResponse-PDU.h"
-#include "asn1/VarBindList.h"
-#include "asn1/VarBind.h"
-#include "asn1/OBJECT_IDENTIFIER.h"
-#include "asn1/ber_decoder.h"
-#include "asn1/der_encoder.h"
-
 #include "stg/common.h"
 
 #include "smux.h"
-
-bool WaitPackets(int sd);
-
-bool String2OI(const std::string & str, OBJECT_IDENTIFIER_t * oi)
-{
-size_t left = 0, pos = 0, arcPos = 0;
-int arcs[1024];
-pos = str.find_first_of('.', left);
-if (pos == 0)
-    {
-    left = 1;
-    pos = str.find_first_of('.', left);
-    }
-while (pos != std::string::npos)
-    {
-    int arc = 0;
-    if (str2x(str.substr(left, left - pos), arc))
-        {
-        return false;
-        }
-    arcs[arcPos++] = arc;
-    left = pos + 1;
-    pos = str.find_first_of('.', left);
-    }
-if (left < str.length())
-    {
-    int arc = 0;
-    if (str2x(str.substr(left, left - pos), arc))
-        {
-        return false;
-        }
-    arcs[arcPos++] = arc;
-    }
-printfd(__FILE__, "String2OI() - arcPos: %d\n", arcPos);
-OBJECT_IDENTIFIER_set_arcs(oi, arcs, sizeof(arcs[0]), arcPos);
-return true;
-}
+#include "utils.h"
 
 class SMUX_CREATOR
 {
@@ -81,124 +34,6 @@ PLUGIN * GetPlugin()
 return sac.GetPlugin();
 }
 
-int SendOpenPDU(int fd)
-{
-const char * description = "Stg SMUX Plugin";
-//int oid[] = {1, 3, 6, 1, 4, 1, 38313, 1, 5, 2, 1, 1};
-asn_enc_rval_t error;
-OpenPDU_t msg;
-
-memset(&msg, 0, sizeof(msg));
-
-msg.present = OpenPDU_PR_simple;
-asn_long2INTEGER(&msg.choice.simple.version, SimpleOpen__version_version_1);
-if (!String2OI(".1.3.6.1.4.1.38313", &msg.choice.simple.identity))
-    {
-    printfd(__FILE__,
-            "SendOpenPDU() - failed to convert string to OBJECT_IDENTIFIER\n");
-    return -1;
-    }
-OCTET_STRING_fromString(&msg.choice.simple.description, description);
-OCTET_STRING_fromString(&msg.choice.simple.password, "");
-
-char buffer[1024];
-error = der_encode_to_buffer(&asn_DEF_OpenPDU, &msg, buffer, sizeof(buffer));
-
-if (error.encoded == -1)
-    {
-    printfd(__FILE__, "Could not encode OpenPDU (at %s)\n",
-            error.failed_type ? error.failed_type->name : "unknown");
-    return -1;
-    }
-else
-    {
-    write(fd, buffer, error.encoded);
-    printfd(__FILE__, "OpenPDU encoded successfully to %d bytes\n",
-            error.encoded);
-    }
-return 0;
-}
-
-int SendClosePDU(int fd)
-{
-ClosePDU_t msg;
-
-memset(&msg, 0, sizeof(msg));
-
-asn_long2INTEGER(&msg, ClosePDU_goingDown);
-
-char buffer[1024];
-asn_enc_rval_t error;
-error = der_encode_to_buffer(&asn_DEF_ClosePDU, &msg, buffer, sizeof(buffer));
-
-if (error.encoded == -1)
-    {
-    printfd(__FILE__, "Could not encode ClosePDU (at %s)\n",
-            error.failed_type ? error.failed_type->name : "unknown");
-    return -1;
-    }
-else
-    {
-    write(fd, buffer, error.encoded);
-    printfd(__FILE__, "ClosePDU encoded successfully\n");
-    }
-return 0;
-}
-
-int SendRReqPDU(int fd)
-{
-int oid[] = {1, 3, 6, 1, 4, 1, 38313, 1};
-asn_enc_rval_t error;
-RReqPDU_t msg;
-
-memset(&msg, 0, sizeof(msg));
-
-msg.priority = 0;
-asn_long2INTEGER(&msg.operation, RReqPDU__operation_readOnly);
-OBJECT_IDENTIFIER_set_arcs(&msg.subtree,
-                           oid,
-                           sizeof(oid[0]),
-                           8);
-
-char buffer[1024];
-error = der_encode_to_buffer(&asn_DEF_RReqPDU, &msg, buffer, sizeof(buffer));
-
-if (error.encoded == -1)
-    {
-    printfd(__FILE__, "Could not encode RReqPDU (at %s)\n",
-            error.failed_type ? error.failed_type->name : "unknown");
-    return -1;
-    }
-else
-    {
-    write(fd, buffer, error.encoded);
-    printfd(__FILE__, "RReqPDU encoded successfully to %d bytes\n",
-            error.encoded);
-    }
-return 0;
-}
-
-SMUX_PDUs_t * RecvSMUXPDUs(int fd)
-{
-char buffer[1024];
-SMUX_PDUs_t * pdus = NULL;
-
-memset(buffer, 0, sizeof(buffer));
-
-size_t length = read(fd, buffer, sizeof(buffer));
-if (length < 1)
-    return NULL;
-asn_dec_rval_t error;
-error = ber_decode(0, &asn_DEF_SMUX_PDUs, (void **)&pdus, buffer, length);
-if(error.code != RC_OK)
-    {
-    printfd(__FILE__, "Failed to decode PDUs at byte %ld\n",
-            (long)error.consumed);
-    return NULL;
-    }
-return pdus;
-}
-
 int ParseIntInRange(const std::string & str,
                     int min,
                     int max,
@@ -428,34 +263,6 @@ if (connect(sock, reinterpret_cast<struct sockaddr *>(&addr), sizeof(addr)))
 return false;
 }
 
-bool WaitPackets(int sd)
-{
-fd_set rfds;
-FD_ZERO(&rfds);
-FD_SET(sd, &rfds);
-
-struct timeval tv;
-tv.tv_sec = 0;
-tv.tv_usec = 500000;
-
-int res = select(sd + 1, &rfds, NULL, NULL, &tv);
-if (res == -1) // Error
-    {
-    if (errno != EINTR)
-        {
-        printfd(__FILE__, "Error on select: '%s'\n", strerror(errno));
-        }
-    return false;
-    }
-
-if (res == 0) // Timeout
-    {
-    return false;
-    }
-
-return true;
-}
-
 bool SMUX::DispatchPDUs(const SMUX_PDUs_t * pdus)
 {
 SMUXHandlers::iterator it;
index 25b7ff4b5174bc199614faea2557b25125089705..aa87270015d886d30d2d68082a2cd80e401c88ac 100644 (file)
@@ -67,7 +67,7 @@ public:
     bool IsRunning() { return running && !stopped; }
 
     const std::string & GetStrError() const { return errorStr; }
-    const std::string GetVersion() const { return "Stg SMUX Plugin 1.0"; }
+    const std::string GetVersion() const { return "Stg SMUX Plugin 1.1"; }
     uint16_t GetStartPosition() const { return 100; }
     uint16_t GetStopPosition() const { return 100; }
 
diff --git a/projects/stargazer/plugins/other/smux/utils.cpp b/projects/stargazer/plugins/other/smux/utils.cpp
new file mode 100644 (file)
index 0000000..4bfc0c1
--- /dev/null
@@ -0,0 +1,270 @@
+#include <sys/select.h>
+#include <unistd.h> // write
+
+#include <cstring> // memset
+#include <cerrno>
+
+#include "stg/common.h"
+
+#include "asn1/OpenPDU.h"
+#include "asn1/ClosePDU.h"
+#include "asn1/RReqPDU.h"
+#include "asn1/ber_decoder.h"
+#include "asn1/der_encoder.h"
+
+#include "pen.h"
+#include "utils.h"
+
+bool WaitPackets(int sd)
+{
+fd_set rfds;
+FD_ZERO(&rfds);
+FD_SET(sd, &rfds);
+
+struct timeval tv;
+tv.tv_sec = 0;
+tv.tv_usec = 500000;
+
+int res = select(sd + 1, &rfds, NULL, NULL, &tv);
+if (res == -1) // Error
+    {
+    if (errno != EINTR)
+        printfd(__FILE__, "Error on select: '%s'\n", strerror(errno));
+    return false;
+    }
+
+if (res == 0) // Timeout
+    return false;
+
+return true;
+}
+
+bool String2OI(const std::string & str, OBJECT_IDENTIFIER_t * oi)
+{
+size_t left = 0, pos = 0, arcPos = 0;
+int arcs[1024];
+pos = str.find_first_of('.', left);
+if (pos == 0)
+    {
+    left = 1;
+    pos = str.find_first_of('.', left);
+    }
+while (pos != std::string::npos)
+    {
+    int arc = 0;
+    if (str2x(str.substr(left, left - pos), arc))
+        {
+        return false;
+        }
+    arcs[arcPos++] = arc;
+    left = pos + 1;
+    pos = str.find_first_of('.', left);
+    }
+if (left < str.length())
+    {
+    int arc = 0;
+    if (str2x(str.substr(left, left - pos), arc))
+        {
+        return false;
+        }
+    arcs[arcPos++] = arc;
+    }
+printfd(__FILE__, "String2OI() - arcPos: %d\n", arcPos);
+OBJECT_IDENTIFIER_set_arcs(oi, arcs, sizeof(arcs[0]), arcPos);
+return true;
+}
+
+bool SendOpenPDU(int fd)
+{
+const char * description = "Stg SMUX Plugin";
+asn_enc_rval_t error;
+OpenPDU_t msg;
+
+memset(&msg, 0, sizeof(msg));
+
+msg.present = OpenPDU_PR_simple;
+asn_long2INTEGER(&msg.choice.simple.version, SimpleOpen__version_version_1);
+if (!String2OI(PEN_PREFIX, &msg.choice.simple.identity))
+    {
+    printfd(__FILE__,
+            "SendOpenPDU() - failed to convert string to OBJECT_IDENTIFIER\n");
+    return false;
+    }
+OCTET_STRING_fromString(&msg.choice.simple.description, description);
+OCTET_STRING_fromString(&msg.choice.simple.password, "");
+
+char buffer[1024];
+error = der_encode_to_buffer(&asn_DEF_OpenPDU, &msg, buffer, sizeof(buffer));
+
+if (error.encoded == -1)
+    {
+    printfd(__FILE__, "Could not encode OpenPDU (at %s)\n",
+            error.failed_type ? error.failed_type->name : "unknown");
+    return false;
+    }
+else
+    {
+    write(fd, buffer, error.encoded);
+    printfd(__FILE__, "OpenPDU encoded successfully to %d bytes\n",
+            error.encoded);
+    }
+return true;
+}
+
+int SendClosePDU(int fd)
+{
+ClosePDU_t msg;
+
+memset(&msg, 0, sizeof(msg));
+
+asn_long2INTEGER(&msg, ClosePDU_goingDown);
+
+char buffer[1024];
+asn_enc_rval_t error;
+error = der_encode_to_buffer(&asn_DEF_ClosePDU, &msg, buffer, sizeof(buffer));
+
+if (error.encoded == -1)
+    {
+    printfd(__FILE__, "Could not encode ClosePDU (at %s)\n",
+            error.failed_type ? error.failed_type->name : "unknown");
+    return -1;
+    }
+else
+    {
+    write(fd, buffer, error.encoded);
+    printfd(__FILE__, "ClosePDU encoded successfully\n");
+    }
+return 0;
+}
+
+int SendRReqPDU(int fd)
+{
+int oid[] = {1, 3, 6, 1, 4, 1, 38313, 1};
+asn_enc_rval_t error;
+RReqPDU_t msg;
+
+memset(&msg, 0, sizeof(msg));
+
+msg.priority = 0;
+asn_long2INTEGER(&msg.operation, RReqPDU__operation_readOnly);
+OBJECT_IDENTIFIER_set_arcs(&msg.subtree,
+                           oid,
+                           sizeof(oid[0]),
+                           8);
+
+char buffer[1024];
+error = der_encode_to_buffer(&asn_DEF_RReqPDU, &msg, buffer, sizeof(buffer));
+
+if (error.encoded == -1)
+    {
+    printfd(__FILE__, "Could not encode RReqPDU (at %s)\n",
+            error.failed_type ? error.failed_type->name : "unknown");
+    return -1;
+    }
+else
+    {
+    write(fd, buffer, error.encoded);
+    printfd(__FILE__, "RReqPDU encoded successfully to %d bytes\n",
+            error.encoded);
+    }
+return 0;
+}
+
+SMUX_PDUs_t * RecvSMUXPDUs(int fd)
+{
+char buffer[1024];
+SMUX_PDUs_t * pdus = NULL;
+
+memset(buffer, 0, sizeof(buffer));
+
+size_t length = read(fd, buffer, sizeof(buffer));
+if (length < 1)
+    return NULL;
+asn_dec_rval_t error;
+error = ber_decode(0, &asn_DEF_SMUX_PDUs, (void **)&pdus, buffer, length);
+if(error.code != RC_OK)
+    {
+    printfd(__FILE__, "Failed to decode PDUs at byte %ld\n",
+            (long)error.consumed);
+    return NULL;
+    }
+return pdus;
+}
+
+std::string OI2String(OBJECT_IDENTIFIER_t * oi)
+{
+std::string res;
+
+int arcs[1024];
+int count = OBJECT_IDENTIFIER_get_arcs(oi, arcs, sizeof(arcs[0]), 1024);
+
+if (count > 1024)
+    return "";
+
+for (int i = 0; i < count; ++i)
+    {
+    res += ".";
+    std::string arc;
+    strprintf(&arc, "%d", arcs[i]);
+    res += arc;
+    }
+
+return res;
+}
+
+int SendGetResponsePDU(int fd, GetResponse_PDU_t * getResponse)
+{
+asn_enc_rval_t error;
+
+char buffer[1024];
+error = der_encode_to_buffer(&asn_DEF_GetResponse_PDU, getResponse, buffer,
+                             sizeof(buffer));
+
+if (error.encoded == -1)
+    {
+    printfd(__FILE__, "Could not encode GetResponsePDU (at %s)\n",
+            error.failed_type ? error.failed_type->name : "unknown");
+    return -1;
+    }
+else
+    {
+    write(fd, buffer, error.encoded);
+    printfd(__FILE__, "GetResponsePDU encoded successfully to %d bytes\n",
+            error.encoded);
+    }
+return 0;
+}
+
+int SendGetResponseErrorPDU(int fd,
+                            const PDU_t * getRequest,
+                            int errorStatus,
+                            int errorIndex)
+{
+asn_enc_rval_t error;
+GetResponse_PDU_t msg;
+
+memset(&msg, 0, sizeof(msg));
+
+msg.request_id = getRequest->request_id;
+asn_long2INTEGER(&msg.error_status, errorStatus);
+asn_long2INTEGER(&msg.error_index, errorIndex);
+
+char buffer[1024];
+error = der_encode_to_buffer(&asn_DEF_GetResponse_PDU, &msg, buffer,
+                             sizeof(buffer));
+
+if (error.encoded == -1)
+    {
+    printfd(__FILE__, "Could not encode GetResponsePDU for error (at %s)\n",
+            error.failed_type ? error.failed_type->name : "unknown");
+    return -1;
+    }
+else
+    {
+    write(fd, buffer, error.encoded);
+    printfd(__FILE__,
+            "GetResponsePDU for error encoded successfully to %d bytes\n",
+            error.encoded);
+    }
+return 0;
+}
diff --git a/projects/stargazer/plugins/other/smux/utils.h b/projects/stargazer/plugins/other/smux/utils.h
new file mode 100644 (file)
index 0000000..7cfbdc7
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef __UTILS_H__
+#define __UTILS_H__
+
+#include <string>
+
+#include "asn1/OBJECT_IDENTIFIER.h"
+#include "SMUX-PDUs.h"
+#include "asn1/GetResponse-PDU.h"
+
+bool WaitPackets(int sd);
+bool String2OI(const std::string & str, OBJECT_IDENTIFIER_t * oi);
+std::string OI2String(OBJECT_IDENTIFIER_t * oi);
+bool SendOpenPDU(int fd);
+int SendClosePDU(int fd);
+int SendRReqPDU(int fd);
+SMUX_PDUs_t * RecvSMUXPDUs(int fd);
+int SendGetResponsePDU(int fd, GetResponse_PDU_t * getResponse);
+int SendGetResponseErrorPDU(int fd,
+                            const PDU_t * getRequest,
+                            int errorStatus,
+                            int errorIndex);
+
+#endif