├── configs ├── .astroarch.version ├── Xwrapper.config ├── kscreenlockerrc ├── 81-wifi-powersave.rules ├── cmdline.txt ├── 99-v3d.conf ├── 99-arch-gpio.rules ├── 50-networkmanager.rules ├── 50-udiskie.rules ├── startwm.sh ├── 99-polkit-power.rules ├── look-and-feel │ └── astroarch │ │ ├── contents │ │ ├── defaults │ │ └── layouts │ │ │ └── org.kde.plasma.desktop-layout.js │ │ ├── metadata.json │ │ └── metadata.desktop ├── kwinrc ├── layout-templates │ └── astroarchPanel │ │ ├── metadata.json │ │ └── contents │ │ └── layout.js ├── 20-headless.conf ├── smb.conf ├── kde_settings.conf ├── xorg.conf ├── config.txt ├── kdeglobals └── .zshrc ├── wallpapers ├── bubble.jpg ├── pacman.jpg └── south-milky.jpg ├── scripts ├── update-astroarch.sh ├── aa_motd.sh ├── 2.0.5.sh ├── create_ap.sh ├── reset-brcmfmac.sh ├── wallpaper.sh ├── clone_to_usb_bootable.sh ├── resize_partition.sh └── astroarch-tweak-tool.zsh ├── assets └── icons │ ├── novnc-16x16.png │ ├── novnc-24x24.png │ ├── novnc-32x32.png │ ├── novnc-48x48.png │ ├── novnc-72x72.png │ ├── novnc-76x76.png │ ├── novnc-96x96.png │ ├── novnc-120x120.png │ ├── novnc-144x144.png │ ├── novnc-152x152.png │ ├── novnc-192x192.png │ ├── novnc-icon-sm.svg │ └── novnc-icon.svg ├── GUIDE.md ├── systemd ├── autologin.conf ├── resize_once.service ├── create_ap.service ├── novnc.service ├── x0vncserver-xrdp.service └── x0vncserver.service ├── desktop ├── phd2.desktop ├── Alacritty.desktop ├── update-astroarch.desktop ├── astroarch-tweak-tool.desktop ├── org.kde.kstars.desktop └── org.kde.konsole.desktop ├── .github └── FUNDING.yml ├── LICENSE ├── plugins ├── power_max_current │ └── power_max_current.plugin.zsh ├── bluetooth │ └── bluetooth.plugin.zsh ├── ftp │ └── ftp.plugin.zsh └── gps │ └── gps.plugin.zsh ├── CHANGELOG.md ├── code_of_conduct.md ├── create_sddev_rpi5.sh ├── BUILD.md ├── astroarch_build.sh └── README.md /configs/.astroarch.version: -------------------------------------------------------------------------------- 1 | 2.0.4 2 | -------------------------------------------------------------------------------- /configs/Xwrapper.config: -------------------------------------------------------------------------------- 1 | allowed_users=anybody 2 | needs_root_rights=no 3 | -------------------------------------------------------------------------------- /wallpapers/bubble.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devDucks/astroarch/HEAD/wallpapers/bubble.jpg -------------------------------------------------------------------------------- /wallpapers/pacman.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devDucks/astroarch/HEAD/wallpapers/pacman.jpg -------------------------------------------------------------------------------- /configs/kscreenlockerrc: -------------------------------------------------------------------------------- 1 | [Daemon] 2 | Autolock=false 3 | LockGrace=5 4 | LockOnResume=false 5 | Timeout=1 6 | -------------------------------------------------------------------------------- /scripts/update-astroarch.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/bash 2 | 3 | konsole -e '/usr/bin/zsh -i -c update-astroarch' 4 | -------------------------------------------------------------------------------- /wallpapers/south-milky.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devDucks/astroarch/HEAD/wallpapers/south-milky.jpg -------------------------------------------------------------------------------- /assets/icons/novnc-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devDucks/astroarch/HEAD/assets/icons/novnc-16x16.png -------------------------------------------------------------------------------- /assets/icons/novnc-24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devDucks/astroarch/HEAD/assets/icons/novnc-24x24.png -------------------------------------------------------------------------------- /assets/icons/novnc-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devDucks/astroarch/HEAD/assets/icons/novnc-32x32.png -------------------------------------------------------------------------------- /assets/icons/novnc-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devDucks/astroarch/HEAD/assets/icons/novnc-48x48.png -------------------------------------------------------------------------------- /assets/icons/novnc-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devDucks/astroarch/HEAD/assets/icons/novnc-72x72.png -------------------------------------------------------------------------------- /assets/icons/novnc-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devDucks/astroarch/HEAD/assets/icons/novnc-76x76.png -------------------------------------------------------------------------------- /assets/icons/novnc-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devDucks/astroarch/HEAD/assets/icons/novnc-96x96.png -------------------------------------------------------------------------------- /assets/icons/novnc-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devDucks/astroarch/HEAD/assets/icons/novnc-120x120.png -------------------------------------------------------------------------------- /assets/icons/novnc-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devDucks/astroarch/HEAD/assets/icons/novnc-144x144.png -------------------------------------------------------------------------------- /assets/icons/novnc-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devDucks/astroarch/HEAD/assets/icons/novnc-152x152.png -------------------------------------------------------------------------------- /assets/icons/novnc-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devDucks/astroarch/HEAD/assets/icons/novnc-192x192.png -------------------------------------------------------------------------------- /GUIDE.md: -------------------------------------------------------------------------------- 1 | # The guide has been moved to the main README [here](https://github.com/MattBlack85/astroarch/blob/main/README.md) 2 | -------------------------------------------------------------------------------- /scripts/aa_motd.sh: -------------------------------------------------------------------------------- 1 | #echo "There are $(checkupdates | wc -l) packages that can be updated" 2 | neofetch 3 | fortune | cowsay 4 | -------------------------------------------------------------------------------- /configs/81-wifi-powersave.rules: -------------------------------------------------------------------------------- 1 | ACTION=="add", SUBSYSTEM=="net", KERNEL=="wl*", RUN+="/usr/bin/iw dev $name set power_save off" 2 | -------------------------------------------------------------------------------- /configs/cmdline.txt: -------------------------------------------------------------------------------- 1 | root=UUID=c2cea082-7f3e-43e2-b6a1-0c8540d350cc rw rootwait console=tty1 fsck.repair=yes video=HDMI-A-1:1920x1080M@60D 2 | -------------------------------------------------------------------------------- /systemd/autologin.conf: -------------------------------------------------------------------------------- 1 | # This file should be symlinked to /etc/sddm.conf.d/autologin.conf 2 | [Autologin] 3 | User=astronaut 4 | Session=plasma 5 | -------------------------------------------------------------------------------- /configs/99-v3d.conf: -------------------------------------------------------------------------------- 1 | Section "OutputClass" 2 | Identifier "vc4" 3 | MatchDriver "vc4" 4 | Driver "modesetting" 5 | Option "PrimaryGPU" "true" 6 | EndSection 7 | -------------------------------------------------------------------------------- /configs/99-arch-gpio.rules: -------------------------------------------------------------------------------- 1 | SUBSYSTEM=="gpio", KERNEL=="gpiochip*", GROUP:="gpio", MODE:="0660" 2 | SUBSYSTEM=="spidev", KERNEL=="spidev*", GROUP:="spi", MODE:="0660" 3 | -------------------------------------------------------------------------------- /configs/50-networkmanager.rules: -------------------------------------------------------------------------------- 1 | polkit.addRule(function(action, subject) { 2 | if (action.id.indexOf("org.freedesktop.NetworkManager.") == 0 && subject.isInGroup("network")) { 3 | return polkit.Result.YES; 4 | } 5 | }); 6 | -------------------------------------------------------------------------------- /scripts/2.0.5.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Synchronize the system time with the GPS if there is no Real Time Clock (RTC) or network connection to the Raspberry Pi 4 | sed -i '$a\refclock SHM 0 offset 0.5 delay 0.2 refid NMEA' /etc/chrony.conf 5 | -------------------------------------------------------------------------------- /configs/50-udiskie.rules: -------------------------------------------------------------------------------- 1 | polkit.addRule(function(action, subject) { 2 | if (subject.isInGroup("wheel")) { 3 | if (action.id.startsWith("org.freedesktop.udisks2.")) { 4 | return polkit.Result.YES; 5 | } 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /desktop/phd2.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Version=1.0 3 | Encoding=UTF-8 4 | Name=phd2 5 | Comment=PHD Guiding, auto-guiding of your telescope 6 | Exec=phd2 7 | StartupWMClass=phd2.bin 8 | Icon=phd2 9 | Terminal=false 10 | Type=Application 11 | Categories=Education;Science;Astronomy; 12 | GenericName=phd2 13 | -------------------------------------------------------------------------------- /configs/startwm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | STATUS="$(systemctl is-active x0vncserver-xrdp.service)" 3 | if [ "${STATUS}" = "active" ]; then 4 | exit 1 5 | else 6 | systemctl --user -M astronaut@ enable x0vncserver-xrdp 7 | fi 8 | 9 | systemctl --user -M astronaut@ start x0vncserver-xrdp && exec dbus-run-session -- startplasma-x11 10 | -------------------------------------------------------------------------------- /configs/99-polkit-power.rules: -------------------------------------------------------------------------------- 1 | polkit.addRule(function(action, subject) { 2 | if (action.id == "org.freedesktop.login1.power-off" || 3 | action.id == "org.freedesktop.login1.reboot" || 4 | action.id == "org.freedesktop.login1.hibernate" || 5 | action.id == "org.freedesktop.login1.suspend") 6 | { 7 | return polkit.Result.YES; 8 | } 9 | }); -------------------------------------------------------------------------------- /systemd/resize_once.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Extend root partition and resize ext4 file system 3 | After=local-fs.target 4 | Wants=local-fs.target 5 | 6 | [Service] 7 | ExecStart=/bin/bash /home/astronaut/.astroarch/scripts/resize_partition.sh 8 | ExecStop=/bin/systemctl disable resize_once.service 9 | Type=oneshot 10 | 11 | [Install] 12 | WantedBy=multi-user.target 13 | -------------------------------------------------------------------------------- /systemd/create_ap.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Create an AP with a semi random name 3 | After=NetworkManager-wait-online.service 4 | Wants=NetworkManager-wait-online.service 5 | 6 | [Service] 7 | ExecStart=/bin/bash /home/astronaut/.astroarch/scripts/create_ap.sh 8 | ExecStop=/bin/systemctl disable create_ap.service 9 | Type=oneshot 10 | 11 | [Install] 12 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /systemd/novnc.service: -------------------------------------------------------------------------------- 1 | # Symlink this file to /etc/systemd/system/multi-user.target.wants/novnc.service 2 | [Unit] 3 | Description=noVNC Service 4 | After=network.target 5 | 6 | [Service] 7 | Type=idle 8 | DynamicUser=yes 9 | Restart=on-failure 10 | RestartSec=5s 11 | ExecStart=/usr/bin/novnc --listen 8080 --vnc localhost:5900 12 | 13 | [Install] 14 | WantedBy=multi-user.target 15 | -------------------------------------------------------------------------------- /systemd/x0vncserver-xrdp.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Remote desktop service (VNC) for :10 display 3 | After=xrdp.service 4 | 5 | [Service] 6 | Type=simple 7 | Environment=XAUTHORITY=/home/astronaut/.Xauthority 8 | Environment=HOME=/home/astronaut 9 | ExecStart=x0vncserver --rfbport 5910 --display :10 --SecurityTypes None 10 | Restart=on-failure 11 | RestartSec=500ms 12 | 13 | [Install] 14 | WantedBy=default.target 15 | -------------------------------------------------------------------------------- /desktop/Alacritty.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | TryExec=alacritty 4 | Exec=alacritty 5 | Icon=Alacritty 6 | Terminal=false 7 | Categories=System;TerminalEmulator; 8 | 9 | Name=Alacritty 10 | GenericName=Terminal 11 | Comment=A fast, cross-platform, OpenGL terminal emulator 12 | StartupWMClass=Alacritty 13 | Actions=New; 14 | 15 | X-Desktop-File-Install-Version=0.26 16 | 17 | [Desktop Action New] 18 | Name=New Terminal 19 | Exec=alacritty 20 | -------------------------------------------------------------------------------- /desktop/update-astroarch.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Comment= 3 | Comment= 4 | Exec=/home/astronaut/.astroarch/scripts/update-astroarch.sh 5 | GenericName= 6 | GenericName= 7 | Icon=application-x-shellscript 8 | MimeType= 9 | Name=update-astroarch.sh 10 | Name=update-astroarch.sh 11 | Path= 12 | StartupNotify=true 13 | Terminal=false 14 | TerminalOptions= 15 | Type=Application 16 | X-KDE-AutostartScript=true 17 | X-KDE-SubstituteUID=false 18 | X-KDE-Username= 19 | -------------------------------------------------------------------------------- /systemd/x0vncserver.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Remote desktop service (VNC) for :0 display 3 | Requires=display-manager.service 4 | After=display-manager.service 5 | 6 | [Service] 7 | Type=simple 8 | ExecStartPre=/usr/bin/bash -c "/usr/bin/systemctl set-environment XAUTHORITY=$(find /var/run/sddm/ -type f)" 9 | Environment=HOME=/root 10 | ExecStart=x0vncserver -AlwaysShared -CompareFB 0 -display :0 -SecurityTypes None 11 | Restart=on-failure 12 | RestartSec=500ms 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | -------------------------------------------------------------------------------- /configs/look-and-feel/astroarch/contents/defaults: -------------------------------------------------------------------------------- 1 | [kcminputrc][Mouse] 2 | cursorTheme=breeze_cursors 3 | 4 | [kdeglobals][General] 5 | ColorScheme=BreezeDark 6 | 7 | [kdeglobals][Icons] 8 | Theme=breeze-dark 9 | 10 | [kdeglobals][KDE] 11 | widgetStyle=Breeze 12 | 13 | [kwinrc][DesktopSwitcher] 14 | LayoutName=org.kde.breeze.desktop 15 | 16 | [kwinrc][WindowSwitcher] 17 | LayoutName=org.kde.breeze.desktop 18 | 19 | [kwinrc][org.kde.kdecoration2] 20 | library=org.kde.breeze 21 | theme=Breeze 22 | 23 | [plasmarc][Theme] 24 | name=default 25 | -------------------------------------------------------------------------------- /configs/kwinrc: -------------------------------------------------------------------------------- 1 | [$Version] 2 | update_info=kwin.upd:replace-scalein-with-scale,kwin.upd:port-minimizeanimation-effect-to-js,kwin.upd:port-scale-effect-to-js,kwin.upd:port-dimscreen-effect-to-js,kwin.upd:auto-bordersize,kwin.upd:animation-speed,kwin.upd:desktop-grid-click-behavior,kwin.upd:no-swap-encourage,kwin.upd:make-translucency-effect-disabled-by-default,kwin.upd:remove-flip-switch-effect,kwin.upd:remove-cover-switch-effect,kwin.upd:remove-cubeslide-effect,kwin.upd:remove-xrender-backend,kwin.upd:enable-scale-effect-by-default 3 | 4 | [Compositing] 5 | OpenGLIsUnsafe=false 6 | -------------------------------------------------------------------------------- /scripts/create_ap.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | CONN_NAME=astroarch-hotspot 4 | SSID=$(tr -dc A-Za-z0-9 /dev/null 8 | fi 9 | 10 | # If the line (commented or uncommented) exists anywhere 11 | if grep -Eq "^[#[:space:]]*usb_max_current_enable=" "$cfg"; then 12 | # Normalize it — uncomment and set to 1 13 | sudo sed -i 's/^[#[:space:]]*usb_max_current_enable=.*/usb_max_current_enable=1/' "$cfg" 14 | echo "🎉 Maximum current setting corrected and activated" 15 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Maximum Current' "🎉 Maximum current setting corrected and activated" 16 | else 17 | # Add it right after [pi5] 18 | sudo sed -i '/^\[pi5\]/a usb_max_current_enable=1' "$cfg" 19 | echo "Maximum current activation line added under [pi5]." 20 | echo "✅ Maximum current activation line added under [pi5] is done after restart" 21 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Maximum Current' "✅ Maximum current activation line added under [pi5] is done after restart" 22 | fi 23 | } 24 | -------------------------------------------------------------------------------- /configs/xorg.conf: -------------------------------------------------------------------------------- 1 | Section "Module" 2 | Load "dri2" 3 | Load "glamoregl" 4 | EndSection 5 | 6 | Section "DRI" 7 | Mode 0666 8 | EndSection 9 | 10 | Section "ServerLayout" 11 | Identifier "Main Layout" 12 | Screen 0 "Screen 1" 13 | Screen 1 "Screen 0" 14 | EndSection 15 | 16 | Section "Monitor" 17 | Identifier "Monitor0" 18 | HorizSync 28.0-80.0 19 | VertRefresh 48.0-75.0 20 | Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync 21 | EndSection 22 | 23 | Section "Device" 24 | Identifier "Dummycard0" 25 | Driver "dummy" 26 | VideoRam 192000 27 | EndSection 28 | 29 | Section "Screen" 30 | DefaultDepth 24 31 | Identifier "Screen0" 32 | Device "Dummycard0" 33 | Monitor "Monitor0" 34 | SubSection "Display" 35 | Depth 24 36 | Virtual 1920 1080 37 | Modes "1920x1080_60.00" 38 | EndSubSection 39 | EndSection 40 | 41 | Section "Monitor" 42 | Identifier "Monitor1" 43 | HorizSync 28.0-80.0 44 | VertRefresh 48.0-75.0 45 | Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync 46 | EndSection 47 | 48 | Section "Device" 49 | Identifier "hdmi-a-1" 50 | Driver "modesetting" 51 | Option "DRI2" "2" 52 | Option "AccelMethod" "glamor" 53 | EndSection 54 | 55 | Section "Screen" 56 | DefaultDepth 24 57 | Identifier "Screen1" 58 | Device "hdmi-a-1" 59 | Monitor "Monitor1" 60 | SubSection "Display" 61 | Depth 24 62 | Modes "1920x1080_60.00" 63 | EndSubSection 64 | EndSection 65 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [1.8] 2024-02-27 4 | 5 | If you are upgrading from 1.7, the upgrade is too complex to script so please download the new image and flash it - sorry for any trouble! 6 | 7 | Additionally, be aware that it is very likely that 1.7 will break after 2024-03-17 as one of the package `sddm` won't be pinned anymore and it is likely to break the system, please upgrade before that date or don't run `update-astroarch` 8 | 9 | ### Fixed 10 | - the dark them has no more striped bug or incomplete colouring 11 | - fixed polkit rules and group permission, now reboot and shutdown won't emit any error 12 | 13 | ### Removed 14 | - x11vnc - this was breaking the UI theme and has been dumped, farewell! 15 | - vnc clipboard, tigervnc doesn't support clipboard paste 16 | 17 | ### Added 18 | - discovery - you can now use a graphical program to find, add or remove software 19 | - update notification - if there will be some packages to be updated, a bell will appear 20 | - HDMI - AstroArch supports now both VNC and HDMI! 21 | - use `UUID` instead of `/dev/X`, this will allow to boot the same image from SD, USB, HDD or NVMe with no manual changes (previously required) 22 | - better initial support for Pi 5, some configs are baked especially for your pi5 23 | - tigervnc as VNC server, this will add some nice performance boost to VNC 24 | 25 | ### Changed 26 | - the default wallpaper is now a slideshow 27 | - resizing partition at first boot now works with every media automatically 28 | - the access point now has a small prefix e.g `AstroArch-XXXXX` where X are random chars 29 | -------------------------------------------------------------------------------- /configs/config.txt: -------------------------------------------------------------------------------- 1 | # For more options and information see: 2 | # http://rptl.io/configtxt 3 | 4 | initramfs initramfs-linux.img followkernel 5 | 6 | # Uncomment some or all of these to enable the optional hardware interfaces 7 | dtparam=i2c_arm=on 8 | #dtparam=i2s=on 9 | dtparam=spi=on 10 | 11 | # Additional overlays and parameters are documented 12 | # /boot/firmware/overlays/README 13 | 14 | # Automatically load overlays for detected cameras 15 | camera_auto_detect=1 16 | 17 | # Automatically load overlays for detected DSI displays 18 | display_auto_detect=1 19 | 20 | # Automatically load initramfs files, if found 21 | auto_initramfs=1 22 | 23 | # Enable DRM VC4 V3D driver 24 | dtoverlay=vc4-kms-v3d 25 | max_framebuffers=2 26 | #framebuffer_depth=24 27 | 28 | # Don't have the firmware create an initial video= setting in cmdline.txt. 29 | # Use the kernel's default instead. 30 | disable_fw_kms_setup=1 31 | 32 | # Disable compensation for displays with overscan 33 | disable_overscan=1 34 | 35 | # Uncomment if hdmi display is not detected and composite is being output 36 | #hdmi_force_hotplug=1 37 | 38 | # Uncomment if you want to disable wifi or bluetooth respectively 39 | #dtoverlay=disable-wifi 40 | #dtoverlay=disable-bt 41 | 42 | # Uncomment this to enable infrared communication. 43 | #dtoverlay=gpio-ir,gpio_pin=17 44 | #dtoverlay=gpio-ir-tx,gpio_pin=18 45 | 46 | # Run in 64-bit mode 47 | arm_64bit=1 48 | 49 | # Run as fast as firmware / board allows 50 | arm_boost=1 51 | 52 | [cm4] 53 | # Enable host mode on the 2711 built-in XHCI USB controller. 54 | # This line should be removed if the legacy DWC2 controller is required 55 | # (e.g. for USB device mode) or if USB support is not required. 56 | otg_mode=1 57 | 58 | [all] 59 | dtparam=i2c_arm=on 60 | dtparam=audio=on 61 | disable_overscan=1 62 | gpu_mem=256 63 | #disable_splash=1 64 | 3dtparam=krnbt=on 65 | #hdmi_drive=2 66 | dtoverlay=i2c-rtc 67 | kernel=kernel8.img 68 | hdmi_enable_4kp60=1 69 | enable_uart=1 70 | 71 | [pi5] 72 | dtparam=rtc_bbat_vchg=3000000 73 | -------------------------------------------------------------------------------- /plugins/bluetooth/bluetooth.plugin.zsh: -------------------------------------------------------------------------------- 1 | function _check_bluez_installed() 2 | { 3 | check=$(pacman -Q | grep 'bluez|bluez-utils|bluez-hid2hci|bluedevil') 4 | if [[ $check -eq 0 ]]; then 5 | echo "📦 Bluetooth packages not installed, installing them now..." 6 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'BLUETOOTH' "📦 Bluetooth packages not installed, installing them now..." 7 | yes | LC_ALL=en_US.UTF-8 sudo pacman -S bluez bluez-utils bluez-hid2hci bluedevil 8 | sudo sed -i 's/#DiscoverableTimeout=0/DiscoverableTimeout=0/g' /etc/bluetooth/main.conf 9 | sudo sed -i 's/#AlwaysPairable=true/AlwaysPairable=true/g' /etc/bluetooth/main.conf 10 | sudo sed -i 's/#PairableTimeout=0/PairableTimeout=0/g' /etc/bluetooth/main.conf 11 | sudo sed -i 's/#AutoEnable=true/AutoEnable=true/g' /etc/bluetooth/main.conf 12 | echo "✅ Bluetooth packages installed!" 13 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'BLUETOOTH' "✅ Bluetooth packages installed!" 14 | fi 15 | } 16 | 17 | function bluetooth_on() 18 | { 19 | _check_bluez_installed 20 | sudo systemctl enable bluetooth.service --now 21 | echo "🎉 Bluetooth server is ON and enabled to autostart at every boot" 22 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'BLUETOOTH' "🎉 Bluetooth server is ON and enabled to autostart at every boot" 23 | } 24 | 25 | function bluetooth_off() 26 | { 27 | sudo systemctl disable bluetooth.service --now 28 | echo "🛑 Bluetooth server disabled. Remember to re-enable it if you want it to start automatically at boot" 29 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'BLUETOOTH' "🛑 Bluetooth server disabled. Remember to re-enable it if you want it to start automatically at boot" 30 | } 31 | 32 | function bluetooth_remove() 33 | { 34 | yes | LC_ALL=en_US.UTF-8 sudo pacman -Rcs bluez bluez-utils bluez-hid2hci bluedevil 35 | echo "🗑️ Bluetooth server remove" 36 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'BLUETOOTH' "🗑️ Bluetooth server remove" 37 | } 38 | -------------------------------------------------------------------------------- /code_of_conduct.md: -------------------------------------------------------------------------------- 1 | 2 | **Code of Conduct** 3 | 4 | All participants of astroarch are expected to abide by our Code of Conduct, both online and during in-person events that are hosted and/or associated with Mattia Procopio. 5 | 6 | **The Pledge** 7 | 8 | In the interest of fostering an open and welcoming environment, we pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 9 | The Standards 10 | 11 | Examples of behaviour that contributes to creating a positive environment include: 12 | 13 | Using welcoming and inclusive language 14 | Being respectful of differing viewpoints and experiences 15 | Gracefully accepting constructive criticism 16 | Referring to people by their preferred pronouns and using gender-neutral pronouns when uncertain 17 | 18 | Examples of unacceptable behaviour by participants include: 19 | 20 | Trolling, insulting/derogatory comments, public or private harassment 21 | Publishing others' private information, such as a physical or electronic address, without explicit permission 22 | Not being respectful to reasonable communication boundaries, such as 'leave me alone,' 'go away,' or 'I’m not discussing this with you.' 23 | The usage of sexualised language or imagery and unwelcome sexual attention or advances 24 | Swearing, usage of strong or disturbing language 25 | Demonstrating the graphics or any other content you know may be considered disturbing 26 | Starting and/or participating in arguments related to politics 27 | Assuming or promoting any kind of inequality including but not limited to: age, body size, disability, ethnicity, gender identity and expression, nationality and race, personal appearance, religion, or sexual identity and orientation 28 | Drug promotion of any kind 29 | Attacking personal tastes 30 | Other conduct which you know could reasonably be considered inappropriate in a professional setting. 31 | 32 | **Enforcement** 33 | 34 | Violations of the Code of Conduct may be reported by sending an email to promat85+report@gmail.com. All reports will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Further details of specific enforcement policies may be posted separately. 35 | 36 | We hold the right and responsibility to remove comments or other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any members for other behaviours that they deem inappropriate, threatening, offensive, or harmful. 37 | Attribution 38 | 39 | This Code of Conduct is adapted from dev.to. 40 | -------------------------------------------------------------------------------- /configs/layout-templates/astroarchPanel/contents/layout.js: -------------------------------------------------------------------------------- 1 | var panel = new Panel 2 | var panelScreen = panel.screen 3 | 4 | // No need to set panel.location as ShellCorona::addPanel will automatically pick one available edge 5 | 6 | // For an Icons-Only Task Manager on the bottom, *3 is too much, *2 is too little 7 | // Round down to next highest even number since the Panel size widget only displays 8 | // even numbers 9 | panel.height = 2 * Math.floor(gridUnit * 2.5 / 2) 10 | 11 | // Restrict horizontal panel to a maximum size of a 21:9 monitor 12 | const maximumAspectRatio = 21/9; 13 | if (panel.formFactor === "horizontal") { 14 | const geo = screenGeometry(panelScreen); 15 | const maximumWidth = Math.ceil(geo.height * maximumAspectRatio); 16 | 17 | if (geo.width > maximumWidth) { 18 | panel.alignment = "center"; 19 | panel.minimumLength = maximumWidth; 20 | panel.maximumLength = maximumWidth; 21 | } 22 | } 23 | 24 | panel.addWidget("org.kde.plasma.kickoff") 25 | //panel.addWidget("org.kde.plasma.showActivityManager") 26 | panel.addWidget("org.kde.plasma.pager") 27 | panel.addWidget("org.kde.plasma.icontasks") 28 | panel.addWidget("org.kde.plasma.marginsseparator") 29 | 30 | /* Next up is determining whether to add the Input Method Panel 31 | * widget to the panel or not. This is done based on whether 32 | * the system locale's language id is a member of the following 33 | * white list of languages which are known to pull in one of 34 | * our supported IME backends when chosen during installation 35 | * of common distributions. */ 36 | 37 | var langIds = ["as", // Assamese 38 | "bn", // Bengali 39 | "bo", // Tibetan 40 | "brx", // Bodo 41 | "doi", // Dogri 42 | "gu", // Gujarati 43 | "hi", // Hindi 44 | "ja", // Japanese 45 | "kn", // Kannada 46 | "ko", // Korean 47 | "kok", // Konkani 48 | "ks", // Kashmiri 49 | "lep", // Lepcha 50 | "mai", // Maithili 51 | "ml", // Malayalam 52 | "mni", // Manipuri 53 | "mr", // Marathi 54 | "ne", // Nepali 55 | "or", // Odia 56 | "pa", // Punjabi 57 | "sa", // Sanskrit 58 | "sat", // Santali 59 | "sd", // Sindhi 60 | "si", // Sinhala 61 | "ta", // Tamil 62 | "te", // Telugu 63 | "th", // Thai 64 | "ur", // Urdu 65 | "vi", // Vietnamese 66 | "zh_CN", // Simplified Chinese 67 | "zh_TW"] // Traditional Chinese 68 | 69 | if (langIds.indexOf(languageId) != -1) { 70 | panel.addWidget("org.kde.plasma.kimpanel"); 71 | } 72 | 73 | panel.addWidget("org.kde.plasma.systemtray") 74 | panel.addWidget("org.kde.plasma.digitalclock") 75 | panel.addWidget("org.kde.plasma.showdesktop") 76 | 77 | -------------------------------------------------------------------------------- /plugins/ftp/ftp.plugin.zsh: -------------------------------------------------------------------------------- 1 | function _check_vsftpd_installed() 2 | { 3 | if pacman -Qs 'vsftpd' > /dev/null ; then 4 | echo "✅ FTP packages are already installed" 5 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'FTP' "✅ FTP packages are already installed" 6 | else 7 | echo "📦 FTP packages not installed, installing them now..." 8 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'FTP' "📦 FTP packages not installed, installing them now..." 9 | yes | LC_ALL=en_US.UTF-8 sudo pacman -S vsftpd 10 | sudo sed -i 's/#write_enable=YES/write_enable=YES/g' /etc/vsftpd.conf 11 | sudo sed -i 's/#local_enable=YES/local_enable=YES/g' /etc/vsftpd.conf 12 | sudo sed -i 's/#local_umask=022/local_umask=022/g' /etc/vsftpd.conf 13 | sudo sed -i 's/#ascii_upload_enable=YES/ascii_upload_enable=YES/g' /etc/vsftpd.conf 14 | sudo sed -i 's/#ascii_download_enable=YES/ascii_download_enable=YES/g' /etc/vsftpd.conf 15 | sudo sed -i 's/#chroot_list_enable=YES/chroot_list_enable=YES/g' /etc/vsftpd.conf 16 | sudo sed -i 's:#chroot_list_file=/etc/vsftpd.chroot_list:chroot_list_file=/etc/vsftpd.chroot_list:g' /etc/vsftpd.conf 17 | sudo sed -i 's/#ls_recurse_enable=YES/ls_recurse_enable=YES/g' /etc/vsftpd.conf 18 | sudo sed -i '$alocal_root=public_html' /etc/vsftpd.conf 19 | sudo sed -i '$aseccomp_sandbox=NO' /etc/vsftpd.conf 20 | sudo touch /etc/vsftpd.chroot_list 21 | sudo sed -i '$aastronaut' /etc/vsftpd.chroot_list 22 | sudo rm /etc/hosts.allow 23 | sudo touch /etc/hosts.allow 24 | sudo sh -c "echo 'vsftpd: ALL' >> /etc/hosts.allow" 25 | sudo sh -c "echo 'vsftpd: 10.0.0.0/255.255.255.0' >> /etc/hosts.allow" 26 | echo "✅ FTP packages installed!" 27 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'FTP' "✅ FTP packages installed!" 28 | fi 29 | } 30 | 31 | function ftp_on() 32 | { 33 | _check_vsftpd_installed 34 | sudo systemctl enable vsftpd.service --now 35 | echo "🎉 FTP server is ON and enabled to autostart at every boot" 36 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'FTP' "🎉 FTP server is ON and enabled to autostart at every boot" 37 | } 38 | 39 | function ftp_off() 40 | { 41 | sudo systemctl disable vsftpd.service --now 42 | echo "🛑 FTP server disabled. Remember to re-enable it if you want it to start automatically at boot" 43 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'FTP' "🛑 FTP server disabled. Remember to re-enable it if you want it to start automatically at boot" 44 | } 45 | 46 | function ftp_remove() 47 | { 48 | sudo systemctl disable vsftpd.service --now 49 | yes | LC_ALL=en_US.UTF-8 sudo pacman -Rcs vsftpd 50 | sudo rm /etc/vsftpd.chroot_list 51 | echo "🗑️ FTP server remove" 52 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'FTP' "🗑️ FTP server remove" 53 | } 54 | -------------------------------------------------------------------------------- /create_sddev_rpi5.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # put your device here 4 | SDDEV=/dev/sde 5 | 6 | SDPARTBOOT="${SDDEV}1" 7 | SDPARTROOT="${SDDEV}2" 8 | WORKDIR=${HOME}/arch-install 9 | SDMOUNT=${WORKDIR}/sd 10 | LINUXRPI=${WORKDIR}/linux-rpi 11 | 12 | # creating directories 13 | 14 | sudo umount $SDPARTBOOT 15 | sudo umount $SDPARTROOT 16 | 17 | mkdir -p ${SDMOUNT} 18 | mkdir -p ${LINUXRPI} 19 | 20 | pushd ${WORKDIR}/ 21 | 22 | echo "" 23 | echo "====== Download ======" 24 | echo "" 25 | 26 | wget -nc http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz 27 | 28 | # download core.db to search for the latest linux-rpi to get the bootloader 29 | base="http://mirror.archlinuxarm.org/aarch64/core" 30 | 31 | if [ ! -f "core.db.tar.gz" ]; then 32 | curl -JLO ${base}/core.db.tar.gz 33 | else 34 | echo "File ‘core.db.tar.gz’ already there; not retrieving." 35 | fi 36 | 37 | # search for latest version of the file to download 38 | latest_pkg=$(tar -tzf core.db.tar.gz \ 39 | | grep -E '^linux-rpi-[0-9]+\.[0-9]+\.[0-9]+-[0-9]+/desc$' \ 40 | | while read f; do 41 | tar -xOzf core.db.tar.gz "$f" | awk '/%FILENAME%/{getline; print}' 42 | done | grep 'aarch64' | sort -V | tail -n1) 43 | 44 | 45 | # and download it 46 | if [ ! -f "${latest_pkg}" ]; then 47 | curl -JLO "${base}/${latest_pkg}" 48 | else 49 | echo "File ‘${latest_pkg}’ already there; not retrieving." 50 | fi 51 | 52 | echo 53 | echo " - Extracting linux-rpi" 54 | rm -rf ${LINUXRPI}/* # clean folder 55 | tar -xf "${latest_pkg}" -C "${LINUXRPI}/" 56 | echo " - done" 57 | 58 | 59 | echo "" 60 | echo "====== Disk Partition ======" 61 | echo "" 62 | 63 | # clear partitions 64 | sudo sfdisk --wipe always --delete $SDDEV 65 | 66 | # create partitions 67 | sudo sfdisk --quiet --wipe always $SDDEV << EOF 68 | ,+512M,0c, 69 | ,,, 70 | EOF 71 | 72 | # formatting the partitions 73 | sudo mkfs.vfat -F 32 $SDPARTBOOT 74 | sudo mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0 -F $SDPARTROOT 75 | 76 | sudo mount $SDPARTROOT ${SDMOUNT} 77 | sudo mkdir -p ${SDMOUNT}/boot 78 | sudo mount $SDPARTBOOT ${SDMOUNT}/boot 79 | 80 | # exit 1 81 | echo "" 82 | echo "====== Mount and copy Bootloader ======" 83 | echo "" 84 | 85 | echo "- copying root folder..." 86 | sudo bsdtar -xpf "${WORKDIR}/ArchLinuxARM-rpi-aarch64-latest.tar.gz" -C "$SDMOUNT" 87 | echo "- done" 88 | 89 | # remove u-boot and copy bootloader from archlinux 90 | sudo rm -rf ${SDMOUNT}/boot/* 91 | sudo cp -rf ${LINUXRPI}/boot/* ${SDMOUNT}/boot/ 92 | 93 | 94 | echo "" 95 | echo "====== Setup SSH ======" 96 | echo "" 97 | 98 | # change authentication with password in sshd_config 99 | sudo sed -i \ 100 | -e 's/^#\?PermitRootLogin .*/PermitRootLogin yes/' \ 101 | -e 's/^#\?PasswordAuthentication .*/PasswordAuthentication yes/' \ 102 | ${SDMOUNT}/etc/ssh/sshd_config 103 | 104 | echo "- done." 105 | echo " " 106 | echo "- Unmount SD card" 107 | 108 | # unmount 109 | sudo umount $SDPARTBOOT 110 | sudo umount $SDPARTROOT 111 | echo "- done." 112 | echo " " 113 | echo "============ Finish ==============" 114 | echo " " 115 | echo " " 116 | echo "When booting on your raspberry with (user: root ; passw: root) run this commands:" 117 | echo " " 118 | echo "> pacman-key --init" 119 | echo "> pacman-key --populate archlinuxarm" 120 | echo " " 121 | echo "> pacman -R linux-aarch64 uboot-raspberrypi" 122 | echo "> pacman -Syu --overwrite \"/boot/*\" linux-rpi" 123 | echo " " 124 | echo "> reboot" 125 | popd 126 | 127 | 128 | -------------------------------------------------------------------------------- /configs/kdeglobals: -------------------------------------------------------------------------------- 1 | [ColorEffects:Disabled] 2 | ChangeSelectionColor= 3 | Color=56,56,56 4 | ColorAmount=0 5 | ColorEffect=0 6 | ContrastAmount=0.65 7 | ContrastEffect=1 8 | Enable= 9 | IntensityAmount=0.1 10 | IntensityEffect=2 11 | 12 | [ColorEffects:Inactive] 13 | ChangeSelectionColor=true 14 | Color=112,111,110 15 | ColorAmount=0.025 16 | ColorEffect=2 17 | ContrastAmount=0.1 18 | ContrastEffect=2 19 | Enable=false 20 | IntensityAmount=0 21 | IntensityEffect=0 22 | 23 | [Colors:Button] 24 | BackgroundAlternate=30,87,116 25 | BackgroundNormal=41,44,48 26 | DecorationFocus=61,174,233 27 | DecorationHover=61,174,233 28 | ForegroundActive=61,174,233 29 | ForegroundInactive=161,169,177 30 | ForegroundLink=29,153,243 31 | ForegroundNegative=218,68,83 32 | ForegroundNeutral=246,116,0 33 | ForegroundNormal=252,252,252 34 | ForegroundPositive=39,174,96 35 | ForegroundVisited=155,89,182 36 | 37 | [Colors:Complementary] 38 | BackgroundAlternate=30,87,116 39 | BackgroundNormal=32,35,38 40 | DecorationFocus=61,174,233 41 | DecorationHover=61,174,233 42 | ForegroundActive=61,174,233 43 | ForegroundInactive=161,169,177 44 | ForegroundLink=29,153,243 45 | ForegroundNegative=218,68,83 46 | ForegroundNeutral=246,116,0 47 | ForegroundNormal=252,252,252 48 | ForegroundPositive=39,174,96 49 | ForegroundVisited=155,89,182 50 | 51 | [Colors:Header] 52 | BackgroundAlternate=32,35,38 53 | BackgroundNormal=41,44,48 54 | DecorationFocus=61,174,233 55 | DecorationHover=61,174,233 56 | ForegroundActive=61,174,233 57 | ForegroundInactive=161,169,177 58 | ForegroundLink=29,153,243 59 | ForegroundNegative=218,68,83 60 | ForegroundNeutral=246,116,0 61 | ForegroundNormal=252,252,252 62 | ForegroundPositive=39,174,96 63 | ForegroundVisited=155,89,182 64 | 65 | [Colors:Header][Inactive] 66 | BackgroundAlternate=41,44,48 67 | BackgroundNormal=32,35,38 68 | DecorationFocus=61,174,233 69 | DecorationHover=61,174,233 70 | ForegroundActive=61,174,233 71 | ForegroundInactive=161,169,177 72 | ForegroundLink=29,153,243 73 | ForegroundNegative=218,68,83 74 | ForegroundNeutral=246,116,0 75 | ForegroundNormal=252,252,252 76 | ForegroundPositive=39,174,96 77 | ForegroundVisited=155,89,182 78 | 79 | [Colors:Selection] 80 | BackgroundAlternate=30,87,116 81 | BackgroundNormal=61,174,233 82 | DecorationFocus=61,174,233 83 | DecorationHover=61,174,233 84 | ForegroundActive=252,252,252 85 | ForegroundInactive=161,169,177 86 | ForegroundLink=253,188,75 87 | ForegroundNegative=176,55,69 88 | ForegroundNeutral=198,92,0 89 | ForegroundNormal=252,252,252 90 | ForegroundPositive=23,104,57 91 | ForegroundVisited=155,89,182 92 | 93 | [Colors:Tooltip] 94 | BackgroundAlternate=32,35,38 95 | BackgroundNormal=41,44,48 96 | DecorationFocus=61,174,233 97 | DecorationHover=61,174,233 98 | ForegroundActive=61,174,233 99 | ForegroundInactive=161,169,177 100 | ForegroundLink=29,153,243 101 | ForegroundNegative=218,68,83 102 | ForegroundNeutral=246,116,0 103 | ForegroundNormal=252,252,252 104 | ForegroundPositive=39,174,96 105 | ForegroundVisited=155,89,182 106 | 107 | [Colors:View] 108 | BackgroundAlternate=29,31,34 109 | BackgroundNormal=20,22,24 110 | DecorationFocus=61,174,233 111 | DecorationHover=61,174,233 112 | ForegroundActive=61,174,233 113 | ForegroundInactive=161,169,177 114 | ForegroundLink=29,153,243 115 | ForegroundNegative=218,68,83 116 | ForegroundNeutral=246,116,0 117 | ForegroundNormal=252,252,252 118 | ForegroundPositive=39,174,96 119 | ForegroundVisited=155,89,182 120 | 121 | [Colors:Window] 122 | BackgroundAlternate=41,44,48 123 | BackgroundNormal=32,35,38 124 | DecorationFocus=61,174,233 125 | DecorationHover=61,174,233 126 | ForegroundActive=61,174,233 127 | ForegroundInactive=161,169,177 128 | ForegroundLink=29,153,243 129 | ForegroundNegative=218,68,83 130 | ForegroundNeutral=246,116,0 131 | ForegroundNormal=252,252,252 132 | ForegroundPositive=39,174,96 133 | ForegroundVisited=155,89,182 134 | 135 | [General] 136 | ColorSchemeHash=9f63c7711a13123582e720791ea0f8c0172977d2 137 | ColorScheme=BreezeDark 138 | 139 | [KDE] 140 | LookAndFeelPackage=astroarch 141 | 142 | [QtQuickRendererSettings] 143 | RenderLoop=basic 144 | SceneGraphBackend=opengl 145 | 146 | [WM] 147 | activeBackground=39,44,49 148 | activeBlend=252,252,252 149 | activeForeground=252,252,252 150 | inactiveBackground=32,36,40 151 | inactiveBlend=161,169,177 152 | inactiveForeground=161,169,177 153 | -------------------------------------------------------------------------------- /scripts/astroarch-tweak-tool.zsh: -------------------------------------------------------------------------------- 1 | #!/bin/zsh 2 | result=$(kdialog --menu "Select action" 1 "Update-astroarch" 2 "Set GPS" 3 "Set Bluetooth" 4 "Set FTP" 5 "Rollback Kstars/Indi" 6 "Install Kstars/Indi stable/bleeding-edge" --title "AstroArch Tweak Tool") 3 | source ~/.zshrc 4 | case $result in 5 | 1) 6 | update-astroarch 7 | if [ $? -eq 0 ] ; then 8 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Update AstroArch' 'Update completed' 9 | else 10 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Update AstroArch' 'Update returns an error' 11 | fi 12 | ;; 13 | 2) 14 | gps=$(kdialog --menu "Select action" 1 "Activate GPS" 2 "Stop GPS" --title "AstroArch GPS") 15 | case $gps in 16 | 1) 17 | gps_on 18 | ;; 19 | 2) 20 | gps_off 21 | ;; 22 | esac 23 | ;; 24 | 3) 25 | bluetooth=$(kdialog --combobox "Select action for Bluetooth" "ON" "OFF" --title "AstroArch bluetooth") 26 | case $bluetooth in 27 | ON) 28 | bluetooth_on 29 | ;; 30 | OFF) 31 | bluetooth_off 32 | ;; 33 | esac 34 | ;; 35 | 4) 36 | ftp=$(kdialog --combobox "Select action for FTP" "ON" "OFF" --title "AstroArch FTP") 37 | case $ftp in 38 | ON) 39 | ftp_on 40 | ;; 41 | OFF) 42 | ftp_off 43 | ;; 44 | esac 45 | ;; 46 | 5) 47 | rollback=$(kdialog --combobox "Select action for rollback" "Full-Kstars-Indi" "Indi" "Kstars" --title "AstroArch Rollback") 48 | case $rollback in 49 | Full-Kstars-Indi) 50 | astro-rollback-full 51 | if [ $? -eq 0 ] ; then 52 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Rollback full' 'Completed' 53 | else 54 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Rollback full' 'Returns an error' 55 | fi 56 | ;; 57 | Indi) 58 | astro-rollback-indi 59 | if [ $? -eq 0 ] ; then 60 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Rollback indi' 'Completed' 61 | else 62 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Rollback indi' 'Returns an error' 63 | fi 64 | ;; 65 | Kstars) 66 | astro-rollback-kstars 67 | if [ $? -eq 0 ] ; then 68 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Rollback kstars' 'Completed' 69 | else 70 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Rollback kstars' 'Returns an error' 71 | fi 72 | ;; 73 | esac 74 | ;; 75 | 6) 76 | install_kstars=$(kdialog --combobox " Select the Kstars installation version" "Bleeding-edge" "Stable" --title "AstroArch Install Kstars") 77 | case $install_kstars in 78 | Bleeding-edg) 79 | use-astro-bleeding-edge 80 | if [ $? -eq 0 ] ; then 81 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Installation Kstars bleeding-edge' 'Completed' 82 | else 83 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Installation Kstars bleeding-edge' 'Returns an error' 84 | fi 85 | ;; 86 | Stable) 87 | use-astro-stable 88 | if [ $? -eq 0 ] ; then 89 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Installation Kstars' 'Completed' 90 | else 91 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Installation Kstars' 'Returns an error' 92 | fi 93 | ;; 94 | esac 95 | ;; 96 | esac 97 | -------------------------------------------------------------------------------- /BUILD.md: -------------------------------------------------------------------------------- 1 | This is the main bag to build an aarch64 ISO using arch linux that will be focused around astronomical software like kstars and indi. 2 | 3 | 4 | **!!! DRAGONS AHEAD !!!** 5 | 6 | **If you are here you likely know what you're going to do, this section is strictly for people who wants to test how to build the .img 7 | I package from scratch** 8 | 9 | 10 | The guide is for the raspberry pi aarch64 version of arch linux but it should work with any version. 11 | 12 | # How to build the ISO 13 | 14 | 15 | ## Prepare the SD card 16 | Insert the SD card into your PC and check under which device name it presents itself (it may be `/dev/sdX` or `/dev/mmcblkX`), the guide will assume 17 | it's `/dev/mmcblk0`, if your PC mounts the card automatically **you need to unmount it before proceeding** 18 | 19 | The next commands assume that after `type X` an `enter` is given to confirm the command 20 | 21 | - Run fdisk typing `sudo fdisk /dev/mmcblk0` 22 | - type `o` this will wipe all the existing partitions from the card 23 | - type `n` then `p` then `1`, when prompted for the first sector press `enter`, when prompted for the last sector type `+512M` (some guides report `100M` but from 24 | personal experience that is not enough as after all updates the boot partition will be full) 25 | - type `t` and then type `0c` to modify the just created partition to `W95FAT LBA` 26 | - type `n` then `p` and take note of the number under `End` this will be used as starting point for the next partition 27 | - type `n` then `p` then `2`, when prompted for the `First sector` check if the default value is bigger than the number you noted before, if it's bigger confirm 28 | with `enter` otherwise add 1 to the number annotated before and use it in this step 29 | - confirm the `Last sector` with enter 30 | - type `w` to write the changes to the card, this will also exit fdisk. 31 | - type `sudo mkfs.vfat /dev/mmcblk0p1` (/dev/sdX1 for sd like devices) 32 | - type `sudo mkfs.ext4 /dev/mmcblk0p2` 33 | 34 | At this point the SD card is ready! 35 | 36 | ## Raspberry Pi 4 C0 (sd issue on boot) 37 | BE AWARE AND READ THIS! 38 | If you have a recent model marked as C0 (look here https://archlinuxarm.org/forum/viewtopic.php?f=67&t=15422&start=20) 39 | You need to tweak 2 things to be able to boot: 40 | 1) You don't need to do the sed command from the next step and you don't need to add the second entry in `/etc/fstab` 41 | 2) you additionally need to edit `/boot/boot.txt`, edit the two lines starting with `booti` changing `fdt_addr_r` to `fdt_addr` 42 | 3) run `sudo ./mkscr` within the `boot/` folder after 2 otherwise the changes won't be written into the bootloader 43 | 44 | ## Burn the iso to the SD card 45 | 46 | We will proceed with moving the arch iso to the SD card 47 | 48 | - `mkdir arch-install && cd arch-install` 49 | - `mkdir boot` 50 | - `mkdir root` 51 | - `wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz` 52 | - `sudo mount /dev/mmcblk0p1 boot/` 53 | - `sudo mount /dev/mmcblk0p2 root/` 54 | - `bsdtar -xpf ArchLinuxARM-rpi-aarch64-latest.tar.gz -C root` 55 | - `sudo mv root/boot/* boot` 56 | - `sudo sed -i 's/mmcblk0/mmcblk1/g' root/etc/fstab` 57 | - edit the file `root/etc/fstab` adding the following line `/dev/mmcblk1p2 / ext4 defaults 0 0` 58 | - `sudo umount boot/ root/` 59 | 60 | Congratz! Your SD card is ready, insert it into your raspberry and boot it! 61 | 62 | ## First boot 63 | 64 | Connect your raspberry pi to your netowork via an ethernet cable, you can ssh into it after the boot using `ssh alarm@IP_OF_YOUR_RASPBERRY` the password will 65 | be `alarm` 66 | 67 | You'll be dropped into `alarm` shell and now we can proceed: 68 | - become sudo with `su -` the password is `root` 69 | - type `curl https://raw.githubusercontent.com/devDucks/astroarch/main/astroarch_build.sh > astroarch_build.sh` 70 | - type `bash astroarch_build.sh` 71 | 72 | This is the only thing required, the rest of the procedure is fully automated! 73 | 74 | ## Manual steps to finalize the image 75 | After reboot, few final steps may be made to improve further the final image, mainly: 76 | - Use UUID in `/etc/fstab` so that the image can start with every media attached (SD, USB, HDD, SDD) 77 | Dump the following table into `/etc/fstab`, to know the partition id simply run `sudo blkid` and look for UUID values 78 | ``` 79 | # Static information about the filesystems. 80 | # See fstab(5) for details. 81 | 82 | # 83 | UUID=XXXX-XXXX /boot vfat defaults 0 0 84 | UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX / ext4 defaults 0 1 85 | ``` 86 | - Set the theme to dark breeze 87 | - Set a wallpaper 88 | - Edit `/boot/cmdline.txt` replacing the default content with 89 | ``` 90 | root=UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw rootwait console=serial0,115200 console=tty1 fsck.repair=yes video=HDMI-A-1:1920x1080M@60D 91 | ``` 92 | - start Kstars without acknowledging any message, start ekos simulator, go to the guiding tab and download the most common indexes 93 | - enable the resize script to do its magic on the user's first boot - run `sudo systemctl enable resize_once` 94 | - enable the access point script to do its magic on the user's first boot - run `sudo systemctl enable create_ap` 95 | - enable the onboarding timer - run `sudo systemctl enable astroarch-onboarding` 96 | 97 | Now the raspberry can be turned off and the image packaging can start 98 | 99 | ## Repackaging .img file 100 | 101 | Once astroarch has been fully bootstrapped the image can be repackaged to be distributed 102 | 103 | Using `pishrink` follow these steps: 104 | - create a .img file of the SD card with `sudo dd if=/dev/mmcblk0 of=astroarch.img bs=8M status=progress` (if mmcblk0 is not the raspberry SD card, change accordingly) 105 | - `sudo ./pishrink.sh -za astroarch.img astroarch-X.X.X.img.gz` 106 | 107 | the gzipped image is ready to be distributed and can be flashed on other media 108 | -------------------------------------------------------------------------------- /configs/.zshrc: -------------------------------------------------------------------------------- 1 | export PATH=/usr/share/GSC/bin:$HOME/bin:/usr/local/bin:$PATH 2 | export ZSH="$HOME/.oh-my-zsh" 3 | export LC_CTYPE=en_US.UTF-8 4 | export SYSTEMD_TIMEDATED_NTP_SERVICES=chronyd.service 5 | 6 | ZSH_THEME="af-magic" 7 | ZSH_CUSTOM=$HOME/.astroarch 8 | 9 | EXTRA_ZSH=$HOME/extra.zsh 10 | 11 | zstyle ':omz:update' mode disabled 12 | 13 | ENABLE_CORRECTION="false" 14 | HIST_STAMPS="yyyy-mm-dd" 15 | 16 | plugins=(git archlinux) 17 | 18 | # Find all plugins and append them to plugins 19 | for dir in $HOME/.astroarch/plugins/**/*.plugin.zsh; do 20 | split=(${(s:/:)dir}) 21 | last=$split[-1] 22 | name=(${(s:.:)last}) 23 | plugins+=($name[1]) 24 | done; 25 | 26 | source $ZSH/oh-my-zsh.sh 27 | 28 | EDITOR=nano 29 | INDI_ROLLBACK_VERSION=2.1.3-1 30 | INDI_LIBS_ROLLBACK_VERSION=2.1.3-1 31 | INDI_DRIVERS_ROLLBACK_VERSION=2.1.3-1 32 | KSTARS_ROLLBACK_VERSION=3.7.6-2 33 | 34 | # Alias section 35 | alias update-astromonitor='wget -O - https://raw.githubusercontent.com/MattBlack85/astro_monitor/main/install.sh | sh' 36 | alias astro-rollback-full='astro-rollback-indi && astro-rollback-kstars' 37 | alias apt=xyz 38 | alias apt-get=xyz 39 | 40 | # Run aa_motd.sh 41 | bash /home/astronaut/.astroarch/scripts/aa_motd.sh 42 | 43 | function use-astro-bleeding-edge() 44 | { 45 | sudo pacman -Sy --noconfirm && yes | LC_ALL=en_US.UTF-8 sudo pacman -S kstars-git libindi-git indi-3rdparty-drivers-git indi-3rdparty-libs-git --noconfirm 46 | } 47 | 48 | function use-astro-stable() 49 | { 50 | sudo pacman -Sy --noconfirm && yes | LC_ALL=en_US.UTF-8 sudo pacman -S kstars libindi indi-3rdparty-drivers indi-3rdparty-libs --noconfirm 51 | } 52 | 53 | 54 | function astro-rollback-indi() 55 | { 56 | setopt localoptions rmstarsilent 57 | mkdir -p ~/.rollback 58 | cd ~/.rollback 59 | wget -O indi-3rdparty-drivers-${INDI_DRIVERS_ROLLBACK_VERSION}-aarch64.pkg.tar.xz http://astromatto.com:9000/aarch64/indi-3rdparty-drivers-${INDI_DRIVERS_ROLLBACK_VERSION}-aarch64.pkg.tar.xz 60 | wget -O libindi-${INDI_ROLLBACK_VERSION}-aarch64.pkg.tar.xz http://astromatto.com:9000/aarch64/libindi-${INDI_ROLLBACK_VERSION}-aarch64.pkg.tar.xz 61 | wget -O indi-3rdparty-libs-${INDI_LIBS_ROLLBACK_VERSION}-aarch64.pkg.tar.xz http://astromatto.com:9000/aarch64/indi-3rdparty-libs-${INDI_LIBS_ROLLBACK_VERSION}-aarch64.pkg.tar.xz 62 | sudo pacman -U libindi* indi* --noconfirm 63 | cd - > /dev/null 2>&1 64 | rm -rf ~/.rollback/* 65 | } 66 | 67 | function astro-rollback-kstars() 68 | { 69 | setopt localoptions rmstarsilent 70 | mkdir -p ~/.rollback 71 | cd ~/.rollback 72 | wget -O kstars-${KSTARS_ROLLBACK_VERSION}-aarch64.pkg.tar.xz http://astromatto.com:9000/aarch64/kstars-${KSTARS_ROLLBACK_VERSION}-aarch64.pkg.tar.xz 73 | sudo pacman -U kstars* --noconfirm 74 | cd - > /dev/null 2>&1 75 | rm -rf ~/.rollback/* 76 | } 77 | 78 | function update-astroarch() 79 | { 80 | # Store actual version 81 | OLD_VER=$(cat /home/$USER/.astroarch.version) 82 | 83 | # Store the current commit hash before the pull 84 | cd /home/$USER/.astroarch 85 | CURRENT_COMMIT=$(git rev-parse HEAD) 86 | 87 | # Checkout latest changes from git 88 | cd /home/$USER/.astroarch 89 | git pull origin main 90 | cd - > /dev/null 2>&1 91 | 92 | NEW_VER=$(cat /home/$USER/.astroarch/configs/.astroarch.version) 93 | 94 | if [[ "$OLD_VER" != "$NEW_VER" ]]; then 95 | zsh /home/$USER/.astroarch/scripts/$NEW_VER.sh 96 | if [[ $? -ne 0 ]]; then 97 | # Revert to the commit stored before the pull 98 | cd /home/$USER/.astroarch 99 | git reset --hard "$CURRENT_COMMIT" 100 | cd - > /dev/null 2>&1 101 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Update AstroArch' "Script '$SCRIPT_VER' failed. Reverted to previous state." 102 | fi 103 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Update AstroArch' 'All scripts applied successfully' 104 | fi; 105 | 106 | # Temporary fix for kde-portal duplicated conf 107 | if [ -f /usr/share/xdg-desktop-portal/kde-portal.conf ]; then 108 | sudo mv /usr/share/xdg-desktop-portal/kde-portal.conf /usr/share/xdg-desktop-portal/kde-portal.conf.old 109 | fi; 110 | 111 | # Update the repo content 112 | sudo pacman -Sy --noconfirm 113 | 114 | # Update always keyring first, than all of the other packages 115 | sudo pacman -S archlinux-keyring --noconfirm 116 | 117 | # Now upgrade all system packages, but ask user to choose in case of conflicts/choices 118 | sudo pacman -Syu --noconfirm 119 | 120 | if [ $? -eq 0 ]; then 121 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Update AstroArch' "Successful update" 122 | else 123 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'Update AstroArch' "Update failed" 124 | fi 125 | 126 | # Reinstall plasma-x11-session, cannot work on 1.9.0 cause of old kwin 127 | sudo pacman -Sy plasma-x11-session --noconfirm 128 | } 129 | 130 | function xyz () { 131 | echo "ATTENTION! The system is going to be infected with a virus now!" 132 | sleep 1 133 | echo "This virus is called ArchLinux" 134 | sleep 0.5 135 | echo -n "Transfering virus." 136 | sleep 0.5 137 | echo -n "." 138 | sleep 0.5 139 | echo -n "." 140 | sleep 0.5 141 | echo -n "." 142 | sleep 0.5 143 | echo -n "." 144 | echo "" 145 | sleep 1 146 | echo "Virus transfered successfully" 147 | echo "ENJOY YOUR ARCHLINUX SYSTEM AND EMBRACE THE DARK SIDE" 148 | sleep 1 149 | echo "That was a joke of course, there is no apt nor apt-get on arch, just pacman!" 150 | } 151 | 152 | if [ -f $EXTRA_ZSH ]; then 153 | source $EXTRA_ZSH 154 | fi 155 | -------------------------------------------------------------------------------- /assets/icons/novnc-icon-sm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /assets/icons/novnc-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /desktop/org.kde.kstars.desktop: -------------------------------------------------------------------------------- 1 | # KDE Config File 2 | [Desktop Entry] 3 | Type=Application 4 | Exec=kstars %U 5 | Icon=kstars 6 | StartupWMClass=kstars 7 | X-DocPath=kstars/index.html 8 | Comment=Desktop Planetarium 9 | Comment[af]=Werkskerm Planetarium 10 | Comment[ar]=قبّة سماويّة على سطح المكتب 11 | Comment[be]=Настольны планетарыум 12 | Comment[bg]=Планетариум за работния плот 13 | Comment[bn]=ডেস্কটপ প্ল্যানেটোরিয়াম 14 | Comment[br]=Planetarium a vurev 15 | Comment[bs]=Desktop planetarijum 16 | Comment[ca]=Planetari per a l'escriptori 17 | Comment[ca@valencia]=Planetari per a l'escriptori 18 | Comment[cs]=Planetárium na vaší obrazovce 19 | Comment[csb]=Planetarium na pùlce 20 | Comment[cy]=Planetariwm Penbwrdd 21 | Comment[da]=Planetarium pÃ¥ desktoppen 22 | Comment[de]=Das Planetarium für den Schreibtisch 23 | Comment[el]=Πλανητάριο επιφάνειας εργασίας 24 | Comment[en_GB]=Desktop Planetarium 25 | Comment[eo]=Tabula planetario 26 | Comment[es]=Planetario para el escritorio 27 | Comment[et]=Töölaua planetaarium 28 | Comment[eu]=Mahaigaineko planetarioa 29 | Comment[fa]=رومیزی آسمان‌نما 30 | Comment[fi]=Työpöytäplanetaario 31 | Comment[fr]=Un planétarium sur votre bureau 32 | Comment[ga]=Pláinéadlann Deisce 33 | Comment[gl]=Planetario de escritorio 34 | Comment[gu]=ડેસ્કટોપ પર પ્લેનેટેરીયમ 35 | Comment[he]=פלנטריום שולחני 36 | Comment[hi]=डेस्कटॉप प्लेनेटेरियम 37 | Comment[hne]=डेस्कटाप प्लेनेटेरियम 38 | Comment[hr]=Planetarij za radnu povrÅ¡inu 39 | Comment[hu]=Munkaasztali planetárium 40 | Comment[is]=Skjáborðsstjörnuver 41 | Comment[it]=Planetario per il desktop 42 | Comment[ja]=デスクトップ・プラネタリウム 43 | Comment[ka]=სამაგიდო პლანეტარიუმი 44 | Comment[kk]=Үстелдегі планетарий 45 | Comment[km]=សំណាក​ចក្រវាល​ផ្ទៃ​តុ 46 | Comment[ko]=데스크톱 별자리판 47 | Comment[lt]=Darbalaukio planetariumas 48 | Comment[lv]=Darbvirsmas planetārijs 49 | Comment[mk]=Планетариум на работна површина 50 | Comment[ml]=പണിയിട പ്ലാനറ്റേറിയം 51 | Comment[mr]=डेस्कटॉप तारांगण 52 | Comment[ms]=Planetarium Ruang Kerja 53 | Comment[nb]=Skrivebordsplanetarium 54 | Comment[nds]=Planetarium för den Schriefdisch 55 | Comment[ne]=डेस्कटप ग्रहमण्डल 56 | Comment[nl]=Bureaublad-planetarium 57 | Comment[nn]=Skrivebordsplanetarium 58 | Comment[pa]=ਡੈਸਕਟਾਪ ਪਲੇਟੇਰੀਅਮ 59 | Comment[pl]=Planetarium na pulpicie 60 | Comment[pt]=Planetário 61 | Comment[pt_BR]=Planetário no ambiente de trabalho 62 | Comment[ro]=Planetarium de birou 63 | Comment[ru]=Настольный планетарий 64 | Comment[se]=Čállenbeavdeplánetaria 65 | Comment[sk]=Planetárium na vaÅ¡ej ploche 66 | Comment[sl]=Namizni planetarij 67 | Comment[sv]=Skrivbordsplanetarium 68 | Comment[ta]= பணிமேடை கோளரங்கம் 69 | Comment[tg]=Планетариуми Мизи Корӣ 70 | Comment[tr]=Masaüstü Yıldız Evi 71 | Comment[ug]=ئۈستەلئۈستى رەسەتخانىسى 72 | Comment[uk]=Настільний планетарій 73 | Comment[vi]=Ngắm sao trên Màn hình máy tính 74 | Comment[xh]=Indlu ye Desktop 75 | Comment[x-test]=xxDesktop Planetariumxx 76 | Comment[zh_CN]=桌面天文观测软件 77 | Comment[zh_TW]=桌面星象儀 78 | Terminal=false 79 | Name=KStars 80 | Name[af]=K-sterre 81 | Name[ar]=نجوم‌ك 82 | Name[be]=KStars 83 | Name[bg]=KStars 84 | Name[bn]=কে-স্টার 85 | Name[br]=KStars 86 | Name[bs]=KStars 87 | Name[ca]=KStars 88 | Name[ca@valencia]=KStars 89 | Name[cs]=KStars 90 | Name[csb]=KStars 91 | Name[cy]=KSer 92 | Name[da]=KStars 93 | Name[de]=KStars 94 | Name[el]=KStars 95 | Name[en_GB]=KStars 96 | Name[eo]=KStars 97 | Name[es]=KStars 98 | Name[et]=KStars 99 | Name[eu]=KStars 100 | Name[fi]=KStars 101 | Name[fr]=KStars 102 | Name[ga]=KStars 103 | Name[gl]=KStars 104 | Name[gu]=KStars 105 | Name[he]=KStars 106 | Name[hi]=के-स्टार्स 107 | Name[hne]=के-स्टार्स 108 | Name[hr]=KStars 109 | Name[hu]=KStars 110 | Name[is]=KStjörnur 111 | Name[it]=KStars 112 | Name[ja]=KStars 113 | Name[ka]=KStars 114 | Name[kk]=KStars 115 | Name[km]=KStars 116 | Name[ko]=KStars 117 | Name[lt]=KStars 118 | Name[lv]=KStars 119 | Name[mk]=KStars 120 | Name[ml]=കെ-സ്റ്റാര്‍സ് 121 | Name[mr]=के-स्टार्स 122 | Name[ms]=KStars 123 | Name[nb]=KStars 124 | Name[nds]=KStars 125 | Name[ne]=केडीई तारा 126 | Name[nl]=KStars 127 | Name[nn]=KStars 128 | Name[pa]=ਕੇ-ਤਾਰੇ 129 | Name[pl]=KStars 130 | Name[pt]=KStars 131 | Name[pt_BR]=KStars 132 | Name[ro]=KStars 133 | Name[ru]=KStars 134 | Name[se]=KStars 135 | Name[sk]=KStars 136 | Name[sl]=KStars 137 | Name[sv]=Kstars 138 | Name[ta]=கேஸ்டார்ஸ் 139 | Name[tg]=KStars 140 | Name[tr]=KStars 141 | Name[ug]=KStars 142 | Name[uk]=KStars 143 | Name[vi]=KStars 144 | Name[xh]=KStars 145 | Name[x-test]=xxKStarsxx 146 | Name[zh_CN]=KStars 147 | Name[zh_TW]=天文_KStars 148 | GenericName=Desktop Planetarium 149 | GenericName[af]=Werkskerm Planetarium 150 | GenericName[ar]=قبّة سماويّة على سطح المكتب 151 | GenericName[be]=Настольны планетарыум 152 | GenericName[bg]=Планетариум за работния плот 153 | GenericName[bn]=ডেস্কটপ প্ল্যানেটোরিয়াম 154 | GenericName[br]=Planetarium a vurev 155 | GenericName[bs]=Desktop planetarijum 156 | GenericName[ca]=Planetari per a l'escriptori 157 | GenericName[ca@valencia]=Planetari per a l'escriptori 158 | GenericName[cs]=Planetárium na vaší obrazovce 159 | GenericName[csb]=Planetarium na pùlce 160 | GenericName[cy]=Planetariwm Penbwrdd 161 | GenericName[da]=Planetarium pÃ¥ desktoppen 162 | GenericName[de]=Elektronisches Planetarium 163 | GenericName[el]=Πλανητάριο επιφάνειας εργασίας 164 | GenericName[en_GB]=Desktop Planetarium 165 | GenericName[eo]=Tabula planetario 166 | GenericName[es]=Planetario para el escritorio 167 | GenericName[et]=Töölaua planetaarium 168 | GenericName[eu]=Mahaigaineko planetarioa 169 | GenericName[fa]=رومیزی آسمان‌نما 170 | GenericName[fi]=Työpöytäplanetaario 171 | GenericName[fr]=Un planétarium sur votre bureau 172 | GenericName[ga]=Pláinéadlann Deisce 173 | GenericName[gl]=Planetario 174 | GenericName[gu]=ડેસ્કટોપ પર પ્લેનેટેરીયમ 175 | GenericName[he]=פלנטריום שולחני 176 | GenericName[hi]=डेस्कटॉप प्लेनेटेरियम 177 | GenericName[hne]=डेस्कटाप प्लेनेटेरियम 178 | GenericName[hr]=Planetarij za radnu povrÅ¡inu 179 | GenericName[hu]=Planetárium 180 | GenericName[is]=Skjáborðsstjörnuver 181 | GenericName[it]=Planetario per il desktop 182 | GenericName[ja]=デスクトップ・プラネタリウム 183 | GenericName[ka]=სამაგიდო პლანეტარიუმი 184 | GenericName[kk]=Үстел планетарийі 185 | GenericName[km]=សំណាក​ចក្រវាល​ផ្ទៃ​តុ 186 | GenericName[ko]=데스크톱 별자리판 187 | GenericName[lt]=Darbalaukio planetariumas 188 | GenericName[lv]=Darbvirsmas planetārijs 189 | GenericName[mk]=Планетариум на раб. површина 190 | GenericName[ml]=പണിയിട പ്ലാനറ്റേറിയം 191 | GenericName[mr]=डेस्कटॉप तारांगण 192 | GenericName[ms]=Planetarium Desktop 193 | GenericName[nb]=Skrivebordsplanetarium 194 | GenericName[nds]=Schriefdisch-Planetarium 195 | GenericName[ne]=डेस्कटप ग्रहमण्डल 196 | GenericName[nl]=Bureaublad-planetarium 197 | GenericName[nn]=Skrivebordsplanetarium 198 | GenericName[pa]=ਡੈਸਕਟਾਪ ਪਲੇਟੇਰੀਅਮ 199 | GenericName[pl]=Planetarium na biurku 200 | GenericName[pt]=Planetário 201 | GenericName[pt_BR]=Planetário no ambiente de trabalho 202 | GenericName[ro]=Planetariu de birou 203 | GenericName[ru]=Настольный планетарий 204 | GenericName[sk]=Planetárium 205 | GenericName[sl]=Namizni planetarij 206 | GenericName[sv]=Skrivbordsplanetarium 207 | GenericName[ta]=பணிமேடை கோளரங்கம் 208 | GenericName[tg]=Планетариуми Мизи Корӣ 209 | GenericName[tr]=Masaüstü Yıldız Evi 210 | GenericName[ug]=ئۈستەلئۈستى رەسەتخانىسى 211 | GenericName[uk]=Настільний планетарій 212 | GenericName[vi]=Ngắm sao trên Màn hình 213 | GenericName[x-test]=xxDesktop Planetariumxx 214 | GenericName[zh_CN]=桌面天文观测软件 215 | GenericName[zh_TW]=桌面星象儀 216 | X-DBUS-StartupType=Multi 217 | MimeType=image/fits; 218 | Categories=Qt;KDE;Education;Science;Astronomy; 219 | X-DBUS-ServiceName=org.kde.kstars 220 | -------------------------------------------------------------------------------- /desktop/org.kde.konsole.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | TryExec=konsole 4 | Exec=konsole 5 | Icon=utilities-terminal 6 | Categories=Qt;KDE;System;TerminalEmulator; 7 | Actions=NewWindow;NewTab; 8 | X-DocPath=konsole/index.html 9 | X-DBUS-StartupType=Unique 10 | StartupNotify=true 11 | X-KDE-AuthorizeAction=shell_access 12 | X-KDE-Shortcuts=Ctrl+Alt+T 13 | StartupWMClass=konsole 14 | 15 | Keywords=terminal;console;script;run;execute;command;command-line;commandline;cli;bash;sh;shell;zsh;cmd;command prompt 16 | Keywords[ca]=terminal;consola;script;executar;ordre;línia d'ordres;línia ordres;cli;bash;sh;shell;zsh;cmd;indicador d'ordres 17 | Keywords[ca@valencia]=terminal;consola;script;executar;ordre;línia d'ordres;línia ordres;cli;bash;sh;shell;zsh;cmd;indicador d'ordres 18 | Keywords[en_GB]=terminal;console;script;run;execute;command;command-line;commandline;cli;bash;sh;shell;zsh;cmd;command prompt 19 | Keywords[es]=terminal;consola;script;guion;guión;lanzar;ejecutar;comando;orden;línea de órdenes;línea de comandos;cli;bash;sh;shell;intérprete;zsh;cmd;introducción de órdenes 20 | Keywords[eu]=terminala;kontsola;gidoia;ibili;exekutatu;komandoa;komando-lerroa;cli;bash;sh;shell;oskola;zsh;cmd;komando-gonbita 21 | Keywords[fi]=pääte;konsoli;skripti;komentojono;aja;suorita;komento;komentorivi;cli;bash;sh;shell;komentotulkki;zsh;komentokehote;kehote 22 | Keywords[fr]=terminal ; console ; script ; lancer ; exécuter ;commande ; commande en ligne ; cli ; bash ; sh ; shell ; zsh ; invite de commandes 23 | Keywords[ia]=terminal;console;script;run;executa;commando;linea-de-commando;lineadecommando;cli;bash;sh;shell;zsh;cmd;command prompt 24 | Keywords[id]=terminal;konsol;skrip;jalan;jalankan;perintah;baris perintah;baris-perintah;cli;bash;sh;shell;zsh;cmd;prompt perintah 25 | Keywords[it]=terminale;console;script;esegui;comando;riga di comando;cli;bash;sh;shell;zsh;cmd;prompt dei comandi 26 | Keywords[ka]=terminal;console;script;run;execute;command;command-line;commandline;cli;bash;sh;shell;zsh;cmd;command prompt 27 | Keywords[nl]=terminal;console;script;run;uitvoeren;commando;commandoregel;cli;bash;sh;shell;zsh;cmd;commando-prompt 28 | Keywords[nn]=terminal;konsoll;skript;køyr;utfør;kommando;kommandolinje;kommando-linje;cli;bash;sh;shell;skal;zsh;cmd;leietekst 29 | Keywords[pl]=terminal;konsola;skrypt;uruchom;wykonaj;polecenie;wiersz polece?;linia komend;cli;bash;sh;pow?oka;zsh;cmd;wiersz polece? 30 | Keywords[pt]=terminal;consola;programa;executar;comando;linha de comandos;cli;bash;sh;shell;zsh 31 | Keywords[pt_BR]=terminal;console;script;executar;rodar;comando;linha de comando;cli;bash;sh;shell;zsh;cmd;prompt de comando 32 | Keywords[ro]=terminal;consol?;script;ruleaz?;execut?;comand?;linie de comand?;bash;sh;interpretor;zsh;cmd;prompt comand? 33 | Keywords[sk]=terminál;konzola;skript;spusti?;vykona?;príkaz;príkazový riadok;príkazový riadok;cli;bash;sh;shell;zsh;cmd;príkazový riadok 34 | Keywords[sl]=terminal;console;script;run;execute;command;command-line;commandline;cli;bash;sh;shell;zsh;ukazni poziv 35 | Keywords[sv]=terminal;konsoll;skript;köra;kommando;kommandorad;bash;sh;skal;zsh;cmd;kommandoprompt 36 | Keywords[x-test]=xxterminalxx;xxconsolexx;xxscriptxx;xxrunxx;xxexecutexx;xxcommandxx;xxcommand-linexx;xxcommandlinexx;xxclixx;xxbashxx;xxshxx;xxshellxx;xxzshxx;xxcmdxx;xxcommand promptxx 37 | Keywords[zh_TW]=terminal;console;script;run;execute;command;command-line;commandline;cli;bash;sh;shell;zsh;cmd;command prompt 38 | 39 | Name=Konsole 40 | Name[af]=Konsole 41 | Name[as]=Konsole 42 | Name[az]=Konsole 43 | Name[be]=Konsole 44 | Name[be@latin]=Konsole 45 | Name[bg]=Konsole 46 | Name[bn_IN]=Konsole 47 | Name[br]=Konsole 48 | Name[bs]=Konzola 49 | Name[ca]=Konsole 50 | Name[ca@valencia]=Konsole 51 | Name[cs]=Konsole 52 | Name[csb]=Kònsola 53 | Name[cy]=Konsole 54 | Name[da]=Konsole 55 | Name[de]=Konsole 56 | Name[en_GB]=Konsole 57 | Name[eo]=Konsole 58 | Name[es]=Konsole 59 | Name[et]=Konsool 60 | Name[eu]=Konsole 61 | Name[fi]=Konsole 62 | Name[fr]=Konsole 63 | Name[fy]=Konsole 64 | Name[ga]=Konsole 65 | Name[gl]=Konsole 66 | Name[he]=Konsole 67 | Name[hr]=Konsole 68 | Name[hsb]=Konsola 69 | Name[hu]=Konsole 70 | Name[ia]=Konsole 71 | Name[id]=Konsole 72 | Name[is]=Konsole 73 | Name[it]=Konsole 74 | Name[ja]=Konsole 75 | Name[ka]=Konsole 76 | Name[kk]=Konsole 77 | Name[ko]=Konsole 78 | Name[ku]=Konsol 79 | Name[lt]=Konsole 80 | Name[lv]=Konsole 81 | Name[ms]=Konsole 82 | Name[nb]=Konsole 83 | Name[nds]=Konsole 84 | Name[nl]=Konsole 85 | Name[nn]=Konsoll 86 | Name[pl]=Konsola 87 | Name[pt]=Konsole 88 | Name[pt_BR]=Konsole 89 | Name[ru]=Konsole 90 | Name[se]=Konsolla 91 | Name[sk]=Konsole 92 | Name[sl]=Konsole 93 | Name[sr@ijekavianlatin]=Konsole 94 | Name[sr@latin]=Konsole 95 | Name[sv]=Terminal 96 | Name[tr]=Konsole 97 | Name[ug]=Konsole 98 | Name[uk]=Konsole 99 | Name[uz]=Konsole 100 | Name[uz@cyrillic]=Konsole 101 | Name[vi]=Konsole 102 | Name[wa]=Konsole 103 | Name[xh]=Konsole 104 | Name[x-test]=xxKonsolexx 105 | Name[zh_TW]=Konsole 106 | 107 | GenericName=Terminal 108 | GenericName[af]=Terminaal 109 | GenericName[az]=Terminal 110 | GenericName[be@latin]=Terminal 111 | GenericName[bs]=Terminal 112 | GenericName[ca]=Terminal 113 | GenericName[ca@valencia]=Terminal 114 | GenericName[cs]=Terminál 115 | GenericName[csb]=Terminal 116 | GenericName[da]=Terminal 117 | GenericName[de]=Terminal 118 | GenericName[en_GB]=Terminal 119 | GenericName[eo]=Terminalo 120 | GenericName[es]=Terminal 121 | GenericName[et]=Terminal 122 | GenericName[eu]=Terminala 123 | GenericName[fi]=Pääteikkuna 124 | GenericName[fr]=Terminal 125 | GenericName[fy]=Terminal 126 | GenericName[ga]=Teirminéal 127 | GenericName[gl]=Terminal 128 | GenericName[hr]=Terminal 129 | GenericName[hsb]=Terminal 130 | GenericName[hu]=Terminál 131 | GenericName[ia]=Terminal 132 | GenericName[id]=Terminal 133 | GenericName[is]=Skjáhermir 134 | GenericName[it]=Terminale 135 | GenericName[ku]=Termînal 136 | GenericName[lt]=Terminalas 137 | GenericName[nb]=Terminal 138 | GenericName[nds]=Konsool 139 | GenericName[nl]=Terminal 140 | GenericName[nn]=Terminal 141 | GenericName[pl]=Terminal 142 | GenericName[pt]=Terminal 143 | GenericName[pt_BR]=Terminal 144 | GenericName[ro]=Terminal 145 | GenericName[se]=Terminal 146 | GenericName[sk]=Terminál 147 | GenericName[sl]=Terminal 148 | GenericName[sr@ijekavianlatin]=Terminal 149 | GenericName[sr@latin]=Terminal 150 | GenericName[sv]=Terminal 151 | GenericName[tr]=Uçbirim 152 | GenericName[uz]=Terminal 153 | GenericName[wa]=Terminå 154 | GenericName[x-test]=xxTerminalxx 155 | 156 | Comment=Command line access 157 | Comment[be@latin]=Dostup da zahadnaha radka 158 | Comment[ca]=Accés a la línia d'ordres 159 | Comment[ca@valencia]=Accés a la línia d'ordres 160 | Comment[cs]=P?ístup k p?íkazové ?ádce 161 | Comment[da]=Kommandolinjetilgang 162 | Comment[de]=Zugriff auf die Befehlszeile 163 | Comment[en_GB]=Command line access 164 | Comment[es]=Acceso a la línea de órdenes 165 | Comment[et]=Käsurea kasutamine 166 | Comment[eu]=Komando-lerrora sarbidea 167 | Comment[fi]=Pääsy komentoriville 168 | Comment[fr]=Ligne de commande 169 | Comment[gl]=Acceso á liña de ordes. 170 | Comment[hu]=Parancssori hozzáférés 171 | Comment[ia]=Accesso a linea de commando 172 | Comment[id]=Akses baris perintah 173 | Comment[is]=Aðgangur með skipanalínu 174 | Comment[it]=Accesso alla riga di comando 175 | Comment[nb]=Tilgang til kommandolinje 176 | Comment[nl]=Toegang tot de opdrachtregel 177 | Comment[nn]=Kommandolinjetilgang 178 | Comment[pt]=Acesso à linha de comandos 179 | Comment[pt_BR]=Acesso à linha de comandos 180 | Comment[sk]=Prístup na príkazový riadok 181 | Comment[sl]=Dostop do ukazne vrstice 182 | Comment[sr@ijekavianlatin]=Pristup komandnoj liniji 183 | Comment[sr@latin]=Pristup komandnoj liniji 184 | Comment[sv]=Åtkomst till kommandorad 185 | Comment[x-test]=xxCommand line accessxx 186 | 187 | [Desktop Action NewWindow] 188 | Name=Open a New Window 189 | Name[az]=Yeni p?nc?r? açmaq 190 | Name[bs]=Otvori u novom prozoru 191 | Name[ca]=Obre una finestra nova 192 | Name[ca@valencia]=Obri una finestra nova 193 | Name[cs]=Otev?ít nové okno 194 | Name[da]=Åbn et nyt vindue 195 | Name[de]=Ein neues Fenster öffnen 196 | Name[en_GB]=Open a New Window 197 | Name[es]=Abrir una nueva ventana 198 | Name[et]=Ava uues aknas 199 | Name[eu]=Ireki leiho berri bat 200 | Name[fi]=Avaa uusi ikkuna 201 | Name[fr]=Ouvrir une nouvelle fenêtre 202 | Name[gl]=Abrir unha xanela nova 203 | Name[hu]=Új ablak megnyitása 204 | Name[ia]=Aperi un nove fenestra 205 | Name[id]=Buka Jendela Baru 206 | Name[is]=Opna nýjan glugga 207 | Name[it]=Apri in una nuova finestra 208 | Name[nb]=Åpne et nytt vindu 209 | Name[nds]=En nieg Finster opmaken 210 | Name[nl]=Een nieuw venster openen 211 | Name[nn]=Opna i nytt vindauge 212 | Name[pl]=Otwórz nowe okno 213 | Name[pt]=Abrir uma Nova Janela 214 | Name[pt_BR]=Abre uma nova janela 215 | Name[ro]=Deschide o fereastr? nou? 216 | Name[sk]=Otvori? nové okno 217 | Name[sl]=Odpri novo okno 218 | Name[sr@ijekavianlatin]=Otvori novi prozor 219 | Name[sr@latin]=Otvori novi prozor 220 | Name[sv]=Öppna ett nytt fönster 221 | Name[tr]=Yeni Bir Pencere Aç 222 | Name[x-test]=xxOpen a New Windowxx 223 | Exec=konsole 224 | 225 | [Desktop Action NewTab] 226 | Name=Open a New Tab 227 | Name[be@latin]=Adkry? u novaj ukladcy 228 | Name[ca]=Obre una pestanya nova 229 | Name[ca@valencia]=Obri una pestanya nova 230 | Name[cs]=Otev?ít novou kartu 231 | Name[da]=Åbn et nyt faneblad 232 | Name[de]=Ein neues Unterfenster öffnen 233 | Name[en_GB]=Open a New Tab 234 | Name[es]=Abrir una nueva pestaña 235 | Name[et]=Ava uuel kaardil 236 | Name[eu]=Ireki fitxa berri bat 237 | Name[fi]=Avaa uusi välilehti 238 | Name[fr]=Ouvrir un nouvel onglet 239 | Name[gl]=Abrir un novo separador 240 | Name[hu]=Új lap megnyitása 241 | Name[ia]=Aperi un nove scheda 242 | Name[id]=Buka sebuah Tab Baru 243 | Name[is]=Opna nýjan flipa 244 | Name[it]=Apri in una nuova scheda 245 | Name[nb]=Åpne en ny fane 246 | Name[nl]=Een nieuw tabblad openen 247 | Name[nn]=Opna ny fane 248 | Name[pt]=Abrir uma Nova Página 249 | Name[pt_BR]=Abre uma nova aba 250 | Name[sk]=Otvori? novú kartu 251 | Name[sl]=Odpri nov zavihek 252 | Name[sv]=Öppna en ny flik 253 | Name[tr]=Yeni Bir Sekme Aç 254 | Name[x-test]=xxOpen a New Tabxx 255 | Icon=tab-new 256 | Exec=konsole --new-tab 257 | -------------------------------------------------------------------------------- /plugins/gps/gps.plugin.zsh: -------------------------------------------------------------------------------- 1 | # Plugin Zsh: GPS Management for Archlinux ARM/Raspberry Pi 2 | 3 | # --- Configuration Variables --- 4 | _ZSH_GPS_GPSD_CONF="/etc/default/gpsd" 5 | _ZSH_GPS_BAUDS=(4800 9600 19200 38400 57600 115200) 6 | _ZSH_GPS_PORTS=("/dev/ttyS0" "/dev/ttyAMA0" "/dev/ttyACM0" "/dev/ttyUSB0") 7 | _ZSH_GPS_TIME_LIMIT=3 8 | _ZSH_GPS_MIN_BYTES=50 9 | 10 | 11 | # --- Helper Function: Check if a device is sending a GPS stream --- 12 | # Returns 0 (Success) if a stream is found, 1 otherwise. 13 | # Output to stdout: NONE. All status messages go to stderr (>2). 14 | function _zsh_gps_check_device_stream() 15 | { 16 | local DEV="$1" 17 | local COUNT=0 18 | 19 | for BAUD in "${_ZSH_GPS_BAUDS[@]}"; do 20 | 21 | # 1. Configure the serial port for raw reading 22 | sudo stty -F "$DEV" $BAUD cs8 -cstopb -parenb -ixon -ixoff -crtscts raw 2>/dev/null 23 | 24 | # 2. Try to read data stream within TIME_LIMIT 25 | COUNT=$(sudo timeout $_ZSH_GPS_TIME_LIMIT dd if="$DEV" bs=1 count=500 2>/dev/null | wc -c) 26 | 27 | if [ "$COUNT" -ge "$_ZSH_GPS_MIN_BYTES" ]; then 28 | echo "✅ Stream found on $DEV at $BAUD baud ($COUNT bytes read)." >&2 # Output to stderr 29 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "✅ Stream found on $DEV at $BAUD baud ($COUNT bytes read)." 30 | return 0 # Success 31 | fi 32 | done 33 | 34 | return 1 # Failure 35 | } 36 | 37 | 38 | # --- Function for Automatic Detection --- 39 | # Output to stdout: The device path (e.g., /dev/ttyAMA0) or empty string. 40 | function _zsh_gps_find_device() 41 | { 42 | local DEVICE="" 43 | 44 | echo "🔍 Starting brute-force search for GPS stream on serial ports..." >&2 # Output to stderr 45 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "🔍 Starting brute-force search for GPS stream on serial ports..." 46 | 47 | for DEV in "${_ZSH_GPS_PORTS[@]}"; do 48 | [ -e "$DEV" ] || continue 49 | 50 | if ! sudo fuser -s "$DEV"; then 51 | # Note: check_device_stream sends its messages to stderr 52 | if _zsh_gps_check_device_stream "$DEV"; then 53 | echo "$DEV" # ONLY send the device path to stdout 54 | return 0 # Success 55 | fi 56 | else 57 | echo "⚠️ Port $DEV is busy (serial console or other service). Skipping" >&2 # Output to stderr 58 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "⚠️ Port $DEV is busy (serial console or other service). Skipping" 59 | fi 60 | done 61 | 62 | echo "❌ No GPS stream detected on checked serial ports" >&2 # Output to stderr 63 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "❌ No GPS stream detected on checked serial ports" 64 | return 1 # Failure 65 | } 66 | 67 | # --- Helper Function: Check if GPSD is running and configured --- 68 | # Returns 0 (Success) if a running GPSD instance is found, 1 otherwise. 69 | function _zsh_gps_is_running() 70 | { 71 | # 1. Check if the gpsd service is active 72 | if ! systemctl is-active --quiet gpsd.service; then 73 | return 1 # Service not active 74 | fi 75 | 76 | # 2. Check if the daemon is actually connected to a GPS device. 77 | local current_device 78 | 79 | # Query the daemon, wait a max of 2 seconds, and read the first 10 JSON objects. 80 | # We use 'jq -r .device' to extract the device path from ALL 10 objects. 81 | # 'head -1' will take the first non-null/non-empty device path found. 82 | current_device=$(timeout 2 gpspipe -w -n 10 2>/dev/null | \ 83 | jq -r '.device' 2>/dev/null | \ 84 | grep -v '^null$' | \ 85 | head -1) 86 | echo $current_device 87 | # Check if a non-empty device path was returned 88 | if [[ -n "$current_device" ]]; then 89 | return 0 # GPSD is running AND connected to a device 90 | else 91 | return 1 # Service is running but no active device is reported 92 | fi 93 | } 94 | 95 | # Enable and configure GPS 96 | function gps_on() 97 | { 98 | echo "🔍 Checking if GPSD is already running..." 99 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "🔍 Checking if GPSD is already running..." 100 | if _zsh_gps_is_running; then 101 | echo "🎉 GPSD is already installed and actively running with a device. No action is needed" 102 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "🎉 GPSD is already installed and actively running with a device. No action is needed" 103 | return 0 104 | fi 105 | 106 | if pacman -Qs 'gpsd' &> /dev/null ; then 107 | echo "✅ GPS packages are already installed" 108 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "✅ GPS packages are already installed" 109 | else 110 | echo "📦 GPS packages not installed, installing them now..." 111 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "📦 GPS packages not installed, installing them now..." 112 | sudo pacman -S --noconfirm gpsd jq 113 | echo "✅ GPS packages and 'jq' installed!" 114 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "✅ GPS packages and 'jq' installed!" 115 | fi 116 | 117 | # 2. Automatic Detection (stderr redirected to user, stdout captured by 'device') 118 | local device 119 | device=$(_zsh_gps_find_device) 120 | 121 | if [ $? -eq 0 ] && [[ -n "$device" ]]; then 122 | echo "✅ Automatic detection successful: $device" 123 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "✅ Automatic detection successful: $device" 124 | 125 | else 126 | echo "❌ Automated GPS detection failed" 127 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "❌ Automated GPS detection failed" 128 | 129 | # 3. Manual Fallback with Verification 130 | echo "--------------------------------------------------------" 131 | echo "Please enter your GPS port path (e.g., /dev/ttyAMA0):" 132 | local manual_device 133 | read manual_device 134 | 135 | if [[ -n "$manual_device" ]]; then 136 | if [ -e "$manual_device" ]; then 137 | echo "🔍 Testing manual device: $manual_device..." 138 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "🔍 Testing manual device: $manual_device..." 139 | 140 | # check_device_stream sends its messages to stderr 141 | if _zsh_gps_check_device_stream "$manual_device"; then 142 | device="$manual_device" 143 | echo "✅ Valid GPS stream confirmed" 144 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "✅ Valid GPS stream confirmed" 145 | else 146 | echo "❌ No valid GPS stream found on $manual_device at any common baud rate" 147 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "❌ No valid GPS stream found on $manual_device at any common baud rate" 148 | device="" 149 | fi 150 | else 151 | echo "❌ Device $manual_device does not exist" 152 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "❌ Device $manual_device does not exist" 153 | device="" 154 | fi 155 | else 156 | device="" 157 | fi 158 | fi 159 | 160 | # 4. Final Configuration and Activation 161 | if [[ -n "$device" ]]; then 162 | echo "⚙️ Configuring GPSD to use device: $device" 163 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "⚙️ Configuring GPSD to use device: $device" 164 | 165 | # Clean and configure gpsd 166 | sudo sh -c "> $_ZSH_GPS_GPSD_CONF" 167 | echo "# Configuration file generated by script" | sudo tee -a "$_ZSH_GPS_GPSD_CONF" > /dev/null 168 | echo "USBAUTO=\"false\"" | sudo tee -a "$_ZSH_GPS_GPSD_CONF" > /dev/null 169 | echo "START_DAEMON=\"true\"" | sudo tee -a "$_ZSH_GPS_GPSD_CONF" > /dev/null 170 | echo "GPSD_OPTIONS=\"-n\"" | sudo tee -a "$_ZSH_GPS_GPSD_CONF" > /dev/null 171 | echo "DEVICES=\"$device\"" | sudo tee -a "$_ZSH_GPS_GPSD_CONF" > /dev/null 172 | 173 | # Service Activation 174 | sudo systemctl enable gpsd.service 175 | sudo systemctl restart gpsd.service 176 | 177 | echo "🎉 GPS server ($device) is ON and enabled to autostart at every boot" 178 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "🎉 GPS server ($device) is ON and enabled to autostart at every boot" 179 | return 0 180 | else 181 | echo "❌ GPS setup failed. GPSD service remains disabled" 182 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "❌ GPS setup failed. GPSD service remains disabled" 183 | sudo systemctl disable gpsd.service --now 2>/dev/null 184 | return 1 185 | fi 186 | } 187 | 188 | # Disable GPS service 189 | function gps_off() 190 | { 191 | sudo systemctl disable gpsd.service --now 192 | echo "🛑 GPS server disabled. Remember to re-enable it if you want it to start automatically at boot" 193 | notify-send --app-name 'AstroArch' --icon="/home/astronaut/.astroarch/assets/icons/novnc-icon.svg" -t 10000 'GPS' "🛑 GPS server disabled. Remember to re-enable it if you want it to start automatically at boot" 194 | } 195 | -------------------------------------------------------------------------------- /astroarch_build.sh: -------------------------------------------------------------------------------- 1 | # Exit on the first error, if any 2 | set -e 3 | 4 | # Grab the OS architecture for further forked logic 5 | ARCH=$(uname -m) 6 | HAS_VIRT=$(command -v systemd-detect-virt >/dev/null 2>&1 && echo 1 || echo 0) 7 | 8 | # Parallelize pacman download to 5 and use pacman as progress bar 9 | if [ "$HAS_VIRT" -eq 0 ]; then 10 | sed -i 's|#ParallelDownloads = 5|ParallelDownloads = 5|g' /etc/pacman.conf 11 | sed -i 's|ParallelDownloads = 5|ParallelDownloads = 5\nILoveCandy|g' /etc/pacman.conf 12 | sed -i 's|ParallelDownloads = 5|ParallelDownloads = 5\nDisableDownloadTimeout|g' /etc/pacman.conf 13 | fi 14 | 15 | # Add astroarch pacman repo to pacman.conf (it must go first) 16 | if [ "$HAS_VIRT" -eq 0 ]; then 17 | sed -i 's|\[core\]|\[astromatto\]\nSigLevel = Optional TrustAll\nServer = http://astroarch.astromatto.com:9000/$arch\n\n\[core\]|' /etc/pacman.conf 18 | fi 19 | 20 | # Bootstrap pacman-key 21 | pacman-key --init && pacman-key --populate archlinuxarm 22 | 23 | # Update all packages now 24 | pacman -Syu --noconfirm 25 | 26 | # Install just 2 packages for the next actions 27 | # list of commented locales 28 | pacman -S wget sudo git --noconfirm 29 | 30 | # create user astro with home, add it to wheel 31 | useradd -G wheel -m astronaut 32 | echo "astronaut:astro" | chpasswd 33 | 34 | # Pull the brain repo, this will be used for scripting out the final image 35 | su astronaut -c "git clone https://github.com/devDucks/astroarch.git /home/astronaut/.astroarch" 36 | 37 | # Uncomment en_US UTF8 and generate locale files 38 | sed -i -e 's/#en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/g' /etc/locale.gen 39 | locale-gen 40 | 41 | # If we are on QEMU, packages have already been pulled in the docker phase - install only the pi kernel 42 | if [ "$HAS_VIRT" -eq 1 ]; then 43 | pacman -Syu linux-rpi linux-rpi-headers linux-firmware --noconfirm --ask 4 44 | else 45 | pacman -Syu base-devel pipewire-jack gnu-free-fonts wireplumber \ 46 | zsh plasma-desktop sddm networkmanager xf86-video-dummy \ 47 | network-manager-applet networkmanager-qt xorg konsole \ 48 | gpsd breeze-icons hicolor-icon-theme knewstuff tigervnc \ 49 | knotifyconfig kplotting qt6-datavis3d qt5-quickcontrols \ 50 | qt6-websockets qtkeychain stellarsolver xf86-video-fbdev \ 51 | xplanet plasma-nm dhcp dnsmasq kate plasma-systemmonitor \ 52 | dolphin uboot-tools usbutils cloud-guest-utils samba paru \ 53 | websockify novnc astrometry.net gsc kstars phd2 packagekit-qt6 \ 54 | indi-3rdparty-libs indi-3rdparty-drivers linux-rpi linux-rpi-headers \ 55 | i2c-tools indiserver-ui astro_dmx openssl-1.1 firefox chrony \ 56 | ksystemlog discover kwalletmanager kgpg qt6-serialbus \ 57 | qt6-serialport qt6ct udisks2 xorg-fonts-misc fuse2 \ 58 | fortune-mod cowsay pacman-contrib arandr neofetch \ 59 | astromonitor kscreen sddm-kcm flatpak plasma-x11-session \ 60 | kdialog jq astroarch-onboarding dhcpcd iw --noconfirm --ask 4 61 | fi 62 | 63 | 64 | # Allow wheelers to sudo without password to install packages 65 | sed -i 's/# %wheel ALL=(ALL:ALL) NOPASSWD: ALL/%wheel ALL=(ALL:ALL) NOPASSWD: ALL/g' /etc/sudoers 66 | 67 | # Add astronaut to uucp for serial device ownership 68 | usermod -aG uucp,sys,network,power,audio,input,lp,storage,video,users astronaut 69 | 70 | # Add sddm user to video group 71 | usermod -aG video sddm 72 | 73 | # Allow x11 forwarding over SSH 74 | sed -i 's/#AllowTcpForwarding yes/AllowTcpForwarding yes/g' /etc/ssh/sshd_config 75 | sed -i 's/#X11DisplayOffset 10/X11DisplayOffset 10/g' /etc/ssh/sshd_config 76 | sed -i 's/#X11UseLocalhost yes/X11UseLocalhost yes/g' /etc/ssh/sshd_config 77 | 78 | # Install AUR packages 79 | su astronaut -c "paru -Sy xrdp xorgxrdp --noconfirm" 80 | 81 | # Make all necessary folders 82 | mkdir /etc/sddm.conf.d 83 | su astronaut -c "mkdir -p /home/astronaut/.config" 84 | su astronaut -c "mkdir -p /home/astronaut/Pictures/wallpapers" 85 | su astronaut -c "mkdir -p /home/astronaut/Desktop" 86 | 87 | # install oh-my-zsh and set the default shell to zsh 88 | chsh -s /usr/bin/zsh astronaut 89 | rm /home/astronaut/.bash* 90 | cd /home/astronaut 91 | ZSH=/home/astronaut/.oh-my-zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended 92 | chown -R astronaut:astronaut /home/astronaut/.oh-my-zsh/ 93 | 94 | # Set the samba pass 95 | ln -s /home/astronaut/.astroarch/configs/smb.conf /etc/samba/smb.conf 96 | systemctl start smb 97 | (echo astro; echo astro) | smbpasswd -s -a astronaut 98 | systemctl stop smb 99 | 100 | # Link a zsh config for astronaut 101 | ln -s /home/astronaut/.astroarch/configs/.zshrc /home/astronaut/.zshrc 102 | 103 | # Start NetworkManager and sleep to create the hotspot 104 | systemctl start NetworkManager 105 | sleep 5 106 | 107 | # Remove eventually existing systemd configs we are going to substitute 108 | rm -f /usr/lib/systemd/system/novnc.service 109 | 110 | # Synchronize the system time with the GPS if there is no Real Time Clock (RTC) or network connection to the Raspberry Pi 111 | sed -i '$a\refclock SHM 0 offset 0.5 delay 0.2 refid NMEA' /etc/chrony.conf 112 | 113 | # Disable systemd-timesyncd and enable chronyd 114 | systemctl disable systemd-timesyncd 115 | systemctl enable chronyd 116 | 117 | # Symlink now files 118 | ln -s /home/astronaut/.astroarch/configs/kde_settings.conf /etc/sddm.conf.d/kde_settings.conf 119 | ln -s /home/astronaut/.astroarch/systemd/novnc.service /usr/lib/systemd/system/novnc.service 120 | ln -s /home/astronaut/.astroarch/systemd/x0vncserver.service /etc/systemd/system/x0vncserver.service 121 | ln -s /home/astronaut/.astroarch/systemd/resize_once.service /etc/systemd/system/resize_once.service 122 | ln -s /home/astronaut/.astroarch/configs/.astroarch.version /home/astronaut/.astroarch.version 123 | ln -s /home/astronaut/.astroarch/systemd/x0vncserver-xrdp.service /etc/systemd/user/x0vncserver-xrdp.service 124 | 125 | # Copy xorg config 126 | cp /home/astronaut/.astroarch/configs/xorg.conf /etc/X11/ 127 | 128 | # Copy v3d X config 129 | cp /home/astronaut/.astroarch/configs/99-v3d.conf /etc/X11/xorg.conf.d 130 | 131 | # Copy udev rule to disable wifi power saving 132 | cp /home/astronaut/.astroarch/configs/81-wifi-powersave.rules /etc/udev/rules.d/81-wifi-powersave.rules 133 | 134 | # Polkit rules go here 135 | cp /home/astronaut/.astroarch/configs/99-polkit-power.rules /etc/polkit-1/rules.d/ 136 | cp /home/astronaut/.astroarch/configs/50-udiskie.rules /etc/polkit-1/rules.d/ 137 | cp /home/astronaut/.astroarch/configs/50-networkmanager.rules /etc/polkit-1/rules.d/ 138 | 139 | # Copy the systemd unit to create the AP the first boot 140 | cp /home/astronaut/.astroarch/systemd/create_ap.service /etc/systemd/system/ 141 | 142 | # Enable vncserver 143 | systemctl enable x0vncserver 144 | 145 | # Enable xrdp 146 | mv /etc/xrdp/startwm.sh /etc/xrdp/startwm.sh-old 147 | ln -sfn /home/astronaut/.astroarch/configs/startwm.sh /etc/xrdp/startwm.sh 148 | ln -sfn /home/astronaut/.astroarch/configs/Xwrapper.config /etc/xrdp/Xwrapper.config 149 | # Add user xrdp 150 | useradd xrdp -d / -c 'xrdp daemon' -s /usr/sbin/nologin 151 | # Set user in xrdp.ini 152 | sed -i '/#runtime_user=xrdp/s/^#//' /etc/xrdp/xrdp.ini 153 | sed -i '/#runtime_group=xrdp/s/^#//' /etc/xrdp/xrdp.ini 154 | sed -i 's/bitmap_cache=true/bitmap_cache=false/g' /etc/xrdp/xrdp.ini 155 | # Set user in xrdp.sesman.ini 156 | sed -i '/#SessionSockdirGroup=xrdp/s/^#//' /etc/xrdp/sesman.ini 157 | sed -i '/TerminalServerUsers=tsusers/s/^/#/' /etc/xrdp/sesman.ini 158 | # Set permissions 159 | chown root:xrdp /etc/xrdp/rsakeys.ini 160 | chmod u=rw,g=r /etc/xrdp/rsakeys.ini 161 | chmod 755 /etc/xrdp/cert.pem 162 | chmod 755 /etc/xrdp/key.pem 163 | # Allows adding devices from the xorg.conf.d section 164 | sed -i '/Option "AutoAddDevices" "off"/s/^/#/' /etc/X11/xrdp/xorg.conf 165 | 166 | # 167 | su astronaut -c "cat </home/astronaut/.config/plasmanotifyrc 168 | [DoNotDisturb] 169 | WhenFullscreen=false 170 | WhenScreensMirrored=false 171 | EOF" 172 | 173 | # Copy the config for kwinrc 174 | su astronaut -c "cp /home/astronaut/.astroarch/configs/kwinrc /home/astronaut/.config" 175 | 176 | # Create the folder (owned by astronaut) to store index files that requires no root access 177 | su astronaut -c "mkdir -p /home/astronaut/.local/share/kstars/astrometry" 178 | 179 | # Enable now all services 180 | systemctl enable sddm.service \ 181 | novnc.service \ 182 | dhcpcd.service \ 183 | NetworkManager.service \ 184 | avahi-daemon.service \ 185 | nmb.service \ 186 | smb.service \ 187 | xrdp.service \ 188 | xrdp-sesman.service 189 | 190 | # If we are on qemu, enable also the AP creation and resize scripts 191 | if [ "$HAS_VIRT" -eq 1 ]; then 192 | systemctl enable create_ap.service resize_once.service 193 | fi 194 | 195 | # Take sudoers to the original state 196 | sed -i 's/%wheel ALL=(ALL:ALL) NOPASSWD: ALL/# %wheel ALL=(ALL:ALL) NOPASSWD: ALL/g' /etc/sudoers 197 | sed -i 's/# %wheel ALL=(ALL:ALL) ALL/%wheel ALL=(ALL:ALL) ALL/g' /etc/sudoers 198 | 199 | # Copy wallpapers 200 | su astronaut -c "cp /home/astronaut/.astroarch/wallpapers/bubble.jpg /home/astronaut/Pictures/wallpapers" 201 | su astronaut -c "cp /home/astronaut/.astroarch/wallpapers/south-milky.jpg /home/astronaut/Pictures/wallpapers" 202 | su astronaut -c "cp /home/astronaut/.astroarch/wallpapers/pacman.jpg /home/astronaut/Pictures/wallpapers" 203 | 204 | # Autostart AstroArch-onboarding 205 | su astronaut -c "mkdir /home/astronaut/.config/autostart" 206 | 207 | # Copy desktop icons 208 | su astronaut -c "ln -snf /usr/share/applications/org.kde.konsole.desktop /home/astronaut/Desktop/Konsole" 209 | su astronaut -c "ln -snf /usr/share/applications/org.kde.kstars.desktop /home/astronaut/Desktop/Kstars" 210 | su astronaut -c "ln -snf /usr/share/applications/astrodmx_capture.desktop /home/astronaut/Desktop/AstroDMx_capture" 211 | su astronaut -c "ln -snf /usr/share/applications/phd2.desktop /home/astronaut/Desktop/PHD2" 212 | su astronaut -c "ln -snf /home/astronaut/.astroarch/desktop/update-astroarch.desktop /home/astronaut/Desktop/update-astroarch" 213 | su astronaut -c "ln -snf /home/astronaut/.astroarch/desktop/astroarch-tweak-tool.desktop /home/astronaut/Desktop/AstroArch-Tweak-Tool" 214 | su astronaut -c "ln -snf /usr/share/astroarch_onboarding/desktop/AstroArch-onboarding.desktop /home/astronaut/Desktop/AstroArch-onboarding" 215 | su astronaut -c "cp /usr/share/astroarch_onboarding/desktop/AstroArch-onboarding-x11.desktop /home/astronaut/.config/autostart/AstroArch-onboarding-x11.desktop" 216 | su astronaut -c "cp /usr/share/astroarch_onboarding/desktop/AstroArch-onboarding-xrdp.desktop /home/astronaut/.config/autostart/AstroArch-onboarding-xrdp.desktop" 217 | 218 | # Make the icons executable so there will be no ! on the first boot 219 | chmod +x /home/astronaut/Desktop/update-astroarch 220 | chmod +x /home/astronaut/Desktop/AstroArch-onboarding 221 | chmod +x /home/astronaut/Desktop/AstroArch-Tweak-Tool 222 | 223 | # Remove actual novnc icons 224 | rm -r /usr/share/webapps/novnc/app/images/icons/* 225 | 226 | # Copy custom novnc icons folder 227 | cp -r /home/astronaut/.astroarch/assets/icons/* /usr/share/webapps/novnc/app/images/icons 228 | 229 | # config hostnames 230 | echo "astroarch" > /etc/hostname 231 | echo "127.0.0.1 localhost" >> /etc/hosts 232 | echo "127.0.1.1 astroarch" >> /etc/hosts 233 | 234 | # Copy the screensaver config, by default it is off 235 | su astronaut -c "cp /home/astronaut/.astroarch/configs/kscreenlockerrc /home/astronaut/.config/kscreenlockerrc" 236 | 237 | # Set a standard TZ to avoid breaking plasma clock widget 238 | timedatectl set-timezone Europe/London 239 | 240 | # If we are on a raspberry let's adjust /boot/config.txt 241 | cp /home/astronaut/.astroarch/configs/config.txt /boot/config.txt 242 | 243 | install -o root -g root -m 644 /home/astronaut/.astroarch/configs/kdeglobals /etc/xdg/ 244 | 245 | # Config plasma theme AstroArch 246 | cp -r /home/astronaut/.astroarch/configs/look-and-feel/astroarch /usr/share/plasma/look-and-feel/ 247 | cp -r /home/astronaut/.astroarch/configs/layout-templates/astroarchPanel /usr/share/plasma/layout-templates/ 248 | 249 | # Disable Kwallet by default 250 | su astronaut -c "echo $'[Wallet]\nEnabled=false' > /home/astronaut/.config/kwalletrc" 251 | 252 | # Increases the xrdp buffer 253 | sudo sed -i 's|#tcp_send_buffer_bytes=32768|tcp_send_buffer_bytes= 4194304|g' /etc/xrdp/xrdp.ini 254 | 255 | # Modprobe brcmfmac 256 | bash -c "echo \"options brcmfmac feature_disable=0x282000\" > /etc/modprobe.d/brcmfmac.conf" 257 | 258 | # Override cmdline.txt (Only on QEMU) 259 | if [ "$HAS_VIRT" -eq 1 ]; then 260 | echo "root=UUID=$(blkid -s UUID -o value /dev/vda2) rw rootwait console=tty1 fsck.repair=yes video=HDMI-A-1:1920x1080M@60D" > /boot/cmdline.txt 261 | fi 262 | 263 | # Reboot and enjoy now, if QEMU stop and add indexes 264 | if [ "$HAS_VIRT" -eq 0 ]; then 265 | reboot 266 | else 267 | echo "Astroarchization achieved, now it's your turn" 268 | fi 269 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Welcome to AstroArch! Astrophotography on ArchLinux for Raspberry Pi, PC and mini PC (works also on Manjaro and all Arch derived distros) 2 | 3 | [![Discord chat][discord-badge]][discord-url] <= Join us on discord! 4 | 5 | [discord-badge]: https://img.shields.io/discord/1100468635086106706?logo=discord&style=flat-square 6 | [discord-url]: https://discord.gg/uJEQCZKBT8 7 | 8 | ![astroarch](https://github.com/devDucks/astroarch/assets/4163222/d26c8d0b-a5ad-404b-8c2d-ef0a04f2f19a) 9 | 10 | 11 | Please find below some (hopefully) useful instructions, if you are here instead because you want to know how you can build this image from scratch, see [this](https://github.com/MattBlack85/astroarch/blob/main/BUILD.md) 12 | - [Quick video intro](#quick-video-intro-to-astroarch) 13 | - [What Raspberry is supported?](#what-raspberry-version-is-supported) 14 | - [Why ArchLinux?](#why-archlinux) 15 | - [Download](#download) 16 | - [Flash the image to SD](#flash-the-img-to-an-sd) 17 | - [On first boot - things to know](#first-boot) 18 | - [Performance and compositor](#performance-and-compositor) 19 | - [Connecting via noVNC (browser)](#connecting-via-browser-novnc) 20 | - [Connecting via VNC client (this is the preferred way)](#connecting-via-vnc-client) 21 | - [Connecting via XRDP client](#connecting-via-xrdp-client) 22 | - [Issues with VNC](#issues-with-vnc) 23 | - [How can I use a raspberry camera?](#how-can-i-use-a-raspberry-camera) 24 | - [How can I boot from USB/SDD?](#boot-from-external-disk-usb-hdd-ssd-nvme) 25 | - [Kstars hours is not correct, how can I fix it?](#set-timezone) 26 | - [What are the passwords for the user and the hotspot?](#passwords) 27 | - [Protect VNC with a password](#how-to-protect-vnc-with-password) 28 | - [Useful commands](#useful-commands) 29 | - [List of available software](#software-available) 30 | - [How can I add a RTC to AstroArch?](#how-to-add-a-rtc) 31 | - [How to make a GPS dongle working?](#using-a-gps-dongle) 32 | - [How to enable bluetooth?](#how-to-enable-bluetooth) 33 | - [How to enable an FTP server?](#how-to-enable-ftp) 34 | - [Where can I find more packages?](#where-to-find-more-pacakges) 35 | - [How can I install Python packages?](#how-to-install-python-packages) 36 | - [reporting problems](#reporting-issues) 37 | - [For PC/mini PC running an ArchLinux derived distro (Manjaro, ArcoLinux, etc.)](#use-only-the-astro-packages-mantained-for-astroarch-on-pc-and-mini-pc) 38 | - [Tips](#tips) 39 | 40 | # What Raspberry version is supported? 41 | AstroArch runs on any raspberry capable to run aarch64 OS, this means `Raspberry Pi 4` and of course `Raspberry Pi 5` 42 | 43 | Note on the possible back-powering of the raspberry by a mount, camera, powered USB hub or other devices having its own power source and connected to the raspberry by USB. Plug in your raspberry then connect each device so as not to have issues for your AstroArch. 44 | 45 | # Download 46 | Please use this link to download the latest astroarch gzipped img file => 47 | https://drive.google.com/file/d/1CzN3f9_lNp2InT2PLvp_vflsW7gywFZB/view 48 | # Why ArchLinux? 49 | Why ArchLinux? 50 | 51 | Because control matters. 52 | Because when you're under the stars, 200 km from the nearest Wi‑Fi, you don't want to wrestle with package managers or beg an outdated distro for a newer kernel. 53 | 54 | ArchLinux gives us clarity. 55 | No cruft. No bloated defaults. No assumptions. 56 | Just a fast, minimal, bleeding-edge base that stays out of your way and respects your intent. 57 | Exactly what an astrophotography system should do. 58 | 59 | Some ask, why not Raspbian? 60 | Because I’ve used it. Because I’ve waited weeks for upstream fixes to trickle through layers of bureaucracy. Because when something breaks in the field at 2 AM, I’d rather pacman -Sy than dig through obsolete forum posts. 61 | Because I’ve seen what happens when distros try to protect you by locking the door and hiding the keys. 62 | 63 | This isn’t about gatekeeping. 64 | This is about choosing the right tool for the job—even if it demands more from the user. 65 | If you're the kind of person who compiles INDI from source just to try a bleeding-edge driver, 66 | then you already get it. 67 | Arch isn't a barrier. It's a launchpad. 68 | 69 | AstroArch was built for those who tinker. For those who read logs instead of rebooting. For those who know that freedom and responsibility walk hand in hand. 70 | 71 | You don't have to like Arch. 72 | But I do. And that’s why we're here. 73 | 74 | AstroArch was built for curiosity, not consensus. 75 | Even if I’m the only one who finds joy in it—tuning drivers, reshaping workflows, and bending the system to my will—that’s enough. 76 | But if that sounds like your kind of fun, welcome aboard. 77 | 78 | # Flash the img to an SD 79 | If you prefer a GUI, use [balenaHetcher](https://www.balena.io/etcher/) otherwise you can use the unix `dd` to flash it, and if you are using `dd` I think 80 | there is nothing I shall explain to you :) 81 | 82 | # First boot 83 | After you burned the .img file to your SD, you _should_ be able to reach astroarch via VNC, however if you don't see the desktop or you can't connect to it 84 | this likely means that unfortunately your raspberry pi rev cannot boot the image. In this case please plug a monitor and report here the output! 85 | Once you are logged in the first thing you should do is update the system, open the terminal and type `update-astroarch` command 86 | 87 | # Set timezone 88 | Here a small video that will show you how to set the timezone without the terminal 89 | 90 | https://github.com/devDucks/astroarch/assets/4163222/a935b491-5b7a-444d-9f89-a01a279063de 91 | 92 | If you want to use the terminal list first the available timezone with `timedatecl list-timezones` and then set the right one with `sudo timedatectl set-timezone Foo/Bar` where Foo/Bar is something like `Europe/Rome` 93 | 94 | Do not forget to set the right timezone! 95 | 96 | # Passwords 97 | To save you some time, here the default password you will need for AstroArch: 98 | - the user password for `astronaut` (which is the user used to login or for ssh) is `astro` 99 | - the password for the `AstroArch-XXXXXXX` WiFi hotspot is `astronomy` 100 | 101 | # Performance and compositor 102 | IMPORTANT! 103 | Be aware that from version 2.0 the compositor is enabled by default, while this will enhance by a lot graphics (making everything smoother) it will probably increase 104 | system resource utilisation. If you want to disable it, just add the following line `Enabled=false` in the file `/home/astronaut/.config/kwinrc` 105 | 106 | # How to protect VNC with password 107 | If you want to add more security to your installation (or maybe you are at a starparty with more users running AstroArch), you may want to add a password to VNC (by default there is no password). 108 | To do so first set a password running `sudo vncpasswd` and after that edit `/etc/systemd/system/x0vncserver.service` changing the ExecStart line from this 109 | 110 | 111 | ``` 112 | ExecStart=x0vncserver -display :0 -SecurityTypes None 113 | ``` 114 | 115 | 116 | to this 117 | 118 | 119 | ``` 120 | ExecStart=x0vncserver -display:0 -rfbauth /root/.vnc/passwd 121 | ``` 122 | 123 | Reboot and now you should be prompted to input a password when connecting via VNC 124 | 125 | # How can I use a raspberry camera 126 | AstroArch finally supports raspberry cameras via indi pylibcamera, to install it and having fun with it just run `sudo pacman -S indi-pylibcamera` 127 | 128 | # Use only the astro packages maintained for AstroArch on PC and mini PC 129 | If you have an x64 distro based on ArchLinux on your PC and you just want to access the packages I maintain (kstas, phd2, stellarsolver, indi, indi libs and drivers) add my repo to your pacman.conf file (under /etc/pacman.conf) **before** the [core] section, the repo looks like the following 130 | ``` 131 | [astromatto] 132 | SigLevel = Optional TrustAll 133 | Server = http://astroarch.astromatto.com:9000/$arch 134 | ``` 135 | 136 | after that run `sudo pacman -Sy && sudo pacman -S kstars phd2 indi-3rdparty-drivers stellarsolver` 137 | 138 | # Useful commands 139 | The following are some useful commands that you can run from the terminal so you don't have to deal with complicated stuff by yourself if you don't want to: 140 | - `update-astroarch` => this command will update system packages (including kstars, indi, etc. if there are new versions) and will pull any fix for astroarch itself, additionally will update the astroarch configuration that may bring in more commands etc. 141 | - `astro-rollback-indi` => rollback automatically indi to the previous version 142 | - `astro-rollback-kstars` => rollback automatically indi to the previous version 143 | - `astro-rollback-full` => rollback automatically indi and kstars to the previous version 144 | - `use-astro-bleeding-edge` => install bleeding edge packages for Kstars and INDI 145 | - `use-astro-stable` => install stable packages for Kstars and INDI 146 | 147 | # Connecting via browser (noVNC) 148 | By default `AstroArch` will start a hostpot called `AstroArch`, to connect to that WiFi network use the password `astronomy` 149 | 150 | noVNC is installed and it will start by default, if your pi is wired to your network you can connect to it with the following methods: 151 | - **http://astroarch.local:8080/vnc.html** 152 | - if the previous method doesn't work, find your raspberry pi IP, connect to it through your browser typing `http://RASPBERRY_IP:8080/vnc.html` 153 | 154 | otherwise, if you want to connect to its hotspot, find the WiFi network `AstroArch` (the pass is `astronomy`) and type in your browser `http://10.42.0.1:8080/vnc.html` 155 | 156 | Welcome to astro arch! 157 | 158 | # Connecting via VNC client 159 | If you trust me, this should be always the preferred way to connect using VNC. noVNC goes through the browser and is less fluid and performant than a real VNC client. 160 | You can use whatever VNC client you prefer, there should be no issue. 161 | 162 | The address is `astroarch.local` (or the IP if you prefer) and the port is 5900. 163 | 164 | If you have started an Xorg session with Xrdp, you can connect with your VNC client on port 5910. 165 | 166 | Few VNC client suggestions (work an all platforms): 167 | - TigerVNC (https://tigervnc.org/) 168 | - RealVNC (https://www.realvnc.com/en/) 169 | 170 | # Connecting via XRDP client 171 | Another option to control your Raspberry Pi remotely is to use an XRDP client. For this you can use the "remote desktop connection" tool if you are on Windows or on Linux or a software like FreeRDP. 172 | You can also, after installing the xfreerdp package corresponding to your distribution, use the command line: xfreerdp /dynamic-resolution /u:astronaut /w:1920 /h:1080 /v:X.X.X.X (Where X.X.X.X is the IP address of the pi) 173 | 174 | Xrdp is smoother and faster than vnc but be aware that it also consumes at least 500M of memory. This can be limiting for use on a Raspberry with only 4G. 175 | 176 | XRDP and VNC have different purposes. VNC only allows you to replicate the user's existing session. XRDP can also do this by selecting the vnc-any session. However, the main use of XRDP is not to replicate but to open a new Xorg session for the user on the Display 10.0 environment variable. 177 | 178 | To connect with a new Xorg session (recommended): 179 | 180 | image 181 | 182 | To connect with a VNC session: 183 | 184 | image 185 | 186 | 187 | 188 | 189 | ```mermaid 190 | flowchart TD 191 | A@{ shape: curv-trap, label: "Xorg Display :0" } 192 | B[XRDP Server] 193 | C@{ shape: curv-trap, label: "Xorg Display :10" } 194 | D[TigerVNC server port 5900] 195 | E[TigerVNC server port 5910] 196 | subgraph Display :0 197 | A --> D 198 | end 199 | subgraph Display :10 200 | B --> C 201 | C --> E 202 | end 203 | D ---> F@{ shape: stadium, label: "VNC Client"} 204 | D --> |any-vnc| G@{ shape: stadium, label: "Xrdp Client"} 205 | C --> G 206 | E --> F 207 | ``` 208 | 209 | 210 | # Issues with VNC 211 | 212 | Beware of metal cases and USB3 hubs, which can interfere with the RPI's Wi-Fi driver. Try connecting an external Wi-Fi antenna to your Raspberry. 213 | 214 | Before continuing, check the status of your brcmfmac driver. Use the command `journalctl -b --since today | grep brcmfmac or dmesg | grep brcmfmac`. 215 | If you get a brcmfmac error: brcmf_set_channel: set chanspec 0x100c fail, reason -52, you must run these commands: 216 | 217 | ``` 218 | sudo systemctl stop wpa_supplicant 219 | sudo systemctl stop NetworkManager 220 | sudo systemctl stop x0vncserver 221 | sudo killall wpa_supplicant 222 | sudo rfkill unblock all 223 | sudo modprobe -r brcmfmac_wcc 224 | sudo modprobe -r brcmfmac 225 | sudo modprobe brcmfmac 226 | sudo systemctl start wpa_supplicant 227 | sudo systemctl start NetworkManager 228 | sudo systemctl start x0vncserver 229 | sudo /home/astronaut/.astroarch/scripts/create_ap.sh 230 | reboot 231 | ``` 232 | 233 | After restarting, check that you no longer have any errors with the brcmfmac driver. 234 | 235 | Other controls: 236 | 237 | - Check that the RPI and your PC/tablet are using WPA2. 238 | 239 | - Check your PC's Wi-Fi settings to ensure that IPV6 is not enabled. Normally, IPV6 is disabled for the access point on AstroArch. 240 | 241 | 242 | Check that Wi-Fi power management is disabled on the client PC you are connecting to the Raspberry Pi using the iwconfig command. If it is not disabled, you must disable it permanently. 243 | 244 | **Linux Mint / Ubuntu / Debian** 245 | 246 | `sudo nano /etc/NetworkManager/conf.d/default-wifi-powersave-on.conf` 247 | 248 | ``` 249 | [connection] 250 | wifi.powersave = 2 251 | ``` 252 | 253 | **ArchLinux** 254 | 255 | /etc/udev/rules.d/81-wifi-powersave.rules 256 | 257 | ``` 258 | ACTION==“add”, SUBSYSTEM==‘net’, KERNEL==“wl*”, RUN+=“/usr/bin/iw dev wlan0 set power_save off” 259 | ``` 260 | Change wlan0 to the name of your wifi that you will find with the ifconfig command. 261 | 262 | Other considerations: 263 | 264 | - Try changing the Wi-Fi frequency of your RPI and your PC from “automatic” to “2.4 GHz.” Change the channel if necessary. 265 | 266 | - Try changing your regdomain. To configure the regdomain, install wireless-regdb and reboot, then edit the /etc/conf.d/wireless-regdom file and uncomment the appropriate domain by removing the # sign in front of your country code (e.g., US), or add cfg80211.ieee80211_regdom=" your country code" to cmdline.txt. 267 | 268 | - If you are using RealVNC Viewer, set the image quality to high in the options. Other values ​​cause CPU issues. 269 | 270 | # Adding swap 271 | By default astroarch don't have swap, for prevent issues about memory space you can add a swap file and enable it, we will set swappiness to 10 don't use swap file if RAM space is ok. 272 | In this example we make a 2GB swapfile 273 | ``` 274 | sudo fallocate -l 2G /swapfile 275 | sudo chmod 600 /swapfile 276 | sudo mkswap /swapfile 277 | sudo swapon /swapfile 278 | sudo echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.d/99-swappiness.conf 279 | ``` 280 | 281 | Check swappiness 282 | ``` 283 | $ cat /proc/sys/vm/swappiness 284 | 10 285 | ``` 286 | Check if Swap is enabled 287 | ``` 288 | free -h 289 | ``` 290 | Output should be something like this on Swap row : 291 | ``` 292 | $ free -h 293 | total used free shared buff/cache available 294 | Mem: 3.7Gi 1.4Gi 1.1Gi 88Mi 1.3Gi 2.3Gi 295 | Swap: 2.0Gi 0B 2.0Gi 296 | ``` 297 | Make permanent swapfile on system 298 | ``` 299 | $ sudo echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab 300 | ``` 301 | 302 | # Boot from external disk (USB, HDD, SSD, NVME) 303 | If you want to use an alternative media to boot AstroArch, just flash the image to your support and it will work out of the box for USB and SSDs! No special steps are required 304 | 305 | If you have a NVMe there are some additional steps to be able to boot from it: 306 | - install rpi-eeprom with `sudo pacman -S rpi5-eeprom` (or rpi4-eeprom if you have a rasberry4) 307 | - be sure to run the latest eeprom firmware `sudo rpi-eeprom-update -a` 308 | - *be sure to read this table https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#boot_order-fields* 309 | - decide the boot order for your raspberry, bear in mind that the priority goes right to left, so for example, if you want your boot 310 | to be something like NVMe first, then USB then SD card the values to put in the `BOOT_ORDER` field would be 641 but since it's reversed we should put 146 311 | with a final value (put always the f) of `0xf146` 312 | - create a new file with the following command 313 | ```sh 314 | cat>eeprom.conf<[!IMPORTANT] 328 | >For non-PD power supplies, or those not recognized as such, the Raspberry Pi considers them to provide 3 A. It then limits the current to 0.6 A and USB boot is disabled by default. See: 329 | >https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#differences-on-raspberry-pi-5 330 | > 331 | >You must add the parameter `usb_max_current_enable=1` to the config.txt file if you are not using the official power supply or a PD-certified power supply. During initial setup with AstroArch-onboarding, in the Power supplies panel, select Power supply without USBC-C PD 332 | 333 | # Software available 334 | the following software will be available, by category 335 | 336 | ### Astronomical 337 | - Kstars 3.7.9 338 | - phd2 2.6.13dev2 339 | - indi libs 2.1.6 **(all of them)** 340 | - indi drivers 2.1.6 **(all of them)** 341 | - most of the widefield indexes for plate solving 342 | - astromonitor (you never heard of it? Check it here https://github.com/MattBlack85/astro_monitor) 343 | - AstroDMx (a capture software like FireCapture) 344 | 345 | ### OS 346 | - Konsole (terminal) 347 | - KDE Plasma (Desktop environment) 348 | - pacman (package manager, this is **NOT** debian based and pacman instead of apt is your package manager 349 | - NetworkManager (to manage networks) 350 | - Discovery (to install other packages) 351 | 352 | ### Connectivity 353 | - tigervnc (x0vncserver) 354 | - noVNC 355 | 356 | ### Browser 357 | - chromium (like chrome, but without google tracking code) 358 | - firefox 359 | 360 | # How to add a RTC 361 | Adding a RTC to AstroArch is easy from version 1.6. 362 | First, wire your RTC to your pi, open a terminal and type `sudo i2cdetect -y 1` you should see a similar table, take note of the number for the next steps 363 | ![i2cdetect](https://github.com/devDucks/astroarch/assets/4163222/147f90ed-6f56-43ab-900b-0ad0c44f919c) 364 | 365 | Now find the line `dtoverlay=i2c-rtc` in `/boot/config.txt` and modify it by adding a comma and the name of your RTC device, in my case for the ds3231 will be `dtoverlay=i2c-rtc,ds3231` 366 | 367 | Reboot your Raspberry PI and if you type again `sudo i2cdetect -y 1` you should now see a `UU` instead of the number, this means the kernel module for your RTC has been loaded correctly. 368 | 369 | That's all you need! We just enabled automatic modules to setup the system time from the RTC if it's present! No more steps are required! 370 | 371 | Reboot your PI and you should have the time automatically synchronized when it starts! 372 | 373 | If you want to remove the RTC sync just drop `,xxxx` from `/boot/config.txt` at line `dtoverlay=i2c-rtc,xxxx` 374 | 375 | # Using a GPS dongle 376 | To use a GPS dongle, simply plug in your device and activate the GPSD service which is disabled by default. So the only command required is `sudo systemctl enable gpsd --now` and the service will start automatically after each boot. You can also manually edit `/etc/gpsd` and hardcode the device path on the `DEVICES=""` line with `DEVICES="/dev/gps0"` 377 | 378 | Otherwise, simply use the following command `gps_on` to perform these two operations. 379 | 380 | If you want to disable automatic startup of the GPS daemon, run `gps_off`. 381 | 382 | ADDITIONAL CONSIDERATIONS (use these as guidelines): 383 | 384 | If you are having trouble getting the signal, you may need to protect your USB3 cables (they interfere with the GPS signal) 385 | if the device is not recognized (which is very unlikely on ArchLinux), we do not recommend using ttyXXX as it may point to other serial devices after a reboot 386 | 387 | # How to enable bluetooth 388 | By default there are no packages to enabling bluetooth, to install them and enabling bluetooth functionalities run the following command `bluetooth_on`, this command will install the BT packages and enable the bluetooth daemon to run automatically at boot. 389 | If you want to disable bluetooth daemon autostart just run `bluetooth_off` and if you want to remove it run `bluetooth_remove` 390 | 391 | # How to enable FTP 392 | Identical to Bluetooth, there is no default package to activate an FTP server. 393 | 394 | To install and activate it, run the following command `ftp_on`. This command will install the Very Secure FTP Daemon package and allow the FTP server to run automatically on startup. 395 | 396 | To connect from a remote station, use an FTP client such as FileZilla or other. All you need to do is identify yourself with the astronaut user, his password and the IP address where the server is located. You will easily find the IP address of your LAN or WLAN with the ifconfig command in a console. Once connected, you can very quickly transfer your files in both directions. 397 | 398 | If you want to disable the automatic start of the FTP server, simply run `ftp_off` and if you want to remove it, run `ftp_remove`. 399 | 400 | # Where to find more packages? 401 | If you want to install more packages you should look what is available here https://archlinuxarm.org/packages - if you find the package there you can easily install it running `sudo pacman -S PACKAGE_NAME`, 402 | if you want to install packages using a GUI instead, open discovery (the blue bag icon on the tray) and follow the instructions. 403 | 404 | If the package you are looking for is not there you may additionally have a look at the AUR https://aur.archlinux.org/ - AUR is a list of packages maintained by the community, 405 | they are not ready to be installed so they can't be installed with pacman but instead you need `paru` (already installed on AstroArch), if you find your package on the AUR run `paru -S PACKAGE_NAME` 406 | it will ask you for a review (confirm it) and then it will compile the package for you and install it. Please be patient, some packages are just huges and it may take some time to compile on lower hardware like the raspberry. 407 | Even for AUR there is a graphical installer (although I never used it and I cannot guarantee if it works well or not), run `sudo pacman -S pamac-full` and you can run `pamac` to install graphically packages from the AUR. 408 | 409 | What if your package is not in the AUR or the official ArchLinux repository? Please let me know, it is not hard to package stuff for ArchLinux and in fact I already do it for few things, I can take a look at the source and if possible I will try to package 410 | it for Arch so that you may be able to install it using pacman. 411 | 412 | # How to install Python packages? 413 | PLEASE READ THIS CAREFULLY 414 | 415 | Python packages via pip installing has changed over time and it now looks way more different than it was years ago, this may looks like a cultural shock if you are coming from more stable distros (Debian and similar) that still didn't catch up with this change but bear with us; 416 | installing packages via pip globally is not supported anymore by default (`sudo pip install`) cause it messes up distro packaging. If you try to do so you will see an error message suggesting to use a virtual environment (which, by the way, is a GREAT suggestion). 417 | Sometimes vietual envs are not simply possible, so there are 3 ways to achieve the wanted result: 418 | 1) install the package via the package manager (pacman) - if the python package you want to install is a common one, there is a big chance it's been packaged for ArchLinux already and you can install it with pacman - BEST WAY 419 | 2) open an issue here on github and let me know what python packages you would like to see available to be installed via `pacman`, it will take few days to few weeks depending on availability but it is doable - RECOMMENDED WAY if 1 is not possible 420 | 3) bypass the pip check and force a global install running `sudo pip install --break-system-packages PACKAGE_NAME` - NOT RECOMMENDED and likely to break other dependencies in the long run, if you do so, we do not offer any support, sorry! 421 | 422 | # Reporting issues 423 | AstroArch is actually in a stable state, however, should you find any issue please report them here https://github.com/MattBlack85/astroarch/issues this will help me tracking them and ship a fix for them 424 | 425 | # Tips 426 | 427 | - If you restart AstroArch-onboarding, it will not retain your configuration except for the locale settings (language, location, and keyboard). You must make your choices again, otherwise it will use the default configuration 428 | - If you are not comfortable with command lines for the “Useful commands” section, use AstroArch Tweak Tool 429 | - If you need help from someone else, simply install the RustDesk software. This will allow the other person who has the same software with the ID and one-time password you provide to connect to your Raspberry Pi (easy and secure) 430 | - The xgps software in the Applications panel under “Utilities” allows you to view information from your GPS device 431 | 432 | # Quick video intro to AstroArch 433 | 434 | https://github.com/devDucks/astroarch/assets/4163222/27bb0842-2db0-4db7-83e5-c513c8e02f5a 435 | 436 | 437 | --------------------------------------------------------------------------------