static int generate_sql_clients(SQL_INST *inst) { SQLSOCK *sqlsocket; SQL_ROW row; char querystr[MAX_QUERY_LEN]; RADCLIENT *c; char *netmask; unsigned int i = 0; DEBUG("rlm_sql (%s): - generate_sql_clients",inst->config->xlat_name); if (inst->config->sql_nas_table == NULL){ radlog(L_ERR, "rlm_sql (%s): sql_nas_table is NULL.",inst->config->xlat_name); return -1; } snprintf(querystr,MAX_QUERY_LEN - 1,"SELECT * FROM %s",inst->config->sql_nas_table); DEBUG("rlm_sql (%s): Query: %s",inst->config->xlat_name,querystr); sqlsocket = sql_get_socket(inst); if (sqlsocket == NULL) return -1; if (rlm_sql_select_query(sqlsocket,inst,querystr)){ radlog(L_ERR, "rlm_sql (%s): database query error, %s: %s", inst->config->xlat_name,querystr, (char *)(inst->module->sql_error)(sqlsocket, inst->config)); sql_release_socket(inst,sqlsocket); return -1; } while(rlm_sql_fetch_row(sqlsocket, inst) == 0) { i++; row = sqlsocket->row; if (row == NULL) break; /* * Format: * Row1 Row2 Row3 Row4 Row5 Row6 Row7 Row8 * * id nasname shortname type ports secret community description * */ if (!row[0]){ radlog(L_ERR, "rlm_sql (%s): No row id found on pass %d",inst->config->xlat_name,i); continue; } if (!row[1]){ radlog(L_ERR, "rlm_sql (%s): No nasname found for row %s",inst->config->xlat_name,row[0]); continue; } if (strlen(row[1]) >= sizeof(c->longname)){ radlog(L_ERR, "rlm_sql (%s): nasname of length %d is greater than the allowed maximum of %d", inst->config->xlat_name,strlen(row[1]),sizeof(c->longname) - 1); continue; } if (!row[2]){ radlog(L_ERR, "rlm_sql (%s): No short name found for row %s",inst->config->xlat_name,row[0]); continue; } if (strlen(row[2]) >= sizeof(c->shortname)){ radlog(L_ERR, "rlm_sql (%s): shortname of length %d is greater than the allowed maximum of %d", inst->config->xlat_name,strlen(row[2]),sizeof(c->shortname) - 1); continue; } if (row[3] && strlen(row[3]) >= sizeof(c->nastype)){ radlog(L_ERR, "rlm_sql (%s): nastype of length %d is greater than the allowed maximum of %d", inst->config->xlat_name,strlen(row[3]),sizeof(c->nastype) - 1); continue; } if (!row[5]){ radlog(L_ERR, "rlm_sql (%s): No secret found for row %s",inst->config->xlat_name,row[0]); continue; } if (strlen(row[5]) >= sizeof(c->secret)){ radlog(L_ERR, "rlm_sql (%s): secret of length %d is greater than the allowed maximum of %d", inst->config->xlat_name,strlen(row[5]),sizeof(c->secret) - 1); continue; } DEBUG("rlm_sql (%s): Read entry nasname=%s,shortname=%s,secret=%s",inst->config->xlat_name, row[1],row[2],row[5]); c = rad_malloc(sizeof(RADCLIENT)); memset(c, 0, sizeof(RADCLIENT)); c->netmask = ~0; netmask = strchr(row[1], '/'); /* * Look for netmasks. */ c->netmask = ~0; if (netmask) { int mask_length; mask_length = atoi(netmask + 1); if ((mask_length < 0) || (mask_length > 32)) { radlog(L_ERR, "rlm_sql (%s): Invalid value '%s' for IP network mask for nasname %s.", inst->config->xlat_name, netmask + 1,row[1]); free(c); continue; } if (mask_length == 0) { c->netmask = 0; } else { c->netmask = ~0 << (32 - mask_length); } *netmask = '\0'; c->netmask = htonl(c->netmask); } c->ipaddr = ip_getaddr(row[1]); if (c->ipaddr == INADDR_NONE) { radlog(L_CONS|L_ERR, "rlm_sql (%s): Failed to look up hostname %s", inst->config->xlat_name, row[1]); free(c); continue; } /* * Update the client name again... */ if (netmask) { *netmask = '/'; c->ipaddr &= c->netmask; strcpy(c->longname, row[1]); } else { ip_hostname(c->longname, sizeof(c->longname), c->ipaddr); } strcpy((char *)c->secret, row[5]); strcpy(c->shortname, row[2]); if(row[3] != NULL) strcpy(c->nastype, row[3]); DEBUG("rlm_sql (%s): Adding client %s (%s) to clients list",inst->config->xlat_name, c->longname,c->shortname); c->next = mainconfig.clients; mainconfig.clients = c; } (inst->module->sql_finish_select_query)(sqlsocket, inst->config); sql_release_socket(inst, sqlsocket); return 0; }
/* * Zap a user from the radutmp and radwtmp file. */ int main(int argc, char **argv) { CONF_SECTION *cs; NAS *nas; uint32_t ip = 0; uint32_t nas_port = ~0; char *user = NULL; char *s; char buf[256]; struct radutmp u; int argval; progname = argv[0]; radius_dir = strdup(RADIUS_DIR); /* Process the options. */ while ((argval = getopt(argc, argv, "d:p:r:")) != EOF) { switch(argval) { case 'd': if (radius_dir) free(radius_dir); radius_dir = strdup(optarg); break; case 'p': acct_port = atoi(optarg); break; case 'r': if ((radiusip = ip_getaddr(optarg)) == INADDR_NONE) { fprintf(stderr, "%s: %s: radius server unknown\n", progname, optarg); exit(1); } break; default: usage(); exit(1); } } if (argc == optind) { /* no terminal server specified */ usage(); exit(1); } if (argc > optind + 1) { /* NAS port given */ s = argv[optind+1]; if (*s == 's' || *s == 'S') s++; nas_port = strtoul(s, NULL, 10); } if (argc > optind + 2) { /* username (login) given */ user = argv[optind+2]; } /* * Find the IP address of the terminal server. */ if ((nas = nas_findbyname(argv[optind])) == NULL && argv[optind][0] != 0) { if ((ip = ip_getaddr(argv[optind])) == INADDR_NONE) { fprintf(stderr, "%s: host not found.\n", argv[optind]); exit(1); } } if (nas != NULL) ip = nas->ipaddr; /* * Ensure that the configuration is initialized. */ memset(&mainconfig, 0, sizeof(mainconfig)); /* Read radiusd.conf */ if (read_mainconfig(0) < 0) { fprintf(stderr, "%s: Error reading radiusd.conf.\n", argv[0]); exit(1); } /* Read the radutmp section of radiusd.conf */ cs = cf_section_sub_find(cf_section_find("modules"), "radutmp"); if(!cs) { fprintf(stderr, "%s: No configuration information in radutmp section of radiusd.conf!\n", argv[0]); exit(1); } cf_section_parse(cs, NULL, module_config); printf("%s: zapping termserver %s, port %u", progname, ip_hostname(buf, sizeof(buf), ip), nas_port); if (user != NULL) printf(", user %s", user); printf("\n"); if (nas_port == ~0) { return do_accton_packet(ip); } if (!radutmp_lookup(&u, ip, nas_port, user)) { fprintf(stderr, "Entry not found\n"); return 1; } return do_stop_packet(&u); }