📄 lan_ip_deleteuser.c
字号:
/**************************************************************************************
融海Intranet用户管理系统
删除用户.
发送给用户管理进程的字符串格式:
userName
当用户管理进程受到该消息后,删除相应的用户,返回成功的消息.
**************************************************************************************/
#include "lan_ip_jf-cgi.h"
char IpDataFile[30] = "ipdata.dat";/*正常传入传出的IP包数据细节文件名称*/
char IpSumDataFile[30] = "ipsumdata.dat";/*正常传入传出的IP包数据总体文件名称*/
FILE* IpDataFptr;/*正常传入传出的IP包数据详细文件指针*/
FILE* IpSumDataFptr;/*正常传入传出的IP包总体数据文件指针*/
#ifdef ANALYZE_BY_IP
/*
将网段地址列表写入一个文件中
*/
int WriteInternalNetListToFile(int netPartNo,char* fileName)
{
FILE* fptr;
char addr[30];
char addr1[30];
InternalNetType* netPtr;
if ((fptr = fopen(fileName,"w")) == NULL)
{
PrintError("Don't Open Internal File %s.\n",fileName);
return -1;
}
netPtr = NetPartList[netPartNo];
while (netPtr)
{
TransIpAddress(1,addr,&(netPtr->netAddress));
TransIpAddress(1,addr1,&(netPtr->netMask));
fprintf(fptr,"%s|%s|%d\n",addr,addr1,netPtr->type);
netPtr = netPtr->next;
}
fclose(fptr);
}
/*
根据所给的IP地址和网段链表的表头,在列表中查找是否有匹配的网络或主机
若未找到,则返回NULL
*/
InternalNetType* FindNetPartList(InternalNetType* netPartHead,struct in_addr addr)
{
InternalNetType* netPtr;
netPtr = netPartHead;
while (netPtr)
{
if (netPtr->type ==0)
{/*为网络*/
if ((addr.s_addr&(netPtr->netMask.s_addr)) == netPtr->netAddress.s_addr)
return netPtr;
}
else
{/*为主机*/
if (addr.s_addr == netPtr->netAddress.s_addr)
return netPtr;
}
netPtr = netPtr->next;
}
return NULL;
}
/*
判断给定的IP地址在哪个网段中
判断时,查询次序是由大的网段号到小的网段号,所以NET_PART_1为缺省网段,即当查不到网段号时,就将该网段
设置为NET_PART_1,因此该网段最好为"国外网段",因为"国外网段"的号最多,无法判断
在同一网段列表中的判断次序为由后向前.
*/
int GetNetPartNo(struct in_addr ip)
{
int i;
for (i = NET_PART_NUM - 1; i >= 0;i++)
{
if (FindNetPartList(NetPartList[i],ip) != NULL)
return i;
}
return NET_PART_1;/*缺省返回第一个网段号*/
}
/*
保存一个用户的一天统计数据
*/
void SaveOneUserSumData(FILE* fptr,int month,int day,int groupID,int userID,SumDataType *data1)
{
SumDataType data,*dataPtr = &data;
/*1.修改当天的数据*/
/*注意:以后可用将*32改为向左移5位*/
/*移动文件指针到相应位置*/
fseek(fptr,((month-1)*32 + day)*SumDataSize,SEEK_SET);
/*读取文件中的数据*/
fread(dataPtr,SumDataSize,1,fptr);
/*修改数据*/
for (i = 0; i < TIME_STAGE_NUM; i++)
for (j = 0; j < NET_PART_NUM; j++)
{
data.inPackets[i][j] += data1->inPackets[i][j];
data.inPacketsBytes[i][j] += data1->inPacketsBytes[i][j];
data.outPackets[i][j] += data1->outPackets[i][j];
data.outPacketsBytes[i][j] += data1->outPacketsBytes[i][j];
}
/*重新定位*/
fseek(fptr,-SumDataSize,SEEK_CUR);
/*再写入*/
fwrite(dataPtr,SumDataSize,1,fptr);
/*2.修改月总数数据*/
/*移动文件指针到相应位置*/
fseek(fptr,(month-1)*32*SumDataSize,SEEK_SET);
/*读取文件中的数据*/
fread(dataPtr,SumDataSize,1,fptr);
/*修改数据*/
for (i = 0; i < TIME_STAGE_NUM; i++)
for (j = 0; j < NET_PART_NUM; j++)
{
data.inPackets[i][j] += data1->inPackets[i][j];
data.inPacketsBytes[i][j] += data1->inPacketsBytes[i][j];
data.outPackets[i][j] += data1->outPackets[i][j];
data.outPacketsBytes[i][j] += data1->outPacketsBytes[i][j];
}
/*重新定位*/
fseek(fptr,-SumDataSize,SEEK_CUR);
/*再写入*/
fwrite(dataPtr,SumDataSize,1,fptr);
/*将data1中的数据清0*/
memset(data1,0,SumDataSize);
}
/*
改变当前的日期或时间段
字符串格式:1|month|day
2|time stage
若第一个域为1,则表明是日期
若第一个域为2,则表明是时间段
flag==0,保存进入数据
flag== 1,保存外出数据
*/
void ChangeTimeStageOrDate(char* str,int *CurrentMonth,int * CurrentDay,int * CurrentTimeStage,int groupID,int userID,SumdataType* data1)
{
char str[100];
char result[20],*startField;
int flag;
int month,day,timeStage;
static int state = 0;
/*得到标识*/
startField = GetOneField(str,result);
flag = atoi(result);
switch (flag)
{
case 1:/*日期发生了变化*/
startField = GetOneField(startField,result);
month = atoi(result);
startField = GetOneField(startField,result);
day = atoi(result);
if (state == 0)
{/*若是第一次调用本函数,则不保存数据,因为数据文件的第一行一定是日期行*/
state = 1;
*CurrentMonth = month;
*CurrentDay = day;
return;
}
if ((*CurrentMonth != month) || (*CurrentDay != day))
{
/*时间发生变化,将数据保存*/
SaveOneUserSumData(fptr,*CurrentMonth,*CurrentDay,groupID,userID,data1)
*CurrentMonth = month;
*CurrentDay = day;
}
break;
case 2:/*时间段发生了变化*/
startField = GetOneField(startField,result);
timeStage = atoi(result);
if ((timeStage >= TIME_STAGE_1) && timeStage < TIME_STAGE_NUM))
*CurrentTimeStage = timeStage;
break;
}
}
#endif
/*
分析登录文件和IP流量文件
*/
void AnalyzeCurLogAndIPFile(int myGroupID,int myUserID)
{
int change = 0;
FILE* fptr,*logFptr,*sumFptr;
int i;
char oneStr[200],*logtime;
char userIDStr[20];
char groupIDStr[20];
int userID;
long inPackets,inPacketsBytes;
long outPackets,outPacketsBytes;
long loginTime,logoutTime;
char str1[50],*str2,*dataPtr;
char logoutTimeStr[30];
char logFileName[100],sumFileName[100];
char fileName[150];
struct tm * now,*now1;
int month,day;
SumDataType sumData,*sumDataPtr = &sumData;
/*1.分析登录信息文件*/
/*打开登录细节文件*/
sprintf(fileName,"%s%s",PATH,IpSumDataFile);
if ((fptr = fopen(fileName,"r")) == NULL)
{/*正常传入的IP包数据总体文件指针*/
PrintError("Don't open file:%s.\n",IpSumDataFile);
return;
}
/*打开用户登录记录文件*/
sprintf(logFileName,"%s%d/%d",PATH,myGroupID,myUserID);
if ((logFptr = fopen(logFileName,"a+")) == NULL)
{
PrintError("Open File Error:%s.in MaintainSumDataFile().\n",logFileName);
return;
}
/*打开用户统计文件*/
sprintf(sumFileName,"%s%d/%d%s",PATH,myGroupID,myUserID,SumSuffix);
if ((sumFptr = fopen(sumFileName,"rb+")) == NULL)
{
PrintError("Open File Error:%s.in MaintainSumDataFile().\n",sumFileName);
return;
}
while (!feof(fptr))
{
fgets(oneStr,200,fptr);
if (feof(fptr))
break;
/*1.得到上述各个数据inPackets|inPacketsBytes|outPackets|outPacketsBytes|logout Time*/
str2 = GetOneField(oneStr,str1);/*timeID*/
str2 = GetOneField(str2,userIDStr);/*user id*/
userID = atoi(userIDStr);
/*若不是该用户的记录则读入下一条记录*/
if (userID != myUserID)
continue;
change = 1;/*找到了该用户的数据*/
dataPtr = GetOneField(str2,str1);/*ip address*/
str2 = GetOneField(dataPtr,str1);/*inPackets*/
inPackets = atol(str1);
str2 = GetOneField(str2,str1);/*inpackets bytes*/
inPacketsBytes = atol(str1);
str2 = GetOneField(str2,str1);/*outPackets*/
outPackets = atol(str1);
logtime = GetOneField(str2,str1);/*outpackets bytes*/
outPacketsBytes = atol(str1);
#ifdef ZOOM-OP
inPackets *= ZoomRatio[0];
inPacketsBytes *= ZoomRatio[0];
outPackets *= ZoomRatio[1];
outPacketsBytes *= ZoomRatio[1];
#endif
str2 = GetOneField(logtime,str1);/*login time*/
loginTime = atol(str1);
str2 = GetOneField(str2,str1);/*logout time*/
logoutTime = atol(str1);
/*存入到用户细节文件中*/
/*处理用户统计文件*/
/*1。得到月份*/
now = localtime(&logoutTime);
sprintf(logoutTimeStr,"%d.%d.%d %d:%d:%d",
now->tm_year,now->tm_mon+1,now->tm_mday,now->tm_hour,now->tm_min,now->tm_sec);
month = now->tm_mon;
day = now->tm_mday;
now1 = localtime(&loginTime);
/*给logtime赋值实际上就是修改oneStr中的后两个域值*/
#ifdef ZOOM-OP
sprintf(dataPtr,"%ld|%ld|%ld|%ld|%d.%d.%d %d:%d:%d|%s\n",
inPackets,inPacketsBytes,outPackets,outPacketsBytes,
now1->tm_year,now1->tm_mon+1,now1->tm_mday,now1->tm_hour,now1->tm_min,now1->tm_sec,logoutTimeStr);
#else
sprintf(logtime,"%d.%d.%d %d:%d:%d|%s\n",
now1->tm_year,now1->tm_mon+1,now1->tm_mday,now1->tm_hour,now1->tm_min,now1->tm_sec,logoutTimeStr);
#endif
fprintf(logFptr,oneStr);
/*2。读取该用户当月数据*/
/*将该用户当月数据增加后,再存入*/
fseek(sumFptr,SumDataSize*month*32,SEEK_SET);
fread(sumDataPtr,SumDataSize,1,sumFptr);
/*若按照IP包流量来分析,则关于流量部分不必在本部分处理,但连接时间则要处理*/
#ifndef ANALYZE_BY_IP
sumData.inPackets[0][0] += inPackets;
sumData.inPacketsBytes[0][0] += inPacketsBytes;
sumData.outPackets[0][0] += outPackets;
sumData.outPacketsBytes[0][0] += outPacketsBytes;
#endif
sumData.connectTime += (logoutTime - loginTime);
fseek(sumFptr,-SumDataSize,SEEK_CUR);
fwrite(sumDataPtr,SumDataSize,1,sumFptr);
/*将该用户当日数据增加后,再存入*/
fseek(sumFptr,SumDataSize*(month*32 + day),SEEK_SET);
fread(sumDataPtr,SumDataSize,1,sumFptr);
/*若按照IP包流量来分析,则关于流量部分不必在本部分处理,但连接时间则要处理*/
#ifndef ANALYZE_BY_IP
sumData.inPackets[0][0] += inPackets;
sumData.inPacketsBytes[0][0] += inPacketsBytes;
sumData.outPackets[0][0] += outPackets;
sumData.outPacketsBytes[0][0] += outPacketsBytes;
#endif
sumData.connectTime += (logoutTime - loginTime);
fseek(sumFptr,-SumDataSize,SEEK_CUR);
fwrite(sumDataPtr,SumDataSize,1,sumFptr);
}
fclose(logFptr);
fclose(sumFptr);
fclose(fptr);
#ifdef ANALYZE_BY_IP
/*2.分析IP流量文件*/
if (!change)
return;
else
{
struct in_addr srcIp,dstIp;
struct in_addr *srcIpPtr = &srcIp,*dstIpPtr = &dstIp;
int inOut;
SumDataType data;
int netPartNo = 0,CurrentTimeStage = 0;
int CuurentMonth,CurrentDay,CurrentTimeStage;
/*从文件中读取网段列表*/
ReadNetPartFile();
/*打开用户统计文件*/
sprintf(sumFileName,"%s%d/%d%s",PATH,myGroupID,myUserID,SumSuffix);
if ((sumFptr = fopen(sumFileName,"rb+")) == NULL)
{
PrintError("Open File Error:%s.in MaintainSumDataFile().\n",sumFileName);
return;
}
sprintf(fileName,"%s%s",PATH,IpDataFile);
if ((fptr = fopen(fileName,"r")) == NULL)
{/*正常传入的IP包数据细节文件指针*/
PrintError("Don't open file:%s.\n",IpDataFile);
return;
}
while (!feof(fptr))
{
fgets(oneStr,200,fptr);
if (feof(fptr))
break;
if (oneStr[0] == '*')
{/*表明这一行为日期或时间段控制信息*/
ChangeTimeStageOrDate(&oneStr[1],&CurrentMonth,&CurrentDay,&CurrentTimeStage,myGroupID,myUserID,&Data);
continue;
}
/*得到方向0---传入,1---传出*/
startField = GetOneField(oneStr,result);
inOut = atoi(result);
/*得到用户ID*/
startField = GetOneField(startField,result);
userID = atoi(result);
/*若该记录不是本用户的,则读取下一行数据*/
if (userID != myUserID)
continue
/*得到源IP地址*/
startField = GetOneField(startField,result);
TransIpAddress(0,result,srcIpPtr);
/*得到目的IP地址*/
startField = GetOneField(startField,result);
TransIpAddress(0,result,dstIpPtr);
/*得到长度*/
startField = GetOneField(startField,result);
length = atol(startField);
netPartNo = GetNetPartNo(srcIp);
if (inOut == 0)
{/*进入包*/
data.inPackets[CurrentTimeStage][netPartNo]++;
data.inPacketsBytes[CurrentTimeStage][netPartNo] += legth;
}
else
{/*外出包*/
data.outPackets[CurrentTimeStage][netPartNo]++;
data.outPacketsBytes[CurrentTimeStage][netPartNo] += legth;
}
}/*while end*/
SaveOneUserSumData(sumFptr,CurrentMonth,CurrentDay,myGroupID,myUserID,&data);
fclose(fptr);
fclose(sumFptr);
}
#endif
}
/*
移走用户统计文件和登录记录文件
*/
void MoveUserSumFile(int groupID,int userID)
{
char command[150];
sprintf(command,"mv -f %s%d/%d%s %sdelete/.",PATH,groupID,userID,SumSuffix,PATH);
/*
cgiPrintf("<br>%s</br>",command);
*/
system(command);
sprintf(command,"mv -f %s%d/%d %sdelete/.",PATH,groupID,userID,PATH);
system(command);
}
/*
删除一个用户成功
字符串格式:userName|groupID|userID
*/
void DeleteUserSuccess()
{
int groupID,userID;
char userName[30];
char result[20];
char* startField;
cgiPrintf("<br>");
cgiPrintf("该用户已经被成功删除!");
/*1.得到用户ID*/
startField = GetOneField(CGIInMessage.value,userName);
startField = GetOneField(startField,result);
groupID = atoi(result);
startField = GetOneField(startField,result);
userID = atoi(result);
/*2.检查当前IP流量文件和登录记录文件,看是否今天该用户曾经上网*/
AnalyzeCurLogAndIPFile(groupID,userID);
/*3.显示该用户总的使用费用*/
/*显示表头*/
ShowUserDataTableHead();
/*显示全年数据*/
ShowOneUserSumData(groupID,userID,userName,PATH,1);
cgiPrintf("</TABLE></CENTER>");
/*4.将该用户的统计文件和登录记录文件移到delete目录下*/
MoveUserSumFile(groupID,userID);
}
/*
处理从用户进程来的消息
UM---User Managemant
*/
void RecieveMessageFromUM()
{
int rtn;
rtn = msgrcv(CGIInMessageID, &CGIInMessage, sizeof(struct msg_scs), pid, 0);
if (rtn <= 0)
exit(1);
if (CGIInMessage.command==DELETE_USER_SUCCESS)
{
DeleteUserSuccess();
exit(0);
}
exit(1);
}
/*
处理发送给用户进程的消息
*/
void SendMessageToUM()
{
int rtn;
rtn = msgsnd(CGIOutMessageID, &CGIOutMessage,sizeof (struct msg_scs), 0);
if (rtn == 0)
{
RecieveMessageFromUM();
return;
}
exit(1);
}
/*
产生错误信息,并返回给用户
*/
void ErrorInfo(int no)
{
exit(no);
}
/*
主程序开始
参数1:userName
*/
int main(argc,argv)
int argc;
char** argv;
{
char userName[USER_NAME_LEN];
char ipAddr[20];
FILE* userPtr;
/*得到应用程序所在的路径PATH和本机的IP地址HOSTIP*/
GetPATHAndHOSTIPFromFile();
/*检查用户名*/
TangStrncpy(userName, argv[1],USER_NAME_LEN);
if (CheckString(userName) == 0)
exit(1);
/*初始化消息结构*/
InitMessage();
/*得到本进程的ID号*/
pid = getpid();
/*发送命令给用户管理进程*/
/*
发送给用户管理进程的字符串格式:userName
*/
CGIOutMessage.mtype = pid;
CGIOutMessage.command = DELETE_USER;
sprintf(CGIOutMessage.value,"%s",userName);
SendMessageToUM();
exit(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -