Compare commits

..

68 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
23 changed files with 831 additions and 380 deletions
+12 -81
View File
@@ -6,89 +6,20 @@ https://t.me/justuser31_chat
<br> <br>
<br> <br>
# 📃 Документация # 📃 Документация (ТУТ ВСЁ)
Читайте "начало работы", если хотите, чтобы последующие действия работали. [**>>> ДОКУМЕНТАЦИЯ <<<**](https://docs.del.pw/books/jetwork) <br>
(Там всё есть!!!)
<br>
## 📋 Содержание
- ▶️ Начало работы
- 🔓 Открытие любых портов
- 📎 Публикация статичного сайта
- 📎 Публикация динамичного сайта
- 🪄 Как это работает
<br> <br>
<br> <br>
### ▶️ Начало работы ## 🔼 План развития
* Обновление диаграм
<br> * Обновление документации
* Подтверждение при переходе по ссылке
#### 🐧 Linux * Встроенные ссылки в jetwork
1. Установить python: `sudo apt install python3` * Проверка на JS
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)
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 import json
if not os.path.exists('config.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) js = json.dumps(db, indent=2)
with open("config.json", "w") as outfile: with open('config.json', 'w') as outfile:
outfile.write(js) outfile.write(js)
print('Created new config.json') print('Created new config.json')
def read(file = '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) db = json.load(openfile)
return db return db
def write(db, file = 'config.json'): def write(db, file = 'config.json'):
js = json.dumps(db, indent=2, ensure_ascii=False) 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) 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 from re import compile, sub
domains = ['jet', 'mirror', 'me']
def domain_ok(domain): def domain_ok(domain):
domains = ["jet", "jw", "404", "dash", "awesome", "mirror"] global domains
if domain.count('.') == 1:
if domain.count(".") == 1: if domain.split('.')[1] in domains:
if domain.split(".")[1] in domains:
# ../some => some # ../some => some
# Защита от проверки папок выше, чем нужно и др. # Защита от проверки папок выше, чем нужно и др.
regex = compile('[^a-zA-Zа-яА-ЯЁё.-]') regex = compile('[^a-z0-9.-]')
c_domain = regex.sub('', domain) c_domain = regex.sub('', domain)
if domain == c_domain: if domain == c_domain:
return domain return domain
return False return False
def domain_list():
global domains
out = ''
for i in domains:
out += f'{i}, '
out = out[:-2]
return out
+82 -31
View File
@@ -1,43 +1,94 @@
import streamlit as st from dash import Dash, dcc, html, Input, Output, callback
import streamlit.components.v1 as components app = Dash(__name__, title='Jetwork', update_title=None)
from db import *
from status import *
from os import walk from os import walk
from time import sleep from os import system as sys
from db import * from platform import system
from threading import Thread
# Получаем порт со входа app.layout = html.Div([ html.Div([
from sys import argv
our_port = argv[1] 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: # Обновление нашего порта (зачем?)
# Боковая панель @callback(Output('our_port', 'children'),
with ph.container(): Input('interval-component', 'n_intervals'))
# Столбцы для элементов def update_our_port(n):
sidebar, space, main = st.columns([60, 10, 90]) 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() res = []
if 'ports' in conf: for i in next(walk('cached/'), (None, None, []))[1]:
ports = conf['ports'] conf = read(f'cached/{i}/config.json')
for i in ports: res.append(html.Div([ dcc.Link(children=i, href=f'http://{i}',
st.warning(f"{i}") target='_blank') ], className='sites_elem'))
return res
with main: # Обновление доступных сайтов в поиске
# Получаем все сайты @callback(Output('search', 'options'),
sites = next(walk('cached/'), (None, None, []))[1] 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: #app.run(debug=True, port = 5555)
addr = f"http://127.0.0.1:8000/{i}" app.run(debug=False, host = '0.0.0.0', port = 5555)
st.info(f"[{i}]({addr})")
sleep(3)
ph.empty()
st.rerun()
+49 -34
View File
@@ -1,71 +1,86 @@
from os import system, name from os import system, name
from threading import Thread
from time import sleep from time import sleep
from threading import Thread
from multiprocessing import Process
from network import * from network import *
from updater import * from updater import *
from proxy import *
from web_proxy import *
from status import *
from db import *
#
# Здесь общий запуск всех файлов и команд # Здесь общий запуск всех файлов и команд
#
def main():
# Проверка обновлений # Проверка обновлений
from sys import argv from sys import argv
if len(argv) == 1: if len(argv) == 1:
print("Проверка обновлений...") print('Проверка обновлений...')
system("git pull") system('git pull')
print("Перезагрузка скрипта...") print('Перезагрузка скрипта...')
system("python main.py updated") system('python main.py updated')
exit() exit()
print("\nУспешно перезагружено!") print('\nУспешно перезагружено!')
from proxy import *
# Запуск прокси для сервисов
# проксируем http сервер
http_port = port_gen() http_port = port_gen()
print(f"HTTP: {http_port}") print(f'HTTP: {http_port}')
rp_http = Thread(target = watch_http, args=(http_port,)) rp_http = Thread(target = watch_http, args=(http_port,))
rp_http.daemon = True
rp_http.start() rp_http.start()
# проксируем сервер обработки запросов
serv_port = port_gen() serv_port = port_gen()
print(f"SERV: {serv_port}") print(f'SERV: {serv_port}')
rp_serv = Thread(target = watch_serv, args=(serv_port,)) rp_serv = Thread(target = watch_serv, args=(serv_port,))
rp_serv.daemon = True
rp_serv.start() rp_serv.start()
# Загружаем порт в конфиг
conf = read()
conf['our_port'] = serv_port
write(conf)
# Стартуем сервисы # Стартуем сервисы
# http сервер # http сервер
http = Thread(target = server_http) http = Thread(target = server_http)
http.daemon = True
http.start() http.start()
# сервер для пинга # Cервер обработки запросов
server = Thread(target = server, args=(http_port,)) srv = Thread(target = server, args=(http_port,))
server.daemon = True srv.start()
server.start() # Прокси для браузера
http_proxy = Thread(target = web_proxy)
http_proxy.start()
# Стартуем авто-поиск портов и авто-обновление сайтов # Стартуем авто-поиск портов и авто-обновление сайтов
updater = Thread(target = update_demon, args=(serv_port,)) updater = Thread(target = update_demon, args=(serv_port,))
updater.daemon = True
updater.start() updater.start()
# Стартуем интерфейс # Стартуем интерфейс
system(f"python -m streamlit run --server.address=127.0.0.1 interface.py {serv_port}") system('python interface.py')
if __name__ == '__main__':
# Запускаем главный процесс, чтобы потом легко убить его
p = Process(target=main)
p.start()
while True: status_set('work') # Устанавливаем статус, что программа работает
st = status_check()
while st:
try: try:
pass st = status_check()
except: sleep(0.01)
except KeyboardInterrupt:
p.terminate()
exit() exit()
except:
pass
#print(client(8000, "ping")) # Когда послан код завершения
#ports = port_check(serv_port) p.terminate()
#print(ports) exit()
#print(client(4015, "ping"))
#print(client(4137, "is_just.jet"))
#client(4092, "publish_just.jet<>4066")
+24 -16
View File
@@ -13,6 +13,9 @@ from db import read
from json import loads from json import loads
# Логирование ошибок # Логирование ошибок
import logging import logging
# Просто логирование
from icecream import ic
ic.disable() # Отключение логирования
from verify import * from verify import *
from domain_check import * from domain_check import *
@@ -36,11 +39,14 @@ def port_gen(st = 25000, end = 25200):
return port return port
def server_http(): def server_http():
while True: run = True
while run == True:
try: try:
os.system("python -m http.server --directory cached") os.system("python -m http.server --directory cached")
except KeyboardInterrupt:
run = False
except Exception as e: except Exception as e:
print("SERVER_HTTP FALLED") ic("SERVER_HTTP FALLED")
logging.critical(e, exc_info=True) logging.critical(e, exc_info=True)
def server(http_port): def server(http_port):
@@ -56,7 +62,7 @@ def server(http_port):
s.listen(2) s.listen(2)
conn, address = s.accept() conn, address = s.accept()
print("Connection from: " + str(address)) ic("Connection from: " + str(address))
while True: while True:
try: try:
@@ -79,11 +85,10 @@ def server(http_port):
conn.send("not_exist".encode()) conn.send("not_exist".encode())
elif op[:8] == "publish_": elif op[:8] == "publish_":
data = op[8:] data = op[8:]
site, port = data.split("<>") site, u_port = data.split("<>")
site = domain_ok(site) if domain_ok(site):
if site:
conn.send("accepted".encode()) conn.send("accepted".encode())
client(port, f"get_{site}") client(u_port, f"get_{site}")
elif op == "check_all": elif op == "check_all":
try: try:
sites = next(os.walk('cached/'), (None, None, []))[1] sites = next(os.walk('cached/'), (None, None, []))[1]
@@ -102,7 +107,7 @@ def server(http_port):
conn.close() conn.close()
except Exception as e: except Exception as e:
print("SERVER_HTTP FALLED") ic("SERVER_HTTP FALLED")
logging.critical(e, exc_info=True) logging.critical(e, exc_info=True)
@@ -118,11 +123,11 @@ def recv(s, data_out):
okay = True okay = True
except: except:
pass pass
print(data) ic(data)
data_out.put(data) data_out.put(data)
# op = operation # op = operation
def client(port, op = "ping", host = 'jetwork.404.mn'): def client(port, op = "ping", host = 'bore.del.pw'):
# Если порт не определён # Если порт не определён
if not port: if not port:
return None return None
@@ -171,8 +176,11 @@ def client(port, op = "ping", host = 'jetwork.404.mn'):
return "old" return "old"
# Скачиваем файлы # Скачиваем файлы
try:
g_site = get(f"http://{host}:{str(port)}/{site}.zip") 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: with open(f"verify/{site}.zip", "wb") as f:
f.write(g_site.content) f.write(g_site.content)
@@ -209,10 +217,10 @@ def client(port, op = "ping", host = 'jetwork.404.mn'):
our_ver = our_conf["ver"] our_ver = our_conf["ver"]
# Если версия не новее - злоумышленник # Если версия не новее - злоумышленник
if our_ver >= dest_ver: if our_ver >= dest_ver:
print("[!] Обнаружена подмена версии сайта.") ic("[!] Обнаружена подмена версии сайта.")
# Сохраняем ключ злоумышленника # Сохраняем ключ злоумышленника
os.replace(f"verify/{site}.pem", f"verify/{site}.pem.FAKE") 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}.zip")
os.remove(f"verify/{site}.sig") 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}") copytree(f"verify/{site}", f"cached/{site}")
rmtree(f"verify/{site}") rmtree(f"verify/{site}")
else: else:
print("[!] Обнаружена подмена сайта.") ic("[!] Обнаружена подмена сайта.")
# Сохраняем ключ злоумышленника # Сохраняем ключ злоумышленника
os.replace(f"verify/{site}.pem", f"verify/{site}.pem.FAKE") os.replace(f"verify/{site}.pem", f"verify/{site}.pem.FAKE")
print(f"[!] Порт злоумышленника: {port}") ic(f"[!] Порт злоумышленника: {port}")
print(f"[!] Ключ (вероятно) злоумышленника сохранён в verify/{site}.pem.FAKE\n") ic(f"[!] Ключ (вероятно) злоумышленника сохранён в verify/{site}.pem.FAKE\n")
# Удаляем фальшивые файлы # Удаляем фальшивые файлы
os.remove(f"verify/{site}.zip") os.remove(f"verify/{site}.zip")
os.remove(f"verify/{site}.sig") 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(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 threading import Thread
from time import sleep from time import sleep
from status import *
from db import read
global http_out ; http_out = None global http_out ; http_out = None
def proxy_http(port): def proxy_http(port):
global http_out global http_out
if name == "posix": os = read()['os']
http_out = system(f"./bore local 8000 --to bore.pub --port {port}") if os == 'Linux':
elif name == "nt": http_out = system(f'./bore local 8000 --to bore.del.pw --port {port}')
http_out = system(f"bore local 8000 --to bore.pub --port {port}") elif os == 'Windows' or os == 'Android':
http_out = system(f'bore local 8000 --to bore.del.pw --port {port}')
global serv_out ; serv_out = None global serv_out ; serv_out = None
def proxy_serv(port): def proxy_serv(port):
global serv_out global serv_out
if name == "posix": os = read()['os']
http_out = system(f"./bore local 8001 --to bore.pub --port {port}") if os == 'Linux':
elif name == "nt": http_out = system(f'./bore local 8001 --to bore.del.pw --port {port}')
http_out = system(f"bore local 8001 --to bore.pub --port {port}") elif os == 'Windows' or os == 'Android':
http_out = system(f'bore local 8001 --to bore.del.pw --port {port}')
def watch_http(port): def watch_http(port):
@@ -24,13 +29,15 @@ def watch_http(port):
run.start() run.start()
global http_out global http_out
while True: st = status_check()
while st:
# Если команда вышла # Если команда вышла
if http_out or not run.is_alive(): if http_out or not run.is_alive():
run.join(1) run.join(1)
http_out = None http_out = None
run = Thread(target=proxy_http, args=(port,)) run = Thread(target=proxy_http, args=(port,))
run.start() run.start()
st = status_check()
sleep(1) sleep(1)
def watch_serv(port): def watch_serv(port):
@@ -38,10 +45,12 @@ def watch_serv(port):
run.start() run.start()
global serv_out global serv_out
while True: st = status_check()
while st:
if serv_out or not run.is_alive(): if serv_out or not run.is_alive():
run.join(1) run.join(1)
serv_out = None serv_out = None
run = Thread(target=proxy_serv, args=(port,)) run = Thread(target=proxy_serv, args=(port,))
run.start() run.start()
st = status_check()
sleep(1) sleep(1)
+2 -1
View File
@@ -1,4 +1,5 @@
cryptography cryptography
requests requests
tqdm 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 urllib.request import urlretrieve as download
from db import * from db import *
config = {}
# Устанавливаем зависимости print('''1. Linux
system("pip install -r requirements.txt") 2. Windows
3. Android (Termux)''')
raw_os = input('ОС установки >> ')
oses = {'1': 'Linux', '2': 'Windows', '3': 'Android'}
os = oses[raw_os]
# Скачиваем bore (для проброса портов) # Записываем ОС в конфиг
if name == "posix": conf = read()
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") conf['os'] = os
system("tar -zxvf bore.tar.gz") write(conf)
system("rm -rf bore.tar.gz")
import getpass if os == 'Android':
user = getpass.getuser() print('''---
Устанавливаем зависимости rust...
---''')
system('pkg install rust')
system("mkdir ~/.streamlit") print('''---
with open(f"/home/{user}/.streamlit/credentials.toml", "w") as f: [1/3] Устанавливаем зависимости Python...
f.write('[general]\nemail = "a@a.a"') ---''')
f.close() system('pip install -r requirements.txt')
elif name == "nt":
print('''---
[2/3] Скачиваем обратный прокси...
---''')
if os == 'Linux':
download('https://github.com/ekzhang/bore/releases/download/v0.5.0/bore-v0.5.0-x86_64-unknown-linux-musl.tar.gz', 'bore.tar.gz')
system('tar -zxvf bore.tar.gz')
system('rm -rf bore.tar.gz')
elif os == 'Windows':
from shutil import unpack_archive as unpack from shutil import unpack_archive as unpack
download("https://github.com/ekzhang/bore/releases/download/v0.5.0/bore-v0.5.0-x86_64-pc-windows-msvc.zip", "bore.zip") download('https://github.com/ekzhang/bore/releases/download/v0.5.0/bore-v0.5.0-x86_64-pc-windows-msvc.zip', 'bore.zip')
unpack("bore.zip") unpack('bore.zip')
system("del bore.zip") system('del bore.zip')
elif os == 'Android':
system("mkdir C:\\Users\\windows\\.streamlit") system('pkg install bore')
with open("C:\\Users\\windows\\.streamlit\\credentials.toml", "w") as f:
f.write('[general]\nemail = "a@a.a"')
f.close()
else: else:
print("Увы, вероятно Ваша ОС не поддерживается.") print('Увы, вероятно Ваша ОС не поддерживается.')
print("Завершение работы...") print('Завершение работы...')
exit() exit()
# Создаём папку для кэшированных сайтов print('''---
system("mkdir cached") [3/3] Создаём папки для работы...
system("mkdir verify") ---''')
system("mkdir mysites") system('mkdir cached')
system('mkdir verify')
print("Максимальный размер для кэшированных файлов. (в гигабайтах)") system('mkdir mysites')
print("Укажите 0 для отключения ограничения.")
max = input(">> ")
# TODO
#print('Максимальный размер для кэшированных файлов. (в гигабайтах)')
#print('Укажите 0 для отключения ограничения.')
#max = input('>> ')
# Записываем в конфиг # Записываем в конфиг
config["max"] = max #config['max'] = max
write(config) #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 db import *
from shutil import copyfile, make_archive, rmtree, copytree from shutil import copyfile, make_archive, rmtree, copytree
from tqdm import tqdm from tqdm import tqdm
@@ -6,176 +6,171 @@ from time import sleep
from verify import * from verify import *
from network import * from network import *
from domain_check import domain_list
print("(1) Создать сайт") def your_sites():
print("(2) Обновить сайт") sites = {}; num = 1
print("(3) Сменить тип") for i in next(walk('cached/'), (None, None, []))[1]:
print("(4) Авто-раздача сайта") sites[str(num)] = i
print("Enter для просто публикации.") print(f'{str(num)}. {i}')
num += 1
return sites
op = input(">> ") print('(1) Создать сайт')
print('(2) Обновить сайт')
print('(3) Сменить тип')
print('(4) Авто-раздача сайта')
print('Enter для просто публикации.')
if op == "1": op = input('>> ')
if op == '1':
from domain_check import * from domain_check import *
print("\nДомены: .jet, .jw, .404, .dash, .awesome, .mirror") print(f'\nДоступные 1 lvl домены: {domain_list()}')
domain = input("Домен сайта: ") domain = input('Домен сайта: ')
if not domain_ok(domain): if not domain_ok(domain):
print("Неправильный формат или домен.") print('Неправильный формат или домен.')
exit() exit()
print("\n(1) Статичный / (2) Динамический") print('\n(1) Статичный / (2) Динамический')
type = input("Тип: ") type = input('Тип: ')
# Создаём папку и ключи для подписи # Создаём папку и ключи для подписи
mkdir(f"mysites/{domain}") mkdir(f'mysites/{domain}')
key_gen(f"mysites/{domain}") key_gen(f'mysites/{domain}')
if type == "1": if type == '1':
conf = {"type": "static", "ver": 1} conf = {'type': 'static', 'ver': 1}
print("ПРИМЕЧАНИЕ: index.html обязателен.") print('\nПРИМЕЧАНИЕ: index.html обязателен.')
elif type == "2":
port = input("Порт сервера: ")
conf = {"type": "dynamic", "ver": 1, "port": int(port)}
write(conf, f"mysites/{domain}/config.json")
if type == "1":
# Создаём index.html для загрузки сайта # Создаём index.html для загрузки сайта
with open(f"mysites/{domain}/index.html", "w") as f: with open(f'mysites/{domain}/index.html', 'w') as f:
f.write("<h1> Hello jetwork! </h1>") f.write('<h1> Hello jetwork! </h1>')
f.close() f.close()
elif type == '2':
port = input('Порт сервера: ')
conf = {'type': 'dynamic', 'ver': 1, 'port': int(port)}
write(conf, f'mysites/{domain}/config.json')
# Архивируем и создаём сигнатуру для подтверждения неизменности архива # Архивируем и создаём сигнатуру для подтверждения неизменности архива
make_archive(f"mysites/{domain}", "zip", f"mysites/{domain}") make_archive(f'mysites/{domain}', 'zip', f'mysites/{domain}')
sign(f"mysites/{domain}.zip", f"mysites/{domain}.key", f"mysites/{domain}") sign(f'mysites/{domain}.zip', f'mysites/{domain}.key', f'mysites/{domain}')
elif op == "2": elif op == '2':
domain = input("\nДомен сайта: ") print()
if not os.path.exists(f"mysites/{domain}"): sites = your_sites()
print("Не существует такого сайта.")
exit()
conf = read(f"mysites/{domain}/config.json") domain = sites[input('Домен сайта: ')]
type = conf["type"]
if type == "dynamic": conf = read(f'mysites/{domain}/config.json')
port = input("Порт сервера: ") type = conf['type']
conf["port"] = port if type == 'dynamic':
write(conf, f"mysites/{domain}/config.json") port = input('Порт сервера: ')
conf['port'] = port
write(conf, f'mysites/{domain}/config.json')
# Обновляем версию # Обновляем версию
conf = read(f"mysites/{domain}/config.json") conf = read(f'mysites/{domain}/config.json')
conf["ver"] = conf["ver"] + 1 conf['ver'] = conf['ver'] + 1
write(conf, f"mysites/{domain}/config.json") write(conf, f'mysites/{domain}/config.json')
# Архивируем и создаём сигнатуру для подтверждения неизменности архива # Архивируем и создаём сигнатуру для подтверждения неизменности архива
make_archive(f"mysites/{domain}", "zip", f"mysites/{domain}") make_archive(f'mysites/{domain}', 'zip', f'mysites/{domain}')
sign(f"mysites/{domain}.zip", f"mysites/{domain}.key", f"mysites/{domain}") sign(f'mysites/{domain}.zip', f'mysites/{domain}.key', f'mysites/{domain}')
elif op == "3": elif op == '3':
from os import rmdir from os import rmdir
domain = input("\nДомен сайта: ") print()
if not os.path.exists(f"mysites/{domain}"): sites = your_sites()
print("Не существует такого сайта.") domain = sites[input('Домен сайта: ')]
exit()
print("\n(1) Статичный / (2) Динамический") print('\n(1) Статичный / (2) Динамический')
type = input("Тип: ") type = input('Тип: ')
if type == "1": if type == '1':
conf = read(f"mysites/{domain}/config.json") conf = read(f'mysites/{domain}/config.json')
conf["type"] = "static" conf['type'] = 'static'
conf.pop("port") conf.pop('port')
with open(f"mysites/{domain}/index.html", "w") as f: with open(f'mysites/{domain}/index.html', 'w') as f:
f.write("<h1> Hello jetwork! </h1>") f.write('<h1> Hello jetwork! </h1>')
f.close() f.close()
elif type == "2": elif type == '2':
conf = read(f"mysites/{domain}/config.json") conf = read(f'mysites/{domain}/config.json')
port = input("Порт сервера: ") port = input('Порт сервера: ')
clean = input("Удалить все лишние файлы сайта (y/n): ") clean = input('Удалить все лишние файлы сайта (y/n): ')
if clean == "y": if clean == 'y':
# Удаляем папку, сохраняем конфиг и копируем публичный ключ # Удаляем папку, сохраняем конфиг и копируем публичный ключ
rmtree(f"mysites/{domain}") rmtree(f'mysites/{domain}')
sleep(0.1) sleep(0.1)
system(f"mkdir mysites/{domain}") system(f'mkdir mysites/{domain}')
conf["type"] = "dynamic" conf['type'] = 'dynamic'
conf["port"] = int(port) conf['port'] = int(port)
write(conf, f"mysites/{domain}/config.json") write(conf, f'mysites/{domain}/config.json')
# Обновляем версию # Обновляем версию
conf = read(f"mysites/{domain}/config.json") conf = read(f'mysites/{domain}/config.json')
conf["ver"] = conf["ver"] + 1 conf['ver'] = conf['ver'] + 1
write(conf, f"mysites/{domain}/config.json") write(conf, f'mysites/{domain}/config.json')
# Архивируем и создаём сигнатуру для подтверждения неизменности архива # Архивируем и создаём сигнатуру для подтверждения неизменности архива
make_archive(f"mysites/{domain}", "zip", f"mysites/{domain}") make_archive(f'mysites/{domain}', 'zip', f'mysites/{domain}')
sign(f"mysites/{domain}.zip", f"mysites/{domain}.key", f"mysites/{domain}") sign(f'mysites/{domain}.zip', f'mysites/{domain}.key', f'mysites/{domain}')
elif op == "4": elif op == '4':
domain = input("\nДомен сайта: ") print()
if not os.path.exists(f"mysites/{domain}"): sites = your_sites()
print("Не существует такого сайта.") domain = sites[input('Домен сайта: ')]
exit()
print("\nВведите ваш порт сервера (при запуске main.py)") serv_port = int( read()['our_port'] )
serv_port = int(input(">> ")) http_port = client(serv_port, f'is_{domain}')
http_port = client(serv_port, f"is_{domain}")
print("\nСтарт вечной раздачи...") print('\nСтарт вечной раздачи...')
while True: while True:
ports = port_check(serv_port) ports = port_check(serv_port)
sleep(1) sleep(1)
for port in tqdm(ports): for port in tqdm(ports):
client(port, f"publish_{domain}<>{http_port}") client(port, f'publish_{domain}<>{http_port}')
sleep(5) sleep(5)
elif op == "": host = 'bore.del.pw'
domain = input("\nДомен сайта: ") # Проверяем тип сайта
if not os.path.exists(f"mysites/{domain}"): type = read(f'mysites//{domain}/config.json')['type']
print("Не существует такого сайта.") # Если динамический - вставляем спец страницу
exit() if type == 'dynamic':
pub = "y" port = read(f'mysites//{domain}/config.json')['port']
with open(f'mysites//{domain}/index.html', 'w') as f:
f.write(f"<iframe src='http://{host}:{port}' style='position:fixed; top:0; left:0; bottom:0; right:0; width:100%; height:100%; border:none; margin:0; padding:0; overflow:hidden; z-index:999999;'></iframe>")
f.close()
# Копируем файлы из mysites в cached # Копируем файлы из mysites в cached
try: try:
rmtree(f"cached/{domain}") rmtree(f'cached/{domain}')
except: except:
pass pass
copytree(f"mysites/{domain}", f"cached/{domain}") copytree(f'mysites/{domain}', f'cached/{domain}')
copyfile(f"mysites/{domain}.pem", f"cached/{domain}.pem") copyfile(f'mysites/{domain}.pem', f'cached/{domain}.pem')
copyfile(f"mysites/{domain}.sig", f"cached/{domain}.sig") copyfile(f'mysites/{domain}.sig', f'cached/{domain}.sig')
copyfile(f"mysites/{domain}.zip", f"cached/{domain}.zip") copyfile(f'mysites/{domain}.zip', f'cached/{domain}.zip')
host = "jetwork.404.mn" if op != '':
# Проверяем тип сайта print('\nОпубликовать сайт?')
type = read(f"cached/{domain}/config.json")["type"] pub = input('y/n >> ')
# Если динамический
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 pub == 'n':
if op != "":
print("Опубликовать сайт?")
pub = input("y/n >> ")
if pub == "n":
exit() exit()
print("Введите ваш порт сервера (при запуске main.py)") serv_port = int( read()['our_port'] )
serv_port = int(input(">> ")) http_port = client(serv_port, f'is_{domain}')
http_port = client(serv_port, f"is_{domain}")
print("Получаем все порты...") print('Получаем все порты...')
ports = port_check(serv_port) ports = port_check(serv_port)
print(ports) print(ports)
print("Публикуем сайт...") print('Публикуем сайт...')
for port in tqdm(ports): for port in tqdm(ports):
client(port, f"publish_{domain}<>{http_port}") client(port, f'publish_{domain}<>{http_port}')
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 import logging
# Просто логирование
from icecream import ic
ic.disable() # Отключение логирования
def update_demon(serv_port): def update_demon(serv_port):
while True: while True:
@@ -40,23 +43,23 @@ def update_demon(serv_port):
if check[0] == el: if check[0] == el:
# Сверяем версии # Сверяем версии
if check[1] >= ver: if check[1] >= ver:
print("Ver_ok: ", el) ic("Ver_ok: ", el)
pass pass
else: else:
# Если версия новее # Если версия новее
print("Ver_new: ", el) ic("Ver_new: ", el)
http_port = client(port, f"is_{el}") http_port = client(port, f"is_{el}")
client(http_port, f"get_{el}") client(http_port, f"get_{el}")
found = True found = True
break # Если нашли - выходим break # Если нашли - выходим
if not found: if not found:
print("Not_found: ", el) ic("Not_found: ", el)
http_port = client(port, f"is_{el}") http_port = client(port, f"is_{el}")
client(http_port, f"get_{el}") client(http_port, f"get_{el}")
except: except:
pass pass
except Exception as e: except Exception as e:
print("UPDATER FALLED") ic("UPDATER FALLED")
logging.critical(e, exc_info=True) 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()