Commit 11f6f9df authored by Ulysse Beaugnon's avatar Ulysse Beaugnon

Merge branch 'master' of https://git.erp5.org/repos/vifibnet

parents 5d9fa24a b7453ca8
#!/usr/bin/env python
import sqlite3, xmlrpclib, time import sqlite3, xmlrpclib, time
import utils import utils
class PeerManager: class PeerManager:
def __init__(self, dbPath, server, server_port, refresh_time, external_ip, internal_ip, port, proto, db_size): def __init__(self, db_path, server, server_port, refresh_time, external_ip, internal_ip, port, proto, db_size):
self._refresh_time = refresh_time self._refresh_time = refresh_time
self._external_ip = external_ip self._external_ip = external_ip
self._internal_ip = internal_ip self._internal_ip = internal_ip
...@@ -14,7 +13,7 @@ class PeerManager: ...@@ -14,7 +13,7 @@ class PeerManager:
self._proxy = xmlrpclib.ServerProxy('http://%s:%u' % (server, server_port)) self._proxy = xmlrpclib.ServerProxy('http://%s:%u' % (server, server_port))
utils.log('Connectiong to peers database', 4) utils.log('Connectiong to peers database', 4)
self._db = sqlite3.connect(dbPath, isolation_level=None) self._db = sqlite3.connect(db_path, isolation_level=None)
utils.log('Preparing peers database', 4) utils.log('Preparing peers database', 4)
try: try:
self._db.execute("UPDATE peers SET used = 0") self._db.execute("UPDATE peers SET used = 0")
...@@ -32,12 +31,12 @@ class PeerManager: ...@@ -32,12 +31,12 @@ class PeerManager:
def _declare(self): def _declare(self):
if self._external_ip != None: if self._external_ip != None:
utils.log('Declaring our connections info', 3) utils.log('Declaring our connections info', 3)
self._proxy.declare((self._internal_ip, self._external_ip, self._external_port, self._proto)) self._proxy.declare((self._internal_ip, self._external_ip, self._external_port, self._proto))
else: else:
utils.log('Warning : could not declare the external ip because it is unknown', 4) utils.log('Warning : could not declare the external ip because it is unknown', 4)
def _populate(self): def _populate(self):
utils.log('Populating the peers DB', 2) utils.log('Populating the peers DB', 2)
new_peer_list = self._proxy.getPeerList(self._db_size, self._internal_ip) new_peer_list = self._proxy.getPeerList(self._db_size, self._internal_ip)
self._db.executemany("INSERT OR IGNORE INTO peers (ip, port, proto, used) VALUES (?,?,?,0)", new_peer_list) self._db.executemany("INSERT OR IGNORE INTO peers (ip, port, proto, used) VALUES (?,?,?,0)", new_peer_list)
...@@ -45,9 +44,9 @@ class PeerManager: ...@@ -45,9 +44,9 @@ class PeerManager:
self._db.execute("DELETE FROM peers WHERE ip = ?", (self._external_ip,)) self._db.execute("DELETE FROM peers WHERE ip = ?", (self._external_ip,))
utils.log('New peers : %s' % ', '.join(map(str, new_peer_list)), 5) utils.log('New peers : %s' % ', '.join(map(str, new_peer_list)), 5)
def getUnusedPeers(self, nPeers): def getUnusedPeers(self, peer_count):
return self._db.execute("SELECT id, ip, port, proto FROM peers WHERE used = 0 " return self._db.execute("SELECT id, ip, port, proto FROM peers WHERE used = 0 "
"ORDER BY RANDOM() LIMIT ?", (nPeers,)) "ORDER BY RANDOM() LIMIT ?", (peer_count,))
def usePeer(self, id): def usePeer(self, id):
utils.log('Updating peers database : using peer ' + str(id), 5) utils.log('Updating peers database : using peer ' + str(id), 5)
......
#!/usr/bin/env python
import os, subprocess import os, subprocess
import utils import utils
...@@ -22,12 +21,12 @@ def openvpn(*args, **kw): ...@@ -22,12 +21,12 @@ def openvpn(*args, **kw):
# TODO : set iface up when creating a server/client # TODO : set iface up when creating a server/client
# ! check working directory before launching up script ? # ! check working directory before launching up script ?
def server(serverIp, network, max_clients, dh_path, pipe_fd, port, proto, *args, **kw): def server(server_ip, network, max_clients, dh_path, pipe_fd, port, proto, *args, **kw):
utils.log('Starting server', 3) utils.log('Starting server', 3)
return openvpn( return openvpn(
'--tls-server', '--tls-server',
'--mode', 'server', '--mode', 'server',
'--up', 'ovpn-server %s/%u' % (serverIp, len(network)), '--up', 'ovpn-server %s/%u' % (server_ip, len(network)),
'--client-connect', 'ovpn-server ' + str(pipe_fd), '--client-connect', 'ovpn-server ' + str(pipe_fd),
'--client-disconnect', 'ovpn-server ' + str(pipe_fd), '--client-disconnect', 'ovpn-server ' + str(pipe_fd),
'--dh', dh_path, '--dh', dh_path,
...@@ -36,12 +35,12 @@ def server(serverIp, network, max_clients, dh_path, pipe_fd, port, proto, *args, ...@@ -36,12 +35,12 @@ def server(serverIp, network, max_clients, dh_path, pipe_fd, port, proto, *args,
'--proto', proto, '--proto', proto,
*args, **kw) *args, **kw)
def client(serverIp, pipe_fd, *args, **kw): def client(server_ip, pipe_fd, *args, **kw):
utils.log('Starting client', 5) utils.log('Starting client', 5)
return openvpn( return openvpn(
'--nobind', '--nobind',
'--client', '--client',
'--remote', serverIp, '--remote', server_ip,
'--up', 'ovpn-client', '--up', 'ovpn-client',
'--route-up', 'ovpn-client ' + str(pipe_fd), '--route-up', 'ovpn-client ' + str(pipe_fd),
*args, **kw) *args, **kw)
......
#!/usr/bin/env python
import socket, uuid import socket, uuid
import log import log
...@@ -18,18 +17,18 @@ class RingMember: ...@@ -18,18 +17,18 @@ class RingMember:
return str(self.id) + ' ' + self.ip + ' ' + str(self.port) return str(self.id) + ' ' + self.ip + ' ' + str(self.port)
class Ring: class Ring:
def __init__(self, entryPoint): def __init__(self, entry_point):
# initialize the connection # initialize the connection
self.sock = socket.socket( socket.AF_INET6, socket.SOCK_DGRAM ) self.sock = socket.socket( socket.AF_INET6, socket.SOCK_DGRAM )
self.sock.bind(('', 0)) self.sock.bind(('', 0))
self.me = RingMember(uuid.uuid1().int ,'', self.sock.getsockname()[1]) # TODO : get the address self.me = RingMember(uuid.uuid1().int ,'', self.sock.getsockname()[1]) # TODO : get the address
# to enter the ring # to enter the ring
self.predecessor = None self.predecessor = None
if entryPoint == None: if entry_point == None:
self.successor = self.me self.successor = self.me
else: else:
self.send('FIND_SUCCESSOR ' + str(self.me.id) + ' ' + self.me.toString(), entryPoint) self.send('FIND_SUCCESSOR ' + str(self.me.id) + ' ' + self.me.toString(), entry_point)
log.log('Init the ring with me = ' + self.me.toString(), 3) log.log('Init the ring with me = ' + self.me.toString(), 3)
# TODO : # TODO :
...@@ -65,16 +64,17 @@ class Ring: ...@@ -65,16 +64,17 @@ class Ring:
# if n < x && x < self.successor: # if n < x && x < self.successor:
# self.successor = x # self.successor = x
# SEND notify self.ip, self.id TO self.successor # SEND notify self.ip, self.id TO self.successor
# def notify(self, n2) # def notify(self, n2)
# if self.predecessor == None || (predecessor < n2 && n2 < n): # if self.predecessor == None || (predecessor < n2 && n2 < n):
# self.predecessor = n2 # self.predecessor = n2
# to be called periodically # to be called periodically
# def fixFingers(self) # def fixFingers(self)
# # XXX: naming - should be finger_count
# next = (next + 1) mod (nFingers) # Or Random, cf google # next = (next + 1) mod (nFingers) # Or Random, cf google
# finger[next] = find_successor(n+2^{next-1}); # finger[next] = find_successor(n+2^{next-1});
# to be called periodically # to be called periodically
# def checkPredecessor(self) # def checkPredecessor(self)
# if NO PING from self.predecessor: # if NO PING from self.predecessor:
......
...@@ -86,7 +86,7 @@ class main(object): ...@@ -86,7 +86,7 @@ class main(object):
server4.register_instance(self) server4.register_instance(self)
server6 = SimpleXMLRPCServer6(('::', self.config.port), requestHandler=RequestHandler, allow_none=True) server6 = SimpleXMLRPCServer6(('::', self.config.port), requestHandler=RequestHandler, allow_none=True)
server6.register_instance(self) server6.register_instance(self)
# Main loop # Main loop
while True: while True:
try: try:
...@@ -169,7 +169,7 @@ class main(object): ...@@ -169,7 +169,7 @@ class main(object):
return crypto.dump_certificate(crypto.FILETYPE_PEM, self.ca) return crypto.dump_certificate(crypto.FILETYPE_PEM, self.ca)
def getBootstrapPeer(self, handler): def getBootstrapPeer(self, handler):
# TODO: Insert a flag column for bootstrap ready servers in peers # TODO: Insert a flag column for bootstrap ready servers in peers
# ( servers which shouldn't go down or change ip and port as opposed to servers owned by particulars ) # ( servers which shouldn't go down or change ip and port as opposed to servers owned by particulars )
# that way, we also ascertain that the server sent is not the new node.... # that way, we also ascertain that the server sent is not the new node....
ip, port, proto = self.db.execute("SELECT ip, port, proto FROM peers ORDER BY random() LIMIT 1").next() ip, port, proto = self.db.execute("SELECT ip, port, proto FROM peers ORDER BY random() LIMIT 1").next()
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include <map> #include <map>
#include <queue> #include <queue>
Graph::Graph(int size, int k, int maxPeers, mt19937& rng) : Graph::Graph(int size, int k, int maxPeers, mt19937& rng) :
distrib(uniform_int_distribution<int>(0, size-1)), distrib(uniform_int_distribution<int>(0, size-1)),
size(size), generator(rng) size(size), generator(rng)
{ {
...@@ -17,9 +17,9 @@ Graph::Graph(int size, int k, int maxPeers, mt19937& rng) : ...@@ -17,9 +17,9 @@ Graph::Graph(int size, int k, int maxPeers, mt19937& rng) :
{ {
int otherNode; int otherNode;
while(alreadyConnected.count(otherNode = distrib(rng)) == 1 while(alreadyConnected.count(otherNode = distrib(rng)) == 1
|| otherNode > i && adjacency[otherNode].size() > maxPeers-10 || otherNode > i && adjacency[otherNode].size() > maxPeers-10
|| adjacency[otherNode].size() > maxPeers) || adjacency[otherNode].size() > maxPeers)
{ } { }
adjacency[i].push_back(otherNode); adjacency[i].push_back(otherNode);
adjacency[otherNode].push_back(i); adjacency[otherNode].push_back(i);
...@@ -75,7 +75,7 @@ int Graph::CountUnreachableFrom(int node) ...@@ -75,7 +75,7 @@ int Graph::CountUnreachableFrom(int node)
unAccessible--; unAccessible--;
toVisit.pop(); toVisit.pop();
} }
return unAccessible; return unAccessible;
} }
...@@ -156,7 +156,7 @@ void MinCutGraph::Merge(int nMerge, mt19937& rng) ...@@ -156,7 +156,7 @@ void MinCutGraph::Merge(int nMerge, mt19937& rng)
int n1 = edges[eId].v.first; int n1 = edges[eId].v.first;
int n2 = edges[eId].v.second; int n2 = edges[eId].v.second;
// anilate n2 // anilate n2
nodes[n2].null = true; nodes[n2].null = true;
......
...@@ -49,16 +49,16 @@ int main(int argc, char** argv) ...@@ -49,16 +49,16 @@ int main(int argc, char** argv)
for(float a=0.01; a<=1; a+=0.05) for(float a=0.01; a<=1; a+=0.05)
{ {
int seed = rng(); int seed = rng();
outputStrings.push_back(async(launch::async, [seed, n, k, a]() outputStrings.push_back(async(launch::async, [seed, n, k, a]()
{ {
Results results = Simulate(seed, n, k, 3*k, 10000, a, 1); Results results = Simulate(seed, n, k, 3*k, 10000, a, 1);
ostringstream out; ostringstream out;
out << n << "," << k << "," << a << "," << 3*k << "," out << n << "," << k << "," << a << "," << 3*k << ","
<< results.avgDistance << "," << results.avgDistance << ","
<< results.disconnected << "," << results.disconnected << ","
<< results.disconnectionProba << "," << results.disconnectionProba << ","
<< results.maxDistanceReached << "," << results.maxDistanceReached << ","
<< results.arityDistrib[3*k] << "," << results.arityDistrib[3*k] << ","
<< results.minKConnexity << "," << results.minKConnexity << ","
<< results.avgAccessibility << results.avgAccessibility
<< endl; << endl;
......
...@@ -9,7 +9,7 @@ using namespace std; ...@@ -9,7 +9,7 @@ using namespace std;
template<class T> template<class T>
struct nullable struct nullable
{ {
T v; T v;
bool null; bool null;
...@@ -75,7 +75,7 @@ public: ...@@ -75,7 +75,7 @@ public:
double arityTooBig; double arityTooBig;
double distanceTooBig; double distanceTooBig;
int64_t disconnected; int64_t disconnected;
int maxArity; int maxArity;
int maxDistance; int maxDistance;
......
#include "main.h" #include "main.h"
Results::Results(int maxArity, int maxDistance) : Results::Results(int maxArity, int maxDistance) :
maxArity(maxArity), maxDistance(maxDistance) maxArity(maxArity), maxDistance(maxDistance)
{ {
arityDistrib = new double[maxArity+1]; arityDistrib = new double[maxArity+1];
...@@ -54,7 +54,7 @@ void Results::AddDistanceSample(int distance) ...@@ -54,7 +54,7 @@ void Results::AddDistanceSample(int distance)
{ {
if(distance == -1) if(distance == -1)
disconnected++; disconnected++;
else else
{ {
avgDistance += distance; avgDistance += distance;
if(distance <= maxDistance) if(distance <= maxDistance)
......
#!/usr/bin/env python
import os, random, traceback, time import os, random, traceback, time
import plib, utils, db import plib, utils, db
......
#!/usr/bin/env python
import miniupnpc import miniupnpc
import socket import socket
# return (address, port) # return (address, port)
def ForwardViaUPnP(localPort): def ForwardViaUPnP(local_port):
u = miniupnpc.UPnP() u = miniupnpc.UPnP()
u.discoverdelay = 200 u.discoverdelay = 200
u.discover() u.discover()
u.selectigd() u.selectigd()
externalPort = 1194 external_port = 1194
while True: while True:
while u.getspecificportmapping(externalPort, 'UDP') != None: while u.getspecificportmapping(external_port, 'UDP') != None:
externalPort = max(externalPort + 1, 49152) external_port = max(externalPort + 1, 49152)
if externalPort == 65536: if external_port == 65536:
raise Exception raise Exception
if u.addportmapping(externalPort, 'UDP', u.lanaddr, localPort, 'Vifib openvpn server', ''): if u.addportmapping(external_port, 'UDP', u.lanaddr, local_port, 'Vifib openvpn server', ''):
return (u.externalipaddress(), externalPort) return (u.externalipaddress(), external_port)
# TODO : specify a lease duration # TODO : specify a lease duration
#!/usr/bin/env python
import argparse, time, struct, socket import argparse, time, struct, socket
from OpenSSL import crypto from OpenSSL import crypto
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment