Paul.

Not everybody uses Linux :), inet_aton() is not present in Solaris as
example, dont ask my why, I didnt checked, so may be you can use another
function to do the translation of the Ip address into data.

Rgds

Gustavo


On Sat, 2003-07-26 at 00:40, Paul Hampson wrote:
> (I'm assuming all interested developers are _also_ on the
> -users list...)
> 
> I've just hit the problem others have hit before about the
> ippool shrinking for no apparent reason. I'm not sure what
> does it exactly, as I'm more interested in the rewrite of
> rlm_ippool I proposed earlier and someone else actually
> _did_, which I'm now more motivated to test, and write
> transition code for. (I was earlier waiting for the 0.9.0
> release, which is now done. :-)
> 
> Anyway, in order to get my services back up and running,
> I modified ippooltool 1.0 to also be able to _add_ entries,
> as well as remove them. I deleted the pool dbs, restarted
> radius to recreate the DBs, stopped radius, and then used
> this plus the info from radwho to rebuild the ippool DBs.
> 
> The code currents assumes that you've -r'd the IP address
> already, if neccessary. (If not, it does nothing, happily)
> 
> It also assumes you're wanting the 'num' set to 1. (That's
> the number of ports that IP's assigned to. It's for the
> (broken, AFAIK) multilink allocation)
> 
> I realise this code could be neater, but I was in a hurry. :-)
> Tested fine here, and deals with ports > 0x7fffffff.
> -n then -r produces expected results, and people are once
> again dialling in here... I know that's good 'cause if I
> send the NAS an IP address it already thinks I've allocated,
> then it will reject me. So I'm happy this works.
> 
> Oh, all the debugging output says 'iptool2' since that's
> what I was calling the file. :-)
> 
> Here's my patch to ippooltool... There was some discussion
> of ippooltool being added to the FreeRADIUS CVS earlier.
> Was that ever decided for or against?
> 
> --- iptool.c  2003-05-23 23:09:21.000000000 +1000
> +++ iptool2.c 2003-07-26 15:10:07.000000000 +1000
> @@ -41,6 +41,7 @@
>  int cflag=0;
>  int rflag=0;
>  int vflag=0;
> +int nflag=0;
>  
>  typedef struct ippool_info {
>      uint32_t        ipaddr;
> @@ -58,6 +59,150 @@
>  #define MATCH_IP(ip1,ip2) ((ip1)==NULL || strcmp((ip1),(ip2))==0)
>  #define MATCH_ACTIVE(info) ((info).active==1 || !aflag)
>  
> +void addip(char *sessiondbname,char *indexdbname,char *ipaddress, char* NASname, 
> char*NASport) {
> +    GDBM_FILE sessiondb;
> +    GDBM_FILE indexdb;
> +    datum key_datum,keynext_datum,data_datum;
> +     datum nextkey;
> +    ippool_key key;
> +    ippool_info entry;
> +    struct in_addr ipaddr;
> +    int num;
> +    int mode=GDBM_WRITER;
> +    int rcode;
> +     char *cli = NULL;
> +     int delete = 0;
> +
> +    sessiondb=gdbm_open(sessiondbname,512,mode,0,NULL);
> +    indexdb=gdbm_open(indexdbname,512,mode,0,NULL);
> +
> +     if (inet_aton(ipaddress, &ipaddr) == 0)
> +     {
> +             printf("iptool2: Unable to convert IP address '%s'\n", ipaddress);
> +             return;
> +     }
> +     
> +    if (sessiondb==NULL)
> +     {
> +             printf("iptools: Unable to open DB '%s'\n", sessiondbname);
> +             return;
> +     }
> +     
> +    if (indexdb==NULL)
> +     {
> +             printf("iptools: Unable to open DB '%s'\n", indexdbname);
> +             return;
> +     }
> +     
> +     /* Basically from rlm_ippool.c */
> +
> +     memset(key.nas,0,MAX_NAS_NAME_SIZE);
> +     strncpy(key.nas,NASname,MAX_NAS_NAME_SIZE -1 );
> +     key.port = strtoul(NASport,NULL,0);
> +     key_datum.dptr = (char *) &key;
> +     key_datum.dsize = sizeof(ippool_key);
> +
> +     key_datum = gdbm_firstkey(sessiondb);
> +     while(key_datum.dptr){
> +             data_datum = gdbm_fetch(sessiondb, key_datum);
> +             if (data_datum.dptr){
> +                     memcpy(&entry,data_datum.dptr, sizeof(ippool_info));
> +                     free(data_datum.dptr);  
> +                     /* Found our entry? */
> +                     if (entry.ipaddr == ipaddr.s_addr){
> +                             datum tmp;
> +
> +                             tmp.dptr = (char *) &entry.ipaddr;
> +                             tmp.dsize = sizeof(uint32_t);
> +                             data_datum = gdbm_fetch(indexdb, tmp);
> +
> +                             /*
> +                              * If we find an entry in the ip index and the number 
> is zero (meaning
> +                              * that we haven't allocated the same ip address to 
> another nas/port pair)
> +                              * or if we don't find an entry then delete the 
> session entry so
> +                              * that we can change the key (nas/port)
> +                              * Else we don't delete the session entry since we 
> haven't yet deallocated the
> +                              * corresponding ip address and we continue our search.
> +                              */
> +
> +                             if (data_datum.dptr){
> +                                     memcpy(&num,data_datum.dptr, sizeof(int));
> +                                     free(data_datum.dptr);
> +                                     if (num == 0){
> +                                             delete = 1;
> +                                             break;
> +                                     }
> +                             }
> +                             else{
> +                                     delete = 1;
> +                                     break;
> +                             }
> +                     }
> +             }
> +             nextkey = gdbm_nextkey(sessiondb, key_datum);
> +             free(key_datum.dptr);
> +             key_datum = nextkey;
> +     }
> +     /*
> +      * If we have found our entry set active to 1 
> +      */
> +     if (key_datum.dptr){
> +             entry.active = 1;
> +             data_datum.dptr = (char *) &entry;
> +             data_datum.dsize = sizeof(ippool_info);
> +
> +             if (delete){
> +                     /*
> +                      * Delete the entry so that we can change the key
> +                      */
> +                     gdbm_delete(sessiondb, key_datum);
> +             }
> +             free(key_datum.dptr);
> +             memset(key.nas,0,MAX_NAS_NAME_SIZE);
> +             strncpy(key.nas,NASname,MAX_NAS_NAME_SIZE -1 );
> +             key.port = strtoul(NASport,NULL,0);
> +             key_datum.dptr = (char *) &key;
> +             key_datum.dsize = sizeof(ippool_key);
> +             
> +             printf("iptool2: Allocating ip to nas/port: %s/%u\n",key.nas,key.port);
> +             rcode = gdbm_store(sessiondb, key_datum, data_datum, GDBM_REPLACE);
> +             if (rcode < 0) {
> +                     printf("iptool2: 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);
> +             }
> +             num=1;
> +             printf("iptool2: 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("iptool2: Failed storing data to %s: %s\n",
> +                             indexdbname, gdbm_strerror(gdbm_errno));
> +                     gdbm_close(indexdb);
> +                     gdbm_close(sessiondb);
> +                     return;
> +             }
> +                     
> +
> +             printf("iptool2: Allocated ip %s to client on nas %s,port 
> %u\n",ipaddress,
> +                             key.nas,strtoul(NASport,NULL,0));
> +     }
> +    gdbm_close(indexdb);
> +    gdbm_close(sessiondb);
> +}
> +
>  void viewdb(char *sessiondbname,char *indexdbname,char *ipaddress) {
>      GDBM_FILE sessiondb;
>      GDBM_FILE indexdb;
> @@ -147,13 +292,16 @@
>  }
>  
>  void usage(char *argv0) {
> -    printf("Usage: %s [-a] [-c] [-v] <session-db> <index-db> [ipaddress]\n",argv0);
> +    printf("Usage: %s [-a] [-c] [-v] <session-db> <index-db> [ipaddress] [nasIP] 
> [nasPort]\n",argv0);
> +     printf("\t2 or 3 parameters:\n");
>      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("If an ipaddress is specified then only that address is used to\n");
>      printf("limit the actions or output to that address only.\n");
> +     printf("\t5 parameters:\n");
> +    printf("-n: Mark the entry nasIP/nasPort as having ipaddress\n");
>      exit(0);
>  }
>  
> @@ -161,21 +309,29 @@
>      int ch;
>      char *argv0=argv[0];
>  
> -    while ((ch=getopt(argc,argv,"acrv"))!=-1)
> +    while ((ch=getopt(argc,argv,"acrvn"))!=-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;
>       default: usage(argv0);
>       }
>      argc -= optind;
>      argv += optind;
>  
> -    if (argc!=2 && argc!=3)
> -     usage(argv0);
> -    else
> -     viewdb(argv[0],argv[1],argv[2]);
> +    if ((argc==2 || argc==3) && !nflag)
> +     {
> +             printf("ViewDB\n");
> +             viewdb(argv[0],argv[1],argv[2]);
> +     } else 
> +             if (argc==5 && nflag)
> +             {
> +                     printf("AddIP\n");
> +                     addip(argv[0],argv[1],argv[2],argv[3],argv[4]);
> +             } else
> +                     usage(argv0);
>      if (cflag) printf("%d\n",active);
>      return 0;
>  }
> 
> --
> =========================================================
> Paul "TBBle" Hampson
> Bubblesworth Pty Ltd (ABN: 51 095 284 361)
> [EMAIL PROTECTED]
> 
> This is a one line proof...if we start
> sufficiently far to the left.
>       -- Cambridge University Math Department
> ---------------------------------------------------------
> Random signature generator 3.0 by Paul "TBBle" Hampson
> =========================================================
> 
> 
> - 
> List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html
-- 
Gustavo A. Lozano                                 Noldata Corporation
[EMAIL PROTECTED]                               Calle 46 No. 40-19
CTO                                               Bogota D.C. Colombia
Noldata Corporation                               http://noldata.com

            I know not with what weapons World War III will be fought,
               but World War IV will be fought with sticks and stones.
                                                       Albert Einstein




- 
List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html

Reply via email to