Compare commits

..

9 Commits

@ -2,7 +2,7 @@ import os
import json import json
if not os.path.exists('config.json'): if not os.path.exists('config.json'):
db = {"our_port": 0000, "ports": [], "domain": "http://0.0.0.0:8000"} db = {"os": None,"our_port": 0000, "ports": [], "domain": "http://0.0.0.0:8000"}
js = json.dumps(db, indent=2) js = json.dumps(db, indent=2)
with open("config.json", "w") as outfile: with open("config.json", "w") as outfile:
outfile.write(js) outfile.write(js)

@ -1,15 +1,23 @@
from re import compile, sub from re import compile, sub
domains = ['jet', 'mirror', 'org', 'info', 'news', 'me']
def domain_ok(domain): def domain_ok(domain):
domains = ["jet", "jw", "404", "dash", "awesome", "mirror"] global domains
if domain.count('.') == 1:
if domain.count(".") == 1: if domain.split('.')[1] in domains:
if domain.split(".")[1] in domains:
# ../some => some # ../some => some
# Защита от проверки папок выше, чем нужно и др. # Защита от проверки папок выше, чем нужно и др.
regex = compile('[^a-z.-]') regex = compile('[^a-z0-9.-]')
c_domain = regex.sub('', domain) c_domain = regex.sub('', domain)
if domain == c_domain: if domain == c_domain:
return domain return domain
return False return False
def domain_list():
global domains
out = ''
for i in domains:
out += f'{i}, '
out = out[:-2]
return out

@ -76,6 +76,11 @@ def update_sites(n, s_val):
res = [] res = []
for i in next(walk('cached/'), (None, None, []))[1]: for i in next(walk('cached/'), (None, None, []))[1]:
conf = read(f'cached/{i}/config.json')
if conf['type'] == 'dynamic':
res.append(html.Div([ dcc.Link(children=i, href=f'http://bore.pub:{conf["port"]}',
target='_blank') ], className='sites_elem'))
else:
res.append(html.Div([ dcc.Link(children=i, href=f'{domain}/{i}', res.append(html.Div([ dcc.Link(children=i, href=f'{domain}/{i}',
target='_blank') ], className='sites_elem')) target='_blank') ], className='sites_elem'))
return res return res

@ -82,11 +82,10 @@ def server(http_port):
conn.send("not_exist".encode()) conn.send("not_exist".encode())
elif op[:8] == "publish_": elif op[:8] == "publish_":
data = op[8:] data = op[8:]
site, port = data.split("<>") site, u_port = data.split("<>")
site = domain_ok(site) if domain_ok(site):
if site:
conn.send("accepted".encode()) conn.send("accepted".encode())
client(port, f"get_{site}") client(u_port, f"get_{site}")
elif op == "check_all": elif op == "check_all":
try: try:
sites = next(os.walk('cached/'), (None, None, []))[1] sites = next(os.walk('cached/'), (None, None, []))[1]

@ -1,24 +1,27 @@
from os import system, name from os import system
from threading import Thread from threading import Thread
from time import sleep from time import sleep
from status import * from status import *
from db import read
global http_out ; http_out = None global http_out ; http_out = None
def proxy_http(port): def proxy_http(port):
global http_out global http_out
if name == "posix": os = read()['os']
http_out = system(f"./bore local 8000 --to bore.pub --port {port}") if os == 'Linux':
elif name == "nt": http_out = system(f'./bore local 8000 --to bore.pub --port {port}')
http_out = system(f"bore local 8000 --to bore.pub --port {port}") elif os == 'Windows' or os == 'Android':
http_out = system(f'bore local 8000 --to bore.pub --port {port}')
global serv_out ; serv_out = None global serv_out ; serv_out = None
def proxy_serv(port): def proxy_serv(port):
global serv_out global serv_out
if name == "posix": os = read()['os']
http_out = system(f"./bore local 8001 --to bore.pub --port {port}") if os == 'Linux':
elif name == "nt": http_out = system(f'./bore local 8001 --to bore.pub --port {port}')
http_out = system(f"bore local 8001 --to bore.pub --port {port}") elif os == 'Windows' or os == 'Android':
http_out = system(f'bore local 8001 --to bore.pub --port {port}')
def watch_http(port): def watch_http(port):

@ -1,51 +1,62 @@
from os import system, name from os import system
from urllib.request import urlretrieve as download from urllib.request import urlretrieve as download
from db import * from db import *
config = {}
# Устанавливаем зависимости print('''1. Linux
system("pip install -r requirements.txt") 2. Windows
3. Android (Termux)''')
# Скачиваем bore (для проброса портов) raw_os = input('ОС установки >> ')
if name == "posix": oses = {'1': 'Linux', '2': 'Windows', '3': 'Android'}
download("https://github.com/ekzhang/bore/releases/download/v0.5.0/bore-v0.5.0-x86_64-unknown-linux-musl.tar.gz", "bore.tar.gz") os = oses[raw_os]
system("tar -zxvf bore.tar.gz")
system("rm -rf bore.tar.gz") # Записываем ОС в конфиг
conf = read()
import getpass conf['os'] = os
user = getpass.getuser() write(conf)
#system("mkdir ~/.streamlit") print('''---
#with open(f"/home/{user}/.streamlit/credentials.toml", "w") as f: [1/3] Устанавливаем зависимости python...
# f.write('[general]\nemail = "a@a.a"') ---''')
#f.close() system('pip install -r requirements.txt')
elif name == "nt":
print('''---
[2/3] Скачиваем обратный прокси...
---''')
if os == 'Linux':
download('https://github.com/ekzhang/bore/releases/download/v0.5.0/bore-v0.5.0-x86_64-unknown-linux-musl.tar.gz', 'bore.tar.gz')
system('tar -zxvf bore.tar.gz')
system('rm -rf bore.tar.gz')
elif os == 'Windows':
from shutil import unpack_archive as unpack from shutil import unpack_archive as unpack
download("https://github.com/ekzhang/bore/releases/download/v0.5.0/bore-v0.5.0-x86_64-pc-windows-msvc.zip", "bore.zip") download('https://github.com/ekzhang/bore/releases/download/v0.5.0/bore-v0.5.0-x86_64-pc-windows-msvc.zip', 'bore.zip')
unpack("bore.zip") unpack('bore.zip')
system("del bore.zip") system('del bore.zip')
elif os == 'Android':
#system("mkdir C:\\Users\\windows\\.streamlit") system('pkg install bore-cli')
#with open("C:\\Users\\windows\\.streamlit\\credentials.toml", "w") as f:
# f.write('[general]\nemail = "a@a.a"')
#f.close()
else: else:
print("Увы, вероятно Ваша ОС не поддерживается.") print('Увы, вероятно Ваша ОС не поддерживается.')
print("Завершение работы...") print('Завершение работы...')
exit() exit()
# Создаём папку для кэшированных сайтов print('''---
system("mkdir cached") [3/3] Создаём папки для работы...
system("mkdir verify") ---''')
system("mkdir mysites") system('mkdir cached')
system('mkdir verify')
system('mkdir mysites')
# TODO # TODO
#print("Максимальный размер для кэшированных файлов. (в гигабайтах)") #print('Максимальный размер для кэшированных файлов. (в гигабайтах)')
#print("Укажите 0 для отключения ограничения.") #print('Укажите 0 для отключения ограничения.')
#max = input(">> ") #max = input('>> ')
# Записываем в конфиг # Записываем в конфиг
#config["max"] = max #config['max'] = max
#write(config) #write(config)
print("\nЧтобы подключится к jetwork выполните: python main.py") print('''
---
Установка завершена!
Чтобы подключится к jetwork выполните: python main.py
---''')

@ -1,4 +1,4 @@
from os import system, mkdir from os import system, mkdir, walk
from db import * from db import *
from shutil import copyfile, make_archive, rmtree, copytree from shutil import copyfile, make_archive, rmtree, copytree
from tqdm import tqdm from tqdm import tqdm
@ -6,176 +6,172 @@ from time import sleep
from verify import * from verify import *
from network import * from network import *
from domain_check import domain_list
print("(1) Создать сайт") def your_sites():
print("(2) Обновить сайт") sites = {}; num = 1
print("(3) Сменить тип") for i in next(walk('cached/'), (None, None, []))[1]:
print("(4) Авто-раздача сайта") sites[str(num)] = i
print("Enter для просто публикации.") print(f'{str(num)}. {i}')
num += 1
return sites
op = input(">> ") print('(1) Создать сайт')
print('(2) Обновить сайт')
print('(3) Сменить тип')
print('(4) Авто-раздача сайта')
print('Enter для просто публикации.')
if op == "1": op = input('>> ')
if op == '1':
from domain_check import * from domain_check import *
print("\nДомены: .jet, .jw, .404, .dash, .awesome, .mirror") print(f'\nДоступные 1 lvl домены: {domain_list()}')
domain = input("Домен сайта: ") domain = input('Домен сайта: ')
if not domain_ok(domain): if not domain_ok(domain):
print("Неправильный формат или домен.") print('Неправильный формат или домен.')
exit() exit()
print("\n(1) Статичный / (2) Динамический") print('\n(1) Статичный / (2) Динамический')
type = input("Тип: ") type = input('Тип: ')
# Создаём папку и ключи для подписи # Создаём папку и ключи для подписи
mkdir(f"mysites/{domain}") mkdir(f'mysites/{domain}')
key_gen(f"mysites/{domain}") key_gen(f'mysites/{domain}')
if type == "1": if type == '1':
conf = {"type": "static", "ver": 1} conf = {'type': 'static', 'ver': 1}
print("ПРИМЕЧАНИЕ: index.html обязателен.") print('\nПРИМЕЧАНИЕ: index.html обязателен.')
elif type == "2":
port = input("Порт сервера: ")
conf = {"type": "dynamic", "ver": 1, "port": int(port)}
write(conf, f"mysites/{domain}/config.json")
if type == "1":
# Создаём index.html для загрузки сайта # Создаём index.html для загрузки сайта
with open(f"mysites/{domain}/index.html", "w") as f: with open(f'mysites/{domain}/index.html', 'w') as f:
f.write("<h1> Hello jetwork! </h1>") f.write('<h1> Hello jetwork! </h1>')
f.close() f.close()
elif type == '2':
port = input('Порт сервера: ')
conf = {'type': 'dynamic', 'ver': 1, 'port': int(port)}
write(conf, f'mysites/{domain}/config.json')
# Архивируем и создаём сигнатуру для подтверждения неизменности архива # Архивируем и создаём сигнатуру для подтверждения неизменности архива
make_archive(f"mysites/{domain}", "zip", f"mysites/{domain}") make_archive(f'mysites/{domain}', 'zip', f'mysites/{domain}')
sign(f"mysites/{domain}.zip", f"mysites/{domain}.key", f"mysites/{domain}") sign(f'mysites/{domain}.zip', f'mysites/{domain}.key', f'mysites/{domain}')
elif op == "2": elif op == '2':
domain = input("\nДомен сайта: ") print()
if not os.path.exists(f"mysites/{domain}"): sites = your_sites()
print("Не существует такого сайта.")
exit() domain = sites[input('Домен сайта: ')]
conf = read(f"mysites/{domain}/config.json") conf = read(f'mysites/{domain}/config.json')
type = conf["type"] type = conf['type']
if type == "dynamic": if type == 'dynamic':
port = input("Порт сервера: ") port = input('Порт сервера: ')
conf["port"] = port conf['port'] = port
write(conf, f"mysites/{domain}/config.json") write(conf, f'mysites/{domain}/config.json')
# Обновляем версию # Обновляем версию
conf = read(f"mysites/{domain}/config.json") conf = read(f'mysites/{domain}/config.json')
conf["ver"] = conf["ver"] + 1 conf['ver'] = conf['ver'] + 1
write(conf, f"mysites/{domain}/config.json") write(conf, f'mysites/{domain}/config.json')
# Архивируем и создаём сигнатуру для подтверждения неизменности архива # Архивируем и создаём сигнатуру для подтверждения неизменности архива
make_archive(f"mysites/{domain}", "zip", f"mysites/{domain}") make_archive(f'mysites/{domain}', 'zip', f'mysites/{domain}')
sign(f"mysites/{domain}.zip", f"mysites/{domain}.key", f"mysites/{domain}") sign(f'mysites/{domain}.zip', f'mysites/{domain}.key', f'mysites/{domain}')
elif op == "3": elif op == '3':
from os import rmdir from os import rmdir
domain = input("\nДомен сайта: ") print()
if not os.path.exists(f"mysites/{domain}"): sites = your_sites()
print("Не существует такого сайта.") domain = sites[input('Домен сайта: ')]
exit()
print("\n(1) Статичный / (2) Динамический") print('\n(1) Статичный / (2) Динамический')
type = input("Тип: ") type = input('Тип: ')
if type == "1": if type == '1':
conf = read(f"mysites/{domain}/config.json") conf = read(f'mysites/{domain}/config.json')
conf["type"] = "static" conf['type'] = 'static'
conf.pop("port") conf.pop('port')
with open(f"mysites/{domain}/index.html", "w") as f: with open(f'mysites/{domain}/index.html', 'w') as f:
f.write("<h1> Hello jetwork! </h1>") f.write('<h1> Hello jetwork! </h1>')
f.close() f.close()
elif type == "2": elif type == '2':
conf = read(f"mysites/{domain}/config.json") conf = read(f'mysites/{domain}/config.json')
port = input("Порт сервера: ") port = input('Порт сервера: ')
clean = input("Удалить все лишние файлы сайта (y/n): ") clean = input('Удалить все лишние файлы сайта (y/n): ')
if clean == "y": if clean == 'y':
# Удаляем папку, сохраняем конфиг и копируем публичный ключ # Удаляем папку, сохраняем конфиг и копируем публичный ключ
rmtree(f"mysites/{domain}") rmtree(f'mysites/{domain}')
sleep(0.1) sleep(0.1)
system(f"mkdir mysites/{domain}") system(f'mkdir mysites/{domain}')
conf["type"] = "dynamic" conf['type'] = 'dynamic'
conf["port"] = int(port) conf['port'] = int(port)
write(conf, f"mysites/{domain}/config.json") write(conf, f'mysites/{domain}/config.json')
# Обновляем версию # Обновляем версию
conf = read(f"mysites/{domain}/config.json") conf = read(f'mysites/{domain}/config.json')
conf["ver"] = conf["ver"] + 1 conf['ver'] = conf['ver'] + 1
write(conf, f"mysites/{domain}/config.json") write(conf, f'mysites/{domain}/config.json')
# Архивируем и создаём сигнатуру для подтверждения неизменности архива # Архивируем и создаём сигнатуру для подтверждения неизменности архива
make_archive(f"mysites/{domain}", "zip", f"mysites/{domain}") make_archive(f'mysites/{domain}', 'zip', f'mysites/{domain}')
sign(f"mysites/{domain}.zip", f"mysites/{domain}.key", f"mysites/{domain}") sign(f'mysites/{domain}.zip', f'mysites/{domain}.key', f'mysites/{domain}')
elif op == "4": elif op == '4':
domain = input("\nДомен сайта: ") print()
if not os.path.exists(f"mysites/{domain}"): sites = your_sites()
print("Не существует такого сайта.") domain = sites[input('Домен сайта: ')]
exit()
print("\nВведите ваш порт сервера (при запуске main.py)") serv_port = int( read()['our_port'] )
serv_port = int(input(">> ")) http_port = client(serv_port, f'is_{domain}')
http_port = client(serv_port, f"is_{domain}")
print("\nСтарт вечной раздачи...") print('\nСтарт вечной раздачи...')
while True: while True:
ports = port_check(serv_port) ports = port_check(serv_port)
sleep(1) sleep(1)
for port in tqdm(ports): for port in tqdm(ports):
client(port, f"publish_{domain}<>{http_port}") client(port, f'publish_{domain}<>{http_port}')
sleep(5) sleep(5)
elif op == "": host = 'bore.pub'
domain = input("\nДомен сайта: ") # Проверяем тип сайта
if not os.path.exists(f"mysites/{domain}"): type = read(f'mysites//{domain}/config.json')['type']
print("Не существует такого сайта.") # Если динамический - вставляем спец страницу
exit() if type == 'dynamic':
pub = "y" port = read(f'mysites//{domain}/config.json')['port']
with open(f'mysites//{domain}/index.html', 'w') as f:
f.write(f"<iframe src='http://{host}:{port}' style='position:fixed; top:0; left:0; bottom:0; right:0; width:100%; height:100%; border:none; margin:0; padding:0; overflow:hidden; z-index:999999;'></iframe>")
f.close()
# Копируем файлы из mysites в cached # Копируем файлы из mysites в cached
try: try:
rmtree(f"cached/{domain}") rmtree(f'cached/{domain}')
except: except:
pass pass
copytree(f"mysites/{domain}", f"cached/{domain}") copytree(f'mysites/{domain}', f'cached/{domain}')
copyfile(f"mysites/{domain}.pem", f"cached/{domain}.pem") copyfile(f'mysites/{domain}.pem', f'cached/{domain}.pem')
copyfile(f"mysites/{domain}.sig", f"cached/{domain}.sig") copyfile(f'mysites/{domain}.sig', f'cached/{domain}.sig')
copyfile(f"mysites/{domain}.zip", f"cached/{domain}.zip") copyfile(f'mysites/{domain}.zip', f'cached/{domain}.zip')
host = "jetwork.404.mn"
# Проверяем тип сайта
type = read(f"cached/{domain}/config.json")["type"]
# Если динамический
if type == "dynamic":
port = read(f"cached/{domain}/config.json")["port"]
with open(f"cached/{domain}/index.html", "w") as f:
f.write(f'<iframe src="http://{host}:{port}" style="position:fixed; top:0; left:0; bottom:0; right:0; width:100%; height:100%; border:none; margin:0; padding:0; overflow:hidden; z-index:999999;"></iframe>')
f.close()
if op != "": if op != '':
print("Опубликовать сайт?") print('\nОпубликовать сайт?')
pub = input("y/n >> ") pub = input('y/n >> ')
if pub == "n": if pub == 'n':
exit() exit()
print("Введите ваш порт сервера (при запуске main.py)") print('Введите ваш порт сервера (при запуске main.py)')
serv_port = int(input(">> ")) serv_port = int(input('>> '))
http_port = client(serv_port, f"is_{domain}") http_port = client(serv_port, f'is_{domain}')
print("Получаем все порты...") print('Получаем все порты...')
ports = port_check(serv_port) ports = port_check(serv_port)
print(ports) print(ports)
print("Публикуем сайт...") print('Публикуем сайт...')
for port in tqdm(ports): for port in tqdm(ports):
client(port, f"publish_{domain}<>{http_port}") client(port, f'publish_{domain}<>{http_port}')

@ -0,0 +1,83 @@
from dash import Dash, dcc, html, Input, Output, callback
app = Dash(__name__, title='Jetwork', update_title=None)
from db import *
from status import *
from os import walk
from os import system as sys
from platform import system
from threading import Thread
app.layout = html.Div([ html.Div([
dcc.ConfirmDialog(id='shut_mess', message='Ты совсем гений?'),
html.Button("Выключить клиент", className='off_btn', n_clicks=0, id='off_btn'),
html.Div([], id='our_port', className='our_port'),
html.Div([], id='servers', className='servers'),
html.Div([], id='sites', className='sites'),
dcc.Dropdown(options=[], id='search', placeholder='Поиск...'),
dcc.Interval(id='interval-component', interval=1*1000, n_intervals=0)
], className='main')], className='content')
# Кнопка выключения
@callback(
Output('shut_mess', 'displayed'),
Input('off_btn', 'n_clicks'),
prevent_initial_call=True
)
def shut_btn(n_clicks):
return True
# Обновление нашего порта (зачем?)
@callback(Output('our_port', 'children'),
Input('interval-component', 'n_intervals'))
def update_our_port(n):
return f"Ваш порт: {read()['our_port']}"
# Обновление доступных узлов
@callback(Output('servers', 'children'),
Input('interval-component', 'n_intervals'))
def update_servers(n):
res = []
for i in read()['ports']:
res.append(html.Div([i], className='serv_elem'))
return res
# Обновление доступных сайтов
@callback(Output('sites', 'children'),
Input('interval-component', 'n_intervals'),
Input('search', 'value'))
def update_sites(n, s_val):
# Домен по умолчанию
domain = read()['domain']
# Если есть элемент в поиске
if s_val:
return html.Div([ dcc.Link(children=i, href=f'{domain}/{s_val}',
target='_blank') ], className='sites_elem')
res = []
for i in next(walk('cached/'), (None, None, []))[1]:
conf = read(f'cached/{i}/config.json')
if conf['type'] == 'dynamic':
res.append(html.Div([ dcc.Link(children=i, href=f'http://bore.pub:{conf["port"]}',
target='_blank') ], className='sites_elem'))
else:
res.append(html.Div([ dcc.Link(children=i, href=f'{domain}/{i}',
target='_blank') ], className='sites_elem'))
return res
# Обновление доступных сайтов в поиске
@callback(Output('search', 'options'),
Input('interval-component', 'n_intervals'))
def update_search(n):
res = []
for i in next(walk('cached/'), (None, None, []))[1]:
res.append(i)
return res
#app.run(debug=True, port = 5555)
app.run(debug=False, port = 5555)

@ -21,7 +21,7 @@ def main():
print('Проверка обновлений...') print('Проверка обновлений...')
system('git pull') system('git pull')
print('Перезагрузка скрипта...') print('Перезагрузка скрипта...')
system('python main.py updated') system('python srv_main.py updated')
exit() exit()
print('\nУспешно перезагружено!') print('\nУспешно перезагружено!')
@ -56,14 +56,14 @@ def main():
#updater.start() #updater.start()
# Стартуем интерфейс # Стартуем интерфейс
system('python interface.py') system('python srv_interface.py')
if __name__ == '__main__': if __name__ == '__main__':
# Запускаем главный процесс, чтобы потом легко убить его # Запускаем главный процесс, чтобы потом легко убить его
p = Process(target=main) p = Process(target=main)
p.start() p.start()
status_set(True) # Устанавливаем статус, что программа работает status_set('work') # Устанавливаем статус, что программа работает
st = status_check() st = status_check()
while st: while st:

Loading…
Cancel
Save