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

📄 rlm_ippool_tool.c

📁 使用最广泛的radius的linux的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
						sessiondbname, gdbm_strerror(gdbm_errno));						gdbm_close(indexdb);						gdbm_close(sessiondb);					return;				}				free(data_datum_tmp.dptr);			}		} else {			if (delete)				gdbm_delete(sessiondb, key_datum);			else {				if (mppp)					extra = 1;#if 0				if (!mppp)					printf("Error in if statements!!!\n");#endif			}		}		free(key_datum.dptr);		entry.active=1;		if (extra)			entry.extra=1;		data_datum.dptr = (char *) &entry;		data_datum.dsize = sizeof(ippool_info);		if (old){			strlcpy(old_key.nas,NASname,sizeof(old_key.nas));			old_key.port = port;			key_datum.dptr = (char *) &old_key;			key_datum.dsize = sizeof(old_ippool_key);			printf("rlm_ippool_tool: Allocating ip to nas/port: %s/%u\n",old_key.nas,old_key.port);		}		else{			memcpy(key.key,key_str,16);			key_datum.dptr = (char *) &key;			key_datum.dsize = sizeof(ippool_key);			printf("rlm_ippool_tool: Allocating ip to key: '%s'\n",hex_str);		}		rcode = gdbm_store(sessiondb, key_datum, data_datum, GDBM_REPLACE);		if (rcode < 0) {			printf("rlm_ippool_tool: Failed storing data to %s: %s\n",				sessiondbname, gdbm_strerror(gdbm_errno));			gdbm_close(indexdb);			gdbm_close(sessiondb);			return;		}		/* Increase the ip index count */		key_datum.dptr = (char *) &entry.ipaddr;		key_datum.dsize = sizeof(uint32_t);		data_datum = gdbm_fetch(indexdb, key_datum);		if (data_datum.dptr){			memcpy(&num,data_datum.dptr,sizeof(int));			free(data_datum.dptr);		} else			num = 0;		num++;		printf("rlm_ippool_tool: num: %d\n",num);		data_datum.dptr = (char *) &num;		data_datum.dsize = sizeof(int);		rcode = gdbm_store(indexdb, key_datum, data_datum, GDBM_REPLACE);		if (rcode < 0) {			printf("rlm_ippool_tool: Failed storing data to %s: %s\n",				indexdbname, gdbm_strerror(gdbm_errno));			gdbm_close(indexdb);			gdbm_close(sessiondb);			return;		}		if (old)			printf("rlm_ippool_tool: Allocated ip %s to client on nas %s,port %u\n",				ipaddress, old_key.nas,port);		else			printf("rlm_ippool_tool: Allocated ip %s to key  '%s'\n",ipaddress,hex_str);	}    gdbm_close(indexdb);    gdbm_close(sessiondb);}void tonewformat(char *sessiondbname,char *newsessiondbname){    GDBM_FILE sessiondb;    GDBM_FILE newsessiondb;    datum key_datum,keynext_datum,data_datum,newkey_datum;    old_ippool_key old_key;    ippool_key key;    uint8_t key_str[17];    char hex_str[35];    int rcode;    sessiondb=gdbm_open(sessiondbname,512,GDBM_READER,0,NULL);    newsessiondb=gdbm_open(newsessiondbname,512,GDBM_NEWDB,0,NULL);    if (sessiondb==NULL || newsessiondb==NULL) return;    memset(key_str,0,17);    key_datum=gdbm_firstkey(sessiondb);    while (key_datum.dptr) {	keynext_datum=gdbm_nextkey(sessiondb,key_datum);	if (key_datum.dsize==sizeof(struct old_ippool_key)) {		char md5_input_str[MAX_STRING_LEN];		FR_MD5_CTX md5_context;	        memcpy(&old_key,key_datum.dptr,sizeof(struct old_ippool_key));		snprintf(md5_input_str,MAX_STRING_LEN, "%s %d",old_key.nas,old_key.port);		fr_MD5Init(&md5_context);		fr_MD5Update(&md5_context, md5_input_str, strlen(md5_input_str));		fr_MD5Final(key_str, &md5_context);		memcpy(key.key,key_str,16);		fr_bin2hex(key_str,hex_str,16);		hex_str[32] = '\0';		printf("rlm_ippool_tool: Transforming pair nas/port (%s/%d) to md5 '%s'\n",			old_key.nas,old_key.port,hex_str);		newkey_datum.dptr = (char *) &key;		newkey_datum.dsize = sizeof(ippool_key);		data_datum=gdbm_fetch(sessiondb,key_datum);		if (data_datum.dptr!=NULL){		    rcode=gdbm_store(newsessiondb,newkey_datum,data_datum,GDBM_REPLACE);		    if (rcode < 0) {				printf("Failed to update new file %s: %s\n",newsessiondbname,gdbm_strerror(gdbm_errno));				gdbm_close(newsessiondb);				gdbm_close(sessiondb);				return;			}		}	}	key_datum=keynext_datum;    }    gdbm_close(newsessiondb);    gdbm_close(sessiondb);}void viewdb(char *sessiondbname,char *indexdbname,char *ipaddress, int old) {    GDBM_FILE sessiondb;    GDBM_FILE indexdb;    datum key_datum,keynext_datum,data_datum,save_datum;    old_ippool_key old_key;    ippool_key key;    ippool_info info;    struct in_addr ipaddr;    int num;    uint8_t key_str[17];    char hex_str[35];    char *ip;    int mode=GDBM_READER;    int rcode;    if (rflag) mode=GDBM_WRITER;    sessiondb=gdbm_open(sessiondbname,512,mode,0,NULL);    indexdb=gdbm_open(indexdbname,512,mode,0,NULL);    if (sessiondb==NULL || indexdb==NULL) return;    memset(key_str,0,17);    key_datum=gdbm_firstkey(sessiondb);    while (key_datum.dptr) {	keynext_datum=gdbm_nextkey(sessiondb,key_datum);	if (key_datum.dsize==sizeof(struct ippool_key) || key_datum.dsize==sizeof(struct old_ippool_key)) {	    if (old)	         memcpy(&old_key,key_datum.dptr,sizeof(struct old_ippool_key));	    else	         memcpy(&key,key_datum.dptr,sizeof(struct ippool_key));	    data_datum=gdbm_fetch(sessiondb,key_datum);	    if (data_datum.dptr!=NULL) {		memcpy(&info,data_datum.dptr,sizeof(struct ippool_info));		memcpy(&ipaddr,&info.ipaddr,4);		ip=inet_ntoa(ipaddr);		if (info.active) active++;		if (vflag && MATCH_IP(ipaddress,ip) && MATCH_ACTIVE(info)){		    if (old)		        printf("NAS:%s port:0x%x - ",old_key.nas,old_key.port);		    else{			memcpy(key_str,key.key,16);			fr_bin2hex(key_str,hex_str,16);			hex_str[32] = '\0';			printf("KEY: '%s' - ",hex_str);		    }		}		if (!vflag && aflag && info.active && MATCH_IP(ipaddress,ip))		    printf("%s\n",ip);		else if (vflag && MATCH_IP(ipaddress,ip) && MATCH_ACTIVE(info))		    printf("ipaddr:%s active:%d cli:%s",			inet_ntoa(ipaddr),info.active,info.cli);		/*		 * algorythm copied from rlm_ippool.c:		 * - set active to zero		 * - set number of sessions to zero		 */		if (rflag && MATCH_IP(ipaddress,ip)) {		    info.active=0;			save_datum.dptr = key_datum.dptr;			save_datum.dsize = key_datum.dsize;		    data_datum.dptr = (char *) &info;		    data_datum.dsize = sizeof(ippool_info);		    rcode=gdbm_store(sessiondb,key_datum,data_datum,GDBM_REPLACE);		    if (rcode < 0) {				printf("Failed to update %s: %s\n",ip,gdbm_strerror(gdbm_errno));				gdbm_close(indexdb);				gdbm_close(sessiondb);				return;			}		    key_datum.dptr=(char *)&info.ipaddr;		    key_datum.dsize = sizeof(uint32_t);		    data_datum=gdbm_fetch(indexdb,key_datum);		    if (data_datum.dptr!=NULL) {				memcpy(&num, data_datum.dptr, sizeof(int));				if (num>0) {					num--;					data_datum.dptr = (char *) &num;					data_datum.dsize = sizeof(int);					rcode = gdbm_store(indexdb, key_datum, data_datum, GDBM_REPLACE);					if (rcode < 0) {						printf("Failed to update %s: %s\n",ip,gdbm_strerror(gdbm_errno));						gdbm_close(indexdb);						gdbm_close(sessiondb);						return;					}					if (num > 0 && info.extra == 1) {						gdbm_delete(sessiondb, save_datum);					}				}		    }		}		key_datum.dptr=(char *)&info.ipaddr;		key_datum.dsize = sizeof(uint32_t);		data_datum=gdbm_fetch(indexdb,key_datum);		if (data_datum.dptr!=NULL) {		    memcpy(&num, data_datum.dptr, sizeof(int));		    if (vflag && MATCH_IP(ipaddress,ip) && MATCH_ACTIVE(info))			printf(" num:%d",num);		}		if (vflag && MATCH_IP(ipaddress,ip) && MATCH_ACTIVE(info))		    printf("\n");	    } else		if (vflag && ipaddress==NULL){		    if (old)			printf("NAS:%s port:0x%x\n",old_key.nas,old_key.port);		    else{			memcpy(key_str,key.key,16);			fr_bin2hex(key_str,hex_str,16);			hex_str[32] = '\0';			printf("KEY: '%s' - ",hex_str);		    }		}	}	key_datum=keynext_datum;    }    gdbm_close(indexdb);    gdbm_close(sessiondb);}void NEVER_RETURNS usage(char *argv0) {    printf("Usage: %s [-a] [-c] [-o] [-v] <session-db> <index-db> [ipaddress]\n",argv0);    printf("-a: print all active entries\n");    printf("-c: report number of active entries\n");    printf("-r: remove active entries\n");    printf("-v: verbose report of all entries\n");    printf("-o: Assume old database format (nas/port pair, not md5 output)\n");    printf("If an ipaddress is specified then that address is used to\n");    printf("limit the actions or output.\n");    printf("Usage: %s -n  <session-db> <index-db> <ipaddress> <nasIP> <nasPort>\n",argv0);    printf("-n: Mark the entry nasIP/nasPort as having ipaddress\n");    printf("Usage: %s -u <session-db> <new-session-db>\n",argv0);    printf("-u: Update old format database to new.\n");    exit(0);}int main(int argc,char **argv) {    int ch;    char *argv0=argv[0];    while ((ch=getopt(argc,argv,"acrvnou"))!=-1)	switch (ch) {	case 'a': aflag++;break;	case 'c': cflag++;break;	case 'r': rflag++;break;	case 'v': vflag=1;break;	case 'n': nflag=1;break;	case 'o': oflag=1;break;	case 'u': uflag=1;break;	default: usage(argv0);	}    argc -= optind;    argv += optind;    if ((argc==2 || argc==3) && !nflag && !uflag) {		viewdb(argv[0],argv[1],argv[2],oflag);		if (cflag) printf("%d\n",active);	} else		if (argc==5 && nflag)			addip(argv[0],argv[1],argv[2],argv[3],argv[4],oflag);		else if (argc==2 && uflag)			tonewformat(argv[0],argv[1]);		else			usage(argv0);    return 0;}

⌨️ 快捷键说明

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