From 7518ca2210dd703c03731f7817f7c99cdfdd5b19 Mon Sep 17 00:00:00 2001
From: Katharina <katharina.willig@outlook.com>
Date: Sat, 23 Nov 2024 16:21:39 +0100
Subject: [PATCH] test multiple servers

---
 __pycache__/kserver.cpython-313.pyc | Bin 0 -> 3481 bytes
 extract.py                          |   4 +++
 form_ring.py                        |  47 ++++++++++++++++++++++++++++
 kserver.py                          |  33 +++++++++++++++++--
 sync.py                             |  15 ---------
 5 files changed, 81 insertions(+), 18 deletions(-)
 create mode 100644 __pycache__/kserver.cpython-313.pyc
 create mode 100644 extract.py
 create mode 100644 form_ring.py
 delete mode 100644 sync.py

diff --git a/__pycache__/kserver.cpython-313.pyc b/__pycache__/kserver.cpython-313.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..401d92341d7bb4d3c2994fd3d5d394df9ea34069
GIT binary patch
literal 3481
zcmey&%ge>Uz`*d~qGS4NZU%<OAPx+(Lm8iKm>3wQG6XXOGkP-=L1@MzMlheLh$)z<
zh&h<Kh$V(qi6Mq5hzF_*iBe)Ph4M@pA&esS7!HJJ5oZiT5JUonRAPu>2ogaN0&`**
zg2ccK6vC7V!Y$&7;R%w4u#w3ah9DVaK7<{^5F`g-A(O!@rpyq&0t1PrDM0iglW3+X
zBg;Y9!K^VXCQPu<QDBG>Qep^Zi(%(u2xgCA;bREqFlI%_26IX=6bT1&Nih_O#E1rS
zTSYK1BziM2#4rZwK+HoXl^9|~f_W?%i^OBZgA9>nAZ%FNC@=)`N--2k;xt7PY>HGc
zUyM`^JbYuM@SB;=n9iul{}N=CUlqTRsi__k&SbvH!0-~3CT=lQNd>1Cm8BLbWELwF
zmFDGT=A|o?XO?6rc)BQ5Nhu`er6?p7<tL^jCl;50<nr?r3i69e6snl@^z@QJW`OJf
zVO9nP22kvMu3!MCTgGURC>ZlG1T%#)@G%&(1c6k5#SjE6B=Q)eSzw|;uv`EWU|?Vf
zWsK&4aihWc2gEaBf~7zOhID34mMZ<?)V!2ph1}HQ;>7gSVug}?g~Xg3g<`Nbbv<2*
z6*BV_N-|Ov@={C6^NX@?F-BK0#VYt|vfbi@D2mTaxy6>6mz<xHdW#n-RGgojomz5>
z4P<yp{w*GOpu}eu+~Py<K!Kylbc-Eo{Vkrf(wv-lD6bflR}>U(#W`EWgche36~|;J
zmSiNxxa237=BDPA6vy}`7MG+J#k)AU#<*k_mlS0tm6oKYC<Ip)m!#$v#}pLhXQd{W
z#H1kPbc>;K*$|iN6;$5hguACmfPsNQoPmL%*oc9Fp@HFnsMwUs3E2yT7Pv34ydbQ5
zUD)KJu*qd%vj(3#EP~frBrdW@%#c~bvnB6>y6aUIx6hy;P6iP$%m#~Q4{-4$#~{am
zh-hrl8_WpHLZwU$3<Zp#3_+lz0y7Uv!xI5hC=<5G4~Az`4XBR9SO$h*=1?YU1_p-2
za0Z4@rXWtJ6cQE846{9$1!Qe7YcLxNLmqP|Ga?CrGcpqcgKq`{Lnw1JyePG1WMD|t
zVqids1o0yo4P}PHZBSr{7K92i1ha=Sg9;FYUQqIfxkUlwT49)41Rcx?QvvrS9|Mx9
zp^SVC!Cc1hut2eq8!XEc%7kiDv?$E{P$Yf6cNrKI8KU6@dXNN66@q4GNR(h;$YVkB
z6>lgD9|N-e@(jUjc`S}B>1+@>jWJpZW&%4yA|C?-iW~W0{!?I(XGmvDW3XkGXGmkz
z<gYR+N=;79EK5boxoJiDxeCcSnV_73S`vZsZ?0Y@g8&0V5hy|4VvH>U<*g!6@#0q{
z<C0mNoL`n&l$xTDms$?Z`wF3<o-S4jRf1r%Ah|`MIJLw|;TC&pUI|Ebm5>6I1+qaQ
zIU}(|uZk}S;<6M4u!E|YtQ4w*9rF}Yi;D7#6!MdkON)w9Q>+xK#JQklX?bQ*ib7Iq
zYF<ieiJqRGCSMUKW!~Z_N=+^UnQ@CPB^6w{a21y%7L^o(3fx<)#RWN;B}Jfu?-mcl
zb@8R8nJLA$m=jY{Zm|{=W#*OK;)#z>&d)1J%*-o}j|b=OTWrv>i52XiTY}!Hl}Y)D
zMJb*jKNXc0lxVUR@iH(l+~R|TWqe{vN>OTY@hyIcD^g&^(=BdL>6Tgqw)PfdYB4Co
zD1bl_DBa&;%gHP*NzE%#VPIg81(hi(jNmebi|+%I5~t7|HRJ1QHW$@wc7$A3bGpc*
z+~IyhPIZ3X%)HBTdL8~B*cb%luk&kO<kwuGe4StKBEQ}S;~n~!jXiJ3>0XyJz9?tB
z!TGYB#SX!Xa@IQ>cQ{>;v!B5IfsH{#eu?H~VeOkDG7wJAWnrT`A_~_<R4$6BEQr1$
zVt7YH@`8-T4(T1d7hJ=xgePAJOSvGGdPOAd0|(en?Th@{D?G3Bn_c8LyCWbvL+*lv
z#sv+l3u4w+1Z<x02u|=@V0S^uXoJ#*_zNbk7lhod@VGzW5uK2Kg-7k9F#|XMk1rMs
z0%H9&oi(2sm^g**@CaTIQD4Ehp!kB2_7xtTJ3NBFzpya~D8glhbguB|-sBPdz{<oa
z^s88vfq|jfQN>xF;h?6YiL*SzVR;c3MdriCd@gLvN7y7>6q%1GFuEu*-{Odm&rQtC
zi;vf2yv0_MSd^Yxf>Qi~YDiEb|C|M_WrG>K8S)sw#V|-5oc9ogr2+%?;ucXXDlquU
zgNp)CJ_74zXGmlQWm|cMbOv|^W$^=Nuqr`l5=S%_UV^G(O_p0MC7HRYkQB*UoRgYb
zP$bX5z@W)kqzOtYpq7FHBpC@6q!wl7r(`C_BdRHF1_lOSkUA@HHFcXq_y(WQ2PPI?
zu{#2i7o>Er2<Y7q5Sh+3k!yz06uyt_4E(}BzHl&zsD5T(<Q2OqAo_uskyq?jF{tcr
zmr-R{%4Nj7k<o}bL{p{+lvHnVmShyACZ=TOrQc!!<*FiX1_p*Akn&s1#U(|zSV4j&
zkle>yoLW*O3Cc0-j&AXuey$<6xPtwiz2jZngB*P!d6}y?wFH#!@(W5pl0NYu1+F2t
zc!K@oor3%wU7Q_*A-o{h&|p_b7nh)0EJ>MpDMg?*95|T3`3Mx@d5O8H@$t9VLcmVE
z#S6)1@emi^Vg;8GMW7J6B>)dGm@HdLVrp)F-b#idP}KtoU=Ewy{FKt1RJ$U31_lOD
z$QR2oGBA8#W@Kc%&A@w`LEtt6_XB=~2A&&&VhwyB*%){QCa_HBn#47k=Q59M1LsFJ
z1_9yj(gvOnYz%_p(|ITH&PW60;}vPw_3SU|*<TiLXyCoUz<ZrR;v$2@46*ByS{Eg?
zR=8c)vA?Kee?agGgEJAbLKhi?COFODyCAH7g+b#X1M3A2r3ID?v@htopWwUT9)2M_
z>H=Hz6^58kY|M=AjGuT^8HGOhF*305bW~ktmV6*Ab6r^ZlCbg$vx~w;4ZaUR?HBQj
zEaF#KBtLPnvx<EXVvtb0F0Ot_T>XN+<3(|&3oIfx<diP3h+JWjzQH1Loki**i_}#X
NnGc!_EK=a`0{|=E^eO-V

literal 0
HcmV?d00001

diff --git a/extract.py b/extract.py
new file mode 100644
index 0000000..926a83b
--- /dev/null
+++ b/extract.py
@@ -0,0 +1,4 @@
+                    
+            # checks wheter the message comes from the server itself
+            if decoded_message.startswith(f"[{server_id}]"):
+                continue  # if...ignores it
\ No newline at end of file
diff --git a/form_ring.py b/form_ring.py
new file mode 100644
index 0000000..c89f340
--- /dev/null
+++ b/form_ring.py
@@ -0,0 +1,47 @@
+import socket
+import kserver
+
+my_list = kserver.server_uuids
+print(my_list)
+result = ", ".join([str(x) for x in my_list])  # Listen-Komprehension
+# Alternativ: result = ", ".join(map(str, my_list))
+print(result)  # Ausgabe: 1, 2, 3
+
+
+def form_ring(result):
+ #uuid, address = kserver.server_socket.recvfrom(4096)
+ #print("here uuid or what:", uuid, "and address:", address)
+ #message = uuid.decode()
+ #Convert a 32-bit packed IPv4 address to its standard dotted-quad string representation
+ #sorted()=returns a sorted list of the specified iterable object
+ sorted_binary_ring= sorted([socket.inet_aton(member) for member in result])
+ sorted_ip_ring= [socket.inet_ntoa(node) for node in sorted_binary_ring]
+ return sorted_ip_ring
+
+#dynamic!
+#1.broadcast server uuid everyone
+#listen to broadcast here and 
+#members = ['192.168.0.1', '130.234.204.2', '130.234.203.2', '130.234.204.1', '182.4.3.111'] 
+ring = form_ring(result)
+
+print(ring)
+
+#getting neighbour:
+def get_neighbour(ring, current_node_ip, direction='left'):
+ current_node_index = ring.index(current_node_ip) if current_node_ip in ring else -1
+ if current_node_index != -1:
+  if direction == 'left':
+   if current_node_index + 1 == len(ring):
+    return ring[0]
+   else:
+    return ring[current_node_index + 1]
+  else:
+   if current_node_index == 0:
+    return ring[len(ring) - 1]
+   else:
+    return ring[current_node_index- 1]
+ else:
+  return None
+
+neighbour = get_neighbour(ring, '130.234.203.2', 'left') 
+print(neighbour) 
\ No newline at end of file
diff --git a/kserver.py b/kserver.py
index b82846d..453d229 100644
--- a/kserver.py
+++ b/kserver.py
@@ -8,6 +8,9 @@ broadcast_port = 55555
 # create unique server-ID
 server_id = str(uuid.uuid4())
 
+# Set to store UUIDs of other servers
+server_uuids = set()
+
 # create server-socket for broadcast
 server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
@@ -30,9 +33,19 @@ def listen():
             message, client_address = server_socket.recvfrom(4096)
             decoded_message = message.decode()
 
-            # checks wheter the message comes from the server itself
-            if decoded_message.startswith(f"[{server_id}]"):
-                continue  # if...ignores it
+            # Extract UUID from the message
+            if decoded_message.startswith("[") and "]" in decoded_message:
+                sender_uuid = decoded_message.split("]")[0][1:]
+                
+                # Ignore messages from self
+                if sender_uuid == server_id:
+                    continue
+                
+                # Add the UUID to the set if it's not already known
+                if sender_uuid not in server_uuids:
+                    server_uuids.add(sender_uuid)
+                    print(f"Discovered new server UUID: {sender_uuid} and server set: {server_uuids}")
+                   # print(server_uuids)
             
             #checks if the message containts the string "entered"
             if decoded_message.__contains__("entered"):
@@ -60,3 +73,17 @@ if __name__ == "__main__":
     #print(listen_thread.is_alive())
     #listen()
 
+        # Example of broadcasting your UUID periodically (optional)
+    def periodic_broadcast():
+        import time
+        while True:
+            try:
+                broadcast("Server is running")
+                time.sleep(10)  # Broadcast every 5 seconds
+            except KeyboardInterrupt:
+                break
+
+    broadcast_thread = threading.Thread(target=periodic_broadcast)
+    broadcast_thread.daemon = True  # Stop when main thread stops
+    broadcast_thread.start()
+
diff --git a/sync.py b/sync.py
deleted file mode 100644
index c3b6d25..0000000
--- a/sync.py
+++ /dev/null
@@ -1,15 +0,0 @@
-import leaderServer
-
-
-def check_arrays(received_server_network, received_leader):
-
-    #aktuellen zustand des servers prüfen:
-    if received_server_network != leaderServer.server_network:
-        print("Unterschiede im Server-Netzwerk gefunden. Aktualisiere das Netzwerk...")
-        leaderServer.server_network = received_server_network  # Update das Netzwerk
-        print(f"new network: {received_server_network} or {leaderServer.server_network}")
-    
-    if received_leader != leaderServer.leader:
-        print("Unterschiede im Leader gefunden. Aktualisiere den Leader...")
-        leaderServer.leader = received_leader  # Update den Leader
-        print(f"new network: {received_leader} or {leaderServer.leader}")
\ No newline at end of file
-- 
GitLab