This commit is contained in:
sunguosong 2019-09-25 16:11:03 +08:00
commit 544eedcf39
12 changed files with 843 additions and 63 deletions

View File

@ -42,4 +42,99 @@
#define RET_SENDERR 13
#define RET_NOCMID 14
#define RET_SRCERR 15
#define RET_JSONERR 16
#define RET_USED 17
static inline char *get_err_message(int err)
{
if(err < 0) {
err = -err;
}
switch(err) {
case RET_OK: return "OK";
case RET_ERR: return "Error";
case RET_UNKNOWN: return "Unkown";
case RET_SYSERR: return "SystemError";
case RET_NOTFOUND: return "NotFound";
case RET_TIMEOUT: return "Timeout";
case RET_NULLP: return "NullPointer" ;
case RET_NOMEM: return "NotEnoughMemory";
case RET_CHKERR: return "CheckError";
case RET_NOTSUPPORT: return "NotSupport";
case RET_INPUTERR: return "InputError";
case RET_EXIST: return "AlreadyExist";
case RET_FULL: return "Full";
case RET_SENDERR: return "SendErr";
case RET_NOCMID: return "CanNotFindConfig";
case RET_SRCERR: return "ConfigSourceErr";
case RET_JSONERR: return "JsonFormatErr";
case RET_USED: return "ItemUsed";
#if 0
case RET_IPINVALID: return "IpInvalid";
case RET_BRNAMEERR: return "BrNameInvalid";
case RET_VIDNUM_INVALID: return "VidNumInvalid";
case RET_VID_INVALID: return "VidValueInvalid";
case RET_VID_EXIST: return "VidHasExist";
case RET_VID_NOT_EXIST: return "VidHasNotExist";
case RET_INTERFACE_NOT_EXIST: return "InterfaceHasNotExist";
case RET_ATTR_INVALID: return "AttrInvalid";
case RET_OPTYPE_ERR: return "OperationTypeError";
case RET_SYS_VCONFIG_ERR: return "SystemVconfigError";
case RET_SYS_IFCONFIG_ERR: return "SystemIfconfigError";
case RET_SYS_FILEOP_ERR: return "SystemFileOperationError";
case RET_OPEN_FILE_ERR: return "CanNotOpenConfigFile";
case RET_EXEC_ERR: return "CanNotExecuateShell";
case RET_METRIC_ERR: return "InvalidMetric";
case RET_NETMASK_ERR: return "InvalidNetmask";
case RET_EMPTY_STRING: return "InputEmpty";
case RET_WRONG_TYPE: return "WrongType";
case RET_VERSION_ERR: return "InvalidProtocol";
case RET_DESTIP_ERR: return "InvalidDestIP";
case RET_GATEWAY_ERR: return "InvalidGateway";
case RET_GW_DEV_ERR: return "Gateway&DevEmpty";
#endif
}
return "Unknown err code";
}
#endif

View File

@ -12,6 +12,7 @@
#include "proc_api.h"
#include "../../common/uthash.h"
#include "../../common/common.h"
#define MAX_COMMAND_LEN (256)
#define MAX_CMD_LEN (32)

View File

@ -4,8 +4,6 @@
#include <asm/atomic.h>
#include "../../common/common.h"
#define PROC_API_DIR_NAME ("isg")
typedef enum {

View File

@ -4,8 +4,6 @@
#include <time.h>
#include <cjson/cJSON.h>
#include "../../common/common.h"
#include "log.h"
#include "json_interface.h"
@ -72,7 +70,8 @@ static int __interface_decode(const char *pJsonS, void **pStruct)
pData->timeStamp = cJSON_GetObjectItem(pRoot, "timeStamp")->valueint;
if(cJSON_HasObjectItem(pRoot, "msgContent")) {
pData->msgContent = strdup(cJSON_GetObjectItem(pRoot, "msgContent")->valuestring);
pData->msgContent = strdup(cJSON_GetObjectItem(pRoot,
"msgContent")->valuestring);
}
cJSON_Delete(pRoot);
@ -82,7 +81,48 @@ static int __interface_decode(const char *pJsonS, void **pStruct)
static const char *__obj_add_encode(void *pData)
{
const char *pJsonS;
PIFC_RET_MSG p = (PIFC_RET_MSG)pData;
cJSON *pRoot = cJSON_CreateObject();
if(!p) {
return NULL;
}
cJSON_AddNumberToObject(pRoot, "ret_code", p->ret_code);
if(p->mesg) {
cJSON_AddStringToObject(pRoot, "mesg", p->mesg);
}
if(p->n_items > 0) {
int i;
cJSON *pArray = cJSON_AddArrayToObject(pRoot, "data");
if(pArray) {
for(i = 0; i < p->n_items; i++) {
cJSON *pItem = cJSON_CreateObject();
if(!pItem) {
continue;
}
cJSON_AddStringToObject(pItem, "name", p->data[i].name);
cJSON_AddNumberToObject(pItem, "ret_code", p->data[i].ret_code);
if(p->data[i].mesg) {
cJSON_AddStringToObject(pItem, "mesg", p->data[i].mesg);
}
cJSON_AddItemToArray(pArray, pItem);
}
}
}
pJsonS = cJSON_Print(pRoot);
cJSON_Delete(pRoot);
return pJsonS;
}
static int __obj_add_decode(const char *pJsonS, void **pStruct)
@ -147,25 +187,32 @@ static int __obj_add_decode(const char *pJsonS, void **pStruct)
pObj->prio = cJSON_GetObjectItem(pSub, "prio")->valueint;
pObjK->type = cJSON_GetObjectItem(pSub, "type")->valueint;
strncpy(pObj->name, cJSON_GetObjectItem(pSub, "name")->valuestring, MAX_NAME_LEN - 1);
strncpy(pObj->desc, cJSON_GetObjectItem(pSub, "desc")->valuestring, MAX_DESC - 1);
strncpy(pObj->name, cJSON_GetObjectItem(pSub, "name")->valuestring,
MAX_NAME_LEN - 1);
strncpy(pObj->desc, cJSON_GetObjectItem(pSub, "desc")->valuestring,
MAX_DESC - 1);
for(j = 0; j < pObjK->ctx_num; j++) {
cJSON *pItem = cJSON_GetArrayItem(pSubContent, j);
switch(pObjK->type / 10) {
case OBJ_TYPE_SERVER:
pObjK->objs.svr_obj[j].pro_type = cJSON_GetObjectItem(pItem, "proType")->valueint;
pObjK->objs.svr_obj[j].str_val = strdup(cJSON_GetObjectItem(pItem, "porPort")->valuestring);
pObjK->objs.svr_obj[j].pro_type = cJSON_GetObjectItem(pItem,
"proType")->valueint;
pObjK->objs.svr_obj[j].str_val = strdup(cJSON_GetObjectItem(pItem,
"porPort")->valuestring);
break;
case OBJ_TYPE_ADDR:
pObjK->objs.addr_obj[j].str_val = strdup(cJSON_GetObjectItem(pItem, "ipAddr")->valuestring);
pObjK->objs.addr_obj[j].str_val = strdup(cJSON_GetObjectItem(pItem,
"ipAddr")->valuestring);
break;
case OBJ_TYPE_DATETIME:
pObjK->objs.dt_obj[j].rep_mode = cJSON_GetObjectItem(pItem, "repType")->valueint;
pObjK->objs.dt_obj[j].str_val = strdup(cJSON_GetObjectItem(pItem, "timeValue")->valuestring);
pObjK->objs.dt_obj[j].rep_mode = cJSON_GetObjectItem(pItem,
"repType")->valueint;
pObjK->objs.dt_obj[j].str_val = strdup(cJSON_GetObjectItem(pItem,
"timeValue")->valuestring);
break;
}
}
@ -179,10 +226,11 @@ static int __obj_add_decode(const char *pJsonS, void **pStruct)
static JSON_ENGINE g_jSonEngine[] = {
{JE_INTERFACE, __interface_encode, __interface_decode, NULL},
{OBJ_CMD_ADD, NULL, __obj_add_decode, NULL}
{OBJ_CMD_ADD, __obj_add_encode, __obj_add_decode, NULL},
};
int Json2Struct(const char *pJsonStr, void *pData, JSON_ENGINE_TYPE type, int enBase64)
int Json2Struct(const char *pJsonStr, void *pData, JSON_ENGINE_TYPE type,
int enBase64)
{
if(pJsonStr == NULL || pData == NULL) {
return -RET_INPUTERR;
@ -207,7 +255,8 @@ int Json2Struct(const char *pJsonStr, void *pData, JSON_ENGINE_TYPE type, int en
}
}
const char *Struct2Json(void *pStruct, JSON_ENGINE_TYPE type, int enBase64, int *pErr)
const char *Struct2Json(void *pStruct, JSON_ENGINE_TYPE type, int enBase64,
int *pErr)
{
if(pStruct == NULL || pErr == NULL) {
if(pErr) {

View File

@ -13,8 +13,7 @@ typedef enum {
OBJ_CMD_QUERYDETAIL = 104,
} JSON_CMD;
typedef enum
{
typedef enum {
JE_INTERFACE,
JE_OBJ_ADD,
JE_OBJ_MOD,
@ -47,8 +46,23 @@ typedef struct {
int n_obj;
} IFACE_ADD_OBJ, *PIFACE_ADD_OBJ;
int Json2Struct(const char *pJsonStr, void* pData, JSON_ENGINE_TYPE type, int enBase64);
const char* Struct2Json(void* pStruct, JSON_ENGINE_TYPE type, int enBase64, int* pErr);
typedef struct {
char *name;
char *mesg;
int ret_code;
} IFC_RET_LIST, *PIFC_RET_LIST;
typedef struct {
int ret_code;
char *mesg;
int n_items;
IFC_RET_LIST data[100];
} IFC_RET_MSG, *PIFC_RET_MSG;
int Json2Struct(const char *pJsonStr, void *pData, JSON_ENGINE_TYPE type,
int enBase64);
const char *Struct2Json(void *pStruct, JSON_ENGINE_TYPE type, int enBase64,
int *pErr);
#ifdef __cplusplus
}

View File

@ -25,7 +25,7 @@ static PCMHI_OBJECT g_pObject = NULL;
static OBJECT_K g_objItem[MAX_OBJ];
static pthread_mutex_t g_obj_lock = PTHREAD_MUTEX_INITIALIZER;
int split_params(char *pInput, char **pFirst, char **pSecond, const char *split)
static int split_params(char *pInput, char **pFirst, char **pSecond, const char *split)
{
char *pStr = (char *)pInput;
char *p;
@ -174,7 +174,7 @@ int object_add(PCMHI_OBJECT pObj, POBJECT_K pObjK)
switch(pObjK->type / 10) {
case OBJ_TYPE_SERVER:
split_params((char*)pSvr->str_val, &pStart, &pEnd, "-");
split_params((char *)pSvr->str_val, &pStart, &pEnd, "-");
if(!pcre_match(REGEX_SVR_PORT, pStart)) {
LOG_EX(LOG_Error, "Input %s format error\n", pStart);
@ -210,14 +210,14 @@ int object_add(PCMHI_OBJECT pObj, POBJECT_K pObjK)
break;
case OBJ_TYPE_ADDR:
split_params((char*)pAddr->str_val, &pStart, &pEnd, "-");
split_params((char *)pAddr->str_val, &pStart, &pEnd, "-");
if(!pcre_match(REGEX_IP_ADDR, pStart)) {
LOG_EX(LOG_Error, "Input %s format error\n", pStart);
return -RET_INPUTERR;
}
split_params((char*)pStart, &pSubStart, &pSubEnd, "/");
split_params((char *)pStart, &pSubStart, &pSubEnd, "/");
if(pSubEnd && strlen(pSubEnd) > 0) {
pAddr->net_mask = strtoul(pSubEnd, NULL, 10);
@ -263,7 +263,7 @@ int object_add(PCMHI_OBJECT pObj, POBJECT_K pObjK)
break;
case OBJ_TYPE_DATETIME:
split_params((char*)pDt->str_val, &pStart, &pEnd, "-");
split_params((char *)pDt->str_val, &pStart, &pEnd, "-");
if(!pcre_match(REGEX_DT, pStart)) {
LOG_EX(LOG_Error, "Input %s format error\n", pStart);
@ -332,6 +332,34 @@ int object_add(PCMHI_OBJECT pObj, POBJECT_K pObjK)
pthread_mutex_unlock(&g_obj_lock);
}
int object_del(const char* pName)
{
PCMHI_OBJECT p, pTmp;
pthread_mutex_lock(&g_obj_lock);
HASH_FIND_STR(g_pObject, pName, p);
pthread_mutex_unlock(&g_obj_lock);
if(p == NULL) {
LOG_EX(LOG_Error, "Item %s exists\n", p->name);
return -RET_NOTFOUND;
}
if(g_objItem[p->obj_index].ref_count > 0) {
LOG_EX(LOG_Error, "Item %s used %d\n", p->name, g_objItem[p->obj_index].ref_count);
return -RET_USED;
}
pthread_mutex_lock(&g_obj_lock);
HASH_DEL(g_pObject, p);
pthread_mutex_unlock(&g_obj_lock);
memset(&g_objItem[p->obj_index].memTag, 0, sizeof(OBJECT_K));
free(p);
return RET_OK;
}
static const char *read_json_file(const char *pPath)
{
FILE *pFile;
@ -369,18 +397,45 @@ static const char *read_json_file(const char *pPath)
return (const char *)pBuf;
}
static void test_del_object(void)
{
}
static void test_add_object(void)
{
PJSON_INTERFACE p = NULL;
PIFACE_ADD_OBJ pAdd = NULL;
int i, j, ret;
const char *pJson = read_json_file(ADD_JS_FILE);
int i, ret;
const char *pRetJson;
IFC_RET_MSG retCtx;
PJSON_INTERFACE p = NULL;
PIFACE_ADD_OBJ pAdd = NULL;
const char *pJson = read_json_file(ADD_JS_FILE);
ret = Json2Struct(pJson, &p, JE_INTERFACE, FALSE);
memset(&retCtx, 0, sizeof(IFC_RET_MSG));
if(ret != RET_OK || p == NULL) {
LOG_EX(LOG_Error, "Decode json error: %d\n", ret);
free((void*)pJson);
free((void *)pJson);
if(p) {
free(p);
}
retCtx.ret_code = -RET_JSONERR;
retCtx.mesg = get_err_message(RET_JSONERR);
retCtx.n_items = 0;
pRetJson = Struct2Json(&retCtx, JE_OBJ_ADD, FALSE, &ret);
if(!pRetJson || ret != RET_OK) {
LOG_EX(LOG_Error, "Json format error: %d\n", ret);
return;
}
LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson);
free((void *)pRetJson);
return;
}
@ -396,56 +451,67 @@ static void test_add_object(void)
LOG_EX(LOG_Error, "Decode json error: %d\n", ret);
if(p->msgContent) {
free((void*)p->msgContent);
free((void *)p->msgContent);
}
free(p);
free((void*)pJson);
free((void *)pJson);
retCtx.ret_code = -RET_JSONERR;
retCtx.mesg = get_err_message(RET_JSONERR);
retCtx.n_items = 0;
pRetJson = Struct2Json(&retCtx, JE_OBJ_ADD, FALSE, &ret);
if(!pRetJson || ret != RET_OK) {
LOG_EX(LOG_Error, "Json format error: %d\n", ret);
return;
}
LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson);
free((void *)pRetJson);
return;
} else {
retCtx.n_items = pAdd->n_obj;
}
for(i = 0; i < pAdd->n_obj; i++) {
LOG_EX(LOG_Info, "name: %s\n", pAdd->pCtx[i].obj.name);
LOG_EX(LOG_Info, "desc: %s\n", pAdd->pCtx[i].obj.desc);
LOG_EX(LOG_Info, "prio: %d\n", pAdd->pCtx[i].obj.prio);
LOG_EX(LOG_Info, "type: %d\n", pAdd->pCtx[i].objk.type);
LOG_EX(LOG_Info, "items: %d\n", pAdd->pCtx[i].objk.ctx_num);
ret = object_add(&pAdd->pCtx[i].obj, &pAdd->pCtx[i].objk);
for(j = 0; j < pAdd->pCtx[i].objk.ctx_num; j++) {
POBJECT_K pObjK = &pAdd->pCtx[i].objk;
switch(pObjK->type / 10) {
case OBJ_TYPE_SERVER:
LOG_EX(LOG_Info, " porType: %d\n", pObjK->objs.svr_obj[j].pro_type);
LOG_EX(LOG_Info, " value: %s\n", pObjK->objs.svr_obj[j].str_val);
break;
case OBJ_TYPE_ADDR:
LOG_EX(LOG_Info, " value: %s\n", pObjK->objs.addr_obj[j].str_val);
break;
case OBJ_TYPE_DATETIME:
LOG_EX(LOG_Info, " repeat: %d\n", pObjK->objs.dt_obj[j].rep_mode);
LOG_EX(LOG_Info, " value: %s\n", pObjK->objs.dt_obj[j].str_val);
break;
}
if(ret != RET_OK && retCtx.ret_code == RET_OK) {
retCtx.ret_code = -RET_JSONERR;
}
object_add(&pAdd->pCtx[i].obj, &pAdd->pCtx[i].objk);
retCtx.data[i].name = pAdd->pCtx[i].obj.name;
retCtx.data[i].ret_code = ret;
retCtx.data[i].mesg = get_err_message(ret);
}
dump_object();
retCtx.mesg = get_err_message(retCtx.data[i].ret_code);
pRetJson = Struct2Json(&retCtx, JE_OBJ_ADD, FALSE, &ret);
if(!pRetJson || ret != RET_OK) {
LOG_EX(LOG_Error, "Json format error: %d\n", ret);
return;
}
LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson);
free((void *)pRetJson);
if(pAdd) {
free(pAdd);
}
if(p->msgContent) {
free((void*)p->msgContent);
free((void *)p->msgContent);
}
free(p);
free((void*)pJson);
free((void *)pJson);
}
static void test_strsep(char *pVal)

View File

@ -41,6 +41,7 @@
server.modules = (
"mod_portal",
"mod_usermagnet",
# "mod_webm",
# "mod_access",
# "mod_alias",

View File

@ -414,6 +414,11 @@ mod_portal_la_SOURCES = mod_portal.c json.c user_hashtable.c user_auth.c
mod_portal_la_LDFLAGS = -module -export-dynamic -avoid-version -L../../../../Platform/build/debug/
mod_portal_la_LIBADD = $(common_libadd) -ldatabase-$(host_cpu)
lib_LTLIBRARIES += mod_usermagnet.la
mod_usermagnet_la_SOURCES = mod_usermagnet.c json.c user_hashtable.c user_auth.c
mod_usermagnet_la_LDFLAGS = -module -export-dynamic -avoid-version -L../../../../Platform/build/debug/
mod_usermagnet_la_LIBADD = $(common_libadd) -ldatabase-$(host_cpu)
hdr = server.h base64.h buffer.h burl.h network.h log.h http_kv.h keyvalue.h \
response.h request.h fastcgi.h chunk.h \
first.h settings.h http_chunk.h \

View File

@ -583,6 +583,14 @@ mod_userdir_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(AM_CFLAGS) $(CFLAGS) $(mod_userdir_la_LDFLAGS) $(LDFLAGS) -o \
$@
mod_usermagnet_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
am_mod_usermagnet_la_OBJECTS = mod_usermagnet.lo json.lo \
user_hashtable.lo user_auth.lo
mod_usermagnet_la_OBJECTS = $(am_mod_usermagnet_la_OBJECTS)
mod_usermagnet_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(AM_CFLAGS) $(CFLAGS) $(mod_usermagnet_la_LDFLAGS) $(LDFLAGS) \
-o $@
mod_usertrack_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
am_mod_usertrack_la_OBJECTS = mod_usertrack.lo
mod_usertrack_la_OBJECTS = $(am_mod_usertrack_la_OBJECTS)
@ -925,9 +933,9 @@ SOURCES = $(liblightcomp_la_SOURCES) $(mod_access_la_SOURCES) \
$(mod_staticfile_la_SOURCES) $(mod_status_la_SOURCES) \
$(mod_trigger_b4_dl_la_SOURCES) \
$(mod_uploadprogress_la_SOURCES) $(mod_userdir_la_SOURCES) \
$(mod_usertrack_la_SOURCES) $(mod_vhostdb_la_SOURCES) \
$(mod_vhostdb_dbi_la_SOURCES) $(mod_vhostdb_ldap_la_SOURCES) \
$(mod_vhostdb_mysql_la_SOURCES) \
$(mod_usermagnet_la_SOURCES) $(mod_usertrack_la_SOURCES) \
$(mod_vhostdb_la_SOURCES) $(mod_vhostdb_dbi_la_SOURCES) \
$(mod_vhostdb_ldap_la_SOURCES) $(mod_vhostdb_mysql_la_SOURCES) \
$(mod_vhostdb_pgsql_la_SOURCES) $(mod_webdav_la_SOURCES) \
$(mod_webm_la_SOURCES) $(mod_wstunnel_la_SOURCES) \
$(lighttpd_SOURCES) $(lighttpd_angel_SOURCES) \
@ -960,7 +968,8 @@ DIST_SOURCES = $(am__liblightcomp_la_SOURCES_DIST) \
$(mod_staticfile_la_SOURCES) $(mod_status_la_SOURCES) \
$(am__mod_trigger_b4_dl_la_SOURCES_DIST) \
$(mod_uploadprogress_la_SOURCES) $(mod_userdir_la_SOURCES) \
$(mod_usertrack_la_SOURCES) $(mod_vhostdb_la_SOURCES) \
$(mod_usermagnet_la_SOURCES) $(mod_usertrack_la_SOURCES) \
$(mod_vhostdb_la_SOURCES) \
$(am__mod_vhostdb_dbi_la_SOURCES_DIST) \
$(am__mod_vhostdb_ldap_la_SOURCES_DIST) \
$(am__mod_vhostdb_mysql_la_SOURCES_DIST) \
@ -1246,7 +1255,7 @@ lib_LTLIBRARIES = $(am__append_1) mod_flv_streaming.la $(am__append_3) \
$(am__append_14) $(am__append_15) mod_rewrite.la \
mod_redirect.la mod_status.la mod_accesslog.la \
mod_uploadprogress.la mod_wstunnel.la mod_webm.la \
mod_portal.la
mod_portal.la mod_usermagnet.la
@NO_RDYNAMIC_FALSE@common_ldflags = -avoid-version
# if the linker doesn't allow referencing symbols of the binary
@ -1422,6 +1431,9 @@ mod_webm_la_LIBADD = $(common_libadd)
mod_portal_la_SOURCES = mod_portal.c json.c user_hashtable.c user_auth.c
mod_portal_la_LDFLAGS = -module -export-dynamic -avoid-version -L../../../../Platform/build/debug/
mod_portal_la_LIBADD = $(common_libadd) -ldatabase-$(host_cpu)
mod_usermagnet_la_SOURCES = mod_usermagnet.c json.c user_hashtable.c user_auth.c
mod_usermagnet_la_LDFLAGS = -module -export-dynamic -avoid-version -L../../../../Platform/build/debug/
mod_usermagnet_la_LIBADD = $(common_libadd) -ldatabase-$(host_cpu)
hdr = server.h base64.h buffer.h burl.h network.h log.h http_kv.h keyvalue.h \
response.h request.h fastcgi.h chunk.h \
first.h settings.h http_chunk.h \
@ -1706,6 +1718,9 @@ mod_uploadprogress.la: $(mod_uploadprogress_la_OBJECTS) $(mod_uploadprogress_la_
mod_userdir.la: $(mod_userdir_la_OBJECTS) $(mod_userdir_la_DEPENDENCIES) $(EXTRA_mod_userdir_la_DEPENDENCIES)
$(AM_V_CCLD)$(mod_userdir_la_LINK) -rpath $(libdir) $(mod_userdir_la_OBJECTS) $(mod_userdir_la_LIBADD) $(LIBS)
mod_usermagnet.la: $(mod_usermagnet_la_OBJECTS) $(mod_usermagnet_la_DEPENDENCIES) $(EXTRA_mod_usermagnet_la_DEPENDENCIES)
$(AM_V_CCLD)$(mod_usermagnet_la_LINK) -rpath $(libdir) $(mod_usermagnet_la_OBJECTS) $(mod_usermagnet_la_LIBADD) $(LIBS)
mod_usertrack.la: $(mod_usertrack_la_OBJECTS) $(mod_usertrack_la_DEPENDENCIES) $(EXTRA_mod_usertrack_la_DEPENDENCIES)
$(AM_V_CCLD)$(mod_usertrack_la_LINK) -rpath $(libdir) $(mod_usertrack_la_OBJECTS) $(mod_usertrack_la_LIBADD) $(LIBS)
@ -2046,6 +2061,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mod_trigger_b4_dl.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mod_uploadprogress.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mod_userdir.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mod_usermagnet.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mod_usertrack.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mod_vhostdb.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mod_vhostdb_dbi_la-mod_vhostdb_dbi.Plo@am__quote@

View File

@ -0,0 +1,520 @@
#include "first.h"
#include "base_decls.h"
#include "json.h"
#include "user_hashtable.h"
#include "base.h"
#include "plugin.h"
#include "http_auth.h"
#include "http_header.h"
#include "log.h"
#include "dlfcn.h"
#include "connections.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sys/socket.h>
#include "user_auth.h"
#include "arpa/inet.h"
#include "unistd.h"
#include "stddef.h"
#include "/usr/include/x86_64-linux-gnu/sys/socket.h"
#define DEL_MAX_NUM (100)
#define DEL_MAX_SIZE (24)
/*函数指针*/
typedef void (*mod_usermagnet_cfg_exec_sync)(int page_num, int count, char *user_name, cJSON *array);
typedef struct {
PLUGIN_DATA;
void *cfgm_lib;
mod_usermagnet_cfg_exec_sync usermagnet_cfg_exec;
} mod_usermagnet_plugin_data;
INIT_FUNC(mod_usermagnet_init) {
mod_usermagnet_plugin_data *p;
p = calloc(1, sizeof(*p));
return p;
}
/*认证模块释放*/
FREE_FUNC(mod_usermagnet_free) {
mod_usermagnet_plugin_data *p = p_d;
srv = srv;
if (!p) return HANDLER_GO_ON;
//dlclose(p->cfgm_lib);
free(p);
return HANDLER_GO_ON;
}
/*查询在线用户信息
1IP
2 IP
3NULL 线
*/
static handler_t get_onlineuser_info(server *srv, connection *con, void* p_d)
{
p_d = p_d;
cJSON *cjson,*userip, *username, *Page_Num, *Count;
cJSON *pJsonArry;
USER_INFO *user_info;
uint32_t clientip;
char *ip = NULL;
char *name = NULL;
char *result_str = NULL;
int page_num = 0;
int count = 0;
char str[INET_ADDRSTRLEN];
user_info = (USER_INFO *)malloc(sizeof(USER_INFO));
if(NULL == user_info)
{
return HANDLER_ERROR;
}
log_error_write(srv, __FILE__, __LINE__, "s","test");
/*get payload*/
handler_t result = connection_handle_read_post_state(srv, con);
log_error_write(srv, __FILE__, __LINE__, "sd","test", result);
if (result != HANDLER_GO_ON)
{
return result ;
}
log_error_write(srv, __FILE__, __LINE__, "s","test");
buffer *b = buffer_init();
chunkqueue *dst_cq = con->request_content_queue;
chunk *c = dst_cq->first;
if (NULL == c)
{
return HANDLER_ERROR;
}
while(c != NULL)
{
buffer_append_string(b, c->mem->ptr + c->offset);
c = c->next;
}
log_error_write(srv, __FILE__, __LINE__, "sb","test",b);
/*JSON字符串到JSON格式 */
cjson = cJSON_Parse(b->ptr);
if(!cjson)
{
return HANDLER_ERROR;
}
/*get userip */
userip = cJSON_GetObjectItem(cjson , "user_ip");
if(userip)
{
ip = userip->valuestring;
log_error_write(srv, __FILE__, __LINE__, "ss", "test", ip);
}
/*get username*/
username = cJSON_GetObjectItem(cjson , "user_name");
if(username)
{
name = username->valuestring;
log_error_write(srv, __FILE__, __LINE__, "ss", "test", name);
}
/*get page_num*/
Page_Num = cJSON_GetObjectItem(cjson, "page_num");
if(Page_Num)
{
page_num = Page_Num->valueint;
log_error_write(srv, __FILE__, __LINE__, "sd", "test", page_num);
}
/*get count*/
Count = cJSON_GetObjectItem(cjson, "count");
if(Count)
{
count = Count->valueint;
log_error_write(srv, __FILE__, __LINE__, "sd", "test", count);
}
/*如果用户IP存在 通过用户IP查询在线用户信息*/
if(ip != NULL)
{
cJSON *data, *res;
/*点分十进制转化十进制*/
inet_pton(AF_INET, ip, &clientip);
log_error_write(srv, __FILE__, __LINE__, "sd", "test", clientip);
/*通过用户IP地址查找用户信息*/
user_info = ufind_user_by_ippage(page_num, count, clientip);
if(user_info == NULL) /*无符合条件的用户信息*/
{
/*创建json对象*/
res = cJSON_CreateObject();
if(!res) return HANDLER_ERROR;
cJSON_AddNumberToObject(res, "resultcode", 0);
cJSON_AddStringToObject(res, "message", "查询成功");
cJSON_AddStringToObject(res, "data", "");
log_error_write(srv, __FILE__, __LINE__, "s","test");
}
else
{
/*创建json对象*/
data = cJSON_CreateObject();
if(!data)
{
return HANDLER_ERROR;
}
memset(str, 0, INET_ADDRSTRLEN);
inet_ntop(AF_INET,&user_info->auth_user.user_ip, str, sizeof(str));
cJSON_AddStringToObject(data, "user_ip", str);
cJSON_AddStringToObject(data, "user_name", user_info->auth_user.user_name);
cJSON_AddNumberToObject(data, "user_id", user_info->auth_user.user_id);
cJSON_AddNumberToObject(data, "group_id", user_info->auth_user.group_id);
cJSON_AddNumberToObject(data, "message_num", user_info->auth_user.message_num);
cJSON_AddNumberToObject(data, "byte_num", user_info->auth_user.byte_num);
cJSON_AddNumberToObject(data, "online_time", user_info->auth_user.online_time);
/*创建json对象*/
res = cJSON_CreateObject();
if(!res)
{
return HANDLER_ERROR;
}
cJSON_AddNumberToObject(res, "resultcode", 0);
cJSON_AddStringToObject(res, "message", "查询成功");
cJSON_AddItemToObject(res, "data", data);
log_error_write(srv, __FILE__, __LINE__, "s","test");
}
/*json对象转换为json字符串*/
result_str = cJSON_Print(res);
buffer *result_info = buffer_init();
result_info = buffer_init_string(result_str);
chunkqueue_append_buffer(con->write_queue, result_info);
buffer_free(result_info);
con->http_status = 200;
con->file_finished = 1;
cJSON_Delete(res);
return HANDLER_FINISHED;
}
else
{
cJSON *res;
log_error_write(srv, __FILE__, __LINE__, "ss", "test", username->valuestring);
ufind_user_by_name(page_num, count, username->valuestring, &pJsonArry);
/*计算数组长度 如果为0 说明没有在线用户信息*/
int iCount = cJSON_GetArraySize(pJsonArry);
log_error_write(srv, __FILE__, __LINE__, "sd", "test", iCount);
if(iCount == 0)
{
/*创建json对象*/
res = cJSON_CreateObject();
if(!res) return HANDLER_ERROR;
cJSON_AddNumberToObject(res, "resultcode", 0);
cJSON_AddStringToObject(res, "message", "查询成功");
cJSON_AddStringToObject(res, "data", "");
log_error_write(srv, __FILE__, __LINE__, "s","test");
}
else
{
/*创建json对象*/
res = cJSON_CreateObject();
if(!res)
{
return HANDLER_ERROR;
}
cJSON_AddNumberToObject(res, "resultcode", 0);
cJSON_AddStringToObject(res, "message", "查询成功");
cJSON_AddItemToObject(res, "data", pJsonArry);
log_error_write(srv, __FILE__, __LINE__, "s","test");
}
/*json对象转换为json字符串*/
result_str = cJSON_Print(res);
buffer *result_info = buffer_init();
result_info = buffer_init_string(result_str);
chunkqueue_append_buffer(con->write_queue, result_info);
buffer_free(result_info);
con->http_status = 200;
con->file_finished = 1;
cJSON_Delete(res);
}
return HANDLER_FINISHED;
}
/*在线用户(单个、批量)下线*/
/*iuput格式
{
"data": [
{"user_ip":"192.168.1.1", "user_port": 1010},
{"user_ip":"192.168.1.2", "user_port": 1010},
{"user_ip":"192.168.1.3", "user_port": 1010}
]
}
*/
/*删除所有在线用户*/
/*iuput格式
{
"data":"all",
}
*/
static handler_t user_offline(server *srv, connection *con, void* p_d)
{
p_d = p_d;
cJSON *cjson, *useripArry, *userip,*res;
cJSON *DelArry =NULL;
cJSON *Delsub;
uint32_t clientip;
int iCount;
char *result_str = NULL;
USER_INFO *user_info;
int del_num = 0;
char str[INET_ADDRSTRLEN];
char del[DEL_MAX_NUM][DEL_MAX_SIZE] = {0};
log_error_write(srv, __FILE__, __LINE__, "s","test");
/*get payload*/
handler_t result = connection_handle_read_post_state(srv, con);
log_error_write(srv, __FILE__, __LINE__, "sd","test", result);
if (result != HANDLER_GO_ON)
{
return result ;
}
log_error_write(srv, __FILE__, __LINE__, "s","test");
buffer *b = buffer_init();
chunkqueue *dst_cq = con->request_content_queue;
chunk *c = dst_cq->first;
if (NULL == c)
{
return HANDLER_ERROR;
}
while(c != NULL)
{
buffer_append_string(b, c->mem->ptr + c->offset);
c = c->next;
}
log_error_write(srv, __FILE__, __LINE__, "sb","test",b);
/*JSON字符串到JSON格式 */
cjson = cJSON_Parse(b->ptr);
if(!cjson)
{
return HANDLER_ERROR;
}
/*get data解析数组 */
useripArry = cJSON_GetObjectItem(cjson , "data");
if(!useripArry)
{
return HANDLER_ERROR;
}
/*获取数组长度*/
iCount = cJSON_GetArraySize(useripArry);
log_error_write(srv, __FILE__, __LINE__, "sd","test", iCount);
for(int i = 0; i < iCount; i++)
{
cJSON *pArrayItem = cJSON_GetArrayItem(useripArry, i);
if(pArrayItem)
{
/*用户IP地址*/
userip = cJSON_GetObjectItem(pArrayItem, "user_ip");
log_error_write(srv, __FILE__, __LINE__, "sd","test", i);
if(userip)
{
/*点分十进制转为十进制*/
inet_pton(AF_INET, userip->valuestring, &clientip);
log_error_write(srv, __FILE__, __LINE__, "sds","test", clientip, userip->valuestring);
user_info = ufind_user(clientip);
if(NULL != user_info)
{
/*根据用户IP删除用户信息*/
udelete_user(clientip);
log_error_write(srv, __FILE__, __LINE__, "s","test");
memset(str, 0, INET_ADDRSTRLEN);
inet_ntop(AF_INET, &clientip, str, sizeof(str));
log_error_write(srv, __FILE__, __LINE__, "ssd","test" , str, del_num);
strncpy(del[del_num], str, 24);
log_error_write(srv, __FILE__, __LINE__, "ssd","test" , del[del_num], del_num);
del_num++;
}
}
}
}
DelArry = cJSON_CreateArray(); /*创建数组*/
if(del_num == 0)
{
/*创建json对象*/
res = cJSON_CreateObject();
if(!res)
{
return HANDLER_ERROR;
}
log_error_write(srv, __FILE__, __LINE__, "s","test");
cJSON_AddNumberToObject(res, "resultcode", 0);
cJSON_AddStringToObject(res, "message", "删除成功");
cJSON_AddStringToObject(res, "data", "");
log_error_write(srv, __FILE__, __LINE__, "s","test");
}
else
{
for(int i = 0; i < del_num; i++)
{
char ipAddr[INET_ADDRSTRLEN];
memset(ipAddr, 0, INET_ADDRSTRLEN);
log_error_write(srv, __FILE__, __LINE__, "sd","test", i);
cJSON_AddItemToArray(DelArry, Delsub = cJSON_CreateObject()); /* 给创建的数组增加对象*/
strncpy(ipAddr, del[i], INET_ADDRSTRLEN);
log_error_write(srv, __FILE__, __LINE__, "ss","test", ipAddr);
cJSON_AddStringToObject(Delsub, "user_ip", ipAddr);
log_error_write(srv, __FILE__, __LINE__, "s","test");
}
/*创建json对象*/
res = cJSON_CreateObject();
if(!res)
{
return HANDLER_ERROR;
}
log_error_write(srv, __FILE__, __LINE__, "s","test");
cJSON_AddNumberToObject(res, "resultcode", 0);
cJSON_AddStringToObject(res, "message", "删除成功");
cJSON_AddItemToObject(res, "data", DelArry);
}
log_error_write(srv, __FILE__, __LINE__, "s","test");
/*json对象转换为json字符串*/
result_str = cJSON_Print(res);
buffer *result_info = buffer_init();
result_info = buffer_init_string(result_str);
chunkqueue_append_buffer(con->write_queue, result_info);
buffer_free(result_info);
con->http_status = 200;
con->file_finished = 1;
cJSON_Delete(res);
return HANDLER_FINISHED;
}
/*根据传输过来的url分情况执行*/
static handler_t mod_usermagnet_uri_handler(server *srv, connection *con, void* p_d)
{
/*case 1 根据不同条件查询用户信息
case 2 -线*/
log_error_write(srv, __FILE__, __LINE__, "s","mod_usermagnet_uri_handler");
handler_t t = HANDLER_GO_ON;
p_d = p_d;
if (con->request.http_method == HTTP_METHOD_GET)
{
return HANDLER_GO_ON;
}
log_error_write(srv, __FILE__, __LINE__, "s","test");
if (con->state == CON_STATE_READ_POST) {
chunkqueue *cq = con->request_content_queue;
if (cq->bytes_in != (off_t)con->request.content_length) {
handler_t r = connection_handle_read_post_state(srv, con);
if (r != HANDLER_GO_ON) return r;
}
}
else if (0 == con->request.content_length)
{
return HANDLER_GO_ON;
}
log_error_write(srv, __FILE__, __LINE__, "s","test");
/*url 与"/user-get"匹配,根据条件查询用户信息*/
if (0 == strcmp(con->uri.path->ptr, "/user-get"))
{
t = get_onlineuser_info(srv, con, p_d);
log_error_write(srv, __FILE__, __LINE__, "s","test");
}
else if (0 == strcmp(con->uri.path->ptr, "/user-offline"))
{
t = user_offline(srv, con, p_d);
log_error_write(srv, __FILE__, __LINE__, "s","test");
}
log_error_write(srv, __FILE__, __LINE__, "s","test");
con->http_status = 200;
con->file_finished = 1;
return t;
}
SETDEFAULTS_FUNC(mod_usermagnet_set_defaults)
{
mod_usermagnet_plugin_data *p = p_d;
p = p;//解决编译告警;
//srv = srv;//解决编译告警;
init_svr_ptr(srv);
return HANDLER_GO_ON;
}
int mod_usermagnet_plugin_init(plugin *p);
int mod_usermagnet_plugin_init(plugin *p) {
p->version = LIGHTTPD_VERSION_ID;
p->name = buffer_init_string("usermagnet");
p->init = mod_usermagnet_init;
p->set_defaults = mod_usermagnet_set_defaults;
p->handle_uri_clean = mod_usermagnet_uri_handler;
p->cleanup = mod_usermagnet_free;
p->data = NULL;
return 0;
}

View File

@ -17,6 +17,7 @@
#define UDESIZE (63)
#define UPWDSIZE (63)
static server* b_svr = NULL;
void * g_auth_hdbc = NULL; //用户认证连接句柄
typedef struct user_auth
@ -487,6 +488,7 @@ void user_auth_login(char* username, char* password, USER_AUTH_RET *auth_result)
/* 连接数据库 */
if(NULL == g_auth_hdbc)
{
//log_error_write(b_svr, __FILE__, __LINE__, "s","test");
g_auth_hdbc = connect_database(20);
}
@ -496,6 +498,7 @@ void user_auth_login(char* username, char* password, USER_AUTH_RET *auth_result)
bool ret_getconfig = get_config_data(g_auth_hdbc, config_data);
if (!ret_getconfig)
{
//log_error_write(b_svr, __FILE__, __LINE__, "s","test");
auth_result->ret = AUTH_FAIL_LACKINFO;
return;
}
@ -689,4 +692,11 @@ void reset_online_by_groupid(int *group_ids)
g_user_auth_ret_table[i].online_num = 0;
}
}
}
}
void binit_svr_ptr(void *srv)
{
if(srv) {
b_svr = (server*)srv;
}
}

View File

@ -3,6 +3,9 @@
#include <time.h>
struct server;
typedef struct server server;
typedef enum {
AUTH_SUCCESS = 0,
AUTH_FAIL_PASSWD = 1,
@ -64,4 +67,6 @@ void reset_online_by_userid(int *user_ids, int num);
/* 用户在线节点重置-按用户组id */
void reset_online_by_groupid(int *group_ids);
void binit_svr_ptr(void *srv);
#endif