X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/52b4afb2c72468a55fb49aeed3f7dda1277319df..fdee6fdb88e79929c952fea956fa57e5780804cf:/projects/stargazer/plugins/other/smux/smux.cpp diff --git a/projects/stargazer/plugins/other/smux/smux.cpp b/projects/stargazer/plugins/other/smux/smux.cpp index 11fda6ed..f6c1fade 100644 --- a/projects/stargazer/plugins/other/smux/smux.cpp +++ b/projects/stargazer/plugins/other/smux/smux.cpp @@ -10,287 +10,17 @@ #include #include -#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 "stg/plugin_creator.h" #include "smux.h" +#include "utils.h" -bool WaitPackets(int sd); - -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; -} - -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; -} - -class SMUX_CREATOR -{ -private: - SMUX * smux; - -public: - SMUX_CREATOR() : smux(new SMUX()) {} - ~SMUX_CREATOR() { delete smux; } - - SMUX * GetPlugin() { return smux; } -}; - -SMUX_CREATOR sac; +PLUGIN_CREATOR smc; 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; -} - -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; -} - -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, - int * val) -{ -if (str2x(str.c_str(), *val)) - { - return -1; - } -if (*val < min || *val > max) - { - return -1; - } -return 0; +return smc.GetPlugin(); } SMUX_SETTINGS::SMUX_SETTINGS() @@ -303,7 +33,7 @@ int SMUX_SETTINGS::ParseSettings(const MODULE_SETTINGS & s) PARAM_VALUE pv; std::vector::const_iterator pvi; int p; -/////////////////////////// + pv.param = "Port"; pvi = std::find(s.moduleParams.begin(), s.moduleParams.end(), pv); if (pvi == s.moduleParams.end()) @@ -358,7 +88,7 @@ pthread_mutex_init(&mutex, NULL); smuxHandlers[SMUX_PDUs_PR_close] = &SMUX::CloseHandler; smuxHandlers[SMUX_PDUs_PR_registerResponse] = &SMUX::RegisterResponseHandler; -smuxHandlers[SMUX_PDUs_PR_pdus] = &SMUX::PDUsHandler; +smuxHandlers[SMUX_PDUs_PR_pdus] = &SMUX::PDUsRequestHandler; smuxHandlers[SMUX_PDUs_PR_commitOrRollback] = &SMUX::CommitOrRollbackHandler; pdusHandlers[PDUs_PR_get_request] = &SMUX::GetRequestHandler; @@ -386,19 +116,19 @@ if (PrepareNet()) return -1; // Users -sensors[".1.3.6.1.4.1.38313.1.1.1"] = new TotalUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.2"] = new ConnectedUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.3"] = new AuthorizedUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.4"] = new AlwaysOnlineUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.5"] = new NoCashUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.7"] = new DisabledDetailStatsUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.8"] = new DisabledUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.9"] = new PassiveUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.10"] = new CreditUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.11"] = new FreeMbUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.12"] = new TariffChangeUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.1")] = new TotalUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.2")] = new ConnectedUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.3")] = new AuthorizedUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.4")] = new AlwaysOnlineUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.5")] = new NoCashUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.7")] = new DisabledDetailStatsUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.8")] = new DisabledUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.9")] = new PassiveUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.10")] = new CreditUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.11")] = new FreeMbUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.12")] = new TariffChangeUsersSensor(*users); // Tariffs -sensors[".1.3.6.1.4.1.38313.1.2.1"] = new TotalTariffsSensor(*tariffs); +sensors[OID(".1.3.6.1.4.1.38313.1.2.1")] = new TotalTariffsSensor(*tariffs); if (!running) { @@ -506,34 +236,6 @@ if (connect(sock, reinterpret_cast(&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;