-
Notifications
You must be signed in to change notification settings - Fork 0
/
LocalAdvertiserOld.py
127 lines (96 loc) · 4.77 KB
/
LocalAdvertiserOld.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import sys
import time
import argparse
import traceback
import random
import os
import subprocess
import socket
from pyndn import Name
from pyndn import Data
from pyndn import Face
from pyndn.security import KeyChain
def get_device_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8",80))
return str(s.getsockname()[0])
class Producer(object):
def __init__(self):
self.keyChain = KeyChain()
self.isDone = False
self.prefixesList = []
self.gatewayIP = "gatewayIP"
def run(self, namespace):
# Create a connection to the local forwarder over a Unix socket
self.gatewayIP = os.popen('ip route | grep default').read().split(" ")[2]+"02" #get gateway IP of gateway router
os.system("nfdc face create remote udp://"+self.gatewayIP)
os.system("nfdc route add /ndnchat/register udp://"+self.gatewayIP)
face = Face()
prefix = Name(namespace)
# Use the system default key chain and certificate name to sign commands.
face.setCommandSigningInfo(self.keyChain, \
self.keyChain.getDefaultCertificateName())
# Also use the default certificate name to sign Data packets.
face.registerPrefix(prefix, self.onInterest, self.onRegisterFailed)
print "Registering prefix", prefix.toUri()
# Run the event loop forever. Use a short sleep to
# prevent the Producer from using 100% of the CPU.
while not self.isDone:
# check gatewayIP change. If change:
# Add route from UE to new gateway for each prefix in local prefix list
# Concat prefix in the list to the form "prefix1|prefix2", then call interestSender to send them to new gateway router
try:
newgatewayIP = os.popen('ip route | grep default').read().split(" ")[2]+"02"
if newgatewayIP != self.gatewayIP:
print "Changes in network detected, attempt re-advertising prefixes"
os.system("nfdc face create remote udp://"+newgatewayIP)
os.system("nfdc route add /ndnchat/register udp://"+newgatewayIP)
concatPrefixesList = ""
for i in range (0,len(self.prefixesList)):
os.system("nfdc route add " + str(self.prefixesList[i]) + " udp://" + newgatewayIP)
if i == len(self.prefixesList) - 1:
concatPrefixesList = concatPrefixesList + self.prefixesList[i]
else:
concatPrefixesList = concatPrefixesList + self.prefixesList[i] + "|"
concatPrefixesList = concatPrefixesList + "|" + get_device_ip()
subprocess.call(["python", "interestSender.py", "-u /ndnchat/register", "-p"+concatPrefixesList])
self.gatewayIP = newgatewayIP
except IndexError:
print "Lost Internet Connection"
self.gatewayIP = ""
face.processEvents()
time.sleep(0.01)
def onInterest(self, prefix, interest, transport, registeredPrefixId):
interestName = interest.getName()
interestParams = str(interest.getApplicationParameters())
addPrefixes = interestParams.split("|")
interestParams = interestParams + "|"+get_device_ip()
# For each Prefix recieved save it in local array
# Add route for that prefix from User to gateway router
for i in range (0,len(addPrefixes)):
print addPrefixes[i]
self.prefixesList.append(str(addPrefixes[i]))
os.system("nfdc route add " + str(addPrefixes[i]) + " udp://" + self.gatewayIP)
# Send prefixesList to gateway router
subprocess.call(["python", "interestSender.py", "-u /ndnchat/register", "-p "+interestParams])
data = Data(interestName)
data.setContent("Register Successful")
hourMilliseconds = 3600 * 1000
data.getMetaInfo().setFreshnessPeriod(hourMilliseconds)
self.keyChain.sign(data, self.keyChain.getDefaultCertificateName())
transport.send(data.wireEncode().toBuffer())
print "Sent advertisement to gateway router"
#self.isDone = True
def onRegisterFailed(self, prefix):
print "Register failed for prefix", prefix.toUri()
self.isDone = True
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Parse command line args for ndn producer')
parser.add_argument("-n", "--namespace", required=True, help='namespace to listen under')
args = parser.parse_args()
try:
namespace = args.namespace
Producer().run(namespace)
except:
traceback.print_exc(file=sys.stdout)
sys.exit(1)