--
-- (C) 2013-16 - ntop.org
--
dirs = ntop.getDirs()
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path
require "lua_utils"
function cleanName(name)
n = string.gsub(name, "'", "_")
-- Cut the name at 128 chars
n = string.sub(n, 1, 128)
return(n)
end
interfaces_id = 0
interfaces_hash = { }
function interface2id(name)
if(interfaces_hash[name] == nil) then
id = interfaces_id
interfaces_hash[name] = id
interfaces_id = interfaces_id + 1
return(id)
else
return(interfaces_hash[name])
end
end
-- #########################
hosts_id = 0
hosts_hash = { }
function host2id(name)
name = cleanName(name)
if(hosts_hash[name] == nil) then
id = hosts_id
hosts_hash[name] = id
hosts_id = hosts_id + 1
return(id)
else
return(hosts_hash[name])
end
end
-- #########################
sendHTTPHeader('text/html; charset=iso-8859-1')
begin = os.clock()
t = os.time() -- -86400
when = os.date("%y%m%d", t)
key_name = when..".keys"
--print(key_name.."\n")
local debug = true
local delete_keys = true
dump_dir = fixPath(dirs.workingdir .. "/datadump/")
ntop.mkdir(dump_dir)
fname = dump_dir .. "20".. when
activities_name = fname .."_activities.csv"
contacts_name = fname .."_contacts.csv"
hosts_name = fname .."_hosts.csv"
interfaces_name = fname .."_interfaces.csv"
tables_name = fname ..".sql"
activities = io.open(activities_name, "w")
contacts = io.open(contacts_name, "w")
hosts = io.open(hosts_name, "w")
interfaces = io.open(interfaces_name, "w")
tables = io.open(tables_name, "w")
print("Please wait: we are dumping data into
\n")
print("- "..activities_name.."\n")
print("
- "..contacts_name.."\n")
print("
- "..hosts_name.."\n")
print("
- "..interfaces_name.."\n")
print("
- "..tables_name.."\n")
print("
\n")
interfaces:write("# idx | interface\n")
hosts:write("# idx | name\n")
contacts:write("# contacted_by=0, contacted_peers=1\n")
contact_idx = 0
idx = 0
repeat
key = ntop.setPopCache(key_name)
if(debug) then print("====> "..key_name.."
\n") end
if((key == nil) or (key == "")) then break end
if(debug) then print("=> "..key.."
\n") end
k1 = when.."|"..key.."|contacted_by"
v1 = ntop.getHashKeysCache(k1)
if(v1 ~= nil) then
res = split(k1, "|")
if(res[2] == "host_contacts") then
r = 0
else
-- aggregations
r = 1
end
name = host2id(res[4])
activities:write(idx..",".. interface2id(res[3])..","..name..",".. r.."\n")
if(debug) then print("-> (1)"..k1.."\n") end
for k,_ in pairs(v1) do
v = ntop.getHashCache(k1, k)
res = split(k, "@")
if(debug) then print("\t"..k .. "=" .. v.. "\n") end
if((res[1] ~= nil) and (res[2] ~= nil) and (v ~= nil)) then
contacts:write(contact_idx..","..idx..",0,"..host2id(res[1])..",".. res[2]..",".. v.."\n")
contact_idx = contact_idx + 1
end
if(delete_keys) then ntop.delHashCache(k1, k) end
end
idx = idx + 1
end
k2 = when.."|"..key.."|contacted_peers"
v2 = ntop.getHashKeysCache(k2)
if(v2 ~= nil) then
res = split(k1, "|")
if(res[2] == "host_contacts") then
r = 0
else
-- aggregations
r = 1
end
name = host2id(res[4])
activities:write(idx..",".. interface2id(res[3])..",".. name ..",".. r .."\n")
if(debug) then print("-> (2)"..k2.."\n") end
for k,v in pairs(v2) do
v = ntop.getHashCache(k2, k)
res = split(k, "@")
if(debug) then print("\t"..k .. "=" .. v.. "\n") end
if((res[1] ~= nil) and (res[2] ~= nil) and (v ~= nil)) then
contacts:write(contact_idx..","..idx..",1,"..host2id(res[1])..",".. res[2]..",".. v.."\n")
contact_idx = contact_idx + 1
end
if(delete_keys) then ntop.delHashCache(k2, k) end
end
idx = idx + 1
end
until(key == "")
-- Dump Interfaces
print(interfaces_id.." interfaces found
\n")
for iface,id in pairs(interfaces_hash) do
interfaces:write(id..","..iface.."\n")
end
-- Dump Hosts
print(hosts_id.." hosts found
\n")
for host,id in pairs(hosts_hash) do
hosts:write(id..","..host.."\n")
end
contacts:close()
activities:close()
hosts:close()
-- #########################################################
tables:write("CREATE DATABASE IF NOT EXISTS `20"..when.."`;\nUSE `20"..when.."`;\n\n")
tables:write("\nCREATE TABLE IF NOT EXISTS `interfaces` (\n`idx` int(11) NOT NULL,\n`interface_name` VARCHAR(32) NOT NULL,\nPRIMARY KEY (`idx`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\n\n")
tables:write("\nCREATE TABLE IF NOT EXISTS `hosts` (\n`idx` int(11) NOT NULL,\n`host_name` VARCHAR(128) NOT NULL,\nPRIMARY KEY (`idx`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\n\n")
tables:write("\nCREATE TABLE IF NOT EXISTS `activities` (\n`idx` int(11) NOT NULL,\n`interface_idx` int(11) NOT NULL,\n`host_idx` int(11) NOT NULL,\n`type` INT(8) NOT NULL,\nPRIMARY KEY (`idx`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\n\n")
tables:write("\nCREATE TABLE IF NOT EXISTS `contacts` (\n`idx` int(11) NOT NULL,\n`activity_idx` int(11) NOT NULL,\n`contact_type` int(11) NOT NULL,\n`host_idx` int(11) NOT NULL,\n`contact_family` int(8) DEFAULT NULL,\n`num_contacts` int(8) NOT NULL,\nPRIMARY KEY (`idx`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\n\n")
tables:write('mysql --local-infile=1 -u root -p 20'..when..'\n')
tables:write('LOAD data local infile "/var/tmp/ntopng/datadump/20'..when..'_interfaces.csv" INTO TABLE interfaces fields terminated by "," ignore 1 lines;\n')
tables:write('LOAD data local infile "/var/tmp/ntopng/datadump/20'..when..'_hosts.csv" INTO TABLE hosts fields terminated by "," ignore 1 lines;\n')
tables:write('LOAD data local infile "/var/tmp/ntopng/datadump/20'..when..'_activities.csv" INTO TABLE activities fields terminated by "," ignore 1 lines;\n')
tables:write('LOAD data local infile "/var/tmp/ntopng/datadump/20'..when..'_contacts.csv" INTO TABLE contacts fields terminated by "," ignore 1 lines;\n')
tables:close()
sec = os.clock() - begin
print(string.format("Elapsed time: %.2f min\n", sec/60).."
\n")
print("\nDone.\n")
-- redis-cli KEYS "131129|*" | xargs redis-cli DEL