0
0
mirror of https://github.com/cjdelisle/cjdns synced 2025-10-06 00:32:50 +02:00
Files
cjdns/contrib/python/trashroutes
2017-01-14 00:57:12 +02:00

105 lines
2.9 KiB
Python
Executable File

#!/usr/bin/env python2
# You may redistribute this program and/or modify it under the terms of
# the GNU General Public License as published by the Free Software Foundation,
# either version 3 of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
import sys;
import math;
from cjdnsadmin.cjdnsadmin import connectWithAdminInfo;
cjdns = connectWithAdminInfo();
allRoutes = [];
def parseRoute(path):
if (path == 0): return [-1];
if ((path & 15) == 1): return [1];
if (path & 1):
path >>= 1;
out = [(path & 7)];
if out[0] == 1: out[0] = 0;
path >>= 3;
elif ((path & 3) == 2):
path >>= 2;
out = [(path & 31)];
if out[0] != 0: out[0]+=1;
path >>= 5;
else:
path >>= 2;
out = [(path & 255)];
if out[0] != 0: out[0]+=1;
path >>= 8;
out.extend(parseRoute(path));
return out;
i = 0;
while True:
table = cjdns.NodeStore_dumpTable(i);
routes = table['routingTable'];
allRoutes += routes;
if (not 'more' in table):
break;
i += 1;
# get the value of a route as cjdns sees it
def getValue(node):
if (node['link'] == 0): return 0
return 64 - int(math.log(int(node['path'].replace(".", ""), 16), 2));
# get only the routes which will actually be user
ar = {};
for route in allRoutes:
if route['ip'] not in ar or getValue(route) > getValue(ar[route['ip']]):
ar[route['ip']] = route;
allRoutes = [];
for k in ar.keys():
allRoutes.append(ar[k]);
# get the actual arrays of interface indexes representing the path
for route in allRoutes:
path = int(route['path'].replace(".", ""), 16);
route['r'] = parseRoute(path);
penaltySum = 0;
lengthSum = 0;
for route in allRoutes:
r = route['r'];
penalty = 0;
for i in range(1,len(r)):
penalize = True;
for routeB in allRoutes:
rb = routeB['r'];
if len(rb) < i or rb == r: continue;
for j in range(0,i+1):
if (rb[j] != r[j]): break;
if (j == i): penalize = False;
if not penalize: break;
if penalize: penalty += 1;
penalty <<= 1;
output = str(penalty) + '\t' + route['ip'] + '@' + route['path'] + ' ' + str(r);
if (r[-1] == -1): output += ' INVALID';
print(output);
penaltySum += penalty;
lengthSum += len(r);
avgPenalty = float(penaltySum) / len(allRoutes);
avgLength = float(lengthSum) / len(allRoutes);
print("average penalty " + str(avgPenalty));
print("average length " + str(avgLength));
print("trashroute index " + str(avgPenalty / avgLength));