⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mda2.c

📁 国际标准协议的
💻 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 + -