mirror of
https://github.com/rustdesk/rustdesk-server.git
synced 2026-03-06 20:13:12 +08:00
Compare commits
33 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7bbed69ad2 | ||
|
|
d4b6e6ee28 | ||
|
|
b3fbb9e179 | ||
|
|
b44eb1bbc3 | ||
|
|
d88286642e | ||
|
|
74ff886900 | ||
|
|
9e716b3b7b | ||
|
|
bea99ae315 | ||
|
|
6068b5941c | ||
|
|
675bf3c1f5 | ||
|
|
dc81956d42 | ||
|
|
ffe736be17 | ||
|
|
b83dae4cc4 | ||
|
|
8d9203ecdb | ||
|
|
13321b5a90 | ||
|
|
0a8c39c11f | ||
|
|
7dd812c79a | ||
|
|
9d524443ec | ||
|
|
35a192a478 | ||
|
|
2f4235a968 | ||
|
|
12b57238d2 | ||
|
|
fe805e8554 | ||
|
|
4d6d439b1a | ||
|
|
ec202209f3 | ||
|
|
49f10a288d | ||
|
|
986d16eb2d | ||
|
|
4fd83deaf1 | ||
|
|
85150127bb | ||
|
|
26d8c13fe4 | ||
|
|
388ae586ec | ||
|
|
6ad923d519 | ||
|
|
fe661fe067 | ||
|
|
ad40d65070 |
8
.cargo/config.toml
Normal file
8
.cargo/config.toml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[target.x86_64-pc-windows-msvc]
|
||||||
|
rustflags = ["-Ctarget-feature=+crt-static"]
|
||||||
|
[target.i686-pc-windows-msvc]
|
||||||
|
rustflags = ["-Ctarget-feature=+crt-static"]
|
||||||
|
[target.'cfg(target_os="macos")']
|
||||||
|
rustflags = [
|
||||||
|
"-C", "link-args=-sectcreate __CGPreLoginApp __cgpreloginapp /dev/null",
|
||||||
|
]
|
||||||
21
.github/workflows/build.yaml
vendored
21
.github/workflows/build.yaml
vendored
@@ -26,7 +26,7 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
|
|
||||||
name: Build - ${{ matrix.job.name }}
|
name: Build - ${{ matrix.job.name }}
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-20.04
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -35,6 +35,7 @@ jobs:
|
|||||||
- { name: "arm64v8", target: "aarch64-unknown-linux-musl" }
|
- { name: "arm64v8", target: "aarch64-unknown-linux-musl" }
|
||||||
- { name: "armv7", target: "armv7-unknown-linux-musleabihf" }
|
- { name: "armv7", target: "armv7-unknown-linux-musleabihf" }
|
||||||
- { name: "i386", target: "i686-unknown-linux-musl" }
|
- { name: "i386", target: "i686-unknown-linux-musl" }
|
||||||
|
- { name: "amd64fb", target: "x86_64-unknown-freebsd" }
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
@@ -44,7 +45,7 @@ jobs:
|
|||||||
- name: Install toolchain
|
- name: Install toolchain
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
toolchain: "1.62"
|
toolchain: "1.67.1"
|
||||||
override: true
|
override: true
|
||||||
default: true
|
default: true
|
||||||
components: rustfmt
|
components: rustfmt
|
||||||
@@ -105,6 +106,11 @@ jobs:
|
|||||||
scoop bucket add extras
|
scoop bucket add extras
|
||||||
scoop install nsis
|
scoop install nsis
|
||||||
|
|
||||||
|
- name: Install Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
|
|
||||||
- name: Sign exe files
|
- name: Sign exe files
|
||||||
uses: GermanBluefox/code-sign-action@v7
|
uses: GermanBluefox/code-sign-action@v7
|
||||||
with:
|
with:
|
||||||
@@ -114,6 +120,12 @@ jobs:
|
|||||||
folder: 'target\x86_64-pc-windows-msvc\release'
|
folder: 'target\x86_64-pc-windows-msvc\release'
|
||||||
recursive: false
|
recursive: false
|
||||||
|
|
||||||
|
- name: Build UI browser file
|
||||||
|
run: |
|
||||||
|
npm i
|
||||||
|
npm run build
|
||||||
|
working-directory: ./ui/html
|
||||||
|
|
||||||
- name: Build UI setup file
|
- name: Build UI setup file
|
||||||
run: |
|
run: |
|
||||||
rustup default nightly
|
rustup default nightly
|
||||||
@@ -154,7 +166,7 @@ jobs:
|
|||||||
needs:
|
needs:
|
||||||
- build
|
- build
|
||||||
- build-win
|
- build-win
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-20.04
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -163,8 +175,9 @@ jobs:
|
|||||||
- { os: "linux", name: "arm64v8" }
|
- { os: "linux", name: "arm64v8" }
|
||||||
- { os: "linux", name: "armv7" }
|
- { os: "linux", name: "armv7" }
|
||||||
- { os: "linux", name: "i386" }
|
- { os: "linux", name: "i386" }
|
||||||
|
- { os: "linux", name: "amd64fb" }
|
||||||
- { os: "windows", name: "x86_64" }
|
- { os: "windows", name: "x86_64" }
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Download binaries (${{ matrix.job.os }} - ${{ matrix.job.name }})
|
- name: Download binaries (${{ matrix.job.os }} - ${{ matrix.job.name }})
|
||||||
|
|||||||
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -785,7 +785,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hbbs"
|
name = "hbbs"
|
||||||
version = "1.1.7"
|
version = "1.1.7-1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-speed-limit",
|
"async-speed-limit",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "hbbs"
|
name = "hbbs"
|
||||||
version = "1.1.7"
|
version = "1.1.7-1"
|
||||||
authors = ["open-trade <info@rustdesk.com>"]
|
authors = ["rustdesk <info@rustdesk.com>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
default-run = "hbbs"
|
default-run = "hbbs"
|
||||||
@@ -48,7 +48,7 @@ tower-http = { version = "0.3", features = ["fs", "trace", "cors"] }
|
|||||||
http = "0.2"
|
http = "0.2"
|
||||||
flexi_logger = { version = "0.22", features = ["async", "use_chrono_for_offset"] }
|
flexi_logger = { version = "0.22", features = ["async", "use_chrono_for_offset"] }
|
||||||
ipnetwork = "0.20"
|
ipnetwork = "0.20"
|
||||||
local-ip-address = "0.4"
|
local-ip-address = "0.5.1"
|
||||||
dns-lookup = "1.0.8"
|
dns-lookup = "1.0.8"
|
||||||
ping = "0.4.0"
|
ping = "0.4.0"
|
||||||
|
|
||||||
|
|||||||
335
README-NL.md
Normal file
335
README-NL.md
Normal file
@@ -0,0 +1,335 @@
|
|||||||
|
# RustDesk Server Programa
|
||||||
|
|
||||||
|
[](https://github.com/rustdesk/rustdesk-server/actions/workflows/build.yaml)
|
||||||
|
|
||||||
|
[**Download**](https://github.com/rustdesk/rustdesk-server/releases)
|
||||||
|
|
||||||
|
[**Handleiding**](https://rustdesk.com/docs/nl/self-host/)
|
||||||
|
|
||||||
|
[**FAQ**](https://github.com/rustdesk/rustdesk/wiki/FAQ)
|
||||||
|
|
||||||
|
Zelf uw eigen RustDesk server hosten, het is gratis en open source.
|
||||||
|
|
||||||
|
## Hoe handmatig opbouwen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo build --release
|
||||||
|
```
|
||||||
|
|
||||||
|
In target/release worden drie uitvoerbare bestanden gegenereerd.
|
||||||
|
|
||||||
|
- hbbs - RustDesk ID/Rendezvous server
|
||||||
|
- hbbr - RustDesk relay server
|
||||||
|
- rustdesk-utils - RustDesk CLI hulpprogramma's
|
||||||
|
|
||||||
|
U kunt bijgewerkte binaries vinden op [releases](https://github.com/rustdesk/rustdesk-server/releases) pagina.
|
||||||
|
|
||||||
|
Als u uw eigen server wilt ontwikkelen, is [rustdesk-server-demo](https://github.com/rustdesk/rustdesk-server-demo) misschien een betere en eenvoudigere start voor u dan deze repo.
|
||||||
|
|
||||||
|
## Docker bestanden (images)
|
||||||
|
|
||||||
|
Docker bestanden (images) worden automatisch gegenereerd en gepubliceerd bij elke github release. We hebben 2 soorten bestanden (images).
|
||||||
|
|
||||||
|
### Klassiek bestand (image)
|
||||||
|
|
||||||
|
Deze bestanden (images) zijn gebouwd voor `ubuntu-20.04` met als enige toevoeging de belangrijkste binaries (`hbbr` en `hbbs`). Ze zijn beschikbaar op [Docker hub](https://hub.docker.com/r/rustdesk/rustdesk-server/) met deze tags:
|
||||||
|
|
||||||
|
| architectuur | image:tag |
|
||||||
|
| --- | --- |
|
||||||
|
| amd64 | `rustdesk/rustdesk-server:latest` |
|
||||||
|
| arm64v8 | `rustdesk/rustdesk-server:latest-arm64v8` |
|
||||||
|
|
||||||
|
U kunt deze bestanden (images) direct starten via `docker run` met deze commando's:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --name hbbs --net=host -v "$PWD/data:/root" -d rustdesk/rustdesk-server:latest hbbs -r <relay-server-ip[:port]>
|
||||||
|
docker run --name hbbr --net=host -v "$PWD/data:/root" -d rustdesk/rustdesk-server:latest hbbr
|
||||||
|
```
|
||||||
|
|
||||||
|
of zonder --net=host, maar een directe P2P verbinding zal niet werken.
|
||||||
|
|
||||||
|
Voor systemen die SELinux gebruiken is het vervangen van `/root` door `/root:z` nodig om de containers correct te laten draaien. Als alternatief kan SELinux containerscheiding volledig worden uitgeschakeld door de optie `--security-opt label=disable` toe te voegen.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --name hbbs -p 21115:21115 -p 21116:21116 -p 21116:21116/udp -p 21118:21118 -v "$PWD/data:/root" -d rustdesk/rustdesk-server:latest hbbs -r <relay-server-ip[:port]>
|
||||||
|
docker run --name hbbr -p 21117:21117 -p 21119:21119 -v "$PWD/data:/root" -d rustdesk/rustdesk-server:latest hbbr
|
||||||
|
```
|
||||||
|
|
||||||
|
De `relay-server-ip` parameter is het IP adres (of dns naam) van de server waarop deze containers draaien. De **optionele** `port` parameter moet gebruikt worden als je een andere poort dan **21117** gebruikt voor `hbbr`.
|
||||||
|
|
||||||
|
U kunt ook docker-compose gebruiken, met deze configuratie als sjabloon:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
version: '3'
|
||||||
|
|
||||||
|
networks:
|
||||||
|
rustdesk-net:
|
||||||
|
external: false
|
||||||
|
|
||||||
|
services:
|
||||||
|
hbbs:
|
||||||
|
container_name: hbbs
|
||||||
|
ports:
|
||||||
|
- 21115:21115
|
||||||
|
- 21116:21116
|
||||||
|
- 21116:21116/udp
|
||||||
|
- 21118:21118
|
||||||
|
image: rustdesk/rustdesk-server:latest
|
||||||
|
command: hbbs -r rustdesk.example.com:21117
|
||||||
|
volumes:
|
||||||
|
- ./data:/root
|
||||||
|
networks:
|
||||||
|
- rustdesk-net
|
||||||
|
depends_on:
|
||||||
|
- hbbr
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
hbbr:
|
||||||
|
container_name: hbbr
|
||||||
|
ports:
|
||||||
|
- 21117:21117
|
||||||
|
- 21119:21119
|
||||||
|
image: rustdesk/rustdesk-server:latest
|
||||||
|
command: hbbr
|
||||||
|
volumes:
|
||||||
|
- ./data:/root
|
||||||
|
networks:
|
||||||
|
- rustdesk-net
|
||||||
|
restart: unless-stopped
|
||||||
|
```
|
||||||
|
|
||||||
|
Bewerk regel 16 om te verwijzen naar uw relais-server (degene die luistert op poort 21117). U kunt ook de inhoudsregels (L18 en L33) bewerken indien nodig.
|
||||||
|
|
||||||
|
(docker-compose erkenning gaat naar @lukebarone en @QuiGonLeong)
|
||||||
|
|
||||||
|
## S6-overlay gebaseerde bestanden
|
||||||
|
|
||||||
|
Deze bestanden (images) zijn gebouwd tegen `busybox:stable` met toevoeging van de binaries (zowel hbbr als hbbs) en [S6-overlay](https://github.com/just-containers/s6-overlay). Ze zijn beschikbaar op [Docker hub](https://hub.docker.com/r/rustdesk/rustdesk-server-s6/) met deze tags:
|
||||||
|
|
||||||
|
| architectuur | versie | image:tag |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| multiarch | latest | `rustdesk/rustdesk-server-s6:latest` |
|
||||||
|
| amd64 | latest | `rustdesk/rustdesk-server-s6:latest-amd64` |
|
||||||
|
| i386 | latest | `rustdesk/rustdesk-server-s6:latest-i386` |
|
||||||
|
| arm64v8 | latest | `rustdesk/rustdesk-server-s6:latest-arm64v8` |
|
||||||
|
| armv7 | latest | `rustdesk/rustdesk-server-s6:latest-armv7` |
|
||||||
|
| multiarch | 2 | `rustdesk/rustdesk-server-s6:2` |
|
||||||
|
| amd64 | 2 | `rustdesk/rustdesk-server-s6:2-amd64` |
|
||||||
|
| i386 | 2 | `rustdesk/rustdesk-server-s6:2-i386` |
|
||||||
|
| arm64v8 | 2 | `rustdesk/rustdesk-server-s6:2-arm64v8` |
|
||||||
|
| armv7 | 2 | `rustdesk/rustdesk-server-s6:2-armv7` |
|
||||||
|
| multiarch | 2.0.0 | `rustdesk/rustdesk-server-s6:2.0.0` |
|
||||||
|
| amd64 | 2.0.0 | `rustdesk/rustdesk-server-s6:2.0.0-amd64` |
|
||||||
|
| i386 | 2.0.0 | `rustdesk/rustdesk-server-s6:2.0.0-i386` |
|
||||||
|
| arm64v8 | 2.0.0 | `rustdesk/rustdesk-server-s6:2.0.0-arm64v8` |
|
||||||
|
| armv7 | 2.0.0 | `rustdesk/rustdesk-server-s6:2.0.0-armv7` |
|
||||||
|
|
||||||
|
Je wordt sterk aangeraden om het `multiarch` bestand (image) te gebruiken met de `major version` of `latest` tag.
|
||||||
|
|
||||||
|
De S6-overlay fungeert als supervisor en houdt beide processen draaiende, dus met dit bestand (image) is het niet nodig om twee aparte draaiende containers te hebben.
|
||||||
|
|
||||||
|
U kunt deze bestanden (images) direct starten via `docker run` met dit commando:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --name rustdesk-server \
|
||||||
|
--net=host \
|
||||||
|
-e "RELAY=rustdeskrelay.example.com" \
|
||||||
|
-e "ENCRYPTED_ONLY=1" \
|
||||||
|
-v "$PWD/data:/data" -d rustdesk/rustdesk-server-s6:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
of zonder --net=host, maar een directe P2P verbinding zal niet werken.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --name rustdesk-server \
|
||||||
|
-p 21115:21115 -p 21116:21116 -p 21116:21116/udp \
|
||||||
|
-p 21117:21117 -p 21118:21118 -p 21119:21119 \
|
||||||
|
-e "RELAY=rustdeskrelay.example.com" \
|
||||||
|
-e "ENCRYPTED_ONLY=1" \
|
||||||
|
-v "$PWD/data:/data" -d rustdesk/rustdesk-server-s6:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
Of u kunt een docker-compose bestand gebruiken:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
version: '3'
|
||||||
|
|
||||||
|
services:
|
||||||
|
rustdesk-server:
|
||||||
|
container_name: rustdesk-server
|
||||||
|
ports:
|
||||||
|
- 21115:21115
|
||||||
|
- 21116:21116
|
||||||
|
- 21116:21116/udp
|
||||||
|
- 21117:21117
|
||||||
|
- 21118:21118
|
||||||
|
- 21119:21119
|
||||||
|
image: rustdesk/rustdesk-server-s6:latest
|
||||||
|
environment:
|
||||||
|
- "RELAY=rustdesk.example.com:21117"
|
||||||
|
- "ENCRYPTED_ONLY=1"
|
||||||
|
volumes:
|
||||||
|
- ./data:/data
|
||||||
|
restart: unless-stopped
|
||||||
|
```
|
||||||
|
|
||||||
|
Voor dit container bestand (image) kunt u deze omgevingsvariabelen gebruiken, **naast** de variabelen in de volgende **ENV-variabelen** sectie:
|
||||||
|
|
||||||
|
| variabele | optioneel | beschrijving |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| RELAY | no | het IP-adres/DNS-naam van de machine waarop deze container draait |
|
||||||
|
| ENCRYPTED_ONLY | yes | indien ingesteld op **"1"** wordt een niet-versleutelde verbinding niet geaccepteerd |
|
||||||
|
| KEY_PUB | yes | het openbare deel van het key paar |
|
||||||
|
| KEY_PRIV | yes | het private deel van het key paar |
|
||||||
|
|
||||||
|
### Geheim beheer in S6-overlay gebaseerde bestanden (images)
|
||||||
|
|
||||||
|
U kunt uiteraard het key paar bewaren in een docker volume, maar de optimale werkwijzen vertellen u om de keys niet op het bestandssysteem te schrijven; dus bieden we een paar opties.
|
||||||
|
|
||||||
|
Bij het opstarten van de container wordt de aanwezigheid van het key paar gecontroleerd (`/data/id_ed25519.pub` en `/data/id_ed25519`) en als een van deze keys niet bestaat, wordt deze opnieuw aangemaakt vanuit ENV variabelen of docker secrets.
|
||||||
|
Vervolgens wordt de geldigheid van het key paar gecontroleerd: indien publieke en private keys niet overeenkomen, stopt de container.
|
||||||
|
Als je geen keys opgeeft, zal `hbbs` er een voor je genereren en op de standaard locatie plaatsen.
|
||||||
|
|
||||||
|
#### Gebruik ENV om het key paar op te slaan
|
||||||
|
|
||||||
|
U kunt docker omgevingsvariabelen gebruiken om de keys op te slaan. Volg gewoon deze voorbeelden:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --name rustdesk-server \
|
||||||
|
--net=host \
|
||||||
|
-e "RELAY=rustdeskrelay.example.com" \
|
||||||
|
-e "ENCRYPTED_ONLY=1" \
|
||||||
|
-e "DB_URL=/db/db_v2.sqlite3" \
|
||||||
|
-e "KEY_PRIV=FR2j78IxfwJNR+HjLluQ2Nh7eEryEeIZCwiQDPVe+PaITKyShphHAsPLn7So0OqRs92nGvSRdFJnE2MSyrKTIQ==" \
|
||||||
|
-e "KEY_PUB=iEyskoaYRwLDy5+0qNDqkbPdpxr0kXRSZxNjEsqykyE=" \
|
||||||
|
-v "$PWD/db:/db" -d rustdesk/rustdesk-server-s6:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
version: '3'
|
||||||
|
|
||||||
|
services:
|
||||||
|
rustdesk-server:
|
||||||
|
container_name: rustdesk-server
|
||||||
|
ports:
|
||||||
|
- 21115:21115
|
||||||
|
- 21116:21116
|
||||||
|
- 21116:21116/udp
|
||||||
|
- 21117:21117
|
||||||
|
- 21118:21118
|
||||||
|
- 21119:21119
|
||||||
|
image: rustdesk/rustdesk-server-s6:latest
|
||||||
|
environment:
|
||||||
|
- "RELAY=rustdesk.example.com:21117"
|
||||||
|
- "ENCRYPTED_ONLY=1"
|
||||||
|
- "DB_URL=/db/db_v2.sqlite3"
|
||||||
|
- "KEY_PRIV=FR2j78IxfwJNR+HjLluQ2Nh7eEryEeIZCwiQDPVe+PaITKyShphHAsPLn7So0OqRs92nGvSRdFJnE2MSyrKTIQ=="
|
||||||
|
- "KEY_PUB=iEyskoaYRwLDy5+0qNDqkbPdpxr0kXRSZxNjEsqykyE="
|
||||||
|
volumes:
|
||||||
|
- ./db:/db
|
||||||
|
restart: unless-stopped
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Gebruik Docker secrets om het key paar op te slaan
|
||||||
|
|
||||||
|
U kunt ook docker secrets gebruiken om de keys op te slaan.
|
||||||
|
Dit is handig als je **docker-compose** of **docker swarm** gebruikt.
|
||||||
|
Volg deze voorbeelden:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat secrets/id_ed25519.pub | docker secret create key_pub -
|
||||||
|
cat secrets/id_ed25519 | docker secret create key_priv -
|
||||||
|
docker service create --name rustdesk-server \
|
||||||
|
--secret key_priv --secret key_pub \
|
||||||
|
--net=host \
|
||||||
|
-e "RELAY=rustdeskrelay.example.com" \
|
||||||
|
-e "ENCRYPTED_ONLY=1" \
|
||||||
|
-e "DB_URL=/db/db_v2.sqlite3" \
|
||||||
|
--mount "type=bind,source=$PWD/db,destination=/db" \
|
||||||
|
rustdesk/rustdesk-server-s6:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
version: '3'
|
||||||
|
|
||||||
|
services:
|
||||||
|
rustdesk-server:
|
||||||
|
container_name: rustdesk-server
|
||||||
|
ports:
|
||||||
|
- 21115:21115
|
||||||
|
- 21116:21116
|
||||||
|
- 21116:21116/udp
|
||||||
|
- 21117:21117
|
||||||
|
- 21118:21118
|
||||||
|
- 21119:21119
|
||||||
|
image: rustdesk/rustdesk-server-s6:latest
|
||||||
|
environment:
|
||||||
|
- "RELAY=rustdesk.example.com:21117"
|
||||||
|
- "ENCRYPTED_ONLY=1"
|
||||||
|
- "DB_URL=/db/db_v2.sqlite3"
|
||||||
|
volumes:
|
||||||
|
- ./db:/db
|
||||||
|
restart: unless-stopped
|
||||||
|
secrets:
|
||||||
|
- key_pub
|
||||||
|
- key_priv
|
||||||
|
|
||||||
|
secrets:
|
||||||
|
key_pub:
|
||||||
|
file: secrets/id_ed25519.pub
|
||||||
|
key_priv:
|
||||||
|
file: secrets/id_ed25519
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hoe maak je een key paar
|
||||||
|
|
||||||
|
Een key paar is nodig voor encryptie; u kunt het verstrekken, zoals eerder uitgelegd, maar u heeft een manier nodig om er een te maken.
|
||||||
|
|
||||||
|
U kunt dit commando gebruiken om een key paar te genereren:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/usr/bin/rustdesk-utils genkeypair
|
||||||
|
```
|
||||||
|
|
||||||
|
Als u het pakket `rustdesk-utils` niet op uw systeem hebt staan (of wilt), kunt u hetzelfde commando met docker uitvoeren:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --rm --entrypoint /usr/bin/rustdesk-utils rustdesk/rustdesk-server-s6:latest genkeypair
|
||||||
|
```
|
||||||
|
|
||||||
|
De uitvoer ziet er ongeveer zo uit:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Public Key: 8BLLhtzUBU/XKAH4mep3p+IX4DSApe7qbAwNH9nv4yA=
|
||||||
|
Secret Key: egAVd44u33ZEUIDTtksGcHeVeAwywarEdHmf99KM5ajwEsuG3NQFT9coAfiZ6nen4hfgNICl7upsDA0f2e/jIA==
|
||||||
|
```
|
||||||
|
|
||||||
|
## .deb pakketten
|
||||||
|
|
||||||
|
Voor elke binary zijn aparte .deb-pakketten beschikbaar, u kunt ze vinden in de [releases](https://github.com/rustdesk/rustdesk-server/releases).
|
||||||
|
Deze pakketten zijn bedoeld voor de volgende distributies:
|
||||||
|
|
||||||
|
- Ubuntu 22.04 LTS
|
||||||
|
- Ubuntu 20.04 LTS
|
||||||
|
- Ubuntu 18.04 LTS
|
||||||
|
- Debian 11 bullseye
|
||||||
|
- Debian 10 buster
|
||||||
|
|
||||||
|
## ENV variabelen
|
||||||
|
|
||||||
|
hbbs en hbbr kunnen worden geconfigureerd met deze ENV-variabelen.
|
||||||
|
U kunt de variabelen zoals gebruikelijk opgeven of een `.env` bestand gebruiken.
|
||||||
|
|
||||||
|
| variabele | binary | beschrijving |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| ALWAYS_USE_RELAY | hbbs | indien ingesteld op **"Y"** wordt directe peer-verbinding niet toegestaan |
|
||||||
|
| DB_URL | hbbs | path voor database bestand |
|
||||||
|
| DOWNGRADE_START_CHECK | hbbr | vertraging (in seconden) voor downgrade-controle |
|
||||||
|
| DOWNGRADE_THRESHOLD | hbbr | drempel van downgrade controle (bit/ms) |
|
||||||
|
| KEY | hbbs/hbbr | indien ingesteld forceert dit het gebruik van een specifieke toets, indien ingesteld op **"_"** forceert dit het gebruik van een willekeurige toets |
|
||||||
|
| LIMIT_SPEED | hbbr | snelheidslimiet (in Mb/s) |
|
||||||
|
| PORT | hbbs/hbbr | luister-poort (21116 voor hbbs - 21117 voor hbbr) |
|
||||||
|
| RELAY_SERVERS | hbbs | IP-adres/DNS-naam van de machines waarop hbbr draait (gescheiden door komma) |
|
||||||
|
| RUST_LOG | all | debug-niveau instellen (error|warn|info|debug|trace) |
|
||||||
|
| SINGLE_BANDWIDTH | hbbr | maximale bandbreedte voor een enkele verbinding (in Mb/s) |
|
||||||
|
| TOTAL_BANDWIDTH | hbbr | maximale totale bandbreedte (in Mb/s) |
|
||||||
66
rcd/rustdesk-hbbr
Normal file
66
rcd/rustdesk-hbbr
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# PROVIDE: rustdesk_hbbr
|
||||||
|
# REQUIRE: LOGIN
|
||||||
|
# KEYWORD: shutdown
|
||||||
|
#
|
||||||
|
# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
|
||||||
|
# to enable this service:
|
||||||
|
#
|
||||||
|
# rustdesk_hbbr_enable (bool): Set to NO by default.
|
||||||
|
# Set it to YES to enable nfs-exporter.
|
||||||
|
# rustdesk_hbbr_args (string): Set extra arguments to pass to nfs-exporter
|
||||||
|
# Default is "".
|
||||||
|
# rustdesk_hbbr_user (string): Set user that rustdesk_hbbr will run under
|
||||||
|
# Default is "root".
|
||||||
|
# rustdesk_hbbr_group (string): Set group that rustdesk_hbbr will run under
|
||||||
|
# Default is "wheel".
|
||||||
|
|
||||||
|
. /etc/rc.subr
|
||||||
|
|
||||||
|
name=rustdesk_hbbr
|
||||||
|
desc="Rustdesk Relay Server"
|
||||||
|
rcvar=rustdesk_hbbr_enable
|
||||||
|
|
||||||
|
load_rc_config $name
|
||||||
|
|
||||||
|
: ${rustdesk_hbbr_enable:=NO}
|
||||||
|
: ${rustdesk_hbbr_args:=""}
|
||||||
|
: ${rustdesk_hbbr_user:=rustdesk}
|
||||||
|
: ${rustdesk_hbbr_group:=rustdesk}
|
||||||
|
|
||||||
|
pidfile=/var/run/rustdesk_hbbr.pid
|
||||||
|
command=/usr/sbin/daemon
|
||||||
|
procname=/usr/local/sbin/hbbr
|
||||||
|
rustdesk_hbbr_chdir="/var/lib/rustdesk-server/"
|
||||||
|
rustdesk_hbbr_args="-k _"
|
||||||
|
command_args="-p ${pidfile} -o /var/log/rustdesk-hbbr.log ${procname} ${rustdesk_hbbr_args}"
|
||||||
|
## If you want the daemon do its log over syslog comment out the above line and remove the comment from the below replacement
|
||||||
|
#command_args="-p ${pidfile} -T ${name} ${procname} ${rustdesk_hbbr_args}"
|
||||||
|
|
||||||
|
start_precmd=rustdesk_hbbr_startprecmd
|
||||||
|
|
||||||
|
rustdesk_hbbr_startprecmd()
|
||||||
|
{
|
||||||
|
if [ -e ${pidfile} ]; then
|
||||||
|
chown ${rustdesk_hbbr_user}:${rustdesk_hbbr_group} ${pidfile};
|
||||||
|
else
|
||||||
|
install -o ${rustdesk_hbbr_user} -g ${rustdesk_hbbr_group} /dev/null ${pidfile};
|
||||||
|
fi
|
||||||
|
if [ -e ${rustdesk_hbbr_chdir} ]; then
|
||||||
|
chown -R ${rustdesk_hbbr_user}:${rustdesk_hbbr_group} ${rustdesk_hbbr_chdir};
|
||||||
|
chmod -R 770 ${rustdesk_hbbr_chdir};
|
||||||
|
else
|
||||||
|
mkdir -m 770 ${rustdesk_hbbr_chdir};
|
||||||
|
chown ${rustdesk_hbbr_user}:${rustdesk_hbbr_group} ${rustdesk_hbbr_chdir};
|
||||||
|
fi
|
||||||
|
if [ -e /var/log/rustdesk-hbbr.log ]; then
|
||||||
|
chown -R ${rustdesk_hbbr_user}:${rustdesk_hbbr_group} /var/log/rustdesk-hbbr.log;
|
||||||
|
chmod 660 /var/log/rustdesk-hbbr.log;
|
||||||
|
else
|
||||||
|
install -o ${rustdesk_hbbr_user} -g ${rustdesk_hbbr_group} /dev/null /var/log/rustdesk-hbbr.log;
|
||||||
|
chmod 660 /var/log/rustdesk-hbbr.log;
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
run_rc_command "$1"
|
||||||
66
rcd/rustdesk-hbbs
Normal file
66
rcd/rustdesk-hbbs
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# PROVIDE: rustdesk_hbbs
|
||||||
|
# REQUIRE: LOGIN
|
||||||
|
# KEYWORD: shutdown
|
||||||
|
#
|
||||||
|
# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
|
||||||
|
# to enable this service:
|
||||||
|
#
|
||||||
|
# rustdesk_hbbs_enable (bool): Set to NO by default.
|
||||||
|
# Set it to YES to enable nfs-exporter.
|
||||||
|
# rustdesk_hbbs_args (string): Set extra arguments to pass to nfs-exporter
|
||||||
|
# Default is "".
|
||||||
|
# rustdesk_hbbs_user (string): Set user that rustdesk_hbbs will run under
|
||||||
|
# Default is "root".
|
||||||
|
# rustdesk_hbbs_group (string): Set group that rustdesk_hbbs will run under
|
||||||
|
# Default is "wheel".
|
||||||
|
|
||||||
|
. /etc/rc.subr
|
||||||
|
|
||||||
|
name=rustdesk_hbbs
|
||||||
|
desc="Rustdesk ID/Rendezvous Server"
|
||||||
|
rcvar=rustdesk_hbbs_enable
|
||||||
|
|
||||||
|
load_rc_config $name
|
||||||
|
|
||||||
|
: ${rustdesk_hbbs_enable:=NO}
|
||||||
|
: ${rustdesk_hbbs_args:=""}
|
||||||
|
: ${rustdesk_hbbs_user:=rustdesk}
|
||||||
|
: ${rustdesk_hbbs_group:=rustdesk}
|
||||||
|
|
||||||
|
pidfile=/var/run/rustdesk_hbbs.pid
|
||||||
|
command=/usr/sbin/daemon
|
||||||
|
procname=/usr/local/sbin/hbbs
|
||||||
|
rustdesk_hbbs_chdir="/var/lib/rustdesk-server/"
|
||||||
|
rustdesk_hbbs_args="-r your.ip.add.ress -k _"
|
||||||
|
command_args="-p ${pidfile} -o /var/log/rustdesk-hbbs.log ${procname} ${rustdesk_hbbs_args}"
|
||||||
|
## If you want the daemon do its log over syslog comment out the above line and remove the comment from the below replacement
|
||||||
|
#command_args="-p ${pidfile} -T ${name} ${procname} ${rustdesk_hbbs_args}"
|
||||||
|
|
||||||
|
start_precmd=rustdesk_hbbs_startprecmd
|
||||||
|
|
||||||
|
rustdesk_hbbs_startprecmd()
|
||||||
|
{
|
||||||
|
if [ -e ${pidfile} ]; then
|
||||||
|
chown ${rustdesk_hbbs_user}:${rustdesk_hbbs_group} ${pidfile};
|
||||||
|
else
|
||||||
|
install -o ${rustdesk_hbbs_user} -g ${rustdesk_hbbs_group} /dev/null ${pidfile};
|
||||||
|
fi
|
||||||
|
if [ -e ${rustdesk_hbbs_chdir} ]; then
|
||||||
|
chown -R ${rustdesk_hbbs_user}:${rustdesk_hbbs_group} ${rustdesk_hbbs_chdir};
|
||||||
|
chmod -R 770 ${rustdesk_hbbs_chdir};
|
||||||
|
else
|
||||||
|
mkdir -m 770 ${rustdesk_hbbs_chdir};
|
||||||
|
chown ${rustdesk_hbbs_user}:${rustdesk_hbbs_group} ${rustdesk_hbbs_chdir};
|
||||||
|
fi
|
||||||
|
if [ -e /var/log/rustdesk-hbbs.log ]; then
|
||||||
|
chown -R ${rustdesk_hbbs_user}:${rustdesk_hbbs_group} /var/log/rustdesk-hbbs.log;
|
||||||
|
chmod 660 /var/log/rustdesk-hbbs.log;
|
||||||
|
else
|
||||||
|
install -o ${rustdesk_hbbs_user} -g ${rustdesk_hbbs_group} /dev/null /var/log/rustdesk-hbbs.log;
|
||||||
|
chmod 660 /var/log/rustdesk-hbbs.log;
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
run_rc_command "$1"
|
||||||
@@ -379,7 +379,7 @@ async fn handle_connection(
|
|||||||
let limiter = limiter.clone();
|
let limiter = limiter.clone();
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
let mut stream = stream;
|
let mut stream = stream;
|
||||||
let mut buffer = [0; 64];
|
let mut buffer = [0; 1024];
|
||||||
if let Ok(Ok(n)) = timeout(1000, stream.read(&mut buffer[..])).await {
|
if let Ok(Ok(n)) = timeout(1000, stream.read(&mut buffer[..])).await {
|
||||||
if let Ok(data) = std::str::from_utf8(&buffer[..n]) {
|
if let Ok(data) = std::str::from_utf8(&buffer[..n]) {
|
||||||
let res = check_cmd(data, limiter).await;
|
let res = check_cmd(data, limiter).await;
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ use std::{
|
|||||||
sync::Arc,
|
sync::Arc,
|
||||||
time::Instant,
|
time::Instant,
|
||||||
};
|
};
|
||||||
const ADDR_127: IpAddr = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
|
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
enum Data {
|
enum Data {
|
||||||
@@ -93,7 +92,6 @@ impl RendezvousServer {
|
|||||||
#[tokio::main(flavor = "multi_thread")]
|
#[tokio::main(flavor = "multi_thread")]
|
||||||
pub async fn start(port: i32, serial: i32, key: &str, rmem: usize) -> ResultType<()> {
|
pub async fn start(port: i32, serial: i32, key: &str, rmem: usize) -> ResultType<()> {
|
||||||
let (key, sk) = Self::get_server_sk(key);
|
let (key, sk) = Self::get_server_sk(key);
|
||||||
let addr = format!("0.0.0.0:{port}");
|
|
||||||
let nat_port = port - 1;
|
let nat_port = port - 1;
|
||||||
let ws_port = port + 2;
|
let ws_port = port + 2;
|
||||||
let pm = PeerMap::new().await?;
|
let pm = PeerMap::new().await?;
|
||||||
@@ -162,12 +160,11 @@ impl RendezvousServer {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
if test_addr.to_lowercase() != "no" {
|
if test_addr.to_lowercase() != "no" {
|
||||||
let test_addr = (if test_addr.is_empty() {
|
let test_addr = if test_addr.is_empty() {
|
||||||
addr.replace("0.0.0.0", "127.0.0.1")
|
listener.local_addr()?
|
||||||
} else {
|
} else {
|
||||||
test_addr
|
test_addr.parse()?
|
||||||
})
|
};
|
||||||
.parse::<SocketAddr>()?;
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
allow_err!(test_hbbs(test_addr).await);
|
allow_err!(test_hbbs(test_addr).await);
|
||||||
});
|
});
|
||||||
@@ -427,7 +424,7 @@ impl RendezvousServer {
|
|||||||
self.handle_local_addr(la, addr, Some(socket)).await?;
|
self.handle_local_addr(la, addr, Some(socket)).await?;
|
||||||
}
|
}
|
||||||
Some(rendezvous_message::Union::ConfigureUpdate(mut cu)) => {
|
Some(rendezvous_message::Union::ConfigureUpdate(mut cu)) => {
|
||||||
if addr.ip() == ADDR_127 && cu.serial > self.inner.serial {
|
if addr.ip().is_loopback() && cu.serial > self.inner.serial {
|
||||||
let mut inner: Inner = (*self.inner).clone();
|
let mut inner: Inner = (*self.inner).clone();
|
||||||
inner.serial = cu.serial;
|
inner.serial = cu.serial;
|
||||||
self.inner = Arc::new(inner);
|
self.inner = Arc::new(inner);
|
||||||
@@ -566,7 +563,7 @@ impl RendezvousServer {
|
|||||||
ip != old.socket_addr.ip()
|
ip != old.socket_addr.ip()
|
||||||
} else {
|
} else {
|
||||||
ip.to_string() != old.info.ip
|
ip.to_string() != old.info.ip
|
||||||
} && ip != ADDR_127;
|
} && !ip.is_loopback();
|
||||||
let request_pk = old.pk.is_empty() || ip_change;
|
let request_pk = old.pk.is_empty() || ip_change;
|
||||||
if !request_pk {
|
if !request_pk {
|
||||||
old.socket_addr = socket_addr;
|
old.socket_addr = socket_addr;
|
||||||
@@ -789,7 +786,7 @@ impl RendezvousServer {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
async fn send_to_tcp(&mut self, msg: RendezvousMessage, addr: SocketAddr) {
|
async fn send_to_tcp(&mut self, msg: RendezvousMessage, addr: SocketAddr) {
|
||||||
let mut tcp = self.tcp_punch.lock().await.remove(&addr);
|
let mut tcp = self.tcp_punch.lock().await.remove(&try_into_v4(addr));
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
Self::send_to_sink(&mut tcp, msg).await;
|
Self::send_to_sink(&mut tcp, msg).await;
|
||||||
});
|
});
|
||||||
@@ -817,7 +814,7 @@ impl RendezvousServer {
|
|||||||
msg: RendezvousMessage,
|
msg: RendezvousMessage,
|
||||||
addr: SocketAddr,
|
addr: SocketAddr,
|
||||||
) -> ResultType<()> {
|
) -> ResultType<()> {
|
||||||
let mut sink = self.tcp_punch.lock().await.remove(&addr);
|
let mut sink = self.tcp_punch.lock().await.remove(&try_into_v4(addr));
|
||||||
Self::send_to_sink(&mut sink, msg).await;
|
Self::send_to_sink(&mut sink, msg).await;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -1053,7 +1050,7 @@ impl RendezvousServer {
|
|||||||
if addr.ip().is_loopback() {
|
if addr.ip().is_loopback() {
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
let mut stream = stream;
|
let mut stream = stream;
|
||||||
let mut buffer = [0; 64];
|
let mut buffer = [0; 1024];
|
||||||
if let Ok(Ok(n)) = timeout(1000, stream.read(&mut buffer[..])).await {
|
if let Ok(Ok(n)) = timeout(1000, stream.read(&mut buffer[..])).await {
|
||||||
if let Ok(data) = std::str::from_utf8(&buffer[..n]) {
|
if let Ok(data) = std::str::from_utf8(&buffer[..n]) {
|
||||||
let res = rs.check_cmd(data).await;
|
let res = rs.check_cmd(data).await;
|
||||||
@@ -1126,7 +1123,7 @@ impl RendezvousServer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if sink.is_none() {
|
if sink.is_none() {
|
||||||
self.tcp_punch.lock().await.remove(&addr);
|
self.tcp_punch.lock().await.remove(&try_into_v4(addr));
|
||||||
}
|
}
|
||||||
log::debug!("Tcp connection from {:?} closed", addr);
|
log::debug!("Tcp connection from {:?} closed", addr);
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
8
ui/.cargo/config.toml
Normal file
8
ui/.cargo/config.toml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[target.x86_64-pc-windows-msvc]
|
||||||
|
rustflags = ["-Ctarget-feature=+crt-static"]
|
||||||
|
[target.i686-pc-windows-msvc]
|
||||||
|
rustflags = ["-Ctarget-feature=+crt-static"]
|
||||||
|
[target.'cfg(target_os="macos")']
|
||||||
|
rustflags = [
|
||||||
|
"-C", "link-args=-sectcreate __CGPreLoginApp __cgpreloginapp /dev/null",
|
||||||
|
]
|
||||||
2
ui/Cargo.lock
generated
2
ui/Cargo.lock
generated
@@ -2315,7 +2315,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustdesk_server"
|
name = "rustdesk_server"
|
||||||
version = "0.1.1"
|
version = "0.1.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-std",
|
"async-std",
|
||||||
"crossbeam-channel",
|
"crossbeam-channel",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "rustdesk_server"
|
name = "rustdesk_server"
|
||||||
version = "0.1.1"
|
version = "0.1.2"
|
||||||
description = "rustdesk server gui"
|
description = "rustdesk server gui"
|
||||||
authors = ["elilchen"]
|
authors = ["elilchen"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
fn main() {
|
fn main() {
|
||||||
tauri_build::build();
|
tauri_build::build();
|
||||||
if cfg!(target_os = "windows") {
|
if cfg!(target_os = "windows") {
|
||||||
let mut res = winres::WindowsResource::new();
|
let mut res = winres::WindowsResource::new();
|
||||||
res.set_icon("icons\\icon.ico");
|
res.set_icon("icons\\icon.ico");
|
||||||
|
|||||||
24
ui/html/.gitignore
vendored
Normal file
24
ui/html/.gitignore
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.idea
|
||||||
|
.DS_Store
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
@@ -1,344 +0,0 @@
|
|||||||
/* BASICS */
|
|
||||||
|
|
||||||
.CodeMirror {
|
|
||||||
/* Set height, width, borders, and global font properties here */
|
|
||||||
font-family: monospace;
|
|
||||||
height: 300px;
|
|
||||||
color: black;
|
|
||||||
direction: ltr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* PADDING */
|
|
||||||
|
|
||||||
.CodeMirror-lines {
|
|
||||||
padding: 4px 0; /* Vertical padding around content */
|
|
||||||
}
|
|
||||||
.CodeMirror pre.CodeMirror-line,
|
|
||||||
.CodeMirror pre.CodeMirror-line-like {
|
|
||||||
padding: 0 4px; /* Horizontal padding of content */
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
|
|
||||||
background-color: white; /* The little square between H and V scrollbars */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* GUTTER */
|
|
||||||
|
|
||||||
.CodeMirror-gutters {
|
|
||||||
border-right: 1px solid #ddd;
|
|
||||||
background-color: #f7f7f7;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.CodeMirror-linenumbers {}
|
|
||||||
.CodeMirror-linenumber {
|
|
||||||
padding: 0 3px 0 5px;
|
|
||||||
min-width: 20px;
|
|
||||||
text-align: right;
|
|
||||||
color: #999;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-guttermarker { color: black; }
|
|
||||||
.CodeMirror-guttermarker-subtle { color: #999; }
|
|
||||||
|
|
||||||
/* CURSOR */
|
|
||||||
|
|
||||||
.CodeMirror-cursor {
|
|
||||||
border-left: 1px solid black;
|
|
||||||
border-right: none;
|
|
||||||
width: 0;
|
|
||||||
}
|
|
||||||
/* Shown when moving in bi-directional text */
|
|
||||||
.CodeMirror div.CodeMirror-secondarycursor {
|
|
||||||
border-left: 1px solid silver;
|
|
||||||
}
|
|
||||||
.cm-fat-cursor .CodeMirror-cursor {
|
|
||||||
width: auto;
|
|
||||||
border: 0 !important;
|
|
||||||
background: #7e7;
|
|
||||||
}
|
|
||||||
.cm-fat-cursor div.CodeMirror-cursors {
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
.cm-fat-cursor .CodeMirror-line::selection,
|
|
||||||
.cm-fat-cursor .CodeMirror-line > span::selection,
|
|
||||||
.cm-fat-cursor .CodeMirror-line > span > span::selection { background: transparent; }
|
|
||||||
.cm-fat-cursor .CodeMirror-line::-moz-selection,
|
|
||||||
.cm-fat-cursor .CodeMirror-line > span::-moz-selection,
|
|
||||||
.cm-fat-cursor .CodeMirror-line > span > span::-moz-selection { background: transparent; }
|
|
||||||
.cm-fat-cursor { caret-color: transparent; }
|
|
||||||
@-moz-keyframes blink {
|
|
||||||
0% {}
|
|
||||||
50% { background-color: transparent; }
|
|
||||||
100% {}
|
|
||||||
}
|
|
||||||
@-webkit-keyframes blink {
|
|
||||||
0% {}
|
|
||||||
50% { background-color: transparent; }
|
|
||||||
100% {}
|
|
||||||
}
|
|
||||||
@keyframes blink {
|
|
||||||
0% {}
|
|
||||||
50% { background-color: transparent; }
|
|
||||||
100% {}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Can style cursor different in overwrite (non-insert) mode */
|
|
||||||
.CodeMirror-overwrite .CodeMirror-cursor {}
|
|
||||||
|
|
||||||
.cm-tab { display: inline-block; text-decoration: inherit; }
|
|
||||||
|
|
||||||
.CodeMirror-rulers {
|
|
||||||
position: absolute;
|
|
||||||
left: 0; right: 0; top: -50px; bottom: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.CodeMirror-ruler {
|
|
||||||
border-left: 1px solid #ccc;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* DEFAULT THEME */
|
|
||||||
|
|
||||||
.cm-s-default .cm-header {color: blue;}
|
|
||||||
.cm-s-default .cm-quote {color: #090;}
|
|
||||||
.cm-negative {color: #d44;}
|
|
||||||
.cm-positive {color: #292;}
|
|
||||||
.cm-header, .cm-strong {font-weight: bold;}
|
|
||||||
.cm-em {font-style: italic;}
|
|
||||||
.cm-link {text-decoration: underline;}
|
|
||||||
.cm-strikethrough {text-decoration: line-through;}
|
|
||||||
|
|
||||||
.cm-s-default .cm-keyword {color: #708;}
|
|
||||||
.cm-s-default .cm-atom {color: #219;}
|
|
||||||
.cm-s-default .cm-number {color: #164;}
|
|
||||||
.cm-s-default .cm-def {color: #00f;}
|
|
||||||
.cm-s-default .cm-variable,
|
|
||||||
.cm-s-default .cm-punctuation,
|
|
||||||
.cm-s-default .cm-property,
|
|
||||||
.cm-s-default .cm-operator {}
|
|
||||||
.cm-s-default .cm-variable-2 {color: #05a;}
|
|
||||||
.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
|
|
||||||
.cm-s-default .cm-comment {color: #a50;}
|
|
||||||
.cm-s-default .cm-string {color: #a11;}
|
|
||||||
.cm-s-default .cm-string-2 {color: #f50;}
|
|
||||||
.cm-s-default .cm-meta {color: #555;}
|
|
||||||
.cm-s-default .cm-qualifier {color: #555;}
|
|
||||||
.cm-s-default .cm-builtin {color: #30a;}
|
|
||||||
.cm-s-default .cm-bracket {color: #997;}
|
|
||||||
.cm-s-default .cm-tag {color: #170;}
|
|
||||||
.cm-s-default .cm-attribute {color: #00c;}
|
|
||||||
.cm-s-default .cm-hr {color: #999;}
|
|
||||||
.cm-s-default .cm-link {color: #00c;}
|
|
||||||
|
|
||||||
.cm-s-default .cm-error {color: #f00;}
|
|
||||||
.cm-invalidchar {color: #f00;}
|
|
||||||
|
|
||||||
.CodeMirror-composing { border-bottom: 2px solid; }
|
|
||||||
|
|
||||||
/* Default styles for common addons */
|
|
||||||
|
|
||||||
div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
|
|
||||||
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
|
|
||||||
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
|
|
||||||
.CodeMirror-activeline-background {background: #e8f2ff;}
|
|
||||||
|
|
||||||
/* STOP */
|
|
||||||
|
|
||||||
/* The rest of this file contains styles related to the mechanics of
|
|
||||||
the editor. You probably shouldn't touch them. */
|
|
||||||
|
|
||||||
.CodeMirror {
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
background: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-scroll {
|
|
||||||
overflow: scroll !important; /* Things will break if this is overridden */
|
|
||||||
/* 50px is the magic margin used to hide the element's real scrollbars */
|
|
||||||
/* See overflow: hidden in .CodeMirror */
|
|
||||||
margin-bottom: -50px; margin-right: -50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
height: 100%;
|
|
||||||
outline: none; /* Prevent dragging from highlighting the element */
|
|
||||||
position: relative;
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
.CodeMirror-sizer {
|
|
||||||
position: relative;
|
|
||||||
border-right: 50px solid transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The fake, visible scrollbars. Used to force redraw during scrolling
|
|
||||||
before actual scrolling happens, thus preventing shaking and
|
|
||||||
flickering artifacts. */
|
|
||||||
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
|
|
||||||
position: absolute;
|
|
||||||
z-index: 6;
|
|
||||||
display: none;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
.CodeMirror-vscrollbar {
|
|
||||||
right: 0; top: 0;
|
|
||||||
overflow-x: hidden;
|
|
||||||
overflow-y: scroll;
|
|
||||||
}
|
|
||||||
.CodeMirror-hscrollbar {
|
|
||||||
bottom: 0; left: 0;
|
|
||||||
overflow-y: hidden;
|
|
||||||
overflow-x: scroll;
|
|
||||||
}
|
|
||||||
.CodeMirror-scrollbar-filler {
|
|
||||||
right: 0; bottom: 0;
|
|
||||||
}
|
|
||||||
.CodeMirror-gutter-filler {
|
|
||||||
left: 0; bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-gutters {
|
|
||||||
position: absolute; left: 0; top: 0;
|
|
||||||
min-height: 100%;
|
|
||||||
z-index: 3;
|
|
||||||
}
|
|
||||||
.CodeMirror-gutter {
|
|
||||||
white-space: normal;
|
|
||||||
height: 100%;
|
|
||||||
display: inline-block;
|
|
||||||
vertical-align: top;
|
|
||||||
margin-bottom: -50px;
|
|
||||||
}
|
|
||||||
.CodeMirror-gutter-wrapper {
|
|
||||||
position: absolute;
|
|
||||||
z-index: 4;
|
|
||||||
background: none !important;
|
|
||||||
border: none !important;
|
|
||||||
}
|
|
||||||
.CodeMirror-gutter-background {
|
|
||||||
position: absolute;
|
|
||||||
top: 0; bottom: 0;
|
|
||||||
z-index: 4;
|
|
||||||
}
|
|
||||||
.CodeMirror-gutter-elt {
|
|
||||||
position: absolute;
|
|
||||||
cursor: default;
|
|
||||||
z-index: 4;
|
|
||||||
}
|
|
||||||
.CodeMirror-gutter-wrapper ::selection { background-color: transparent }
|
|
||||||
.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }
|
|
||||||
|
|
||||||
.CodeMirror-lines {
|
|
||||||
cursor: text;
|
|
||||||
min-height: 1px; /* prevents collapsing before first draw */
|
|
||||||
}
|
|
||||||
.CodeMirror pre.CodeMirror-line,
|
|
||||||
.CodeMirror pre.CodeMirror-line-like {
|
|
||||||
/* Reset some styles that the rest of the page might have set */
|
|
||||||
-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
|
|
||||||
border-width: 0;
|
|
||||||
background: transparent;
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
margin: 0;
|
|
||||||
white-space: pre;
|
|
||||||
word-wrap: normal;
|
|
||||||
line-height: inherit;
|
|
||||||
color: inherit;
|
|
||||||
z-index: 2;
|
|
||||||
position: relative;
|
|
||||||
overflow: visible;
|
|
||||||
-webkit-tap-highlight-color: transparent;
|
|
||||||
-webkit-font-variant-ligatures: contextual;
|
|
||||||
font-variant-ligatures: contextual;
|
|
||||||
}
|
|
||||||
.CodeMirror-wrap pre.CodeMirror-line,
|
|
||||||
.CodeMirror-wrap pre.CodeMirror-line-like {
|
|
||||||
word-wrap: break-word;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
word-break: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-linebackground {
|
|
||||||
position: absolute;
|
|
||||||
left: 0; right: 0; top: 0; bottom: 0;
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-linewidget {
|
|
||||||
position: relative;
|
|
||||||
z-index: 2;
|
|
||||||
padding: 0.1px; /* Force widget margins to stay inside of the container */
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-widget {}
|
|
||||||
|
|
||||||
.CodeMirror-rtl pre { direction: rtl; }
|
|
||||||
|
|
||||||
.CodeMirror-code {
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Force content-box sizing for the elements where we expect it */
|
|
||||||
.CodeMirror-scroll,
|
|
||||||
.CodeMirror-sizer,
|
|
||||||
.CodeMirror-gutter,
|
|
||||||
.CodeMirror-gutters,
|
|
||||||
.CodeMirror-linenumber {
|
|
||||||
-moz-box-sizing: content-box;
|
|
||||||
box-sizing: content-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-measure {
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
height: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-cursor {
|
|
||||||
position: absolute;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
.CodeMirror-measure pre { position: static; }
|
|
||||||
|
|
||||||
div.CodeMirror-cursors {
|
|
||||||
visibility: hidden;
|
|
||||||
position: relative;
|
|
||||||
z-index: 3;
|
|
||||||
}
|
|
||||||
div.CodeMirror-dragcursors {
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-focused div.CodeMirror-cursors {
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-selected { background: #d9d9d9; }
|
|
||||||
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
|
|
||||||
.CodeMirror-crosshair { cursor: crosshair; }
|
|
||||||
.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
|
|
||||||
.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
|
|
||||||
|
|
||||||
.cm-searching {
|
|
||||||
background-color: #ffa;
|
|
||||||
background-color: rgba(255, 255, 0, .4);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Used to force a border model for a node */
|
|
||||||
.cm-force-border { padding-right: .1px; }
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
/* Hide the cursor when printing */
|
|
||||||
.CodeMirror div.CodeMirror-cursors {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See issue #2901 */
|
|
||||||
.cm-tab-wrap-hack:after { content: ''; }
|
|
||||||
|
|
||||||
/* Help users use markselection to safely style text background */
|
|
||||||
span.CodeMirror-selectedtext { background: none; }
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,88 +0,0 @@
|
|||||||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|
||||||
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
|
|
||||||
|
|
||||||
(function(mod) {
|
|
||||||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|
||||||
mod(require("../../lib/codemirror"));
|
|
||||||
else if (typeof define == "function" && define.amd) // AMD
|
|
||||||
define(["../../lib/codemirror"], mod);
|
|
||||||
else // Plain browser env
|
|
||||||
mod(CodeMirror);
|
|
||||||
})(function(CodeMirror) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
CodeMirror.defineMode("toml", function () {
|
|
||||||
return {
|
|
||||||
startState: function () {
|
|
||||||
return {
|
|
||||||
inString: false,
|
|
||||||
stringType: "",
|
|
||||||
lhs: true,
|
|
||||||
inArray: 0
|
|
||||||
};
|
|
||||||
},
|
|
||||||
token: function (stream, state) {
|
|
||||||
//check for state changes
|
|
||||||
if (!state.inString && ((stream.peek() == '"') || (stream.peek() == "'"))) {
|
|
||||||
state.stringType = stream.peek();
|
|
||||||
stream.next(); // Skip quote
|
|
||||||
state.inString = true; // Update state
|
|
||||||
}
|
|
||||||
if (stream.sol() && state.inArray === 0) {
|
|
||||||
state.lhs = true;
|
|
||||||
}
|
|
||||||
//return state
|
|
||||||
if (state.inString) {
|
|
||||||
while (state.inString && !stream.eol()) {
|
|
||||||
if (stream.peek() === state.stringType) {
|
|
||||||
stream.next(); // Skip quote
|
|
||||||
state.inString = false; // Clear flag
|
|
||||||
} else if (stream.peek() === '\\') {
|
|
||||||
stream.next();
|
|
||||||
stream.next();
|
|
||||||
} else {
|
|
||||||
stream.match(/^.[^\\\"\']*/);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return state.lhs ? "property string" : "string"; // Token style
|
|
||||||
} else if (state.inArray && stream.peek() === ']') {
|
|
||||||
stream.next();
|
|
||||||
state.inArray--;
|
|
||||||
return 'bracket';
|
|
||||||
} else if (state.lhs && stream.peek() === '[' && stream.skipTo(']')) {
|
|
||||||
stream.next();//skip closing ]
|
|
||||||
// array of objects has an extra open & close []
|
|
||||||
if (stream.peek() === ']') stream.next();
|
|
||||||
return "atom";
|
|
||||||
} else if (stream.peek() === "#") {
|
|
||||||
stream.skipToEnd();
|
|
||||||
return "comment";
|
|
||||||
} else if (stream.eatSpace()) {
|
|
||||||
return null;
|
|
||||||
} else if (state.lhs && stream.eatWhile(function (c) { return c != '=' && c != ' '; })) {
|
|
||||||
return "property";
|
|
||||||
} else if (state.lhs && stream.peek() === "=") {
|
|
||||||
stream.next();
|
|
||||||
state.lhs = false;
|
|
||||||
return null;
|
|
||||||
} else if (!state.lhs && stream.match(/^\d\d\d\d[\d\-\:\.T]*Z/)) {
|
|
||||||
return 'atom'; //date
|
|
||||||
} else if (!state.lhs && (stream.match('true') || stream.match('false'))) {
|
|
||||||
return 'atom';
|
|
||||||
} else if (!state.lhs && stream.peek() === '[') {
|
|
||||||
state.inArray++;
|
|
||||||
stream.next();
|
|
||||||
return 'bracket';
|
|
||||||
} else if (!state.lhs && stream.match(/^\-?\d+(?:\.\d+)?/)) {
|
|
||||||
return 'number';
|
|
||||||
} else if (!stream.eatSpace()) {
|
|
||||||
stream.next();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
CodeMirror.defineMIME('text/x-toml', 'toml');
|
|
||||||
|
|
||||||
});
|
|
||||||
@@ -1,18 +1,14 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>RustDesk Server</title>
|
<title>RustDesk Server</title>
|
||||||
<link rel="icon" href="data:;base64,=">
|
<link rel="icon" href="data:;base64,=">
|
||||||
<script>addEventListener('contextmenu', e => e.preventDefault());</script>
|
<script>addEventListener('contextmenu', e => e.preventDefault());</script>
|
||||||
<link rel="stylesheet" href="editor/codemirror.css">
|
|
||||||
<link rel="stylesheet" href="style.css" />
|
|
||||||
<script src="editor/codemirror.js"></script>
|
|
||||||
<script src="editor/toml.js"></script>
|
|
||||||
<script type="module" src="/main.js" defer></script>
|
<script type="module" src="/main.js" defer></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body style="visibility: hidden">
|
||||||
<textarea></textarea>
|
<textarea></textarea>
|
||||||
<form>
|
<form>
|
||||||
<label><input type="checkbox"> <p>Turn on auto scroll</p></label>
|
<label><input type="checkbox"> <p>Turn on auto scroll</p></label>
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
import 'codemirror/lib/codemirror.css';
|
||||||
|
import './style.css';
|
||||||
|
import 'codemirror/mode/toml/toml.js';
|
||||||
|
import CodeMirror from 'codemirror';
|
||||||
|
|
||||||
const { event, fs, path, tauri } = window.__TAURI__;
|
const { event, fs, path, tauri } = window.__TAURI__;
|
||||||
|
|
||||||
class View {
|
class View {
|
||||||
@@ -22,13 +27,14 @@ class View {
|
|||||||
event.listen('__update__', this.appAction.bind(this));
|
event.listen('__update__', this.appAction.bind(this));
|
||||||
event.emit('__action__', '__init__');
|
event.emit('__action__', '__init__');
|
||||||
while (true) {
|
while (true) {
|
||||||
|
let now = Date.now();
|
||||||
try {
|
try {
|
||||||
await this.update();
|
await this.update();
|
||||||
this.render();
|
this.render();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
await new Promise(r => setTimeout(r, 100));
|
await new Promise(r => setTimeout(r, Math.max(0, 33 - (Date.now() - now))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
async update() {
|
async update() {
|
||||||
@@ -124,9 +130,9 @@ RUST_LOG=info
|
|||||||
input.checked = this.is_auto_scroll;
|
input.checked = this.is_auto_scroll;
|
||||||
if (this.is_edit_mode) {
|
if (this.is_edit_mode) {
|
||||||
label[0].style.display = 'none';
|
label[0].style.display = 'none';
|
||||||
label[1].style.display = 'inline';
|
label[1].style.display = 'block';
|
||||||
} else {
|
} else {
|
||||||
label[0].style.display = 'inline';
|
label[0].style.display = 'block';
|
||||||
label[1].style.display = 'none';
|
label[1].style.display = 'none';
|
||||||
}
|
}
|
||||||
return form;
|
return form;
|
||||||
|
|||||||
17
ui/html/package.json
Normal file
17
ui/html/package.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"name": "rustdesk_server",
|
||||||
|
"private": true,
|
||||||
|
"version": "0.1.2",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "vite build",
|
||||||
|
"preview": "vite preview"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"vite": "^4.1.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"codemirror": "v5"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
body {
|
body {
|
||||||
|
visibility: visible !important;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
|
|||||||
8
ui/html/vite.config.js
Normal file
8
ui/html/vite.config.js
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import { defineConfig } from 'vite';
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
server: {
|
||||||
|
port: '5177',
|
||||||
|
strictPort: true
|
||||||
|
}
|
||||||
|
});
|
||||||
13
ui/setup.nsi
13
ui/setup.nsi
@@ -132,7 +132,7 @@ Section "Install"
|
|||||||
nsExec::Exec 'sc stop hbbr'
|
nsExec::Exec 'sc stop hbbr'
|
||||||
nsExec::Exec 'sc stop hbbs'
|
nsExec::Exec 'sc stop hbbs'
|
||||||
nsExec::Exec 'taskkill /F /IM ${PRODUCT_NAME}.exe'
|
nsExec::Exec 'taskkill /F /IM ${PRODUCT_NAME}.exe'
|
||||||
Sleep 500 ;
|
Sleep 500
|
||||||
|
|
||||||
SetOutPath $INSTDIR
|
SetOutPath $INSTDIR
|
||||||
File /r "setup\*.*"
|
File /r "setup\*.*"
|
||||||
@@ -142,12 +142,12 @@ Section "Install"
|
|||||||
CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"
|
CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"
|
||||||
CreateShortCut "$SMPROGRAMS\${APP_NAME}\Uninstall.lnk" "$INSTDIR\uninstall.exe"
|
CreateShortCut "$SMPROGRAMS\${APP_NAME}\Uninstall.lnk" "$INSTDIR\uninstall.exe"
|
||||||
CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"
|
CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"
|
||||||
CreateShortCut "$SMSTARTUP\${APP_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"
|
|
||||||
|
|
||||||
nsExec::Exec 'netsh advfirewall firewall add rule name="${APP_NAME}" dir=in action=allow program="$INSTDIR\hbbs.exe" enable=yes'
|
nsExec::Exec 'netsh advfirewall firewall add rule name="${APP_NAME}" dir=in action=allow program="$INSTDIR\hbbs.exe" enable=yes'
|
||||||
nsExec::Exec 'netsh advfirewall firewall add rule name="${APP_NAME}" dir=out action=allow program="$INSTDIR\hbbs.exe" enable=yes'
|
nsExec::Exec 'netsh advfirewall firewall add rule name="${APP_NAME}" dir=out action=allow program="$INSTDIR\hbbs.exe" enable=yes'
|
||||||
nsExec::Exec 'netsh advfirewall firewall add rule name="${APP_NAME}" dir=in action=allow program="$INSTDIR\hbbr.exe" enable=yes'
|
nsExec::Exec 'netsh advfirewall firewall add rule name="${APP_NAME}" dir=in action=allow program="$INSTDIR\hbbr.exe" enable=yes'
|
||||||
nsExec::Exec 'netsh advfirewall firewall add rule name="${APP_NAME}" dir=out action=allow program="$INSTDIR\hbbr.exe" enable=yes'
|
nsExec::Exec 'netsh advfirewall firewall add rule name="${APP_NAME}" dir=out action=allow program="$INSTDIR\hbbr.exe" enable=yes'
|
||||||
|
ExecWait 'powershell.exe -NoProfile -windowstyle hidden try { [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12 } catch {}; Invoke-WebRequest -Uri "https://go.microsoft.com/fwlink/p/?LinkId=2124703" -OutFile "$$env:TEMP\MicrosoftEdgeWebview2Setup.exe" ; Start-Process -FilePath "$$env:TEMP\MicrosoftEdgeWebview2Setup.exe" -ArgumentList ($\'/silent$\', $\'/install$\') -Wait'
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
Section "Uninstall"
|
Section "Uninstall"
|
||||||
@@ -155,7 +155,7 @@ Section "Uninstall"
|
|||||||
nsExec::Exec 'sc stop hbbr'
|
nsExec::Exec 'sc stop hbbr'
|
||||||
nsExec::Exec 'sc stop hbbs'
|
nsExec::Exec 'sc stop hbbs'
|
||||||
nsExec::Exec 'taskkill /F /IM ${PRODUCT_NAME}.exe'
|
nsExec::Exec 'taskkill /F /IM ${PRODUCT_NAME}.exe'
|
||||||
Sleep 500 ;
|
Sleep 500
|
||||||
|
|
||||||
RMDir /r "$SMPROGRAMS\${APP_NAME}"
|
RMDir /r "$SMPROGRAMS\${APP_NAME}"
|
||||||
Delete "$SMSTARTUP\${APP_NAME}.lnk"
|
Delete "$SMSTARTUP\${APP_NAME}.lnk"
|
||||||
@@ -163,11 +163,16 @@ Section "Uninstall"
|
|||||||
nsExec::Exec 'sc delete hbbr'
|
nsExec::Exec 'sc delete hbbr'
|
||||||
nsExec::Exec 'sc delete hbbs'
|
nsExec::Exec 'sc delete hbbs'
|
||||||
nsExec::Exec 'netsh advfirewall firewall delete rule name="${APP_NAME}"'
|
nsExec::Exec 'netsh advfirewall firewall delete rule name="${APP_NAME}"'
|
||||||
|
RMDir /r "$INSTDIR\bin"
|
||||||
|
RMDir /r "$INSTDIR\logs"
|
||||||
|
RMDir /r "$INSTDIR\service"
|
||||||
|
Delete "$INSTDIR\${PRODUCT_NAME}.exe"
|
||||||
|
Delete "$INSTDIR\uninstall.exe"
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
####################################################################
|
####################################################################
|
||||||
# Functions
|
# Functions
|
||||||
|
|
||||||
Function CreateStartupShortcut
|
Function CreateStartupShortcut
|
||||||
CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"
|
CreateShortCut "$SMSTARTUP\${APP_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ pub async fn run(sender: Sender<Event>, receiver: Receiver<Event>) {
|
|||||||
// }
|
// }
|
||||||
WindowEvent::CloseRequested { api, .. } => {
|
WindowEvent::CloseRequested { api, .. } => {
|
||||||
api.prevent_close();
|
api.prevent_close();
|
||||||
|
event.window().minimize().unwrap();
|
||||||
event.window().hide().unwrap();
|
event.window().hide().unwrap();
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
@@ -98,7 +99,7 @@ pub async fn run(sender: Sender<Event>, receiver: Receiver<Event>) {
|
|||||||
setup_sender.send(Event::ViewInit).unwrap_or_default();
|
setup_sender.send(Event::ViewInit).unwrap_or_default();
|
||||||
app.listen_global("__action__", move |msg| {
|
app.listen_global("__action__", move |msg| {
|
||||||
match msg.payload().unwrap_or_default() {
|
match msg.payload().unwrap_or_default() {
|
||||||
r#""__init__""# => setup_sender.send(Event::BroswerInit).unwrap_or_default(),
|
r#""__init__""# => setup_sender.send(Event::BrowserInit).unwrap_or_default(),
|
||||||
r#""restart""# => setup_sender
|
r#""restart""# => setup_sender
|
||||||
.send(Event::BrowserAction("restart".to_owned()))
|
.send(Event::BrowserAction("restart".to_owned()))
|
||||||
.unwrap_or_default(),
|
.unwrap_or_default(),
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ pub async fn create(sender: Sender<Event>, receiver: Receiver<Event>) {
|
|||||||
for _ in 1..buffer {
|
for _ in 1..buffer {
|
||||||
match receiver.recv_timeout(Duration::from_nanos(1)) {
|
match receiver.recv_timeout(Duration::from_nanos(1)) {
|
||||||
Ok(event) => match event {
|
Ok(event) => match event {
|
||||||
Event::BroswerInit => {
|
Event::BrowserInit => {
|
||||||
send(Event::BrowserUpdate(("file".to_owned(), file.to_owned())));
|
send(Event::BrowserUpdate(("file".to_owned(), file.to_owned())));
|
||||||
}
|
}
|
||||||
Event::BrowserAction(action) => match action.as_str() {
|
Event::BrowserAction(action) => match action.as_str() {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ pub async fn create(sender: Sender<Event>, receiver: Receiver<Event>) {
|
|||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub enum Event {
|
pub enum Event {
|
||||||
BrowserAction(String),
|
BrowserAction(String),
|
||||||
BroswerInit,
|
BrowserInit,
|
||||||
BrowserUpdate((String, String)),
|
BrowserUpdate((String, String)),
|
||||||
BrowserRender(String),
|
BrowserRender(String),
|
||||||
FileChange(String),
|
FileChange(String),
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
{
|
{
|
||||||
"build": {
|
"build": {
|
||||||
"beforeDevCommand": "",
|
"beforeBuildCommand": "npm run build",
|
||||||
"beforeBuildCommand": "",
|
"beforeDevCommand": "npm run dev",
|
||||||
"devPath": "html",
|
"devPath": "http://127.0.0.1:5177/",
|
||||||
"distDir": "html",
|
"distDir": "html/dist",
|
||||||
"withGlobalTauri": true
|
"withGlobalTauri": true
|
||||||
},
|
},
|
||||||
"package": {
|
"package": {
|
||||||
"productName": "rustdesk_server",
|
"productName": "rustdesk_server",
|
||||||
"version": "0.1.1"
|
"version": "0.1.2"
|
||||||
},
|
},
|
||||||
"tauri": {
|
"tauri": {
|
||||||
"allowlist": {
|
"allowlist": {
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
"icons/icon.icns",
|
"icons/icon.icns",
|
||||||
"icons/icon.ico"
|
"icons/icon.ico"
|
||||||
],
|
],
|
||||||
"identifier": "rustdesk_server",
|
"identifier": "rustdesk.server",
|
||||||
"longDescription": "",
|
"longDescription": "",
|
||||||
"macOS": {
|
"macOS": {
|
||||||
"entitlements": null,
|
"entitlements": null,
|
||||||
|
|||||||
Reference in New Issue
Block a user