📄 rlm_ippool_tool.c
字号:
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 *) # 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 *) # 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 + -