remove linux_headless/appimage/flatpak feature

This commit is contained in:
rustdesk 2024-05-02 13:23:32 +08:00
parent f853b29fd9
commit 7ce0b225ef
15 changed files with 224 additions and 408 deletions

View File

@ -960,7 +960,7 @@ jobs:
files: | files: |
signed-apk/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk signed-apk/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk
build-rustdesk-lib-linux: build-rustdesk-linux:
needs: [generate-bridge-linux] needs: [generate-bridge-linux]
name: build-rust-lib ${{ matrix.job.target }} ${{ matrix.job.extra-build-features }} name: build-rust-lib ${{ matrix.job.target }} ${{ matrix.job.extra-build-features }}
runs-on: ${{ matrix.job.on }} runs-on: ${{ matrix.job.on }}
@ -973,48 +973,12 @@ jobs:
arch: x86_64, arch: x86_64,
target: x86_64-unknown-linux-gnu, target: x86_64-unknown-linux-gnu,
distro: ubuntu18.04, distro: ubuntu18.04,
extra-build-features: "",
enable-headless: true,
on: ubuntu-20.04,
}
- {
arch: x86_64,
target: x86_64-unknown-linux-gnu,
distro: ubuntu18.04,
extra-build-features: "flatpak",
enable-headless: false,
on: ubuntu-20.04,
}
- {
arch: x86_64,
target: x86_64-unknown-linux-gnu,
distro: ubuntu18.04,
extra-build-features: "appimage",
enable-headless: false,
on: ubuntu-20.04, on: ubuntu-20.04,
} }
- { - {
arch: aarch64, arch: aarch64,
target: aarch64-unknown-linux-gnu, target: aarch64-unknown-linux-gnu,
distro: ubuntu18.04, distro: ubuntu18.04,
extra-build-features: "",
enable-headless: true,
on: [self-hosted, Linux, ARM64],
}
- {
arch: aarch64,
target: aarch64-unknown-linux-gnu,
distro: ubuntu20.04,
extra-build-features: "flatpak",
enable-headless: false,
on: [self-hosted, Linux, ARM64],
}
- {
arch: aarch64,
target: aarch64-unknown-linux-gnu,
distro: ubuntu20.04,
extra-build-features: "appimage",
enable-headless: false,
on: [self-hosted, Linux, ARM64], on: [self-hosted, Linux, ARM64],
} }
steps: steps:
@ -1090,6 +1054,12 @@ jobs:
esac esac
shell: bash shell: bash
- name: Restore bridge files
uses: actions/download-artifact@master
with:
name: bridge-artifact
path: ./
- uses: rustdesk-org/run-on-arch-action@amd64-support - uses: rustdesk-org/run-on-arch-action@amd64-support
name: Build rustdesk library for ${{ matrix.job.arch }} name: Build rustdesk library for ${{ matrix.job.arch }}
id: vcpkg id: vcpkg
@ -1109,6 +1079,7 @@ jobs:
apt-get update -y apt-get update -y
echo -e "installing deps" echo -e "installing deps"
apt-get install -y \ apt-get install -y \
build-essential \
clang \ clang \
cmake \ cmake \
curl \ curl \
@ -1137,7 +1108,11 @@ jobs:
ninja-build \ ninja-build \
pkg-config \ pkg-config \
tree \ tree \
wget python3 \
rpm \
unzip \
wget \
xz-utils
# we have libopus compiled by us. # we have libopus compiled by us.
apt-get remove -y libopus-dev || true apt-get remove -y libopus-dev || true
# output devs # output devs
@ -1163,28 +1138,153 @@ jobs:
# start build # start build
pushd /workspace pushd /workspace
export VCPKG_ROOT=/opt/artifacts/vcpkg export VCPKG_ROOT=/opt/artifacts/vcpkg
export DEFAULT_FEAT=""
if ${{ matrix.job.enable-headless }}; then
export DEFAULT_FEAT=linux_headless
fi
if [[ "${{ matrix.job.arch }}" == "aarch64" ]]; then if [[ "${{ matrix.job.arch }}" == "aarch64" ]]; then
export JOBS="--jobs 3" export JOBS="--jobs 3"
else else
export JOBS="" export JOBS=""
fi fi
echo $JOBS echo $JOBS
cargo build --lib $JOBS --features hwcodec,flutter,flutter_texture_render,${{ matrix.job.extra-build-features }},$DEFAULT_FEAT --release cargo build --lib $JOBS --features hwcodec,flutter,flutter_texture_render --release
- name: Upload Artifacts # disable git safe.directory
uses: actions/upload-artifact@master git config --global --add safe.directory "*"
if: matrix.job.extra-build-features == '' || env.UPLOAD_ARTIFACT == 'true' pushd /workspace
case ${{ matrix.job.arch }} in
aarch64)
export PATH=/opt/flutter-elinux/bin:$PATH
sed -i "s/flutter build linux --release/flutter-elinux build linux --verbose/g" ./build.py
export ARCH=arm64
sed -i "s/x64\/release/arm64\/release/g" ./build.py
;;
x86_64)
export PATH=/opt/flutter/bin:$PATH
;;
esac
popd
# Setup Flutter
pushd /opt
wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz
tar xf flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz
case ${{ matrix.job.arch }} in
aarch64)
# clone repo and reset to flutter ${{ env.FLUTTER_VERSION }}
git clone https://github.com/sony/flutter-elinux.git || true
pushd flutter-elinux
git fetch
git reset --hard ${{ env.FLUTTER_VERSION }}
bin/flutter-elinux doctor -v
bin/flutter-elinux precache --linux
popd
cp -R flutter/bin/cache/artifacts/engine/linux-x64/shader_lib flutter-elinux/flutter/bin/cache/artifacts/engine/linux-arm64
;;
x86_64)
flutter doctor -v
;;
esac
pushd /workspace
export CARGO_INCREMENTAL=0
python3 ./build.py --flutter --skip-cargo
# rpm package
echo -e "start packaging fedora package"
pushd /workspace
case ${{ matrix.job.arch }} in
aarch64)
sed -i "s/linux\/x64/linux\/arm64/g" ./res/rpm-flutter.spec
;;
esac
HBB=`pwd` rpmbuild ./res/rpm-flutter.spec -bb
pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }}
# rpm suse package
echo -e "start packaging suse package"
pushd /workspace
case ${{ matrix.job.arch }} in
aarch64)
sed -i "s/linux\/x64/linux\/arm64/g" ./res/rpm-flutter-suse.spec
;;
esac
HBB=`pwd` rpmbuild ./res/rpm-flutter-suse.spec -bb
pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }}
for name in rustdesk*??.rpm; do
mv "$name" "${name%%.rpm}-suse.rpm"
done
for name in rustdesk*??.deb; do
mv "$name" "${name%%.deb}-${{ matrix.job.arch }}.deb"
done
- name: Publish debian/rpm package
if: env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with: with:
name: librustdesk-${{ matrix.job.arch }}-${{ matrix.job.extra-build-features }}.so prerelease: true
path: target/release/liblibrustdesk.so tag_name: ${{ env.TAG_NAME }}
files: |
rustdesk-*.deb
rustdesk-*.rpm
- name: Upload Artifact
uses: actions/upload-artifact@master
if: matrix.job.extra-build-features == 'flatpak' && env.UPLOAD_ARTIFACT == 'true'
with:
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb
path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb
- name: Patch archlinux PKGBUILD
if: matrix.job.extra-build-features == '' && env.UPLOAD_ARTIFACT == 'true'
run: |
sed -i "s/x86_64/${{ matrix.job.arch }}/g" res/PKGBUILD
if [[ "${{ matrix.job.arch }}" == "aarch64" ]]; then
sed -i "s/linux\/x64/linux\/arm64/g" ./res/PKGBUILD
fi
- name: Build archlinux package
if: matrix.job.extra-build-features == '' && env.UPLOAD_ARTIFACT == 'true'
uses: rustdesk-org/arch-makepkg-action@master
with:
packages: >
llvm
clang
libva
libvdpau
rust
gstreamer
unzip
git
cmake
gcc
curl
wget
nasm
zip
make
pkg-config
clang
gtk3
xdotool
libxcb
libxfixes
alsa-lib
pipewire
python
ttf-arphic-uming
libappindicator-gtk3
pam
gst-plugins-base
gst-plugin-pipewire
scripts: |
cd res && HBB=`pwd`/.. FLUTTER=1 makepkg -f
- name: Publish archlinux package
if: matrix.job.extra-build-features == '' && env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
res/rustdesk-${{ env.VERSION }}*.zst
build-rustdesk-sciter-arm: build-rustdesk-sciter-arm:
if: ${{ inputs.upload-artifact }} if: ${{ inputs.upload-artifact }}
needs: build-rustdesk-lib-linux # not for dep, just make it run later for parallelism needs: build-rustdesk-linux # not for dep, just make it run later for parallelism
runs-on: [self-hosted, Linux, ARM64] runs-on: [self-hosted, Linux, ARM64]
name: build-rustdesk-sciter-arm ${{ matrix.job.target }} name: build-rustdesk-sciter-arm ${{ matrix.job.target }}
strategy: strategy:
@ -1198,7 +1298,6 @@ jobs:
deb-arch: armhf, deb-arch: armhf,
use-cross: true, use-cross: true,
extra-build-features: "", extra-build-features: "",
enable-headless: true,
} }
steps: steps:
- name: Export GitHub Actions cache environment variables - name: Export GitHub Actions cache environment variables
@ -1329,12 +1428,8 @@ jobs:
python3 ./res/inline-sciter.py python3 ./res/inline-sciter.py
export VCPKG_ROOT=/opt/artifacts/vcpkg export VCPKG_ROOT=/opt/artifacts/vcpkg
export ARCH=armhf export ARCH=armhf
export DEFAULT_FEAT=""
export CARGO_INCREMENTAL=0 export CARGO_INCREMENTAL=0
if ${{ matrix.job.enable-headless }}; then cargo build --features inline,${{ matrix.job.extra-build-features }} --release --bins --jobs 3
export DEFAULT_FEAT=linux_headless
fi
cargo build --features inline,${{ matrix.job.extra-build-features }},$DEFAULT_FEAT --release --bins --jobs 3
# package # package
mkdir -p ./Release mkdir -p ./Release
mv ./target/release/rustdesk ./Release/rustdesk mv ./target/release/rustdesk ./Release/rustdesk
@ -1365,294 +1460,7 @@ jobs:
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb
path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb
build-rustdesk-linux: build-flatpak-appimage:
needs: [build-rustdesk-lib-linux]
name: build-rustdesk-liunux ${{ matrix.job.target }} ${{ matrix.job.extra-build-features }}
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix:
job:
- {
arch: x86_64,
distro: ubuntu18.04,
target: x86_64-unknown-linux-gnu,
extra-build-features: "",
}
- {
arch: x86_64,
distro: ubuntu18.04,
target: x86_64-unknown-linux-gnu,
extra-build-features: "flatpak",
}
- {
arch: x86_64,
distro: ubuntu18.04,
target: x86_64-unknown-linux-gnu,
extra-build-features: "appimage",
}
- {
arch: aarch64,
distro: ubuntu18.04,
target: aarch64-unknown-linux-gnu,
extra-build-features: "",
}
- {
arch: aarch64,
distro: ubuntu20.04,
target: aarch64-unknown-linux-gnu,
extra-build-features: "flatpak",
}
- {
arch: aarch64,
distro: ubuntu20.04,
target: aarch64-unknown-linux-gnu,
extra-build-features: "appimage",
}
steps:
- name: Checkout source code
uses: actions/checkout@v3
- name: Restore bridge files
uses: actions/download-artifact@master
with:
name: bridge-artifact
path: ./
- name: Prepare env
run: |
sudo apt-get update -y
sudo apt-get install -y \
curl \
git \
libarchive-tools \
libgtk-3-dev \
nasm \
wget
mkdir -p ./target/release/
- name: Restore the rustdesk lib file
uses: actions/download-artifact@master
if: matrix.job.extra-build-features == '' || env.UPLOAD_ARTIFACT == 'true'
with:
name: librustdesk-${{ matrix.job.arch }}-${{ matrix.job.extra-build-features }}.so
path: ./target/release/
- uses: rustdesk-org/run-on-arch-action@amd64-support
name: flutter build
id: vcpkg
if: matrix.job.extra-build-features == '' || env.UPLOAD_ARTIFACT == 'true'
with:
arch: ${{ matrix.job.arch }}
distro: ${{ matrix.job.distro }}
githubToken: ${{ github.token }}
setup: |
ls -l "${PWD}"
dockerRunArgs: |
--volume "${PWD}:/workspace"
--volume "/opt/artifacts:/opt/artifacts"
shell: /bin/bash
install: |
apt-get update -y
apt-get install -y \
build-essential \
clang \
cmake \
curl \
gcc \
git \
g++ \
libappindicator3-dev \
libgtk-3-dev \
liblzma-dev \
nasm \
ninja-build \
pkg-config \
python3 \
rpm \
unzip \
wget \
xz-utils
run: |
# disable git safe.directory
git config --global --add safe.directory "*"
pushd /workspace
case ${{ matrix.job.arch }} in
aarch64)
export PATH=/opt/flutter-elinux/bin:$PATH
sed -i "s/flutter build linux --release/flutter-elinux build linux --verbose/g" ./build.py
export ARCH=arm64
sed -i "s/x64\/release/arm64\/release/g" ./build.py
;;
x86_64)
export PATH=/opt/flutter/bin:$PATH
;;
esac
popd
# Setup Flutter
pushd /opt
wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz
tar xf flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz
case ${{ matrix.job.arch }} in
aarch64)
# clone repo and reset to flutter ${{ env.FLUTTER_VERSION }}
git clone https://github.com/sony/flutter-elinux.git || true
pushd flutter-elinux
git fetch
git reset --hard ${{ env.FLUTTER_VERSION }}
bin/flutter-elinux doctor -v
bin/flutter-elinux precache --linux
popd
cp -R flutter/bin/cache/artifacts/engine/linux-x64/shader_lib flutter-elinux/flutter/bin/cache/artifacts/engine/linux-arm64
;;
x86_64)
flutter doctor -v
;;
esac
pushd /workspace
export CARGO_INCREMENTAL=0
python3 ./build.py --flutter --skip-cargo
# rpm package
echo -e "start packaging fedora package"
pushd /workspace
case ${{ matrix.job.arch }} in
aarch64)
sed -i "s/linux\/x64/linux\/arm64/g" ./res/rpm-flutter.spec
;;
esac
HBB=`pwd` rpmbuild ./res/rpm-flutter.spec -bb
pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }}
mkdir -p /opt/artifacts/rpm
for name in rustdesk*??.rpm; do
mv "$name" "/opt/artifacts/rpm/${name%%.rpm}.rpm"
done
# rpm suse package
echo -e "start packaging suse package"
pushd /workspace
case ${{ matrix.job.arch }} in
aarch64)
sed -i "s/linux\/x64/linux\/arm64/g" ./res/rpm-flutter-suse.spec
;;
esac
HBB=`pwd` rpmbuild ./res/rpm-flutter-suse.spec -bb
pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }}
mkdir -p /opt/artifacts/rpm
for name in rustdesk*??.rpm; do
mv "$name" "/opt/artifacts/rpm/${name%%.rpm}-suse.rpm"
done
- name: Rename rustdesk
shell: bash
if: matrix.job.extra-build-features == '' || env.UPLOAD_ARTIFACT == 'true'
run: |
for name in rustdesk*??.deb; do
# use cp to duplicate deb files to fit other packages.
cp "$name" "${name%%.deb}-${{ matrix.job.arch }}.deb"
done
- name: Publish debian package
if: matrix.job.extra-build-features == '' && env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb
- name: Upload Artifact
uses: actions/upload-artifact@master
if: matrix.job.extra-build-features == 'flatpak' && env.UPLOAD_ARTIFACT == 'true'
with:
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb
path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb
- name: Patch archlinux PKGBUILD
if: matrix.job.extra-build-features == '' && env.UPLOAD_ARTIFACT == 'true'
run: |
sed -i "s/x86_64/${{ matrix.job.arch }}/g" res/PKGBUILD
if [[ "${{ matrix.job.arch }}" == "aarch64" ]]; then
sed -i "s/linux\/x64/linux\/arm64/g" ./res/PKGBUILD
fi
- name: Build archlinux package
if: matrix.job.extra-build-features == '' && env.UPLOAD_ARTIFACT == 'true'
uses: rustdesk-org/arch-makepkg-action@master
with:
packages: >
llvm
clang
libva
libvdpau
rust
gstreamer
unzip
git
cmake
gcc
curl
wget
nasm
zip
make
pkg-config
clang
gtk3
xdotool
libxcb
libxfixes
alsa-lib
pipewire
python
ttf-arphic-uming
libappindicator-gtk3
pam
gst-plugins-base
gst-plugin-pipewire
scripts: |
cd res && HBB=`pwd`/.. FLUTTER=1 makepkg -f
- name: Publish archlinux package
if: matrix.job.extra-build-features == '' && env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
res/rustdesk-${{ env.VERSION }}*.zst
- name: Build appimage package
if: matrix.job.extra-build-features == 'appimage' && env.UPLOAD_ARTIFACT == 'true'
shell: bash
run: |
# set-up appimage-builder
pushd /tmp
wget -O appimage-builder-x86_64.AppImage https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-x86_64.AppImage
chmod +x appimage-builder-x86_64.AppImage
sudo mv appimage-builder-x86_64.AppImage /usr/local/bin/appimage-builder
popd
# run appimage-builder
pushd appimage
sudo appimage-builder --skip-tests --recipe ./AppImageBuilder-${{ matrix.job.arch }}.yml
- name: Publish appimage package
if: matrix.job.extra-build-features == 'appimage' && env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
./appimage/rustdesk-${{ env.VERSION }}-*.AppImage
- name: Publish fedora package
if: matrix.job.extra-build-features == '' && env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
/opt/artifacts/rpm/*.rpm
build-flatpak:
name: Build Flatpak ${{ matrix.job.target }} name: Build Flatpak ${{ matrix.job.target }}
needs: [build-rustdesk-linux] needs: [build-rustdesk-linux]
runs-on: ${{ matrix.job.on }} runs-on: ${{ matrix.job.on }}
@ -1688,6 +1496,20 @@ jobs:
run: | run: |
mv rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb rustdesk-${{ env.VERSION }}.deb mv rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb rustdesk-${{ env.VERSION }}.deb
- name: Build appimage package
if: matrix.job.extra-build-features == 'appimage' && env.UPLOAD_ARTIFACT == 'true'
shell: bash
run: |
# set-up appimage-builder
pushd /tmp
wget -O appimage-builder-x86_64.AppImage https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-x86_64.AppImage
chmod +x appimage-builder-x86_64.AppImage
sudo mv appimage-builder-x86_64.AppImage /usr/local/bin/appimage-builder
popd
# run appimage-builder
pushd appimage
sudo appimage-builder --skip-tests --recipe ./AppImageBuilder-${{ matrix.job.arch }}.yml
- uses: rustdesk-org/run-on-arch-action@amd64-support - uses: rustdesk-org/run-on-arch-action@amd64-support
name: Build rustdesk flatpak package for ${{ matrix.job.arch }} name: Build rustdesk flatpak package for ${{ matrix.job.arch }}
id: rpm id: rpm

View File

@ -30,7 +30,6 @@ default = ["use_dasp"]
hwcodec = ["scrap/hwcodec"] hwcodec = ["scrap/hwcodec"]
vram = ["scrap/vram"] vram = ["scrap/vram"]
mediacodec = ["scrap/mediacodec"] mediacodec = ["scrap/mediacodec"]
linux_headless = ["pam" ]
virtual_display_driver = ["virtual_display"] virtual_display_driver = ["virtual_display"]
plugin_framework = [] plugin_framework = []
linux-pkg-config = ["magnum-opus/linux-pkg-config", "scrap/linux-pkg-config"] linux-pkg-config = ["magnum-opus/linux-pkg-config", "scrap/linux-pkg-config"]
@ -158,7 +157,7 @@ mouce = { git="https://github.com/fufesou/mouce.git" }
evdev = { git="https://github.com/fufesou/evdev" } evdev = { git="https://github.com/fufesou/evdev" }
dbus = "0.9" dbus = "0.9"
dbus-crossroads = "0.5" dbus-crossroads = "0.5"
pam = { git="https://github.com/fufesou/pam", optional = true } pam = { git="https://github.com/fufesou/pam" }
users = { version = "0.11" } users = { version = "0.11" }
x11-clipboard = {git="https://github.com/clslaid/x11-clipboard", branch = "feat/store-batch", optional = true} x11-clipboard = {git="https://github.com/clslaid/x11-clipboard", branch = "feat/store-batch", optional = true}
x11rb = {version = "0.12", features = ["all-extensions"], optional = true} x11rb = {version = "0.12", features = ["all-extensions"], optional = true}

View File

@ -57,6 +57,7 @@ AppDir:
- libpulse0 - libpulse0
- packagekit-gtk3-module - packagekit-gtk3-module
- libcanberra-gtk3-module - libcanberra-gtk3-module
- libpam0g
exclude: exclude:
- humanity-icon-theme - humanity-icon-theme
- hicolor-icon-theme - hicolor-icon-theme

View File

@ -59,6 +59,7 @@ AppDir:
- libpulse0 - libpulse0
- packagekit-gtk3-module - packagekit-gtk3-module
- libcanberra-gtk3-module - libcanberra-gtk3-module
- libpam0g
exclude: exclude:
- humanity-icon-theme - humanity-icon-theme
- hicolor-icon-theme - hicolor-icon-theme

View File

@ -8,6 +8,20 @@
"modules": [ "modules": [
"shared-modules/libappindicator/libappindicator-gtk3-12.10.json", "shared-modules/libappindicator/libappindicator-gtk3-12.10.json",
"xdotool.json", "xdotool.json",
{
"name": "pam",
"buildsystem": "simple",
"build-commands": [
"./configure --prefix=/app && make -j4 install"
],
"sources": [
{
"type": "archive",
"url": "https://github.com/linux-pam/linux-pam/releases/download/v1.3.1/Linux-PAM-1.3.1.tar.xz",
"sha256": "eff47a4ecd833fbf18de9686632a70ee8d0794b79aecb217ebd0ce11db4cd0db"
}
]
},
{ {
"name": "rustdesk", "name": "rustdesk",
"buildsystem": "simple", "buildsystem": "simple",

View File

@ -81,8 +81,7 @@ pub const SEC30: Duration = Duration::from_secs(30);
pub const VIDEO_QUEUE_SIZE: usize = 120; pub const VIDEO_QUEUE_SIZE: usize = 120;
const MAX_DECODE_FAIL_COUNTER: usize = 10; // Currently, failed decode cause refresh_video, so make it small const MAX_DECODE_FAIL_COUNTER: usize = 10; // Currently, failed decode cause refresh_video, so make it small
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
pub const LOGIN_MSG_DESKTOP_NOT_INITED: &str = "Desktop env is not inited"; pub const LOGIN_MSG_DESKTOP_NOT_INITED: &str = "Desktop env is not inited";
pub const LOGIN_MSG_DESKTOP_SESSION_NOT_READY: &str = "Desktop session not ready"; pub const LOGIN_MSG_DESKTOP_SESSION_NOT_READY: &str = "Desktop session not ready";
pub const LOGIN_MSG_DESKTOP_XSESSION_FAILED: &str = "Desktop xsession failed"; pub const LOGIN_MSG_DESKTOP_XSESSION_FAILED: &str = "Desktop xsession failed";

View File

@ -774,8 +774,7 @@ pub fn main_get_error() -> String {
} }
pub fn main_show_option(_key: String) -> SyncReturn<bool> { pub fn main_show_option(_key: String) -> SyncReturn<bool> {
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
if _key.eq(config::CONFIG_OPTION_ALLOW_LINUX_HEADLESS) { if _key.eq(config::CONFIG_OPTION_ALLOW_LINUX_HEADLESS) {
return SyncReturn(true); return SyncReturn(true);
} }

View File

@ -1,7 +1,5 @@
use super::{CursorData, ResultType}; use super::{CursorData, ResultType};
use desktop::Desktop; use desktop::Desktop;
#[cfg(all(feature = "linux_headless"))]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
use hbb_common::config::CONFIG_OPTION_ALLOW_LINUX_HEADLESS; use hbb_common::config::CONFIG_OPTION_ALLOW_LINUX_HEADLESS;
pub use hbb_common::platform::linux::*; pub use hbb_common::platform::linux::*;
use hbb_common::{ use hbb_common::{
@ -96,8 +94,6 @@ pub struct xcb_xfixes_get_cursor_image {
} }
#[inline] #[inline]
#[cfg(feature = "linux_headless")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
pub fn is_headless_allowed() -> bool { pub fn is_headless_allowed() -> bool {
Config::get_option(CONFIG_OPTION_ALLOW_LINUX_HEADLESS) == "Y" Config::get_option(CONFIG_OPTION_ALLOW_LINUX_HEADLESS) == "Y"
} }

View File

@ -44,8 +44,8 @@ fn check_desktop_manager() {
} }
} }
// --server process
pub fn start_xdesktop() { pub fn start_xdesktop() {
debug_assert!(crate::is_sever());
std::thread::spawn(|| { std::thread::spawn(|| {
*DESKTOP_MANAGER.lock().unwrap() = Some(DesktopManager::new()); *DESKTOP_MANAGER.lock().unwrap() = Some(DesktopManager::new());
@ -91,6 +91,7 @@ fn detect_headless() -> Option<&'static str> {
} }
pub fn try_start_desktop(_username: &str, _passsword: &str) -> String { pub fn try_start_desktop(_username: &str, _passsword: &str) -> String {
debug_assert!(crate::is_sever());
if _username.is_empty() { if _username.is_empty() {
let username = get_username(); let username = get_username();
if username.is_empty() { if username.is_empty() {

View File

@ -20,8 +20,7 @@ pub mod delegate;
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
pub mod linux; pub mod linux;
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
pub mod linux_desktop_manager; pub mod linux_desktop_manager;
#[cfg(not(any(target_os = "android", target_os = "ios")))] #[cfg(not(any(target_os = "android", target_os = "ios")))]

View File

@ -15,8 +15,8 @@ use hbb_common::{
config::{self, Config, CONNECT_TIMEOUT, READ_TIMEOUT, REG_INTERVAL, RENDEZVOUS_PORT}, config::{self, Config, CONNECT_TIMEOUT, READ_TIMEOUT, REG_INTERVAL, RENDEZVOUS_PORT},
futures::future::join_all, futures::future::join_all,
log, log,
proxy::Proxy,
protobuf::Message as _, protobuf::Message as _,
proxy::Proxy,
rendezvous_proto::*, rendezvous_proto::*,
sleep, sleep,
socket_client::{self, connect_tcp, is_ipv4}, socket_client::{self, connect_tcp, is_ipv4},
@ -89,9 +89,10 @@ impl RendezvousMediator {
}); });
} }
// It is ok to run xdesktop manager when the headless function is not allowed. // It is ok to run xdesktop manager when the headless function is not allowed.
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))] if crate::is_server() {
crate::platform::linux_desktop_manager::start_xdesktop(); crate::platform::linux_desktop_manager::start_xdesktop();
}
loop { loop {
let conn_start_time = Instant::now(); let conn_start_time = Instant::now();
*SOLVING_PK_MISMATCH.lock().await = "".to_owned(); *SOLVING_PK_MISMATCH.lock().await = "".to_owned();
@ -128,11 +129,6 @@ impl RendezvousMediator {
} }
} }
} }
// It should be better to call stop_xdesktop.
// But for server, it also is Ok without calling this method.
// #[cfg(all(target_os = "linux", feature = "linux_headless"))]
// #[cfg(not(any(feature = "flatpak", feature = "appimage")))]
// crate::platform::linux_desktop_manager::stop_xdesktop();
} }
fn get_host_prefix(host: &str) -> String { fn get_host_prefix(host: &str) -> String {

View File

@ -560,8 +560,7 @@ async fn sync_and_watch_config_dir() {
let mut cfg0 = (Config::get(), Config2::get()); let mut cfg0 = (Config::get(), Config2::get());
let mut synced = false; let mut synced = false;
let is_server = std::env::args().nth(1) == Some("--server".to_owned()); let tries = if crate::is_server() { 30 } else { 3 };
let tries = if is_server { 30 } else { 3 };
log::debug!("#tries of ipc service connection: {}", tries); log::debug!("#tries of ipc service connection: {}", tries);
use hbb_common::sleep; use hbb_common::sleep;
for i in 1..=tries { for i in 1..=tries {

View File

@ -7,8 +7,7 @@ use crate::common::update_clipboard;
use crate::keyboard::client::map_key_to_control_key; use crate::keyboard::client::map_key_to_control_key;
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
use crate::platform::linux::is_x11; use crate::platform::linux::is_x11;
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
use crate::platform::linux_desktop_manager; use crate::platform::linux_desktop_manager;
#[cfg(any(target_os = "windows", target_os = "linux"))] #[cfg(any(target_os = "windows", target_os = "linux"))]
use crate::platform::WallPaperRemover; use crate::platform::WallPaperRemover;
@ -24,8 +23,7 @@ use crate::{
#[cfg(any(target_os = "android", target_os = "ios"))] #[cfg(any(target_os = "android", target_os = "ios"))]
use crate::{common::DEVICE_NAME, flutter::connection_manager::start_channel}; use crate::{common::DEVICE_NAME, flutter::connection_manager::start_channel};
use cidr_utils::cidr::IpCidr; use cidr_utils::cidr::IpCidr;
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
use hbb_common::platform::linux::run_cmds; use hbb_common::platform::linux::run_cmds;
#[cfg(target_os = "android")] #[cfg(target_os = "android")]
use hbb_common::protobuf::EnumOrUnknown; use hbb_common::protobuf::EnumOrUnknown;
@ -224,8 +222,7 @@ pub struct Connection {
options_in_login: Option<OptionMessage>, options_in_login: Option<OptionMessage>,
#[cfg(not(any(target_os = "ios")))] #[cfg(not(any(target_os = "ios")))]
pressed_modifiers: HashSet<rdev::Key>, pressed_modifiers: HashSet<rdev::Key>,
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
linux_headless_handle: LinuxHeadlessHandle, linux_headless_handle: LinuxHeadlessHandle,
closed: bool, closed: bool,
delay_response_instant: Instant, delay_response_instant: Instant,
@ -312,8 +309,7 @@ impl Connection {
let (tx_cm_stream_ready, _rx_cm_stream_ready) = mpsc::channel(1); let (tx_cm_stream_ready, _rx_cm_stream_ready) = mpsc::channel(1);
#[cfg(not(any(target_os = "android", target_os = "ios")))] #[cfg(not(any(target_os = "android", target_os = "ios")))]
let (_tx_desktop_ready, rx_desktop_ready) = mpsc::channel(1); let (_tx_desktop_ready, rx_desktop_ready) = mpsc::channel(1);
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
let linux_headless_handle = let linux_headless_handle =
LinuxHeadlessHandle::new(_rx_cm_stream_ready, _tx_desktop_ready); LinuxHeadlessHandle::new(_rx_cm_stream_ready, _tx_desktop_ready);
@ -376,8 +372,7 @@ impl Connection {
options_in_login: None, options_in_login: None,
#[cfg(not(any(target_os = "ios")))] #[cfg(not(any(target_os = "ios")))]
pressed_modifiers: Default::default(), pressed_modifiers: Default::default(),
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
linux_headless_handle, linux_headless_handle,
closed: false, closed: false,
delay_response_instant: Instant::now(), delay_response_instant: Instant::now(),
@ -1128,8 +1123,7 @@ impl Connection {
if crate::platform::current_is_wayland() { if crate::platform::current_is_wayland() {
platform_additions.insert("is_wayland".into(), json!(true)); platform_additions.insert("is_wayland".into(), json!(true));
} }
#[cfg(feature = "linux_headless")] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
if crate::platform::is_headless_allowed() { if crate::platform::is_headless_allowed() {
if linux_desktop_manager::is_headless() { if linux_desktop_manager::is_headless() {
platform_additions.insert("headless".into(), json!(true)); platform_additions.insert("headless".into(), json!(true));
@ -1670,14 +1664,9 @@ impl Connection {
#[cfg(not(any(target_os = "android", target_os = "ios")))] #[cfg(not(any(target_os = "android", target_os = "ios")))]
self.try_start_cm_ipc(); self.try_start_cm_ipc();
#[cfg(any( #[cfg(not(target_os = "linux"))]
feature = "flatpak",
feature = "appimage",
not(all(target_os = "linux", feature = "linux_headless"))
))]
let err_msg = "".to_owned(); let err_msg = "".to_owned();
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
let err_msg = self let err_msg = self
.linux_headless_handle .linux_headless_handle
.try_start_desktop(lr.os_login.as_ref()); .try_start_desktop(lr.os_login.as_ref());
@ -1714,8 +1703,7 @@ impl Connection {
return false; return false;
} else if self.is_recent_session(false) { } else if self.is_recent_session(false) {
if err_msg.is_empty() { if err_msg.is_empty() {
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
self.linux_headless_handle.wait_desktop_cm_ready().await; self.linux_headless_handle.wait_desktop_cm_ready().await;
self.send_logon_response().await; self.send_logon_response().await;
self.try_start_cm(lr.my_id.clone(), lr.my_name.clone(), self.authorized); self.try_start_cm(lr.my_id.clone(), lr.my_name.clone(), self.authorized);
@ -1751,8 +1739,7 @@ impl Connection {
} else { } else {
self.update_failure(failure, true, 0); self.update_failure(failure, true, 0);
if err_msg.is_empty() { if err_msg.is_empty() {
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
self.linux_headless_handle.wait_desktop_cm_ready().await; self.linux_headless_handle.wait_desktop_cm_ready().await;
self.send_logon_response().await; self.send_logon_response().await;
self.try_start_cm(lr.my_id, lr.my_name, self.authorized); self.try_start_cm(lr.my_id, lr.my_name, self.authorized);
@ -3226,8 +3213,7 @@ async fn start_ipc(
let mut user = None; let mut user = None;
// Cm run as user, wait until desktop session is ready. // Cm run as user, wait until desktop session is ready.
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
if crate::platform::is_headless_allowed() && linux_desktop_manager::is_headless() { if crate::platform::is_headless_allowed() && linux_desktop_manager::is_headless() {
let mut username = linux_desktop_manager::get_username(); let mut username = linux_desktop_manager::get_username();
loop { loop {
@ -3545,8 +3531,7 @@ impl Drop for Connection {
} }
} }
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
struct LinuxHeadlessHandle { struct LinuxHeadlessHandle {
pub is_headless_allowed: bool, pub is_headless_allowed: bool,
pub is_headless: bool, pub is_headless: bool,
@ -3555,11 +3540,10 @@ struct LinuxHeadlessHandle {
pub tx_desktop_ready: mpsc::Sender<()>, pub tx_desktop_ready: mpsc::Sender<()>,
} }
#[cfg(all(target_os = "linux", feature = "linux_headless"))] #[cfg(target_os = "linux")]
#[cfg(not(any(feature = "flatpak", feature = "appimage")))]
impl LinuxHeadlessHandle { impl LinuxHeadlessHandle {
pub fn new(rx_cm_stream_ready: mpsc::Receiver<()>, tx_desktop_ready: mpsc::Sender<()>) -> Self { pub fn new(rx_cm_stream_ready: mpsc::Receiver<()>, tx_desktop_ready: mpsc::Sender<()>) -> Self {
let is_headless_allowed = crate::platform::is_headless_allowed(); let is_headless_allowed = crate::is_server() && crate::platform::is_headless_allowed();
let is_headless = is_headless_allowed && linux_desktop_manager::is_headless(); let is_headless = is_headless_allowed && linux_desktop_manager::is_headless();
Self { Self {
is_headless_allowed, is_headless_allowed,

View File

@ -41,15 +41,23 @@ pub fn start(args: &mut [String]) {
crate::platform::delegate::show_dock(); crate::platform::delegate::show_dock();
#[cfg(all(target_os = "linux", feature = "inline"))] #[cfg(all(target_os = "linux", feature = "inline"))]
{ {
#[cfg(feature = "appimage")] let app_dir = std::env::var("APPDIR").unwrap_or("".to_string());
let prefix = std::env::var("APPDIR").unwrap_or("".to_string()); let mut so_path = "/usr/lib/rustdesk/libsciter-gtk.so".to_owned();
#[cfg(not(feature = "appimage"))] for (prefix, dir) in [
let prefix = "".to_string(); ("", "/usr"),
#[cfg(feature = "flatpak")] ("", "/app"),
let dir = "/app"; (&app_dir, "/usr"),
#[cfg(not(feature = "flatpak"))] (&app_dir, "/app"),
let dir = "/usr"; ]
sciter::set_library(&(prefix + dir + "/lib/rustdesk/libsciter-gtk.so")).ok(); .iter()
{
let path = format!("{prefix}{dir}/lib/rustdesk/libsciter-gtk.so");
if std::path::Path::new(&path).exists() {
so_path = path;
break;
}
}
sciter::set_library(&so_path).ok();
} }
#[cfg(windows)] #[cfg(windows)]
// Check if there is a sciter.dll nearby. // Check if there is a sciter.dll nearby.

View File

@ -913,8 +913,6 @@ pub fn is_root() -> bool {
#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))] #[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))]
#[inline] #[inline]
pub fn check_super_user_permission() -> bool { pub fn check_super_user_permission() -> bool {
#[cfg(feature = "flatpak")]
return true;
#[cfg(any(windows, target_os = "linux", target_os = "macos"))] #[cfg(any(windows, target_os = "linux", target_os = "macos"))]
return crate::platform::check_super_user_permission().unwrap_or(false); return crate::platform::check_super_user_permission().unwrap_or(false);
#[cfg(not(any(windows, target_os = "linux", target_os = "macos")))] #[cfg(not(any(windows, target_os = "linux", target_os = "macos")))]