forked from shaytan/rdgen
Compare commits
62 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
785d03e46f | ||
|
|
996b3c66b0 | ||
|
|
08af79b930 | ||
|
|
f6be77c68a | ||
|
|
a9718c4f5d | ||
|
|
119b272564 | ||
|
|
50236e59ff | ||
|
|
877ec790d6 | ||
|
|
972451709c | ||
|
|
e2c20567d6 | ||
|
|
6718464f57 | ||
|
|
5148b792e6 | ||
|
|
e79572d55d | ||
|
|
9c1ab4de3c | ||
|
|
d2b36d3876 | ||
|
|
16d0818a28 | ||
|
|
634a77a054 | ||
|
|
3ff33a6efb | ||
|
|
897fe1a487 | ||
|
|
8b04b051fd | ||
|
|
c59a838f7b | ||
|
|
ebaedbcf55 | ||
|
|
21a5dc1bf6 | ||
|
|
e8af50a5fc | ||
|
|
124af41206 | ||
|
|
2e216e9d26 | ||
|
|
8cd0e78ec7 | ||
|
|
581dcd62c3 | ||
|
|
60ec06b3ea | ||
|
|
8253cce1bf | ||
|
|
6167b8f61d | ||
|
|
9fd8f52815 | ||
|
|
50f15f18b4 | ||
|
|
c4cc4a167e | ||
|
|
1d51a43a47 | ||
|
|
905d8039ef | ||
|
|
8b8aff445a | ||
|
|
1b56fa5833 | ||
|
|
ac114152de | ||
|
|
ca0d321873 | ||
|
|
80fc9f6a84 | ||
|
|
b567c74902 | ||
|
|
cc47350fab | ||
|
|
e882a604d7 | ||
|
|
1b7468a1f2 | ||
|
|
1424caffb0 | ||
|
|
47cf713307 | ||
|
|
fe505ed35c | ||
|
|
a68e9d8a83 | ||
|
|
995f78b6a1 | ||
|
|
7951080c6c | ||
|
|
6792760e57 | ||
|
|
da33c6f5fd | ||
|
|
6c2e2f39e9 | ||
|
|
f420425ecb | ||
|
|
4a5dce088a | ||
|
|
51cb240b13 | ||
|
|
a9bf03b34b | ||
|
|
286320cd81 | ||
|
|
0f1b1d1d55 | ||
|
|
ee673c2667 | ||
|
|
2c970680ef |
615
.github/old-workflows/pre133-generator-android.yml
vendored
615
.github/old-workflows/pre133-generator-android.yml
vendored
File diff suppressed because one or more lines are too long
587
.github/old-workflows/pre133-generator-linux.yml
vendored
587
.github/old-workflows/pre133-generator-linux.yml
vendored
File diff suppressed because one or more lines are too long
566
.github/old-workflows/pre133-generator-windows.yml
vendored
566
.github/old-workflows/pre133-generator-windows.yml
vendored
File diff suppressed because one or more lines are too long
29
.github/patches/allowCustom.diff
vendored
Normal file
29
.github/patches/allowCustom.diff
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
diff --git a/src/common.rs b/src/common.rs
|
||||||
|
index 56361a5da..92b221e9a 100644
|
||||||
|
--- a/src/common.rs
|
||||||
|
+++ b/src/common.rs
|
||||||
|
@@ -1474,15 +1474,15 @@ pub fn read_custom_client(config: &str) {
|
||||||
|
log::error!("Failed to decode custom client config");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
- const KEY: &str = "5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=";
|
||||||
|
- let Some(pk) = get_rs_pk(KEY) else {
|
||||||
|
- log::error!("Failed to parse public key of custom client");
|
||||||
|
- return;
|
||||||
|
- };
|
||||||
|
- let Ok(data) = sign::verify(&data, &pk) else {
|
||||||
|
- log::error!("Failed to dec custom client config");
|
||||||
|
- return;
|
||||||
|
- };
|
||||||
|
+ // const KEY: &str = "5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=";
|
||||||
|
+ // let Some(pk) = get_rs_pk(KEY) else {
|
||||||
|
+ // log::error!("Failed to parse public key of custom client");
|
||||||
|
+ // return;
|
||||||
|
+ // };
|
||||||
|
+ // let Ok(data) = sign::verify(&data, &pk) else {
|
||||||
|
+ // log::error!("Failed to dec custom client config");
|
||||||
|
+ // return;
|
||||||
|
+ // };
|
||||||
|
let Ok(mut data) =
|
||||||
|
serde_json::from_slice::<std::collections::HashMap<String, serde_json::Value>>(&data)
|
||||||
|
else {
|
||||||
47
.github/patches/removeNewVersionNotif.diff
vendored
47
.github/patches/removeNewVersionNotif.diff
vendored
@@ -1,22 +1,41 @@
|
|||||||
diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart
|
diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart
|
||||||
index ba724eed5..cb66cdaed 100644
|
index ba724eed5..1604c429f 100644
|
||||||
--- a/flutter/lib/desktop/pages/desktop_home_page.dart
|
--- a/flutter/lib/desktop/pages/desktop_home_page.dart
|
||||||
+++ b/flutter/lib/desktop/pages/desktop_home_page.dart
|
+++ b/flutter/lib/desktop/pages/desktop_home_page.dart
|
||||||
@@ -424,7 +424,7 @@ class _DesktopHomePageState extends State<DesktopHomePage>
|
@@ -424,21 +424,21 @@ class _DesktopHomePageState extends State<DesktopHomePage>
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget buildHelpCards(String updateUrl) {
|
Widget buildHelpCards(String updateUrl) {
|
||||||
- if (!bind.isCustomClient() &&
|
- if (!bind.isCustomClient() &&
|
||||||
+ /*if (!bind.isCustomClient() &&
|
- updateUrl.isNotEmpty &&
|
||||||
updateUrl.isNotEmpty &&
|
- !isCardClosed &&
|
||||||
!isCardClosed &&
|
- bind.mainUriPrefixSync().contains('rustdesk')) {
|
||||||
bind.mainUriPrefixSync().contains('rustdesk')) {
|
- return buildInstallCard(
|
||||||
@@ -435,7 +435,7 @@ class _DesktopHomePageState extends State<DesktopHomePage>
|
- "Status",
|
||||||
final Uri url = Uri.parse('https://rustdesk.com/download');
|
- "${translate("new-version-of-{${bind.mainGetAppNameSync()}}-tip")} (${bind.mainGetNewVersion()}).",
|
||||||
await launchUrl(url);
|
- "Click to download", () async {
|
||||||
}, closeButton: true);
|
- final Uri url = Uri.parse('https://rustdesk.com/download');
|
||||||
|
- await launchUrl(url);
|
||||||
|
- }, closeButton: true);
|
||||||
- }
|
- }
|
||||||
+ }*/
|
- if (systemError.isNotEmpty) {
|
||||||
if (systemError.isNotEmpty) {
|
- return buildInstallCard("", systemError, "", () {});
|
||||||
return buildInstallCard("", systemError, "", () {});
|
- }
|
||||||
}
|
+ // if (!bind.isCustomClient() &&
|
||||||
|
+ // updateUrl.isNotEmpty &&
|
||||||
|
+ // !isCardClosed &&
|
||||||
|
+ // bind.mainUriPrefixSync().contains('rustdesk')) {
|
||||||
|
+ // return buildInstallCard(
|
||||||
|
+ // "Status",
|
||||||
|
+ // "${translate("new-version-of-{${bind.mainGetAppNameSync()}}-tip")} (${bind.mainGetNewVersion()}).",
|
||||||
|
+ // "Click to download", () async {
|
||||||
|
+ // final Uri url = Uri.parse('https://rustdesk.com/download');
|
||||||
|
+ // await launchUrl(url);
|
||||||
|
+ // }, closeButton: true);
|
||||||
|
+ // }
|
||||||
|
+ // if (systemError.isNotEmpty) {
|
||||||
|
+ // return buildInstallCard("", systemError, "", () {});
|
||||||
|
+ // }
|
||||||
|
|
||||||
|
if (isWindows && !bind.isDisableInstallation()) {
|
||||||
|
if (!bind.mainIsInstalled()) {
|
||||||
|
|||||||
13
.github/patches/removeSetupServerTip.diff
vendored
Normal file
13
.github/patches/removeSetupServerTip.diff
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
diff --git a/flutter/lib/desktop/pages/connection_page.dart b/flutter/lib/desktop/pages/connection_page.dart
|
||||||
|
index d9dc3eec4..76f386b76 100644
|
||||||
|
--- a/flutter/lib/desktop/pages/connection_page.dart
|
||||||
|
+++ b/flutter/lib/desktop/pages/connection_page.dart
|
||||||
|
@@ -131,7 +131,7 @@ class _OnlineStatusWidgetState extends State<OnlineStatusWidget> {
|
||||||
|
if (!isIncomingOnly) startServiceWidget(),
|
||||||
|
// ready && public
|
||||||
|
// No need to show the guide if is custom client.
|
||||||
|
- if (!isIncomingOnly) setupServerWidget(),
|
||||||
|
+ //if (!isIncomingOnly) setupServerWidget(),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
33
.github/patches/statussort.diff
vendored
33
.github/patches/statussort.diff
vendored
@@ -1,33 +0,0 @@
|
|||||||
diff --git a/flutter/lib/common/widgets/peers_view.dart b/flutter/lib/common/widgets/peers_view.dart
|
|
||||||
index 3e34f882d..68d82116b 100644
|
|
||||||
--- a/flutter/lib/common/widgets/peers_view.dart
|
|
||||||
+++ b/flutter/lib/common/widgets/peers_view.dart
|
|
||||||
@@ -25,13 +25,13 @@ class PeerSortType {
|
|
||||||
static const String remoteId = 'Remote ID';
|
|
||||||
static const String remoteHost = 'Remote Host';
|
|
||||||
static const String username = 'Username';
|
|
||||||
- // static const String status = 'Status';
|
|
||||||
+ static const String status = 'Status';
|
|
||||||
|
|
||||||
static List<String> values = [
|
|
||||||
PeerSortType.remoteId,
|
|
||||||
PeerSortType.remoteHost,
|
|
||||||
PeerSortType.username,
|
|
||||||
- // PeerSortType.status
|
|
||||||
+ PeerSortType.status
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -384,9 +384,9 @@ class _PeersViewState extends State<_PeersView>
|
|
||||||
peers.sort((p1, p2) =>
|
|
||||||
p1.username.toLowerCase().compareTo(p2.username.toLowerCase()));
|
|
||||||
break;
|
|
||||||
- // case PeerSortType.status:
|
|
||||||
- // peers.sort((p1, p2) => p1.online ? -1 : 1);
|
|
||||||
- // break;
|
|
||||||
+ case PeerSortType.status:
|
|
||||||
+ peers.sort((p1, p2) => p1.online ? -1 : 1);
|
|
||||||
+ break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
8
.github/workflows/bridge.yml
vendored
8
.github/workflows/bridge.yml
vendored
@@ -12,6 +12,7 @@ on:
|
|||||||
type: string
|
type: string
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
CARGO_EXPAND_VERSION: "1.0.95"
|
||||||
FLUTTER_VERSION: "3.22.3"
|
FLUTTER_VERSION: "3.22.3"
|
||||||
FLUTTER_RUST_BRIDGE_VERSION: "1.80.1"
|
FLUTTER_RUST_BRIDGE_VERSION: "1.80.1"
|
||||||
RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503
|
RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503
|
||||||
@@ -25,7 +26,7 @@ jobs:
|
|||||||
job:
|
job:
|
||||||
- {
|
- {
|
||||||
target: x86_64-unknown-linux-gnu,
|
target: x86_64-unknown-linux-gnu,
|
||||||
os: ubuntu-20.04,
|
os: ubuntu-24.04,
|
||||||
extra-build-args: "",
|
extra-build-args: "",
|
||||||
}
|
}
|
||||||
steps:
|
steps:
|
||||||
@@ -55,9 +56,9 @@ jobs:
|
|||||||
gcc \
|
gcc \
|
||||||
git \
|
git \
|
||||||
g++ \
|
g++ \
|
||||||
libclang-10-dev \
|
libclang-dev \
|
||||||
libgtk-3-dev \
|
libgtk-3-dev \
|
||||||
llvm-10-dev \
|
llvm-dev \
|
||||||
nasm \
|
nasm \
|
||||||
ninja-build \
|
ninja-build \
|
||||||
pkg-config \
|
pkg-config \
|
||||||
@@ -91,6 +92,7 @@ jobs:
|
|||||||
- name: Install flutter rust bridge deps
|
- name: Install flutter rust bridge deps
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
|
cargo install cargo-expand --version ${{ env.CARGO_EXPAND_VERSION }} --locked
|
||||||
cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" --locked
|
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
|
pushd flutter && sed -i -e 's/extended_text: 14.0.0/extended_text: 13.0.0/g' pubspec.yaml && flutter pub get && popd
|
||||||
|
|
||||||
|
|||||||
96
.github/workflows/generator-android.yml
vendored
96
.github/workflows/generator-android.yml
vendored
@@ -69,21 +69,14 @@ env:
|
|||||||
TAG_NAME: "${{ inputs.upload-tag }}"
|
TAG_NAME: "${{ inputs.upload-tag }}"
|
||||||
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
|
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
|
||||||
# vcpkg version: 2024.07.12
|
# vcpkg version: 2024.07.12
|
||||||
VCPKG_COMMIT_ID: "b2cb0da531c2f1f740045bfe7c4dac59f0b2b69c"
|
VCPKG_COMMIT_ID: "460551b0ec06be1ba6b918448bf3b0f44add813d"
|
||||||
VERSION: "${{ fromJson(inputs.extras).version }}"
|
VERSION: "${{ fromJson(inputs.extras).version }}"
|
||||||
NDK_VERSION: "r27c"
|
NDK_VERSION: "r27c"
|
||||||
#signing keys env variable checks
|
#signing keys env variable checks
|
||||||
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
|
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
|
||||||
MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}"
|
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'
|
UPLOAD_ARTIFACT: 'true'
|
||||||
SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}"
|
SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}"
|
||||||
ICONBASE64: "$${{ inputs.iconbase64 }}"
|
|
||||||
STATUS_URL: "${{ secrets.GENURL }}/updategh"
|
STATUS_URL: "${{ secrets.GENURL }}/updategh"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -103,21 +96,21 @@ jobs:
|
|||||||
- {
|
- {
|
||||||
arch: aarch64,
|
arch: aarch64,
|
||||||
target: aarch64-linux-android,
|
target: aarch64-linux-android,
|
||||||
os: ubuntu-20.04,
|
os: ubuntu-24.04,
|
||||||
reltype: release,
|
reltype: release,
|
||||||
suffix: "",
|
suffix: "",
|
||||||
}
|
}
|
||||||
- {
|
- {
|
||||||
arch: armv7,
|
arch: armv7,
|
||||||
target: armv7-linux-androideabi,
|
target: armv7-linux-androideabi,
|
||||||
os: ubuntu-20.04,
|
os: ubuntu-24.04,
|
||||||
reltype: release,
|
reltype: release,
|
||||||
suffix: "",
|
suffix: "",
|
||||||
}
|
}
|
||||||
- {
|
- {
|
||||||
arch: x86_64,
|
arch: x86_64,
|
||||||
target: x86_64-linux-android,
|
target: x86_64-linux-android,
|
||||||
os: ubuntu-20.04,
|
os: ubuntu-24.04,
|
||||||
reltype: release,
|
reltype: release,
|
||||||
suffix: "",
|
suffix: "",
|
||||||
}
|
}
|
||||||
@@ -173,7 +166,7 @@ jobs:
|
|||||||
libayatana-appindicator3-dev \
|
libayatana-appindicator3-dev \
|
||||||
libasound2-dev \
|
libasound2-dev \
|
||||||
libc6-dev \
|
libc6-dev \
|
||||||
libclang-10-dev \
|
libclang-dev \
|
||||||
libgstreamer1.0-dev \
|
libgstreamer1.0-dev \
|
||||||
libgstreamer-plugins-base1.0-dev \
|
libgstreamer-plugins-base1.0-dev \
|
||||||
libgtk-3-dev \
|
libgtk-3-dev \
|
||||||
@@ -186,7 +179,7 @@ jobs:
|
|||||||
libxcb-xfixes0-dev \
|
libxcb-xfixes0-dev \
|
||||||
libxdo-dev \
|
libxdo-dev \
|
||||||
libxfixes-dev \
|
libxfixes-dev \
|
||||||
llvm-10-dev \
|
llvm-dev \
|
||||||
nasm \
|
nasm \
|
||||||
ninja-build \
|
ninja-build \
|
||||||
openjdk-17-jdk-headless \
|
openjdk-17-jdk-headless \
|
||||||
@@ -297,7 +290,6 @@ jobs:
|
|||||||
mv ./res/icon.ico ./res/icon.ico.bak
|
mv ./res/icon.ico ./res/icon.ico.bak
|
||||||
mv ./res/icon.png ./res/icon.png.bak
|
mv ./res/icon.png ./res/icon.png.bak
|
||||||
mv ./res/tray-icon.ico ./res/tray-icon.ico.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 }}
|
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/32x32.png ./res/32x32.png.bak
|
||||||
mv ./res/64x64.png ./res/64x64.png.bak
|
mv ./res/64x64.png ./res/64x64.png.bak
|
||||||
@@ -319,6 +311,16 @@ jobs:
|
|||||||
sed -i '/adaptive_icon_foreground:/a \ \ adaptive_icon_foreground_inset: 32' ./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
|
sed -i '/ic_launcher_background/d' ./flutter/android/app/src/main/res/values/colors.xml
|
||||||
|
|
||||||
|
- name: set server, key, and apiserver
|
||||||
|
continue-on-error: true
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
sed -i -e 's|rs-ny.rustdesk.com|${{ inputs.server }}|' ./libs/hbb_common/src/config.rs
|
||||||
|
sed -i -e 's|OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw=|${{ inputs.key }}|' ./libs/hbb_common/src/config.rs
|
||||||
|
sed -i -e 's|https://admin.rustdesk.com|${{ inputs.apiServer }}|' ./src/common.rs
|
||||||
|
# ./flutter/pubspec.yaml
|
||||||
|
#sed -i '/intl:/a \ \ archive: ^3.6.1' ./flutter/pubspec.yaml
|
||||||
|
|
||||||
- name: change appname to custom
|
- name: change appname to custom
|
||||||
if: inputs.appname != 'rustdesk'
|
if: inputs.appname != 'rustdesk'
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
@@ -338,7 +340,7 @@ jobs:
|
|||||||
sed -i -e 's|"Copyright © 2025 Purslane Ltd. All rights reserved."|"Copyright © 2025"|' ./flutter/windows/runner/Runner.rc
|
sed -i -e 's|"Copyright © 2025 Purslane Ltd. All rights reserved."|"Copyright © 2025"|' ./flutter/windows/runner/Runner.rc
|
||||||
sed -i -e 's|"rustdesk.exe"|"${{ inputs.filename }}"|' ./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 }}"|' ./flutter/windows/runner/Runner.rc
|
||||||
sed -i -e 's|RustDesk|${{ inputs.appname }}|' ./src/lang/en.rs
|
find ./src/lang -name "*.rs" -exec sed -i -e 's|RustDesk|${{ inputs.appname }}|' {} \;
|
||||||
sed -i -e 's|RustDesk|${{ inputs.appname }}|' ./flutter/android/app/src/main/res/values/strings.xml
|
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|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 -e "s|return 'RustDesk';|return '${{ inputs.appname }}';|" ./flutter/lib/web/bridge.dart
|
||||||
@@ -380,7 +382,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
sed -i -e '/const KEY:/,/};/d' ./src/common.rs
|
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 -e '/let Ok(data) = sign::verify(&data, &pk)/,/};/d' ./src/common.rs
|
||||||
sed -i '/intl:/a \ \ archive: ^3.6.1' ./flutter/pubspec.yaml
|
# sed -i '/intl:/a \ \ archive: ^3.6.1' ./flutter/pubspec.yaml
|
||||||
|
|
||||||
- name: fix connection delay
|
- name: fix connection delay
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
@@ -410,19 +412,11 @@ jobs:
|
|||||||
wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/hidecm.diff
|
wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/hidecm.diff
|
||||||
git apply 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
|
- name: removeNewVersionNotif
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
if: fromJson(inputs.extras).removeNewVersionNotif == 'true'
|
if: fromJson(inputs.extras).removeNewVersionNotif == 'true'
|
||||||
run: |
|
run: |
|
||||||
wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/removeNewVersionNotif.diff
|
sed -i -e 's|updateUrl.isNotEmpty|false|' ./flutter/lib/desktop/pages/desktop_home_page.dart
|
||||||
git apply removeNewVersionNotif.diff
|
|
||||||
|
|
||||||
- name: Report Status
|
- name: Report Status
|
||||||
uses: fjogeleit/http-request-action@v1
|
uses: fjogeleit/http-request-action@v1
|
||||||
@@ -486,6 +480,15 @@ jobs:
|
|||||||
customHeaders: '{"Content-Type": "application/json"}'
|
customHeaders: '{"Content-Type": "application/json"}'
|
||||||
data: '{"uuid": "${{ inputs.uuid }}", "status": "45% complete"}'
|
data: '{"uuid": "${{ inputs.uuid }}", "status": "45% complete"}'
|
||||||
|
|
||||||
|
- name: icons
|
||||||
|
if: ${{ inputs.iconlink != 'false' }}
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
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 || true
|
||||||
|
cp ./flutter/assets/icon.svg ./res/scalable.svg
|
||||||
|
|
||||||
- name: Build rustdesk
|
- name: Build rustdesk
|
||||||
shell: bash
|
shell: bash
|
||||||
env:
|
env:
|
||||||
@@ -499,14 +502,8 @@ jobs:
|
|||||||
mkdir -p ./flutter/android/app/src/main/jniLibs/arm64-v8a
|
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 ${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
|
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
|
echo -n "${{ inputs.custom }}" | cat > ./flutter/assets/custom.txt
|
||||||
#sed -i '/^ - assets\//a\ - assets/custom.txt' ./flutter/pubspec.yaml
|
#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
|
# build flutter
|
||||||
pushd flutter
|
pushd flutter
|
||||||
flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-arm64 --split-per-abi
|
flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-arm64 --split-per-abi
|
||||||
@@ -516,14 +513,8 @@ jobs:
|
|||||||
mkdir -p ./flutter/android/app/src/main/jniLibs/armeabi-v7a
|
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 ${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
|
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
|
echo -n "${{ inputs.custom }}" | cat > ./flutter/assets/custom.txt
|
||||||
#sed -i '/^ - assets\//a\ - assets/custom.txt' ./flutter/pubspec.yaml
|
#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
|
# build flutter
|
||||||
pushd flutter
|
pushd flutter
|
||||||
flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-arm --split-per-abi
|
flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-arm --split-per-abi
|
||||||
@@ -533,14 +524,8 @@ jobs:
|
|||||||
mkdir -p ./flutter/android/app/src/main/jniLibs/x86_64
|
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 ${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
|
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
|
echo -n "${{ inputs.custom }}" | cat > ./flutter/assets/custom.txt
|
||||||
#sed -i '/^ - assets\//a\ - assets/custom.txt' ./flutter/pubspec.yaml
|
#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
|
# build flutter
|
||||||
pushd flutter
|
pushd flutter
|
||||||
flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-x64 --split-per-abi
|
flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-x64 --split-per-abi
|
||||||
@@ -550,14 +535,8 @@ jobs:
|
|||||||
mkdir -p ./flutter/android/app/src/main/jniLibs/x86
|
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 ${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
|
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
|
echo -n "${{ inputs.custom }}" | cat > ./flutter/assets/custom.txt
|
||||||
#sed -i '/^ - assets\//a\ - assets/custom.txt' ./flutter/pubspec.yaml
|
#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
|
# build flutter
|
||||||
pushd flutter
|
pushd flutter
|
||||||
flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-x86 --split-per-abi
|
flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-x86 --split-per-abi
|
||||||
@@ -603,17 +582,6 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
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
|
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
|
- name: Report Status
|
||||||
uses: fjogeleit/http-request-action@v1
|
uses: fjogeleit/http-request-action@v1
|
||||||
|
|||||||
187
.github/workflows/generator-linux.yml
vendored
187
.github/workflows/generator-linux.yml
vendored
@@ -69,21 +69,14 @@ env:
|
|||||||
TAG_NAME: "${{ inputs.upload-tag }}"
|
TAG_NAME: "${{ inputs.upload-tag }}"
|
||||||
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
|
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
|
||||||
# vcpkg version: 2024.07.12
|
# vcpkg version: 2024.07.12
|
||||||
VCPKG_COMMIT_ID: "b2cb0da531c2f1f740045bfe7c4dac59f0b2b69c"
|
VCPKG_COMMIT_ID: "460551b0ec06be1ba6b918448bf3b0f44add813d"
|
||||||
VERSION: "${{ fromJson(inputs.extras).version }}"
|
VERSION: "${{ fromJson(inputs.extras).version }}"
|
||||||
NDK_VERSION: "r27c"
|
NDK_VERSION: "r27c"
|
||||||
#signing keys env variable checks
|
#signing keys env variable checks
|
||||||
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
|
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
|
||||||
MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}"
|
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'
|
UPLOAD_ARTIFACT: 'true'
|
||||||
SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}"
|
SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}"
|
||||||
ICONBASE64: "$${{ inputs.iconbase64 }}"
|
|
||||||
STATUS_URL: "${{ secrets.GENURL }}/updategh"
|
STATUS_URL: "${{ secrets.GENURL }}/updategh"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -109,14 +102,14 @@ jobs:
|
|||||||
deb_arch: amd64,
|
deb_arch: amd64,
|
||||||
vcpkg-triplet: x64-linux,
|
vcpkg-triplet: x64-linux,
|
||||||
}
|
}
|
||||||
# - {
|
- {
|
||||||
# arch: aarch64,
|
arch: aarch64,
|
||||||
# target: aarch64-unknown-linux-gnu,
|
target: aarch64-unknown-linux-gnu,
|
||||||
# distro: ubuntu18.04,
|
distro: ubuntu18.04,
|
||||||
# on: [self-hosted, Linux, ARM64],
|
on: ubuntu-22.04-arm,
|
||||||
# deb_arch: arm64,
|
deb_arch: arm64,
|
||||||
# vcpkg-triplet: arm64-linux,
|
vcpkg-triplet: arm64-linux,
|
||||||
# }
|
}
|
||||||
steps:
|
steps:
|
||||||
- name: Export GitHub Actions cache environment variables
|
- name: Export GitHub Actions cache environment variables
|
||||||
uses: actions/github-script@v6
|
uses: actions/github-script@v6
|
||||||
@@ -144,13 +137,15 @@ jobs:
|
|||||||
data: '{"uuid": "${{ inputs.uuid }}", "status": "5% complete"}'
|
data: '{"uuid": "${{ inputs.uuid }}", "status": "5% complete"}'
|
||||||
|
|
||||||
- name: Maximize build space
|
- name: Maximize build space
|
||||||
if: ${{ matrix.job.arch == 'x86_64' }}
|
|
||||||
run: |
|
run: |
|
||||||
sudo rm -rf /opt/ghc
|
sudo rm -rf /opt/ghc
|
||||||
sudo rm -rf /usr/local/lib/android
|
sudo rm -rf /usr/local/lib/android
|
||||||
sudo rm -rf /usr/share/dotnet
|
sudo rm -rf /usr/share/dotnet
|
||||||
sudo apt-get update -y
|
sudo apt-get update -y
|
||||||
sudo apt-get install -y nasm qemu-user-static
|
sudo apt-get install -y nasm
|
||||||
|
if [[ "${{ matrix.job.arch }}" == "x86_64" ]]; then
|
||||||
|
sudo apt-get install -y qemu-user-static
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
@@ -252,7 +247,6 @@ jobs:
|
|||||||
mv ./res/icon.ico ./res/icon.ico.bak
|
mv ./res/icon.ico ./res/icon.ico.bak
|
||||||
mv ./res/icon.png ./res/icon.png.bak
|
mv ./res/icon.png ./res/icon.png.bak
|
||||||
mv ./res/tray-icon.ico ./res/tray-icon.ico.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 }}
|
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/32x32.png ./res/32x32.png.bak
|
||||||
mv ./res/64x64.png ./res/64x64.png.bak
|
mv ./res/64x64.png ./res/64x64.png.bak
|
||||||
@@ -283,20 +277,31 @@ jobs:
|
|||||||
sed -i -e 's|ProductName = "RustDesk"|ProductName = "${{ 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|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|OriginalFilename = "rustdesk.exe"|OriginalFilename = "${{ inputs.appname }}.exe"|' ./libs/portable/Cargo.toml
|
||||||
sed -i -e 's|RustDesk|${{ inputs.appname }}|' ./src/lang/en.rs
|
find ./src/lang -name "*.rs" -exec sed -i -e 's|RustDesk|${{ inputs.appname }}|' {} \;
|
||||||
sed -i -e '/-p tmpdeb\/usr\/lib\/rustdesk/d' ./build.py
|
sed -i -e '/-p tmpdeb\/usr\/lib\/rustdesk/d' ./build.py
|
||||||
|
|
||||||
|
- name: change company name
|
||||||
|
if: fromJson(inputs.extras).compname != 'Purslane Ltd'
|
||||||
|
continue-on-error: true
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./flutter/lib/desktop/pages/desktop_setting_page.dart
|
||||||
|
sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./Cargo.toml
|
||||||
|
sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./libs/portable/Cargo.toml
|
||||||
|
|
||||||
- name: allow custom.txt
|
- name: allow custom.txt
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
sed -i -e 's|rs-ny.rustdesk.com|${{ env.RENDEZVOUS_SERVER }}|' ./libs/hbb_common/src/config.rs
|
sed -i -e 's|rs-ny.rustdesk.com|${{ inputs.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|OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw=|${{ inputs.key }}|' ./libs/hbb_common/src/config.rs
|
||||||
sed -i -e 's|For faster connection, please set up your own server||' ./src/lang/en.rs
|
wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/allowCustom.diff
|
||||||
sed -i -e '/const KEY:/,/};/d' ./src/common.rs
|
git apply allowCustom.diff
|
||||||
sed -i -e '/let Ok(data) = sign::verify(&data, &pk)/,/};/d' ./src/common.rs
|
wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/removeSetupServerTip.diff
|
||||||
echo -n "${{ env.CUSTOM }}" | cat > ./custom.txt
|
git apply removeSetupServerTip.diff
|
||||||
sed -i '/intl:/a \ \ archive: ^3.6.1' ./flutter/pubspec.yaml
|
echo -n "${{ inputs.custom }}" | cat > ./custom.txt
|
||||||
|
# sed -i '/intl:/a \ \ archive: ^3.6.1' ./flutter/pubspec.yaml
|
||||||
|
sed -i -e 's|https://admin.rustdesk.com|${{ inputs.apiServer }}|' ./src/common.rs
|
||||||
|
|
||||||
- name: change url to custom
|
- name: change url to custom
|
||||||
if: fromJson(inputs.extras).urlLink != 'https://rustdesk.com'
|
if: fromJson(inputs.extras).urlLink != 'https://rustdesk.com'
|
||||||
@@ -348,19 +353,11 @@ jobs:
|
|||||||
wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/hidecm.diff
|
wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/hidecm.diff
|
||||||
git apply 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
|
- name: removeNewVersionNotif
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
if: fromJson(inputs.extras).removeNewVersionNotif == 'true'
|
if: fromJson(inputs.extras).removeNewVersionNotif == 'true'
|
||||||
run: |
|
run: |
|
||||||
wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/removeNewVersionNotif.diff
|
sed -i -e 's|updateUrl.isNotEmpty|false|' ./flutter/lib/desktop/pages/desktop_home_page.dart
|
||||||
git apply removeNewVersionNotif.diff
|
|
||||||
|
|
||||||
- name: Restore bridge files
|
- name: Restore bridge files
|
||||||
if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true'
|
if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true'
|
||||||
@@ -369,22 +366,6 @@ jobs:
|
|||||||
name: bridge-artifact
|
name: bridge-artifact
|
||||||
path: ./
|
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
|
- name: Report Status
|
||||||
uses: fjogeleit/http-request-action@v1
|
uses: fjogeleit/http-request-action@v1
|
||||||
with:
|
with:
|
||||||
@@ -422,7 +403,7 @@ jobs:
|
|||||||
imagemagick \
|
imagemagick \
|
||||||
libayatana-appindicator3-dev \
|
libayatana-appindicator3-dev \
|
||||||
libasound2-dev \
|
libasound2-dev \
|
||||||
libclang-10-dev \
|
libclang-dev \
|
||||||
libgstreamer1.0-dev \
|
libgstreamer1.0-dev \
|
||||||
libgstreamer-plugins-base1.0-dev \
|
libgstreamer-plugins-base1.0-dev \
|
||||||
libgtk-3-dev \
|
libgtk-3-dev \
|
||||||
@@ -435,7 +416,7 @@ jobs:
|
|||||||
libxcb-xfixes0-dev \
|
libxcb-xfixes0-dev \
|
||||||
libxdo-dev \
|
libxdo-dev \
|
||||||
libxfixes-dev \
|
libxfixes-dev \
|
||||||
llvm-10-dev \
|
llvm-dev \
|
||||||
nasm \
|
nasm \
|
||||||
ninja-build \
|
ninja-build \
|
||||||
pkg-config \
|
pkg-config \
|
||||||
@@ -476,7 +457,7 @@ jobs:
|
|||||||
export JOBS=""
|
export JOBS=""
|
||||||
fi
|
fi
|
||||||
echo $JOBS
|
echo $JOBS
|
||||||
cargo build --lib $JOBS --features hwcodec,flutter --release
|
cargo build --lib $JOBS --features hwcodec,flutter,unix-file-copy-paste --release
|
||||||
rm -rf target/release/deps target/release/build
|
rm -rf target/release/deps target/release/build
|
||||||
rm -rf ~/.cargo
|
rm -rf ~/.cargo
|
||||||
|
|
||||||
@@ -535,25 +516,27 @@ jobs:
|
|||||||
chmod 777 output -R
|
chmod 777 output -R
|
||||||
export CARGO_INCREMENTAL=0
|
export CARGO_INCREMENTAL=0
|
||||||
export DEB_ARCH=${{ matrix.job.deb_arch }}
|
export DEB_ARCH=${{ matrix.job.deb_arch }}
|
||||||
mkdir -p flutter/tmpdeb/usr/lib/rustdesk
|
mkdir -p flutter/tmpdeb/usr/share/rustdesk
|
||||||
cp ./custom.txt ./flutter/tmpdeb/usr/lib/rustdesk/custom.txt
|
cp ./custom.txt ./flutter/tmpdeb/usr/share/rustdesk/custom.txt
|
||||||
if [[ "${{ inputs.logolink }}" != "false" ]]; then
|
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 }}
|
wget -O ./flutter/assets/logo.png ${{ fromJson(inputs.logolink).url }}/get_png?filename=${{ fromJson(inputs.logolink).file }}"&"uuid=${{ fromJson(inputs.logolink).uuid }}
|
||||||
fi
|
fi
|
||||||
if [[ "${{ inputs.iconlink }}" != "false" ]]; then
|
if [[ "${{ inputs.iconlink }}" != "false" ]]; then
|
||||||
mv ./flutter/assets/icon.svg ./flutter/assets/icon.svg.bak
|
mv ./flutter/assets/icon.svg ./flutter/assets/icon.svg.bak
|
||||||
convert ./res/icon.png ./flutter/assets/icon.svg
|
convert ./res/icon.png ./flutter/assets/icon.svg
|
||||||
convert ./res/128x128.png -resize 200% ./flutter/assets/128x128@2x.png
|
convert ./res/128x128.png -resize 200% ./flutter/assets/128x128@2x.png || true
|
||||||
convert ./res/icon.png ./res/scalable.svg
|
cp ./flutter/assets/icon.svg ./res/scalable.svg
|
||||||
pushd ./flutter
|
pushd ./flutter
|
||||||
|
if [[ "${{ matrix.job.arch }}" == "aarch64" ]]; then
|
||||||
|
export PATH="/opt/flutter-elinux/flutter/bin:$PATH"
|
||||||
|
fi
|
||||||
flutter pub get
|
flutter pub get
|
||||||
dart run flutter_launcher_icons
|
dart run flutter_launcher_icons
|
||||||
popd
|
popd
|
||||||
fi
|
fi
|
||||||
python3 ./build.py --flutter --skip-cargo
|
python3 ./build.py --flutter --skip-cargo
|
||||||
for name in rustdesk*??.deb; do
|
for name in rustdesk*??.deb; do
|
||||||
mv "$name" /workspace/output/"${{ inputs.filename }}.deb"
|
mv "$name" /workspace/output/"${{ inputs.filename }}-${{ matrix.job.arch }}.deb"
|
||||||
done
|
done
|
||||||
|
|
||||||
# rpm package
|
# rpm package
|
||||||
@@ -567,7 +550,7 @@ jobs:
|
|||||||
HBB=`pwd` rpmbuild ./res/rpm-flutter.spec -bb
|
HBB=`pwd` rpmbuild ./res/rpm-flutter.spec -bb
|
||||||
pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }}
|
pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }}
|
||||||
for name in rustdesk*??.rpm; do
|
for name in rustdesk*??.rpm; do
|
||||||
mv "$name" /workspace/output/"${{ inputs.filename }}.rpm"
|
mv "$name" /workspace/output/"${{ inputs.filename }}-${{ matrix.job.arch }}.rpm"
|
||||||
done
|
done
|
||||||
|
|
||||||
# rpm suse package
|
# rpm suse package
|
||||||
@@ -581,51 +564,53 @@ jobs:
|
|||||||
HBB=`pwd` rpmbuild ./res/rpm-flutter-suse.spec -bb
|
HBB=`pwd` rpmbuild ./res/rpm-flutter-suse.spec -bb
|
||||||
pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }}
|
pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }}
|
||||||
for name in rustdesk*??.rpm; do
|
for name in rustdesk*??.rpm; do
|
||||||
mv "$name" /workspace/output/"${{ inputs.filename }}-suse.rpm"
|
mv "$name" /workspace/output/"${{ inputs.filename }}-suse-${{ matrix.job.arch }}.rpm"
|
||||||
done
|
done
|
||||||
|
|
||||||
# - name: Publish debian/rpm package
|
# only x86_64 for arch since we can not find newest arm64 docker image to build
|
||||||
# if: env.UPLOAD_ARTIFACT == 'true'
|
# old arch image does not make sense for arch since it is "arch" which always update to date
|
||||||
# uses: softprops/action-gh-release@v1
|
# and failed to makepkg arm64 on x86_64
|
||||||
# with:
|
- name: Patch archlinux PKGBUILD
|
||||||
# prerelease: true
|
continue-on-error: true
|
||||||
# tag_name: ${{ env.TAG_NAME }}
|
if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true' && env.VERSION != 'master'
|
||||||
# files: |
|
run: |
|
||||||
# rustdesk-*.deb
|
sed -i "s/x86_64/${{ matrix.job.arch }}/g" res/PKGBUILD
|
||||||
# rustdesk-*.rpm
|
if [[ "${{ matrix.job.arch }}" == "aarch64" ]]; then
|
||||||
|
sed -i "s/x86_64/aarch64/g" ./res/PKGBUILD
|
||||||
|
fi
|
||||||
|
|
||||||
# - name: Upload to FTP
|
- name: Build archlinux package
|
||||||
# if: ${{ fromJson(inputs.extras).rdgen == 'true' }}
|
continue-on-error: true
|
||||||
# uses: SamKirkland/FTP-Deploy-Action@v4.3.5
|
if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true' && env.VERSION != 'master'
|
||||||
# with:
|
uses: rustdesk-org/arch-makepkg-action@master
|
||||||
# server: ${{ secrets.GEN_FTP_SERVER }}
|
with:
|
||||||
# username: ${{ secrets.GEN_FTP_USER }}
|
packages:
|
||||||
# password: ${{ secrets.GEN_FTP_PASSWORD }}
|
scripts: |
|
||||||
# local-dir: output/
|
cd res && HBB=`pwd`/.. FLUTTER=1 makepkg -f
|
||||||
# server-dir: /root/rdgen/exe/${{ env.UUIDFOLDER }}/
|
|
||||||
|
- name: Rename archlinux package
|
||||||
|
continue-on-error: true
|
||||||
|
if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true' && env.VERSION != 'master'
|
||||||
|
run: |
|
||||||
|
cp ./res/rustdesk-${{ env.VERSION }}-0-x86_64.pkg.tar.zst ./output/${{ inputs.filename }}-${{ matrix.job.arch }}.pkg.tar.zst
|
||||||
|
|
||||||
- name: send file to rdgen server
|
- name: send file to rdgen server
|
||||||
if: ${{ fromJson(inputs.extras).rdgen == 'true' }}
|
if: ${{ fromJson(inputs.extras).rdgen == 'true' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
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 }}-${{ matrix.job.arch }}.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 }}-${{ matrix.job.arch }}.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
|
curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" -F "file=@./output/${{ inputs.filename }}-suse-${{ matrix.job.arch }}.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 }}-${{ matrix.job.arch }}.pkg.tar.zst" -F "uuid=${{ inputs.uuid }}" ${{ secrets.GENURL }}/save_custom_client || true
|
||||||
|
|
||||||
- name: send file to api server
|
- name: send file to api server
|
||||||
if: ${{ fromJson(inputs.extras).rdgen == 'false' }}
|
if: ${{ fromJson(inputs.extras).rdgen == 'false' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
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 }}-${{ matrix.job.arch }}.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 }}-${{ matrix.job.arch }}.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
|
curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" -F "file=@./output/${{ inputs.filename }}-suse-${{ matrix.job.arch }}.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 }}-${{ matrix.job.arch }}.pkg.tar.zst" ${{ inputs.apiServer }}/api/save_custom_client || true
|
||||||
- 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
|
- name: Report Status
|
||||||
uses: fjogeleit/http-request-action@v1
|
uses: fjogeleit/http-request-action@v1
|
||||||
@@ -633,7 +618,7 @@ jobs:
|
|||||||
url: ${{ env.STATUS_URL }}
|
url: ${{ env.STATUS_URL }}
|
||||||
method: 'POST'
|
method: 'POST'
|
||||||
customHeaders: '{"Content-Type": "application/json"}'
|
customHeaders: '{"Content-Type": "application/json"}'
|
||||||
data: '{"uuid": "${{ inputs.uuid }}", "status": "Success"}'
|
data: '{"uuid": "${{ inputs.uuid }}", "status": "Finished ${{ matrix.job.arch }}"}'
|
||||||
|
|
||||||
- name: failed
|
- name: failed
|
||||||
if: failure()
|
if: failure()
|
||||||
@@ -652,3 +637,15 @@ jobs:
|
|||||||
method: 'POST'
|
method: 'POST'
|
||||||
customHeaders: '{"Content-Type": "application/json"}'
|
customHeaders: '{"Content-Type": "application/json"}'
|
||||||
data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation cancelled, try again"}'
|
data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation cancelled, try again"}'
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
needs: build-rustdesk-linux
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- 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"}'
|
||||||
76
.github/workflows/generator-macos.yml
vendored
76
.github/workflows/generator-macos.yml
vendored
@@ -69,18 +69,12 @@ env:
|
|||||||
TAG_NAME: "${{ inputs.upload-tag }}"
|
TAG_NAME: "${{ inputs.upload-tag }}"
|
||||||
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
|
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
|
||||||
# vcpkg version: 2024.07.12
|
# vcpkg version: 2024.07.12
|
||||||
VCPKG_COMMIT_ID: "b2cb0da531c2f1f740045bfe7c4dac59f0b2b69c"
|
VCPKG_COMMIT_ID: "460551b0ec06be1ba6b918448bf3b0f44add813d"
|
||||||
VERSION: "${{ fromJson(inputs.extras).version }}"
|
VERSION: "${{ fromJson(inputs.extras).version }}"
|
||||||
NDK_VERSION: "r27c"
|
NDK_VERSION: "r27c"
|
||||||
#signing keys env variable checks
|
#signing keys env variable checks
|
||||||
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
|
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
|
||||||
MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}"
|
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'
|
UPLOAD_ARTIFACT: 'true'
|
||||||
SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}"
|
SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}"
|
||||||
STATUS_URL: "${{ secrets.GENURL }}/updategh"
|
STATUS_URL: "${{ secrets.GENURL }}/updategh"
|
||||||
@@ -99,13 +93,13 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
job:
|
job:
|
||||||
# - {
|
- {
|
||||||
# target: x86_64-apple-darwin,
|
target: x86_64-apple-darwin,
|
||||||
# os: macos-13, #macos-latest or macos-14 use M1 now, https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#:~:text=14%20GB-,macos%2Dlatest%20or%20macos%2D14,-The%20macos%2Dlatestlabel
|
os: macos-13, #macos-latest or macos-14 use M1 now, https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#:~:text=14%20GB-,macos%2Dlatest%20or%20macos%2D14,-The%20macos%2Dlatestlabel
|
||||||
# extra-build-args: "",
|
extra-build-args: "",
|
||||||
# arch: x86_64,
|
arch: x86_64,
|
||||||
# vcpkg-triplet: x64-osx,
|
vcpkg-triplet: x64-osx,
|
||||||
# }
|
}
|
||||||
- {
|
- {
|
||||||
target: aarch64-apple-darwin,
|
target: aarch64-apple-darwin,
|
||||||
os: macos-latest,
|
os: macos-latest,
|
||||||
@@ -186,9 +180,12 @@ jobs:
|
|||||||
# MACSTUFF Update AppInfo.xcconfig
|
# MACSTUFF Update AppInfo.xcconfig
|
||||||
sed -i '' -e 's|PRODUCT_NAME = .*|PRODUCT_NAME = ${{ inputs.appname }}|' ./flutter/macos/Runner/Configs/AppInfo.xcconfig
|
sed -i '' -e 's|PRODUCT_NAME = .*|PRODUCT_NAME = ${{ inputs.appname }}|' ./flutter/macos/Runner/Configs/AppInfo.xcconfig
|
||||||
sed -i '' -e 's|PRODUCT_BUNDLE_IDENTIFIER = .*|PRODUCT_BUNDLE_IDENTIFIER = com.${{ inputs.appname }}.app|' ./flutter/macos/Runner/Configs/AppInfo.xcconfig
|
sed -i '' -e 's|PRODUCT_BUNDLE_IDENTIFIER = .*|PRODUCT_BUNDLE_IDENTIFIER = com.${{ inputs.appname }}.app|' ./flutter/macos/Runner/Configs/AppInfo.xcconfig
|
||||||
#sed -i '' -e 's|PRODUCT_COPYRIGHT = .*|PRODUCT_COPYRIGHT = Copyright 2025 ${{ inputs.appname }}. All rights reserved.|' ./flutter/macos/Runner/Configs/AppInfo.xcconfig
|
sed -i '' -e 's|Purslane Ltd.|${{ inputs.appname }}|' ./flutter/macos/Runner/Configs/AppInfo.xcconfig
|
||||||
# Keep DEVELOPMENT_TEAM if it exists, don't blank it out
|
# Keep DEVELOPMENT_TEAM if it exists, don't blank it out
|
||||||
|
|
||||||
|
sed -i -e 's|Purslane Ltd.|${{ inputs.appname }}|' ./Cargo.toml
|
||||||
|
sed -i -e 's|Purslane Ltd|${{ inputs.appname }}|' ./libs/portable/Cargo.toml
|
||||||
|
|
||||||
# Update Xcode project settings
|
# Update Xcode project settings
|
||||||
sed -i '' -e 's/PRODUCT_NAME = "RustDesk"/PRODUCT_NAME = "${{ inputs.appname }}"/' ./flutter/macos/Runner.xcodeproj/project.pbxproj
|
sed -i '' -e 's/PRODUCT_NAME = "RustDesk"/PRODUCT_NAME = "${{ inputs.appname }}"/' ./flutter/macos/Runner.xcodeproj/project.pbxproj
|
||||||
sed -i '' -e 's/PRODUCT_BUNDLE_IDENTIFIER = ".*"/PRODUCT_BUNDLE_IDENTIFIER = "com.${{ inputs.appname }}.app"/' ./flutter/macos/Runner.xcodeproj/project.pbxproj
|
sed -i '' -e 's/PRODUCT_BUNDLE_IDENTIFIER = ".*"/PRODUCT_BUNDLE_IDENTIFIER = "com.${{ inputs.appname }}.app"/' ./flutter/macos/Runner.xcodeproj/project.pbxproj
|
||||||
@@ -205,7 +202,7 @@ jobs:
|
|||||||
|
|
||||||
cp ./src/lang/en.rs ./src/lang/en.rs.bak
|
cp ./src/lang/en.rs ./src/lang/en.rs.bak
|
||||||
cp ./src/lang/nl.rs ./src/lang/nl.rs.bak
|
cp ./src/lang/nl.rs ./src/lang/nl.rs.bak
|
||||||
sed -i '' -e 's|RustDesk|${{ inputs.appname }}|' ./src/lang/en.rs
|
find ./src/lang -name "*.rs" -exec sed -i '' -e 's|RustDesk|${{ inputs.appname }}|' {} \;
|
||||||
sed -i '' -e 's|RustDesk|${{ inputs.appname }}|' ./src/lang/nl.rs
|
sed -i '' -e 's|RustDesk|${{ inputs.appname }}|' ./src/lang/nl.rs
|
||||||
|
|
||||||
sed -i '' -e 's|Homepage: https://rustdesk.com|Homepage: ${{ fromJson(inputs.extras).urlLink }}|' ./build.py
|
sed -i '' -e 's|Homepage: https://rustdesk.com|Homepage: ${{ fromJson(inputs.extras).urlLink }}|' ./build.py
|
||||||
@@ -239,12 +236,14 @@ jobs:
|
|||||||
sed -i '' -e 's/("About RustDesk", "Over RustDesk")/("About RustDesk", "Over ${{ inputs.appname }}")/' ./src/lang/nl.rs
|
sed -i '' -e 's/("About RustDesk", "Over RustDesk")/("About RustDesk", "Over ${{ inputs.appname }}")/' ./src/lang/nl.rs
|
||||||
sed -i '' -e 's/("About", "Over")/("About", "Over ${{ inputs.appname }}")/' ./src/lang/nl.rs
|
sed -i '' -e 's/("About", "Over")/("About", "Over ${{ inputs.appname }}")/' ./src/lang/nl.rs
|
||||||
|
|
||||||
sed -i -e 's|rs-ny.rustdesk.com|${{ env.RENDEZVOUS_SERVER }}|' ./libs/hbb_common/src/config.rs
|
sed -i -e 's|rs-ny.rustdesk.com|${{ inputs.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|OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw=|${{ inputs.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 's|https://admin.rustdesk.com|${{ inputs.apiServer }}|' ./src/common.rs
|
||||||
|
|
||||||
sed -i '' -e '/const KEY:/,/};/d' ./src/common.rs
|
wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/allowCustom.diff
|
||||||
sed -i '' -e '/let Ok(data) = sign::verify(&data, &pk)/,/};/d' ./src/common.rs
|
git apply allowCustom.diff
|
||||||
|
wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/removeSetupServerTip.diff
|
||||||
|
git apply removeSetupServerTip.diff
|
||||||
|
|
||||||
# Update pubspec.yaml with proper YAML formatting
|
# Update pubspec.yaml with proper YAML formatting
|
||||||
cp ./flutter/pubspec.yaml ./flutter/pubspec.yaml.bak
|
cp ./flutter/pubspec.yaml ./flutter/pubspec.yaml.bak
|
||||||
@@ -469,19 +468,11 @@ jobs:
|
|||||||
wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/hidecm.diff
|
wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/hidecm.diff
|
||||||
git apply 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
|
- name: removeNewVersionNotif
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
if: fromJson(inputs.extras).removeNewVersionNotif == 'true'
|
if: fromJson(inputs.extras).removeNewVersionNotif == 'true'
|
||||||
run: |
|
run: |
|
||||||
wget https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/removeNewVersionNotif.diff
|
sed -i -e 's|updateUrl.isNotEmpty|false|' ./flutter/lib/desktop/pages/desktop_home_page.dart
|
||||||
git apply removeNewVersionNotif.diff
|
|
||||||
|
|
||||||
- name: Report Status
|
- name: Report Status
|
||||||
uses: fjogeleit/http-request-action@v1
|
uses: fjogeleit/http-request-action@v1
|
||||||
@@ -724,14 +715,6 @@ jobs:
|
|||||||
"${{ inputs.appname }}.app"
|
"${{ inputs.appname }}.app"
|
||||||
mv "${{ inputs.appname }}-${{ matrix.job.arch }}.dmg" $GITHUB_WORKSPACE/
|
mv "${{ inputs.appname }}-${{ matrix.job.arch }}.dmg" $GITHUB_WORKSPACE/
|
||||||
|
|
||||||
#- name: Upload unsigned macOS app
|
|
||||||
# if: env.UPLOAD_ARTIFACT == 'true'
|
|
||||||
# uses: actions/upload-artifact@master
|
|
||||||
# with:
|
|
||||||
# name: ${{ inputs.appname }}-${{ matrix.job.arch }}
|
|
||||||
# path: ${{ inputs.appname }}-${{ matrix.job.arch }}.dmg
|
|
||||||
|
|
||||||
|
|
||||||
- name: Rename rustdesk
|
- name: Rename rustdesk
|
||||||
if: env.UPLOAD_ARTIFACT == 'true'
|
if: env.UPLOAD_ARTIFACT == 'true'
|
||||||
run: |
|
run: |
|
||||||
@@ -744,8 +727,8 @@ jobs:
|
|||||||
|
|
||||||
if [ -n "$DMG_FILE" ]; then
|
if [ -n "$DMG_FILE" ]; then
|
||||||
echo "Found DMG file: $DMG_FILE"
|
echo "Found DMG file: $DMG_FILE"
|
||||||
mv "$DMG_FILE" "${{ inputs.filename }}.dmg"
|
mv "$DMG_FILE" "${{ inputs.filename }}-${{ matrix.job.arch }}.dmg"
|
||||||
echo "Renamed to ${{ inputs.filename }}.dmg"
|
echo "Renamed to ${{ inputs.filename }}-${{ matrix.job.arch }}.dmg"
|
||||||
else
|
else
|
||||||
echo "No DMG file found matching the pattern"
|
echo "No DMG file found matching the pattern"
|
||||||
exit 1
|
exit 1
|
||||||
@@ -758,7 +741,7 @@ jobs:
|
|||||||
curl -i -X POST \
|
curl -i -X POST \
|
||||||
-H "Content-Type: multipart/form-data" \
|
-H "Content-Type: multipart/form-data" \
|
||||||
-H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" \
|
-H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" \
|
||||||
-F "file=@$GITHUB_WORKSPACE/${{ inputs.filename }}.dmg" \
|
-F "file=@$GITHUB_WORKSPACE/${{ inputs.filename }}-${{ matrix.job.arch }}.dmg" \
|
||||||
-F "uuid=${{ inputs.uuid }}" \
|
-F "uuid=${{ inputs.uuid }}" \
|
||||||
"${{ secrets.GENURL }}/save_custom_client"
|
"${{ secrets.GENURL }}/save_custom_client"
|
||||||
|
|
||||||
@@ -770,7 +753,7 @@ jobs:
|
|||||||
curl -i -X POST \
|
curl -i -X POST \
|
||||||
-H "Content-Type: multipart/form-data" \
|
-H "Content-Type: multipart/form-data" \
|
||||||
-H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" \
|
-H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" \
|
||||||
-F "file=@$GITHUB_WORKSPACE/${{ inputs.filename }}.dmg" \
|
-F "file=@$GITHUB_WORKSPACE/${{ inputs.filename }}-${{ matrix.job.arch }}.dmg" \
|
||||||
"${{ inputs.apiServer }}/api/save_custom_client"
|
"${{ inputs.apiServer }}/api/save_custom_client"
|
||||||
|
|
||||||
- name: Report Status
|
- name: Report Status
|
||||||
@@ -798,12 +781,3 @@ jobs:
|
|||||||
method: 'POST'
|
method: 'POST'
|
||||||
customHeaders: '{"Content-Type": "application/json"}'
|
customHeaders: '{"Content-Type": "application/json"}'
|
||||||
data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation cancelled, try again"}'
|
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
|
|
||||||
|
|||||||
158
.github/workflows/generator-windows.yml
vendored
158
.github/workflows/generator-windows.yml
vendored
@@ -64,24 +64,17 @@ env:
|
|||||||
LLVM_VERSION: "15.0.6"
|
LLVM_VERSION: "15.0.6"
|
||||||
FLUTTER_VERSION: "3.24.5"
|
FLUTTER_VERSION: "3.24.5"
|
||||||
ANDROID_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
|
# for arm64 linux because official Dart SDK does not work
|
||||||
FLUTTER_ELINUX_VERSION: "3.16.9"
|
FLUTTER_ELINUX_VERSION: "3.16.9"
|
||||||
TAG_NAME: "${{ inputs.upload-tag }}"
|
TAG_NAME: "${{ inputs.upload-tag }}"
|
||||||
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
|
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
|
||||||
# vcpkg version: 2024.07.12
|
# vcpkg version: 2024.07.12
|
||||||
VCPKG_COMMIT_ID: "b2cb0da531c2f1f740045bfe7c4dac59f0b2b69c"
|
VCPKG_COMMIT_ID: "460551b0ec06be1ba6b918448bf3b0f44add813d"
|
||||||
VERSION: "${{ fromJson(inputs.extras).version }}"
|
VERSION: "${{ fromJson(inputs.extras).version }}"
|
||||||
NDK_VERSION: "r27c"
|
NDK_VERSION: "r27c"
|
||||||
#signing keys env variable checks
|
#signing keys env variable checks
|
||||||
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
|
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
|
||||||
MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}"
|
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'
|
UPLOAD_ARTIFACT: 'true'
|
||||||
SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}"
|
SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}"
|
||||||
STATUS_URL: "${{ secrets.GENURL }}/updategh"
|
STATUS_URL: "${{ secrets.GENURL }}/updategh"
|
||||||
@@ -173,6 +166,12 @@ jobs:
|
|||||||
choco install -y imagemagick.app --no-progress
|
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
|
Get-ChildItem -Path "${env:ProgramFiles}" | % { $_.FullName } | Select-String -Pattern "[\/\\]ImageMagick[^\/\\]*$" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
||||||
|
|
||||||
|
- name: fix flutter_gpu_texture_renderer (fixed in master rustdesk)
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
sed -i -e 's|2ded7f146437a761ffe6981e2f742038f85ca68d|08a471bb8ceccdd50483c81cdfa8b81b07b14b87|' ./flutter/pubspec.lock
|
||||||
|
sed -i -e 's|2ded7f146437a761ffe6981e2f742038f85ca68d|08a471bb8ceccdd50483c81cdfa8b81b07b14b87|' ./flutter/pubspec.yaml
|
||||||
|
|
||||||
- name: change appname to custom
|
- name: change appname to custom
|
||||||
if: inputs.appname != 'rustdesk'
|
if: inputs.appname != 'rustdesk'
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
@@ -191,11 +190,25 @@ jobs:
|
|||||||
# ./flutter/windows/runner/Runner.rc
|
# ./flutter/windows/runner/Runner.rc
|
||||||
sed -i -e 's|"RustDesk Remote Desktop"|"${{ inputs.appname }}"|' ./flutter/windows/runner/Runner.rc
|
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|VALUE "InternalName", "rustdesk" "\0"|VALUE "InternalName", "${{ inputs.appname }}" "\0"|' ./flutter/windows/runner/Runner.rc
|
||||||
sed -i -e 's|"Copyright © 2025 Purslane Ltd. All rights reserved."|"Copyright © 2025"|' ./flutter/windows/runner/Runner.rc
|
|
||||||
sed -i -e 's|"rustdesk.exe"|"${{ inputs.filename }}"|' ./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 }}"|' ./flutter/windows/runner/Runner.rc
|
||||||
# ./src/lang/en.rs
|
# ./src/lang/en.rs
|
||||||
sed -i -e 's|RustDesk|${{ inputs.appname }}|' ./src/lang/en.rs
|
find ./src/lang -name "*.rs" -exec sed -i -e 's|RustDesk|${{ inputs.appname }}|' {} \;
|
||||||
|
|
||||||
|
|
||||||
|
- name: change company name
|
||||||
|
if: fromJson(inputs.extras).compname != 'Purslane Ltd'
|
||||||
|
continue-on-error: true
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./flutter/lib/desktop/pages/desktop_setting_page.dart
|
||||||
|
sed -i -e 's|Purslane Ltd.|${{ fromJson(inputs.extras).compname }}|' ./res/setup.nsi
|
||||||
|
sed -i -e 's|PURSLANE|${{ fromJson(inputs.extras).compname }}|' ./res/msi/preprocess.py
|
||||||
|
sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./res/msi/preprocess.py
|
||||||
|
sed -i -e 's|"Copyright © 2025 Purslane Ltd. All rights reserved."|"Copyright © 2025 ${{ fromJson(inputs.extras).compname }}. All rights reserved."|' ./flutter/windows/runner/Runner.rc
|
||||||
|
sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./flutter/windows/runner/Runner.rc
|
||||||
|
sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./Cargo.toml
|
||||||
|
sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./libs/portable/Cargo.toml
|
||||||
|
|
||||||
- name: change url to custom
|
- name: change url to custom
|
||||||
if: fromJson(inputs.extras).urlLink != 'https://rustdesk.com'
|
if: fromJson(inputs.extras).urlLink != 'https://rustdesk.com'
|
||||||
@@ -209,6 +222,7 @@ jobs:
|
|||||||
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|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|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 "s|https://rustdesk.com/privacy.html|${{ fromJson(inputs.extras).urlLink }}/privacy.html|" ./flutter/lib/desktop/pages/install_page.dart
|
||||||
|
sed -i -e "s|https://rustdesk.com/|${{fromJson(inputs.extras).urlLink }}|" ./res/setup.nsi
|
||||||
|
|
||||||
- name: change download link to custom
|
- name: change download link to custom
|
||||||
if: fromJson(inputs.extras).downloadLink != 'https://rustdesk.com/download'
|
if: fromJson(inputs.extras).downloadLink != 'https://rustdesk.com/download'
|
||||||
@@ -219,17 +233,23 @@ jobs:
|
|||||||
sed -i -e 's|https://rustdesk.com/download|${{ fromJson(inputs.extras).downloadLink }}|' ./flutter/lib/mobile/pages/connection_page.dart
|
sed -i -e 's|https://rustdesk.com/download|${{ fromJson(inputs.extras).downloadLink }}|' ./flutter/lib/mobile/pages/connection_page.dart
|
||||||
sed -i -e 's|https://rustdesk.com/download|${{ fromJson(inputs.extras).downloadLink }}|' ./src/ui/index.tis
|
sed -i -e 's|https://rustdesk.com/download|${{ fromJson(inputs.extras).downloadLink }}|' ./src/ui/index.tis
|
||||||
|
|
||||||
- name: allow custom.txt
|
- name: set server, key, and apiserver
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
sed -i -e 's|rs-ny.rustdesk.com|${{ env.RENDEZVOUS_SERVER }}|' ./libs/hbb_common/src/config.rs
|
sed -i -e 's|rs-ny.rustdesk.com|${{ inputs.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|OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw=|${{ inputs.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 's|https://admin.rustdesk.com|${{ inputs.apiServer }}|' ./src/common.rs
|
||||||
sed -i -e '/const KEY:/,/};/d' ./src/common.rs
|
|
||||||
sed -i -e '/let Ok(data) = sign::verify(&data, &pk)/,/};/d' ./src/common.rs
|
|
||||||
# ./flutter/pubspec.yaml
|
# ./flutter/pubspec.yaml
|
||||||
sed -i '/intl:/a \ \ archive: ^3.6.1' ./flutter/pubspec.yaml
|
#sed -i '/intl:/a \ \ archive: ^3.6.1' ./flutter/pubspec.yaml
|
||||||
|
|
||||||
|
- name: allow custom.txt
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
Invoke-WebRequest -Uri https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/allowCustom.diff -OutFile allowCustom.diff
|
||||||
|
git apply allowCustom.diff
|
||||||
|
Invoke-WebRequest -Uri https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/removeSetupServerTip.diff -OutFile removeSetupServerTip.diff
|
||||||
|
git apply removeSetupServerTip.diff
|
||||||
|
|
||||||
|
|
||||||
- name: Install LLVM and Clang
|
- name: Install LLVM and Clang
|
||||||
@@ -330,7 +350,6 @@ jobs:
|
|||||||
mv ./res/icon.ico ./res/icon.ico.bak
|
mv ./res/icon.ico ./res/icon.ico.bak
|
||||||
mv ./res/icon.png ./res/icon.png.bak
|
mv ./res/icon.png ./res/icon.png.bak
|
||||||
mv ./res/tray-icon.ico ./res/tray-icon.ico.bak
|
mv ./res/tray-icon.ico ./res/tray-icon.ico.bak
|
||||||
#echo "${{ inputs.iconbase64 }}" | base64 -d > ./res/icon.png
|
|
||||||
|
|
||||||
- name: magick stuff
|
- name: magick stuff
|
||||||
if: ${{ inputs.iconlink != 'false' }}
|
if: ${{ inputs.iconlink != 'false' }}
|
||||||
@@ -387,19 +406,12 @@ jobs:
|
|||||||
Invoke-WebRequest -Uri https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/hidecm.diff -OutFile hidecm.diff
|
Invoke-WebRequest -Uri https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/hidecm.diff -OutFile hidecm.diff
|
||||||
git apply hidecm.diff
|
git apply hidecm.diff
|
||||||
|
|
||||||
- name: statussort
|
|
||||||
continue-on-error: true
|
|
||||||
if: fromJson(inputs.extras).statussort == 'true'
|
|
||||||
run: |
|
|
||||||
Invoke-WebRequest -Uri https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/statussort.diff -OutFile statussort.diff
|
|
||||||
git apply statussort.diff
|
|
||||||
|
|
||||||
- name: removeNewVersionNotif
|
- name: removeNewVersionNotif
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
if: fromJson(inputs.extras).removeNewVersionNotif == 'true'
|
if: fromJson(inputs.extras).removeNewVersionNotif == 'true'
|
||||||
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
Invoke-WebRequest -Uri https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/removeNewVersionNotif.diff -Outfile removeNewVersionNotif.diff
|
sed -i -e 's|updateUrl.isNotEmpty|false|' ./flutter/lib/desktop/pages/desktop_home_page.dart
|
||||||
git apply removeNewVersionNotif.diff
|
|
||||||
|
|
||||||
|
|
||||||
- name: run as admin
|
- name: run as admin
|
||||||
@@ -423,7 +435,7 @@ jobs:
|
|||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
run: |
|
run: |
|
||||||
cd ./flutter
|
cd ./flutter
|
||||||
flutter pub upgrade win32
|
#flutter pub upgrade win32
|
||||||
flutter pub get
|
flutter pub get
|
||||||
flutter pub run flutter_launcher_icons
|
flutter pub run flutter_launcher_icons
|
||||||
cd ..
|
cd ..
|
||||||
@@ -438,14 +450,44 @@ jobs:
|
|||||||
|
|
||||||
- name: Build rustdesk
|
- name: Build rustdesk
|
||||||
run: |
|
run: |
|
||||||
|
# Windows: build RustDesk
|
||||||
|
python3 .\build.py --portable --hwcodec --flutter --vram --skip-portable-pack
|
||||||
|
mv ./flutter/build/windows/x64/runner/Release ./rustdesk
|
||||||
|
|
||||||
|
# Download usbmmidd_v2.zip and extract it to ./rustdesk
|
||||||
Invoke-WebRequest -Uri https://github.com/rustdesk-org/rdev/releases/download/usbmmidd_v2/usbmmidd_v2.zip -OutFile usbmmidd_v2.zip
|
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
|
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\Win32 -Recurse
|
||||||
Remove-Item -Path "usbmmidd_v2\deviceinstaller64.exe", "usbmmidd_v2\deviceinstaller.exe", "usbmmidd_v2\usbmmidd.bat"
|
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
|
mv -Force .\usbmmidd_v2 ./rustdesk
|
||||||
|
|
||||||
|
# Download printer driver files and extract them to ./rustdesk
|
||||||
|
try {
|
||||||
|
Invoke-WebRequest -Uri https://github.com/rustdesk/hbb_common/releases/download/driver/rustdesk_printer_driver_v4.zip -OutFile rustdesk_printer_driver_v4.zip
|
||||||
|
Invoke-WebRequest -Uri https://github.com/rustdesk/hbb_common/releases/download/driver/printer_driver_adapter.zip -OutFile printer_driver_adapter.zip
|
||||||
|
Invoke-WebRequest -Uri https://github.com/rustdesk/hbb_common/releases/download/driver/sha256sums -OutFile sha256sums
|
||||||
|
|
||||||
|
# Check and move the files
|
||||||
|
$checksum_driver = (Select-String -Path .\sha256sums -Pattern '^([a-fA-F0-9]{64}) \*rustdesk_printer_driver_v4\.zip$').Matches.Groups[1].Value
|
||||||
|
$downloadsum_driver = Get-FileHash -Path rustdesk_printer_driver_v4.zip -Algorithm SHA256
|
||||||
|
$checksum_dll = (Select-String -Path .\sha256sums -Pattern '^([a-fA-F0-9]{64}) \*printer_driver_adapter\.zip$').Matches.Groups[1].Value
|
||||||
|
$downloadsum_dll = Get-FileHash -Path printer_driver_adapter.zip -Algorithm SHA256
|
||||||
|
if ($checksum_driver -eq $downloadsum_driver.Hash -and $checksum_dll -eq $downloadsum_dll.Hash) {
|
||||||
|
Write-Output "rustdesk_printer_driver_v4, checksums match, extract the file."
|
||||||
|
Expand-Archive rustdesk_printer_driver_v4.zip -DestinationPath .
|
||||||
|
mkdir ./rustdesk/drivers
|
||||||
|
mv -Force .\rustdesk_printer_driver_v4 ./rustdesk/drivers/RustDeskPrinterDriver
|
||||||
|
Expand-Archive printer_driver_adapter.zip -DestinationPath .
|
||||||
|
mv -Force .\printer_driver_adapter.dll ./rustdesk
|
||||||
|
} elseif ($checksum_driver -ne $downloadsum_driver.Hash) {
|
||||||
|
Write-Output "rustdesk_printer_driver_v4, checksums do not match, ignore the file."
|
||||||
|
} else {
|
||||||
|
Write-Output "printer_driver_adapter.dll, checksums do not match, ignore the file."
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
Write-Host "Ingore the printer driver error."
|
||||||
|
}
|
||||||
|
|
||||||
- name: icon stuff
|
- name: icon stuff
|
||||||
if: ${{ inputs.iconlink != 'false' }}
|
if: ${{ inputs.iconlink != 'false' }}
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
@@ -483,20 +525,6 @@ jobs:
|
|||||||
name: topmostwindow-artifacts
|
name: topmostwindow-artifacts
|
||||||
path: "./rustdesk"
|
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
|
- name: Report Status
|
||||||
uses: fjogeleit/http-request-action@v1
|
uses: fjogeleit/http-request-action@v1
|
||||||
with:
|
with:
|
||||||
@@ -530,12 +558,14 @@ jobs:
|
|||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
Expand-Archive -Path ./rustdesk/signed_files.zip -DestinationPath ./rustdesk/ -Force
|
Expand-Archive -Path ./rustdesk/signed_files.zip -DestinationPath ./rustdesk/ -Force
|
||||||
|
Remove-Item ./rustdesk/unsigned_files.zip
|
||||||
|
Remove-Item ./rustdesk/signed_files.zip
|
||||||
|
|
||||||
|
|
||||||
- name: Create custom.txt file
|
- name: Create custom.txt file
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
echo -n "${{ env.CUSTOM }}" | cat > ./rustdesk/custom.txt
|
echo -n "${{ inputs.custom }}" | cat > ./rustdesk/custom.txt
|
||||||
|
|
||||||
|
|
||||||
- name: Build self-extracted executable
|
- name: Build self-extracted executable
|
||||||
@@ -568,12 +598,6 @@ jobs:
|
|||||||
mv ./Package/bin/x64/Release/en-us/Package.msi ../../SignOutput/rustdesk.msi
|
mv ./Package/bin/x64/Release/en-us/Package.msi ../../SignOutput/rustdesk.msi
|
||||||
sha256sum ../../SignOutput/rustdesk.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
|
- name: Report Status
|
||||||
uses: fjogeleit/http-request-action@v1
|
uses: fjogeleit/http-request-action@v1
|
||||||
with:
|
with:
|
||||||
@@ -607,27 +631,8 @@ jobs:
|
|||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
Expand-Archive -Path ./SignOutput/signed_files.zip -DestinationPath ./SignOutput/ -Force
|
Expand-Archive -Path ./SignOutput/signed_files.zip -DestinationPath ./SignOutput/ -Force
|
||||||
|
Remove-Item ./SignOutput/unsigned_files.zip
|
||||||
# - name: Sign rustdesk self-extracted file
|
Remove-Item ./SignOutput/signed_files.zip
|
||||||
# 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
|
- name: rename rustdesk.exe to filename.exe
|
||||||
run: |
|
run: |
|
||||||
@@ -638,15 +643,6 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
mv ./SignOutput/rustdesk.msi "./SignOutput/${{ inputs.filename }}.msi" || echo "rustdesk"
|
mv ./SignOutput/rustdesk.msi "./SignOutput/${{ inputs.filename }}.msi" || 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
|
- name: send file to rdgen server
|
||||||
if: ${{ fromJson(inputs.extras).rdgen == 'true' }}
|
if: ${{ fromJson(inputs.extras).rdgen == 'true' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|||||||
110
.github/workflows/pre137-bridge.yml
vendored
110
.github/workflows/pre137-bridge.yml
vendored
@@ -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
|
|
||||||
631
.github/workflows/pre137-generator-android.yml
vendored
631
.github/workflows/pre137-generator-android.yml
vendored
File diff suppressed because one or more lines are too long
643
.github/workflows/pre137-generator-linux.yml
vendored
643
.github/workflows/pre137-generator-linux.yml
vendored
File diff suppressed because one or more lines are too long
798
.github/workflows/pre137-generator-macos.yml
vendored
798
.github/workflows/pre137-generator-macos.yml
vendored
@@ -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|<key>CFBundleName</key>\s*<string>$(PRODUCT_NAME)</string>|<key>CFBundleName</key>\n\t<string>${{ inputs.appname }}</string>|' ./flutter/macos/Runner/Info.plist
|
|
||||||
sed -i '' -e 's|<key>CFBundleDisplayName</key>\s*<string>$(PRODUCT_NAME)</string>|<key>CFBundleDisplayName</key>\n\t<string>${{ inputs.appname }}</string>|' ./flutter/macos/Runner/Info.plist
|
|
||||||
sed -i '' -e 's|<key>CFBundleIdentifier</key>\s*<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>|<key>CFBundleIdentifier</key>\n\t<string>com.${{ inputs.appname }}.app</string>|' ./flutter/macos/Runner/Info.plist
|
|
||||||
|
|
||||||
# MACSTUFF Update copyright information if needed
|
|
||||||
sed -i '' -e 's|<key>NSHumanReadableCopyright</key>\s*<string>$(PRODUCT_COPYRIGHT)</string>|<key>NSHumanReadableCopyright</key>\n\t<string>${{ inputs.appname }}</string>|' ./flutter/macos/Runner/Info.plist
|
|
||||||
|
|
||||||
# MACSTUFF Update window title and bundle settings
|
|
||||||
cp ./flutter/macos/Runner/Configs/AppInfo.xcconfig ./flutter/macos/Runner/Configs/AppInfo.xcconfig.bak
|
|
||||||
sed -i '' -e 's|PRODUCT_NAME = .*|PRODUCT_NAME = ${{ inputs.appname }}|' ./flutter/macos/Runner/Configs/AppInfo.xcconfig
|
|
||||||
sed -i '' -e 's|PRODUCT_BUNDLE_IDENTIFIER = .*|PRODUCT_BUNDLE_IDENTIFIER = com.${{ inputs.appname }}.app|' ./flutter/macos/Runner/Configs/AppInfo.xcconfig
|
|
||||||
# Keep DEVELOPMENT_TEAM if it exists, don't blank it out
|
|
||||||
|
|
||||||
# Update Xcode project settings
|
|
||||||
sed -i '' -e 's/PRODUCT_NAME = "RustDesk"/PRODUCT_NAME = "${{ inputs.appname }}"/' ./flutter/macos/Runner.xcodeproj/project.pbxproj
|
|
||||||
sed -i '' -e 's/PRODUCT_BUNDLE_IDENTIFIER = ".*"/PRODUCT_BUNDLE_IDENTIFIER = "com.${{ inputs.appname }}.app"/' ./flutter/macos/Runner.xcodeproj/project.pbxproj
|
|
||||||
# Don't modify DEVELOPMENT_TEAM in project.pbxproj
|
|
||||||
|
|
||||||
# Update CMake settings
|
|
||||||
if [ -f "./flutter/macos/CMakeLists.txt" ]; then
|
|
||||||
sed -i '' -e 's/set(BINARY_NAME ".*")/set(BINARY_NAME "${{ inputs.appname }}")/' ./flutter/macos/CMakeLists.txt
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update Podfile - keep the target as 'Runner'
|
|
||||||
# sed -i '' -e 's/target '"'"'Runner'"'"' do/target '"'"'${{ inputs.appname }}'"'"' do/' ./flutter/macos/Podfile
|
|
||||||
sed -i '' -e 's/target '"'"'Runner'"'"' do/target '"'"'Runner'"'"' do/' ./flutter/macos/Podfile
|
|
||||||
|
|
||||||
cp ./src/lang/en.rs ./src/lang/en.rs.bak
|
|
||||||
cp ./src/lang/nl.rs ./src/lang/nl.rs.bak
|
|
||||||
sed -i '' -e 's|RustDesk|${{ inputs.appname }}|' ./src/lang/en.rs
|
|
||||||
sed -i '' -e 's|RustDesk|${{ inputs.appname }}|' ./src/lang/nl.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
|
|
||||||
|
|
||||||
# Update pubspec.yaml with proper YAML formatting
|
|
||||||
cp ./flutter/pubspec.yaml ./flutter/pubspec.yaml.bak
|
|
||||||
echo " archive: ^3.6.1" > ./flutter/temp_dependency.txt
|
|
||||||
awk '/intl:/{print;system("cat ./flutter/temp_dependency.txt");next}1' ./flutter/pubspec.yaml > ./flutter/pubspec.yaml.tmp
|
|
||||||
mv ./flutter/pubspec.yaml.tmp ./flutter/pubspec.yaml
|
|
||||||
rm ./flutter/temp_dependency.txt
|
|
||||||
|
|
||||||
- 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
|
|
||||||
with:
|
|
||||||
channel: "stable"
|
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
|
||||||
cache: true
|
|
||||||
|
|
||||||
- name: Patch flutter
|
|
||||||
continue-on-error: true
|
|
||||||
run: |
|
|
||||||
cp .github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff $(dirname $(dirname $(which flutter)))
|
|
||||||
cd $(dirname $(dirname $(which flutter)))
|
|
||||||
[[ "3.24.4" == 3.24.5 ]] && git apply flutter_3.24.4_dropdown_menu_enableFilter.diff
|
|
||||||
|
|
||||||
- name: Workaround for flutter issue
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
cd "$(dirname "$(which flutter)")"
|
|
||||||
# https://github.com/flutter/flutter/issues/1.3.43
|
|
||||||
sed -i -e 's/_setFramesEnabledState(false);/\/\/_setFramesEnabledState(false);/g' ../packages/flutter/lib/src/scheduler/binding.dart
|
|
||||||
grep -n '_setFramesEnabledState(false);' ../packages/flutter/lib/src/scheduler/binding.dart
|
|
||||||
|
|
||||||
- name: Install Rust toolchain
|
|
||||||
uses: dtolnay/rust-toolchain@v1
|
|
||||||
with:
|
|
||||||
toolchain: ${{ env.MAC_RUST_VERSION }}
|
|
||||||
targets: ${{ matrix.job.target }}
|
|
||||||
components: "rustfmt"
|
|
||||||
|
|
||||||
|
|
||||||
- uses: Swatinem/rust-cache@v2
|
|
||||||
with:
|
|
||||||
prefix-key: ${{ matrix.job.os }}
|
|
||||||
|
|
||||||
- name: Setup vcpkg with Github Actions binary cache
|
|
||||||
uses: lukka/run-vcpkg@v11
|
|
||||||
with:
|
|
||||||
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
|
|
||||||
doNotCache: false
|
|
||||||
|
|
||||||
- name: Install vcpkg dependencies
|
|
||||||
run: |
|
|
||||||
if ! $VCPKG_ROOT/vcpkg \
|
|
||||||
install \
|
|
||||||
--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: Magick stuff for macOS
|
|
||||||
if: ${{ inputs.iconlink != 'false' }}
|
|
||||||
continue-on-error: false
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
# Create all necessary directories first
|
|
||||||
mkdir -p ./res
|
|
||||||
mkdir -p ./flutter/assets
|
|
||||||
mkdir -p ./flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset
|
|
||||||
mkdir -p ./macos/Runner/Assets.xcassets/AppIcon.appiconset
|
|
||||||
mkdir -p ./rustdesk/data/flutter_assets/assets
|
|
||||||
|
|
||||||
# Download icon using curl with additional SSL options
|
|
||||||
curl -k -L --tlsv1.2 --proto =https --ssl-reqd \
|
|
||||||
-H "User-Agent: Mozilla/5.0" \
|
|
||||||
"${{ fromJson(inputs.iconlink).url }}/get_png?filename=${{ fromJson(inputs.iconlink).file }}&uuid=${{ fromJson(inputs.iconlink).uuid }}" \
|
|
||||||
-o ./res/icon.png || wget --no-check-certificate -O ./res/icon.png "${{ fromJson(inputs.iconlink).url }}/get_png?filename=${{ fromJson(inputs.iconlink).file }}&uuid=${{ fromJson(inputs.iconlink).uuid }}"
|
|
||||||
|
|
||||||
# Backup existing files (if they exist)
|
|
||||||
[ -f "./res/32x32.png" ] && mv ./res/32x32.png ./res/32x32.png.bak
|
|
||||||
[ -f "./res/64x64.png" ] && mv ./res/64x64.png ./res/64x64.png.bak
|
|
||||||
[ -f "./res/128x128.png" ] && mv ./res/128x128.png ./res/128x128.png.bak
|
|
||||||
[ -f "./res/mac-icon.png" ] && mv ./res/mac-icon.png ./res/mac-icon.png.bak
|
|
||||||
[ -f "./flutter/assets/icon.png" ] && mv ./flutter/assets/icon.png ./flutter/assets/icon.png.bak
|
|
||||||
[ -f "./flutter/assets/icon.svg" ] && mv ./flutter/assets/icon.svg ./flutter/assets/icon.svg.bak
|
|
||||||
[ -f "./rustdesk/data/flutter_assets/assets/icon.svg" ] && mv ./rustdesk/data/flutter_assets/assets/icon.svg ./rustdesk/data/flutter_assets/assets/icon.svg.bak
|
|
||||||
|
|
||||||
# Create standard app icons
|
|
||||||
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
|
|
||||||
|
|
||||||
# Copy icon to Flutter assets
|
|
||||||
cp ./res/icon.png ./flutter/assets/icon.png
|
|
||||||
cp ./res/icon.png ./rustdesk/data/flutter_assets/assets/icon.png
|
|
||||||
|
|
||||||
# Convert PNG to SVG using potrace
|
|
||||||
magick ./res/icon.png -flatten ./temp_icon.pbm
|
|
||||||
potrace --svg -o ./flutter/assets/icon.svg ./temp_icon.pbm
|
|
||||||
cp ./flutter/assets/icon.svg ./rustdesk/data/flutter_assets/assets/icon.svg
|
|
||||||
rm ./temp_icon.pbm
|
|
||||||
|
|
||||||
# Create macOS app icons
|
|
||||||
magick ./res/icon.png -resize 16x16 "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png"
|
|
||||||
magick ./res/icon.png -resize 32x32 "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png"
|
|
||||||
magick ./res/icon.png -resize 64x64 "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png"
|
|
||||||
magick ./res/icon.png -resize 128x128 "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png"
|
|
||||||
magick ./res/icon.png -resize 256x256 "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png"
|
|
||||||
magick ./res/icon.png -resize 512x512 "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png"
|
|
||||||
magick ./res/icon.png -resize 1024x1024 "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png"
|
|
||||||
|
|
||||||
# Create macOS specific icons
|
|
||||||
magick ./res/icon.png -resize 128x128 ./res/mac-icon.png
|
|
||||||
|
|
||||||
# Create dark mode tray icon (optimized for macOS menu bar)
|
|
||||||
magick ./res/icon.png -resize 22x22 -colorspace gray -alpha set -background none -channel A -evaluate set 100% ./res/mac-tray-dark-x2.png
|
|
||||||
|
|
||||||
# Create light mode tray icon (optimized for macOS menu bar)
|
|
||||||
magick ./res/icon.png -resize 22x22 -negate -colorspace gray -alpha set -background none -channel A -evaluate set 100% ./res/mac-tray-light-x2.png
|
|
||||||
|
|
||||||
# Create AppIcon.icns (macOS native icon format)
|
|
||||||
mkdir -p ./iconset.iconset
|
|
||||||
cp "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png" "./iconset.iconset/icon_16x16.png"
|
|
||||||
cp "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png" "./iconset.iconset/icon_16x16@2x.png"
|
|
||||||
cp "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png" "./iconset.iconset/icon_32x32.png"
|
|
||||||
cp "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png" "./iconset.iconset/icon_32x32@2x.png"
|
|
||||||
cp "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png" "./iconset.iconset/icon_128x128.png"
|
|
||||||
cp "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png" "./iconset.iconset/icon_128x128@2x.png"
|
|
||||||
cp "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png" "./iconset.iconset/icon_256x256.png"
|
|
||||||
cp "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png" "./iconset.iconset/icon_256x256@2x.png"
|
|
||||||
cp "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png" "./iconset.iconset/icon_512x512.png"
|
|
||||||
cp "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png" "./iconset.iconset/icon_512x512@2x.png"
|
|
||||||
iconutil -c icns ./iconset.iconset -o ./flutter/macos/Runner/AppIcon.icns
|
|
||||||
rm -rf ./iconset.iconset
|
|
||||||
|
|
||||||
# Create Contents.json for macOS app icon
|
|
||||||
echo '{
|
|
||||||
"images": [
|
|
||||||
{"size":"16x16","idiom":"mac","filename":"app_icon_16.png","scale":"1x"},
|
|
||||||
{"size":"16x16","idiom":"mac","filename":"app_icon_32.png","scale":"2x"},
|
|
||||||
{"size":"32x32","idiom":"mac","filename":"app_icon_32.png","scale":"1x"},
|
|
||||||
{"size":"32x32","idiom":"mac","filename":"app_icon_64.png","scale":"2x"},
|
|
||||||
{"size":"128x128","idiom":"mac","filename":"app_icon_128.png","scale":"1x"},
|
|
||||||
{"size":"128x128","idiom":"mac","filename":"app_icon_256.png","scale":"2x"},
|
|
||||||
{"size":"256x256","idiom":"mac","filename":"app_icon_256.png","scale":"1x"},
|
|
||||||
{"size":"256x256","idiom":"mac","filename":"app_icon_512.png","scale":"2x"},
|
|
||||||
{"size":"512x512","idiom":"mac","filename":"app_icon_512.png","scale":"1x"},
|
|
||||||
{"size":"512x512","idiom":"mac","filename":"app_icon_1024.png","scale":"2x"}
|
|
||||||
],
|
|
||||||
"info": {
|
|
||||||
"version": 1,
|
|
||||||
"author": "xcode"
|
|
||||||
}
|
|
||||||
}' > "flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json"
|
|
||||||
|
|
||||||
# Copy icons and Contents.json to both locations
|
|
||||||
cp -r flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/* macos/Runner/Assets.xcassets/AppIcon.appiconset/
|
|
||||||
|
|
||||||
# Verify files exist and show their sizes
|
|
||||||
echo "Verifying generated files:"
|
|
||||||
ls -lh ./res/mac-tray-dark-x2.png
|
|
||||||
ls -lh ./res/mac-tray-light-x2.png
|
|
||||||
ls -lh ./res/mac-icon.png
|
|
||||||
echo "Flutter macOS app icons:"
|
|
||||||
ls -lh flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/
|
|
||||||
echo "Flutter assets:"
|
|
||||||
ls -lh flutter/assets/icon.*
|
|
||||||
echo "RustDesk Flutter assets:"
|
|
||||||
ls -lh rustdesk/data/flutter_assets/assets/
|
|
||||||
|
|
||||||
- name: replace flutter icons
|
|
||||||
if: ${{ inputs.iconlink != 'false' }}
|
|
||||||
continue-on-error: false
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
cd ./flutter
|
|
||||||
# Create required directories and files
|
|
||||||
mkdir -p web
|
|
||||||
mkdir -p assets
|
|
||||||
echo '{"name":"${{ inputs.appname }}","short_name":"${{ inputs.appname }}","start_url":"/","display":"standalone","background_color":"#ffffff","theme_color":"#ffffff","description":"A remote desktop software."}' > web/manifest.json
|
|
||||||
echo '<!DOCTYPE html><html><head><meta charset="UTF-8"><title>${{ inputs.appname }}</title></head><body></body></html>' > web/index.html
|
|
||||||
|
|
||||||
# Ensure the AppIcon.appiconset directory exists
|
|
||||||
mkdir -p macos/Runner/Assets.xcassets/AppIcon.appiconset
|
|
||||||
|
|
||||||
# Copy the processed icons to Flutter locations
|
|
||||||
cp ../res/mac-icon.png ./assets/icon.png
|
|
||||||
cp ../flutter/assets/icon.svg ./assets/icon.svg || true
|
|
||||||
|
|
||||||
flutter pub upgrade win32
|
|
||||||
flutter pub get
|
|
||||||
flutter pub run flutter_launcher_icons
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
- name: ui.rs
|
|
||||||
if: ${{ inputs.iconlink != 'false' }}
|
|
||||||
continue-on-error: true
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
cp ./src/ui.rs ./src/ui.rs.bak
|
|
||||||
if [ -f "./res/icon.png" ]; then
|
|
||||||
SEARCH_STR="iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAEiuAABIrgHwmhA7AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAEx9JREFUeJztnXmYHMV5h9"
|
|
||||||
b64=$(base64 < ./res/icon.png)
|
|
||||||
sed -i '' -e "s~$SEARCH_STR.*\"~$b64\"~" ./src/ui.rs
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: fix connection delay
|
|
||||||
continue-on-error: false
|
|
||||||
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: Install Rust toolchain
|
|
||||||
uses: dtolnay/rust-toolchain@v1
|
|
||||||
with:
|
|
||||||
toolchain: ${{ env.MAC_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: 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:
|
|
||||||
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
|
|
||||||
doNotCache: false
|
|
||||||
|
|
||||||
- name: Install vcpkg dependencies
|
|
||||||
run: |
|
|
||||||
if ! $VCPKG_ROOT/vcpkg \
|
|
||||||
install \
|
|
||||||
--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
|
|
||||||
|
|
||||||
- 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: Build rustdesk
|
|
||||||
run: |
|
|
||||||
if [ "${{ matrix.job.target }}" = "aarch64-apple-darwin" ]; then
|
|
||||||
MIN_MACOS_VERSION="12.3"
|
|
||||||
sed -i -e "s/MACOSX_DEPLOYMENT_TARGET\=[0-9]*.[0-9]*/MACOSX_DEPLOYMENT_TARGET=${MIN_MACOS_VERSION}/" build.py
|
|
||||||
sed -i -e "s/platform :osx, '.*'/platform :osx, '${MIN_MACOS_VERSION}'/" flutter/macos/Podfile
|
|
||||||
sed -i -e "s/osx_minimum_system_version = \"[0-9]*.[0-9]*\"/osx_minimum_system_version = \"${MIN_MACOS_VERSION}\"/" Cargo.toml
|
|
||||||
sed -i -e "s/MACOSX_DEPLOYMENT_TARGET = [0-9]*.[0-9]*;/MACOSX_DEPLOYMENT_TARGET = ${MIN_MACOS_VERSION};/" flutter/macos/Runner.xcodeproj/project.pbxproj
|
|
||||||
fi
|
|
||||||
sed -i -e "s/RustDesk.app/\"${{ inputs.appname }}.app\"/" build.py
|
|
||||||
./build.py --flutter --hwcodec ${{ matrix.job.extra-build-args }}
|
|
||||||
|
|
||||||
- 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: Install rcodesign tool
|
|
||||||
if: env.MACOS_P12_BASE64 != null
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
pushd /tmp
|
|
||||||
wget https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign%2F0.22.0/apple-codesign-0.22.0-macos-universal.tar.gz
|
|
||||||
tar -zxvf apple-codesign-0.22.0-macos-universal.tar.gz
|
|
||||||
mv apple-codesign-0.22.0-macos-universal/rcodesign /usr/local/bin
|
|
||||||
popd
|
|
||||||
|
|
||||||
- name: Install build runtime
|
|
||||||
run: |
|
|
||||||
brew install llvm create-dmg nasm cmake gcc wget ninja
|
|
||||||
# pkg-config is handled in a separate step, because it may be already installed by `macos-latest`(14.7.1) runner
|
|
||||||
if command -v pkg-config &>/dev/null; then
|
|
||||||
echo "pkg-config is already installed"
|
|
||||||
else
|
|
||||||
brew install pkg-config
|
|
||||||
fi
|
|
||||||
|
|
||||||
- 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: Show version information (Rust, cargo, Clang)
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
clang --version || true
|
|
||||||
rustup -V
|
|
||||||
rustup toolchain list
|
|
||||||
rustup default
|
|
||||||
cargo -V
|
|
||||||
rustc -V
|
|
||||||
|
|
||||||
- name: icon svg handling
|
|
||||||
if: ${{ inputs.iconlink != 'false' }}
|
|
||||||
continue-on-error: false
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
ASSETS_DIR="build/macos/Build/Products/Release/RustDesk.app/Contents/Frameworks/App.framework/Versions/Current/Resources/flutter_assets/assets"
|
|
||||||
mkdir -p "$ASSETS_DIR"
|
|
||||||
if [ -f "$ASSETS_DIR/icon.svg" ]; then
|
|
||||||
mv "$ASSETS_DIR/icon.svg" "$ASSETS_DIR/icon.svg.bak"
|
|
||||||
fi
|
|
||||||
# First convert PNG to PBM (bitmap)
|
|
||||||
magick convert ./res/icon.png ./temp_icon.pbm
|
|
||||||
# Then use potrace to convert to SVG
|
|
||||||
potrace --svg -o "$ASSETS_DIR/icon.svg" ./temp_icon.pbm
|
|
||||||
rm ./temp_icon.pbm
|
|
||||||
|
|
||||||
- name: logo handling
|
|
||||||
if: ${{ inputs.logolink != 'false' }}
|
|
||||||
continue-on-error: false
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
ASSETS_DIR="build/macos/Build/Products/Release/RustDesk.app/Contents/Frameworks/App.framework/Versions/Current/Resources/flutter_assets/assets"
|
|
||||||
mkdir -p "$ASSETS_DIR"
|
|
||||||
curl -k -L --tlsv1.2 --proto =https --ssl-reqd \
|
|
||||||
-H "User-Agent: Mozilla/5.0" \
|
|
||||||
"${{ fromJson(inputs.logolink).url }}/get_png?filename=${{ fromJson(inputs.logolink).file }}&uuid=${{ fromJson(inputs.logolink).uuid }}" \
|
|
||||||
-o "$ASSETS_DIR/logo.png" || \
|
|
||||||
wget --no-check-certificate \
|
|
||||||
-O "$ASSETS_DIR/logo.png" \
|
|
||||||
"${{ fromJson(inputs.logolink).url }}/get_png?filename=${{ fromJson(inputs.logolink).file }}&uuid=${{ fromJson(inputs.logolink).uuid }}"
|
|
||||||
|
|
||||||
- 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 macOS app bundle
|
|
||||||
if: env.MACOS_P12_BASE64 != ''
|
|
||||||
run: |
|
|
||||||
cd flutter/build/macos/Build/Products/Release
|
|
||||||
# Debug info
|
|
||||||
echo "Current directory contents:"
|
|
||||||
ls -la
|
|
||||||
|
|
||||||
# Rename RustDesk.app to the custom app name first
|
|
||||||
if [ -d "RustDesk.app" ]; then
|
|
||||||
# First rename the app if it's still called RustDesk.app
|
|
||||||
mv "RustDesk.app" "${{ inputs.appname }}.app"
|
|
||||||
echo "Renamed RustDesk.app to ${{ inputs.appname }}.app"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "App bundle contents after rename:"
|
|
||||||
ls -la "${{ inputs.appname }}.app" || echo "App not found"
|
|
||||||
ls -la "${{ inputs.appname }}.app/Contents" || echo "Contents not found"
|
|
||||||
|
|
||||||
# Decode the certificate
|
|
||||||
echo "${{ secrets.MACOS_P12_BASE64 }}" | base64 --decode > certificate.p12
|
|
||||||
|
|
||||||
# Sign the app bundle and its contents
|
|
||||||
if [ -d "${{ inputs.appname }}.app/Contents/MacOS" ]; then
|
|
||||||
echo "Signing main executable..."
|
|
||||||
MAIN_EXECUTABLE="${{ inputs.appname }}.app/Contents/MacOS/${{ inputs.appname }}"
|
|
||||||
if [ -f "$MAIN_EXECUTABLE" ]; then
|
|
||||||
rcodesign sign --p12-file certificate.p12 --p12-password "${{ secrets.MACOS_P12_PASSWORD }}" \
|
|
||||||
--code-signature-flags runtime "$MAIN_EXECUTABLE"
|
|
||||||
else
|
|
||||||
echo "Main executable not found at expected path: $MAIN_EXECUTABLE"
|
|
||||||
# Try to find the actual executable
|
|
||||||
echo "Available executables in MacOS directory:"
|
|
||||||
ls -la "${{ inputs.appname }}.app/Contents/MacOS/"
|
|
||||||
ACTUAL_EXECUTABLE=$(ls "${{ inputs.appname }}.app/Contents/MacOS/" | head -n 1)
|
|
||||||
if [ -n "$ACTUAL_EXECUTABLE" ]; then
|
|
||||||
echo "Found executable: $ACTUAL_EXECUTABLE"
|
|
||||||
rcodesign sign --p12-file certificate.p12 --p12-password "${{ secrets.MACOS_P12_PASSWORD }}" \
|
|
||||||
--code-signature-flags runtime "${{ inputs.appname }}.app/Contents/MacOS/$ACTUAL_EXECUTABLE"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Signing frameworks..."
|
|
||||||
find "${{ inputs.appname }}.app/Contents/Frameworks" -type f -not -name ".*" -exec \
|
|
||||||
rcodesign sign --p12-file certificate.p12 --p12-password "${{ secrets.MACOS_P12_PASSWORD }}" \
|
|
||||||
--code-signature-flags runtime {} \;
|
|
||||||
|
|
||||||
echo "Signing main bundle..."
|
|
||||||
rcodesign sign --p12-file certificate.p12 --p12-password "${{ secrets.MACOS_P12_PASSWORD }}" \
|
|
||||||
--code-signature-flags runtime "${{ inputs.appname }}.app"
|
|
||||||
else
|
|
||||||
echo "Error: Invalid app bundle structure"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Clean up
|
|
||||||
rm certificate.p12
|
|
||||||
|
|
||||||
- name: Create DMG
|
|
||||||
run: |
|
|
||||||
cd /Users/runner/work/${{ github.event.repository.name }}/${{ github.event.repository.name }}/flutter/build/macos/Build/Products/Release
|
|
||||||
# Print directory contents for debugging
|
|
||||||
echo "Directory contents:"
|
|
||||||
ls -la
|
|
||||||
# Find the actual .app bundle
|
|
||||||
if [ -d "RustDesk.app" ]; then
|
|
||||||
# First rename the app if it's still called RustDesk.app
|
|
||||||
mv "RustDesk.app" "${{ inputs.appname }}.app"
|
|
||||||
fi
|
|
||||||
if [ ! -d "${{ inputs.appname }}.app" ]; then
|
|
||||||
echo "Could not find .app bundle!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "Creating DMG for ${{ inputs.appname }}.app"
|
|
||||||
create-dmg \
|
|
||||||
--volname "${{ inputs.appname }}" \
|
|
||||||
--window-pos 200 120 \
|
|
||||||
--window-size 800 400 \
|
|
||||||
--icon-size 100 \
|
|
||||||
--icon "${{ inputs.appname }}.app" 200 190 \
|
|
||||||
--hide-extension "${{ inputs.appname }}.app" \
|
|
||||||
--app-drop-link 600 185 \
|
|
||||||
"${{ inputs.appname }}-${{ matrix.job.arch }}.dmg" \
|
|
||||||
"${{ inputs.appname }}.app"
|
|
||||||
mv "${{ inputs.appname }}-${{ matrix.job.arch }}.dmg" $GITHUB_WORKSPACE/
|
|
||||||
|
|
||||||
#- name: Upload unsigned macOS app
|
|
||||||
# if: env.UPLOAD_ARTIFACT == 'true'
|
|
||||||
# uses: actions/upload-artifact@master
|
|
||||||
# with:
|
|
||||||
# name: ${{ inputs.appname }}-${{ matrix.job.arch }}
|
|
||||||
# path: ${{ inputs.appname }}-${{ matrix.job.arch }}.dmg
|
|
||||||
|
|
||||||
|
|
||||||
- name: Rename rustdesk
|
|
||||||
if: env.UPLOAD_ARTIFACT == 'true'
|
|
||||||
run: |
|
|
||||||
cd $GITHUB_WORKSPACE
|
|
||||||
echo "Directory contents:"
|
|
||||||
ls -la
|
|
||||||
|
|
||||||
# Find the DMG file dynamically
|
|
||||||
DMG_FILE=$(find . -name "${{ inputs.appname }}-${{ matrix.job.arch }}.dmg")
|
|
||||||
|
|
||||||
if [ -n "$DMG_FILE" ]; then
|
|
||||||
echo "Found DMG file: $DMG_FILE"
|
|
||||||
mv "$DMG_FILE" "${{ inputs.filename }}.dmg"
|
|
||||||
echo "Renamed to ${{ inputs.filename }}.dmg"
|
|
||||||
else
|
|
||||||
echo "No DMG file found matching the pattern"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- 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=@$GITHUB_WORKSPACE/${{ inputs.filename }}.dmg" \
|
|
||||||
-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=@$GITHUB_WORKSPACE/${{ inputs.filename }}.dmg" \
|
|
||||||
"${{ 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"}'
|
|
||||||
|
|
||||||
#- 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
|
|
||||||
675
.github/workflows/pre137-generator-windows.yml
vendored
675
.github/workflows/pre137-generator-windows.yml
vendored
File diff suppressed because one or more lines are too long
@@ -1,9 +1,11 @@
|
|||||||
from django import forms
|
from django import forms
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
class GenerateForm(forms.Form):
|
class GenerateForm(forms.Form):
|
||||||
#Platform
|
#Platform
|
||||||
platform = forms.ChoiceField(choices=[('windows','Windows'),('linux','Linux (currently unavailable)'),('android','Android'),('macos','macOS')], initial='windows')
|
platform = forms.ChoiceField(choices=[('windows','Windows'),('linux','Linux (currently unavailable)'),('android','Android'),('macos','macOS')], initial='windows')
|
||||||
version = forms.ChoiceField(choices=[('master','nightly'),('1.3.7','1.3.7'),('1.3.6','1.3.6'),('1.3.5','1.3.5'),('1.3.4','1.3.4'),('1.3.3','1.3.3')], initial='1.3.7')
|
version = forms.ChoiceField(choices=[('master','nightly'),('1.3.9','1.3.9'),('1.3.8','1.3.8'),('1.3.7','1.3.7'),('1.3.6','1.3.6'),('1.3.5','1.3.5'),('1.3.4','1.3.4'),('1.3.3','1.3.3')], initial='1.3.9')
|
||||||
|
help_text="'master' is the development version (nightly build) with the latest features but may be less stable"
|
||||||
delayFix = forms.BooleanField(initial=True, required=False)
|
delayFix = forms.BooleanField(initial=True, required=False)
|
||||||
|
|
||||||
#General
|
#General
|
||||||
@@ -29,6 +31,7 @@ class GenerateForm(forms.Form):
|
|||||||
key = forms.CharField(label="Key", required=False)
|
key = forms.CharField(label="Key", required=False)
|
||||||
urlLink = forms.CharField(label="Custom URL for links", required=False)
|
urlLink = forms.CharField(label="Custom URL for links", required=False)
|
||||||
downloadLink = forms.CharField(label="Custom URL for downloading new versions", required=False)
|
downloadLink = forms.CharField(label="Custom URL for downloading new versions", required=False)
|
||||||
|
compname = forms.CharField(label="Company name",required=False)
|
||||||
|
|
||||||
#Visual
|
#Visual
|
||||||
iconfile = forms.FileField(label="Custom App Icon (in .png format)", required=False, widget=forms.FileInput(attrs={'accept': 'image/png'}))
|
iconfile = forms.FileField(label="Custom App Icon (in .png format)", required=False, widget=forms.FileInput(attrs={'accept': 'image/png'}))
|
||||||
@@ -74,5 +77,29 @@ class GenerateForm(forms.Form):
|
|||||||
cycleMonitor = forms.BooleanField(initial=False, required=False)
|
cycleMonitor = forms.BooleanField(initial=False, required=False)
|
||||||
xOffline = forms.BooleanField(initial=False, required=False)
|
xOffline = forms.BooleanField(initial=False, required=False)
|
||||||
hidecm = forms.BooleanField(initial=False, required=False)
|
hidecm = forms.BooleanField(initial=False, required=False)
|
||||||
statussort = forms.BooleanField(initial=False, required=False)
|
|
||||||
removeNewVersionNotif = forms.BooleanField(initial=False, required=False)
|
removeNewVersionNotif = forms.BooleanField(initial=False, required=False)
|
||||||
|
|
||||||
|
def clean_iconfile(self):
|
||||||
|
print("checking icon")
|
||||||
|
image = self.cleaned_data['iconfile']
|
||||||
|
if image:
|
||||||
|
try:
|
||||||
|
# Open the image using Pillow
|
||||||
|
img = Image.open(image)
|
||||||
|
|
||||||
|
# Check if the image is a PNG (optional, but good practice)
|
||||||
|
if img.format != 'PNG':
|
||||||
|
raise forms.ValidationError("Only PNG images are allowed.")
|
||||||
|
|
||||||
|
# Get image dimensions
|
||||||
|
width, height = img.size
|
||||||
|
|
||||||
|
# Check for square dimensions
|
||||||
|
if width != height:
|
||||||
|
raise forms.ValidationError("Custom App Icon dimensions must be square.")
|
||||||
|
|
||||||
|
return image
|
||||||
|
except OSError: # Handle cases where the uploaded file is not a valid image
|
||||||
|
raise forms.ValidationError("Invalid icon file.")
|
||||||
|
except Exception as e: # Catch any other image processing errors
|
||||||
|
raise forms.ValidationError(f"Error processing icon: {e}")
|
||||||
|
|||||||
@@ -130,15 +130,21 @@
|
|||||||
<a href='/download?filename={{filename}}.exe&uuid={{uuid}}' class="download-link">Download {{filename}}.exe</a>
|
<a href='/download?filename={{filename}}.exe&uuid={{uuid}}' class="download-link">Download {{filename}}.exe</a>
|
||||||
<a href='/download?filename={{filename}}.msi&uuid={{uuid}}' class="download-link">Download {{filename}}.msi</a>
|
<a href='/download?filename={{filename}}.msi&uuid={{uuid}}' class="download-link">Download {{filename}}.msi</a>
|
||||||
{% elif platform == 'linux' %}
|
{% elif platform == 'linux' %}
|
||||||
<a href='/download?filename={{filename}}.deb&uuid={{uuid}}' class="download-link">Download {{filename}}.deb</a>
|
<a href='/download?filename={{filename}}-x86_64.deb&uuid={{uuid}}' class="download-link">Download {{filename}}-x86_64.deb</a>
|
||||||
<a href='/download?filename={{filename}}.rpm&uuid={{uuid}}' class="download-link">Download {{filename}}.rpm</a>
|
<a href='/download?filename={{filename}}-x86_64.rpm&uuid={{uuid}}' class="download-link">Download {{filename}}-x86_64.rpm</a>
|
||||||
<a href='/download?filename={{filename}}-suse.rpm&uuid={{uuid}}' class="download-link">Download {{filename}}-suse.rpm</a>
|
<a href='/download?filename={{filename}}-suse-x86_64.rpm&uuid={{uuid}}' class="download-link">Download {{filename}}-suse-x86_64.rpm</a>
|
||||||
|
<a href='/download?filename={{filename}}-x86_64.pkg.tar.zst&uuid={{uuid}}' class="download-link">Download {{filename}}-x86_64.pkg.tar.zst</a>
|
||||||
|
<a href='/download?filename={{filename}}-aarch64.deb&uuid={{uuid}}' class="download-link">Download {{filename}}-aarch64.deb</a>
|
||||||
|
<a href='/download?filename={{filename}}-aarch64.rpm&uuid={{uuid}}' class="download-link">Download {{filename}}-aarch64.rpm</a>
|
||||||
|
<a href='/download?filename={{filename}}-suse-aarch64.rpm&uuid={{uuid}}' class="download-link">Download {{filename}}-suse-aarch64.rpm</a>
|
||||||
|
<a href='/download?filename={{filename}}-aarch64.pkg.tar.zst&uuid={{uuid}}' class="download-link">Download {{filename}}-aarch64.pkg.tar.zst</a>
|
||||||
{% elif platform == 'android' %}
|
{% elif platform == 'android' %}
|
||||||
<a href='/download?filename={{filename}}-aarch64.apk&uuid={{uuid}}' class="download-link">Download {{filename}}-aarch64.apk</a>
|
<a href='/download?filename={{filename}}-aarch64.apk&uuid={{uuid}}' class="download-link">Download {{filename}}-aarch64.apk</a>
|
||||||
<a href='/download?filename={{filename}}-x86_64.apk&uuid={{uuid}}' class="download-link">Download {{filename}}-x86_64.apk</a>
|
<a href='/download?filename={{filename}}-x86_64.apk&uuid={{uuid}}' class="download-link">Download {{filename}}-x86_64.apk</a>
|
||||||
<a href='/download?filename={{filename}}-armv7.apk&uuid={{uuid}}' class="download-link">Download {{filename}}-armv7.apk</a>
|
<a href='/download?filename={{filename}}-armv7.apk&uuid={{uuid}}' class="download-link">Download {{filename}}-armv7.apk</a>
|
||||||
{% elif platform == 'macos' %}
|
{% elif platform == 'macos' %}
|
||||||
<a href='/download?filename={{filename}}.dmg&uuid={{uuid}}' class="download-link">Download {{filename}}.dmg</a>
|
<a href='/download?filename={{filename}}-x86_64.dmg&uuid={{uuid}}' class="download-link">Download {{filename}}-x86_64.dmg</a>
|
||||||
|
<a href='/download?filename={{filename}}-aarch64.dmg&uuid={{uuid}}' class="download-link">Download {{filename}}-aarch64.dmg</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<p>Error: No file generated</p>
|
<p>Error: No file generated</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -122,6 +122,34 @@
|
|||||||
.error {
|
.error {
|
||||||
color: red;
|
color: red;
|
||||||
}
|
}
|
||||||
|
.errorlist {
|
||||||
|
color: red;
|
||||||
|
display: flex; /* Enable flexbox for centering */
|
||||||
|
justify-content: center; /* Center horizontally */
|
||||||
|
align-items: center; /* Center vertically (if needed) */
|
||||||
|
list-style: none; /* Remove bullet points if it's a list */
|
||||||
|
padding: 0; /* Remove default padding */
|
||||||
|
margin: 10px auto; /* Center the list itself, add some top/bottom margin */
|
||||||
|
width: fit-content; /* Make the width fit the content */
|
||||||
|
}
|
||||||
|
|
||||||
|
.errorlist li {
|
||||||
|
margin: 5px; /* Add some spacing between list items */
|
||||||
|
}
|
||||||
|
@keyframes blink {
|
||||||
|
0% { opacity: 1; }
|
||||||
|
50% { opacity: 0.5; }
|
||||||
|
100% { opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.help-text {
|
||||||
|
color: #ffd700;
|
||||||
|
font-style: italic;
|
||||||
|
animation: blink 2s infinite;
|
||||||
|
padding: 5px;
|
||||||
|
border-radius: 4px;
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: 10px;
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@@ -137,6 +165,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% if form.iconfile.errors %}
|
||||||
|
<ul class="errorlist">
|
||||||
|
{% for error in form.iconfile.errors %}
|
||||||
|
<li>{{ error }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
<div class="platform">
|
<div class="platform">
|
||||||
<h2><i class="fas fa-desktop"></i> Select Platform</h2>
|
<h2><i class="fas fa-desktop"></i> Select Platform</h2>
|
||||||
<div class="platform-icons">
|
<div class="platform-icons">
|
||||||
@@ -153,6 +188,10 @@
|
|||||||
</select>
|
</select>
|
||||||
<label for="{{ form.version.id_for_label }}">Rustdesk Version:</label>
|
<label for="{{ form.version.id_for_label }}">Rustdesk Version:</label>
|
||||||
{{ form.version }}
|
{{ form.version }}
|
||||||
|
{% if form.version.help_text %}
|
||||||
|
<span class="help-text">{{ form.version.help_text }}</span>
|
||||||
|
{% endif %}
|
||||||
|
<div class="help-text">{{ form.version.help_text }}</div>
|
||||||
<label for="{{ form.delayFix.id_for_label }}">{{ form.delayFix }} Fix connection delay when using third-party API</label>
|
<label for="{{ form.delayFix.id_for_label }}">{{ form.delayFix }} Fix connection delay when using third-party API</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -183,6 +222,8 @@
|
|||||||
{{ form.urlLink }}<br><br>
|
{{ form.urlLink }}<br><br>
|
||||||
<label for="{{ form.downloadLink.id_for_label }}">Custom URL for downloading updates (replaces https://rustdesk.com/download):</label>
|
<label for="{{ form.downloadLink.id_for_label }}">Custom URL for downloading updates (replaces https://rustdesk.com/download):</label>
|
||||||
{{ form.downloadLink }}<br><br>
|
{{ form.downloadLink }}<br><br>
|
||||||
|
<label for="{{ form.compname.id_for_label }}">Company name for copyright (replaces Purslane Ltd):</label>
|
||||||
|
{{ form.compname }}<br><br>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
@@ -241,7 +282,6 @@
|
|||||||
<label for="{{ form.cycleMonitor.id_for_label }}">{{ form.cycleMonitor }} Add a button to cycle through available monitors to the minimized toolbar.</label><br>
|
<label for="{{ form.cycleMonitor.id_for_label }}">{{ form.cycleMonitor }} Add a button to cycle through available monitors to the minimized toolbar.</label><br>
|
||||||
<label for="{{ form.xOffline.id_for_label }}">{{ form.xOffline }} Display an X for offline devices in the addressbook.</label><br>
|
<label for="{{ form.xOffline.id_for_label }}">{{ form.xOffline }} Display an X for offline devices in the addressbook.</label><br>
|
||||||
<label for="{{ form.hidecm.id_for_label }}">{{ form.hidecm }} Allow hiding the connection window from remote screen.</label><br>
|
<label for="{{ form.hidecm.id_for_label }}">{{ form.hidecm }} Allow hiding the connection window from remote screen.</label><br>
|
||||||
<label for="{{ form.statussort.id_for_label }}">{{ form.statussort }} Allow sorting by online status.</label><br>
|
|
||||||
<label for="{{ form.removeNewVersionNotif.id_for_label }}">{{ form.removeNewVersionNotif }} Remove notification for new versions.</label><br>
|
<label for="{{ form.removeNewVersionNotif.id_for_label }}">{{ form.removeNewVersionNotif }} Remove notification for new versions.</label><br>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -398,24 +438,33 @@
|
|||||||
try {
|
try {
|
||||||
const formData = JSON.parse(e.target.result);
|
const formData = JSON.parse(e.target.result);
|
||||||
for (const key in formData) {
|
for (const key in formData) {
|
||||||
const element = document.querySelector(`[name="${key}"]`);
|
// More robust selector: checks for name OR id
|
||||||
|
const elements = document.querySelectorAll(`[name="${key}"], [id="${key}"]`);
|
||||||
|
|
||||||
if (element) { // Check if the element exists
|
if (elements.length > 0) { // Check if any element(s) exist
|
||||||
if (element.type === 'checkbox' || element.type === 'radio') {
|
elements.forEach(element => { // Loop through all matching elements (important for radios)
|
||||||
element.checked = formData[key]; // Set checked property
|
if (element.type === 'radio') {
|
||||||
} else if (element.type !== 'file') { //for other elements
|
if (element.value === String(formData[key])) { // Compare value, crucial for radios
|
||||||
|
element.checked = true;
|
||||||
|
} else {
|
||||||
|
element.checked = false; // Uncheck others in the group
|
||||||
|
}
|
||||||
|
} else if (element.type === 'checkbox') {
|
||||||
|
element.checked = formData[key];
|
||||||
|
} else if (element.type !== 'file') {
|
||||||
element.value = formData[key];
|
element.value = formData[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle image previews (as before)
|
// Handle image previews (as before)
|
||||||
if (key === 'iconfile' && formData[key]) {
|
if (key === 'iconfile' && formData[key]) {
|
||||||
document.getElementById('id_iconbase64').value = formData[key]
|
document.getElementById('id_iconbase64').value = formData[key];
|
||||||
document.getElementById('icon-preview').innerHTML = `<img src="${formData[key]}" style="max-width: 300px; max-height: 60px;">`;
|
document.getElementById('icon-preview').innerHTML = `<img src="${formData[key]}" style="max-width: 300px; max-height: 60px;">`;
|
||||||
}
|
}
|
||||||
if (key === 'logofile' && formData[key]) {
|
if (key === 'logofile' && formData[key]) {
|
||||||
document.getElementById('id_logobase64').value = formData[key]
|
document.getElementById('id_logobase64').value = formData[key];
|
||||||
document.getElementById('logo-preview').innerHTML = `<img src="${formData[key]}" style="max-width: 300px; max-height: 60px;">`;
|
document.getElementById('logo-preview').innerHTML = `<img src="${formData[key]}" style="max-width: 300px; max-height: 60px;">`;
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
60
rdgenerator/templates/maintenance.html
Normal file
60
rdgenerator/templates/maintenance.html
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Rustdesk Client Generator</title>
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
background-color: #fff;
|
||||||
|
background: radial-gradient(circle at center, #fff 0%, #f8f8f8 75%, #ebebeb 100%);
|
||||||
|
color: #222;
|
||||||
|
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif;
|
||||||
|
font-size: 1rem;
|
||||||
|
line-height: 1.5;
|
||||||
|
margin: 0;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
main {
|
||||||
|
padding: 1rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 2.5rem;
|
||||||
|
line-height: 1.1;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
@media screen and (max-width: 480px) {
|
||||||
|
h1 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
h1::after {
|
||||||
|
content: "";
|
||||||
|
background-color: #ffe800;
|
||||||
|
background: repeating-linear-gradient(45deg, #ffe800, #ffe800 0.5rem, #222 0.5rem, #222 1.0rem);
|
||||||
|
display: block;
|
||||||
|
height: 0.5rem;
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
margin: 1rem 0 0 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
<h1>Rustdesk Client Generator</h1>
|
||||||
|
<p>The Rustdesk Client Generator is currently under construction, please come back at a later time.</p>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -26,7 +26,6 @@ def generator_view(request):
|
|||||||
cycleMonitor = form.cleaned_data['cycleMonitor']
|
cycleMonitor = form.cleaned_data['cycleMonitor']
|
||||||
xOffline = form.cleaned_data['xOffline']
|
xOffline = form.cleaned_data['xOffline']
|
||||||
hidecm = form.cleaned_data['hidecm']
|
hidecm = form.cleaned_data['hidecm']
|
||||||
statussort = form.cleaned_data['statussort']
|
|
||||||
removeNewVersionNotif = form.cleaned_data['removeNewVersionNotif']
|
removeNewVersionNotif = form.cleaned_data['removeNewVersionNotif']
|
||||||
server = form.cleaned_data['serverIP']
|
server = form.cleaned_data['serverIP']
|
||||||
key = form.cleaned_data['key']
|
key = form.cleaned_data['key']
|
||||||
@@ -48,6 +47,9 @@ def generator_view(request):
|
|||||||
settings = form.cleaned_data['settings']
|
settings = form.cleaned_data['settings']
|
||||||
appname = form.cleaned_data['appname']
|
appname = form.cleaned_data['appname']
|
||||||
filename = form.cleaned_data['exename']
|
filename = form.cleaned_data['exename']
|
||||||
|
compname = form.cleaned_data['compname']
|
||||||
|
if not compname:
|
||||||
|
compname = "Purslane Ltd"
|
||||||
permPass = form.cleaned_data['permanentPassword']
|
permPass = form.cleaned_data['permanentPassword']
|
||||||
theme = form.cleaned_data['theme']
|
theme = form.cleaned_data['theme']
|
||||||
themeDorO = form.cleaned_data['themeDorO']
|
themeDorO = form.cleaned_data['themeDorO']
|
||||||
@@ -72,8 +74,13 @@ def generator_view(request):
|
|||||||
defaultManual = form.cleaned_data['defaultManual']
|
defaultManual = form.cleaned_data['defaultManual']
|
||||||
overrideManual = form.cleaned_data['overrideManual']
|
overrideManual = form.cleaned_data['overrideManual']
|
||||||
|
|
||||||
|
if all(char.isascii() for char in filename):
|
||||||
filename = re.sub(r'[^\w\s-]', '_', filename).strip()
|
filename = re.sub(r'[^\w\s-]', '_', filename).strip()
|
||||||
|
filename = filename.replace(" ","_")
|
||||||
|
else:
|
||||||
|
filename = "rustdesk"
|
||||||
|
if not all(char.isascii() for char in appname):
|
||||||
|
appname = "rustdesk"
|
||||||
myuuid = str(uuid.uuid4())
|
myuuid = str(uuid.uuid4())
|
||||||
protocol = _settings.PROTOCOL
|
protocol = _settings.PROTOCOL
|
||||||
host = request.get_host()
|
host = request.get_host()
|
||||||
@@ -168,8 +175,8 @@ def generator_view(request):
|
|||||||
extras['cycleMonitor'] = 'true' if cycleMonitor else 'false'
|
extras['cycleMonitor'] = 'true' if cycleMonitor else 'false'
|
||||||
extras['xOffline'] = 'true' if xOffline else 'false'
|
extras['xOffline'] = 'true' if xOffline else 'false'
|
||||||
extras['hidecm'] = 'true' if hidecm else 'false'
|
extras['hidecm'] = 'true' if hidecm else 'false'
|
||||||
extras['statussort'] = 'true' if statussort else 'false'
|
|
||||||
extras['removeNewVersionNotif'] = 'true' if removeNewVersionNotif else 'false'
|
extras['removeNewVersionNotif'] = 'true' if removeNewVersionNotif else 'false'
|
||||||
|
extras['compname'] = compname
|
||||||
extra_input = json.dumps(extras)
|
extra_input = json.dumps(extras)
|
||||||
|
|
||||||
####from here run the github action, we need user, repo, access token.
|
####from here run the github action, we need user, repo, access token.
|
||||||
@@ -183,28 +190,6 @@ def generator_view(request):
|
|||||||
url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/generator-macos.yml/dispatches'
|
url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/generator-macos.yml/dispatches'
|
||||||
else:
|
else:
|
||||||
url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/generator-windows.yml/dispatches'
|
url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/generator-windows.yml/dispatches'
|
||||||
####changes were made to use hbb_common as a submodule in version 1.3.7, so if 1.3.3 through 1.3.6, use:
|
|
||||||
if version == '1.3.3' or version == '1.3.4' or version == '1.3.5' or version == '1.3.6':
|
|
||||||
if platform == 'windows':
|
|
||||||
url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/pre137-generator-windows.yml/dispatches'
|
|
||||||
elif platform == 'linux':
|
|
||||||
url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/pre137-generator-linux.yml/dispatches'
|
|
||||||
elif platform == 'android':
|
|
||||||
url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/pre137-generator-android.yml/dispatches'
|
|
||||||
elif platform == 'macos':
|
|
||||||
url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/pre137-generator-macos.yml/dispatches'
|
|
||||||
else:
|
|
||||||
url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/pre137-generator-windows.yml/dispatches'
|
|
||||||
####breaking changes were made in 1.3.3 version, so if 1.3.2 or lower, use:
|
|
||||||
if version == '1.3.2' or version == '1.3.1' or version == '1.3.0':
|
|
||||||
if platform == 'windows':
|
|
||||||
url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/pre133-generator-windows.yml/dispatches'
|
|
||||||
elif platform == 'linux':
|
|
||||||
url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/pre133-generator-linux.yml/dispatches'
|
|
||||||
elif platform == 'android':
|
|
||||||
url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/pre133-generator-android.yml/dispatches'
|
|
||||||
else:
|
|
||||||
url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/pre133-generator-windows.yml/dispatches'
|
|
||||||
|
|
||||||
#url = 'https://api.github.com/repos/'+_settings.GHUSER+'/rustdesk/actions/workflows/test.yml/dispatches'
|
#url = 'https://api.github.com/repos/'+_settings.GHUSER+'/rustdesk/actions/workflows/test.yml/dispatches'
|
||||||
data = {
|
data = {
|
||||||
@@ -240,6 +225,7 @@ def generator_view(request):
|
|||||||
return JsonResponse({"error": "Something went wrong"})
|
return JsonResponse({"error": "Something went wrong"})
|
||||||
else:
|
else:
|
||||||
form = GenerateForm()
|
form = GenerateForm()
|
||||||
|
#return render(request, 'maintenance.html')
|
||||||
return render(request, 'generator.html', {'form': form})
|
return render(request, 'generator.html', {'form': form})
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
49
setup.md
49
setup.md
@@ -1,4 +1,35 @@
|
|||||||
## To fully host the client generator yourself, you will need to following:
|
## Host the rdgen server with docker
|
||||||
|
|
||||||
|
1. First you will need to fork this repo on github
|
||||||
|
2. Next, setup a A Github fine-grained access token with permissions for your rdgen
|
||||||
|
repository:
|
||||||
|
* login to your github account
|
||||||
|
* click on your profile picture at the top right, click Settings
|
||||||
|
* at the bottom of the left panel, click Developer Settings
|
||||||
|
* click Personal access tokens
|
||||||
|
* click Fine-grained tokens
|
||||||
|
* click Generate new token
|
||||||
|
* give a token name, change expiration to whatever you want
|
||||||
|
* under Repository access, select Only select repositories, then pick your
|
||||||
|
rdgen repo
|
||||||
|
* give Read and Write access to actions and workflows
|
||||||
|
* You might have to go to: https://github.com/USERNAME/rdgen/actions and hit green Enable Actions button so it works.
|
||||||
|
3. Next, login to your Github account, go to your rdgen repo page (https://github.com/USERNAME/rdgen)
|
||||||
|
* Click on Settings
|
||||||
|
* In the left pane, click on Secrets and variables, then click Actions
|
||||||
|
* Now click New repository secret
|
||||||
|
* Set the Name to GENURL
|
||||||
|
* Set the Secret to https://rdgen.hostname.com (or whatever your server will be accessed from)
|
||||||
|
4. Now download the docker-compose.yml file and fill in the environment variables:
|
||||||
|
* SECRET_KEY="your secret key" - generate a secret key by running: ```python3 -c 'import secrets; print(secrets.token_hex(100))'```
|
||||||
|
* GHUSER="your github username"
|
||||||
|
* GHBEARER="your fine-grained access token"
|
||||||
|
* PROTOCOL="https" *optional - defaults to "https", change to "http" if you need to
|
||||||
|
* REPONAME="rdgen" *optional - defaults to "rdgen", change this if you renamed the repo when you forked it
|
||||||
|
5. Now just run ```docker compose up -d```
|
||||||
|
|
||||||
|
|
||||||
|
## Host manually:
|
||||||
|
|
||||||
1. A Github account with a fork of this repo
|
1. A Github account with a fork of this repo
|
||||||
2. A Github fine-grained access token with permissions for your rdgen
|
2. A Github fine-grained access token with permissions for your rdgen
|
||||||
@@ -24,20 +55,6 @@
|
|||||||
* GENURL="example.com:8000" *this is the domain and port that you are
|
* GENURL="example.com:8000" *this is the domain and port that you are
|
||||||
running rdgen on, needs to be accessible on the internet, depending
|
running rdgen on, needs to be accessible on the internet, depending
|
||||||
on how you have this setup the port may not be needed
|
on how you have this setup the port may not be needed
|
||||||
* optional github secrets (for signing the code):
|
|
||||||
* WINDOWS_PFX_BASE64
|
|
||||||
* WINDOWS_PFX_PASSWORD
|
|
||||||
* WINDOWS_PFX_SHA1_THUMBPRINT
|
|
||||||
|
|
||||||
|
|
||||||
## A few notes:
|
|
||||||
|
|
||||||
* If you change your repository name, make sure to change the url on lines
|
|
||||||
172-203 of views.py to reflect the change
|
|
||||||
* If you are running on http instead of https, make sure to make the change on
|
|
||||||
line 75 of views.py
|
|
||||||
|
|
||||||
## To run rdgen on your server without docker:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
# Open to the directory you want to install rdgen (change /opt to wherever you want)
|
# Open to the directory you want to install rdgen (change /opt to wherever you want)
|
||||||
@@ -69,7 +86,7 @@ open your web browser to yourdomain:8000
|
|||||||
|
|
||||||
use nginx, caddy, traefik, etc. for ssl reverse proxy
|
use nginx, caddy, traefik, etc. for ssl reverse proxy
|
||||||
|
|
||||||
## To autostart the server on boot, you can set up a systemd service called rdgen.service
|
### To autostart the server on boot, you can set up a systemd service called rdgen.service
|
||||||
|
|
||||||
replace user, group, and port if you need to replace /opt with wherever you
|
replace user, group, and port if you need to replace /opt with wherever you
|
||||||
have installed rdgen save the following file as
|
have installed rdgen save the following file as
|
||||||
|
|||||||
Reference in New Issue
Block a user