diff --git a/.github/old-workflows/pre133-generator-android.yml b/.github/old-workflows/pre133-generator-android.yml
deleted file mode 100644
index 01217f0..0000000
--- a/.github/old-workflows/pre133-generator-android.yml
+++ /dev/null
@@ -1,615 +0,0 @@
-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.19.6"
- ANDROID_FLUTTER_VERSION: "3.13.9" # >= 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: "1de2026f28ead93ff1773e6e680387643e914ea1"
- VERSION: "${{ fromJson(inputs.extras).version }}"
- NDK_VERSION: "r27"
- #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: ubuntu-20.04
- 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 \
- libappindicator3-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-11-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 }}
-
- - 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: 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 }}
-
- - name: fix android for flutter 3.13
- if: $${{ env.ANDROID_FLUTTER_VERSION == '3.13.9' }}
- run: |
- cd flutter
- sed -i 's/uni_links_desktop/#uni_links_desktop/g' pubspec.yaml
- sed -i 's/extended_text: .*/extended_text: 11.1.0/' pubspec.yaml
- flutter pub get
- cd lib
- find . | grep dart | xargs sed -i 's/textScaler: TextScaler.linear(\(.*\)),/textScaleFactor: \1,/g'
- cd ../..
-
- ###########################################################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=""
-
- - name: cargo.toml, runner.rc name, en.rs
- continue-on-error: true
- shell: bash
- run: |
- cp ./Cargo.toml ./Cargo.toml.bak
- 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
- cp ./libs/portable/Cargo.toml ./libs/portable/Cargo.toml.bak
- 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
- cp ./flutter/windows/runner/Runner.rc ./flutter/windows/runner/Runner.rc.bak
- 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
- cp ./src/lang/en.rs ./src/lang/en.rs.bak
- sed -i -e 's|RustDesk|${{ inputs.appname }}|' ./src/lang/en.rs
- 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
- sed -i -e '/const KEY:/,/};/d' ./src/common.rs
- sed -i -e '/let Ok(data) = sign::verify(&data, &pk)/,/};/d' ./src/common.rs
- #cp ./flutter/android/app/src/main/res/values/strings.xml ./flutter/android/app/src/main/res/values/strings.xml.bak
- 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
- 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: 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: Restore bridge files
- uses: actions/download-artifact@master
- with:
- name: bridge-artifact
- path: ./
-
- - 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 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 }}
- 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-11-openjdk-amd64
- run: |
- export PATH=/usr/lib/jvm/java-11-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/android/app/src/main/custom.txt
- # # 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/android/app/src/main/custom.txt
- # # 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: Upload Artifacts
- # if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true'
- # uses: actions/upload-artifact@master
- # with:
- # name: ${{ inputs.filename }}-${{ env.VERSION }}-${{ matrix.job.arch }}.apk
- # path: ${{steps.sign-rustdesk.outputs.signedReleaseFile}}
-
- # - name: Publish signed apk package
- # if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true'
- # uses: softprops/action-gh-release@v1
- # with:
- # prerelease: true
- # tag_name: ${{ env.TAG_NAME }}
- # files: |
- # ${{steps.sign-rustdesk.outputs.signedReleaseFile}}
-
- # - name: Publish unsigned apk package
- # if: env.ANDROID_SIGNING_KEY == null && env.UPLOAD_ARTIFACT == 'true'
- # uses: softprops/action-gh-release@v1
- # with:
- # prerelease: true
- # tag_name: ${{ env.TAG_NAME }}
- # files: |
- # signed-apk/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk
-
- #
-
- # - name: Upload to FTP
- # if: ${{ fromJson(inputs.extras).rdgen == 'true' }}
- # uses: nerdoza/action-simple-file-upload@v2
- # with:
- # user: ${{ secrets.GEN_FTP_USER }}
- # password: ${{ secrets.GEN_FTP_PASSWORD }}
- # host: ${{ secrets.GEN_FTP_SERVER }}
- # src: ./signed-apk/${{ inputs.filename }}-${{ matrix.job.arch }}.apk
- # dest: /root/rdgen/exe/${{ env.UUIDFOLDER }}/${{ inputs.filename }}-${{ matrix.job.arch }}.apk
-
- - 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/old-workflows/pre133-generator-linux.yml b/.github/old-workflows/pre133-generator-linux.yml
deleted file mode 100644
index 1fb4707..0000000
--- a/.github/old-workflows/pre133-generator-linux.yml
+++ /dev/null
@@ -1,587 +0,0 @@
-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.19.6"
- ANDROID_FLUTTER_VERSION: "3.13.9" # >= 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: "1de2026f28ead93ff1773e6e680387643e914ea1"
- VERSION: "${{ fromJson(inputs.extras).version }}"
- NDK_VERSION: "r27"
- #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: |
- 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
- 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: cargo.toml, runner.rc name, en.rs
- continue-on-error: true
- shell: bash
- run: |
- cp ./Cargo.toml ./Cargo.toml.bak
- 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
- cp ./libs/portable/Cargo.toml ./libs/portable/Cargo.toml.bak
- 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
- #linux stuff
- #sed -i -e 's|rustdesk|${{ inputs.appname }}|' ./flutter/linux/my_application.cc
- #sed -i -e 's|Package: rustdesk|Package: ${{ inputs.appname }}|' ./build.py
- sed -i -e 's|Homepage: https://rustdesk.com|Homepage: ${{ fromJson(inputs.extras).urlLink }}|' ./build.py
- sed -i -e '/-p tmpdeb\/usr\/lib\/rustdesk/d' ./build.py
- #sed -i -e 's|set(BINARY_NAME "rustdesk")|set(BINARY_NAME "${{ inputs.appname }}")|' ./flutter/linux/CMakeLists.txt
- 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
- cp ./src/lang/en.rs ./src/lang/en.rs.bak
- sed -i -e 's|RustDesk|${{ inputs.appname }}|' ./src/lang/en.rs
- sed -i -e 's|For faster connection, please set up your own server||' ./src/lang/en.rs
- 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
- 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
-
- - 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: 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 \
- libappindicator3-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
-
- # 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 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/old-workflows/pre133-generator-windows.yml b/.github/old-workflows/pre133-generator-windows.yml
deleted file mode 100644
index ecb2261..0000000
--- a/.github/old-workflows/pre133-generator-windows.yml
+++ /dev/null
@@ -1,566 +0,0 @@
-name: Custom Windows Client Generator
-run-name: Custom Windows 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.19.6"
- ANDROID_FLUTTER_VERSION: "3.13.9" # >= 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: "1de2026f28ead93ff1773e6e680387643e914ea1"
- VERSION: "${{ fromJson(inputs.extras).version }}"
- NDK_VERSION: "r27b"
- #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:
- build-RustDeskTempTopMostWindow:
- uses: ./.github/workflows/third-party-RustDeskTempTopMostWindow.yml
- with:
- upload-artifact: true
- target: windows-2022
- configuration: Release
- platform: x64
- target_version: Windows10
- strategy:
- fail-fast: false
-
- build-for-windows-flutter:
- name: Build Windows
- needs: [build-RustDeskTempTopMostWindow]
- runs-on: windows-2022
- strategy:
- fail-fast: false
- matrix:
- job:
- # - { target: i686-pc-windows-msvc , os: windows-2022 }
- # - { target: x86_64-pc-windows-gnu , os: windows-2022 }
- - {
- target: x86_64-pc-windows-msvc,
- os: windows-2022,
- arch: x86_64,
- vcpkg-triplet: x64-windows-static,
- }
- # - { target: aarch64-pc-windows-msvc, os: windows-2022, arch: aarch64 }
- 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: Install ImageMagick on Windows
- run: |
- choco install -y imagemagick.app --no-progress
- Get-ChildItem -Path "${env:ProgramFiles}" | % { $_.FullName } | Select-String -Pattern "[\/\\]ImageMagick[^\/\\]*$" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
-
- - name: cargo.toml, runner.rc name, en.rs
- continue-on-error: true
- shell: bash
- run: |
- cp ./Cargo.toml ./Cargo.toml.bak
- 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
- cp ./libs/portable/Cargo.toml ./libs/portable/Cargo.toml.bak
- 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
- cp ./flutter/windows/runner/Runner.rc ./flutter/windows/runner/Runner.rc.bak
- 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
- cp ./src/lang/en.rs ./src/lang/en.rs.bak
- sed -i -e 's|RustDesk|${{ inputs.appname }}|' ./src/lang/en.rs
- 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
- sed -i -e '/const KEY:/,/};/d' ./src/common.rs
- sed -i -e '/let Ok(data) = sign::verify(&data, &pk)/,/};/d' ./src/common.rs
-
- - name: Install LLVM and Clang
- uses: KyleMayes/install-llvm-action@v1
- with:
- version: ${{ env.LLVM_VERSION }}
-
- - 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": "10% complete"}'
-
- - name: Install flutter
- uses: subosito/flutter-action@v2.12.0 #https://github.com/subosito/flutter-action/issues/277
- with:
- channel: "stable"
- flutter-version: ${{ env.FLUTTER_VERSION }}
- cache: true
-
- - name: Install Rust toolchain
- uses: dtolnay/rust-toolchain@v1
- with:
- toolchain: ${{ env.SCITER_RUST_VERSION }}
- targets: ${{ matrix.job.target }}
- components: "rustfmt"
-
- - 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"}'
-
- - uses: Swatinem/rust-cache@v2
- with:
- prefix-key: ${{ matrix.job.os }}
-
- - name: Install flutter rust bridge deps
- run: |
- git config --global core.longpaths true
- cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid"
- Push-Location flutter ; flutter pub get ; Pop-Location
- ~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart
-
- - 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": "20% complete"}'
-
- - name: Setup vcpkg with Github Actions binary cache
- uses: lukka/run-vcpkg@v11
- with:
- vcpkgDirectory: C:\vcpkg
- vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
- doNotCache: false
-
- - name: Install vcpkg dependencies
- env:
- VCPKG_DEFAULT_HOST_TRIPLET: ${{ matrix.job.vcpkg-triplet }}
- run: |
- 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
- 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
-
- - name: magick stuff
- if: ${{ inputs.iconlink != 'false' }}
- continue-on-error: true
- run: |
- Invoke-WebRequest -Uri ${{ fromJson(inputs.iconlink).url }}/get_png?filename=${{ fromJson(inputs.iconlink).file }}"&"uuid=${{ fromJson(inputs.iconlink).uuid }} -OutFile ./res/icon.png
- 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
- magick ./res/icon.png -define icon:auto-resize=256,64,48,32,16 ./res/icon.ico
- cp ./res/icon.ico ./res/tray-icon.ico
- magick ./res/icon.png -resize 32x32 ./res/32x32.png
- magick ./res/icon.png -resize 64x64 ./res/64x64.png
- magick ./res/icon.png -resize 128x128 ./res/128x128.png
- magick ./res/128x128.png -resize 200% ./res/128x128@2x.png
-
-
- - name: ui.rs icon
- if: ${{ inputs.iconlink != 'false' }}
- continue-on-error: true
- shell: bash
- run: |
- 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: 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: run as admin
- continue-on-error: true
- if: ${{ fromJson(inputs.extras).runasadmin == 'true' }}
- shell: bash
- run: |
- echo "SET_TARGET_PROPERTIES(\${BINARY_NAME} PROPERTIES LINK_FLAGS \"/MANIFESTUAC:\\\"level='requireAdministrator' uiAccess='false'\\\" /SUBSYSTEM:WINDOWS\")" >> ./flutter/windows/runner/CMakeLists.txt
- sed -i '/administrator/d' res/manifest.xml
-
- - 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": "25% complete"}'
-
- - name: replace flutter icons
- run: |
- cd ./flutter
- flutter pub run flutter_launcher_icons
- cd ..
-
- - 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": "30% complete"}'
-
- # - name: generate rustbridge
- # run: |
- # ~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart
-
- - 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": "50% complete, this step takes about 5 minutes, be patient."}'
-
- - name: Build rustdesk
- run: |
- Invoke-WebRequest -Uri https://github.com/rustdesk-org/rdev/releases/download/usbmmidd_v2/usbmmidd_v2.zip -OutFile usbmmidd_v2.zip
- Expand-Archive usbmmidd_v2.zip -DestinationPath . -Force
- python3 .\build.py --portable --hwcodec --flutter --vram --skip-portable-pack
- Remove-Item -Path usbmmidd_v2\Win32 -Recurse
- Remove-Item -Path "usbmmidd_v2\deviceinstaller64.exe", "usbmmidd_v2\deviceinstaller.exe", "usbmmidd_v2\usbmmidd.bat"
- mv ./flutter/build/windows/x64/runner/Release ./rustdesk
- mv -Force .\usbmmidd_v2 ./rustdesk
-
- # - 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
-
-
- - 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
- magick ./res/icon.png ./rustdesk/data/flutter_assets/assets/icon.svg
-
- - name: logo stuff
- if: ${{ inputs.logolink != 'false' }}
- continue-on-error: true
- run: |
- Invoke-WebRequest -Uri ${{ fromJson(inputs.logolink).url }}/get_png?filename=${{ fromJson(inputs.logolink).file }}"&"uuid=${{ fromJson(inputs.logolink).uuid }} -OutFile ./rustdesk/data/flutter_assets/assets/logo.png
-
-
- - name: find Runner.res
- # Windows: find Runner.res (compiled from ./flutter/windows/runner/Runner.rc), copy to ./Runner.res
- # Runner.rc does not contain actual version, but Runner.res does
- continue-on-error: true
- shell: bash
- run: |
- runner_res=$(find . -name "Runner.res");
- if [ "$runner_res" == "" ]; then
- echo "Runner.res: not found";
- else
- echo "Runner.res: $runner_res";
- cp $runner_res ./libs/portable/Runner.res;
- echo "list ./libs/portable/Runner.res";
- ls -l ./libs/portable/Runner.res;
- fi
-
- - name: Download RustDeskTempTopMostWindow artifacts
- uses: actions/download-artifact@master
- if: env.UPLOAD_ARTIFACT == 'true'
- with:
- name: topmostwindow-artifacts
- path: "./rustdesk"
-
- - name: Upload unsigned
- if: env.UPLOAD_ARTIFACT == 'true'
- uses: actions/upload-artifact@master
- with:
- name: rustdesk-unsigned-windows-${{ matrix.job.arch }}
- path: rustdesk
-
- # - name: Sign rustdesk files
- # if: env.UPLOAD_ARTIFACT == 'true' && env.SIGN_BASE_URL != ''
- # shell: bash
- # run: |
- # pip3 install requests argparse
- # BASE_URL=${{ secrets.SIGN_BASE_URL }} SECRET_KEY=${{ secrets.SIGN_SECRET_KEY }} python3 res/job.py sign_files ./rustdesk/
-
- - 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": "70% complete, this step takes about 5 minutes, be patient."}'
-
- - name: Sign rustdesk files
- uses: GermanBluefox/code-sign-action@v7
- if: env.UPLOAD_ARTIFACT == 'true'
- with:
- certificate: '${{ secrets.WINDOWS_PFX_BASE64 }}'
- password: '${{ secrets.WINDOWS_PFX_PASSWORD }}'
- certificatesha1: '${{ secrets.WINDOWS_PFX_SHA1_THUMBPRINT }}'
- # certificatename: '${{ secrets.CERTNAME }}'
- folder: './rustdesk/'
- recursive: true
-
- - name: Create custom.txt file
- shell: bash
- run: |
- echo -n "${{ env.CUSTOM }}" | cat > ./rustdesk/custom.txt
-
-
- - name: Build self-extracted executable
- shell: bash
- if: env.UPLOAD_ARTIFACT == 'true'
- run: |
- mv "./rustdesk/rustdesk.exe" "./rustdesk/${{ inputs.appname }}.exe" || echo "rustdesk.exe"
- sed -i '/dpiAware/d' res/manifest.xml
- pushd ./libs/portable
- pip3 install -r requirements.txt
- python3 ./generate.py -f ../../rustdesk/ -o . -e "../../rustdesk/${{ inputs.appname }}.exe"
- popd
- mkdir -p ./SignOutput
- mv ./target/release/rustdesk-portable-packer.exe "./SignOutput/rustdesk.exe"
-
- # - name: Add MSBuild to PATH
- # uses: microsoft/setup-msbuild@v2
-
- # - name: Build msi
- # if: env.UPLOAD_ARTIFACT == 'true'
- # run: |
- # pushd ./res/msi
- # python preprocess.py --arp -d ../../rustdesk
- # nuget restore msi.sln
- # msbuild msi.sln -p:Configuration=Release -p:Platform=x64 /p:TargetVersion=Windows10
- # cp ./Package/bin/x64/Release/en-us/Package.msi ../../SignOutput/rustdesk-latest.msi
- # mv ./Package/bin/x64/Release/en-us/Package.msi ../../SignOutput/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.msi
- # sha256sum ../../SignOutput/rustdesk-*.msi
-
- # - name: Sign rustdesk self-extracted file
- # if: env.UPLOAD_ARTIFACT == 'true' && env.SIGN_BASE_URL != ''
- # shell: bash
- # run: |
- # BASE_URL=${{ secrets.SIGN_BASE_URL }} SECRET_KEY=${{ secrets.SIGN_SECRET_KEY }} python3 res/job.py sign_files ./SignOutput
-
- - 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": "85% complete"}'
-
- - name: Sign rustdesk self-extracted file
- uses: GermanBluefox/code-sign-action@v7
- if: env.UPLOAD_ARTIFACT == 'true'
- with:
- certificate: '${{ secrets.WINDOWS_PFX_BASE64 }}'
- password: '${{ secrets.WINDOWS_PFX_PASSWORD }}'
- certificatesha1: '${{ secrets.WINDOWS_PFX_SHA1_THUMBPRINT }}'
- # certificatename: '${{ secrets.WINDOWS_PFX_NAME }}'
- folder: './SignOutput'
- recursive: false
-
- # - name: Publish Release
- # uses: softprops/action-gh-release@v1
- # if: env.UPLOAD_ARTIFACT == 'true'
- # with:
- # prerelease: true
- # tag_name: ${{ env.TAG_NAME }}
- # files: |
- # ./SignOutput/rustdesk-*.msi
- # ./SignOutput/rustdesk-*.exe
-
- - name: rename rustdesk.exe to filename.exe
- run: |
- mv ./SignOutput/rustdesk.exe "./SignOutput/${{ inputs.filename }}.exe" || echo "rustdesk"
-
- # - 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: ./SignOutput/
- # 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=@./SignOutput/${{ inputs.filename }}.exe" -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=@./SignOutput/${{ inputs.filename }}.exe" ${{ inputs.apiServer }}/api/save_custom_client
-
- - 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/generator-android.yml b/.github/workflows/generator-android.yml
index 2f7b664..9c1fe51 100644
--- a/.github/workflows/generator-android.yml
+++ b/.github/workflows/generator-android.yml
@@ -48,13 +48,28 @@ on:
required: true
default: 'rustdesk'
type: string
+ # There can be at maximum 10 `inputs` variable
+ # https://docs.github.com/en/actions/managing-workflow-runs-and-deployments/managing-workflow-runs/manually-running-a-workflow#running-a-workflow-using-the-rest-api
extras:
- description: "extra inputs in json"
+ description: "JSON for extra inputs"
required: true
- default: '{}'
+ default: >-
+ {
+ "genurl": "",
+ "runasadmin": "false",
+ "urlLink": "https://rustdesk.com",
+ "downloadLink": "https://rustdesk.com/download",
+ "delayFix": "true",
+ "version": "master",
+ "rdgen": "true",
+ "cycleMonitor": "false",
+ "xOffline": "false",
+ "hidecm": "false",
+ "statussort": "false",
+ "removeNewVersionNotif": "false"
+ }
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
@@ -79,7 +94,6 @@ env:
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 }}"
@@ -603,17 +617,6 @@ jobs:
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
@@ -623,7 +626,7 @@ jobs:
customHeaders: '{"Content-Type": "application/json"}'
data: '{"uuid": "${{ inputs.uuid }}", "status": "Success"}'
- - name: failed
+ - name: Failed
if: failure()
uses: fjogeleit/http-request-action@v1
with:
@@ -632,7 +635,7 @@ jobs:
customHeaders: '{"Content-Type": "application/json"}'
data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation failed, try again"}'
- - name: failed
+ - name: Cancelled
if: cancelled()
uses: fjogeleit/http-request-action@v1
with:
diff --git a/.github/workflows/generator-linux.yml b/.github/workflows/generator-linux.yml
index 1963862..6ab8710 100644
--- a/.github/workflows/generator-linux.yml
+++ b/.github/workflows/generator-linux.yml
@@ -48,10 +48,26 @@ on:
required: true
default: 'rustdesk'
type: string
+ # There can be at maximum 10 `inputs` variable
+ # https://docs.github.com/en/actions/managing-workflow-runs-and-deployments/managing-workflow-runs/manually-running-a-workflow#running-a-workflow-using-the-rest-api
extras:
- description: "extra inputs in json"
+ description: "JSON for extra inputs"
required: true
- default: '{}'
+ default: >-
+ {
+ "genurl": "",
+ "runasadmin": "false",
+ "urlLink": "https://rustdesk.com",
+ "downloadLink": "https://rustdesk.com/download",
+ "delayFix": "true",
+ "version": "master",
+ "rdgen": "true",
+ "cycleMonitor": "false",
+ "xOffline": "false",
+ "hidecm": "false",
+ "statussort": "false",
+ "removeNewVersionNotif": "false"
+ }
type: string
env:
@@ -79,7 +95,6 @@ env:
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 }}"
@@ -594,16 +609,6 @@ jobs:
# 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
@@ -635,7 +640,7 @@ jobs:
customHeaders: '{"Content-Type": "application/json"}'
data: '{"uuid": "${{ inputs.uuid }}", "status": "Success"}'
- - name: failed
+ - name: Failed
if: failure()
uses: fjogeleit/http-request-action@v1
with:
@@ -644,11 +649,11 @@ jobs:
customHeaders: '{"Content-Type": "application/json"}'
data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation failed, try again"}'
- - name: failed
+ - name: Cancelled
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
+ data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation cancelled, try again"}'
diff --git a/.github/workflows/generator-macos.yml b/.github/workflows/generator-macos.yml
index 43f2560..71d5495 100644
--- a/.github/workflows/generator-macos.yml
+++ b/.github/workflows/generator-macos.yml
@@ -48,10 +48,26 @@ on:
required: true
default: 'rustdesk'
type: string
+ # There can be at maximum 10 `inputs` variable
+ # https://docs.github.com/en/actions/managing-workflow-runs-and-deployments/managing-workflow-runs/manually-running-a-workflow#running-a-workflow-using-the-rest-api
extras:
- description: "extra inputs in json"
+ description: "JSON for extra inputs"
required: true
- default: '{}'
+ default: >-
+ {
+ "genurl": "",
+ "runasadmin": "false",
+ "urlLink": "https://rustdesk.com",
+ "downloadLink": "https://rustdesk.com/download",
+ "delayFix": "true",
+ "version": "master",
+ "rdgen": "true",
+ "cycleMonitor": "false",
+ "xOffline": "false",
+ "hidecm": "false",
+ "statussort": "false",
+ "removeNewVersionNotif": "false"
+ }
type: string
env:
@@ -79,7 +95,6 @@ env:
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 }}"
@@ -781,7 +796,7 @@ jobs:
customHeaders: '{"Content-Type": "application/json"}'
data: '{"uuid": "${{ inputs.uuid }}", "status": "Success"}'
- - name: failed
+ - name: Failed
if: failure()
uses: fjogeleit/http-request-action@v1
with:
@@ -790,7 +805,7 @@ jobs:
customHeaders: '{"Content-Type": "application/json"}'
data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation failed, try again"}'
- - name: failed
+ - name: Cancelled
if: cancelled()
uses: fjogeleit/http-request-action@v1
with:
@@ -798,12 +813,3 @@ jobs:
method: 'POST'
customHeaders: '{"Content-Type": "application/json"}'
data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation cancelled, try again"}'
-
- #- name: Publish DMG package
- # if: env.UPLOAD_ARTIFACT == 'true'
- # uses: softprops/action-gh-release@v1
- # with:
- # prerelease: true
- # tag_name: ${{ inputs.upload-tag }}
- # files: |
- # ${{ inputs.appname }}*-${{ matrix.job.arch }}.dmg
diff --git a/.github/workflows/generator-windows.yml b/.github/workflows/generator-windows.yml
index d2372f9..d25e835 100644
--- a/.github/workflows/generator-windows.yml
+++ b/.github/workflows/generator-windows.yml
@@ -48,13 +48,28 @@ on:
required: true
default: 'rustdesk'
type: string
+ # There can be at maximum 10 `inputs` variable
+ # https://docs.github.com/en/actions/managing-workflow-runs-and-deployments/managing-workflow-runs/manually-running-a-workflow#running-a-workflow-using-the-rest-api
extras:
- description: "extra inputs in json"
+ description: "JSON for extra inputs"
required: true
- default: '{}'
+ default: >-
+ {
+ "genurl": "",
+ "runasadmin": "false",
+ "urlLink": "https://rustdesk.com",
+ "downloadLink": "https://rustdesk.com/download",
+ "delayFix": "true",
+ "version": "master",
+ "rdgen": "true",
+ "cycleMonitor": "false",
+ "xOffline": "false",
+ "hidecm": "false",
+ "statussort": "false",
+ "removeNewVersionNotif": "false"
+ }
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
@@ -80,7 +95,6 @@ env:
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 }}"
@@ -619,7 +633,7 @@ jobs:
customHeaders: '{"Content-Type": "application/json"}'
data: '{"uuid": "${{ inputs.uuid }}", "status": "Success"}'
- - name: failed
+ - name: Failed
if: failure()
uses: fjogeleit/http-request-action@v1
with:
@@ -628,7 +642,7 @@ jobs:
customHeaders: '{"Content-Type": "application/json"}'
data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation failed, try again"}'
- - name: failed
+ - name: Cancelled
if: cancelled()
uses: fjogeleit/http-request-action@v1
with:
diff --git a/.github/workflows/pre137-bridge.yml b/.github/workflows/pre137-bridge.yml
deleted file mode 100644
index 4365d97..0000000
--- a/.github/workflows/pre137-bridge.yml
+++ /dev/null
@@ -1,110 +0,0 @@
-# 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
deleted file mode 100644
index c3eecc0..0000000
--- a/.github/workflows/pre137-generator-android.yml
+++ /dev/null
@@ -1,631 +0,0 @@
-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: removeNewVersionNotif
- continue-on-error: true
- if: fromJson(inputs.extras).removeNewVersionNotif == 'true'
- run: |
- wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/removeNewVersionNotif.diff
- git apply removeNewVersionNotif.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
deleted file mode 100644
index eed7b1b..0000000
--- a/.github/workflows/pre137-generator-linux.yml
+++ /dev/null
@@ -1,643 +0,0 @@
-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|iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAEiuAABIrgHwmhA7AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAEx9JREFUeJztnXmYHMV5h9+vZnZ0rHYRum8J4/AErQlgAQbMsRIWBEFCjK2AgwTisGILMBFCIMug1QLiPgIYE/QY2QQwiMVYjoSlODxEAgLEHMY8YuUEbEsOp3Z1X7vanf7yR8/MztEz0zPTPTO7M78/tnurvqn6uuqdr6q7a7pFVelrkpaPhhAMTEaYjJHDUWsEARkODANGAfWgINEPxLb7QNtBPkdoR7Ud0T8iphUTbtXp4z8pyQH5KOntAEhL2yCCnALW6aAnIDQAI+3MqFHkGJM73BkCO93JXnQnsAl4C8MGuoIv69mj2rw9ouKq1wEgzRiO2noSlp6DoRHleISgnQkJnRpLw0sI4v9X4H2E9Yj172zf+2udOflgYUdYXPUaAOTpzxoImJkIsxG+YCfG+Z7cecWDIN5+J8hqjNXCIW3rdMqULvdHWBqVNQDS8tlwNPCPKJcjOslOjGZGt2UHQTStHZGnMPxQG8d9mOk4S6myBEBWbj0aZR7ILISBPRlZOiMlr+QQgGAhvITqg0ybsEZjhZWHygoA+VnbaSBLEaY6dgb0Vgii+h2GO2gcv7JcQCgLAOSp7ZNBlyI6sycR+igEILoRdJFOnfgCJVZJAZCf7pxETfhmlIsQjHNH9VkIAF0H1iKdetjvKJFKAoC0EODA9msQvQUYmL2j8uwMJ/uygwAL0dvZMHGJNmFRZBUdAHlix5dQfQw4IbeO6tMQgOgybZx4I0VW0QCQ5dQQ2v4DhO8Dofw6qk9DEIZwg0497H8ookwxKpEV7WOo2fES0IQSAnrmwBrXEhq/lcR5cnJasm1KWq5lx9knl5NvvW7877EPIMFZFFm+AyA/2Xk6EngbOCVtA1chsO1V/4oiyzcABERW7FiI6osoo2IZVQicy7HtwxRZQT8KlWaCjNm5AiOzY+Oe0jPuqdjjXjQttpWe8TMhT0Djxs/ktGRbCi07g4/kWW/C8afxX/htAc2elzyPAPIQ/Ri7cyXCbBfjXjUS9Nh2IeEnKLI8BUB+1DaI/jvXoJwfS6xC4FxOcr2i12vjpM0UWZ6dBsry/aOh61fAMfmfCyfllfoU0Y2P+dab6P/d+rVx11MCeQKALN8zDA1vAJlc+AWRpLw+D4Hcp9PHLqBEKngIkBXtdVjWWlQmA4XMgBPTymU4cONj3vXKvaXsfCgQAGkhRGfoOZDjgHwnP3F5FQXBvTp97HWUWHkDIM0Y2nY/C5zpwQw4Lq8SINC79azSdz4UEgGG7l4CnOfJDDglr09DcK/+dWkmfE7KaxIoD++aDmYtaMCDGbBtXxETQ7lXzx5dFt/8qHIGQB7eORENvI0w1E4pZAacZN+XIUDu1XPKq/MhRwDkp/Rn7+7XQY6xE6I5ZQ/BbrB+j8gWkC2g7cBeAtJFdA2GyqGIDkUYA0xAtAEYkrFstxAY7tIZY26gDJXbvYDd+5qRuM7XyBbBt+vjONgnl0NKvZtRXYewAfRtvjX8Q00cwV1JWraNRbqPRbURkTOAoxGRnHzE3KUzRpVl50MOEUAe2H88Yr0GBEu/esapHPkjWE+CPKOzh25ydVA5Sp5vHw3hbwIXInoSEvEgnY/C7Xru6MV++AIgL245FmMuQmhArQ7EvInK4zpt3Meuy3ADgDQT4tC9b6EclbbzSgOBgq5B9T7mDNuQz7c8X8kv2o9Auq8C5gB1ST5uQ/VKPW/MSl/qbmkNMbTun1G+69A2BxDma+OER12V5QqA+/c2Y1jSk5BQYSkgUGAlAb3Zr2+7W8na7fV0dH0To18G3YOwkfrOn2vjpA5f6mtpDTGk7jmUv8n4BYFLdOqEf81aXjYA5L49R2DMRtCa1A6iFBC8glgLdM7QNzM63gclaz/sR03/51DOdREld9PV9Rd65uFbM5WZ/UKQBG5DqbEnenHp6S7yuL8gkrmceHs7bT8Wi/jzoY0V2fktrSHMgGdRzgXcXKSqpya0hCzKGAHkngNfwVivJ052nM6z8TsSvALM1ssHb8l2QH1Rsn5zfzprnkf0bDshPhMyRIIuAqZBTxv3QbqyM0eAgHUbINkvu+JjJNDlhAefUbGd39Ia4kBNC3B2HpfUa+i2bstYfroIIPftn4HyQgnX1nchXKFXDM46kemrkvWb+9MRWgV6lp0Qzchp0qyY8MnaOOkNpzrSRwAL+1cqpVlC1YnFhRXd+Ws/7Mf+fs+hkc6HXOZL8XmCFfxB2nqcIoDcc+AroG9EPh61jDOI33oeCQ6gOkO/M3h9Oqf7uqTlowHUml8C03Nq49h+ShtbqDlSzxj7v8l1OUcAteanHZsT0iI1eBcJurBkZkV3/ppPBzLQ/BvKdCC3Nnayt7cGY33Psb7kCCD3HRhPN39AtIZIWYlb3yKBAhfrd+ufdHK0EiRrPh0IuhqYljZK5h8J9hHS8XrKhB3xdaZGgG6uBGq8WZRBLpHg/oru/OXUoKwCmZYxSuYfCWrpNN9OrjcBAGnGoPT8QLFoEOgGttaX7R2zomjUpw8C010NlflCIFyaXG1iBAh1nAqMdbiq5CcEuyA8W5voTnauUiS/+PgIYG5O86V8IFD9S/mPj4+Jrzt5CLggzQUFByfwBgJlgc4b8n9UsgKBuajYfeE3BAG9IL7qGADSTBD4RoarSg5OUCgEL3FV3QoqXSpHRbaR/0ncegmBpRdI3HSxJwLUdE4FRqQ5jXAuuDAILLrNAk20qEypdvbs+w7BYfz6oxOiSSYu88wkQ58h4An9p9p3qQqEl121sVcQBJgR/bcHAGFaltOI7A66hyBMWG+lKlsHeRyho2gQWDRGdw2ANDMY5egUQ/8geF7n15ft83OLLZ05qo0wz9j/xGf4BsGJ9kWnaAQIHjwdCBTtFzzGuo+qkqQP5dTGhUEQop91EkQBsLTR9WmEWwfTQaDSqlfXO96arGTp+aPfAXm/aBCIPQxE5wDHpjVMKMQTCCr2cm9WKc/k3Mb5QmDpCdADQEPazvMaAhN4mqqcFQ635NXG+UHQYFss2zuScM1nsdyUu1BJ6bF9dbjD52CfWM4mvbZ2MlWllTz/+WZgYl5t7GSfXE58XqBzsKEr0BCjJWKbuPUwEgjrqCqzVP7T3oLvkaCr35EG4h/t4jMEYdlAVZkl1oa0nec1BCINBmRiiqFTwV5AYOQdqsqscMC+OloMCNDDDcoIR0OngguDYKteO6Cy7/q5UlsrYL9tzHcIdIQhdgPIwdCp4HwhsPT3VJVVOnPyQZQ/9CTEb72GQIYbkBEZDZ0KzgcCkc0pR1tVGsnHRXlmkTLcoDIiq6FTwTlDwBaqcifFfkex/xAMN6B1rmhxKjgnCGQ7VblVW0obgx8QDDEoxoUhBUMgupeq3EnFfraA/xCY3NehOdm7gSAs+6jKpbQjbRsnpEGhEBhUxI1hQoVO9tkgMFKU9xP1DUWaqggQGGwIshoWDEGY/lTlTsqgrG2ckpcfBAaNrMf3GwKRAVTlUjrIVRun5OUMgRqQbWk7z0sILB1BVe6UcHXWVwh2GFTbHQv2GgLDWKpyKZ2QUxun5LmGoN0A7amF+ACBMp6q3Ellgr2N/g8+QdBuEGlPnbSlGHoBQQNVZZU8/ekwkFF5tbGTfSYILN1qCOvWrOvHvIFgjDTvGUZVmaWBKWk7z3sI2g1iPkgxdCrYCwhqQsdSVRbJ8UD6zvMSAsyfDJa1ydEwXp5BoI0OpVcVL5VpPfvgKwQW7xtM8H1XtHgDwdeoKq3kic9rUU5OjcQ+QdBNq9Hb2AZsLQ4EMkVu3zucqpwlwekg/QCH4dhzCNp05qi26PX51gyGXkIQoLvmG1SVThcBqW0c2/cUglaI3nVQeSODoYMzBUAgXEhVKZKWHYegnJN28h3b9woC3oTYbSdrfVGWINn7p8qtnYdTVaIOWBcD9v2SYkCAvUTfBmBA8L+AriJBYFCuoqqYpIUAcE1qR+MXBGGk36sQAUCb2Av6joNh5gqdHHQHwWVyF3VUZWvf9vNROdz1tZjYfp4QiLyrfzd4J8Q/IcSSDWloyVyhk4PZIains6M6GYTow7mWAqltHEvDWwgsa320iB4AjFntWKFTwV5AoIHjqArG77gCmJy2jWNpeAcBsja61wPAAF5D+cixQqeCC4cg/pMVKfnZrkMRWercbr5B8Dk6cn30ozEAtAkLaHF/GlEgBEL1d4Kd4ftBRwJp2s0HCJSf60zC0Y8lLtRUszL1w/gAgbZRV/MMFSz58Y4ZqFySvd08hgBJeJdhIgD38BuI/ITLLwhEFORanc8BKlTy4+3jMPIT9+3mGQSfsGn4q/G+JACgimLJY/6uQ5Ol2hSq2OcESQshCLRg4fybTPAPAovHI0N9TKlr9UM8itLhCwSit2pT8OaUOitEAsKOnf8CeiKQz5enEAi6CQd+lOxTCgB6G22gT2U8jcgHAtE7dWnopuT6KkrLd92JcKmrbyt4C4HynF405KNkl9L8Wsc8mFBAihPkCkGzNocWOddVGZLluxYDCz150ko+EIg+5OSXIwB6N++hvJRQQIoTuIWgSW8JLnWqpxIkIPLIrrtRluU1bjvZ5w7BW3rhiNec/AtmcL0ZVfvlRQpIZEftunu2QuyxZQl5ApbepLcFK/ah0PIQ/ajZ/SjCJWnbLfo/9LSbaqItDvbJtmQoW0g778r87uDrdDVE31QddUbj9uO3ceXYTizR280taQvv45KHto8jGGwBTnTVbhL/4Yh9sq2TfbJtctnKqzpr2Knp/Mz8i11LFgHhlNAT2yc19Nj7iyu68x/ecx6B4DsoibP92D6p7ebbcGBlfBlXxggAIAusxxC5jLhjyEw0N+rtZlnGQvuo5JFdh2KZO4C5jt/g4keCVTpr6Ncz+Zz9N/tB04RiP9whWyQQrq/EzpdmQvLD3dcQNh+gzI2kOnzbI+kpafgRCboQSfvO4Jjv2SIAgCxgDugKJOK9E9GGhXqHuSdrYXlKbjnYgCWXYfQIIIRar6Os0Kb+f/arzqw+NRNi8L4LMXoT6BftxGhm1KpEkcDoLTpr2JKsx+AGAABZwCzQBxCGJFW4Hax5eldgZfpP5y9pJoR2PoDId5LqBTQMrAJ9iJv6v6yJ3xHfJA/sG4lYl6DyPWBs2s4rFQTQyu7tX9arv9hJFrkGAEAWcQjd/C1qNSAEEfMu+1mlD+PLA6BkIbXUdq0BGjM2ov3/FuBZxDxLd807yde8C/bl3j3DCJizUP4B4UzQYNqZd4qPCX76DYGFcIpePOR1V8eVCwDFlCykloFdLwCnu2rEhMaQbaDrgZdB36W74z1tstfAua7/no7DEJ0CHI9YU4EpgHF9+pXiYxb/nezzgUB5UC8dco2bY7Q/UoYARDr/Vyin5dSImTvjE+Aj0M8w8jkW3QR0N4ogMhi0FiPDUGsCMAmJLNFOd53Dfb3u/XeyzwUC5T26O07SuaP341JlB4A0M5Cu7jUIUz17MUIujeimM/Kt118I9iDWCTpnaE7PZC6rR7cldD6kOdUBcDg1ynpBBIe8DOU41evm3ke8ivH0NY38F5Y5uXY+lBEA0sxADnavAaZmP9+FsoagUP8z1evs/x16xeDnyUNlAYA0M4jO8DqQqZ41YqVAYPEC9Yfmvc6i5ADIQmrpCK8GTvW8Efs8BPIG/TsviF/lm6tKOgmUhdQSDEfO80k/sUo+1UmxTWNfLhPDQv13tt9IwJyul9cX9BT2kgEgC6kloGtAG4vSiH0Lgj9BzVd17sBPKVAlGQKkmUGY8LrYM4OKEU77znCwGZjuRedDCQAQQdinT6JyClDcRuz9EGykq+urOveQnncKFaiiDwFyPeeCri5pOO2dw8F/Y8k5emXdNjxU8YcAy5pV8m9Sb4sEsIbAvmledz6UZA4gRwKlD6e9AwIFvYut9V/P5fp+LsqwKtg3daHYbaeQ12pj16tmsf8k2yeXg0O9CWWnqddf/3cizNF5h/yykMbOphIMAfo2UD4Tq3KMBOi7qHWcXlnna+dDKQBQ8yjRh0NUIUiuw0LlAbrqT9arvZvpZ1JJLgTJtSxDdHGZzK7L5exgI8b6tl5d3/PMxiKoNPcC7udGVK5HsdesVXYk6ASa2DloSrE7H0oUAWKVX8dE1FqGyLdwWm4V2yeXb1JviQSK6CosXawL6kr2Yu2yWBEk19KA0TuBcyoDAl5Dwot0ft0rlFhlAUBUch1ngd5AdEVQX4NA+A1Gm3R+7TrKRGUFQFSygKMJWPNQuRihfy+HoAt0FaLL9braFx0PuIQqSwCikvmMpsaaBzILdJKdGM2MbssWgo8RXUE3j+hib+7c+aGyBiBesogGwtZsDBcDo+3EaGaZQKC0Y1iLWC10DFyrTZG3spaxeg0AUcnfE+Cw7tNQcyZGp4JMAYIlgqAb0d+isoGgrqaj/6te/yLJb/U6AJIlN1CHhE9DZSpGjwUagJE+QdCG8D6qbxCQlwn2e1WvZ4/Xx1RM9XoAnCSLGQrdX0LNkYh1GCIjEB2GMhzRUYjU9xgnQLAdQztoO8o2hK0gH2BkE8Fgq34fz2/Hllr/D1DoAB9bI40ZAAAAAElFTkSuQmCC|$(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: removeNewVersionNotif
- continue-on-error: true
- if: fromJson(inputs.extras).removeNewVersionNotif == 'true'
- run: |
- wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/removeNewVersionNotif.diff
- git apply removeNewVersionNotif.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
deleted file mode 100644
index ba0371f..0000000
--- a/.github/workflows/pre137-generator-macos.yml
+++ /dev/null
@@ -1,798 +0,0 @@
-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|