diff --git a/.github/workflows/bridge.yml b/.github/workflows/bridge.yml
index 4365d97..62f4d5a 100644
--- a/.github/workflows/bridge.yml
+++ b/.github/workflows/bridge.yml
@@ -35,12 +35,14 @@ jobs:
with:
repository: rustdesk/rustdesk
ref: refs/tags/${{ inputs.version }}
+ submodules: recursive
- name: Checkout source code
if: ${{ inputs.version == 'master' }}
uses: actions/checkout@v4
with:
repository: rustdesk/rustdesk
+ submodules: recursive
- name: Install prerequisites
run: |
diff --git a/.github/workflows/generator-android.yml b/.github/workflows/generator-android.yml
index b0ad3a3..5ce94ca 100644
--- a/.github/workflows/generator-android.yml
+++ b/.github/workflows/generator-android.yml
@@ -200,12 +200,14 @@ jobs:
with:
repository: rustdesk/rustdesk
ref: refs/tags/${{ env.VERSION }}
+ submodules: recursive
- name: Checkout source code
if: ${{ env.VERSION == 'master' }}
uses: actions/checkout@v4
with:
repository: rustdesk/rustdesk
+ submodules: recursive
- name: Install flutter
uses: subosito/flutter-action@v2
diff --git a/.github/workflows/generator-linux.yml b/.github/workflows/generator-linux.yml
index f2490bc..350b41a 100644
--- a/.github/workflows/generator-linux.yml
+++ b/.github/workflows/generator-linux.yml
@@ -163,12 +163,14 @@ jobs:
with:
repository: rustdesk/rustdesk
ref: refs/tags/${{ env.VERSION }}
+ submodules: recursive
- name: Checkout source code
if: ${{ env.VERSION == 'master' }}
uses: actions/checkout@v4
with:
repository: rustdesk/rustdesk
+ submodules: recursive
- name: Set Swap Space
if: ${{ matrix.job.arch == 'x86_64' }}
diff --git a/.github/workflows/generator-macos.yml b/.github/workflows/generator-macos.yml
index 1f68d3d..9ccbf3e 100644
--- a/.github/workflows/generator-macos.yml
+++ b/.github/workflows/generator-macos.yml
@@ -142,12 +142,14 @@ jobs:
with:
repository: rustdesk/rustdesk
ref: refs/tags/${{ env.VERSION }}
+ submodules: recursive
- name: Checkout source code
if: ${{ env.VERSION == 'master' }}
uses: actions/checkout@v4
with:
repository: rustdesk/rustdesk
+ submodules: recursive
- name: Restore bridge files
uses: actions/download-artifact@master
diff --git a/.github/workflows/generator-windows.yml b/.github/workflows/generator-windows.yml
index 789e7a8..2e5e3be 100644
--- a/.github/workflows/generator-windows.yml
+++ b/.github/workflows/generator-windows.yml
@@ -153,12 +153,14 @@ jobs:
with:
repository: rustdesk/rustdesk
ref: refs/tags/${{ env.VERSION }}
+ submodules: recursive
- name: Checkout source code
if: ${{ env.VERSION == 'master' }}
uses: actions/checkout@v4
with:
repository: rustdesk/rustdesk
+ submodules: recursive
- name: Restore bridge files
uses: actions/download-artifact@master
diff --git a/.github/workflows/pre137-bridge.yml b/.github/workflows/pre137-bridge.yml
new file mode 100644
index 0000000..4365d97
--- /dev/null
+++ b/.github/workflows/pre137-bridge.yml
@@ -0,0 +1,110 @@
+# This yaml shares the build bridge steps with ci and nightly.
+name: Build flutter-rust-bridge
+# 2023-11-23 18:00:00+00:00
+
+on:
+ workflow_call:
+ inputs:
+ version:
+ description: 'Rustdesk Version'
+ required: true
+ default: '1.3.1'
+ type: string
+
+env:
+ FLUTTER_VERSION: "3.22.3"
+ FLUTTER_RUST_BRIDGE_VERSION: "1.80.1"
+ RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503
+
+jobs:
+ generate_bridge:
+ runs-on: ${{ matrix.job.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ job:
+ - {
+ target: x86_64-unknown-linux-gnu,
+ os: ubuntu-20.04,
+ extra-build-args: "",
+ }
+ steps:
+ - name: Checkout source code
+ if: ${{ inputs.version != 'master' }}
+ uses: actions/checkout@v4
+ with:
+ repository: rustdesk/rustdesk
+ ref: refs/tags/${{ inputs.version }}
+
+ - name: Checkout source code
+ if: ${{ inputs.version == 'master' }}
+ uses: actions/checkout@v4
+ with:
+ repository: rustdesk/rustdesk
+
+ - name: Install prerequisites
+ run: |
+ sudo apt-get install ca-certificates -y
+ sudo apt-get update -y
+ sudo apt-get install -y \
+ clang \
+ cmake \
+ curl \
+ gcc \
+ git \
+ g++ \
+ libclang-10-dev \
+ libgtk-3-dev \
+ llvm-10-dev \
+ nasm \
+ ninja-build \
+ pkg-config \
+ wget
+
+ - name: Install Rust toolchain
+ uses: dtolnay/rust-toolchain@v1
+ with:
+ toolchain: ${{ env.RUST_VERSION }}
+ targets: ${{ matrix.job.target }}
+ components: "rustfmt"
+
+ - uses: Swatinem/rust-cache@v2
+ with:
+ prefix-key: bridge-${{ matrix.job.os }}
+
+ - name: Cache Bridge
+ id: cache-bridge
+ uses: actions/cache@v3
+ with:
+ path: /tmp/flutter_rust_bridge
+ key: vcpkg-${{ matrix.job.arch }}
+
+ - name: Install flutter
+ uses: subosito/flutter-action@v2
+ with:
+ channel: "stable"
+ flutter-version: ${{ env.FLUTTER_VERSION }}
+ cache: true
+
+ - name: Install flutter rust bridge deps
+ shell: bash
+ run: |
+ cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" --locked
+ pushd flutter && sed -i -e 's/extended_text: 14.0.0/extended_text: 13.0.0/g' pubspec.yaml && flutter pub get && popd
+
+ - name: Run flutter rust bridge
+ run: |
+ ~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart --c-output ./flutter/macos/Runner/bridge_generated.h
+ cp ./flutter/macos/Runner/bridge_generated.h ./flutter/ios/Runner/bridge_generated.h
+
+ - name: Upload Artifact
+ uses: actions/upload-artifact@master
+ with:
+ name: bridge-artifact
+ path: |
+ ./src/bridge_generated.rs
+ ./src/bridge_generated.io.rs
+ ./flutter/lib/generated_bridge.dart
+ ./flutter/lib/generated_bridge.freezed.dart
+ ./flutter/macos/Runner/bridge_generated.h
+ ./flutter/ios/Runner/bridge_generated.h
\ No newline at end of file
diff --git a/.github/workflows/pre137-generator-android.yml b/.github/workflows/pre137-generator-android.yml
new file mode 100644
index 0000000..938dc81
--- /dev/null
+++ b/.github/workflows/pre137-generator-android.yml
@@ -0,0 +1,624 @@
+name: Custom Android Client Generator
+run-name: Custom Android Client Generator
+on:
+ workflow_dispatch:
+ inputs:
+ server:
+ description: 'Rendezvous Server'
+ required: true
+ default: ''
+ type: string
+ key:
+ description: 'Public Key'
+ required: true
+ default: ''
+ type: string
+ apiServer:
+ description: 'API Server'
+ required: true
+ default: ''
+ type: string
+ custom:
+ description: "Custom JSON"
+ required: true
+ default: ''
+ type: string
+ uuid:
+ description: "uuid of request"
+ required: true
+ default: ''
+ type: string
+ iconlink:
+ description: "icon link"
+ required: false
+ default: 'false'
+ type: string
+ logolink:
+ description: "logo link"
+ required: false
+ default: 'false'
+ type: string
+ appname:
+ description: "app name"
+ required: true
+ default: 'rustdesk'
+ type: string
+ filename:
+ description: "Filename"
+ required: true
+ default: 'rustdesk'
+ type: string
+ extras:
+ description: "extra inputs in json"
+ required: true
+ default: '{}'
+ type: string
+
+
+env:
+ SCITER_RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503, also 1.78 has ABI change which causes our sciter version not working, https://blog.rust-lang.org/2024/03/30/i128-layout-update.html
+ RUST_VERSION: "1.75" # sciter failed on m1 with 1.78 because of https://blog.rust-lang.org/2024/03/30/i128-layout-update.html
+ CARGO_NDK_VERSION: "3.1.2"
+ SCITER_ARMV7_CMAKE_VERSION: "3.29.7"
+ SCITER_NASM_DEBVERSION: "2.14-1"
+ LLVM_VERSION: "15.0.6"
+ FLUTTER_VERSION: "3.24.5"
+ ANDROID_FLUTTER_VERSION: "3.24.5"
+ # for arm64 linux because official Dart SDK does not work
+ FLUTTER_ELINUX_VERSION: "3.16.9"
+ TAG_NAME: "${{ inputs.upload-tag }}"
+ VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
+ # vcpkg version: 2024.07.12
+ VCPKG_COMMIT_ID: "b2cb0da531c2f1f740045bfe7c4dac59f0b2b69c"
+ VERSION: "${{ fromJson(inputs.extras).version }}"
+ NDK_VERSION: "r27c"
+ #signing keys env variable checks
+ ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
+ MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}"
+ # To make a custom build with your own servers set the below secret values
+ RS_PUB_KEY: "${{ inputs.key }}"
+ RENDEZVOUS_SERVER: "${{ inputs.server }}"
+ CUSTOM: "${{ inputs.custom }}"
+ UUIDFOLDER: "${{ inputs.uuid }}"
+ API_SERVER: "${{ inputs.apiServer }}"
+ UPLOAD_ARTIFACT: 'true'
+ SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}"
+ ICONBASE64: "$${{ inputs.iconbase64 }}"
+ STATUS_URL: "${{ secrets.GENURL }}/updategh"
+
+jobs:
+ generate-bridge-linux:
+ uses: ./.github/workflows/pre137-bridge.yml
+ with:
+ version: ${{ fromJson(inputs.extras).version }}
+
+ build-rustdesk-android:
+ needs: [generate-bridge-linux]
+ name: build rustdesk android apk ${{ matrix.job.target }}
+ runs-on: ${{ matrix.job.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ job:
+ - {
+ arch: aarch64,
+ target: aarch64-linux-android,
+ os: ubuntu-20.04,
+ reltype: release,
+ suffix: "",
+ }
+ - {
+ arch: armv7,
+ target: armv7-linux-androideabi,
+ os: ubuntu-20.04,
+ reltype: release,
+ suffix: "",
+ }
+ - {
+ arch: x86_64,
+ target: x86_64-linux-android,
+ os: ubuntu-20.04,
+ reltype: release,
+ suffix: "",
+ }
+ steps:
+ - name: Free Disk Space (Ubuntu)
+ uses: jlumbroso/free-disk-space@main
+ with:
+ tool-cache: false
+ android: false
+ dotnet: true
+ haskell: true
+ large-packages: false
+ docker-images: true
+ swap-storage: false
+
+ - name: Export GitHub Actions cache environment variables
+ uses: actions/github-script@v6
+ with:
+ script: |
+ core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
+ core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
+
+ - name: Set rdgen value
+ if: ${{ fromJson(inputs.extras).rdgen == 'true' }}
+ run: |
+ echo "STATUS_URL=${{ secrets.GENURL }}/updategh" >> $GITHUB_ENV
+
+ - name: Set rdgen value
+ if: ${{ fromJson(inputs.extras).rdgen == 'false' }}
+ run: |
+ echo "STATUS_URL=${{ inputs.apiServer }}/api/updategh" >> $GITHUB_ENV
+
+ - name: Report Status
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "5% complete"}'
+
+ - name: Install dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y \
+ clang \
+ cmake \
+ curl \
+ gcc-multilib \
+ git \
+ g++ \
+ g++-multilib \
+ imagemagick \
+ libayatana-appindicator3-dev \
+ libasound2-dev \
+ libc6-dev \
+ libclang-10-dev \
+ libgstreamer1.0-dev \
+ libgstreamer-plugins-base1.0-dev \
+ libgtk-3-dev \
+ libpam0g-dev \
+ libpulse-dev \
+ libva-dev \
+ libvdpau-dev \
+ libxcb-randr0-dev \
+ libxcb-shape0-dev \
+ libxcb-xfixes0-dev \
+ libxdo-dev \
+ libxfixes-dev \
+ llvm-10-dev \
+ nasm \
+ ninja-build \
+ openjdk-17-jdk-headless \
+ pkg-config \
+ tree \
+ wget
+
+ - name: Checkout source code
+ if: ${{ env.VERSION != 'master' }}
+ uses: actions/checkout@v4
+ with:
+ repository: rustdesk/rustdesk
+ ref: refs/tags/${{ env.VERSION }}
+
+ - name: Checkout source code
+ if: ${{ env.VERSION == 'master' }}
+ uses: actions/checkout@v4
+ with:
+ repository: rustdesk/rustdesk
+
+ - name: Install flutter
+ uses: subosito/flutter-action@v2
+ with:
+ channel: "stable"
+ flutter-version: ${{ env.ANDROID_FLUTTER_VERSION }}
+
+ - name: Patch flutter
+ continue-on-error: true
+ run: |
+ cd $(dirname $(dirname $(which flutter)))
+ [[ "3.24.5" == ${{env.ANDROID_FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
+
+
+ - uses: nttld/setup-ndk@v1
+ id: setup-ndk
+ with:
+ ndk-version: ${{ env.NDK_VERSION }}
+ add-to-path: true
+
+ - name: Setup vcpkg with Github Actions binary cache
+ uses: lukka/run-vcpkg@v11
+ with:
+ vcpkgDirectory: /opt/artifacts/vcpkg
+ vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
+ doNotCache: false
+
+ - name: Report Status
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "15% complete"}'
+
+ - name: Install vcpkg dependencies
+ run: |
+ case ${{ matrix.job.target }} in
+ aarch64-linux-android)
+ ANDROID_TARGET=arm64-v8a
+ ;;
+ armv7-linux-androideabi)
+ ANDROID_TARGET=armeabi-v7a
+ ;;
+ x86_64-linux-android)
+ ANDROID_TARGET=x86_64
+ ;;
+ i686-linux-android)
+ ANDROID_TARGET=x86
+ ;;
+ esac
+ if ! ./flutter/build_android_deps.sh "${ANDROID_TARGET}"; then
+ find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do
+ echo "$_1:"
+ echo "======"
+ cat "$_1"
+ echo "======"
+ echo ""
+ done
+ exit 1
+ fi
+ shell: bash
+
+ - name: Restore bridge files
+ uses: actions/download-artifact@master
+ with:
+ name: bridge-artifact
+ path: ./
+
+ - name: Install Rust toolchain
+ uses: dtolnay/rust-toolchain@v1
+ with:
+ toolchain: ${{ env.RUST_VERSION }}
+ components: "rustfmt"
+
+ - uses: Swatinem/rust-cache@v2
+ with:
+ prefix-key: rustdesk-lib-cache-android # TODO: drop '-android' part after caches are invalidated
+ key: ${{ matrix.job.target }}
+
+ ###########################################################echo "${{ inputs.iconbase64 }}" | base64 -d > ./res/icon.png
+ - name: icon stuff
+ if: ${{ inputs.iconlink != 'false' }}
+ continue-on-error: true
+ shell: bash
+ run: |
+ mv ./res/icon.ico ./res/icon.ico.bak
+ mv ./res/icon.png ./res/icon.png.bak
+ mv ./res/tray-icon.ico ./res/tray-icon.ico.bak
+ #echo "${{ inputs.iconbase64 }}" | base64 -d > ./res/icon.png
+ wget -O ./res/icon.png ${{ fromJson(inputs.iconlink).url }}/get_png?filename=${{ fromJson(inputs.iconlink).file }}"&"uuid=${{ fromJson(inputs.iconlink).uuid }}
+ mv ./res/32x32.png ./res/32x32.png.bak
+ mv ./res/64x64.png ./res/64x64.png.bak
+ mv ./res/128x128.png ./res/128x128.png.bak
+ mv ./res/128x128@2x.png ./res/128x128@2x.png.bak
+ convert ./res/icon.png -define icon:auto-resize=256,64,48,32,16 ./res/icon.ico
+ convert ./res/icon.png -define icon:auto-resize=256,64,48,32,16 ./res/tray-icon.ico
+ cp ./res/icon.ico ./res/tray-icon.ico
+ convert ./res/icon.png -resize 32x32 ./res/32x32.png
+ convert ./res/icon.png -resize 64x64 ./res/64x64.png
+ convert ./res/icon.png -resize 128x128 ./res/128x128.png
+ convert ./res/128x128.png -resize 200% ./res/128x128@2x.png
+ cp ./src/ui.rs ./src/ui.rs.bak
+ b64=$(base64 < ./res/icon.png)
+ sed -i -e 's|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|$(echo "$b64")|' ./src/ui.rs
+ b64=""
+ sed -i '/android: true/a \ \ adaptive_icon_background: "#ffffff"' ./flutter/pubspec.yaml
+ sed -i '/adaptive_icon_background/a \ \ adaptive_icon_foreground: "../res/icon.png"' ./flutter/pubspec.yaml
+ sed -i '/adaptive_icon_foreground:/a \ \ adaptive_icon_foreground_inset: 32' ./flutter/pubspec.yaml
+ sed -i '/ic_launcher_background/d' ./flutter/android/app/src/main/res/values/colors.xml
+
+ - name: change appname to custom
+ if: inputs.appname != 'rustdesk'
+ continue-on-error: true
+ shell: bash
+ run: |
+ sed -i -e 's|description = "RustDesk Remote Desktop"|description = "${{ inputs.appname }}"|' ./Cargo.toml
+ sed -i -e 's|ProductName = "RustDesk"|ProductName = "${{ inputs.appname }}"|' ./Cargo.toml
+ sed -i -e 's|FileDescription = "RustDesk Remote Desktop"|FileDescription = "${{ inputs.appname }}"|' ./Cargo.toml
+ sed -i -e 's|OriginalFilename = "rustdesk.exe"|OriginalFilename = "${{ inputs.appname }}.exe"|' ./Cargo.toml
+ sed -i 's|name = "RustDesk"|name = "${{ inputs.appname }}"|' ./Cargo.toml
+ sed -i -e 's|description = "RustDesk Remote Desktop"|description = "${{ inputs.appname }}"|' ./libs/portable/Cargo.toml
+ sed -i -e 's|ProductName = "RustDesk"|ProductName = "${{ inputs.appname }}"|' ./libs/portable/Cargo.toml
+ sed -i -e 's|FileDescription = "RustDesk Remote Desktop"|FileDescription = "${{ inputs.appname }}"|' ./libs/portable/Cargo.toml
+ sed -i -e 's|OriginalFilename = "rustdesk.exe"|OriginalFilename = "${{ inputs.appname }}.exe"|' ./libs/portable/Cargo.toml
+ sed -i -e 's|"RustDesk Remote Desktop"|"${{ inputs.appname }}"|' ./flutter/windows/runner/Runner.rc
+ sed -i -e 's|VALUE "InternalName", "rustdesk" "\0"|VALUE "InternalName", "${{ inputs.appname }}" "\0"|' ./flutter/windows/runner/Runner.rc
+ sed -i -e 's|"Copyright © 2024 Purslane Ltd. All rights reserved."|"Copyright © 2024"|' ./flutter/windows/runner/Runner.rc
+ sed -i -e 's|"rustdesk.exe"|"${{ inputs.filename }}"|' ./flutter/windows/runner/Runner.rc
+ sed -i -e 's|"RustDesk"|"${{ inputs.appname }}"|' ./flutter/windows/runner/Runner.rc
+ sed -i -e 's|RustDesk|${{ inputs.appname }}|' ./src/lang/en.rs
+ sed -i -e 's|RustDesk|${{ inputs.appname }}|' ./flutter/android/app/src/main/res/values/strings.xml
+ sed -i -e "s|title: 'RustDesk'|title: '${{ inputs.appname }}'|" ./flutter/lib/main.dart
+ sed -i -e "s|return 'RustDesk';|return '${{ inputs.appname }}';|" ./flutter/lib/web/bridge.dart
+ sed -i 's|android:label="RustDesk"|android:label="${{ inputs.appname }}"|' ./flutter/android/app/src/main/AndroidManifest.xml
+ sed -i 's|android:label="RustDesk Input"|android:label="${{ inputs.appname }} Input"|' ./flutter/android/app/src/main/AndroidManifest.xml
+ sed -i 's|RustDesk is Open|${{ inputs.appname }} is Open|' ./flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/BootReceiver.kt
+ sed -i 's|Show Rustdesk|Show ${{ inputs.appname }}|' ./flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/FloatingWindowService.kt
+ sed -i 's|"RustDesk"|"${{ inputs.appname }}"|' ./flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt
+ sed -i 's|"RustDesk Service|"${{ inputs.appname }} Service|' ./flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt
+ sed -i 's|RustDesk|${{ inputs.appname }}|' ./flutter/lib/main.dart
+ sed -i 's|"RustDesk"|"${{ inputs.appname }}"|' ./flutter/lib/desktop/widgets/tabbar_widget.dart
+ sed -i 's|"RustDesk"|"${{ inputs.appname }}"|' ./libs/hbb_common/src/config.rs
+
+ - name: change url to custom
+ if: fromJson(inputs.extras).urlLink != 'https://rustdesk.com'
+ continue-on-error: true
+ shell: bash
+ run: |
+ sed -i -e 's|Homepage: https://rustdesk.com|Homepage: ${{ fromJson(inputs.extras).urlLink }}|' ./build.py
+ sed -i -e "s|launchUrl(Uri.parse('https://rustdesk.com'));|launchUrl(Uri.parse('${{ fromJson(inputs.extras).urlLink }}'));|" ./flutter/lib/common.dart
+ sed -i -e "s|launchUrlString('https://rustdesk.com');|launchUrlString('${{ fromJson(inputs.extras).urlLink }}');|" ./flutter/lib/desktop/pages/desktop_setting_page.dart
+ sed -i -e "s|launchUrlString('https://rustdesk.com/privacy.html')|launchUrlString('${{ fromJson(inputs.extras).urlLink }}/privacy.html')|" ./flutter/lib/desktop/pages/desktop_setting_page.dart
+ sed -i -e "s|const url = 'https://rustdesk.com/';|const url = '${{ fromJson(inputs.extras).urlLink }}';|" ./flutter/lib/mobile/pages/settings_page.dart
+ sed -i -e "s|launchUrlString('https://rustdesk.com/privacy.html')|launchUrlString('${{ fromJson(inputs.extras).urlLink }}/privacy.html')|" ./flutter/lib/mobile/pages/settings_page.dart
+ sed -i -e "s|https://rustdesk.com/privacy.html|${{ fromJson(inputs.extras).urlLink }}/privacy.html|" ./flutter/lib/desktop/pages/install_page.dart
+
+ - name: allow custom.txt
+ continue-on-error: true
+ shell: bash
+ run: |
+ sed -i -e '/const KEY:/,/};/d' ./src/common.rs
+ sed -i -e '/let Ok(data) = sign::verify(&data, &pk)/,/};/d' ./src/common.rs
+ sed -i '/intl:/a \ \ archive: ^3.6.1' ./flutter/pubspec.yaml
+
+ - name: fix connection delay
+ continue-on-error: true
+ if: ${{ fromJson(inputs.extras).delayFix == 'true' }}
+ shell: bash
+ run: |
+ sed -i -e '/if !key.is_empty() && !token.is_empty() {/,/}/d' ./src/client.rs
+
+ - name: add cycle monitors to toolbar
+ continue-on-error: true
+ if: fromJson(inputs.extras).cycleMonitor == 'true'
+ run: |
+ wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/cycle_monitor.diff
+ git apply cycle_monitor.diff
+
+ - name: use X for offline display instead of orange circle
+ continue-on-error: true
+ if: fromJson(inputs.extras).xOffline == 'true'
+ run: |
+ wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/xoffline.diff
+ git apply xoffline.diff
+
+ - name: hide-cm
+ continue-on-error: true
+ if: fromJson(inputs.extras).hidecm == 'true'
+ run: |
+ wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/hidecm.diff
+ git apply hidecm.diff
+
+ - name: statussort
+ continue-on-error: true
+ if: fromJson(inputs.extras).statussort == 'true'
+ run: |
+ wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/statussort.diff
+ git apply statussort.diff
+
+ - name: Report Status
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "35% complete"}'
+
+ - name: replace flutter icons
+ if: ${{ inputs.iconlink != 'false' }}
+ run: |
+ pushd ./flutter
+ flutter pub get
+ dart run flutter_launcher_icons
+ popd
+ sed -i '/ic_launcher_background/d' ./flutter/android/app/src/main/res/values/colors.xml
+ ##########################################################
+
+ - name: Build rustdesk lib
+ env:
+ ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
+ ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }}
+ run: |
+ rustup target add ${{ matrix.job.target }}
+ cargo install cargo-ndk --version ${{ env.CARGO_NDK_VERSION }} --locked
+ case ${{ matrix.job.target }} in
+ aarch64-linux-android)
+ ./flutter/ndk_arm64.sh
+ mkdir -p ./flutter/android/app/src/main/jniLibs/arm64-v8a
+ cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so
+ ;;
+ armv7-linux-androideabi)
+ ./flutter/ndk_arm.sh
+ mkdir -p ./flutter/android/app/src/main/jniLibs/armeabi-v7a
+ cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so
+ ;;
+ x86_64-linux-android)
+ ./flutter/ndk_x64.sh
+ mkdir -p ./flutter/android/app/src/main/jniLibs/x86_64
+ cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86_64/librustdesk.so
+ ;;
+ i686-linux-android)
+ ./flutter/ndk_x86.sh
+ mkdir -p ./flutter/android/app/src/main/jniLibs/x86
+ cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86/librustdesk.so
+ ;;
+ esac
+
+ - name: Upload Rustdesk library to Artifacts
+ uses: actions/upload-artifact@master
+ with:
+ name: librustdesk.so.${{ matrix.job.target }}
+ path: ./target/${{ matrix.job.target }}/release/liblibrustdesk.so
+
+ - name: Report Status
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "45% complete"}'
+
+ - name: Build rustdesk
+ shell: bash
+ env:
+ JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
+ run: |
+ export PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:$PATH
+ # temporary use debug sign config
+ sed -i "s/signingConfigs.release/signingConfigs.debug/g" ./flutter/android/app/build.gradle
+ case ${{ matrix.job.target }} in
+ aarch64-linux-android)
+ mkdir -p ./flutter/android/app/src/main/jniLibs/arm64-v8a
+ cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/
+ cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so
+ echo -n "${{ env.CUSTOM }}" | cat > ./flutter/assets/custom.txt
+ #sed -i '/^ - assets\//a\ - assets/custom.txt' ./flutter/pubspec.yaml
+ if [[ "${{ inputs.iconlink }}" != "false" ]]; then
+ mv ./flutter/assets/icon.svg ./flutter/assets/icon.svg.bak
+ convert ./res/icon.png ./flutter/assets/icon.svg
+ convert ./res/128x128.png -resize 200% ./flutter/assets/128x128@2x.png
+ convert ./res/icon.png ./res/scalable.svg
+ fi
+ # build flutter
+ pushd flutter
+ flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-arm64 --split-per-abi
+ mv build/app/outputs/flutter-apk/app-arm64-v8a-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk
+ ;;
+ armv7-linux-androideabi)
+ mkdir -p ./flutter/android/app/src/main/jniLibs/armeabi-v7a
+ cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/
+ cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so
+ echo -n "${{ env.CUSTOM }}" | cat > ./flutter/assets/custom.txt
+ #sed -i '/^ - assets\//a\ - assets/custom.txt' ./flutter/pubspec.yaml
+ if [[ "${{ inputs.iconlink }}" != "false" ]]; then
+ mv ./flutter/assets/icon.svg ./flutter/assets/icon.svg.bak
+ convert ./res/icon.png ./flutter/assets/icon.svg
+ convert ./res/128x128.png -resize 200% ./flutter/assets/128x128@2x.png
+ convert ./res/icon.png ./res/scalable.svg
+ fi
+ # build flutter
+ pushd flutter
+ flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-arm --split-per-abi
+ mv build/app/outputs/flutter-apk/app-armeabi-v7a-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk
+ ;;
+ x86_64-linux-android)
+ mkdir -p ./flutter/android/app/src/main/jniLibs/x86_64
+ cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/x86_64/
+ cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86_64/librustdesk.so
+ echo -n "${{ env.CUSTOM }}" | cat > ./flutter/assets/custom.txt
+ #sed -i '/^ - assets\//a\ - assets/custom.txt' ./flutter/pubspec.yaml
+ if [[ "${{ inputs.iconlink }}" != "false" ]]; then
+ mv ./flutter/assets/icon.svg ./flutter/assets/icon.svg.bak
+ convert ./res/icon.png ./flutter/assets/icon.svg
+ convert ./res/128x128.png -resize 200% ./flutter/assets/128x128@2x.png
+ convert ./res/icon.png ./res/scalable.svg
+ fi
+ # build flutter
+ pushd flutter
+ flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-x64 --split-per-abi
+ mv build/app/outputs/flutter-apk/app-x86_64-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk
+ ;;
+ i686-linux-android)
+ mkdir -p ./flutter/android/app/src/main/jniLibs/x86
+ cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/x86/
+ cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86/librustdesk.so
+ echo -n "${{ env.CUSTOM }}" | cat > ./flutter/assets/custom.txt
+ #sed -i '/^ - assets\//a\ - assets/custom.txt' ./flutter/pubspec.yaml
+ if [[ "${{ inputs.iconlink }}" != "false" ]]; then
+ mv ./flutter/assets/icon.svg ./flutter/assets/icon.svg.bak
+ convert ./res/icon.png ./flutter/assets/icon.svg
+ convert ./res/128x128.png -resize 200% ./flutter/assets/128x128@2x.png
+ convert ./res/icon.png ./res/scalable.svg
+ fi
+ # build flutter
+ pushd flutter
+ flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-x86 --split-per-abi
+ mv build/app/outputs/flutter-apk/app-x86-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk
+ ;;
+ esac
+ popd
+ mkdir -p signed-apk; pushd signed-apk
+ mv ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk ./${{ inputs.filename }}-${{ matrix.job.arch }}.apk
+ popd
+
+ - name: Report Status
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "75% complete"}'
+
+ - uses: r0adkll/sign-android-release@v1
+ name: Sign app APK
+ continue-on-error: true
+ if: env.ANDROID_SIGNING_KEY != null
+ id: sign-rustdesk
+ with:
+ releaseDirectory: ./signed-apk
+ signingKeyBase64: ${{ secrets.ANDROID_SIGNING_KEY }}
+ alias: ${{ secrets.ANDROID_ALIAS }}
+ keyStorePassword: ${{ secrets.ANDROID_KEY_STORE_PASSWORD }}
+ keyPassword: ${{ secrets.ANDROID_KEY_PASSWORD }}
+ env:
+ # override default build-tools version (29.0.3) -- optional
+ BUILD_TOOLS_VERSION: "30.0.2"
+
+ - name: send file to rdgen server
+ if: ${{ fromJson(inputs.extras).rdgen == 'true' }}
+ shell: bash
+ run: |
+ curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" -F "file=@./signed-apk/${{ inputs.filename }}-${{ matrix.job.arch }}.apk" -F "uuid=${{ inputs.uuid }}" ${{ secrets.GENURL }}/save_custom_client
+
+ - name: send file to api server
+ if: ${{ fromJson(inputs.extras).rdgen == 'false' }}
+ shell: bash
+ run: |
+ curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" -F "file=@./signed-apk/${{ inputs.filename }}-${{ matrix.job.arch }}.apk" ${{ inputs.apiServer }}/api/save_custom_client
+ # uses: SamKirkland/FTP-Deploy-Action@v4.3.5
+ # with:
+ # server: ${{ secrets.GEN_FTP_SERVER }}
+ # username: ${{ secrets.GEN_FTP_USER }}
+ # password: ${{ secrets.GEN_FTP_PASSWORD }}
+ # local-dir: ./signed-apk/
+ # server-dir: /root/rdgen/exe/${{ env.UUIDFOLDER }}/
+ # exclude: |
+ # *.idsig
+ # *.jks
+ # *aligned.apk
+
+ - name: Report Status
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "Success"}'
+
+ - name: failed
+ if: failure()
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation failed, try again"}'
+
+ - name: failed
+ if: cancelled()
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation cancelled, try again"}'
\ No newline at end of file
diff --git a/.github/workflows/pre137-generator-linux.yml b/.github/workflows/pre137-generator-linux.yml
new file mode 100644
index 0000000..b3e477b
--- /dev/null
+++ b/.github/workflows/pre137-generator-linux.yml
@@ -0,0 +1,636 @@
+name: Custom Linux Client Generator
+run-name: Custom Linux Client Generator
+on:
+ workflow_dispatch:
+ inputs:
+ server:
+ description: 'Rendezvous Server'
+ required: true
+ default: ''
+ type: string
+ key:
+ description: 'Public Key'
+ required: true
+ default: ''
+ type: string
+ apiServer:
+ description: 'API Server'
+ required: true
+ default: ''
+ type: string
+ custom:
+ description: "Custom JSON"
+ required: true
+ default: ''
+ type: string
+ uuid:
+ description: "uuid of request"
+ required: true
+ default: ''
+ type: string
+ iconlink:
+ description: "icon link"
+ required: false
+ default: 'false'
+ type: string
+ logolink:
+ description: "logo link"
+ required: false
+ default: 'false'
+ type: string
+ appname:
+ description: "app name"
+ required: true
+ default: 'rustdesk'
+ type: string
+ filename:
+ description: "Filename"
+ required: true
+ default: 'rustdesk'
+ type: string
+ extras:
+ description: "extra inputs in json"
+ required: true
+ default: '{}'
+ type: string
+
+env:
+ SCITER_RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503, also 1.78 has ABI change which causes our sciter version not working, https://blog.rust-lang.org/2024/03/30/i128-layout-update.html
+ RUST_VERSION: "1.75" # sciter failed on m1 with 1.78 because of https://blog.rust-lang.org/2024/03/30/i128-layout-update.html
+ CARGO_NDK_VERSION: "3.1.2"
+ SCITER_ARMV7_CMAKE_VERSION: "3.29.7"
+ SCITER_NASM_DEBVERSION: "2.14-1"
+ LLVM_VERSION: "15.0.6"
+ FLUTTER_VERSION: "3.24.5"
+ ANDROID_FLUTTER_VERSION: "3.24.5"
+ FLUTTER_RUST_BRIDGE_VERSION: "1.80.1"
+ # for arm64 linux because official Dart SDK does not work
+ FLUTTER_ELINUX_VERSION: "3.16.9"
+ TAG_NAME: "${{ inputs.upload-tag }}"
+ VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
+ # vcpkg version: 2024.07.12
+ VCPKG_COMMIT_ID: "b2cb0da531c2f1f740045bfe7c4dac59f0b2b69c"
+ VERSION: "${{ fromJson(inputs.extras).version }}"
+ NDK_VERSION: "r27c"
+ #signing keys env variable checks
+ ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
+ MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}"
+ # To make a custom build with your own servers set the below secret values
+ RS_PUB_KEY: "${{ inputs.key }}"
+ RENDEZVOUS_SERVER: "${{ inputs.server }}"
+ CUSTOM: "${{ inputs.custom }}"
+ UUIDFOLDER: "${{ inputs.uuid }}"
+ API_SERVER: "${{ inputs.apiServer }}"
+ UPLOAD_ARTIFACT: 'true'
+ SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}"
+ ICONBASE64: "$${{ inputs.iconbase64 }}"
+ STATUS_URL: "${{ secrets.GENURL }}/updategh"
+
+jobs:
+ generate-bridge-linux:
+ uses: ./.github/workflows/pre137-bridge.yml
+ with:
+ version: ${{ fromJson(inputs.extras).version }}
+
+ build-rustdesk-linux:
+ needs: [generate-bridge-linux]
+ name: build rustdesk linux ${{ matrix.job.target }}
+ runs-on: ${{ matrix.job.on }}
+ strategy:
+ fail-fast: false
+ matrix:
+ # use a high level qemu-user-static
+ job:
+ - {
+ arch: x86_64,
+ target: x86_64-unknown-linux-gnu,
+ distro: ubuntu18.04,
+ on: ubuntu-20.04,
+ deb_arch: amd64,
+ vcpkg-triplet: x64-linux,
+ }
+ # - {
+ # arch: aarch64,
+ # target: aarch64-unknown-linux-gnu,
+ # distro: ubuntu18.04,
+ # on: [self-hosted, Linux, ARM64],
+ # deb_arch: arm64,
+ # vcpkg-triplet: arm64-linux,
+ # }
+ steps:
+ - name: Export GitHub Actions cache environment variables
+ uses: actions/github-script@v6
+ with:
+ script: |
+ core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
+ core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
+
+ - name: Set rdgen value
+ if: ${{ fromJson(inputs.extras).rdgen == 'true' }}
+ run: |
+ echo "STATUS_URL=${{ secrets.GENURL }}/updategh" >> $GITHUB_ENV
+
+ - name: Set rdgen value
+ if: ${{ fromJson(inputs.extras).rdgen == 'false' }}
+ run: |
+ echo "STATUS_URL=${{ inputs.apiServer }}/api/updategh" >> $GITHUB_ENV
+
+ - name: Report Status
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "5% complete"}'
+
+ - name: Maximize build space
+ if: ${{ matrix.job.arch == 'x86_64' }}
+ run: |
+ sudo rm -rf /opt/ghc
+ sudo rm -rf /usr/local/lib/android
+ sudo rm -rf /usr/share/dotnet
+ sudo apt-get update -y
+ sudo apt-get install -y nasm qemu-user-static
+
+ - name: Install dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y imagemagick
+
+ - name: Checkout source code
+ if: ${{ env.VERSION != 'master' }}
+ uses: actions/checkout@v4
+ with:
+ repository: rustdesk/rustdesk
+ ref: refs/tags/${{ env.VERSION }}
+
+ - name: Checkout source code
+ if: ${{ env.VERSION == 'master' }}
+ uses: actions/checkout@v4
+ with:
+ repository: rustdesk/rustdesk
+
+ - name: Set Swap Space
+ if: ${{ matrix.job.arch == 'x86_64' }}
+ uses: pierotofy/set-swap-space@master
+ with:
+ swap-size-gb: 12
+
+ - name: Free Space
+ run: |
+ df -h
+ free -m
+
+ - name: Install Rust toolchain
+ uses: dtolnay/rust-toolchain@v1
+ if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true'
+ with:
+ toolchain: ${{ env.RUST_VERSION }}
+ targets: ${{ matrix.job.target }}
+ components: "rustfmt"
+
+ - name: Save Rust toolchain version
+ run: |
+ RUST_TOOLCHAIN_VERSION=$(cargo --version | awk '{print $2}')
+ echo "RUST_TOOLCHAIN_VERSION=$RUST_TOOLCHAIN_VERSION" >> $GITHUB_ENV
+
+ - name: Disable rust bridge build
+ run: |
+ # only build cdylib
+ sed -i "s/\[\"cdylib\", \"staticlib\", \"rlib\"\]/\[\"cdylib\"\]/g" Cargo.toml
+
+ - name: Report Status
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "15% complete"}'
+
+ - name: Restore bridge files
+ if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true'
+ uses: actions/download-artifact@master
+ with:
+ name: bridge-artifact
+ path: ./
+
+ - name: Setup vcpkg with Github Actions binary cache
+ if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true'
+ uses: lukka/run-vcpkg@v11
+ with:
+ vcpkgDirectory: /opt/artifacts/vcpkg
+ vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
+ doNotCache: false
+
+ - name: Install vcpkg dependencies
+ if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true'
+ run: |
+ sudo apt install -y libva-dev libvdpau-dev
+ if ! $VCPKG_ROOT/vcpkg \
+ install \
+ --triplet ${{ matrix.job.vcpkg-triplet }} \
+ --x-install-root="$VCPKG_ROOT/installed"; then
+ find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do
+ echo "$_1:"
+ echo "======"
+ cat "$_1"
+ echo "======"
+ echo ""
+ done
+ exit 1
+ fi
+ head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true
+ shell: bash
+
+ - name: icon stuff
+ if: ${{ inputs.iconlink != 'false' }}
+ continue-on-error: true
+ shell: bash
+ run: |
+ mv ./res/icon.ico ./res/icon.ico.bak
+ mv ./res/icon.png ./res/icon.png.bak
+ mv ./res/tray-icon.ico ./res/tray-icon.ico.bak
+ #echo "${{ inputs.iconbase64 }}" | base64 -d > ./res/icon.png
+ wget -O ./res/icon.png ${{ fromJson(inputs.iconlink).url }}/get_png?filename=${{ fromJson(inputs.iconlink).file }}"&"uuid=${{ fromJson(inputs.iconlink).uuid }}
+ mv ./res/32x32.png ./res/32x32.png.bak
+ mv ./res/64x64.png ./res/64x64.png.bak
+ mv ./res/128x128.png ./res/128x128.png.bak
+ mv ./res/128x128@2x.png ./res/128x128@2x.png.bak
+ convert ./res/icon.png -define icon:auto-resize=256,64,48,32,16 ./res/icon.ico
+ convert ./res/icon.png -define icon:auto-resize=256,64,48,32,16 ./res/tray-icon.ico
+ cp ./res/icon.ico ./res/tray-icon.ico
+ convert ./res/icon.png -resize 32x32 ./res/32x32.png
+ convert ./res/icon.png -resize 64x64 ./res/64x64.png
+ convert ./res/icon.png -resize 128x128 ./res/128x128.png
+ convert ./res/128x128.png -resize 200% ./res/128x128@2x.png
+ cp ./src/ui.rs ./src/ui.rs.bak
+ b64=$(base64 < ./res/icon.png)
+ sed -i -e 's|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|$(echo "$b64")|' ./src/ui.rs
+ b64=""
+
+ - name: change appname to custom
+ if: inputs.appname != 'rustdesk'
+ continue-on-error: true
+ shell: bash
+ run: |
+ sed -i -e 's|description = "RustDesk Remote Desktop"|description = "${{ inputs.appname }}"|' ./Cargo.toml
+ sed -i -e 's|ProductName = "RustDesk"|ProductName = "${{ inputs.appname }}"|' ./Cargo.toml
+ sed -i -e 's|FileDescription = "RustDesk Remote Desktop"|FileDescription = "${{ inputs.appname }}"|' ./Cargo.toml
+ sed -i -e 's|OriginalFilename = "rustdesk.exe"|OriginalFilename = "${{ inputs.appname }}.exe"|' ./Cargo.toml
+ sed -i -e 's|description = "RustDesk Remote Desktop"|description = "${{ inputs.appname }}"|' ./libs/portable/Cargo.toml
+ sed -i -e 's|ProductName = "RustDesk"|ProductName = "${{ inputs.appname }}"|' ./libs/portable/Cargo.toml
+ sed -i -e 's|FileDescription = "RustDesk Remote Desktop"|FileDescription = "${{ inputs.appname }}"|' ./libs/portable/Cargo.toml
+ sed -i -e 's|OriginalFilename = "rustdesk.exe"|OriginalFilename = "${{ inputs.appname }}.exe"|' ./libs/portable/Cargo.toml
+ sed -i -e 's|RustDesk|${{ inputs.appname }}|' ./src/lang/en.rs
+ sed -i -e '/-p tmpdeb\/usr\/lib\/rustdesk/d' ./build.py
+
+ - name: allow custom.txt
+ continue-on-error: true
+ shell: bash
+ run: |
+ sed -i -e 's|rs-ny.rustdesk.com|${{ env.RENDEZVOUS_SERVER }}|' ./libs/hbb_common/src/config.rs
+ sed -i -e 's|OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw=|${{ env.RS_PUB_KEY }}|' ./libs/hbb_common/src/config.rs
+ sed -i -e 's|For faster connection, please set up your own server||' ./src/lang/en.rs
+ sed -i -e '/const KEY:/,/};/d' ./src/common.rs
+ sed -i -e '/let Ok(data) = sign::verify(&data, &pk)/,/};/d' ./src/common.rs
+ echo -n "${{ env.CUSTOM }}" | cat > ./custom.txt
+ sed -i '/intl:/a \ \ archive: ^3.6.1' ./flutter/pubspec.yaml
+
+ - name: change url to custom
+ if: fromJson(inputs.extras).urlLink != 'https://rustdesk.com'
+ continue-on-error: true
+ shell: bash
+ run: |
+ sed -i -e 's|Homepage: https://rustdesk.com|Homepage: ${{ fromJson(inputs.extras).urlLink }}|' ./build.py
+ sed -i -e "s|launchUrl(Uri.parse('https://rustdesk.com'));|launchUrl(Uri.parse('${{ fromJson(inputs.extras).urlLink }}'));|" ./flutter/lib/common.dart
+ sed -i -e "s|launchUrlString('https://rustdesk.com');|launchUrlString('${{ fromJson(inputs.extras).urlLink }}');|" ./flutter/lib/desktop/pages/desktop_setting_page.dart
+ sed -i -e "s|launchUrlString('https://rustdesk.com/privacy.html')|launchUrlString('${{ fromJson(inputs.extras).urlLink }}/privacy.html')|" ./flutter/lib/desktop/pages/desktop_setting_page.dart
+ sed -i -e "s|const url = 'https://rustdesk.com/';|const url = '${{ fromJson(inputs.extras).urlLink }}';|" ./flutter/lib/mobile/pages/settings_page.dart
+ sed -i -e "s|launchUrlString('https://rustdesk.com/privacy.html')|launchUrlString('${{ fromJson(inputs.extras).urlLink }}/privacy.html')|" ./flutter/lib/mobile/pages/settings_page.dart
+ sed -i -e "s|https://rustdesk.com/privacy.html|${{ fromJson(inputs.extras).urlLink }}/privacy.html|" ./flutter/lib/desktop/pages/install_page.dart
+
+ - name: fix connection delay
+ continue-on-error: true
+ if: ${{ fromJson(inputs.extras).delayFix == 'true' }}
+ shell: bash
+ run: |
+ sed -i -e '/if !key.is_empty() && !token.is_empty() {/,/}/d' ./src/client.rs
+
+ - name: add cycle monitors to toolbar
+ continue-on-error: true
+ if: fromJson(inputs.extras).cycleMonitor == 'true'
+ run: |
+ wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/cycle_monitor.diff
+ git apply cycle_monitor.diff
+
+ - name: use X for offline display instead of orange circle
+ continue-on-error: true
+ if: fromJson(inputs.extras).xOffline == 'true'
+ run: |
+ wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/xoffline.diff
+ git apply xoffline.diff
+
+ - name: hide-cm
+ continue-on-error: true
+ if: fromJson(inputs.extras).hidecm == 'true'
+ run: |
+ wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/hidecm.diff
+ git apply hidecm.diff
+
+ - name: statussort
+ continue-on-error: true
+ if: fromJson(inputs.extras).statussort == 'true'
+ run: |
+ wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/statussort.diff
+ git apply statussort.diff
+
+ - name: Restore bridge files
+ if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true'
+ uses: actions/download-artifact@master
+ with:
+ name: bridge-artifact
+ path: ./
+
+ # - name: logo stuff
+ # if: ${{ inputs.logolink != 'false' }}
+ # continue-on-error: true
+ # shell: bash
+ # run: |
+ # #echo "${{ inputs.logobase64 }}" | base64 -d > ./rustdesk/data/flutter_assets/assets/logo.png
+ # wget -O ./rustdesk/data/flutter_assets/assets/logo.png https://${{ fromJson(inputs.logolink).url }}/get_png?filename=${{ fromJson(inputs.logolink).file }}"&"uuid=${{ fromJson(inputs.logolink).uuid }}
+
+ # - name: icon stuff
+ # if: ${{ inputs.iconlink != 'false' }}
+ # continue-on-error: true
+ # run: |
+ # #mv ./rustdesk/data/flutter_assets/assets/icon.svg ./rustdesk/data/flutter_assets/assets/icon.svg.bak
+ # convert ./res/icon.png ./rustdesk/data/flutter_assets/assets/icon.svg
+ # convert ./res/icon.png ./rustdesk/data/flutter_assets/assets/scalable.svg
+
+ - name: Report Status
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "65% complete"}'
+
+ - uses: rustdesk-org/run-on-arch-action@amd64-support
+ name: Build rustdesk
+ id: vcpkg
+ if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true'
+ with:
+ arch: ${{ matrix.job.arch }}
+ distro: ${{ matrix.job.distro }}
+ githubToken: ${{ github.token }}
+ setup: |
+ ls -l "${PWD}"
+ ls -l /opt/artifacts/vcpkg/installed
+ dockerRunArgs: |
+ --volume "${PWD}:/workspace"
+ --volume "/opt/artifacts:/opt/artifacts"
+ shell: /bin/bash
+ install: |
+ apt-get update -y
+ echo -e "installing deps"
+ apt-get install -y \
+ build-essential \
+ clang \
+ cmake \
+ curl \
+ gcc \
+ git \
+ g++ \
+ imagemagick \
+ libayatana-appindicator3-dev \
+ libasound2-dev \
+ libclang-10-dev \
+ libgstreamer1.0-dev \
+ libgstreamer-plugins-base1.0-dev \
+ libgtk-3-dev \
+ libpam0g-dev \
+ libpulse-dev \
+ libva-dev \
+ libvdpau-dev \
+ libxcb-randr0-dev \
+ libxcb-shape0-dev \
+ libxcb-xfixes0-dev \
+ libxdo-dev \
+ libxfixes-dev \
+ llvm-10-dev \
+ nasm \
+ ninja-build \
+ pkg-config \
+ tree \
+ python3 \
+ rpm \
+ unzip \
+ wget \
+ xz-utils
+ # we have libopus compiled by us.
+ apt-get remove -y libopus-dev || true
+ # output devs
+ ls -l ./
+ tree -L 3 /opt/artifacts/vcpkg/installed
+ run: |
+ # disable git safe.directory
+ git config --global --add safe.directory "*"
+ # rust
+ pushd /opt
+ # do not use rustup, because memory overflow in qemu
+ wget -O rust.tar.gz https://static.rust-lang.org/dist/rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }}.tar.gz
+ tar -zxvf rust.tar.gz > /dev/null && rm rust.tar.gz
+ cd rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }} && ./install.sh
+ rm -rf rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }}
+ # edit config
+ mkdir -p ~/.cargo/
+ echo """
+ [source.crates-io]
+ registry = 'https://github.com/rust-lang/crates.io-index'
+ """ > ~/.cargo/config
+ cat ~/.cargo/config
+ # start build
+ pushd /workspace
+ export VCPKG_ROOT=/opt/artifacts/vcpkg
+ if [[ "${{ matrix.job.arch }}" == "aarch64" ]]; then
+ export JOBS="--jobs 3"
+ else
+ export JOBS=""
+ fi
+ echo $JOBS
+ cargo build --lib $JOBS --features hwcodec,flutter --release
+ rm -rf target/release/deps target/release/build
+ rm -rf ~/.cargo
+
+ # Setup Flutter
+ # disable git safe.directory
+ git config --global --add safe.directory "*"
+ pushd /workspace
+ case ${{ matrix.job.arch }} in
+ aarch64)
+ export PATH=/opt/flutter-elinux/bin:$PATH
+ sed -i "s/flutter build linux --release/flutter-elinux build linux --verbose/g" ./build.py
+ sed -i "s/x64\/release/arm64\/release/g" ./build.py
+ ;;
+ x86_64)
+ export PATH=/opt/flutter/bin:$PATH
+ ;;
+ esac
+ popd
+ pushd /opt
+ wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz
+ tar xf flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz
+ case ${{ matrix.job.arch }} in
+ aarch64)
+ # clone repo and reset to flutter ${{ env.FLUTTER_VERSION }}
+ git clone https://github.com/sony/flutter-elinux.git || true
+ pushd flutter-elinux
+ git fetch
+ git reset --hard ${{ env.FLUTTER_VERSION }}
+ bin/flutter-elinux doctor -v
+ bin/flutter-elinux precache --linux
+ popd
+ cp -R flutter/bin/cache/artifacts/engine/linux-x64/shader_lib flutter-elinux/flutter/bin/cache/artifacts/engine/linux-arm64
+ rm -rf flutter
+ ;;
+ x86_64)
+ flutter doctor -v
+ ;;
+ esac
+
+ if [[ "3.24.5" == ${{ env.FLUTTER_VERSION }} ]]; then
+ case ${{ matrix.job.arch }} in
+ aarch64)
+ pushd /opt/flutter-elinux/flutter
+ ;;
+ x86_64)
+ pushd /opt/flutter
+ ;;
+ esac
+ git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
+ popd
+ fi
+
+ # build flutter
+ pushd /workspace
+ mkdir output
+ chmod 777 output -R
+ export CARGO_INCREMENTAL=0
+ export DEB_ARCH=${{ matrix.job.deb_arch }}
+ mkdir -p flutter/tmpdeb/usr/lib/rustdesk
+ cp ./custom.txt ./flutter/tmpdeb/usr/lib/rustdesk/custom.txt
+ if [[ "${{ inputs.logolink }}" != "false" ]]; then
+ #echo "${{ inputs.logobase64 }}" | base64 -d > ./flutter/assets/logo.png
+ wget -O ./flutter/assets/logo.png ${{ fromJson(inputs.logolink).url }}/get_png?filename=${{ fromJson(inputs.logolink).file }}"&"uuid=${{ fromJson(inputs.logolink).uuid }}
+ fi
+ if [[ "${{ inputs.iconlink }}" != "false" ]]; then
+ mv ./flutter/assets/icon.svg ./flutter/assets/icon.svg.bak
+ convert ./res/icon.png ./flutter/assets/icon.svg
+ convert ./res/128x128.png -resize 200% ./flutter/assets/128x128@2x.png
+ convert ./res/icon.png ./res/scalable.svg
+ pushd ./flutter
+ flutter pub get
+ dart run flutter_launcher_icons
+ popd
+ fi
+ python3 ./build.py --flutter --skip-cargo
+ for name in rustdesk*??.deb; do
+ mv "$name" /workspace/output/"${{ inputs.filename }}.deb"
+ done
+
+ # rpm package
+ echo -e "start packaging fedora package"
+ pushd /workspace
+ case ${{ matrix.job.arch }} in
+ aarch64)
+ sed -i "s/linux\/x64/linux\/arm64/g" ./res/rpm-flutter.spec
+ ;;
+ esac
+ HBB=`pwd` rpmbuild ./res/rpm-flutter.spec -bb
+ pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }}
+ for name in rustdesk*??.rpm; do
+ mv "$name" /workspace/output/"${{ inputs.filename }}.rpm"
+ done
+
+ # rpm suse package
+ echo -e "start packaging suse package"
+ pushd /workspace
+ case ${{ matrix.job.arch }} in
+ aarch64)
+ sed -i "s/linux\/x64/linux\/arm64/g" ./res/rpm-flutter-suse.spec
+ ;;
+ esac
+ HBB=`pwd` rpmbuild ./res/rpm-flutter-suse.spec -bb
+ pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }}
+ for name in rustdesk*??.rpm; do
+ mv "$name" /workspace/output/"${{ inputs.filename }}-suse.rpm"
+ done
+
+ # - name: Publish debian/rpm package
+ # if: env.UPLOAD_ARTIFACT == 'true'
+ # uses: softprops/action-gh-release@v1
+ # with:
+ # prerelease: true
+ # tag_name: ${{ env.TAG_NAME }}
+ # files: |
+ # rustdesk-*.deb
+ # rustdesk-*.rpm
+
+ # - name: Upload to FTP
+ # if: ${{ fromJson(inputs.extras).rdgen == 'true' }}
+ # uses: SamKirkland/FTP-Deploy-Action@v4.3.5
+ # with:
+ # server: ${{ secrets.GEN_FTP_SERVER }}
+ # username: ${{ secrets.GEN_FTP_USER }}
+ # password: ${{ secrets.GEN_FTP_PASSWORD }}
+ # local-dir: output/
+ # server-dir: /root/rdgen/exe/${{ env.UUIDFOLDER }}/
+
+ - name: send file to rdgen server
+ if: ${{ fromJson(inputs.extras).rdgen == 'true' }}
+ shell: bash
+ run: |
+ curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" -F "file=@./output/${{ inputs.filename }}.deb" -F "uuid=${{ inputs.uuid }}" ${{ secrets.GENURL }}/save_custom_client
+ curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" -F "file=@./output/${{ inputs.filename }}.rpm" -F "uuid=${{ inputs.uuid }}" ${{ secrets.GENURL }}/save_custom_client
+ curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" -F "file=@./output/${{ inputs.filename }}-suse.rpm" -F "uuid=${{ inputs.uuid }}" ${{ secrets.GENURL }}/save_custom_client
+
+ - name: send file to api server
+ if: ${{ fromJson(inputs.extras).rdgen == 'false' }}
+ shell: bash
+ run: |
+ curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" -F "file=@./output/${{ inputs.filename }}.deb" ${{ inputs.apiServer }}/api/save_custom_client
+ curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" -F "file=@./output/${{ inputs.filename }}.rpm" ${{ inputs.apiServer }}/api/save_custom_client
+ curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" -F "file=@./output/${{ inputs.filename }}-suse.rpm" ${{ inputs.apiServer }}/api/save_custom_client
+
+ - name: Upload deb
+ uses: actions/upload-artifact@master
+ if: env.UPLOAD_ARTIFACT == 'true'
+ with:
+ name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb
+ path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb
+
+ - name: Report Status
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "Success"}'
+
+ - name: failed
+ if: failure()
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation failed, try again"}'
+
+ - name: failed
+ if: cancelled()
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation cancelled, try again"}'
\ No newline at end of file
diff --git a/.github/workflows/pre137-generator-macos.yml b/.github/workflows/pre137-generator-macos.yml
new file mode 100644
index 0000000..232c85f
--- /dev/null
+++ b/.github/workflows/pre137-generator-macos.yml
@@ -0,0 +1,790 @@
+name: Custom macOS Client Generator
+run-name: Custom macOS Client Generator
+on:
+ workflow_dispatch:
+ inputs:
+ server:
+ description: 'Rendezvous Server'
+ required: true
+ default: ''
+ type: string
+ key:
+ description: 'Public Key'
+ required: true
+ default: ''
+ type: string
+ apiServer:
+ description: 'API Server'
+ required: true
+ default: ''
+ type: string
+ custom:
+ description: "Custom JSON"
+ required: true
+ default: ''
+ type: string
+ uuid:
+ description: "uuid of request"
+ required: true
+ default: ''
+ type: string
+ iconlink:
+ description: "icon link"
+ required: false
+ default: 'false'
+ type: string
+ logolink:
+ description: "logo link"
+ required: false
+ default: 'false'
+ type: string
+ appname:
+ description: "app name"
+ required: true
+ default: 'rustdesk'
+ type: string
+ filename:
+ description: "Filename"
+ required: true
+ default: 'rustdesk'
+ type: string
+ extras:
+ description: "extra inputs in json"
+ required: true
+ default: '{}'
+ type: string
+
+env:
+ SCITER_RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503, also 1.78 has ABI change which causes our sciter version not working, https://blog.rust-lang.org/2024/03/30/i128-layout-update.html
+ RUST_VERSION: "1.75" # sciter failed on m1 with 1.78 because of https://blog.rust-lang.org/2024/03/30/i128-layout-update.html
+ MAC_RUST_VERSION: "1.81"
+ CARGO_NDK_VERSION: "3.1.2"
+ SCITER_ARMV7_CMAKE_VERSION: "3.29.7"
+ SCITER_NASM_DEBVERSION: "2.14-1"
+ LLVM_VERSION: "15.0.6"
+ FLUTTER_VERSION: "3.24.5"
+ ANDROID_FLUTTER_VERSION: "3.24.5" # >= 3.16 is very slow on my android phone, but work well on most of others. We may switch to new flutter after changing to texture rendering (I believe it can solve my problem).
+ FLUTTER_RUST_BRIDGE_VERSION: "1.80.1" # for arm64 linux because official Dart SDK does not work
+ FLUTTER_ELINUX_VERSION: "3.16.9"
+ TAG_NAME: "${{ inputs.upload-tag }}"
+ VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
+ # vcpkg version: 2024.07.12
+ VCPKG_COMMIT_ID: "b2cb0da531c2f1f740045bfe7c4dac59f0b2b69c"
+ VERSION: "${{ fromJson(inputs.extras).version }}"
+ NDK_VERSION: "r27c"
+ #signing keys env variable checks
+ ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
+ MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}"
+ # To make a custom build with your own servers set the below secret values
+ RS_PUB_KEY: "${{ inputs.key }}"
+ RENDEZVOUS_SERVER: "${{ inputs.server }}"
+ CUSTOM: "${{ inputs.custom }}"
+ UUIDFOLDER: "${{ inputs.uuid }}"
+ API_SERVER: "${{ inputs.apiServer }}"
+ UPLOAD_ARTIFACT: 'true'
+ SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}"
+ STATUS_URL: "${{ secrets.GENURL }}/updategh"
+
+jobs:
+ generate-bridge:
+ uses: ./.github/workflows/pre137-bridge.yml
+ with:
+ version: ${{ fromJson(inputs.extras).version }}
+
+ build-for-macos-flutter:
+ name: Build macOS
+ runs-on: macos-latest
+ needs: [generate-bridge]
+ strategy:
+ fail-fast: false
+ matrix:
+ job:
+ - {
+ target: aarch64-apple-darwin,
+ os: macos-latest,
+ # extra-build-args: "--disable-flutter-texture-render", # disable this for mac, because we see a lot of users reporting flickering both on arm and x64, and we can not confirm if texture rendering has better performance if htere is no vram, https://github.com/rustdesk/rustdesk/issues/6296
+ extra-build-args: "--screencapturekit",
+ arch: aarch64,
+ vcpkg-triplet: arm64-osx,
+ }
+
+ steps:
+ - name: Export GitHub Actions cache environment variables
+ uses: actions/github-script@v6
+ with:
+ script: |
+ core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
+ core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
+
+ - name: Set rdgen value
+ if: ${{ fromJson(inputs.extras).rdgen == 'true' }}
+ run: |
+ echo "STATUS_URL=${{ secrets.GENURL }}/updategh" >> $env:GITHUB_ENV
+
+ - name: Set rdgen value
+ if: ${{ fromJson(inputs.extras).rdgen == 'false' }}
+ run: |
+ echo "STATUS_URL=${{ inputs.apiServer }}/api/updategh" >> $env:GITHUB_ENV
+
+ - name: Report Status
+ uses: fjogeleit/http-request-action@v1
+ with:
+ url: ${{ env.STATUS_URL }}
+ method: 'POST'
+ customHeaders: '{"Content-Type": "application/json"}'
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "5% complete"}'
+
+
+
+ - name: Checkout source code
+ if: ${{ env.VERSION != 'master' }}
+ uses: actions/checkout@v4
+ with:
+ repository: rustdesk/rustdesk
+ ref: refs/tags/${{ env.VERSION }}
+
+ - name: Checkout source code
+ if: ${{ env.VERSION == 'master' }}
+ uses: actions/checkout@v4
+ with:
+ repository: rustdesk/rustdesk
+
+ - name: Restore bridge files
+ uses: actions/download-artifact@master
+ with:
+ name: bridge-artifact
+ path: ./
+
+ - name: Install imagemagick and potrace and nasm and and
+ shell: bash
+ run: |
+ brew install imagemagick potrace nasm cmake gcc wget ninja
+ echo "$(brew --prefix imagemagick)/bin" >> $GITHUB_PATH
+
+ - name: Update macOS Info.plist and settings
+ continue-on-error: false
+ shell: bash
+ run: |
+ # MACSTUFF Backup the original Info.plist
+ cp ./flutter/macos/Runner/Info.plist ./flutter/macos/Runner/Info.plist.bak
+
+ # MACSTUFF Update application name and display name
+ sed -i '' -e 's|