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

📄 vconvert.c

📁 相当优秀的 UNIX 进程管理工具
💻 C
字号:
/* * $Id: vconvert.c,v 1.2.2.1 2004/03/10 15:18:50 tomcollins Exp $ * Copyright (C) 1999-2002 Inter7 Internet Technologies, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <time.h>#include <pwd.h>#include <sys/types.h>#include <dirent.h>#include <sys/stat.h>#include <fcntl.h>#include <signal.h>#include "config.h"#include "vpopmail.h"#include "vauth.h"#include "vmysql.h"#ifdef HAS_SHADOW#include <shadow.h>#endifint do_all_domains();#define MAX_BUFF 256char User[MAX_BUFF];char Passwd[MAX_BUFF];char Gecos[MAX_BUFF];char Dir[MAX_BUFF];#define MYSQL_SITE_ARG "-m"#define CDB_SITE_ARG   "-c"#define ETC_SITE_ARG   "-e"#define ETC_FILE_ARG   "-f"#define PASSWD_FILE_ARG "-p"#define MYSQL_SITE     1#define CDB_SITE       2#define ETC_SITE       3#define PASSWD_SITE    4#define SQWEBMAIL_SITE 5#define FORMAT_NOFORMAT 0 #define FORMAT_USERPASS 1 #define PASSWD_TOKENS " :\n\t"int FromFormat;int ToFormat;int Debug;int conv_domain( char *); int set_sqwebmail_pass( char *);int cdb_to_default( char *);int sql_to_cdb( char *);int etc_to_default( char *);void usage();void get_options(int argc, char **argv);int passwd_to_vpopmail( char *domain );char PasswdFile[MAX_BUFF];int  PasswdFormat;int main(int argc, char *argv[]){	get_options(argc,argv);	if ( optind == argc ) {		do_all_domains();	} else {		for(;optind<argc;++optind){			printf("converting %s ", argv[optind]);			lowerit(argv[optind]);			if ( conv_domain( argv[optind] ) != 0 ) {				printf("domain conversion failed\n");				/* should exit -1 here? */			} else {				printf("done\n");			}		}	}	return(vexit(0));}int do_all_domains(){ FILE *fs; char assign_file[MAX_BUFF]; static char tmpbuf[MAX_BUFF]; int i;    snprintf(assign_file, sizeof(assign_file), "%s/users/assign",  QMAILDIR);     if ( (fs=fopen(assign_file, "r"))==NULL ) {       snprintf(tmpbuf, sizeof(tmpbuf), "could not open qmail assign file at %s\n", assign_file);       perror(tmpbuf);       vexit(-1);    }    while ( fgets(tmpbuf, sizeof(tmpbuf),fs) != NULL ) {        if (*tmpbuf != '+') continue;  /* ignore non-domain entries */        for(i=1;tmpbuf[i]!=':';++i);        tmpbuf[i-1] = 0;        /* ignore non-domain entries */        if (strchr (tmpbuf, '.') == NULL) continue;	if ( tmpbuf[1] != '\n' ) {            printf("converting %s ...", &tmpbuf[1] );            if ( conv_domain( &tmpbuf[1] ) != 0 ) {                printf("domain conversion failed\n");                /* should vexit -1 here? */            } else {                printf("done\n");            }        }    }    fclose(fs);    return(0);}int conv_domain( char *domain ){	switch ( FromFormat ) {		case SQWEBMAIL_SITE:			return(set_sqwebmail_pass( domain));			break;		case MYSQL_SITE:			switch (ToFormat) {				case CDB_SITE:					return(sql_to_cdb( domain));				default:					printf("unknown conversion\n");					return(-1);			}			break;		case CDB_SITE:			return(cdb_to_default( domain));			break;		case ETC_SITE:			switch ( ToFormat ) {				case MYSQL_SITE: 					return(etc_to_default( domain));				case CDB_SITE:					return(etc_to_default( domain ));				default:					printf("unknown conversion\n");					return(-1);			}			break;		case PASSWD_SITE:			return( passwd_to_vpopmail( domain ));		default: 			printf("unknown converstion\n");			return(-1);	}	printf(".");}int cdb_to_default( char *domain ){#ifdef USE_SQL FILE *fs; char tmpbuf[MAX_BUFF]; struct vqpasswd *pw; int domain_str_len = strlen( domain ); char domain_dir[MAX_BUFF]; FILE *assign_fs; static char assignbuf[MAX_BUFF]; int i, colon_count, dir_count; int bFoundDomain = 0; char assign_file[MAX_BUFF];    snprintf(assign_file, sizeof(assign_file), "%s/users/assign",  QMAILDIR);          if ( (assign_fs=fopen(assign_file, "r"))==NULL ) {       snprintf(tmpbuf, sizeof(tmpbuf), "could not open qmail assign file at %s\n", assign_file);       perror(tmpbuf);       return(-1);    }    while ( fgets(assignbuf, sizeof(assignbuf), assign_fs) != NULL && !bFoundDomain )    {	/* search for the matching domain record */	if ( strncmp( domain, &assignbuf[1], domain_str_len ) == 0 )	{		bFoundDomain = 1;		/* found match, now get directory */		for ( i=1, colon_count = 0;		      colon_count < 4;		      colon_count++, i++ )		{			for( ; 			     assignbuf[i]!=':';			     ++i )				; /* skip non-colon characters */		}			/* found 4th colon, so get the directory name */		for( dir_count = 0; 		     assignbuf[i]!=':';		     ++i, dir_count++ )		{			domain_dir[dir_count] = assignbuf[i];		}		domain_dir[dir_count] = 0;  /* null termination */	}    }        fclose(assign_fs);    vauth_deldomain(domain);    vauth_adddomain(domain);    vget_assign(domain, Dir, sizeof(Dir), NULL, NULL );    snprintf(tmpbuf, sizeof(tmpbuf), "%s/vpasswd", Dir);    fs = fopen(tmpbuf,"r");    if ( fs == NULL ) return(-1);    while( (pw=vgetent(fs)) != NULL ) {      if (vauth_adduser(pw->pw_name, domain, pw->pw_passwd,                         pw->pw_gecos, pw->pw_dir, pw->pw_uid) != 0) {        printf("User %s domain %s did not add\n", pw->pw_name, domain);        continue;      }      vauth_setpw(pw, domain);    }    fclose(fs);#endif /* USE_SQL */    return(0);}int sql_to_cdb( char *domain){#ifdef USE_SQL struct vqpasswd *pw; FILE *fs; char tmpbuf[MAX_BUFF];        if (vget_assign(domain, Dir, sizeof(Dir), NULL, NULL ) == NULL) {		printf("Error. Domain not found\n");		return (-1);	}	snprintf(tmpbuf, sizeof(tmpbuf), "%s/vpasswd", Dir);	if ( (fs = fopen(tmpbuf,"w")) == NULL ) {		printf("could not open vpasswd file %s\n", tmpbuf);		return(-1);	}	pw = vauth_getall(domain, 1, 1);	while( pw != NULL ) {#ifdef CLEAR_PASS		fprintf(fs, "%s:%s:%d:%d:%s:%s:%s:%s\n",			pw->pw_name,			pw->pw_passwd,			pw->pw_uid,			pw->pw_gid,			pw->pw_gecos,			pw->pw_dir,			pw->pw_shell,			pw->pw_clear_passwd);#else /* CLEAR_PASS */ 		fprintf(fs, "%s:%s:%d:%d:%s:%s:%s\n", 			pw->pw_name,			pw->pw_passwd,			pw->pw_uid,			pw->pw_gid,			pw->pw_gecos,			pw->pw_dir,			pw->pw_shell);#endif /* CLEAR_PASS */		pw = vauth_getall(domain, 0, 1);	}	fclose(fs);	printf("%s done\n", domain);#endif /* USE_SQL */	return(0);}int etc_to_default( char *domain ){ struct passwd *mypw; struct vqpasswd *newpw = NULL; char *passwd; int i;#ifdef HAS_SHADOW struct spwd *smypw;#endif	while( (mypw = getpwent()) != NULL ) {#ifdef HAS_SHADOW		if ( (smypw = getspnam(mypw->pw_name)) == NULL) continue;		i = strlen(smypw->sp_pwdp)+1;		passwd = malloc(i);		snprintf( passwd, i, "%s", smypw->sp_pwdp );#else		i = strlen(mypw->pw_passwd)+1;		passwd = malloc(i);		snprintf( passwd, i, "%s", mypw->pw_passwd );#endif		if ( strlen(passwd) > 2 ) {			if (vadduser( mypw->pw_name, domain, "xxxx", 				mypw->pw_gecos, USE_POP) != 0) {				printf("user %s domain %s did not add\n", 					mypw->pw_name, domain);				continue;			}			newpw = vauth_getpw( mypw->pw_name, domain);			newpw->pw_passwd = passwd;			vauth_setpw( newpw, domain);		} else {			printf("skipping %s\n", mypw->pw_name);		}		free(passwd);	}	return(0);}void usage(){	fprintf(stdout, "vconvert: usage\n");	fprintf(stdout, " The first option sets which format to convert FROM,\n");	fprintf(stdout, " the second option sets which format to convert TO.\n");	fprintf(stdout, " -e = etc format\n"); 	fprintf(stdout, " -c = cdb format\n"); 	fprintf(stdout, " -m = sql format\n"); 	fprintf(stdout, " -S = set sqwebmail passwords\n"); 	fprintf(stdout, " -v = version\n"); 	fprintf(stdout, " -d = debug info\n"); 	/*	fprintf(stdout, " [-f file] lets you override /etc/passwd as the\n"); 	fprintf(stdout, " default file to use for -e option\n"); 	*/}void get_options(int argc, char **argv){ int c; int errflag;	errflag = 0;	FromFormat = -1;	ToFormat = -1;	PasswdFile[0] = 0;	PasswdFormat = 0;	Debug = 0;	while( !errflag && (c=getopt(argc,argv,"mcep:Svd")) != -1 ) {		switch(c) {			case 'd':				Debug = 1;				break;			case 'v':				printf("version: %s\n", VERSION);				break;			case 'S':				FromFormat = SQWEBMAIL_SITE;				ToFormat = SQWEBMAIL_SITE;				break;			case 'm':				if ( FromFormat == -1 ) FromFormat = MYSQL_SITE;				else ToFormat = MYSQL_SITE;				break;			case 'c':				if ( FromFormat == -1 ) FromFormat = CDB_SITE;				else ToFormat = CDB_SITE;				break;			case 'e':				if ( FromFormat == -1 ) FromFormat = ETC_SITE;				else ToFormat = ETC_SITE;				break;			case 'p':				if ( FromFormat == -1 ) FromFormat = PASSWD_SITE;				else ToFormat = PASSWD_SITE;				PasswdFormat = FORMAT_USERPASS;				snprintf(PasswdFile, sizeof(PasswdFile), "%s", optarg);				break;			default:				errflag = 1;				break;		}	}	if ( FromFormat == -1 || ToFormat == -1 || errflag > 0 ) {		usage();		vexit(-1);	}}int passwd_to_vpopmail( char *domain ){ FILE *fs,*fs1; char tmpbuf[MAX_BUFF]; char tmpbuf1[MAX_BUFF]; char *user; char *crypted_passwd; struct vqpasswd *mypw; int err = 0;	if ( (fs=fopen(PasswdFile, "r")) == NULL) {		printf("Could not open passwd file %s\n", PasswdFile);		perror("fopen");		return(-1);	}	while( fgets(tmpbuf, sizeof(tmpbuf), fs) != NULL ) {		if ( (user=strtok(tmpbuf, PASSWD_TOKENS))==NULL) continue;		if ( (crypted_passwd=strtok(NULL, PASSWD_TOKENS))==NULL) continue;		snprintf(Gecos, sizeof(Gecos), "%s", user);	    if ( (err=vadduser(user, domain, "foob", user, USE_POP )) < 0 ) {	        printf("Error: %s\n", verror(err));			break;		}		if ( (mypw = vauth_getpw( user, domain )) == NULL ) {			printf("no such user %s@%s\n", user, domain);			break;		}		mypw->pw_passwd = crypted_passwd;		if ( (err=vauth_setpw( mypw, domain )) != 0 ) {			printf("Error: %s\n", verror(err));			break;		}		snprintf(tmpbuf1, sizeof(tmpbuf1),                     "%s/Maildir/sqwebmail-pass", mypw->pw_dir);		if ( (fs1=fopen(tmpbuf1, "w")) == NULL) {			break;		}		fprintf(fs1, "\t%s", crypted_passwd);		fclose(fs1);	}	fclose(fs);	return(err);}int set_sqwebmail_pass( char *domain){ struct vqpasswd *pw;	if ( Debug == 1 ) {		printf("Setting sqwebmail passwords for %s\n", domain);	}	pw = vauth_getall(domain, 1, 0);	while( pw != NULL ) {		if ( Debug == 1 ) {			printf("%s\n", pw->pw_name);		}    		vsqwebmail_pass( pw->pw_dir, pw->pw_passwd, 			VPOPMAILUID, VPOPMAILGID);		pw = vauth_getall(domain, 0, 0);	}	return(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -