-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInfinity.WebOS.py
More file actions
199 lines (181 loc) · 7.51 KB
/
Infinity.WebOS.py
File metadata and controls
199 lines (181 loc) · 7.51 KB
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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
from threading import Lock
from flask import Flask, render_template, session, request, \
copy_current_request_context, send_from_directory
from flask_socketio import SocketIO, emit, join_room, leave_room, \
close_room, rooms, disconnect
import random
import string
import os
import json
from datetime import datetime
# Set this variable to "threading", "eventlet" or "gevent" to test the
# different async modes, or leave it set to None for the application to choose
# the best option based on installed packages.
async_mode = None
Nodes={}
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app, async_mode=async_mode)
thread = None
thread_lock = Lock()
NodeMap={'Clients':{}}
# Get list of Nodes available.
def probeNodes():
for f in [f.name for f in os.scandir('./Nodes') if os.path.isfile(f)]:
file=open('./Nodes/'+f)
data=file.read()
data=json.loads(data)
file.close()
if data['Magic'] is None or data['Build'] is None:
if data['Magic'] is None:
data['Magic']=''.join(random.choices(string.ascii_letters + string.digits, k=32))
if data['Build'] is None:
data['Build']=datetime.now().strftime("%Y%m%d%H%M%S")
file=open('./Nodes/'+f,'w+')
file.write(json.dumps(data,indent=4))
file.close()
if not data['Magic'] in Nodes:
Nodes[data['Magic']]={
"File": f,
"Alias": None,
"Build": None,
"Description": None,
"Depends": None,
"Assets": []
}
if data['Alias']:
Nodes[data['Magic']]['Alias']=data['Alias']
if data['Build']:
Nodes[data['Magic']]['Build']=data['Build']
if data['Description']:
Nodes[data['Magic']]['Description']=data['Description']
if data['Depends']:
Nodes[data['Magic']]['Depends']=data['Depends']
if data['Assets']:
for o in data['Assets']:
if not o['Path'] in Nodes[data['Magic']]['Assets']:
Nodes[data['Magic']]['Assets']=o['Path']
Nodes[data['Magic']]['Assets'][o['Path']]={'File':o['File'],'Size':o['Size'],'Hash':o['Hash']}
def background_thread():
"""Example of how to send server generated events to clients."""
# count = 0
while True:
socketio.sleep(60)
probeNodes()
@app.route('/')
def index():
return render_template('index.html', async_mode=socketio.async_mode)
@app.route('/Assets/<path:path>')
def send_asset(path):
return send_from_directory('Assets', path)
@socketio.on('getNodes', namespace='/basic')
def getNodes():
# probeNodes()
emit('msgRecv',{'Result': "Success", 'data': Nodes})
@socketio.on('msgSend', namespace='/basic')
def test_message(message):
session['receive_count'] = session.get('receive_count', 0) + 1
emit('msgRecv',
{'data': message['data'], 'count': session['receive_count']})
@socketio.on('msgSendAll', namespace='/basic')
def test_broadcast_message(message):
session['receive_count'] = session.get('receive_count', 0) + 1
emit('msgRecv',
{'data': message['data'], 'count': session['receive_count']},
broadcast=True)
@socketio.on('bootstrap', namespace='/basic')
def bootstrap(message):
type=message['Type']
if type=="Client":
if 'Magic' not in message:
emit('msgRecv',{'Result': 'Fail','Reason':'Magic not specified'})
elif 'Build' not in message:
emit('msgRecv',{'Result': 'Fail','Reason':'Build not specified'})
else:
if message['Magic'] not in NodeMap['Clients']:
NodeMap['Clients'][message['Magic']]={
'Magic':message['Magic'],
'Build':message['Build'],
'Times':{
'Connected':datetime.now().strftime("%Y%m%d%H%M%S"),
'LastActive':datetime.now().strftime("%Y%m%d%H%M%S")
},
'Apps':{},
'TaskQueue':{},
'Events':{}
}
join_room(message['Magic'])
emit('msgRecv',{'Result': 'Success','Magic': message['Magic']})
else:
emit('msgRecv',{'Result': 'Fail','Reason':'Client already Initialized.'})
elif type=="App":
if 'Magic' not in message:
emit('msgRecv',{'Result': 'Fail','Reason':'Magic not specified'})
elif 'AppMagic' not in message:
emit('msgRecv',{'Result': 'Fail','Reason':'AppMagic not specified'})
elif 'Alias' not in message:
emit('msgRecv',{'Result': 'Fail','Reason':'Alias not specified'})
elif 'Build' not in message:
emit('msgRecv',{'Result': 'Fail','Reason':'Build not specified'})
else:
if message['AppMagic'] not in NodeMap['Clients'][message['Magic']]['Apps']:
NodeMap['Clients'][message['Magic']]['Apps'][message['AppMagic']]={
'Magic':message['AppMagic'],
'Alias':message['Alias'],
'Build':message['Build'],
'TaskQueue':{},
'Events':{}
}
emit('msgRecv',{'Result': 'Success','Magic': message['AppMagic']})
else:
emit('msgRecv',{'Result': 'Fail','Reason':'App already Initialized.'})
session['receive_count'] = session.get('receive_count', 0) + 1
@socketio.on('leave', namespace='/basic')
def leave(message):
leave_room(message['room'])
session['receive_count'] = session.get('receive_count', 0) + 1
emit('msgRecv',
{'data': 'In rooms: ' + ', '.join(rooms()),
'count': session['receive_count']})
@socketio.on('unregisterClient', namespace='/basic')
def close(message):
session['receive_count'] = session.get('receive_count', 0) + 1
emit('msgRecv', {'data': 'Room ' + message['room'] + ' is closing.',
'count': session['receive_count']},
room=message['room'])
close_room(message['room'])
@socketio.on('my_room_event', namespace='/basic')
def send_room_message(message):
session['receive_count'] = session.get('receive_count', 0) + 1
emit('msgRecv',
{'data': message['data'], 'count': session['receive_count']},
room=message['room'])
@socketio.on('disconnect_request', namespace='/basic')
def disconnect_request():
@copy_current_request_context
def can_disconnect():
disconnect()
session['receive_count'] = session.get('receive_count', 0) + 1
# for this emit we use a callback function
# when the callback function is invoked we know that the message has been
# received and it is safe to disconnect
emit('msgRecv',
{'data': 'Disconnected!', 'count': session['receive_count']},
callback=can_disconnect)
@socketio.on('ping_send', namespace='/basic')
def ping_pong():
emit('ping_reply')
@socketio.on('connect', namespace='/basic')
def test_connect():
global thread
with thread_lock:
if thread is None:
thread = socketio.start_background_task(background_thread) # Here we start our event listener
print('Client Connected', request.sid)
emit('msgRecv', {'data': 'Connected', 'count': 0})
@socketio.on('disconnect', namespace='/basic')
def test_disconnect():
print('Client disconnected', request.sid)
if __name__ == '__main__':
probeNodes()
socketio.run(app, debug=True)