base 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. #!/usr/bin/env bash
  2. # NAME: Install base system packages with hardware detection
  3. set -euo pipefail
  4. # Source common functions
  5. source "$(dirname "$0")/../common.sh" || {
  6. echo "[ERROR] Could not source common.sh" >&2
  7. exit 1
  8. }
  9. check_requirements() {
  10. if ! command_exists paru; then
  11. log_error "paru not found. Install it first"
  12. exit 1
  13. fi
  14. }
  15. detect_hardware() {
  16. local cpu_vendor gpu_info microcode gpu_packages
  17. cpu_vendor=$(lscpu | grep "Vendor ID" | awk '{print $3}')
  18. gpu_info=$(lspci | grep -i vga)
  19. log_info "Detected CPU: $cpu_vendor"
  20. log_info "Detected GPU: $gpu_info"
  21. # Determine microcode package
  22. case "$cpu_vendor" in
  23. "GenuineIntel")
  24. microcode="intel-ucode"
  25. log_info "Using Intel microcode"
  26. ;;
  27. "AuthenticAMD")
  28. microcode="amd-ucode"
  29. log_info "Using AMD microcode"
  30. ;;
  31. *)
  32. microcode=""
  33. log_warn "Unknown CPU vendor, skipping microcode"
  34. ;;
  35. esac
  36. # Determine GPU drivers
  37. gpu_packages=""
  38. if echo "$gpu_info" | grep -qi "amd\|radeon"; then
  39. gpu_packages="xf86-video-amdgpu vulkan-radeon lib32-vulkan-radeon opencl-mesa lib32-opencl-mesa"
  40. log_info "Using AMD GPU drivers"
  41. elif echo "$gpu_info" | grep -qi "intel"; then
  42. gpu_packages="xf86-video-intel vulkan-intel lib32-vulkan-intel intel-media-driver"
  43. log_info "Using Intel GPU drivers"
  44. elif echo "$gpu_info" | grep -qi "nvidia"; then
  45. gpu_packages="nvidia nvidia-utils lib32-nvidia-utils nvidia-settings"
  46. log_info "Using NVIDIA drivers"
  47. else
  48. log_warn "Unknown GPU, using generic drivers"
  49. fi
  50. }
  51. install_base_system() {
  52. log_info "Installing system base packages"
  53. local base_packages="base base-devel sudo stow linux-cachyos linux-cachyos-headers linux-firmware efibootmgr efitools mkinitcpio grub systemd-boot-manager"
  54. if [[ -n "$microcode" ]]; then
  55. base_packages="$base_packages $microcode"
  56. fi
  57. paru -S --needed --overwrite="*" $base_packages
  58. }
  59. install_networking() {
  60. log_info "Installing networking packages"
  61. paru -S --needed \
  62. networkmanager networkmanager-openvpn network-manager-applet \
  63. dhclient dnsmasq iptables-nft iwd wpa_supplicant wireless-regdb \
  64. bluez-libs blueman openssh
  65. }
  66. install_audio_video() {
  67. log_info "Installing audio and video packages"
  68. paru -S --needed \
  69. pipewire pipewire-alsa pipewire-pulse wireplumber \
  70. pavucontrol alsa-firmware alsa-plugins alsa-utils \
  71. gst-libav gst-plugin-pipewire gst-plugins-bad gst-plugins-ugly \
  72. mpv ffmpegthumbnailer easyeffects lsp-plugins-lv2
  73. }
  74. install_fonts_themes() {
  75. log_info "Installing fonts and themes"
  76. paru -S --needed \
  77. adobe-source-han-sans-cn-fonts adobe-source-han-sans-jp-fonts \
  78. adobe-source-han-sans-kr-fonts adobe-source-serif-fonts \
  79. awesome-terminal-fonts inter-font noto-fonts noto-fonts-cjk noto-fonts-emoji \
  80. ttf-bitstream-vera ttf-dejavu ttf-fantasque-nerd ttf-fira-code ttf-fira-mono \
  81. ttf-fira-sans ttf-font-awesome-5 ttf-liberation ttf-linux-libertine \
  82. ttf-meslo-nerd ttf-ms-win11-auto ttf-opensans otf-font-awesome-5 otf-libertinus \
  83. papirus-icon-theme rose-pine-gtk-theme
  84. }
  85. install_development() {
  86. log_info "Installing development tools"
  87. paru -S --needed \
  88. git git-lfs git-crypt github-cli lazygit \
  89. go go-task python python-defusedxml python-packaging \
  90. python-protobuf python-pynvim python-pywlroots lua luarocks \
  91. ccls cmake ninja neovim-nightly-bin
  92. }
  93. install_cli_utilities() {
  94. log_info "Installing CLI utilities"
  95. paru -S --needed \
  96. bat btop duf dysk dust eza fd fzf glances glow httpie ncdu \
  97. plocate ripgrep tealdeer the_silver_searcher tmux wget \
  98. xdg-user-dirs zoxide yazi yq zsh
  99. }
  100. install_window_managers() {
  101. log_info "Installing window managers and desktop environment"
  102. paru -S --needed \
  103. swaybg swayfx-git swayidle swaylock-effects waybar \
  104. wlogout wdisplays wl-clipboard rofi-lbonn-wayland-git
  105. }
  106. install_gui_applications() {
  107. log_info "Installing GUI applications"
  108. paru -S --needed \
  109. chromium zen-browser-bin \
  110. legcord-bin slack-desktop teams-for-linux-bin \
  111. obs-studio obsidian sublime-merge dbeaver \
  112. libreoffice-fresh kitty nemo nemo-fileroller
  113. }
  114. install_system_utilities() {
  115. log_info "Installing system utilities"
  116. paru -S --needed \
  117. brightnessctl cronie cups cups-pdf gamemode gvfs gvfs-afc gvfs-google \
  118. gvfs-gphoto2 gvfs-mtp gvfs-nfs gvfs-smb haveged hdparm less lvm2 \
  119. man-db man-pages meld modemmanager mtools mupdf netctl nss-mdns \
  120. ntfs-3g ntp nvme-cli opencl-mesa pacman-contrib pass pika-backup \
  121. pkgfile power-profiles-daemon pv reflector remmina rsync rtkit \
  122. samba seahorse sg3_utils smartmontools snapper solaar steam \
  123. steam-native-runtime syncthing localsend system-config-printer \
  124. transmission-qt ufw unrar unzip upower usb_modeswitch usbutils \
  125. vi vorta w3m which xdg-desktop-portal xdg-desktop-portal-gnome \
  126. xdg-desktop-portal-gtk xdg-desktop-portal-wlr yad zenity
  127. }
  128. install_gaming_graphics() {
  129. log_info "Installing gaming and graphics packages"
  130. local gaming_base="lib32-alsa-lib lib32-alsa-plugins lib32-gamemode lib32-libpulse lib32-mesa lib32-openal
  131. lib32-vkd3d lib32-vulkan-mesa-layers vkd3d vulkan-mesa-layers vulkan-tools vulkan-validation-layers
  132. wine protonup-qt"
  133. if [[ -n "$gpu_packages" ]]; then
  134. paru -S --needed $gaming_base $gpu_packages
  135. else
  136. paru -S --needed $gaming_base
  137. fi
  138. }
  139. install_hardware_support() {
  140. log_info "Installing hardware support"
  141. paru -S --needed \
  142. sof-firmware xf86-input-libinput xfsprogs \
  143. xorg-server xorg-xdpyinfo xorg-xhost xorg-xinit xorg-xinput \
  144. xorg-xkill xorg-xrandr xorg-xwayland
  145. }
  146. install_cloud_devops() {
  147. log_info "Installing cloud and DevOps tools"
  148. paru -S --needed \
  149. aws-cli aws-session-manager-plugin insomnia-bin \
  150. kubectl kubectx kubefwd-bin ngrok postgresql
  151. }
  152. install_document_tools() {
  153. log_info "Installing document and productivity tools"
  154. paru -S --needed \
  155. pandoc-cli texinfo wkhtmltopdf-bin zathura zathura-pdf-mupdf \
  156. swappy wf-recorder
  157. }
  158. install_security_tools() {
  159. log_info "Installing security tools"
  160. paru -S --needed \
  161. yubico-authenticator-bin yubikey-manager-qt
  162. }
  163. install_misc_packages() {
  164. log_info "Installing miscellaneous packages"
  165. paru -S --needed \
  166. pyenv watchman-bin wimlib \
  167. slurp grim swaync gum nwg-look lxsession colordiff
  168. log_info "Updating tldr database"
  169. tldr --update
  170. }
  171. main() {
  172. init_script
  173. check_requirements
  174. detect_hardware
  175. install_base_system
  176. install_networking
  177. install_audio_video
  178. install_fonts_themes
  179. install_development
  180. install_cli_utilities
  181. install_window_managers
  182. install_gui_applications
  183. install_system_utilities
  184. install_gaming_graphics
  185. install_hardware_support
  186. install_cloud_devops
  187. install_document_tools
  188. install_security_tools
  189. install_misc_packages
  190. finish_script 0
  191. }
  192. main "$@"