Ver código fonte

添加交换器报警事件向数据库写入

guohui 2 anos atrás
pai
commit
02ce110f74
5 arquivos alterados com 131 adições e 65 exclusões
  1. 0 17
      pro/src/common.h
  2. 85 36
      pro/src/netswitch.c
  3. 37 3
      pro/src/netswitch.h
  4. 6 6
      pro/src/sqlite_handle.c
  5. 3 3
      pro/src/sqlite_handle.h

+ 0 - 17
pro/src/common.h

@@ -872,21 +872,6 @@ typedef struct GlobalBreakerManager{
 }GlobalBreakerManager;
 
 
-typedef struct {
-    int             id;
-    int             up;
-    char            ip[48];
-    char            mac[24];
-    char            desc[128];
-}port_data_t;
-
-typedef struct {
-    #define SW_PORT_MAX         24      //28
-    #define SW_PORT_START       99329
-    port_data_t     port[SW_PORT_MAX];
-}switch_data_t;
-
-
 //设备总体管理
 typedef struct
 {
@@ -929,8 +914,6 @@ typedef struct
     cascade_single_mmap_t *single_mmap;
     cascade_triphasic_mmap_t *triphasic_mmap;	
 	GlobalBreakerManager g_new_global_breaker;
-
-    switch_data_t        sw_data;
 }GlobalDeviceManager;
 
 extern GlobalDeviceManager __globalDeviceManage;

+ 85 - 36
pro/src/netswitch.c

@@ -22,11 +22,6 @@
 
 
 
-typedef struct {
-    switch_data_t   sw;
-}ns_handle_t;
-static ns_handle_t nsHandle;
-
 ////////////////////////////////////////////////////////////////////////
 
 static netsnmp_variable_list* snmp_getx(int version, char *community, char *ip, char *oid_str, int msgtype)
@@ -217,7 +212,7 @@ static int get_mac(char *ss, char *mac)
 
     return 0;
 }
-static port_data_t* get_port(switch_data_t *sw, char *mac)
+static port_data_t* get_port(netswitch_data_t *sw, char *mac)
 {
     int i;
     port_data_t *pt=NULL;
@@ -250,15 +245,15 @@ static char *get_string(netsnmp_variable_list *var)
     
     return NULL;
 }
-static void sw_init(switch_data_t *sw)
+static void sw_init(netswitch_data_t *sw)
 {
     int i;
-    memset(sw, 0, sizeof(switch_data_t));
+    memset(sw, 0, sizeof(netswitch_data_t));
     for(i=0; i<SW_PORT_MAX; i++) {
         sw->port[i].id = -1;
     }
 }
-static void sw_sync_mac_by_id(switch_data_t *dst, switch_data_t *src)
+static void sw_sync_mac_by_id(netswitch_data_t *dst, netswitch_data_t *src)
 {
     int i,id;
     for(i=0; i<SW_PORT_MAX; i++) {
@@ -271,7 +266,7 @@ static void sw_sync_mac_by_id(switch_data_t *dst, switch_data_t *src)
         }
     }
 }
-static int get_id_by_mac(switch_data_t *sw, port_data_t *pt)
+static int get_id_by_mac(netswitch_data_t *sw, port_data_t *pt)
 {
     int i;
 
@@ -287,7 +282,7 @@ static int get_id_by_mac(switch_data_t *sw, port_data_t *pt)
 
     return -1;
 }
-static void sw_sync_ip_by_mac(switch_data_t *dst, switch_data_t *src)
+static void sw_sync_ip_by_mac(netswitch_data_t *dst, netswitch_data_t *src)
 {
     int i,id;
     for(i=0; i<SW_PORT_MAX; i++) {
@@ -307,7 +302,7 @@ static void sw_sync_ip_by_mac(switch_data_t *dst, switch_data_t *src)
         }
     }
 }
-static void sw_print(char *s, switch_data_t *sw)
+static void sw_print(char *s, netswitch_data_t *sw)
 {
     int i,id,flag=0;
     port_data_t *pt=NULL;
@@ -366,11 +361,11 @@ static void sw_print(char *s, switch_data_t *sw)
         3. 第三种情况比较特殊,对于net-snmp不熟的也可能会范理解上的错误。
            使用snmpget而忘记了添加OID结尾的实例标识符,net-snmp则会报出“No Such Instance currently exists at this OID”的错误。
 */
-static int sw_get(switch_data_t *sw)
+static int sw_get(netswitch_data_t *sw)
 {
     int i,j,find=0;
     char temp[100];
-    switch_data_t tmp;
+    netswitch_data_t tmp;
     netsnmp_variable_list *var,*pvar;
 
     char *dot1dTpFdbEntryOid="1.3.6.1.2.1.17.4.3.1";
@@ -505,36 +500,40 @@ static int sw_get(switch_data_t *sw)
 
     return 0;
 }
-static int sw_chk(switch_data_t *sw1, switch_data_t *sw2, uint32_t *mask)
+static int sw_chk(netswitch_data_t *sw1, netswitch_data_t *sw2, netswitch_evts_t *evts)
 {
     int i,flag=0;
-    uint32_t mask2=0;
 
+    memset(evts, 0, sizeof(netswitch_evts_t));
     for(i=0; i<SW_PORT_MAX; i++) {
         if(sw1->port[i].up != sw2->port[i].up) {
-            mask2 |= 1<<i;
             if(sw2->port[i].up) {
                 LOGD("____ port %d plug in\n", i+1);
+                evts->evt[i].cab = EVT_CAB_IN;
             }
             else {
                 LOGD("____ port %d plug out\n", i+1);
+                evts->evt[i].cab = EVT_CAB_OUT;
             }
-            flag |= NW_FLAG_IO;
+            flag = 1;
         }
 
         if(strlen(sw2->port[i].mac) && strcmp(sw1->port[i].mac, sw2->port[i].mac)) {
             LOGD("____ port %d mac changed from: %s, to: %s\n", i+1, sw1->port[i].mac, sw2->port[i].mac);
-            flag |= NW_FLAG_MAC;
+            evts->evt[i].dev = EVT_MAC_CHG;
+            flag = 1;
         }
 
         if(strlen(sw2->port[i].ip) && strcmp(sw1->port[i].ip, sw2->port[i].ip)) {
             LOGD("____ port %d ip changed from: %s, to: %s\n", i+1, sw1->port[i].ip, sw2->port[i].ip);
-            flag |= NW_FLAG_IP;
+            evts->evt[i].dev = EVT_IP_CHG;
+            flag = 1;
         }
     }
+
     return flag;
 }
-static int sw_cpy(switch_data_t *dst, switch_data_t *src)
+static int sw_cpy(netswitch_data_t *dst, netswitch_data_t *src)
 {
     int i;
     for(i=0; i<SW_PORT_MAX; i++) {
@@ -550,32 +549,76 @@ static int sw_cpy(switch_data_t *dst, switch_data_t *src)
 
     return 0;
 }
-
 static sqlite3* get_db(void)
 {
     return __globalDeviceManage.db;
 }
+static int get_prod_id(void)
+{
+    return __globalDeviceManage._global_device_info->product_id;
+}
+static int sw_alarm(netswitch_evts_t *evts, netswitch_data_t *old, netswitch_data_t *new)
+{
+    int r=-1;
+    int i,flag=0;
+    time_t now;
+    char temp[200];
+    char time_str[100];
+    char alarm_str[2000];
+
+    time(&now);
+    strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", localtime(&now));
+    
+    alarm_str[0] = 0;
+    for(i=0; i<SW_PORT_MAX; i++) {
+        if(i==INTER_USE_PORT) {
+            continue;
+        }
+        
+        temp[0] = 0;
+        if(evts->evt[i].cab) {
+            flag = 1;
+            snprintf(temp, sizeof(temp), "port[%d] plug %s\n", i+1, (evts->evt[i].cab==EVT_CAB_IN)?"in":"out");
+            strcat(alarm_str, temp);
+        }
+         
+        if(evts->evt[i].dev) {
+            flag = 1;
+            if(evts->evt[i].dev==EVT_IP_CHG) {
+                snprintf(temp, sizeof(temp), "port[%d] device ip changed from %s to %s\n", i+1, old->port[i].ip, new->port[i].ip);
+            }
+            else {
+                snprintf(temp, sizeof(temp), "port[%d] device mac changed from %s to %s\n", i+1, old->port[i].mac, new->port[i].mac);
+            }
+            strcat(alarm_str, temp);
+        }
+    }
+
+    if(flag) {
+        r = dev_insert_alarm_info(get_db(), get_prod_id(), 9, time_str, alarm_str);
+    }
+
+    return r;
+}
 
 
+static netswitch_data_t sw,sw2;
 static void* sw_thread(void *arg)
 {
     int r;
-    uint32_t mask;
-    thread_handle_t *h=(thread_handle_t*)arg;
-    ns_handle_t     *nh=(ns_handle_t*)h->arg;
-    switch_data_t   sw_tmp;
-    switch_data_t   *sw=&nh->sw;
-    switch_data_t   *sw2=&sw_tmp;
+    netswitch_evts_t   evts;
+    thread_handle_t    *h=(thread_handle_t*)arg;
     sqlite3 *db=get_db();;
 
-    dev_switch_init(db, sw);
-    *sw2 = *sw;
+    dev_switch_init(db, &sw);
+    sw2 = sw;
 
     SOCK_STARTUP;
     while(h->quit==0) {
-        r = sw_get(sw2);
-        if(r==0 && sw_chk(sw, sw2, &mask)) {
-            sw_cpy(sw, sw2);
+        r = sw_get(&sw);
+        if(r==0 && sw_chk(&sw, &sw2, &evts)) {
+            sw_alarm(&evts, &sw, &sw2);
+            sw_cpy(&sw, &sw2);
         }
         usleep(1000);
     }
@@ -586,9 +629,7 @@ static void* sw_thread(void *arg)
 
 int netswitch_init(void)
 {
-    ns_handle_t *h=&nsHandle;
-
-    thread_start(THREAD_ID_SWITCH, sw_thread, h, 10*MB, 0);
+    thread_start(THREAD_ID_SWITCH, sw_thread, NULL, 10*MB, 0);
     
     return 0;
 }
@@ -601,5 +642,13 @@ int netswitch_deinit(void)
 }
 
 
+int netswitch_get(netswitch_data_t *data)
+{
+    if(!data) {
+        return -1;
+    }
+    *data = sw;
 
+    return 0;
+}
 

+ 37 - 3
pro/src/netswitch.h

@@ -1,15 +1,49 @@
 #ifndef __NETSWITCH_Hx__
 #define __NETSWITCH_Hx__
 
+#include <stdint.h>
+
+#define INTER_USE_PORT      0       //port index, start from 0
+
+#define SW_PORT_MAX         24      //28
+#define SW_PORT_START       99329
+
+
 enum {
-    NW_FLAG_IO=(1<<0),
-    NW_FLAG_IP=(1<<1),
-    NW_FLAG_MAC=(1<<2),
+    EVT_NONE=0,
+    EVT_CAB_IN,
+    EVT_CAB_OUT,
+
+    EVT_IP_CHG,
+    EVT_MAC_CHG,
 };
 
+typedef struct {
+    int             id;
+    int             up;
+    char            ip[48];
+    char            mac[24];
+    char            desc[128];
+}port_data_t;
+
+typedef struct {
+    port_data_t     port[SW_PORT_MAX];
+}netswitch_data_t;
+
+typedef struct {
+    uint8_t     cab;        //cable
+    uint8_t     dev;        //device connect to the port
+}netswitch_evt_t;
+
+typedef struct {
+    netswitch_evt_t evt[SW_PORT_MAX];
+}netswitch_evts_t;
+
 
 int netswitch_init(void);
 int netswitch_deinit(void);
 
+int netswitch_get(netswitch_data_t *data);
+
 #endif
 

+ 6 - 6
pro/src/sqlite_handle.c

@@ -3454,7 +3454,7 @@ static int tab_exists(sqlite3 *db, char *table)
 }
 
 
-static int sw_load(sqlite3 *db, switch_data_t *sw)
+static int sw_load(sqlite3 *db, netswitch_data_t *sw)
 {
     int i,r;
     char temp[1024],*p;
@@ -3469,7 +3469,7 @@ static int sw_load(sqlite3 *db, switch_data_t *sw)
     }
     
     i = 0;
-    memset(sw, 0, sizeof(switch_data_t));
+    memset(sw, 0, sizeof(netswitch_data_t));
     while (sqlite3_step(stmt) == SQLITE_ROW) {
         port_data_t *pt=&sw->port[i];
 
@@ -3510,7 +3510,7 @@ static int sw_update_port(sqlite3 *db, port_data_t *pt)
 
     return 0;
 }
-static int sw_update_all(sqlite3 *db, switch_data_t *sw)
+static int sw_update_all(sqlite3 *db, netswitch_data_t *sw)
 {
     int i,r=0;
     char temp[1024];
@@ -3546,7 +3546,7 @@ static int sw_update_all(sqlite3 *db, switch_data_t *sw)
 }
 
 
-int dev_switch_init(sqlite3 *db, switch_data_t *sw)
+int dev_switch_init(sqlite3 *db, netswitch_data_t *sw)
 {
     int r;
     char *table=SWITCH_TABLE;
@@ -3566,7 +3566,7 @@ int dev_switch_init(sqlite3 *db, switch_data_t *sw)
     }
 
     if(sw) {
-        memset(sw, 0, sizeof(switch_data_t));
+        memset(sw, 0, sizeof(netswitch_data_t));
         sw_update_all(db, sw);
     }
 
@@ -3584,7 +3584,7 @@ int dev_switch_update_port(sqlite3 *db, port_data_t *pt)
 
     return 0;
 }
-int dev_switch_update_all(sqlite3 *db, switch_data_t *sw)
+int dev_switch_update_all(sqlite3 *db, netswitch_data_t *sw)
 {
     int r;
     pthread_mutex_lock(&__globalDeviceManage.dbThreadlock);

+ 3 - 3
pro/src/sqlite_handle.h

@@ -7,7 +7,7 @@
 // #include "sqlite3.h"
 #include "common.h"
 #include "json_handle.h"
-
+#include "netswitch.h"
 
 
 int sqlite_init(sqlite3** db,pthread_mutex_t* pDBMutex, const char* daba_name);
@@ -138,8 +138,8 @@ int dev_insert_breaker_genera_manage(sqlite3 *db,GlobalBreakerManager* _globalBr
 int dev_update_breaker_genera_manage(sqlite3 *db,int product_id,int breaker_id,GlobalBreakerManager* _globalBreakerManager);
 int dev_delete_breaker_manage(sqlite3 *db,int product_id,int breaker_id);
 
-int dev_switch_init(sqlite3 *db, switch_data_t *sw);
+int dev_switch_init(sqlite3 *db, netswitch_data_t *sw);
 int dev_switch_update_port(sqlite3 *db, port_data_t *pt);
-int dev_switch_update_all(sqlite3 *db, switch_data_t *sw);
+int dev_switch_update_all(sqlite3 *db, netswitch_data_t *sw);
 
 #endif