ソースを参照

1、继续完善smtp,准备联测
2、使用交换机时,修改ws连接地址

guohui 2 年 前
親
コミット
f003298238
共有12 個のファイルを変更した、313 個の追加 と 119 個の削除を含む
  1. 1 6
      pro/config/cfg.h
  2. 2 0
      pro/src/app.c
  3. 19 23
      pro/src/appweb_handle.c
  4. 11 1
      pro/src/common.h
  5. 37 22
      pro/src/json_handle.c
  6. 4 4
      pro/src/json_handle.h
  7. 2 3
      pro/src/netswitch.c
  8. 109 21
      pro/src/smtp.c
  9. 3 1
      pro/src/smtp.h
  10. 122 36
      pro/src/sqlite_handle.c
  11. 2 2
      pro/src/sqlite_handle.h
  12. 1 0
      pro/src/thread.h

+ 1 - 6
pro/config/cfg.h

@@ -45,8 +45,8 @@
 
 
 #ifdef CUST_ANDERSON
+    //#define USE_SMTP
     #define USE_NETSWITCH
-    #define USE_SMTP
 
     #define SW_PORT_INDEX_START         0
     #define SW_PORT_INDEX_END           21
@@ -67,11 +67,6 @@
 
 
 
-//define KEY_PARAS_IN_FILE		//mask it mean store paras in database
-//#define USE_WEBAPP
-
-
-
 #endif
 
 

+ 2 - 0
pro/src/app.c

@@ -17,6 +17,7 @@
 #include "sys.h"
 #include "cfg.h"
 #include "lock.h"
+#include "smtp.h"
 #include "netswitch.h"
 #include "breaker_detection.h"
 #include <sys/mman.h>
@@ -2455,6 +2456,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
 
     cascade_init();
     netswitch_init();
+    smtp_init();
 
     //通知smartUPG,app已经运行起来
     upg_init();

+ 19 - 23
pro/src/appweb_handle.c

@@ -2702,45 +2702,41 @@ static void serviceManagement(void *conn)
         http_reply(conn, 400, NULL);
         return ;        
     }
-    //查询smtp信息
-    else if(strcmp(_serviceManageRequestInfo.type,"listSmtpQuery")==0)
+    
+    if(strcmp(_serviceManageRequestInfo.type,"listSmtpQuery")==0)
     {
-    #ifdef USE_SMTP
          ack_str = service_smtp_ack_to_json(&gdm->smtp_sett);
-    #endif
     }   
     else if(strcmp(_serviceManageRequestInfo.type,"SmtpSave")==0)
     {
-    #ifdef USE_SMTP
         //_SMTP_ServerRequestInfo
         //gdm->smtp_sett. 
         smtp_manager_t *man=&gdm->smtp_sett.man;
+        smtp_recvs_t *rcv=&gdm->smtp_sett.rcv;
         _SMTP_ServerRequestInfo *info=&_serviceManageRequestInfo._smtp_info;
 
-        if(info->mode) {
+        if(info->mode && info->account && info->password && info->server && info->port && info->auth)  {
+            man->product_id = gdm->_globalDevInfo.product_id;
             man->mode = atoi(info->mode);
-        }
-        if(info->smtpAccount) {
-            strcpy(man->auth, info->smtpAccount);
-        }
-        if(info->passWord) {
-            strcpy(man->password, info->passWord);
-        }
-        if(info->server) {
+            strcpy(man->account, info->account);
+            strcpy(man->password, info->password);
             strcpy(man->server, info->server);
-        }
-        if(info->port) {
             strcpy(man->port, info->port);
-        }
-        if(info->auth) {
             strcpy(man->auth, info->auth);
-        }
-        if(info->receiveAccount) {
-            //strcpy(man->auth, info->receiveAccount);
+
+            dev_smtp_update_man(gdm->db, man);
         }
 
-        //dev_smtp_update_man(gdm->db, man);
-    #endif
+        smtp_recv_t *pv,*recv=rcv->recv;
+        for(int i=0; i<SMTP_RECV_MAX; i++) {
+            if(info->recvAccount[i]) {
+                pv = &recv[i];
+                pv->idx = i;
+                pv->use = 1;
+                strcpy(pv->account, info->recvAccount[i]);
+                dev_smtp_update_recv(gdm->db, pv);
+            }
+        }
     }   
     //查询snmp信息
     else if(strcmp(_serviceManageRequestInfo.type,"listSnmpQuery")==0)

+ 11 - 1
pro/src/common.h

@@ -188,6 +188,16 @@ enum WARNING_BIT_CTRL
     WARNING_P_UP     = 1024,
 };
 
+
+enum {
+    ALARM_TYPE_POWER=0,
+    ALARM_TYPE_SENSOR,
+    ALARM_TYPE_NETWORK,
+    ALARM_TYPE_OPRATION,
+    ALARM_TYPE_RUNNING,
+};
+
+
 /// @brief 报警动作
 enum ALARM_CTRL
 {
@@ -202,7 +212,7 @@ typedef struct {
     int             up;
     char            ip[48];
     char            mac[24];
-    char            desc[128];
+    char            desc[64];
 }port_info_t;
 typedef struct {
     #define SW_PORT_MAX 28

+ 37 - 22
pro/src/json_handle.c

@@ -1133,7 +1133,11 @@ char* json_to_system_config_info(void)
     //返回websockt
     // cJSON_AddStringToObject(data_field,"webSocket","ws://192.168.2.132:6785/websocket/"); 
     char strIPInfo[64] = "ws://192.168.1.132:6785/websocket/";
+#ifdef USE_NETSWITCH
+    sprintf(strIPInfo,"ws://%s:6785/websocket/", SW_PDU_IP);
+#else
     sprintf(strIPInfo,"ws://%s:6785/websocket/", getLocalIpAddress("eth0"));
+#endif
     cJSON_AddStringToObject(data_field,"webSocket",strIPInfo); 
     
     get_base64(&logo, NULL);
@@ -4210,28 +4214,39 @@ cJSON* json_to_service_manage(const char* str,_ServiceManageRequestInfo* _servic
     
     ///SMTP上传参数
     if(strcmp(_serviceManageRequestInfo->type,"SmtpSave")==0)
-    {     
-        cJSON* cjson_smtp_mode = cJSON_GetObjectItem(cjson,"mode");
-        cJSON* cjson_smtp_account = cJSON_GetObjectItem(cjson,"smtpAccount");  
-        cJSON* cjson_smtp_passwd = cJSON_GetObjectItem(cjson,"passWord");  
-        cJSON* cjson_smtp_server = cJSON_GetObjectItem(cjson,"server");  
-        cJSON* cjson_smtp_port = cJSON_GetObjectItem(cjson,"port");  
-        cJSON* cjson_smtp_auth = cJSON_GetObjectItem(cjson,"auth");  
-        cJSON* cjson_smtp_receive_account = cJSON_GetObjectItem(cjson,"receiveAccount"); 
-        if(cjson_smtp_mode!=NULL)
-            _serviceManageRequestInfo->_smtp_info.mode = cjson_smtp_mode->valuestring ;
-        if(cjson_smtp_account!=NULL)
-            _serviceManageRequestInfo->_smtp_info.smtpAccount = cjson_smtp_account->valuestring ;           
-        if(cjson_smtp_passwd!=NULL)
-            _serviceManageRequestInfo->_smtp_info.passWord = cjson_smtp_passwd->valuestring ; 
-        if(cjson_smtp_server!=NULL)
-            _serviceManageRequestInfo->_smtp_info.server = cjson_smtp_server->valuestring ; 
-        if(cjson_smtp_port!=NULL)
-            _serviceManageRequestInfo->_smtp_info.port = cjson_smtp_port->valuestring ; 
-        if(cjson_smtp_auth!=NULL)
-            _serviceManageRequestInfo->_smtp_info.auth = cjson_smtp_auth->valuestring ; 
-        if(cjson_smtp_receive_account!=NULL)
-            _serviceManageRequestInfo->_smtp_info.receiveAccount = cjson_smtp_receive_account->valuestring ; 
+    {
+        _SMTP_ServerRequestInfo *info=&_serviceManageRequestInfo->_smtp_info;
+
+        cJSON* cjson_mode = cJSON_GetObjectItem(cjson,"mode");
+        cJSON* cjson_account = cJSON_GetObjectItem(cjson,"zh");  
+        cJSON* cjson_passwd = cJSON_GetObjectItem(cjson,"mm");  
+        cJSON* cjson_server = cJSON_GetObjectItem(cjson,"server");  
+        cJSON* cjson_port = cJSON_GetObjectItem(cjson,"port");  
+        cJSON* cjson_auth = cJSON_GetObjectItem(cjson,"rzfs");  
+        cJSON* cjson_recv_account = cJSON_GetObjectItem(cjson,"receiveAccountList"); 
+        if(cjson_mode!=NULL)
+            info->mode = cjson_mode->valuestring ;
+        if(cjson_account!=NULL)
+            info->account = cjson_account->valuestring ;           
+        if(cjson_passwd!=NULL)
+            info->password = cjson_passwd->valuestring ; 
+        if(cjson_server!=NULL)
+            info->server = cjson_server->valuestring ; 
+        if(cjson_port!=NULL)
+            info->port = cjson_port->valuestring ; 
+        if(cjson_auth!=NULL)
+            info->auth = cjson_auth->valuestring ; 
+        if(cjson_recv_account!=NULL) {
+            cJSON *node=cjson_recv_account->child;
+            while(node) {
+                cJSON *cjson_id=cJSON_GetObjectItem(node, "idx");
+                cJSON *cjson_acc=cJSON_GetObjectItem(node, "receiveAccount");
+                if (cjson_id && cjson_acc){
+                    info->recvAccount[cjson_id->valueint] = cjson_acc->valuestring;
+                }
+                node = node->next;
+            }
+        }
     }
     //SNMP上传参数
     else if(strcmp(_serviceManageRequestInfo->type,"SnmpSave")==0)

+ 4 - 4
pro/src/json_handle.h

@@ -340,13 +340,13 @@ typedef struct
 /// @brief SMPT服务信息
 typedef struct 
 {
-    char*  mode;
-    char* smtpAccount;
-    char* passWord;
+    char* mode;
+    char* account;
+    char* password;
     char* server;
     char* port;
     char* auth;
-    char* receiveAccount;
+    char* recvAccount[SMTP_RECV_MAX];
 }_SMTP_ServerRequestInfo;
 
 /// @brief SNMP信息

+ 2 - 3
pro/src/netswitch.c

@@ -829,9 +829,7 @@ static void* sw_thread(void *arg)
     netswitch_evts_t   evts;
     thread_handle_t    *h=(thread_handle_t*)arg;
     ns_handle_t        *nh=(ns_handle_t*)h->arg;
-    sqlite3 *db=get_db();
 
-    dev_switch_init(db, &nh->sw);
     nh->sw2 = nh->sw;
 
     SOCK_STARTUP;
@@ -842,7 +840,7 @@ static void* sw_thread(void *arg)
 
         if(r==0 && sw_chk(&nh->sw, &nh->sw2, &evts)) {
             sw_alarm(&evts, &nh->sw, &nh->sw2);
-            sw_save(db, &nh->sw, &nh->sw2);
+            sw_save(get_db(), &nh->sw, &nh->sw2);
 
             sw_cpy(&nh->sw, &nh->sw2);
         }
@@ -862,6 +860,7 @@ int netswitch_init(void)
     memset(h, 0, sizeof(ns_handle_t));
     h->port_start = -1; //SW_PORT_START
 
+    dev_switch_init(get_db(), &h->sw);
     pthread_mutex_init(&h->mutex, NULL);
     thread_start(THREAD_ID_SWITCH, sw_thread, h, 10*MB, 0);
 #endif

+ 109 - 21
pro/src/smtp.c

@@ -22,6 +22,10 @@
  * </a>.
  */
 
+#include "cfg.h"
+
+#ifdef USE_SMTP
+
 #include <sys/types.h>
 #include <stddef.h>
 #include <stdio.h>
@@ -4050,22 +4054,7 @@ quit:
     
     return r;
 }
-
-
-#include "sqlite_handle.h"
-
-int smtp_init(void)
-{
-    GlobalDeviceManager *gdm=&__globalDeviceManage;
-    smtp_sett_t *sett=&gdm->smtp_sett;
-
-    dev_smtp_init(gdm->db, &gdm->smtp_sett);
-    sett->man.product_id = gdm->_globalDevInfo.product_id;
-
-    return 0;
-}
-
-int smtp_send(smtp_sett_t *sett, char *sub, char *body)
+static int send_mails(smtp_sett_t *sett, char *sub, char *body)
 {
     int i,r;
     smtp_para_t para;
@@ -4087,6 +4076,13 @@ int smtp_send(smtp_sett_t *sett, char *sub, char *body)
     para.sub = sub;
     para.body = body;
 
+    if(strcmp(sett->man.auth, "LOGIN")) {
+        auth = SMTP_AUTH_LOGIN;
+    }
+    else if(strcmp(sett->man.auth, "CRAM-MD5")) {
+        auth = SMTP_AUTH_CRAM_MD5;
+    }
+
     recv = sett->rcv.recv;
     for(i=0; i<SMTP_RECV_MAX; i++) {
         if(sett->rcv.recv[i].use && strlen(sett->rcv.recv[i].account)>0) {
@@ -4100,17 +4096,109 @@ int smtp_send(smtp_sett_t *sett, char *sub, char *body)
 }
 
 
+#include "thread.h"
+#include "xlist.h"
+#include "sqlite_handle.h"
+
+typedef struct {
+    char sub[128];
+    char body[2048];
+}smtp_pkt_t;
+typedef struct {
+    handle_t  list;
+    GlobalDeviceManager *gdm;
+}smtp_handle_t;
+static smtp_handle_t smHandle;
+
+static void sleep_ms(int ms)
+{
+    usleep(ms*1000);
+}
+static void* smtp_thread(void *arg)
+{
+    int r;
+    thread_handle_t *th=(thread_handle_t*)arg;
+    smtp_handle_t   *h=(smtp_handle_t*)th->arg;
+    list_node_t     *ln=NULL;
+
+    smtp_sett_t *sett=&h->gdm->smtp_sett;
+    while(th->quit==0) {
+        r = xlist_take_node(h->list, &ln, 0);
+        if(r==0) {
+            smtp_pkt_t *pkt=(smtp_pkt_t*)ln->data.buf;
+            send_mails(sett, pkt->sub, pkt->body);
+        }
+        xlist_back_node(h->list, ln);
+
+        if(r) {
+            sleep_ms(300);
+        }
+    }
+
+    pthread_exit(NULL);
+}
+#endif
+
+
+int smtp_init(void)
+{
+#ifdef USE_SMTP
+    list_cfg_t lc;
+    smtp_handle_t *h=&smHandle;
+
+    lc.mode = LIST_FULL_FIFO;
+    lc.max = 100;
+    lc.log = 0;
+    h->list = xlist_init(&lc);
+    h->gdm = &__globalDeviceManage;
+
+    dev_smtp_init(h->gdm->db, &h->gdm->smtp_sett);
+    thread_start(THREAD_ID_SMTP, smtp_thread, h, 5*MB, 0);
+#endif
+
+    return 0;
+}
+
+
+int smtp_deinit(void)
+{
+#ifdef USE_SMTP
+    smtp_handle_t *h=&smHandle;
+
+    thread_stop(THREAD_ID_SMTP);
+    xlist_free(h->list);
+#endif
+
+    return 0;
+}
+
+
+int smtp_send(char *sub, char *body)
+{
+    int r=0;
+#ifdef USE_SMTP
+    smtp_pkt_t pkt;
+    smtp_handle_t *h=&smHandle;
+
+    snprintf(pkt.sub, sizeof(pkt.sub), "%s", sub);
+    snprintf(pkt.body, sizeof(pkt.body), "%s", body);
+    r = xlist_append(h->list, 0, &pkt, sizeof(pkt));
+#endif
+
+    return r;
+}
+
+
 int smtp_test(void)
 {
-    int r,cnt=0;
-    smtp_sett_t sett={
-        
-    };
+    int r=0,cnt=0;
 
+#ifdef USE_SMTP
     while(cnt++<10) {
-        r = smtp_send(&sett, "123", "hello 123!");
+        r = smtp_send("123", "hello 123!");
         sleep(2);
     }
+#endif
 
     return r;
 }

+ 3 - 1
pro/src/smtp.h

@@ -7,8 +7,10 @@
 
 
 int smtp_init(void);
+int smtp_deinit(void);
+
 int smtp_test(void);
-int smtp_send(smtp_sett_t *sett, char *sub, char *body);
+int smtp_send(char *sub, char *body);
 
 #endif /* SMTP_H */
 

+ 122 - 36
pro/src/sqlite_handle.c

@@ -5,6 +5,7 @@
 #include "time.h"
 #include "paras.h"
 #include "cfg.h"
+#include "smtp.h"
 #include "switch_ctrl.h"
 
 #define	TOTAL_COUNT	60//统计总数
@@ -2230,6 +2231,9 @@ int dev_insert_alarm_info(sqlite3* db,int product_id,int alarm_type,char* date_t
         return -1 ;   
     }
     sqlite3_free_table(pResult);
+
+    //smtp_send();
+
     return 0;
 }
 
@@ -3505,7 +3509,7 @@ static int sw_update_port(sqlite3 *db, port_info_t *pt)
     char *err_msg=NULL;
     char *table=SWITCH_TABLE;
 
-    sprintf(temp, "UPDATE %s SET up=%d,ip='%s',mac='%s',desc='%s' WHERE id=%d;", 
+    sprintf(temp, "UPDATE %s SET up=%d,ip='%s',mac='%s',desc='%s' WHERE id=%d;",
             table,pt->up,pt->ip,pt->mac,pt->desc,pt->id);
     r = sqlite3_exec(db, temp, NULL, 0, &err_msg);
     if(r != SQLITE_OK) {
@@ -3616,7 +3620,7 @@ int dev_smtp_init(sqlite3 *db, smtp_sett_t *sett)
     table = SMTP_MANAGER_TABLE;
     if(!tab_exists(db, table)) {
         sprintf(temp, "CREATE TABLE IF NOT EXISTS %s("
-                            "product_id INTEGER,"
+                            "product_id INTEGER PRIMARY KEY,"
                             "mode INTEGER,"
                             "account TEXT,"
                             "password TEXT,"
@@ -3638,22 +3642,24 @@ int dev_smtp_init(sqlite3 *db, smtp_sett_t *sett)
         return -1 ;
     }
 
-    smtp_manager_t *man=&sett->man; 
-    memset(&man, 0, sizeof(smtp_manager_t));
-    man->product_id = atoi(pResult[ncol+0]);
-    man->mode = atoi(pResult[ncol+1]);
-    strcpy(man->account, pResult[ncol+2]);
-    strcpy(man->password, pResult[ncol+3]);
-    strcpy(man->server, pResult[ncol+4]);
-    strcpy(man->port, pResult[ncol+5]);
-    strcpy(man->auth, pResult[ncol+6]);
+    if(ncol>0) {
+        smtp_manager_t *man=&sett->man; 
+        memset(man, 0, sizeof(smtp_manager_t));
+        man->product_id = atoi(pResult[ncol+0]);
+        man->mode = atoi(pResult[ncol+1]);
+        strcpy(man->account, pResult[ncol+2]);
+        strcpy(man->password, pResult[ncol+3]);
+        strcpy(man->server, pResult[ncol+4]);
+        strcpy(man->port, pResult[ncol+5]);
+        strcpy(man->auth, pResult[ncol+6]);
+    }
     ////////////////////////////////////////////////////////////////////////
 
     table = SMTP_RECVEIVE_TABLE;
     if(!tab_exists(db, table)) {
         sprintf(temp, "CREATE TABLE IF NOT EXISTS %s("
+                            "idx INTEGER PRIMARY KEY,"
                             "use INTEGER,"
-                            "idx INTEGER,"
                             "account TEXT);", table);
         r = sqlite3_exec(db, temp, 0, 0, &err_msg);
         if(r!=SQLITE_OK) {
@@ -3672,54 +3678,134 @@ int dev_smtp_init(sqlite3 *db, smtp_sett_t *sett)
 
     smtp_recvs_t *rcv=&sett->rcv;
     memset(rcv, 0, sizeof(smtp_recvs_t));
-    for(i=1; i<=nrow; i++) {
-        rcv->recv[i-1].use = atoi(pResult[i*ncol+0]);
-        rcv->recv[i-1].idx = i-1;
-        strcpy(rcv->recv[i-1].account, pResult[i*ncol+1]);
+    if(ncol>0) {
+        for(i=1; i<=nrow; i++) {
+            rcv->recv[i-1].idx = i-1;
+            rcv->recv[i-1].use = atoi(pResult[i*ncol+0]);
+            strcpy(rcv->recv[i-1].account, pResult[i*ncol+1]);
+        }
     }
     sqlite3_free_table(pResult);
     
     return 0;
 }
 
-int dev_smtp_update_mang(sqlite3 *db, smtp_manager_t *man)
+static int get_count(sqlite3 *db, char *table)
 {
-    int i,r=0;
+    int r;
+    char temp[1024];
+    sqlite3_stmt *stmt;
+    
+    sprintf(temp, "SELECT * FROM %s", table);
+    r = sqlite3_prepare_v2(db, temp, -1, &stmt, 0);
+    if (r != SQLITE_OK) {
+        log_e("Failed to prepare statement: %s\n", sqlite3_errmsg(db));
+        return -1;
+    }
+ 
+    int count = 0;
+    while (sqlite3_step(stmt) == SQLITE_ROW) {
+        count++;
+    }
+    sqlite3_finalize(stmt);
+
+    return count;
+}
+int dev_smtp_update_man(sqlite3 *db, smtp_manager_t *man)
+{
+    int i,r=0,exist=0,cnt=0;
     char temp[1024];
     sqlite3_stmt *stmt;
     char *err_msg=NULL;
     char *table=SMTP_MANAGER_TABLE;
 
-    sprintf(temp, "UPDATE %s SET product_id=%d, mode='%d', account='%s', password='%s', server='%s', port=%s, auth='%s';", 
-            table, man->product_id, man->mode, man->account, man->password, man->server, man->port, man->auth);
-    r = sqlite3_exec(db, temp, NULL, 0, &err_msg);
-    if(r != SQLITE_OK) {
-        log_e("___sw_update_port failed, %s, %s\n\n", temp, err_msg);
+    cnt = get_count(db, table);
+    if(cnt>0) {
+        sprintf(temp, "UPDATE %s SET product_id=%d, mode=%d, account='%s', password='%s', server='%s', port='%s', auth='%s' WHERE product_id=%d;", 
+                table, man->product_id, man->mode, man->account, man->password, man->server, man->port, man->auth, man->product_id);
+        r = sqlite3_exec(db, temp, NULL, 0, &err_msg);
+        if(r != SQLITE_OK) {
+            log_e("___sw_update_port failed, %s, %s\n\n", temp, err_msg);
+            sqlite3_free(err_msg);
+        }
+        else {
+            exist = sqlite3_changes(db);
+        }
+    }
 
-        sqlite3_free(err_msg);
-        return -1;
+    if(exist==0) {
+        sprintf(temp, "INSERT INTO %s (product_id,mode,account,password,server,port,auth) VALUES (?,?,?,?,?,?,?);", table);
+        r = sqlite3_prepare_v2(db, temp, -1, &stmt, 0);
+        if (r != SQLITE_OK) {
+            log_e("___dev_smtp_update_man, sqlite3_prepare_v2 failed, %s\n", sqlite3_errmsg(db));
+            r = -1; goto quit;
+        }
+
+        sqlite3_bind_int(stmt,  1, man->product_id);
+        sqlite3_bind_int(stmt,  2, man->mode);
+        sqlite3_bind_text(stmt, 3, man->account,  -1, NULL);
+        sqlite3_bind_text(stmt, 4, man->password, -1, NULL);
+        sqlite3_bind_text(stmt, 5, man->server,   -1, NULL);
+        sqlite3_bind_text(stmt, 6, man->port,     -1, NULL);
+        sqlite3_bind_text(stmt, 7, man->auth,     -1, NULL);
+
+        r = sqlite3_step(stmt);
+        sqlite3_finalize(stmt);
+
+        if (r != SQLITE_DONE) {
+            log_e("___sw_update_all, sqlite3_step failed\n");
+            r = -1;
+        }
     }
 
-    return 0;
+quit:
+    return r;
 }
 
-int dev_smtp_update_recv(sqlite3 *db, smtp_recv_t *rcv)
+int dev_smtp_update_recv(sqlite3 *db, smtp_recv_t *recv)
 {
-    int i,r=0;
+    int i,r=0,exist=0,cnt=0;
     char temp[1024];
     sqlite3_stmt *stmt;
     char *err_msg=NULL;
     char *table=SMTP_RECVEIVE_TABLE;
+    
+    cnt = get_count(db, table);
+    if(cnt>0) {
+        sprintf(temp, "UPDATE %s SET idx=%d, use=%d, account='%s' WHERE idx=%d;", 
+                table, recv->idx, recv->use, recv->account, recv->idx);
+        r = sqlite3_exec(db, temp, NULL, 0, &err_msg);
+        if(r != SQLITE_OK) {
+            log_e("___sw_update_port failed, %s, %s\n\n", temp, err_msg);
+            sqlite3_free(err_msg);
+        }
+        else {
+            exist = sqlite3_changes(db);
+        }
+    }
 
-    sprintf(temp, "UPDATE %s SET use=%d, idx=%d, account='%s' WHERE idx=%d;", 
-            table, rcv->use, rcv->idx, rcv->account, rcv->idx);
-    r = sqlite3_exec(db, temp, NULL, 0, &err_msg);
-    if(r != SQLITE_OK) {
-        log_e("___sw_update_port failed, %s, %s\n\n", temp, err_msg);
+    if(exist==0) {
+        sprintf(temp, "INSERT INTO %s (idx,use,account) VALUES (?,?,?);", table);
+        r = sqlite3_prepare_v2(db, temp, -1, &stmt, 0);
+        if (r != SQLITE_OK) {
+            log_e("___dev_smtp_update_recv, sqlite3_prepare_v2 failed, %s\n", sqlite3_errmsg(db));
+            r = -1;
+            goto quit;
+        }
 
-        sqlite3_free(err_msg);
-        return -1;
+        sqlite3_bind_int(stmt,  1, recv->idx);
+        sqlite3_bind_int(stmt,  2, recv->use);
+        sqlite3_bind_text(stmt, 3, recv->account,  -1, NULL);
+
+        r = sqlite3_step(stmt);
+        sqlite3_finalize(stmt);
+
+        if (r != SQLITE_DONE) {
+            log_e("___sw_update_all, sqlite3_step failed\n");
+            r = -1;
+        }
     }
 
-    return 0;
+quit:
+    return r;
 }

+ 2 - 2
pro/src/sqlite_handle.h

@@ -139,8 +139,8 @@ int dev_switch_update_port(sqlite3 *db, port_info_t *pt);
 int dev_switch_update_all(sqlite3 *db, netswitch_info_t *sw);
 
 int dev_smtp_init(sqlite3 *db, smtp_sett_t *sett);
-int dev_smtp_update_mang(sqlite3 *db, smtp_manager_t *man);
-int dev_smtp_update_recv(sqlite3 *db, smtp_recv_t *rcv);
+int dev_smtp_update_man(sqlite3 *db, smtp_manager_t *man);
+int dev_smtp_update_recv(sqlite3 *db, smtp_recv_t *recv);
 
 
 #endif

+ 1 - 0
pro/src/thread.h

@@ -28,6 +28,7 @@ enum {
     THREAD_ID_SWITCH,
     THREAD_ID_BREAKER_SCANNER,
     THREAD_ID_MQTT,
+    THREAD_ID_SMTP,
     
     THREAD_ID_MAX=30
 };