📄 mda2.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <fcntl.h>
#include <shadow.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include "account.h"
#include "acc_file.h"
#include "acc_shm.h"
extern int errno;
main(int agrc,char **argv)
{
FILE *fp_user,*fp_shadow;
BYTE buf[12];
BYTE buf1;
struct tm * tblock;
long expire;
time_t timer;
char cmdstr[300];
char msg[512];
struct spwd *aa,*bb;
long nbr;
int i,j,found=0;
stru_user user;
printf("\n根据user.dat修改shadow文件");
while(1)
{
/* sleep(3600);*/
if((fp_user=fopen("user.dat","rb"))==NULL)
{
printf("\nCan not open user.dat");
sprintf(msg, "Can not open user.dat");
msg[127] = '\0';
log_err_inf(msg);
continue;
}
if(fseek(fp_user,122800*sizeof(user),SEEK_SET)==-1)
{
printf("\nfseek error!");
fclose(fp_user);
sprintf(msg, "fseek user.dat error!");
msg[127] = '\0';
log_err_inf(msg);
continue;
}
j=0;
while(!feof(fp_user))
{
if(fread(&user,sizeof(stru_user),1,fp_user)!=1)
{
printf("\nFinish scanning user.dat!");
sprintf(msg, "Finish scanning user.dat");
msg[127] = '\0';
log_err_inf(msg);
break;
}
if(user.Gid==212 || user.Gid==400)
{
continue;
}
bb=getspnam(user.Uname);
if(bb==NULL)
{
/* 这是一个在user.dat中新开的用户 */
if(user.AccexpTm<=(time(NULL)+24*3600) || user.Status!=0)
{
printf("\n计费系统帐号 %s 未启用(或已过期,或被冻结,或销户),暂不在A2开设相应帐号",user.Uname);
}
else
{
expire=user.AccexpTm;
tblock=localtime(&((time_t)expire));
printf("\nBegin add new user %s",user.Uname);
if((tblock->tm_year-100)>9)
{
tblock->tm_year=109;
}
for(nbr = 1001; nbr <= 60000; nbr++)
{
if (getpwuid(nbr) == NULL)
break;
}
if(nbr >= 60001)
{
printf("\n没有可以分配的UID!");
sprintf(msg, "没有可以分配的UID!(useradd %s)",user.Uname);
msg[127] = '\0';
log_err_inf(msg);
}
memset(cmdstr,0,strlen(cmdstr)-1);
sprintf(cmdstr,"useradd -c 根据计费系统转换过来的新用户 -d /export/home/%s -e %d/%d/%d -g %d -m -k /export/home/stud02/ -u %d -s /bin/csh %s",user.Uname,tblock->tm_mon+1,tblock->tm_mday,tblock->tm_year-100,user.Gid,nbr,user.Uname);
printf("\ncmdstr is %s",cmdstr);
if(system(cmdstr)==-1)
{
printf("\nExecute command failed!");
sprintf(msg, "Execute command failed!(useradd %s)",user.Uname);
msg[127] = '\0';
log_err_inf(msg);
continue;
}
memset(cmdstr,0,strlen(cmdstr)-1);
sprintf(cmdstr,"edquota -p abc123 %s",user.Uname);
printf("\ncmdstr is %s",cmdstr);
if(system(cmdstr)==-1)
{
printf("\nExecute command failed!");
sprintf(msg, "Execute command failed!(edquota %s)",user.Uname);
msg[127] = '\0';
log_err_inf(msg);
}
/*******************************修改SHADOW文件******************************/
if(lckpwdf()==-1)
{
printf("\n非常抱歉,lckpwdf failed!");
sprintf(msg, "lckpwdf failed!(For add user %s)",user.Uname);
msg[127] = '\0';
log_err_inf(msg);
continue;
}
if((fp_shadow=fopen("/etc/new.shadow.file.weng","w"))==NULL)
{
printf("\n非常抱歉,open /etc/new.shadow.file.weng failed!");
ulckpwdf();
sprintf(msg, "Open /etc/new.shadow.file.weng failed!(For add user %s)",user.Uname);
msg[127] = '\0';
log_err_inf(msg);
continue;
}
setspent();
found=0;
while((aa=getspent())!=NULL )
{
if (!strcmp(aa->sp_namp, user.Uname))
{
found=1;
strcpy(aa->sp_pwdp,user.Passwd);
aa->sp_warn=14;
}
if (putspent(aa,fp_shadow) != 0)
{
found = 0;
break;
}
}
fclose(fp_shadow);
chmod("/etc/new.shadow.file.weng", S_IRUSR);
if(!found)
{
/* 对该帐号的操作失败 */
printf("\n对用户 [%s] 的操作失败!",user.Uname);
sprintf(msg, "found error!(For add user %s)",user.Uname);
msg[127] = '\0';
log_err_inf(msg);
}
else
{
if(!rename("/etc/new.shadow.file.weng","/etc/shadow"))
{
printf("\nSuccess!(For add user %s)",user.Uname);
sprintf(msg, "Success!(For add user %s)",user.Uname);
msg[127] = '\0';
log_err_inf(msg);
}
else
{
printf("\nCan't rename!!");
sprintf(msg, "Can't rename /etc/new.shadow.file.weng (For add user %s)",user.Uname);
msg[127] = '\0';
log_err_inf(msg);
}
}
ulckpwdf();
}
/*******************************修改SHADOW文件******************************/
}
/* else if(user.Status!=0 || (user.CashAmt<50 && user.Type==1)) 计时用户的现金余额剩余?时,即将其在A2上的邮件帐号停止*/
else if(user.Status!=0)
{
/* 该用户在user.dat中已被锁定或注销 */
if((((bb->sp_expire)*24*3600-time(NULL))<0 || ((bb->sp_expire)*24*3600-time(NULL))<24*3600*2) && bb->sp_expire>0)
{
printf("\n用户 [%s] 已在A2锁定,无需再改",user.Uname);
}
else
{
timer=time(NULL);
tblock=localtime(&timer);
printf("\nBegin lock user %s",user.Uname);
memset(cmdstr,0,strlen(cmdstr)-1);
sprintf(cmdstr,"usermod -e %d/%d/%d %s",tblock->tm_mon+1,tblock->tm_mday+1,tblock->tm_year-100,user.Uname);
printf("\ncmdstr is %s",cmdstr);
if(system(cmdstr)==-1)
{
printf("\nExecute command failed!");
sprintf(msg, "Execute command failed!(Lock user %s)",user.Uname);
msg[127] = '\0';
log_err_inf(msg);
}
else
{
printf("\nFinish lock user %s",user.Uname);
}
}
}
else if(labs((bb->sp_expire)*24*60*60-user.AccexpTm)>24*60*60*2 && user.Type!=1)
{
expire=user.AccexpTm;
tblock=localtime(&((time_t)expire));
/*
printf("\nuser is %s",user.Uname);
printf("\nday is %d",tblock->tm_mday);
printf("\nmon is %d",tblock->tm_mon+1);
printf("\nyear is %d",tblock->tm_year-100);
*/
if((bb->sp_expire==-1 || bb->sp_expire>=14245) && (tblock->tm_year-100)>=9)
{
printf("\nNo change for user %s",user.Uname);
}
else
{
if((tblock->tm_year-100)>=9)
{
tblock->tm_year=109;
}
printf("\nBegin modify expire date for user %s",user.Uname);
memset(cmdstr,0,strlen(cmdstr)-1);
sprintf(cmdstr,"usermod -e %d/%d/%d %s",tblock->tm_mon+1,tblock->tm_mday,tblock->tm_year-100,user.Uname);
printf("\ncmdstr is %s",cmdstr);
if(system(cmdstr)==-1)
{
printf("\nExecute command failed!");
sprintf(msg, "Execute command failed !(modify expire date for user %s)",user.Uname);
msg[127] = '\0';
log_err_inf(msg);
}
else
{
printf("\nFinish modify expire date for user %s",user.Uname);
}
}
}
else
{
printf("\n用户 %s 无需修改",user.Uname);
}
j++;
}
fclose(fp_user);
sleep(1800);
}
printf("\n结束");
exit(0);
}
/*************************************************************************
*
* Function: log_err_inf
*
*************************************************************************/
log_err_inf(msg)
char *msg;
{
FILE *msgfd;
char buffer[1024];
time_t timeval;
if((msgfd = fopen("mda2_err.txt", "a")) == (FILE *)NULL) {
printf("\nCouldn't open mda2_err.txt for logging!! %s",strerror(errno));
perror("ERROR!!");
return(-1);
}
timeval = time(0);
fprintf(msgfd, "%-24.24s:%s\n", ctime(&timeval),msg);
fclose(msgfd);
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -