?? 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 + -