-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbank_server.py
174 lines (143 loc) · 6.71 KB
/
bank_server.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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
import bank_pb2
import pickle
import sys
import socket
import random
import threading
import time
sys.path.append('/home/phao3/protobuf/protobuf-3.4.0/python')
BRANCH_NAME = ""
BRANCH_BALANCE = 0
BRANCH_LIST = []
doTransfer = False
SNAPSHOTS = {}
isCapturing = False
currentSnapId = 1
MARKER_MSG = 1
isUpdate = True
def sendTransactions():
global BRANCH_NAME
global BRANCH_BALANCE
global BRANCH_LIST
global isUpdate
while doTransfer:
random_entry = random.choice(BRANCH_LIST)
if BRANCH_BALANCE > 50:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((random_entry["ip"], random_entry["port"]))
transfer = bank_pb2.Transfer()
transfer.money = (BRANCH_BALANCE * random.randrange(1, 5)) / 100
msg = bank_pb2.BranchMessage()
msg.transfer.CopyFrom(transfer)
BRANCH_BALANCE = BRANCH_BALANCE - transfer.money
s.sendall(pickle.dumps(msg))
s.close()
if MARKER_MSG > 1 or isCapturing:
isUpdate = True
print "TRANSFERRING %s to %s...Remainging Balance: %s\n" % (
str(transfer.money), str(random_entry["name"]), str(BRANCH_BALANCE))
time.sleep(random.randrange(1, 5))
def object_to_dict(repeatedObject):
global BRANCH_LIST
for object in repeatedObject:
d = {}
for fields in object.ListFields():
d[fields[0].name] = fields[1]
if d["port"] != int(sys.argv[2]):
BRANCH_LIST.append(d)
def getDestBranchName(ip):
for br in BRANCH_LIST:
if br['ip'] == ip:
return br["name"]
if __name__ == '__main__':
ip = socket.gethostbyname(socket.getfqdn())
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((ip, int(sys.argv[2])))
server_socket.listen(5)
print '\nWaiting for connection... Listening on %s:%s\n' % (str(ip), sys.argv[2])
try:
while True:
client_connection, client_address = server_socket.accept()
data = pickle.loads(client_connection.recv(1024))
if isCapturing and data.WhichOneof('branch_message') == 'transfer':
SNAPSHOTS[currentSnapId][getDestBranchName(str(client_address[0])) + "->" + sys.argv[1]].append(
data.transfer.money)
print "\nMessage : %s\n" % str(data.WhichOneof('branch_message'))
if data.WhichOneof('branch_message') == 'init_branch':
BRANCH_NAME = sys.argv[1]
BRANCH_BALANCE = data.init_branch.balance
object_to_dict(data.init_branch.all_branches)
doTransfer = True
if len(BRANCH_LIST) > 0:
t = threading.Thread(target=sendTransactions, args=())
t.setDaemon(True)
t.start()
elif data.WhichOneof('branch_message') == 'transfer':
BRANCH_BALANCE = BRANCH_BALANCE + data.transfer.money
print "Received Amount %s from %s...Total Balance is %s\n" % (
str(data.transfer.money), str(client_address[0]), str(BRANCH_BALANCE))
if MARKER_MSG > 1 or isCapturing:
isUpdate = False
elif data.WhichOneof('branch_message') == 'init_snapshot':
currentSnapId = data.init_snapshot.snapshot_id
SNAPSHOTS[currentSnapId] = {}
SNAPSHOTS[currentSnapId][sys.argv[1]] = BRANCH_BALANCE
for branch in BRANCH_LIST:
SNAPSHOTS[currentSnapId][branch["name"] + "->" + sys.argv[1]] = []
marker_msg = bank_pb2.Marker()
marker_msg.snapshot_id = data.init_snapshot.snapshot_id
msg = bank_pb2.BranchMessage()
msg.marker.CopyFrom(marker_msg)
for branch in BRANCH_LIST:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((branch["ip"], branch["port"]))
s.sendall(pickle.dumps(msg))
s.close()
isCapturing = True
elif data.WhichOneof('branch_message') == 'marker':
if MARKER_MSG == 1:
MARKER_MSG = MARKER_MSG + 1
if not isCapturing:
currentSnapId = data.marker.snapshot_id
SNAPSHOTS[currentSnapId] = {}
SNAPSHOTS[currentSnapId][sys.argv[1]] = BRANCH_BALANCE
for branch in BRANCH_LIST:
SNAPSHOTS[currentSnapId][branch["name"] + "->" + sys.argv[1]] = []
marker_msg = bank_pb2.Marker()
marker_msg.snapshot_id = data.marker.snapshot_id
msg = bank_pb2.BranchMessage()
msg.marker.CopyFrom(marker_msg)
for branch in BRANCH_LIST:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((branch["ip"], branch["port"]))
s.sendall(pickle.dumps(msg))
s.close()
isCapturing = True
elif MARKER_MSG == len(BRANCH_LIST):
isCapturing = False
MARKER_MSG = 1
isUpdate = False
print "\n\nSnapShots captured : %s \n\n" % str(SNAPSHOTS[data.marker.snapshot_id])
else:
MARKER_MSG = MARKER_MSG + 1
if isUpdate:
SNAPSHOTS[currentSnapId][sys.argv[1]] = BRANCH_BALANCE
elif data.WhichOneof('branch_message') == 'retrieve_snapshot':
snap_shot_obj = bank_pb2.ReturnSnapshot()
snap_shot_obj.local_snapshot.snapshot_id = data.retrieve_snapshot.snapshot_id
snap_shot_obj.local_snapshot.balance = SNAPSHOTS[data.retrieve_snapshot.snapshot_id][str(sys.argv[1])]
for k, v in SNAPSHOTS[data.retrieve_snapshot.snapshot_id].iteritems():
if k != str(sys.argv[1]):
if len(v) == 0:
snap_shot_obj.local_snapshot.channel_state.append(0)
else:
for val in v:
snap_shot_obj.local_snapshot.channel_state.append(val)
msg = bank_pb2.BranchMessage()
msg.return_snapshot.CopyFrom(snap_shot_obj)
print "Returning Snapshot : ", msg
client_connection.sendall(pickle.dumps(msg))
except KeyboardInterrupt:
print "\nServer Stopped.....\n"
doTransfer = False
server_socket.close()