Compare commits

..

53 Commits

Author SHA1 Message Date
justuser 9ff83b0c0a up 2024-08-20 16:52:41 +03:00
justuser 59aeeaac33 Исправление бага 2024-08-20 16:50:08 +03:00
justuser 6e96b0dfb3 Добавление готовых конфигов для http прокси 2024-08-19 16:14:25 +03:00
justuser f06c6f963c Запрет использование прокси как прокси для обычного интернета 2024-08-19 15:53:05 +03:00
justuser 1c4a7bb11a up 2024-08-19 15:18:45 +03:00
justuser dfd5d61db7 Отключение логирования (чтобы не забивать вывод) 2024-08-19 15:07:06 +03:00
justuser d3a25ee190 Отключение логирования 2024-08-19 14:54:17 +03:00
justuser c5a0111fab up 2024-08-19 14:50:40 +03:00
justuser dfc37d6ea7 Улучшение прокси 2024-08-19 14:49:25 +03:00
justuser e83bee6b08 Более корректное название для переменной перед запросом адреса - base_url 2024-08-19 14:17:58 +03:00
justuser ca1e5422a2 +Домены и исправления установщика 2024-08-19 14:08:23 +03:00
justuser 54a4692cac Скрипт-fastfix для сервера (при долгой работе может быть утечка памяти) 2024-08-16 22:49:05 +03:00
justuser a44099a9e0 Fix crash 2024-08-16 22:47:04 +03:00
justuser b9aaef110f up 2024-08-16 19:38:57 +03:00
justuser 311cde3b15 up 2024-08-16 19:32:26 +03:00
justuser b6652cf5d6 up 2024-08-16 19:13:49 +03:00
justuser 2abe6dfb87 up 2024-08-16 19:12:55 +03:00
justuser 5cec15dbd5 up 2024-08-16 19:11:50 +03:00
justuser 6ce7dbc771 up 2024-08-16 19:06:04 +03:00
justuser 89e34cd473 Fix 2024-08-16 19:02:11 +03:00
justuser 27eba1fbf4 Исправление хоста обратного прокси 2024-08-16 18:55:41 +03:00
justuser f89269a1f6 Fix 2024-08-16 18:45:26 +03:00
justuser ce628c40d6 Добавление красивых логов 2024-08-16 18:18:25 +03:00
justuser f09daea63e Переход на вид site.jet вместо 127.0.0.1:8000//site.jet 2024-08-16 18:17:03 +03:00
Justuser 9d2645d7ca Update README.md 2024-07-03 06:50:28 +00:00
Justuser 81f2b20866 Delete bore 2024-06-25 08:59:33 +00:00
justuser 393e02477e Бета-вариант динамичных сайтов 2024-06-21 20:46:46 +03:00
justuser 19349a0946 Бета-вариант динамичных сайтов 2024-06-21 20:44:58 +03:00
justuser ffcf047286 fix 2024-06-21 20:13:33 +03:00
justuser ec0523d52c Переработка создателей сайтов и переосмысление доменов 2024-06-21 19:56:55 +03:00
justuser e72996af3c fix 2024-06-21 17:05:59 +03:00
justuser 78202f027e fix 2024-06-21 16:55:33 +03:00
justuser 91678cdf48 Fix 2024-06-21 16:53:32 +03:00
justuser 07954059e2 Исправление багов 2024-06-21 16:44:39 +03:00
justuser 4eb0143970 Улучшение установщика, добавление Termux 2024-06-21 16:40:31 +03:00
Justuser c6a9b37325 Update README.md 2024-06-21 07:38:13 +00:00
Justuser a73a370f0a Update README.md 2024-06-21 07:37:38 +00:00
Justuser fecbc8787a Delete port_open.py 2024-06-21 07:33:56 +00:00
Justuser d78533c72b Delete stop.py.save 2024-06-21 07:33:50 +00:00
justuser fa68dda1cf Merge branch 'main' of github.com:Justuser3310/jetwork 2024-06-20 21:02:07 +03:00
justuser 04b1b3651e Замена 127.0.0.1 на 0.0.0.0, удобнее блокировать скрипты 2024-06-20 21:01:46 +03:00
Justuser 1e1b6214f4 Delete .readthedocs.yaml 2024-06-20 08:45:21 +00:00
Justuser 4f670ea398 Create .readthedocs.yaml 2024-06-20 08:40:14 +00:00
Justuser ad16a45cfb Update README.md 2024-06-20 08:01:39 +00:00
justuser e754739219 Добавление кнопки выключения (она работает) 2024-06-19 23:28:34 +03:00
justuser a52fb2679a Добавление кнопки выключения (она работает) 2024-06-19 23:18:13 +03:00
Justuser e693d8450e Delete status 2024-06-19 18:51:02 +00:00
Justuser 3a376e0582 Delete config.json 2024-06-19 18:50:50 +00:00
Justuser 96600c0787 Delete __pycache__ directory 2024-06-19 18:50:29 +00:00
Justuser cc65833cfe Update js.md 2024-06-19 14:00:56 +00:00
Justuser 4c639f2bd0 Update js.md 2024-06-19 13:57:27 +00:00
justuser f2e903621e up 2024-06-19 16:27:21 +03:00
justuser 24737ed93e Ужесточение правил, чтобы мимикрирований не было 2024-06-19 15:56:05 +03:00
33 changed files with 547 additions and 340 deletions
+12 -103
View File
@@ -6,111 +6,20 @@ https://t.me/justuser31_chat
<br>
<br>
# 📃 Документация
Читайте "начало работы", если хотите, чтобы последующие действия работали.
<br>
## 📋 Содержание
- ▶️ Начало работы
- 🌐 Установка на сервер
- 🔓 Открытие любых портов
- 📎 Публикация статичного сайта
- 📎 Публикация динамичного сайта
- 🪄 Как это работает
# 📃 Документация (ТУТ ВСЁ)
[**>>> ДОКУМЕНТАЦИЯ <<<**](https://docs.del.pw/books/jetwork) <br>
(Там всё есть!!!)
<br>
<br>
### ▶️ Начало работы
<br>
#### 🐧 Linux
1. Установить python: `sudo apt install python3`
2. Установить git: `sudo apt install git`
3. Установить tar: `sudo apt install tar`
4. Клонировать репозиторий: `git clone https://github.com/Justuser3310/jetwork.git`
5. Запустить setup.py: `cd jetwork && python setup.py`
6. Запустить клиент: `python main.py`
7. Зайти на `http://127.0.0.1:5555`
<br>
<br>
#### 🪟 Windows
1. Установить python: https://www.python.org/downloads/release/python-3122/ (Windows installer)
2. Установить git: https://git-scm.com/download/win (Windows setup)
3. Клонировать репозиторий: `git clone https://github.com/Justuser3310/jetwork.git`
4. Запустить setup.py: `cd jetwork && python setup.py`
5. Запустить клиент: `python main.py`
6. Зайти на `http://127.0.0.1:5555`
<br>
<br>
#### 📱 Termux
Следовать инструкции для Linux.
Только заменить `sudo apt` на `pkg` в 1-3 шагах.
<br>
<br>
### 🌐 Начало работы
1. Выполнить шаги в начале работы до 5 включительно (Linux) или 4 (Windows)
2. Запустить серверный клиент: `python srv_main.py`
( Отключён скан портов, чтобы снизить нагрузку и избежать утечки памяти )
3. Зайти на `http://127.0.0.1:5555`
<br>
<br>
### 🔓 Открытие любых портов
Открыть порт 25565: \
`python port_open.py` \
Далее вводим `25565`
<br>
<br>
### 📎 Публикация статичного сайта
`python site_creator.py`
Далее следовать подсказкам.
Существование index.html ОБЯЗАТЕЛЬНО.
<br>
<br>
### 📎 Публикация динамичного сайта
Скоро...
<br>
<br>
### 🪄 Как это работает
<br>
***
#### Клиент
![](https://github.com/Justuser3310/jetwork/blob/main/images/jetwork_client.png)
<br>
***
#### Статичный сайт
![](https://github.com/Justuser3310/jetwork/blob/main/images/jetwork_static.png)
<br>
***
#### Динамичный сайт
![](https://github.com/Justuser3310/jetwork/blob/main/images/jetwork_dynamic.png)
## 🔼 План развития
* Обновление диаграм
* Обновление документации
* Подтверждение при переходе по ссылке
* Встроенные ссылки в jetwork
* Проверка на JS
* Блокировка сайтов/их владельцев (слишком вредных)
* Реализация динамических сайтов
* Устранение утечки памяти при поиске портов
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+24 -2
View File
@@ -7,13 +7,34 @@
.main {
display: grid;
grid-template-areas:
"our_port search"
"servers sites"
"off_btn search"
"our_port sites"
"servers sites";
grid-template-columns: 1fr 2fr;
grid-template-rows: auto auto;
}
.off_btn {
grid-area: off_btn;
background: #ff5a5a;
align-content: center;
border-radius: 0.4rem;
padding-left: 1rem;
padding-right: 1rem;
border-style: hidden;
font-size: 1rem;
width: calc(100% - 0.5rem);
height: 100%;
}
.off_btn:active {
background-color: #c85000;
box-shadow: rgba(0, 0, 0, .06) 0 2px 4px;
transform: scale(.96);
}
.our_port {
grid-area: our_port;
background: #53f453;
@@ -22,6 +43,7 @@
padding-left: 1rem;
padding-right: 1rem;
margin-right: 0.5rem;
margin-top: 0.4rem;
}
.servers {
BIN
View File
Binary file not shown.
-5
View File
@@ -1,5 +0,0 @@
{
"ports": [
25128
]
}
+4 -4
View File
@@ -2,19 +2,19 @@ import os
import json
if not os.path.exists('config.json'):
db = {"our_port": 0000, "ports": [], "domain": "http://127.0.0.1:8000"}
db = {'os': None,'our_port': 0000, 'ports': [], 'base_url': 'http://0.0.0.0:8000'}
js = json.dumps(db, indent=2)
with open("config.json", "w") as outfile:
with open('config.json', 'w') as outfile:
outfile.write(js)
print('Created new config.json')
def read(file = 'config.json'):
with open(file, "r", encoding="utf-8") as openfile:
with open(file, 'r', encoding='utf-8') as openfile:
db = json.load(openfile)
return db
def write(db, file = 'config.json'):
js = json.dumps(db, indent=2, ensure_ascii=False)
with open(file, "w", encoding="utf-8") as outfile:
with open(file, 'w', encoding='utf-8') as outfile:
outfile.write(js)
+52
View File
@@ -0,0 +1,52 @@
## Содержание
1. Почему JS это плохо (для безопасности)
2. Как отключить JS на jetwork.del.pw
3. Как отключить JS на локальном клиенте
<br>
<br>
### 1. Почему JS это плохо
Через JS можно узнать ваш айпи и отслеживать вас между сайтами. <br>
Или например узнать примерную локацию, что иногда может помочь вас сдеанонимизировать. <br>
Если это вас не волнует - можете дальше не читать. <br>
### 2. Как отключить JS на jetwork.del.pw
Заходим на jetwork.del.pw <br>
![image](https://github.com/Justuser3310/jetwork/assets/53183489/6ade4b4d-93b7-4538-a262-44bd8aafeb95)
<br>
Заходим на js-check.jet и видим что у нас всё плохо <br>
![image](https://github.com/Justuser3310/jetwork/assets/53183489/47bf4491-9804-40a3-a02a-b9550daf90f7)
<br>
Устанавливаем расширение Ublock Origin. (Origin!!!) <br>
Делается это как и со всеми расширениями.
<br>
Заходим в доп.найстройки Ublock Origin <br>
![image](https://github.com/Justuser3310/jetwork/assets/53183489/3984c49e-3ade-4c5a-a691-fd9152902924)
<br>
Ставим галочку в вкладке `Settings` напротив `I am advanced user` <br>
![image](https://github.com/Justuser3310/jetwork/assets/53183489/896ba926-109f-42a0-ac14-3352146771d7)
<br>
Выключаем скрипты через расширение как показано, прямоугольник загорится красным <br>
![image](https://github.com/Justuser3310/jetwork/assets/53183489/378303d0-b0a5-4917-84ee-28eec5b52cbf)
<br>
Перезагружаем страницу и... <br>
![image](https://github.com/Justuser3310/jetwork/assets/53183489/878c3b22-5ca8-4ae4-87a3-dfb714e16c14)
### 3. Как отключить JS на локальном клиенте
Заходим на `127.0.0.1:5555` <br>
![image](https://github.com/Justuser3310/jetwork/assets/53183489/13f107f9-6753-4278-bc07-d7c8206cc981)
<br>
Дальше по аналогии как в пункте 2.
> Есть вопросы - в чат ( https://t.me/justuser31_chat )
+1
View File
@@ -0,0 +1 @@
{"activeProfileId":"InternalProfile_SmartRules","defaultProxyServerId":"usundlzx4uvk2","firstEverInstallNotified":true,"options":{"syncSettings":false,"syncActiveProfile":true,"syncActiveProxy":true,"detectRequestFailures":true,"displayFailedOnBadge":true,"displayAppliedProxyOnBadge":true,"displayMatchedRuleOnBadge":true,"refreshTabOnConfigChanges":false,"proxyPerOrigin":true,"enableShortcuts":true,"shortcutNotification":true,"themeType":0,"themesDark":"themes-cosmo-dark"},"product":"SmartProxy","proxyProfiles":[{"enabled":true,"proxyRules":[],"rulesSubscriptions":[],"profileId":"InternalProfile_Direct","profileType":0,"profileTypeConfig":{"builtin":true,"editable":false,"selectable":true,"supportsSubscriptions":false,"supportsProfileProxy":false,"customProxyPerRule":false,"canBeDisabled":false,"supportsRuleActionWhitelist":false,"defaultRuleActionIsWhitelist":null},"profileName":"Direct (No Proxy)","profileProxyServerId":null},{"enabled":true,"proxyRules":[{"enabled":true,"whiteList":false,"ruleId":99411781,"autoGeneratePattern":true,"ruleType":0,"hostName":"jet","rulePattern":"*.jet/*","ruleRegex":"","ruleExact":"","proxy":{"name":"jet_local","id":"ezgallzykftxq","order":1,"host":"127.0.0.1","port":"8080","protocol":"HTTP","username":"","password":"","proxyDNS":true,"failoverTimeout":null},"proxyServerId":"ezgallzykftxq"},{"enabled":true,"whiteList":false,"ruleId":274078801725,"autoGeneratePattern":true,"ruleType":0,"hostName":"mirror","rulePattern":"*.mirror/*","ruleRegex":"","ruleExact":"","proxy":{"name":"jet_local","id":"ezgallzykftxq","order":1,"host":"127.0.0.1","port":"8080","protocol":"HTTP","username":"","password":"","proxyDNS":true,"failoverTimeout":null},"proxyServerId":"ezgallzykftxq"},{"enabled":true,"whiteList":false,"ruleId":597907496,"autoGeneratePattern":true,"ruleType":0,"hostName":"me","rulePattern":"*.me/*","ruleRegex":"","ruleExact":"","proxy":{"name":"jet_local","id":"ezgallzykftxq","order":1,"host":"127.0.0.1","port":"8080","protocol":"HTTP","username":"","password":"","proxyDNS":true,"failoverTimeout":null},"proxyServerId":"ezgallzykftxq"}],"rulesSubscriptions":[],"profileId":"InternalProfile_SmartRules","profileType":2,"profileTypeConfig":{"builtin":true,"editable":true,"selectable":true,"supportsSubscriptions":true,"supportsProfileProxy":true,"customProxyPerRule":true,"canBeDisabled":true,"supportsRuleActionWhitelist":true,"defaultRuleActionIsWhitelist":false},"profileName":"Smart Proxy","profileProxyServerId":""},{"enabled":true,"proxyRules":[],"rulesSubscriptions":[],"profileId":"InternalProfile_AlwaysEnabled","profileType":3,"profileTypeConfig":{"builtin":true,"editable":true,"selectable":true,"supportsSubscriptions":true,"supportsProfileProxy":true,"customProxyPerRule":true,"canBeDisabled":true,"supportsRuleActionWhitelist":true,"defaultRuleActionIsWhitelist":true},"profileName":"Always Enable","profileProxyServerId":null},{"enabled":true,"proxyRules":[],"rulesSubscriptions":[],"profileId":"InternalProfile_SystemProxy","profileType":1,"profileTypeConfig":{"builtin":true,"editable":false,"selectable":true,"supportsSubscriptions":false,"supportsProfileProxy":false,"customProxyPerRule":false,"canBeDisabled":false,"supportsRuleActionWhitelist":false,"defaultRuleActionIsWhitelist":null},"profileName":"System Proxy","profileProxyServerId":null},{"enabled":true,"proxyRules":[],"rulesSubscriptions":[],"profileType":4,"profileTypeConfig":{"builtin":true,"editable":false,"selectable":false,"supportsSubscriptions":false,"supportsProfileProxy":false,"customProxyPerRule":false,"canBeDisabled":false,"supportsRuleActionWhitelist":false,"defaultRuleActionIsWhitelist":null},"profileName":"Ignore Failure Rules","profileId":"profile-ms5zflzx4opc8"}],"proxyServerSubscriptions":[],"proxyServers":[{"name":"jet_public","id":"usundlzx4uvk2","order":3,"host":"jet.del.pw","port":"8080","protocol":"HTTP","username":"","password":"","proxyDNS":true,"failoverTimeout":null},{"name":"jet_local","id":"ezgallzykftxq","order":1,"host":"127.0.0.1","port":"8080","protocol":"HTTP","username":"","password":"","proxyDNS":true,"failoverTimeout":null}],"updateInfo":{"updateIsAvailable":false,"downloadPage":null,"version":null,"versionName":null,"isBrowserSpecific":true},"version":"1.5"}
+1
View File
@@ -0,0 +1 @@
{"activeProfileId":"InternalProfile_SmartRules","defaultProxyServerId":"usundlzx4uvk2","firstEverInstallNotified":true,"options":{"syncSettings":false,"syncActiveProfile":true,"syncActiveProxy":true,"detectRequestFailures":true,"displayFailedOnBadge":true,"displayAppliedProxyOnBadge":true,"displayMatchedRuleOnBadge":true,"refreshTabOnConfigChanges":false,"proxyPerOrigin":true,"enableShortcuts":true,"shortcutNotification":true,"themeType":0,"themesDark":"themes-cosmo-dark"},"product":"SmartProxy","proxyProfiles":[{"enabled":true,"proxyRules":[],"rulesSubscriptions":[],"profileId":"InternalProfile_Direct","profileType":0,"profileTypeConfig":{"builtin":true,"editable":false,"selectable":true,"supportsSubscriptions":false,"supportsProfileProxy":false,"customProxyPerRule":false,"canBeDisabled":false,"supportsRuleActionWhitelist":false,"defaultRuleActionIsWhitelist":null},"profileName":"Direct (No Proxy)","profileProxyServerId":null},{"enabled":true,"proxyRules":[{"enabled":true,"whiteList":false,"ruleId":42142459831829816,"autoGeneratePattern":true,"ruleType":0,"hostName":"jet","rulePattern":"*.jet/*","ruleRegex":"","ruleExact":"","proxy":{"name":"jet_public","id":"usundlzx4uvk2","order":3,"host":"jet.del.pw","port":"8080","protocol":"HTTP","username":"","password":"","proxyDNS":true,"failoverTimeout":null},"proxyServerId":"usundlzx4uvk2"},{"enabled":true,"whiteList":false,"ruleId":995421339685,"autoGeneratePattern":true,"ruleType":0,"hostName":"mirror","rulePattern":"*.mirror/*","ruleRegex":"","ruleExact":"","proxy":{"name":"jet_public","id":"usundlzx4uvk2","order":3,"host":"jet.del.pw","port":"8080","protocol":"HTTP","username":"","password":"","proxyDNS":true,"failoverTimeout":null},"proxyServerId":"usundlzx4uvk2"},{"enabled":true,"whiteList":false,"ruleId":7021094,"autoGeneratePattern":true,"ruleType":0,"hostName":"me","rulePattern":"*.me/*","ruleRegex":"","ruleExact":"","proxy":{"name":"jet_public","id":"usundlzx4uvk2","order":3,"host":"jet.del.pw","port":"8080","protocol":"HTTP","username":"","password":"","proxyDNS":true,"failoverTimeout":null},"proxyServerId":"usundlzx4uvk2"}],"rulesSubscriptions":[],"profileId":"InternalProfile_SmartRules","profileType":2,"profileTypeConfig":{"builtin":true,"editable":true,"selectable":true,"supportsSubscriptions":true,"supportsProfileProxy":true,"customProxyPerRule":true,"canBeDisabled":true,"supportsRuleActionWhitelist":true,"defaultRuleActionIsWhitelist":false},"profileName":"Smart Proxy","profileProxyServerId":""},{"enabled":true,"proxyRules":[],"rulesSubscriptions":[],"profileId":"InternalProfile_AlwaysEnabled","profileType":3,"profileTypeConfig":{"builtin":true,"editable":true,"selectable":true,"supportsSubscriptions":true,"supportsProfileProxy":true,"customProxyPerRule":true,"canBeDisabled":true,"supportsRuleActionWhitelist":true,"defaultRuleActionIsWhitelist":true},"profileName":"Always Enable","profileProxyServerId":null},{"enabled":true,"proxyRules":[],"rulesSubscriptions":[],"profileId":"InternalProfile_SystemProxy","profileType":1,"profileTypeConfig":{"builtin":true,"editable":false,"selectable":true,"supportsSubscriptions":false,"supportsProfileProxy":false,"customProxyPerRule":false,"canBeDisabled":false,"supportsRuleActionWhitelist":false,"defaultRuleActionIsWhitelist":null},"profileName":"System Proxy","profileProxyServerId":null},{"enabled":true,"proxyRules":[],"rulesSubscriptions":[],"profileType":4,"profileTypeConfig":{"builtin":true,"editable":false,"selectable":false,"supportsSubscriptions":false,"supportsProfileProxy":false,"customProxyPerRule":false,"canBeDisabled":false,"supportsRuleActionWhitelist":false,"defaultRuleActionIsWhitelist":null},"profileName":"Ignore Failure Rules","profileId":"profile-ms5zflzx4opc8"}],"proxyServerSubscriptions":[],"proxyServers":[{"name":"jet_public","id":"usundlzx4uvk2","order":3,"host":"jet.del.pw","port":"8080","protocol":"HTTP","username":"","password":"","proxyDNS":true,"failoverTimeout":null},{"name":"jet_local","id":"ezgallzykftxq","order":1,"host":"127.0.0.1","port":"8080","protocol":"HTTP","username":"","password":"","proxyDNS":true,"failoverTimeout":null}],"updateInfo":{"updateIsAvailable":false,"downloadPage":null,"version":null,"versionName":null,"isBrowserSpecific":true},"version":"1.5"}
+13 -5
View File
@@ -1,15 +1,23 @@
from re import compile, sub
domains = ['jet', 'mirror', 'me']
def domain_ok(domain):
domains = ["jet", "jw", "404", "dash", "awesome", "mirror"]
if domain.count(".") == 1:
if domain.split(".")[1] in domains:
global domains
if domain.count('.') == 1:
if domain.split('.')[1] in domains:
# ../some => some
# Защита от проверки папок выше, чем нужно и др.
regex = compile('[^a-zA-Zа-яА-ЯЁё.-]')
regex = compile('[^a-z0-9.-]')
c_domain = regex.sub('', domain)
if domain == c_domain:
return domain
return False
def domain_list():
global domains
out = ''
for i in domains:
out += f'{i}, '
out = out[:-2]
return out
+36 -6
View File
@@ -2,14 +2,20 @@ 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.Input(className='search', type='search', list=[1,2,3]),
dcc.Dropdown(options=[], id='search', placeholder='Поиск...'),
dcc.Interval(id='interval-component', interval=1*1000, n_intervals=0)
@@ -17,6 +23,29 @@ dcc.Interval(id='interval-component', interval=1*1000, n_intervals=0)
], className='main')], className='content')
# Функция выключения
def shutdown():
# Задаём код остановки
status_set('stop')
# Определяем платформу
if system() == 'Linux':
# вырубаем прокси и скрипты
sys('killall bore')
sys('killall python')
elif system() == 'Windows':
sys('taskkill /f /im bore.exe')
sys('taskkill /f /im python.exe')
# Кнопка выключения
@callback(
Output('shut_mess', 'displayed'),
Input('off_btn', 'n_clicks'),
prevent_initial_call=True
)
def shut_btn(n_clicks):
th = Thread(target=shutdown)
th.start()
return True
# Обновление нашего порта (зачем?)
@callback(Output('our_port', 'children'),
@@ -38,16 +67,17 @@ def update_servers(n):
Input('interval-component', 'n_intervals'),
Input('search', 'value'))
def update_sites(n, s_val):
# Домен по умолчанию
domain = read()['domain']
# Префикс
base_url = read()['base_url']
# Если есть элемент в поиске
if s_val:
return html.Div([ dcc.Link(children=i, href=f'{domain}/{s_val}',
return html.Div([ dcc.Link(children=i, href=f'{base_url}/{s_val}',
target='_blank') ], className='sites_elem')
res = []
for i in next(walk('cached/'), (None, None, []))[1]:
res.append(html.Div([ dcc.Link(children=i, href=f'{domain}/{i}',
conf = read(f'cached/{i}/config.json')
res.append(html.Div([ dcc.Link(children=i, href=f'http://{i}',
target='_blank') ], className='sites_elem'))
return res
@@ -61,4 +91,4 @@ def update_search(n):
return res
#app.run(debug=True, port = 5555)
app.run(debug=False, port = 5555)
app.run(debug=False, host = '0.0.0.0', port = 5555)
+7 -2
View File
@@ -7,7 +7,9 @@ from multiprocessing import Process
from network import *
from updater import *
from proxy import *
from web_proxy import *
from status import *
from db import *
#
@@ -47,9 +49,12 @@ def main():
# http сервер
http = Thread(target = server_http)
http.start()
# сервер обработки запросов
# Cервер обработки запросов
srv = Thread(target = server, args=(http_port,))
srv.start()
# Прокси для браузера
http_proxy = Thread(target = web_proxy)
http_proxy.start()
# Стартуем авто-поиск портов и авто-обновление сайтов
updater = Thread(target = update_demon, args=(serv_port,))
@@ -63,7 +68,7 @@ if __name__ == '__main__':
p = Process(target=main)
p.start()
status_set(True) # Устанавливаем статус, что программа работает
status_set('work') # Устанавливаем статус, что программа работает
st = status_check()
while st:
+20 -15
View File
@@ -13,6 +13,9 @@ from db import read
from json import loads
# Логирование ошибок
import logging
# Просто логирование
from icecream import ic
ic.disable() # Отключение логирования
from verify import *
from domain_check import *
@@ -43,7 +46,7 @@ def server_http():
except KeyboardInterrupt:
run = False
except Exception as e:
print("SERVER_HTTP FALLED")
ic("SERVER_HTTP FALLED")
logging.critical(e, exc_info=True)
def server(http_port):
@@ -59,7 +62,7 @@ def server(http_port):
s.listen(2)
conn, address = s.accept()
print("Connection from: " + str(address))
ic("Connection from: " + str(address))
while True:
try:
@@ -82,11 +85,10 @@ def server(http_port):
conn.send("not_exist".encode())
elif op[:8] == "publish_":
data = op[8:]
site, port = data.split("<>")
site = domain_ok(site)
if site:
site, u_port = data.split("<>")
if domain_ok(site):
conn.send("accepted".encode())
client(port, f"get_{site}")
client(u_port, f"get_{site}")
elif op == "check_all":
try:
sites = next(os.walk('cached/'), (None, None, []))[1]
@@ -105,7 +107,7 @@ def server(http_port):
conn.close()
except Exception as e:
print("SERVER_HTTP FALLED")
ic("SERVER_HTTP FALLED")
logging.critical(e, exc_info=True)
@@ -121,11 +123,11 @@ def recv(s, data_out):
okay = True
except:
pass
print(data)
ic(data)
data_out.put(data)
# op = operation
def client(port, op = "ping", host = 'bore.pub'):
def client(port, op = "ping", host = 'bore.del.pw'):
# Если порт не определён
if not port:
return None
@@ -174,8 +176,11 @@ def client(port, op = "ping", host = 'bore.pub'):
return "old"
# Скачиваем файлы
try:
g_site = get(f"http://{host}:{str(port)}/{site}.zip")
print('SIZE: ', g_site.headers['Content-Length']) # Размер
except:
return 'error'
ic('SIZE: ', g_site.headers['Content-Length']) # Размер
with open(f"verify/{site}.zip", "wb") as f:
f.write(g_site.content)
@@ -212,10 +217,10 @@ def client(port, op = "ping", host = 'bore.pub'):
our_ver = our_conf["ver"]
# Если версия не новее - злоумышленник
if our_ver >= dest_ver:
print("[!] Обнаружена подмена версии сайта.")
ic("[!] Обнаружена подмена версии сайта.")
# Сохраняем ключ злоумышленника
os.replace(f"verify/{site}.pem", f"verify/{site}.pem.FAKE")
print(f"[!] Порт злоумышленника: {port}")
ic(f"[!] Порт злоумышленника: {port}")
# Удаляем фальшивые файлы
os.remove(f"verify/{site}.zip")
os.remove(f"verify/{site}.sig")
@@ -233,11 +238,11 @@ def client(port, op = "ping", host = 'bore.pub'):
copytree(f"verify/{site}", f"cached/{site}")
rmtree(f"verify/{site}")
else:
print("[!] Обнаружена подмена сайта.")
ic("[!] Обнаружена подмена сайта.")
# Сохраняем ключ злоумышленника
os.replace(f"verify/{site}.pem", f"verify/{site}.pem.FAKE")
print(f"[!] Порт злоумышленника: {port}")
print(f"[!] Ключ (вероятно) злоумышленника сохранён в verify/{site}.pem.FAKE\n")
ic(f"[!] Порт злоумышленника: {port}")
ic(f"[!] Ключ (вероятно) злоумышленника сохранён в verify/{site}.pem.FAKE\n")
# Удаляем фальшивые файлы
os.remove(f"verify/{site}.zip")
os.remove(f"verify/{site}.sig")
-17
View File
@@ -1,17 +0,0 @@
from os import system, name
from network import port_gen
port = input("Введите порт: ")
dest = port_gen(25300, 25500)
print(f"\nУдалённый ПОРТ: {dest}")
print("\n[!] Не закрывайте это окно [!]\n")
if name == "posix":
system(f"./bore local {port} --to bore.pub --port {dest}")
elif name == "nt":
system(f"bore.exe local {port} --to bore.pub --port {dest}")
else:
print("Увы, вероятно Ваша ОС не поддерживается.")
print("Завершение работы...")
exit()
+20 -11
View File
@@ -1,22 +1,27 @@
from os import system, name
from os import system
from threading import Thread
from time import sleep
from status import *
from db import read
global http_out ; http_out = None
def proxy_http(port):
global http_out
if name == "posix":
http_out = system(f"./bore local 8000 --to bore.pub --port {port}")
elif name == "nt":
http_out = system(f"bore local 8000 --to bore.pub --port {port}")
os = read()['os']
if os == 'Linux':
http_out = system(f'./bore local 8000 --to bore.del.pw --port {port}')
elif os == 'Windows' or os == 'Android':
http_out = system(f'bore local 8000 --to bore.del.pw --port {port}')
global serv_out ; serv_out = None
def proxy_serv(port):
global serv_out
if name == "posix":
http_out = system(f"./bore local 8001 --to bore.pub --port {port}")
elif name == "nt":
http_out = system(f"bore local 8001 --to bore.pub --port {port}")
os = read()['os']
if os == 'Linux':
http_out = system(f'./bore local 8001 --to bore.del.pw --port {port}')
elif os == 'Windows' or os == 'Android':
http_out = system(f'bore local 8001 --to bore.del.pw --port {port}')
def watch_http(port):
@@ -24,13 +29,15 @@ def watch_http(port):
run.start()
global http_out
while True:
st = status_check()
while st:
# Если команда вышла
if http_out or not run.is_alive():
run.join(1)
http_out = None
run = Thread(target=proxy_http, args=(port,))
run.start()
st = status_check()
sleep(1)
def watch_serv(port):
@@ -38,10 +45,12 @@ def watch_serv(port):
run.start()
global serv_out
while True:
st = status_check()
while st:
if serv_out or not run.is_alive():
run.join(1)
serv_out = None
run = Thread(target=proxy_serv, args=(port,))
run.start()
st = status_check()
sleep(1)
+1
View File
@@ -2,3 +2,4 @@ cryptography
requests
tqdm
dash
icecream
+52 -35
View File
@@ -1,51 +1,68 @@
from os import system, name
from os import system
from urllib.request import urlretrieve as download
from db import *
config = {}
# Устанавливаем зависимости
system("pip install -r requirements.txt")
print('''1. Linux
2. Windows
3. Android (Termux)''')
raw_os = input('ОС установки >> ')
oses = {'1': 'Linux', '2': 'Windows', '3': 'Android'}
os = oses[raw_os]
# Скачиваем bore (для проброса портов)
if name == "posix":
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")
# Записываем ОС в конфиг
conf = read()
conf['os'] = os
write(conf)
import getpass
user = getpass.getuser()
if os == 'Android':
print('''---
Устанавливаем зависимости rust...
---''')
system('pkg install rust')
#system("mkdir ~/.streamlit")
#with open(f"/home/{user}/.streamlit/credentials.toml", "w") as f:
# f.write('[general]\nemail = "a@a.a"')
#f.close()
elif name == "nt":
print('''---
[1/3] Устанавливаем зависимости Python...
---''')
system('pip install -r requirements.txt')
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
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")
system("del bore.zip")
#system("mkdir C:\\Users\\windows\\.streamlit")
#with open("C:\\Users\\windows\\.streamlit\\credentials.toml", "w") as f:
# f.write('[general]\nemail = "a@a.a"')
#f.close()
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')
system('del bore.zip')
elif os == 'Android':
system('pkg install bore')
else:
print("Увы, вероятно Ваша ОС не поддерживается.")
print("Завершение работы...")
print('Увы, вероятно Ваша ОС не поддерживается.')
print('Завершение работы...')
exit()
# Создаём папку для кэшированных сайтов
system("mkdir cached")
system("mkdir verify")
system("mkdir mysites")
print('''---
[3/3] Создаём папки для работы...
---''')
system('mkdir cached')
system('mkdir verify')
system('mkdir mysites')
# TODO
#print("Максимальный размер для кэшированных файлов. (в гигабайтах)")
#print("Укажите 0 для отключения ограничения.")
#max = input(">> ")
#print('Максимальный размер для кэшированных файлов. (в гигабайтах)')
#print('Укажите 0 для отключения ограничения.')
#max = input('>> ')
# Записываем в конфиг
#config["max"] = max
#config['max'] = max
#write(config)
print("\nЧтобы подключится к jetwork выполните: python main.py")
print('''
---
Установка завершена!
Чтобы подключится к jetwork выполните: python main.py
---''')
+109 -114
View File
@@ -1,4 +1,4 @@
from os import system, mkdir
from os import system, mkdir, walk
from db import *
from shutil import copyfile, make_archive, rmtree, copytree
from tqdm import tqdm
@@ -6,176 +6,171 @@ from time import sleep
from verify import *
from network import *
from domain_check import domain_list
print("(1) Создать сайт")
print("(2) Обновить сайт")
print("(3) Сменить тип")
print("(4) Авто-раздача сайта")
print("Enter для просто публикации.")
def your_sites():
sites = {}; num = 1
for i in next(walk('cached/'), (None, None, []))[1]:
sites[str(num)] = i
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 *
print("\nДомены: .jet, .jw, .404, .dash, .awesome, .mirror")
domain = input("Домен сайта: ")
print(f'\nДоступные 1 lvl домены: {domain_list()}')
domain = input('Домен сайта: ')
if not domain_ok(domain):
print("Неправильный формат или домен.")
print('Неправильный формат или домен.')
exit()
print("\n(1) Статичный / (2) Динамический")
type = input("Тип: ")
print('\n(1) Статичный / (2) Динамический')
type = input('Тип: ')
# Создаём папку и ключи для подписи
mkdir(f"mysites/{domain}")
key_gen(f"mysites/{domain}")
mkdir(f'mysites/{domain}')
key_gen(f'mysites/{domain}')
if type == "1":
conf = {"type": "static", "ver": 1}
print("ПРИМЕЧАНИЕ: 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":
if type == '1':
conf = {'type': 'static', 'ver': 1}
print('\nПРИМЕЧАНИЕ: index.html обязателен.')
# Создаём index.html для загрузки сайта
with open(f"mysites/{domain}/index.html", "w") as f:
f.write("<h1> Hello jetwork! </h1>")
with open(f'mysites/{domain}/index.html', 'w') as f:
f.write('<h1> Hello jetwork! </h1>')
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}")
sign(f"mysites/{domain}.zip", f"mysites/{domain}.key", f"mysites/{domain}")
make_archive(f'mysites/{domain}', 'zip', f'mysites/{domain}')
sign(f'mysites/{domain}.zip', f'mysites/{domain}.key', f'mysites/{domain}')
elif op == "2":
domain = input("\nДомен сайта: ")
if not os.path.exists(f"mysites/{domain}"):
print("Не существует такого сайта.")
exit()
elif op == '2':
print()
sites = your_sites()
conf = read(f"mysites/{domain}/config.json")
type = conf["type"]
if type == "dynamic":
port = input("Порт сервера: ")
conf["port"] = port
write(conf, f"mysites/{domain}/config.json")
domain = sites[input('Домен сайта: ')]
conf = read(f'mysites/{domain}/config.json')
type = conf['type']
if type == 'dynamic':
port = input('Порт сервера: ')
conf['port'] = port
write(conf, f'mysites/{domain}/config.json')
# Обновляем версию
conf = read(f"mysites/{domain}/config.json")
conf["ver"] = conf["ver"] + 1
write(conf, f"mysites/{domain}/config.json")
conf = read(f'mysites/{domain}/config.json')
conf['ver'] = conf['ver'] + 1
write(conf, f'mysites/{domain}/config.json')
# Архивируем и создаём сигнатуру для подтверждения неизменности архива
make_archive(f"mysites/{domain}", "zip", f"mysites/{domain}")
sign(f"mysites/{domain}.zip", f"mysites/{domain}.key", f"mysites/{domain}")
make_archive(f'mysites/{domain}', 'zip', 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
domain = input("\nДомен сайта: ")
if not os.path.exists(f"mysites/{domain}"):
print("Не существует такого сайта.")
exit()
print()
sites = your_sites()
domain = sites[input('Домен сайта: ')]
print("\n(1) Статичный / (2) Динамический")
type = input("Тип: ")
print('\n(1) Статичный / (2) Динамический')
type = input('Тип: ')
if type == "1":
conf = read(f"mysites/{domain}/config.json")
conf["type"] = "static"
conf.pop("port")
with open(f"mysites/{domain}/index.html", "w") as f:
f.write("<h1> Hello jetwork! </h1>")
if type == '1':
conf = read(f'mysites/{domain}/config.json')
conf['type'] = 'static'
conf.pop('port')
with open(f'mysites/{domain}/index.html', 'w') as f:
f.write('<h1> Hello jetwork! </h1>')
f.close()
elif type == "2":
conf = read(f"mysites/{domain}/config.json")
port = input("Порт сервера: ")
elif type == '2':
conf = read(f'mysites/{domain}/config.json')
port = input('Порт сервера: ')
clean = input("Удалить все лишние файлы сайта (y/n): ")
if clean == "y":
clean = input('Удалить все лишние файлы сайта (y/n): ')
if clean == 'y':
# Удаляем папку, сохраняем конфиг и копируем публичный ключ
rmtree(f"mysites/{domain}")
rmtree(f'mysites/{domain}')
sleep(0.1)
system(f"mkdir mysites/{domain}")
system(f'mkdir mysites/{domain}')
conf["type"] = "dynamic"
conf["port"] = int(port)
write(conf, f"mysites/{domain}/config.json")
conf['type'] = 'dynamic'
conf['port'] = int(port)
write(conf, f'mysites/{domain}/config.json')
# Обновляем версию
conf = read(f"mysites/{domain}/config.json")
conf["ver"] = conf["ver"] + 1
write(conf, f"mysites/{domain}/config.json")
conf = read(f'mysites/{domain}/config.json')
conf['ver'] = conf['ver'] + 1
write(conf, f'mysites/{domain}/config.json')
# Архивируем и создаём сигнатуру для подтверждения неизменности архива
make_archive(f"mysites/{domain}", "zip", f"mysites/{domain}")
sign(f"mysites/{domain}.zip", f"mysites/{domain}.key", f"mysites/{domain}")
make_archive(f'mysites/{domain}', 'zip', f'mysites/{domain}')
sign(f'mysites/{domain}.zip', f'mysites/{domain}.key', f'mysites/{domain}')
elif op == "4":
domain = input("\nДомен сайта: ")
if not os.path.exists(f"mysites/{domain}"):
print("Не существует такого сайта.")
exit()
elif op == '4':
print()
sites = your_sites()
domain = sites[input('Домен сайта: ')]
print("\nВведите ваш порт сервера (при запуске main.py)")
serv_port = int(input(">> "))
http_port = client(serv_port, f"is_{domain}")
serv_port = int( read()['our_port'] )
http_port = client(serv_port, f'is_{domain}')
print("\nСтарт вечной раздачи...")
print('\nСтарт вечной раздачи...')
while True:
ports = port_check(serv_port)
sleep(1)
for port in tqdm(ports):
client(port, f"publish_{domain}<>{http_port}")
client(port, f'publish_{domain}<>{http_port}')
sleep(5)
elif op == "":
domain = input("\nДомен сайта: ")
if not os.path.exists(f"mysites/{domain}"):
print("Не существует такого сайта.")
exit()
pub = "y"
host = 'bore.del.pw'
# Проверяем тип сайта
type = read(f'mysites//{domain}/config.json')['type']
# Если динамический - вставляем спец страницу
if type == 'dynamic':
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
try:
rmtree(f"cached/{domain}")
rmtree(f'cached/{domain}')
except:
pass
copytree(f"mysites/{domain}", f"cached/{domain}")
copyfile(f"mysites/{domain}.pem", f"cached/{domain}.pem")
copyfile(f"mysites/{domain}.sig", f"cached/{domain}.sig")
copyfile(f"mysites/{domain}.zip", f"cached/{domain}.zip")
copytree(f'mysites/{domain}', f'cached/{domain}')
copyfile(f'mysites/{domain}.pem', f'cached/{domain}.pem')
copyfile(f'mysites/{domain}.sig', f'cached/{domain}.sig')
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 != '':
print('\nОпубликовать сайт?')
pub = input('y/n >> ')
if op != "":
print("Опубликовать сайт?")
pub = input("y/n >> ")
if pub == "n":
if pub == 'n':
exit()
print("Введите ваш порт сервера (при запуске main.py)")
serv_port = int(input(">> "))
http_port = client(serv_port, f"is_{domain}")
serv_port = int( read()['our_port'] )
http_port = client(serv_port, f'is_{domain}')
print("Получаем все порты...")
print('Получаем все порты...')
ports = port_check(serv_port)
print(ports)
print("Публикуем сайт...")
print('Публикуем сайт...')
for port in tqdm(ports):
client(port, f"publish_{domain}<>{http_port}")
client(port, f'publish_{domain}<>{http_port}')
Executable
+10
View File
@@ -0,0 +1,10 @@
while true
do
killall python
sleep 1s
killall python #Чтоб наверняка
sleep 60s # Ждём, чтобы не было ошибки при перезапуске "данный порт уже используется"
nohup python srv_main.py &
sleep 6h
done
+79
View File
@@ -0,0 +1,79 @@
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):
# Префикс
base_url = read()['base_url']
# Если есть элемент в поиске
if s_val:
return html.Div([ dcc.Link(children=i, href=f'{base_url}/{s_val}',
target='_blank') ], className='sites_elem')
res = []
for i in next(walk('cached/'), (None, None, []))[1]:
conf = read(f'cached/{i}/config.json')
res.append(html.Div([ dcc.Link(children=i, href=f'http://{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, host = '0.0.0.0', port = 5555)
+9 -3
View File
@@ -7,7 +7,9 @@ from multiprocessing import Process
from network import *
from updater import *
from proxy import *
from web_proxy import *
from status import *
from db import *
#
@@ -21,7 +23,7 @@ def main():
print('Проверка обновлений...')
system('git pull')
print('Перезагрузка скрипта...')
system('python main.py updated')
system('python srv_main.py updated')
exit()
print('\nУспешно перезагружено!')
@@ -55,15 +57,19 @@ def main():
#updater = Thread(target = update_demon, args=(serv_port,))
#updater.start()
# Прокси для браузера
http_proxy = Thread(target = web_proxy)
http_proxy.start()
# Стартуем интерфейс
system('python interface.py')
system('python srv_interface.py')
if __name__ == '__main__':
# Запускаем главный процесс, чтобы потом легко убить его
p = Process(target=main)
p.start()
status_set(True) # Устанавливаем статус, что программа работает
status_set('work') # Устанавливаем статус, что программа работает
st = status_check()
while st:
-1
View File
@@ -1 +0,0 @@
work
+3 -3
View File
@@ -19,8 +19,8 @@ def status_check():
def status_set(st):
f = open('status', 'w')
if st == True:
f.write('work')
if st == 'work' or st == 'stop':
f.write(st)
else:
f.write('stop')
return 404
f.close()
-8
View File
@@ -1,8 +0,0 @@
#
# Установка/проверка статуса завершения
#
import os
if not os.path.exists('status'):
+3
View File
@@ -0,0 +1,3 @@
killall ./srv.sh
killall python
killall bore
+7 -4
View File
@@ -6,6 +6,9 @@ from network import *
# Логирование ошибок
import logging
# Просто логирование
from icecream import ic
ic.disable() # Отключение логирования
def update_demon(serv_port):
while True:
@@ -40,23 +43,23 @@ def update_demon(serv_port):
if check[0] == el:
# Сверяем версии
if check[1] >= ver:
print("Ver_ok: ", el)
ic("Ver_ok: ", el)
pass
else:
# Если версия новее
print("Ver_new: ", el)
ic("Ver_new: ", el)
http_port = client(port, f"is_{el}")
client(http_port, f"get_{el}")
found = True
break # Если нашли - выходим
if not found:
print("Not_found: ", el)
ic("Not_found: ", el)
http_port = client(port, f"is_{el}")
client(http_port, f"get_{el}")
except:
pass
except Exception as e:
print("UPDATER FALLED")
ic("UPDATER FALLED")
logging.critical(e, exc_info=True)
+82
View File
@@ -0,0 +1,82 @@
import http.server
import socketserver
import urllib.request
import logging
from os.path import exists
from db import *
base_url = read()['base_url']
# Логирование
from icecream import ic
ic.disable() # Выключить отладку
class Proxy(http.server.SimpleHTTPRequestHandler):
# Отключение всех сообщений (чтобы не забивать вывод)
def log_message(self, format, *args):
pass
def do_GET(self):
ic(f"Request for: {self.path}")
# 'js-check.jet/favicon.ico' -> '127.0.0.1:8000/favicon.ico'
target = self.path
domain = target[7:]
domain = domain[:domain.find('/')]
if not exists(f'cached/{domain}'):
self.send_error(404, f"Site not found")
return 404
# Если статичный
if read(f'cached/{domain}/config.json')['type'] == 'static':
target = f'{base_url}/{target[7:]}' # http://127.0.0.1:8000 / js-check.jet
# Если динамический
elif read(f'cached/{domain}/config.json')['type'] == 'dynamic':
port = read(f'cached/{domain}/config.json')['port']
target = f'http://bore.del.pw:{port}/{target.replace(f"http://{domain}/", "")}'
ic(f"Modded request: {target}")
# Направление запроса по адресу
try:
with urllib.request.urlopen(target) as response:
self.send_response(response.getcode())
self.send_header("Content-type", response.headers.get_content_type())
self.end_headers()
self.wfile.write(response.read())
except Exception as e:
self.send_error(500, f"Error: {str(e)}")
def do_POST(self):
ic(f"Request for: {self.path}")
if not exists(f'cached/{domain}'):
self.send_error(404, f"Site not found")
return 404
if read(f'cached/{domain}/config.json')['type'] == 'static':
target = f'{base_url}/{target[7:]}' # http://127.0.0.1:8000 / js-check.jet
elif read(f'cached/{domain}/config.json')['type'] == 'dynamic':
port = read(f'cached/{domain}/config.json')['port']
target = f'http://bore.del.pw:{port}/{target.replace(f"http://{domain}/", "")}'
ic(f"Modded request: {target}")
# Направление запроса по адресу
try:
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
req = urllib.request.Request(self.path, data=post_data, method='POST')
with urllib.request.urlopen(req) as response:
self.send_response(response.getcode())
self.send_header("Content-type", response.headers.get_content_type())
self.end_headers()
self.wfile.write(response.read())
except Exception as e:
self.send_error(500, f"Error: {str(e)}")
def web_proxy():
PORT = 8080
with socketserver.TCPServer(("", PORT), Proxy) as httpd:
print(f"HTTP proxy on port {PORT}")
httpd.serve_forever()