Compare commits

...

72 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
justuser ccb88adcb4 fix 2024-06-18 16:44:40 +03:00
justuser 29ce4a724b Исправление адреса при открытии сайта 2024-06-18 16:40:02 +03:00
justuser d8cd870ce9 Fix 2024-06-18 15:59:56 +03:00
Justuser cca41a5d7a Update README.md 2024-06-18 11:02:39 +00:00
Justuser 4074b07f15 Update README.md 2024-06-18 11:02:14 +00:00
justuser 2f797096d0 Смена порта 2024-06-18 13:50:15 +03:00
Justuser cd8c321aec Update README.md 2024-06-18 10:47:05 +00:00
justuser 94f7b1a773 Серверная версия main.py 2024-06-18 13:46:22 +03:00
justuser ab84313def up 2024-06-18 13:44:34 +03:00
justuser cec4b07b4a up 2024-06-18 13:39:05 +03:00
justuser 0f35ab55fe Обновление интерфейса, переход на Dash. 2024-06-18 13:36:29 +03:00
justuser dbaded283b up 2024-06-18 10:36:19 +03:00
justuser b559b7b659 Перевод на публичный адрес 2024-06-18 10:33:52 +03:00
justuser a383517634 Небольшие поправки 2024-06-18 10:32:24 +03:00
justuser d6559d0e68 Снова multiprocessing, добавление мнгновенной остановки без багов 2024-06-17 20:25:08 +03:00
justuser 9b64354728 Переход на публичный адрес 2024-06-17 08:42:57 +03:00
justuser 2ef9fa6fb8 Переход на публичный адрес 2024-06-17 08:39:47 +03:00
justuser 7b42fa0680 Обновление радиуса портов 2024-06-17 08:38:54 +03:00
justuser e10043262c up 2024-06-17 08:24:54 +03:00
23 changed files with 835 additions and 388 deletions
+12 -81
View File
@@ -6,89 +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`
<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`
<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.

After

Width:  |  Height:  |  Size: 103 KiB

+89
View File
@@ -0,0 +1,89 @@
.content {
/*display: flex;*/
justify-content: center;
padding: 3rem;
}
.main {
display: grid;
grid-template-areas:
"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;
align-content: center;
border-radius: 0.4rem;
padding-left: 1rem;
padding-right: 1rem;
margin-right: 0.5rem;
margin-top: 0.4rem;
}
.servers {
grid-area: servers;
}
.serv_elem {
background: #fff454;
align-content: center;
border-radius: 0.4rem;
padding-left: 1rem;
min-height: 2.2rem;
margin-top: 0.4rem;
margin-right: 0.5rem;
}
.sites {
grid-area: sites;
}
.sites_elem {
background: #abd4f9;
align-content: center;
border-radius: 0.4rem;
padding-left: 1rem;
min-height: 2.2rem;
margin-top: 0.4rem;
}
.search {
grid-area: search;
}
/* Действия при разрешении телефона */
@media (max-width: 900px) {
.content {
display: flex;
padding: 0;
}
}
+4 -4
View File
@@ -2,19 +2,19 @@ import os
import json
if not os.path.exists('config.json'):
db = {}
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
+82 -31
View File
@@ -1,43 +1,94 @@
import streamlit as st
import streamlit.components.v1 as components
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 time import sleep
from db import *
from os import system as sys
from platform import system
from threading import Thread
# Получаем порт со входа
from sys import argv
our_port = argv[1]
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')
st.title('jetwork')
# Функция выключения
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')
ph = st.empty()
# Кнопка выключения
@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
while True:
# Боковая панель
with ph.container():
# Столбцы для элементов
sidebar, space, main = st.columns([60, 10, 90])
# Обновление нашего порта (зачем?)
@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
with sidebar:
st.success(f"Ваш порт: {our_port}")
# Обновление доступных сайтов
@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')
conf = read()
if 'ports' in conf:
ports = conf['ports']
for i in ports:
st.warning(f"{i}")
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
with main:
# Получаем все сайты
sites = next(walk('cached/'), (None, None, []))[1]
# Обновление доступных сайтов в поиске
@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
for i in sites:
addr = f"http://127.0.0.1:8000/{i}"
st.info(f"[{i}]({addr})")
sleep(3)
ph.empty()
st.rerun()
#app.run(debug=True, port = 5555)
app.run(debug=False, host = '0.0.0.0', port = 5555)
+73 -58
View File
@@ -1,71 +1,86 @@
from os import system, name
from threading import Thread
from time import sleep
from threading import Thread
from multiprocessing import Process
from network import *
from updater import *
# Здесь общий запуск всех файлов и команд
# Проверка обновлений
from sys import argv
if len(argv) == 1:
print("Проверка обновлений...")
system("git pull")
print("Перезагрузка скрипта...")
system("python main.py updated")
exit()
print("\nУспешно перезагружено!")
from proxy import *
from web_proxy import *
from status import *
http_port = port_gen()
print(f"HTTP: {http_port}")
rp_http = Thread(target = watch_http, args=(http_port,))
rp_http.daemon = True
rp_http.start()
from db import *
serv_port = port_gen()
print(f"SERV: {serv_port}")
rp_serv = Thread(target = watch_serv, args=(serv_port,))
rp_serv.daemon = True
rp_serv.start()
#
# Здесь общий запуск всех файлов и команд
#
# Стартуем сервисы
#http сервер
http = Thread(target = server_http)
http.daemon = True
http.start()
# сервер для пинга
server = Thread(target = server, args=(http_port,))
server.daemon = True
server.start()
# Стартуем авто-поиск портов и авто-обновление сайтов
updater = Thread(target = update_demon, args=(serv_port,))
updater.daemon = True
updater.start()
# Стартуем интерфейс
system(f"python -m streamlit run --server.address=127.0.0.1 interface.py {serv_port}")
while True:
try:
pass
except:
def main():
# Проверка обновлений
from sys import argv
if len(argv) == 1:
print('Проверка обновлений...')
system('git pull')
print('Перезагрузка скрипта...')
system('python main.py updated')
exit()
print('\nУспешно перезагружено!')
#print(client(8000, "ping"))
#ports = port_check(serv_port)
#print(ports)
# Запуск прокси для сервисов
# проксируем http сервер
http_port = port_gen()
print(f'HTTP: {http_port}')
rp_http = Thread(target = watch_http, args=(http_port,))
rp_http.start()
#print(client(4015, "ping"))
#print(client(4137, "is_just.jet"))
# проксируем сервер обработки запросов
serv_port = port_gen()
print(f'SERV: {serv_port}')
rp_serv = Thread(target = watch_serv, args=(serv_port,))
rp_serv.start()
#client(4092, "publish_just.jet<>4066")
# Загружаем порт в конфиг
conf = read()
conf['our_port'] = serv_port
write(conf)
# Стартуем сервисы
# 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,))
updater.start()
# Стартуем интерфейс
system('python interface.py')
if __name__ == '__main__':
# Запускаем главный процесс, чтобы потом легко убить его
p = Process(target=main)
p.start()
status_set('work') # Устанавливаем статус, что программа работает
st = status_check()
while st:
try:
st = status_check()
sleep(0.01)
except KeyboardInterrupt:
p.terminate()
exit()
except:
pass
# Когда послан код завершения
p.terminate()
exit()
+29 -25
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 *
@@ -24,23 +27,26 @@ from domain_check import *
# 2. [+] Проверка существования сайта
# 3. [+] Передача сайта
# 4. [+] Приём рассылки сайтов
# 5. Проверка всех сайтов
# 5. [ ] Проверка всех сайтов
def port_gen(st = 4000, end = 4200):
def port_gen(st = 25000, end = 25200):
port = randint(st, end)
if client(port) == None:
return port
while client(port) != None:
port = randint(4000, 4200)
port = randint(st, end)
return port
def server_http():
while True:
run = True
while run == True:
try:
os.system("python -m http.server --directory cached")
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):
@@ -56,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:
@@ -79,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]
@@ -102,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)
@@ -118,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 = 'jetwork.404.mn'):
def client(port, op = "ping", host = 'bore.del.pw'):
# Если порт не определён
if not port:
return None
@@ -171,8 +176,11 @@ def client(port, op = "ping", host = 'jetwork.404.mn'):
return "old"
# Скачиваем файлы
g_site = get(f"http://{host}:{str(port)}/{site}.zip")
print('SIZE: ', g_site.headers['Content-Length']) # Размер
try:
g_site = get(f"http://{host}:{str(port)}/{site}.zip")
except:
return 'error'
ic('SIZE: ', g_site.headers['Content-Length']) # Размер
with open(f"verify/{site}.zip", "wb") as f:
f.write(g_site.content)
@@ -209,10 +217,10 @@ def client(port, op = "ping", host = 'jetwork.404.mn'):
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")
@@ -230,11 +238,11 @@ def client(port, op = "ping", host = 'jetwork.404.mn'):
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")
@@ -274,7 +282,7 @@ def port_check(your_port):
global ports
ports = []
checks = list(range(4000, 4200))
checks = list(range(25000, 25200))
checks.remove(your_port)
for port in tqdm(checks):
@@ -284,7 +292,3 @@ def port_check(your_port):
sleep(10)
return ports
#print( port_check(4001) )
#print( client(4085, "ping") )
-17
View File
@@ -1,17 +0,0 @@
from os import system, name
from network import port_gen
port = input("Введите порт: ")
dest = port_gen(7000, 9000)
print(f"\nУдалённый ПОРТ: {dest}")
print("\n[!] Не закрывайте это окно [!]\n")
if name == "posix":
system(f"./bore local {port} --to jetwork.404.mn --port {dest}")
elif name == "nt":
system(f"bore.exe local {port} --to jetwork.404.mn --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 jetwork.404.mn --port {port}")
elif name == "nt":
http_out = system(f"bore local 8000 --to jetwork.404.mn --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 jetwork.404.mn --port {port}")
elif name == "nt":
http_out = system(f"bore local 8001 --to jetwork.404.mn --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)
+2 -1
View File
@@ -1,4 +1,5 @@
cryptography
requests
tqdm
streamlit
dash
icecream
+54 -37
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("Максимальный размер для кэшированных файлов. (в гигабайтах)")
print("Укажите 0 для отключения ограничения.")
max = input(">> ")
print('''---
[3/3] Создаём папки для работы...
---''')
system('mkdir cached')
system('mkdir verify')
system('mkdir mysites')
# TODO
#print('Максимальный размер для кэшированных файлов. (в гигабайтах)')
#print('Укажите 0 для отключения ограничения.')
#max = input('>> ')
# Записываем в конфиг
config["max"] = max
write(config)
#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)
+87
View File
@@ -0,0 +1,87 @@
from os import system, name
from time import sleep
from threading import Thread
from multiprocessing import Process
from network import *
from updater import *
from proxy import *
from web_proxy import *
from status import *
from db import *
#
# Здесь общий запуск всех файлов и команд
#
def main():
# Проверка обновлений
from sys import argv
if len(argv) == 1:
print('Проверка обновлений...')
system('git pull')
print('Перезагрузка скрипта...')
system('python srv_main.py updated')
exit()
print('\nУспешно перезагружено!')
# Запуск прокси для сервисов
# проксируем http сервер
http_port = port_gen()
print(f'HTTP: {http_port}')
rp_http = Thread(target = watch_http, args=(http_port,))
rp_http.start()
# проксируем сервер обработки запросов
serv_port = port_gen()
print(f'SERV: {serv_port}')
rp_serv = Thread(target = watch_serv, args=(serv_port,))
rp_serv.start()
# Загружаем порт в конфиг
conf = read()
conf['our_port'] = serv_port
write(conf)
# Стартуем сервисы
# http сервер
http = Thread(target = server_http)
http.start()
# сервер обработки запросов
srv = Thread(target = server, args=(http_port,))
srv.start()
# Стартуем авто-поиск портов и авто-обновление сайтов
#updater = Thread(target = update_demon, args=(serv_port,))
#updater.start()
# Прокси для браузера
http_proxy = Thread(target = web_proxy)
http_proxy.start()
# Стартуем интерфейс
system('python srv_interface.py')
if __name__ == '__main__':
# Запускаем главный процесс, чтобы потом легко убить его
p = Process(target=main)
p.start()
status_set('work') # Устанавливаем статус, что программа работает
st = status_check()
while st:
try:
st = status_check()
sleep(0.01)
except KeyboardInterrupt:
p.terminate()
exit()
except:
pass
# Когда послан код завершения
p.terminate()
exit()
+26
View File
@@ -0,0 +1,26 @@
#
# Установка/проверка статуса завершения
#
import os
if not os.path.exists('status'):
f = open('status', 'w')
f.write('work')
f.close()
def status_check():
f = open('status', 'r')
st = f.read()
if st == 'work':
return True
else:
return False
def status_set(st):
f = open('status', 'w')
if st == 'work' or st == 'stop':
f.write(st)
else:
return 404
f.close()
+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()