static int ntop_get_dirs(lua_State* vm) { lua_newtable(vm); lua_push_str_table_entry(vm, "installdir", ntop->get_install_dir()); lua_push_str_table_entry(vm, "workingdir", ntop->get_working_dir()); return(CONST_LUA_OK); }
void StringHost::lua(lua_State* vm, bool returnHost) { lua_newtable(vm); lua_push_str_table_entry(vm, "name", keyname); lua_push_int_table_entry(vm, "bytes.sent", sent.getNumBytes()); lua_push_int_table_entry(vm, "bytes.rcvd", rcvd.getNumBytes()); lua_push_int_table_entry(vm, "pkts.sent", sent.getNumPkts()); lua_push_int_table_entry(vm, "pkts.rcvd", rcvd.getNumPkts()); lua_push_int_table_entry(vm, "queries.rcvd", queriesReceived); lua_push_int_table_entry(vm, "seen.first", first_seen); lua_push_int_table_entry(vm, "seen.last", last_seen); lua_push_int_table_entry(vm, "duration", get_duration()); lua_push_int_table_entry(vm, "family", family_id); lua_push_float_table_entry(vm, "throughput", bytes_thpt); lua_push_int_table_entry(vm, "throughput_trend", getThptTrend()); if(ndpiStats) ndpiStats->lua(iface, vm); getHostContacts(vm); if(returnHost) { lua_pushstring(vm, keyname); lua_insert(vm, -2); lua_settable(vm, -3); } }
bool StringHost::addIfMatching(lua_State* vm, char *key) { if(strcasestr(host_key(), key)) { lua_push_str_table_entry(vm, host_key(), host_key()); return(true); } else return(false); }
void Flow::print_peers(lua_State* vm, bool verbose) { char buf1[64], buf2[64], buf[256]; Host *src = get_cli_host(), *dst = get_srv_host(); if((src == NULL) || (dst == NULL)) return; lua_newtable(vm); lua_push_str_table_entry(vm, "client", get_cli_host()->get_ip()->print(buf, sizeof(buf))); lua_push_str_table_entry(vm, "server", get_srv_host()->get_ip()->print(buf, sizeof(buf))); lua_push_int_table_entry(vm, "sent", cli2srv_bytes); lua_push_int_table_entry(vm, "rcvd", srv2cli_bytes); lua_push_int_table_entry(vm, "sent.last", get_current_bytes_cli2srv()); lua_push_int_table_entry(vm, "rcvd.last", get_current_bytes_srv2cli()); lua_push_int_table_entry(vm, "duration", get_duration()); lua_push_float_table_entry(vm, "client.latitude", get_cli_host()->get_latitude()); lua_push_float_table_entry(vm, "client.longitude", get_cli_host()->get_longitude()); lua_push_float_table_entry(vm, "server.latitude", get_srv_host()->get_latitude()); lua_push_float_table_entry(vm, "server.longitude", get_srv_host()->get_longitude()); if(verbose) { lua_push_bool_table_entry(vm, "client.private", get_cli_host()->get_ip()->isPrivateAddress()); lua_push_str_table_entry(vm, "client.country", get_cli_host()->get_country() ? get_cli_host()->get_country() : (char*)""); lua_push_bool_table_entry(vm, "server.private", get_srv_host()->get_ip()->isPrivateAddress()); lua_push_str_table_entry(vm, "server.country", get_srv_host()->get_country() ? get_srv_host()->get_country() : (char*)""); lua_push_str_table_entry(vm, "client.city", get_cli_host()->get_city() ? get_cli_host()->get_city() : (char*)""); lua_push_str_table_entry(vm, "server.city", get_srv_host()->get_city() ? get_srv_host()->get_city() : (char*)""); if(verbose) { if(((cli2srv_packets+srv2cli_packets) > NDPI_MIN_NUM_PACKETS) || (ndpi_detected_protocol != NDPI_PROTOCOL_UNKNOWN) || iface->is_ndpi_enabled() || iface->is_sprobe_interface()) lua_push_str_table_entry(vm, "proto.ndpi", get_detected_protocol_name()); else lua_push_str_table_entry(vm, "proto.ndpi", (char*)CONST_TOO_EARLY); } } // Key /* Too slow */ #if 0 snprintf(buf, sizeof(buf), "%s %s", src->Host::get_name(buf1, sizeof(buf1), false), dst->Host::get_name(buf2, sizeof(buf2), false)); #else snprintf(buf, sizeof(buf), "%s %s", intoaV4(ntohl(get_cli_ipv4()), buf1, sizeof(buf1)), intoaV4(ntohl(get_srv_ipv4()), buf2, sizeof(buf2))); #endif lua_pushstring(vm, buf); lua_insert(vm, -2); lua_settable(vm, -3); }
void Flow::processLua(lua_State* vm, ProcessInfo *proc, bool client) { lua_newtable(vm); lua_push_int_table_entry(vm, "cpu_id", proc->cpu_id); lua_push_int_table_entry(vm, "pid", proc->pid); lua_push_int_table_entry(vm, "father_pid", proc->father_pid); lua_push_str_table_entry(vm, "name", proc->name); lua_push_str_table_entry(vm, "father_name", proc->father_name); lua_push_str_table_entry(vm, "user_name", proc->user_name); lua_push_int_table_entry(vm, "actual_memory", proc->actual_memory); lua_push_int_table_entry(vm, "peak_memory", proc->peak_memory); lua_push_int_table_entry(vm, "average_cpu_load", proc->average_cpu_load); lua_push_int_table_entry(vm, "num_vm_page_faults", proc->num_vm_page_faults); lua_pushstring(vm, client ? "client_process" : "server_process"); lua_insert(vm, -2); lua_settable(vm, -3); }
void Ntop::getUsers(lua_State* vm) { char **usernames; char *username, *holder; char key[64], val[64]; int rc, i; lua_newtable(vm); if((rc = ntop->getRedis()->keys("ntopng.user.*.password", &usernames)) <= 0) { return; } for (i = 0; i < rc; i++) { if(usernames[i] == NULL) continue; /* safety check */ if(strtok_r(usernames[i], ".", &holder) == NULL) continue; if(strtok_r(NULL, ".", &holder) == NULL) continue; if((username = strtok_r(NULL, ".", &holder)) == NULL) continue; lua_newtable(vm); snprintf(key, sizeof(key), CONST_STR_USER_FULL_NAME, username); if(ntop->getRedis()->get(key, val, sizeof(val)) >= 0) lua_push_str_table_entry(vm, "full_name", val); else lua_push_str_table_entry(vm, "full_name", (char*) "unknown"); snprintf(key, sizeof(key), CONST_STR_USER_PASSWORD, username); if(ntop->getRedis()->get(key, val, sizeof(val)) >= 0) lua_push_str_table_entry(vm, "password", val); else lua_push_str_table_entry(vm, "password", (char*) "unknown"); snprintf(key, sizeof(key), CONST_STR_USER_GROUP, username); if(ntop->getRedis()->get(key, val, sizeof(val)) >= 0) lua_push_str_table_entry(vm, "group", val); else lua_push_str_table_entry(vm, "group", (char*)"unknown"); snprintf(key, sizeof(key), CONST_STR_USER_NETS, username); if(ntop->getRedis()->get(key, val, sizeof(val)) >= 0) lua_push_str_table_entry(vm, CONST_ALLOWED_NETS, val); else lua_push_str_table_entry(vm, CONST_ALLOWED_NETS, (char*)""); lua_pushstring(vm, username); lua_insert(vm, -2); lua_settable(vm, -3); free(usernames[i]); } free(usernames); }
static int ntop_get_interface_names(lua_State* vm) { lua_newtable(vm); for(int i=0; i<ntop->get_num_interfaces(); i++) { char num[8]; snprintf(num, sizeof(num), "%d", i); lua_push_str_table_entry(vm, num, ntop->getInterfaceId(i)->get_name()); } return(CONST_LUA_OK); }
void print_funct(prefix_t *prefix, void *data, void *user_data) { char address[64], ret[64], *a; if(!prefix) return; if(prefix->family == AF_INET) { if((prefix->bitlen == 0) || (prefix->bitlen == 32)) return; a = Utils::intoaV4(ntohl(prefix->add.sin.s_addr), address, sizeof(address)); } else { if((prefix->bitlen == 0) || (prefix->bitlen == 128)) return; a = Utils::intoaV6(*((struct ndpi_in6_addr*)&prefix->add.sin6), prefix->bitlen, address, sizeof(address)); } snprintf(ret, sizeof(ret), "%s/%d", a, prefix->bitlen); lua_push_str_table_entry((lua_State*)user_data, ret, (char*)""); }
static int ntop_list_dir_files(lua_State* vm) { char *path; DIR *dirp; struct dirent *dp; if(ntop_lua_check(vm, __FUNCTION__, 1, LUA_TSTRING)) return(CONST_LUA_ERROR); path = (char*)lua_tostring(vm, 1); ntop->fixPath(path); lua_newtable(vm); if((dirp = opendir(path)) != NULL) { while ((dp = readdir(dirp)) != NULL) if(dp->d_name && (dp->d_name[0] != '.')) { lua_push_str_table_entry(vm, dp->d_name, dp->d_name); } (void)closedir(dirp); } return(CONST_LUA_OK); }
static int ntop_get_hash_keys_redis(lua_State* vm) { char *key, **vals; Redis *redis = ntop->getRedis(); int rc, i; if(ntop_lua_check(vm, __FUNCTION__, 1, LUA_TSTRING)) return(CONST_LUA_ERROR); if((key = (char*)lua_tostring(vm, 1)) == NULL) return(CONST_LUA_PARAM_ERROR); rc = redis->hashKeys(key, &vals); if(rc > 0) { lua_newtable(vm); for(i = 0; i < rc; i++) { lua_push_str_table_entry(vm, vals[i], (char*)""); free(vals[i]); } free(vals); } else lua_pushnil(vm); return(CONST_LUA_OK); }
void NetworkInterfaceView::lua(lua_State *vm) { int n = 0; lua_newtable(vm); lua_newtable(vm); for(int i = 0; i<numInterfaces; i++) { physIntf[i]->lua(vm); lua_pushstring(vm, physIntf[i]->get_name()); lua_insert(vm, -2); lua_settable(vm, -3); n++; } lua_pushstring(vm, "interfaces"); lua_insert(vm, -2); lua_settable(vm, -3); lua_push_str_table_entry(vm, "name", name); lua_push_int_table_entry(vm, "id", id); lua_push_bool_table_entry(vm, "isView", n > 1 ? true : false); }
int MySQLDB::exec_sql_query(lua_State *vm, char *sql, bool limitRows) { MYSQL_RES *result; MYSQL_ROW row; char *fields[MYSQL_MAX_NUM_FIELDS] = { NULL }; int num_fields, rc, num = 0; if(!db_operational) return(-2); if(m) m->lock(__FILE__, __LINE__); if((rc = mysql_query(&mysql, sql)) != 0) { rc = mysql_errno(&mysql); ntop->getTrace()->traceEvent(TRACE_ERROR, "MySQL error: [%s][%d]", get_last_db_error(&mysql), rc); mysql_close(&mysql); if(m) m->unlock(__FILE__, __LINE__); connectToDB(&mysql, true); if(!db_operational) return(-2); if(m) m->lock(__FILE__, __LINE__); rc = mysql_query(&mysql, sql); } if((rc != 0) || ((result = mysql_store_result(&mysql)) == NULL)) { lua_pushstring(vm, get_last_db_error(&mysql)); if(m) m->unlock(__FILE__, __LINE__); return(rc); } num_fields = min_val(mysql_num_fields(result), MYSQL_MAX_NUM_FIELDS); lua_newtable(vm); num = 0; while((row = mysql_fetch_row(result))) { lua_newtable(vm); if(num == 0) { for(int i = 0; i < num_fields; i++) { MYSQL_FIELD *field = mysql_fetch_field(result); fields[i] = field->name; } } for(int i = 0; i < num_fields; i++) lua_push_str_table_entry(vm, (const char*)fields[i], row[i] ? row[i] : (char*)""); lua_pushnumber(vm, ++num); lua_insert(vm, -2); lua_settable(vm, -3); if(limitRows && num >= MYSQL_MAX_NUM_ROWS) break; } mysql_free_result(result); if(m) m->unlock(__FILE__, __LINE__); return(0); }
void Flow::lua(lua_State* vm, bool detailed_dump) { char buf[64]; lua_newtable(vm); if(get_cli_host()) { if(detailed_dump) lua_push_str_table_entry(vm, "cli.host", get_cli_host()->get_name(buf, sizeof(buf), false)); lua_push_int_table_entry(vm, "cli.source_id", get_cli_host()->getSourceId()); lua_push_str_table_entry(vm, "cli.ip", get_cli_host()->get_ip()->print(buf, sizeof(buf))); lua_push_bool_table_entry(vm, "cli.systemhost", get_cli_host()->isSystemHost()); } else { lua_push_nil_table_entry(vm, "cli.host"); lua_push_nil_table_entry(vm, "cli.ip"); } lua_push_int_table_entry(vm, "cli.port", get_cli_port()); if(get_srv_host()) { if(detailed_dump) lua_push_str_table_entry(vm, "srv.host", get_srv_host()->get_name(buf, sizeof(buf), false)); lua_push_int_table_entry(vm, "srv.source_id", get_cli_host()->getSourceId()); lua_push_str_table_entry(vm, "srv.ip", get_srv_host()->get_ip()->print(buf, sizeof(buf))); lua_push_bool_table_entry(vm, "srv.systemhost", get_srv_host()->isSystemHost()); } else { lua_push_nil_table_entry(vm, "srv.host"); lua_push_nil_table_entry(vm, "srv.ip"); } lua_push_int_table_entry(vm, "srv.port", get_srv_port()); lua_push_int_table_entry(vm, "vlan", get_vlan_id()); lua_push_str_table_entry(vm, "proto.l4", get_protocol_name()); if(((cli2srv_packets+srv2cli_packets) > NDPI_MIN_NUM_PACKETS) || (ndpi_detected_protocol != NDPI_PROTOCOL_UNKNOWN) || iface->is_ndpi_enabled() || iface->is_sprobe_interface()) { lua_push_str_table_entry(vm, "proto.ndpi", get_detected_protocol_name()); } else lua_push_str_table_entry(vm, "proto.ndpi", (char*)CONST_TOO_EARLY); lua_push_int_table_entry(vm, "bytes", cli2srv_bytes+srv2cli_bytes); lua_push_int_table_entry(vm, "bytes.last", get_current_bytes_cli2srv() + get_current_bytes_srv2cli()); lua_push_int_table_entry(vm, "seen.first", get_first_seen()); lua_push_int_table_entry(vm, "seen.last", get_last_seen()); lua_push_int_table_entry(vm, "duration", get_duration()); lua_push_int_table_entry(vm, "cli2srv.bytes", cli2srv_bytes); lua_push_int_table_entry(vm, "srv2cli.bytes", srv2cli_bytes); if(detailed_dump) { lua_push_int_table_entry(vm, "tcp_flags", getTcpFlags()); lua_push_str_table_entry(vm, "category", categorization.category ? categorization.category : (char*)""); lua_push_str_table_entry(vm, "moreinfo.json", get_json_info()); } if(client_proc) processLua(vm, client_proc, true); if(server_proc) processLua(vm, server_proc, false); //ntop->getTrace()->traceEvent(TRACE_NORMAL, "%.2f", bytes_thpt); lua_push_float_table_entry(vm, "throughput", bytes_thpt); lua_push_int_table_entry(vm, "throughput_trend", bytes_thpt_trend); if(!detailed_dump) { lua_pushinteger(vm, key()); // Index lua_insert(vm, -2); lua_settable(vm, -3); } else { lua_push_int_table_entry(vm, "cli2srv.packets", cli2srv_packets); lua_push_int_table_entry(vm, "srv2cli.packets", srv2cli_packets); } }
int Lua::handle_script_request(struct mg_connection *conn, const struct mg_request_info *request_info, char *script_path) { char buf[64], key[64], val[64]; luaL_openlibs(L); /* Load base libraries */ lua_register_classes(L, true); /* Load custom classes */ lua_pushlightuserdata(L, (char*)conn); lua_setglobal(L, CONST_HTTP_CONN); /* Put the GET params into the environment */ lua_newtable(L); if(request_info->query_string != NULL) { char *query_string = strdup(request_info->query_string); if(query_string) { char *tok, *where; tok = strtok_r(query_string, "&", &where); while(tok != NULL) { /* key=val */ char *equal = strchr(tok, '='); if(equal) { char *decoded_buf; equal[0] = '\0'; if((decoded_buf = http_decode(&equal[1])) != NULL) { //ntop->getTrace()->traceEvent(TRACE_WARNING, "'%s'='%s'", tok, decoded_buf); lua_push_str_table_entry(L, tok, decoded_buf); free(decoded_buf); } } tok = strtok_r(NULL, "&", &where); } free(query_string); } } lua_setglobal(L, "_GET"); /* Like in php */ /* Put the _SESSION params into the environment */ lua_newtable(L); mg_get_cookie(conn, "user", buf, sizeof(buf)); lua_push_str_table_entry(L, "user", buf); mg_get_cookie(conn, "session", buf, sizeof(buf)); lua_push_str_table_entry(L, "session", buf); snprintf(key, sizeof(key), "sessions.%s.ifname", buf); if(ntop->getRedis()->get(key, val, sizeof(val)) < 0) { set_default_if_name_in_session: snprintf(val, sizeof(val), "%s", ntop->getInterfaceId(0)->get_name()); lua_push_str_table_entry(L, "ifname", val); ntop->getRedis()->set(key, val, 3600 /* 1h */); } else { if(ntop->getInterface(val) != NULL) { /* The specified interface still exists */ lua_push_str_table_entry(L, "ifname", val); ntop->getRedis()->expire(key, 3600); /* Extend session */ } else { goto set_default_if_name_in_session; } } lua_setglobal(L, "_SESSION"); /* Like in php */ if(luaL_dofile(L, script_path) != 0) { const char *err = lua_tostring(L, -1); ntop->getTrace()->traceEvent(TRACE_WARNING, "Script failure [%s][%s]", script_path, err); return(send_error(conn, 500 /* Internal server error */, "Internal server error", PAGE_ERROR, script_path, err)); } return(CONST_LUA_OK); }
static int ntop_get_info(lua_State* vm) { char rsp[256]; int major, minor, patch; lua_newtable(vm); lua_push_str_table_entry(vm, "copyright", (char*)"© 1998-2013 - ntop.org"); lua_push_str_table_entry(vm, "authors", (char*)"Luca Deri and Alfredo Cardigliano"); lua_push_str_table_entry(vm, "license", (char*)"GNU GPLv3"); snprintf(rsp, sizeof(rsp), "%s (%s)", PACKAGE_VERSION, NTOPNG_SVN_RELEASE); lua_push_str_table_entry(vm, "version", rsp); lua_push_int_table_entry(vm, "uptime", ntop->getGlobals()->getUptime()); lua_push_str_table_entry(vm, "version.rrd", rrd_strversion()); lua_push_str_table_entry(vm, "version.redis", ntop->getRedis()->getVersion(rsp, sizeof(rsp))); lua_push_str_table_entry(vm, "version.httpd", (char*)mg_version()); lua_push_str_table_entry(vm, "version.luajit", (char*)LUAJIT_VERSION); #ifdef HAVE_GEOIP lua_push_str_table_entry(vm, "version.geoip", (char*)GeoIP_lib_version()); #endif lua_push_str_table_entry(vm, "version.ndpi", ndpi_revision()); zmq_version(&major, &minor, &patch); snprintf(rsp, sizeof(rsp), "%d.%d.%d", major, minor, patch); lua_push_str_table_entry(vm, "version.zmq", rsp); return(CONST_LUA_OK); }