diff --git a/.github/workflows/startos-iso.yaml b/.github/workflows/startos-iso.yaml index 76c007e68..44503172e 100644 --- a/.github/workflows/startos-iso.yaml +++ b/.github/workflows/startos-iso.yaml @@ -7,22 +7,22 @@ on: environment: type: choice description: Environment - options: - - "" - - dev - - unstable - - dev-unstable + options: + - "" + - dev + - unstable + - dev-unstable push: branches: - - master - - next + - master + - next pull_request: branches: - - master - - next + - master + - next env: - NODEJS_VERSION: '18.15.0' + NODEJS_VERSION: "18.15.0" ENVIRONMENT: '${{ fromJson(format(''["{0}", ""]'', github.event.inputs.environment || ''dev''))[github.event.inputs.environment == ''''] }}' jobs: @@ -31,119 +31,121 @@ jobs: strategy: fail-fast: false matrix: - platform: [x86_64, x86_64-nonfree, aarch64, aarch64-nonfree, raspberrypi] + platform: + [x86_64, x86_64-nonfree, aarch64, aarch64-nonfree, raspberrypi] runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v3 - with: - repository: Start9Labs/embassy-os-deb + - uses: actions/checkout@v3 + with: + repository: Start9Labs/embassy-os-deb - - uses: actions/checkout@v3 - with: - submodules: recursive - path: embassyos-0.3.x - - run: | - cp -r debian embassyos-0.3.x/ - VERSION=0.3.x ./control.sh - cp embassyos-0.3.x/backend/embassyd.service embassyos-0.3.x/debian/embassyos.embassyd.service - cp embassyos-0.3.x/backend/embassy-init.service embassyos-0.3.x/debian/embassyos.embassy-init.service - - - uses: actions/setup-node@v3 - with: - node-version: ${{ env.NODEJS_VERSION }} - - - name: Get npm cache directory - id: npm-cache-dir - run: | - echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT - - uses: actions/cache@v3 - id: npm-cache - with: - path: ${{ steps.npm-cache-dir.outputs.dir }} - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- + - uses: actions/checkout@v3 + with: + submodules: recursive + path: embassyos-0.3.x + - run: | + cp -r debian embassyos-0.3.x/ + VERSION=0.3.x ./control.sh + cp embassyos-0.3.x/backend/embassyd.service embassyos-0.3.x/debian/embassyos.embassyd.service + cp embassyos-0.3.x/backend/embassy-init.service embassyos-0.3.x/debian/embassyos.embassy-init.service - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install \ - debmake \ - debhelper-compat \ - crossbuild-essential-arm64 + - uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODEJS_VERSION }} - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + - name: Get npm cache directory + id: npm-cache-dir + run: | + echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT + - uses: actions/cache@v3 + id: npm-cache + with: + path: ${{ steps.npm-cache-dir.outputs.dir }} + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- - - name: Run build - run: "make VERSION=0.3.x TAG=${{ github.ref_name }}" - env: - OS_ARCH: ${{ matrix.platform }} + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install \ + debmake \ + debhelper-compat \ + crossbuild-essential-arm64 - - uses: actions/upload-artifact@v3 - with: - name: ${{ matrix.platform }}.deb - path: embassyos_0.3.x-1_*.deb + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Run build + run: "make VERSION=0.3.x TAG=${{ github.ref_name }}" + env: + OS_ARCH: ${{ matrix.platform }} + + - uses: actions/upload-artifact@v3 + with: + name: ${{ matrix.platform }}.deb + path: embassyos_0.3.x-1_*.deb iso: name: Build iso strategy: fail-fast: false matrix: - platform: [x86_64, x86_64-nonfree, aarch64, aarch64-nonfree, raspberrypi] + platform: + [x86_64, x86_64-nonfree, aarch64, aarch64-nonfree, raspberrypi] runs-on: ubuntu-22.04 needs: [dpkg] steps: - - uses: actions/checkout@v3 - with: - repository: Start9Labs/startos-image-recipes + - uses: actions/checkout@v3 + with: + repository: Start9Labs/startos-image-recipes - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y qemu-user-static - wget http://ftp.us.debian.org/debian/pool/main/d/debspawn/debspawn_0.6.1-1_all.deb - sha256sum ./debspawn_0.6.1-1_all.deb | grep fb8a3f588438ff9ef51e713ec1d83306db893f0aa97447565e28bbba9c6e90c6 - sudo apt-get install -y ./debspawn_0.6.1-1_all.deb + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y qemu-user-static + wget http://ftp.us.debian.org/debian/pool/main/d/debspawn/debspawn_0.6.1-1_all.deb + sha256sum ./debspawn_0.6.1-1_all.deb | grep fb8a3f588438ff9ef51e713ec1d83306db893f0aa97447565e28bbba9c6e90c6 + sudo apt-get install -y ./debspawn_0.6.1-1_all.deb - - name: Configure debspawn - run: | - sudo mkdir -p /etc/debspawn/ - echo "AllowUnsafePermissions=true" | sudo tee /etc/debspawn/global.toml + - name: Configure debspawn + run: | + sudo mkdir -p /etc/debspawn/ + echo "AllowUnsafePermissions=true" | sudo tee /etc/debspawn/global.toml - - uses: actions/cache@v3 - with: - path: /var/lib/debspawn - key: ${{ runner.os }}-debspawn-init-bullseye + - uses: actions/cache@v3 + with: + path: /var/lib/debspawn + key: ${{ runner.os }}-debspawn-init-bullseye - - name: Make build container - run: "debspawn list | grep bullseye || debspawn create bullseye" + - name: Make build container + run: "debspawn list | grep bullseye || debspawn create bullseye" - - run: "mkdir -p overlays/deb" + - run: "mkdir -p overlays/deb" - - name: Download dpkg - uses: actions/download-artifact@v3 - with: - name: ${{ matrix.platform }}.deb - path: overlays/deb + - name: Download dpkg + uses: actions/download-artifact@v3 + with: + name: ${{ matrix.platform }}.deb + path: overlays/deb - - name: Run build - run: | - ./run-local-build.sh ${{ matrix.platform }} + - name: Run build + run: | + ./run-local-build.sh ${{ matrix.platform }} - - uses: actions/upload-artifact@v3 - with: - name: ${{ matrix.platform }}.squashfs - path: results/*.squashfs + - uses: actions/upload-artifact@v3 + with: + name: ${{ matrix.platform }}.squashfs + path: results/*.squashfs - - uses: actions/upload-artifact@v3 - with: - name: ${{ matrix.platform }}.iso - path: results/*.iso - if: ${{ matrix.platform != 'raspberrypi' }} + - uses: actions/upload-artifact@v3 + with: + name: ${{ matrix.platform }}.iso + path: results/*.iso + if: ${{ matrix.platform != 'raspberrypi' }} image: name: Build image @@ -151,21 +153,21 @@ jobs: timeout-minutes: 60 needs: [iso] steps: - - uses: actions/checkout@v3 - with: - submodules: recursive + - uses: actions/checkout@v3 + with: + submodules: recursive - - name: Download raspberrypi.squashfs artifact - uses: actions/download-artifact@v3 - with: - name: raspberrypi.squashfs + - name: Download raspberrypi.squashfs artifact + uses: actions/download-artifact@v3 + with: + name: raspberrypi.squashfs - - run: mv startos-*_raspberrypi.squashfs startos.raspberrypi.squashfs + - run: mv startos-*_raspberrypi.squashfs startos.raspberrypi.squashfs - - name: Build image - run: make startos_raspberrypi.img + - name: Build image + run: make startos_raspberrypi.img - - uses: actions/upload-artifact@v3 - with: - name: raspberrypi.img - path: eos-*_raspberrypi.img + - uses: actions/upload-artifact@v3 + with: + name: raspberrypi.img + path: startos-*_raspberrypi.img diff --git a/Makefile b/Makefile index 38018e1fb..2aed23cdf 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ FRONTEND_DIAGNOSTIC_UI_SRC := $(shell find frontend/projects/diagnostic-ui) FRONTEND_INSTALL_WIZARD_SRC := $(shell find frontend/projects/install-wizard) PATCH_DB_CLIENT_SRC := $(shell find patch-db/client -not -path patch-db/client/dist) GZIP_BIN := $(shell which pigz || which gzip) -ALL_TARGETS := $(EMBASSY_BINS) system-images/compat/docker-images/$(ARCH).tar system-images/utils/docker-images/$(ARCH).tar system-images/binfmt/docker-images/$(ARCH).tar $(EMBASSY_SRC) $(ENVIRONMENT_FILE) $(GIT_HASH_FILE) $(VERSION_FILE) +ALL_TARGETS := $(EMBASSY_BINS) system-images/compat/docker-images/$(ARCH).tar system-images/utils/docker-images/$(ARCH).tar system-images/binfmt/docker-images/$(ARCH).tar $(EMBASSY_SRC) $(shell if [ "$(OS_ARCH)" = "raspberrypi" ]; then echo cargo-deps/aarch64-unknown-linux-gnu/release/pi-beep; fi) $(ENVIRONMENT_FILE) $(GIT_HASH_FILE) $(VERSION_FILE) ifeq ($(REMOTE),) mkdir = mkdir -p $1 @@ -75,6 +75,7 @@ install: $(ALL_TARGETS) $(call cp,backend/target/$(ARCH)-unknown-linux-gnu/release/embassyd,$(DESTDIR)/usr/bin/embassyd) $(call cp,backend/target/$(ARCH)-unknown-linux-gnu/release/embassy-cli,$(DESTDIR)/usr/bin/embassy-cli) $(call cp,backend/target/$(ARCH)-unknown-linux-gnu/release/avahi-alias,$(DESTDIR)/usr/bin/avahi-alias) + if [ "$(OS_ARCH)" = "raspberrypi" ]; then $(call cp,cargo-deps/aarch64-unknown-linux-gnu/release/pi-beep,$(DESTDIR)/usr/bin/pi-beep); fi $(call mkdir,$(DESTDIR)/usr/lib) $(call rm,$(DESTDIR)/usr/lib/embassy) diff --git a/backend/src/system.rs b/backend/src/system.rs index ae5cc6a21..17819689c 100644 --- a/backend/src/system.rs +++ b/backend/src/system.rs @@ -6,6 +6,7 @@ use futures::FutureExt; use rpc_toolkit::command; use rpc_toolkit::yajrc::RpcError; use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use tokio::process::Command; use tokio::sync::broadcast::Receiver; use tokio::sync::RwLock; use tracing::instrument; @@ -17,8 +18,8 @@ use crate::logs::{ LogResponse, LogSource, }; use crate::shutdown::Shutdown; -use crate::util::display_none; use crate::util::serde::{display_serializable, IoFormat}; +use crate::util::{display_none, Invoke}; use crate::{Error, ErrorKind, ResultExt}; pub const SYSTEMD_UNIT: &'static str = "embassyd"; @@ -512,13 +513,30 @@ async fn launch_disk_task( #[instrument(skip_all)] async fn get_temp() -> Result { - let temp_file = "/sys/class/thermal/thermal_zone0/temp"; - let milli = tokio::fs::read_to_string(temp_file) - .await - .with_ctx(|_| (crate::ErrorKind::Filesystem, temp_file))? - .trim() - .parse::()?; - Ok(Celsius(milli / 1000.0)) + let temp = serde_json::from_slice::( + &Command::new("sensors") + .arg("-j") + .invoke(ErrorKind::Filesystem) + .await?, + ) + .with_kind(ErrorKind::Deserialization)? + .as_object() + .into_iter() + .flatten() + .flat_map(|(_, v)| v.as_object()) + .flatten() + .flat_map(|(_, v)| v.as_object()) + .flatten() + .filter_map(|(k, v)| { + if k.ends_with("_input") { + v.as_f64() + } else { + None + } + }) + .reduce(f64::max) + .ok_or_else(|| Error::new(eyre!("No temperatures available"), ErrorKind::Filesystem))?; + Ok(Celsius(temp)) } #[derive(Debug, Clone)] diff --git a/build/lib/depends b/build/lib/depends index 885500e3b..b3cf26a57 100644 --- a/build/lib/depends +++ b/build/lib/depends @@ -21,6 +21,7 @@ iotop iw jq libavahi-client3 +lm-sensors lvm2 magic-wormhole ncdu diff --git a/build/lib/scripts/chroot-and-upgrade b/build/lib/scripts/chroot-and-upgrade index 5a50bd1e9..f155176a8 100755 --- a/build/lib/scripts/chroot-and-upgrade +++ b/build/lib/scripts/chroot-and-upgrade @@ -20,16 +20,8 @@ mount --bind /sys /media/embassy/next/sys mount --bind /proc /media/embassy/next/proc mount --bind /boot /media/embassy/next/boot -rm /media/embassy/next/usr/local/bin/apt -rm /media/embassy/next/usr/local/bin/apt-get -rm /media/embassy/next/usr/local/bin/aptitude - chroot /media/embassy/next $@ -ln -sf /usr/lib/embassy/scripts/fake-apt /media/embassy/next/usr/local/bin/apt -ln -sf /usr/lib/embassy/scripts/fake-apt /media/embassy/next/usr/local/bin/apt-get -ln -sf /usr/lib/embassy/scripts/fake-apt /media/embassy/next/usr/local/bin/aptitude - umount /media/embassy/next/run umount /media/embassy/next/dev umount /media/embassy/next/sys diff --git a/build/lib/scripts/postinst b/build/lib/scripts/postinst index 708f45934..550110f2a 100755 --- a/build/lib/scripts/postinst +++ b/build/lib/scripts/postinst @@ -117,4 +117,4 @@ ln -s /usr/lib/embassy/scripts/dhclient-exit-hook /etc/dhcp/dhclient-exit-hooks. rm -f /etc/motd ln -sf /usr/lib/embassy/motd /etc/update-motd.d/00-embassy chmod -x /etc/update-motd.d/* -chmod +x /etc/update-motd.d/00-embassy \ No newline at end of file +chmod +x /etc/update-motd.d/00-embassy diff --git a/build/raspberrypi/cmdline.txt b/build/raspberrypi/cmdline.txt deleted file mode 100644 index 430b56802..000000000 --- a/build/raspberrypi/cmdline.txt +++ /dev/null @@ -1 +0,0 @@ -console=serial0,115200 console=tty1 root=PARTUUID=cb15ae4d-02 rootfstype=ext4 fsck.repair=yes rootwait cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory quiet init=/usr/lib/embassy/scripts/init_resize.sh \ No newline at end of file diff --git a/build/raspberrypi/config.txt b/build/raspberrypi/config.txt deleted file mode 100644 index 17bd5dc4e..000000000 --- a/build/raspberrypi/config.txt +++ /dev/null @@ -1,86 +0,0 @@ -# For more options and information see -# http://rpf.io/configtxt -# Some settings may impact device functionality. See link above for details - -# uncomment if you get no picture on HDMI for a default "safe" mode -#hdmi_safe=1 - -# uncomment the following to adjust overscan. Use positive numbers if console -# goes off screen, and negative if there is too much border -#overscan_left=16 -#overscan_right=16 -#overscan_top=16 -#overscan_bottom=16 - -# uncomment to force a console size. By default it will be display's size minus -# overscan. -#framebuffer_width=1280 -#framebuffer_height=720 - -# uncomment if hdmi display is not detected and composite is being output -#hdmi_force_hotplug=1 - -# uncomment to force a specific HDMI mode (this will force VGA) -#hdmi_group=1 -#hdmi_mode=1 - -# uncomment to force a HDMI mode rather than DVI. This can make audio work in -# DMT (computer monitor) modes -#hdmi_drive=2 - -# uncomment to increase signal to HDMI, if you have interference, blanking, or -# no display -#config_hdmi_boost=4 - -# uncomment for composite PAL -#sdtv_mode=2 - -#uncomment to overclock the arm. 700 MHz is the default. -#arm_freq=800 - -# Uncomment some or all of these to enable the optional hardware interfaces -#dtparam=i2c_arm=on -#dtparam=i2s=on -#dtparam=spi=on - -# Uncomment this to enable infrared communication. -#dtoverlay=gpio-ir,gpio_pin=17 -#dtoverlay=gpio-ir-tx,gpio_pin=18 - -# Additional overlays and parameters are documented /boot/overlays/README - -# Enable audio (loads snd_bcm2835) -dtparam=audio=on - -# Automatically load overlays for detected cameras -camera_auto_detect=1 - -# Automatically load overlays for detected DSI displays -display_auto_detect=1 - -# Enable DRM VC4 V3D driver -dtoverlay=vc4-kms-v3d -max_framebuffers=2 - -# Run in 64-bit mode -arm_64bit=1 - -# Disable compensation for displays with overscan -disable_overscan=1 - -[cm4] -# Enable host mode on the 2711 built-in XHCI USB controller. -# This line should be removed if the legacy DWC2 controller is required -# (e.g. for USB device mode) or if USB support is not required. -otg_mode=1 - -[all] - -[pi4] -# Run as fast as firmware / board allows -arm_boost=1 - -[all] -gpu_mem=16 -dtoverlay=pwm-2chan,disable-bt -initramfs initrd.img-6.1.21-v8+ diff --git a/build/raspberrypi/make-image.sh b/build/raspberrypi/make-image.sh index 5188e24d0..76db9e417 100755 --- a/build/raspberrypi/make-image.sh +++ b/build/raspberrypi/make-image.sh @@ -61,13 +61,9 @@ sudo unsquashfs -f -d $TMPDIR startos.raspberrypi.squashfs REAL_GIT_HASH=$(cat $TMPDIR/usr/lib/embassy/GIT_HASH.txt) REAL_VERSION=$(cat $TMPDIR/usr/lib/embassy/VERSION.txt) REAL_ENVIRONMENT=$(cat $TMPDIR/usr/lib/embassy/ENVIRONMENT.txt) -sudo cp ./build/raspberrypi/cmdline.txt $TMPDIR/boot/ -sudo cp ./build/raspberrypi/config.txt $TMPDIR/boot/ +sudo sed -i 's| boot=embassy| init=/usr/lib/embassy/scripts/init_resize\.sh|' $TMPDIR/boot/cmdline.txt sudo cp ./build/raspberrypi/fstab $TMPDIR/etc/ -sudo mkdir -p $TMPDIR/etc/embassy -sudo cp ./build/raspberrypi/config.yaml $TMPDIR/etc/embassy -sudo cp ./build/raspberrypi/init_resize.sh $TMPDIR//usr/lib/embassy/scripts/init_resize.sh -sudo cp ./cargo-deps/aarch64-unknown-linux-gnu/release/pi-beep $TMPDIR/usr/local/bin/beep +sudo cp ./build/raspberrypi/init_resize.sh $TMPDIR/usr/lib/embassy/scripts/init_resize.sh sudo umount $TMPDIR/boot sudo umount $TMPDIR sudo losetup -d $OUTPUT_DEVICE