|
|
@@ -15,18 +15,8 @@ PACMAN_PKGS="pkglist.txt"
|
|
|
AUR_PKGS="aurlist.txt"
|
|
|
|
|
|
# --- НАСТРОЙКИ СИМЛИНКОВ (Имена папок в репозитории) ---
|
|
|
-# Просто добавляйте файлы в эти папки.
|
|
|
-
|
|
|
-# 1. Папка для конфигов в $HOME/.config
|
|
|
-# (например, ~/dotfiles/config/bspwm -> ~/.config/bspwm)
|
|
|
CONFIG_DIR_NAME="config"
|
|
|
-
|
|
|
-# 2. Папка для конфигов в $HOME
|
|
|
-# (например, ~/dotfiles/home/.zshrc -> ~/.zshrc)
|
|
|
HOME_DIR_NAME="home"
|
|
|
-
|
|
|
-# 3. Папка для системных конфигов (управляется отдельной командой)
|
|
|
-# (например, ~/dotfiles/system/etc/vconsole.conf -> /etc/vconsole.conf)
|
|
|
SYSTEM_DIR_NAME="system"
|
|
|
|
|
|
|
|
|
@@ -47,13 +37,13 @@ err() {
|
|
|
install_yay() {
|
|
|
if ! command -v yay &>/dev/null; then
|
|
|
msg "YAY не найден. Установка YAY..."
|
|
|
- # Проверяем наличие git и base-devel перед установкой yay
|
|
|
if ! pacman -Q git &>/dev/null || ! pacman -Q base-devel &>/dev/null; then
|
|
|
sudo pacman -S --needed git base-devel
|
|
|
fi
|
|
|
|
|
|
+ rm -rf /tmp/yay
|
|
|
git clone https://aur.archlinux.org/yay.git /tmp/yay
|
|
|
- (cd /tmp/yay && makepkg -si)
|
|
|
+ (cd /tmp/yay && makepkg -si --noconfirm)
|
|
|
rm -rf /tmp/yay
|
|
|
msg "YAY установлен."
|
|
|
else
|
|
|
@@ -63,7 +53,6 @@ install_yay() {
|
|
|
|
|
|
# 2. Установка пакетов (Pacman и YAY)
|
|
|
install_packages() {
|
|
|
- # --- Сбор пакетов для установки ---
|
|
|
msg "Сбор пакетов для установки..."
|
|
|
|
|
|
# Основные пакеты
|
|
|
@@ -71,7 +60,6 @@ install_packages() {
|
|
|
local aur_args=$(sed 's/#.*//' "$SCRIPT_DIR/$AUR_PKGS" | grep -vE '^\s*$' | xargs)
|
|
|
|
|
|
# --- Поиск и выбор дополнительных пакетов ---
|
|
|
- # Ищем файлы вида pkglist-*.txt и aurlist-*.txt, исключая основные
|
|
|
local optional_pacman_lists=($(find "$SCRIPT_DIR" -maxdepth 1 -name "pkglist-*.txt" ! -name "$PACMAN_PKGS"))
|
|
|
local optional_aur_lists=($(find "$SCRIPT_DIR" -maxdepth 1 -name "aurlist-*.txt" ! -name "$AUR_PKGS"))
|
|
|
|
|
|
@@ -82,7 +70,6 @@ install_packages() {
|
|
|
|
|
|
read -p "Хотите выбрать пакеты из этих списков для установки? [y/N]: " choice < /dev/tty
|
|
|
if [[ "$choice" == "y" || "$choice" == "Y" ]]; then
|
|
|
- # Добавляем пакеты из выбранных списков
|
|
|
for list in "${optional_pacman_lists[@]}"; do
|
|
|
read -p " -> Установить из '$(basename "$list")'? [y/N]: " list_choice < /dev/tty
|
|
|
if [[ "$list_choice" == "y" || "$list_choice" == "Y" ]]; then
|
|
|
@@ -101,7 +88,6 @@ install_packages() {
|
|
|
# --- Установка пакетов Pacman ---
|
|
|
if [[ ! -z "$pacman_args" ]]; then
|
|
|
msg "Установка пакетов из Pacman..."
|
|
|
- # Убрали --noconfirm, чтобы можно было решать конфликты вручную
|
|
|
sudo pacman -S --needed $pacman_args
|
|
|
else
|
|
|
msg "Список Pacman для установки пуст."
|
|
|
@@ -111,9 +97,7 @@ install_packages() {
|
|
|
if [[ ! -z "$aur_args" ]]; then
|
|
|
msg "Проверка и установка YAY..."
|
|
|
install_yay
|
|
|
-
|
|
|
msg "Установка пакетов из AUR..."
|
|
|
- # Убрали --noconfirm
|
|
|
yay -S --needed $aur_args
|
|
|
else
|
|
|
msg "Список AUR для установки пуст."
|
|
|
@@ -122,91 +106,112 @@ install_packages() {
|
|
|
msg "Установка пакетов завершена."
|
|
|
}
|
|
|
|
|
|
-# 3. Создание символических ссылок (ОБНОВЛЕНО)
|
|
|
-link_dotfiles() {
|
|
|
- msg "Создание символических ссылок (симлинков)..."
|
|
|
+# 3. (НОВАЯ) Рекурсивная функция линковки
|
|
|
+link_item() {
|
|
|
+ local src="$1"
|
|
|
+ local dest="$2"
|
|
|
|
|
|
- local source_dir=""
|
|
|
- local target_dir=""
|
|
|
+ # Проверка источника
|
|
|
+ if [ ! -e "$src" ]; then
|
|
|
+ return
|
|
|
+ fi
|
|
|
+
|
|
|
+ # 1. Если цель существует и это директория (и не симлинк)
|
|
|
+ # И источник тоже директория
|
|
|
+ # -> РЕКУРСИЯ (MERGE)
|
|
|
+ if [ -d "$dest" ] && [ ! -L "$dest" ] && [ -d "$src" ]; then
|
|
|
+ # msg " [DIR] Вход в $dest"
|
|
|
+ for child in "$src"/*; do
|
|
|
+ [ -e "$child" ] || continue
|
|
|
+ local child_name=$(basename "$child")
|
|
|
+ link_item "$child" "$dest/$child_name"
|
|
|
+ done
|
|
|
+ return
|
|
|
+ fi
|
|
|
+
|
|
|
+ # 2. Если цель существует (файл или симлинк)
|
|
|
+ if [ -e "$dest" ] || [ -L "$dest" ]; then
|
|
|
+ # Если это уже правильный симлинк - пропускаем
|
|
|
+ if [ -L "$dest" ]; then
|
|
|
+ local current_target=$(readlink -f "$dest")
|
|
|
+ local source_absolute=$(readlink -f "$src")
|
|
|
+ if [ "$current_target" == "$source_absolute" ]; then
|
|
|
+ # msg " [OK] $dest уже указывает на правильный файл"
|
|
|
+ return
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ # Если это файл или неправильный симлинк - бэкап
|
|
|
+ warn " [BACKUP] $dest существует. Бэкап -> $dest.bak"
|
|
|
+ mv "$dest" "$dest.bak"
|
|
|
+ fi
|
|
|
+
|
|
|
+ # 3. Создаем симлинк
|
|
|
+ # Создаем родительскую папку, если её нет (например для ~/.config/foo/bar)
|
|
|
+ mkdir -p "$(dirname "$dest")"
|
|
|
+ ln -sfn "$src" "$dest"
|
|
|
+ msg " [LINK] $dest -> $src"
|
|
|
+}
|
|
|
+
|
|
|
+# 4. Создание символических ссылок (Обновлено)
|
|
|
+link_dotfiles() {
|
|
|
+ msg "Создание символических ссылок..."
|
|
|
+
|
|
|
+ # ВАЖНО: Предварительно создаем критические системные папки.
|
|
|
+ # Это заставит функцию link_item использовать режим MERGE (рекурсию) для них,
|
|
|
+ # вместо создания симлинка на всю папку.
|
|
|
+ msg " -> Подготовка структуры папок..."
|
|
|
+ mkdir -p "$HOME/.config"
|
|
|
+ mkdir -p "$HOME/.local/share"
|
|
|
+ mkdir -p "$HOME/.local/state"
|
|
|
+ mkdir -p "$HOME/.local/bin"
|
|
|
+ # mkdir -p "$HOME/bin" # Если используется
|
|
|
|
|
|
# --- 1. Линкуем файлы в $HOME (из папки 'home') ---
|
|
|
- msg " -> Линковка в $HOME (из '$HOME_DIR_NAME')"
|
|
|
- source_dir="$SCRIPT_DIR/$HOME_DIR_NAME"
|
|
|
- target_dir="$HOME"
|
|
|
+ msg " -> Обработка '$HOME_DIR_NAME'..."
|
|
|
+ local source_dir="$SCRIPT_DIR/$HOME_DIR_NAME"
|
|
|
|
|
|
if [ -d "$source_dir" ]; then
|
|
|
- # Ищем все файлы и папки на первом уровне в 'home/'
|
|
|
- # -mindepth 1 (чтобы не найти саму папку 'home')
|
|
|
- # -maxdepth 1 (чтобы найти '.zshrc', 'bin', но не 'bin/скрипт')
|
|
|
- for item_path in $(find "$source_dir" -mindepth 1 -maxdepth 1); do
|
|
|
+ for item_path in "$source_dir"/*; do
|
|
|
+ [ -e "$item_path" ] || continue # Пропуск, если папка пуста
|
|
|
local item_name=$(basename "$item_path")
|
|
|
- local source_path="$item_path"
|
|
|
- local target_path="$target_dir/$item_name"
|
|
|
-
|
|
|
- # Бэкапим, если в $HOME уже что-то есть (и это не симлинк)
|
|
|
- if [ -e "$target_path" ] && [ ! -L "$target_path" ]; then
|
|
|
- warn "Файл/папка '$target_path' уже существует. Бэкап в '$target_path.bak'..."
|
|
|
- mv "$target_path" "$target_path.bak"
|
|
|
- fi
|
|
|
-
|
|
|
- ln -sfn "$source_path" "$target_path"
|
|
|
- msg " -> $target_path -> $source_path"
|
|
|
+ # Вызываем рекурсивную функцию
|
|
|
+ link_item "$item_path" "$HOME/$item_name"
|
|
|
done
|
|
|
- else
|
|
|
- warn "Папка '$source_dir' не найдена. Пропуск $HOME линков."
|
|
|
fi
|
|
|
|
|
|
# --- 2. Линкуем файлы в $HOME/.config (из папки 'config') ---
|
|
|
- msg " -> Линковка в $HOME/.config (из '$CONFIG_DIR_NAME')"
|
|
|
+ msg " -> Обработка '$CONFIG_DIR_NAME'..."
|
|
|
source_dir="$SCRIPT_DIR/$CONFIG_DIR_NAME"
|
|
|
- target_dir="$HOME/.config"
|
|
|
-
|
|
|
- # Создаем ~/.config, если его нет (на новой системе)
|
|
|
- mkdir -p "$target_dir"
|
|
|
|
|
|
if [ -d "$source_dir" ]; then
|
|
|
- # Аналогичная логика для папки 'config'
|
|
|
- for item_path in $(find "$source_dir" -mindepth 1 -maxdepth 1); do
|
|
|
+ for item_path in "$source_dir"/*; do
|
|
|
+ [ -e "$item_path" ] || continue
|
|
|
local item_name=$(basename "$item_path")
|
|
|
- local source_path="$item_path"
|
|
|
- local target_path="$target_dir/$item_name"
|
|
|
-
|
|
|
- # Бэкапим, если в ~/.config уже есть такой конфиг (и это не симлинк)
|
|
|
- if [ -e "$target_path" ] && [ ! -L "$target_path" ]; then
|
|
|
- warn "Файл/папка '$target_path' уже существует. Бэкап в '$target_path.bak'..."
|
|
|
- mv "$target_path" "$target_path.bak"
|
|
|
- fi
|
|
|
-
|
|
|
- ln -sfn "$source_path" "$target_path"
|
|
|
- msg " -> $target_path -> $source_path"
|
|
|
+ link_item "$item_path" "$HOME/.config/$item_name"
|
|
|
done
|
|
|
- else
|
|
|
- warn "Папка '$source_dir' не найдена. Пропуск $HOME/.config линков."
|
|
|
fi
|
|
|
|
|
|
- msg "Симлинки созданы."
|
|
|
+ msg "Симлинки обработаны."
|
|
|
}
|
|
|
|
|
|
-# 4. Проверка текущей конфигурации
|
|
|
+# 5. Проверка текущей конфигурации
|
|
|
check_config() {
|
|
|
- # ... (проверка пакетов остается без изменений) ...
|
|
|
msg "Проверка установленных пакетов Pacman..."
|
|
|
local missing_pacman=0
|
|
|
+ # Ищем pkglist.txt и pkglist-*.txt
|
|
|
for f in $(find "$SCRIPT_DIR" -maxdepth 1 -name "pkglist*.txt"); do
|
|
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
|
|
local pkg=$(echo "$line" | sed 's/#.*//' | xargs)
|
|
|
if [[ -z "$pkg" ]]; then continue; fi
|
|
|
- # Исключение для 'xorg', т.к. это группа пакетов и pacman -Q для нее не работает.
|
|
|
- if [[ "$pkg" == "xorg" ]]; then
|
|
|
- continue
|
|
|
- fi
|
|
|
+ if [[ "$pkg" == "xorg" ]]; then continue; fi
|
|
|
if ! pacman -Q "$pkg" &>/dev/null; then
|
|
|
- warn " -> Не найден (Pacman, из $(basename $f)): $pkg"
|
|
|
+ warn " -> Не найден (Pacman, из $(basename "$f")): $pkg"
|
|
|
missing_pacman=1
|
|
|
fi
|
|
|
done < "$f"
|
|
|
done
|
|
|
- if [ $missing_pacman -eq 0 ]; then msg "Все пакеты Pacman из списков 'pkglist*.txt' установлены."; fi
|
|
|
+ if [ $missing_pacman -eq 0 ]; then msg "Все пакеты Pacman установлены."; fi
|
|
|
|
|
|
msg "Проверка установленных пакетов AUR..."
|
|
|
local missing_aur=0
|
|
|
@@ -215,217 +220,175 @@ check_config() {
|
|
|
local pkg=$(echo "$line" | sed 's/#.*//' | xargs)
|
|
|
if [[ -z "$pkg" ]]; then continue; fi
|
|
|
if ! pacman -Q "$pkg" &>/dev/null; then
|
|
|
- warn " -> Не найден (AUR, из $(basename $f)): $pkg"
|
|
|
+ warn " -> Не найден (AUR, из $(basename "$f")): $pkg"
|
|
|
missing_aur=1
|
|
|
fi
|
|
|
done < "$f"
|
|
|
done
|
|
|
- if [ $missing_aur -eq 0 ]; then msg "Все пакеты AUR из списков 'aurlist*.txt' установлены."; fi
|
|
|
-
|
|
|
-
|
|
|
- msg "Проверка симлинков..."
|
|
|
+ if [ $missing_aur -eq 0 ]; then msg "Все пакеты AUR установлены."; fi
|
|
|
|
|
|
- # --- 1. Проверка $HOME (из папки 'home') ---
|
|
|
+ msg "Проверка симлинков (выборочная)..."
|
|
|
+ # Просто проверим наличие ссылок для корневых элементов
|
|
|
local source_dir="$SCRIPT_DIR/$HOME_DIR_NAME"
|
|
|
if [ -d "$source_dir" ]; then
|
|
|
- for item_path in $(find "$source_dir" -mindepth 1 -maxdepth 1); do
|
|
|
+ for item_path in "$source_dir"/*; do
|
|
|
+ [ -e "$item_path" ] || continue
|
|
|
local item_name=$(basename "$item_path")
|
|
|
- if [ ! -L "$HOME/$item_name" ]; then
|
|
|
- warn " -> Симлинк не найден: $HOME/$item_name"
|
|
|
+ # Если это папка .local, проверяем глубже
|
|
|
+ if [ "$item_name" == ".local" ]; then
|
|
|
+ if [ ! -d "$HOME/.local" ]; then warn " -> Папка $HOME/.local отсутствует!"; fi
|
|
|
+ elif [ ! -e "$HOME/$item_name" ]; then
|
|
|
+ warn " -> Элемент не найден: $HOME/$item_name"
|
|
|
fi
|
|
|
done
|
|
|
fi
|
|
|
-
|
|
|
- # --- 2. Проверка $HOME/.config (из папки 'config') ---
|
|
|
- source_dir="$SCRIPT_DIR/$CONFIG_DIR_NAME"
|
|
|
- if [ -d "$source_dir" ]; then
|
|
|
- for item_path in $(find "$source_dir" -mindepth 1 -maxdepth 1); do
|
|
|
- local item_name=$(basename "$item_path")
|
|
|
- if [ ! -L "$HOME/.config/$item_name" ]; then
|
|
|
- warn " -> Симлинк не найден: $HOME/.config/$item_name"
|
|
|
- fi
|
|
|
- done
|
|
|
- fi
|
|
|
-
|
|
|
msg "Проверка завершена."
|
|
|
}
|
|
|
|
|
|
-# 5. Проверка драйверов
|
|
|
+# 6. Проверка драйверов
|
|
|
check_drivers() {
|
|
|
msg "Проверка оборудования и рекомендации по драйверам..."
|
|
|
- warn "Это только рекомендации! Не устанавливайте автоматически."
|
|
|
|
|
|
- # Видеокарта
|
|
|
+ if ! command -v lspci &>/dev/null; then
|
|
|
+ warn "Команда lspci не найдена. Установите пакет 'pciutils'."
|
|
|
+ return
|
|
|
+ fi
|
|
|
+
|
|
|
local vga=$(lspci -k | grep -A 2 -E "(VGA|3D)")
|
|
|
|
|
|
if echo "$vga" | grep -iq "NVIDIA"; then
|
|
|
warn "Найдена карта NVIDIA. Рекомендуемые пакеты:"
|
|
|
warn " -> nvidia (или nvidia-lts, nvidia-dkms)"
|
|
|
- warn " -> lib32-nvidia-utils (для 32-bit)"
|
|
|
-
|
|
|
+ warn " -> lib32-nvidia-utils"
|
|
|
elif echo "$vga" | grep -iq "Intel"; then
|
|
|
- msg "Найдена карта Intel. Рекомендуемые пакеты (обычно уже в списке):"
|
|
|
+ msg "Найдена карта Intel. Рекомендуемые пакеты:"
|
|
|
msg " -> mesa, lib32-mesa, vulkan-intel"
|
|
|
- if ! pacman -Q xf86-video-intel &>/dev/null; then
|
|
|
- warn " -> xf86-video-intel (старый 2D драйвер, может быть не нужен)"
|
|
|
- fi
|
|
|
-
|
|
|
elif echo "$vga" | grep -iq "AMD"; then
|
|
|
- msg "Найдена карта AMD/ATI. Рекомендуемые пакеты (обычно уже в списке):"
|
|
|
+ msg "Найдена карта AMD/ATI. Рекомендуемые пакеты:"
|
|
|
msg " -> mesa, lib32-mesa, vulkan-radeon"
|
|
|
fi
|
|
|
|
|
|
- # Wi-Fi / Bluetooth
|
|
|
if lspci -k | grep -iq "broadcom"; then
|
|
|
- warn "Найден чип Broadcom. Вам может понадобиться:"
|
|
|
- warn " -> broadcom-wl-dkms (для Wi-Fi)"
|
|
|
+ warn "Найден чип Broadcom. Возможно нужен: broadcom-wl-dkms"
|
|
|
fi
|
|
|
-
|
|
|
- msg "Проверка драйверов завершена."
|
|
|
}
|
|
|
|
|
|
-# 6. Интерактивная установка системных конфигов
|
|
|
+# 7. Применение системных конфигов
|
|
|
apply_system_configs() {
|
|
|
msg "--- РЕЖИМ: ПРИМЕНЕНИЕ СИСТЕМНЫХ КОНФИГОВ ---"
|
|
|
local system_source_dir="$SCRIPT_DIR/$SYSTEM_DIR_NAME"
|
|
|
|
|
|
if [ ! -d "$system_source_dir" ]; then
|
|
|
- err "Папка '$system_source_dir' не найдена. Создайте ее и поместите туда конфиги."
|
|
|
+ err "Папка '$system_source_dir' не найдена."
|
|
|
return 1
|
|
|
fi
|
|
|
|
|
|
- # Ищем все *файлы* внутри папки 'system'
|
|
|
find "$system_source_dir" -type f | while read -r source_file; do
|
|
|
- # Получаем относительный путь (например, "etc/vconsole.conf")
|
|
|
local rel_path=${source_file#$system_source_dir/}
|
|
|
- # Получаем абсолютный целевой путь (например, "/etc/vconsole.conf")
|
|
|
local target_file="/$rel_path"
|
|
|
|
|
|
- msg "Найден конфиг: $rel_path"
|
|
|
+ msg "Конфиг: $rel_path"
|
|
|
|
|
|
- # 1. Проверяем, существует ли оригинал
|
|
|
if [ ! -f "$target_file" ]; then
|
|
|
- warn "Файл '$target_file' не существует. Хотите скопировать новый?"
|
|
|
- read -p " [y/N] (Да/Нет): " choice < /dev/tty
|
|
|
- if [[ "$choice" == "y" || "$choice" == "Y" ]]; then
|
|
|
- # Создаем дирректорию, если нужно
|
|
|
+ warn " Файл '$target_file' не существует в системе."
|
|
|
+ read -p " Скопировать? [y/N]: " choice < /dev/tty
|
|
|
+ if [[ "$choice" =~ ^[yY]$ ]]; then
|
|
|
sudo mkdir -p "$(dirname "$target_file")"
|
|
|
sudo cp "$source_file" "$target_file"
|
|
|
- msg " -> СКОПИРОВАНО: $target_file"
|
|
|
- else
|
|
|
- msg " -> Пропущено."
|
|
|
+ msg " -> СКОПИРОВАНО."
|
|
|
fi
|
|
|
- continue # Переходим к следующему файлу
|
|
|
+ continue
|
|
|
fi
|
|
|
|
|
|
- # 2. Оригинал существует, показываем diff
|
|
|
if command -v diff &>/dev/null; then
|
|
|
- msg "Разница между вашим конфигом (dotfiles) и системным (/) :"
|
|
|
- # diff [оригинал] [новый]
|
|
|
- diff -u "$target_file" "$source_file" || true # || true чтобы скрипт не падал, если есть разница
|
|
|
+ if ! diff -q "$target_file" "$source_file" &>/dev/null; then
|
|
|
+ msg " Найдены различия:"
|
|
|
+ diff -u "$target_file" "$source_file" | head -n 20
|
|
|
+
|
|
|
+ warn " Заменить системный файл?"
|
|
|
+ read -p " [y/N/b] (Да / Нет / Бэкап): " choice < /dev/tty
|
|
|
+ case "$choice" in
|
|
|
+ y|Y)
|
|
|
+ sudo cp "$source_file" "$target_file"
|
|
|
+ msg " -> ЗАМЕНЕНО."
|
|
|
+ ;;
|
|
|
+ b|B)
|
|
|
+ sudo mv "$target_file" "$target_file.bak"
|
|
|
+ sudo cp "$source_file" "$target_file"
|
|
|
+ msg " -> БЭКАП И ЗАМЕНА."
|
|
|
+ ;;
|
|
|
+ esac
|
|
|
+ else
|
|
|
+ msg " -> Идентичны."
|
|
|
+ fi
|
|
|
else
|
|
|
- warn "Команда 'diff' не найдена. Не могу показать разницу."
|
|
|
+ warn " diff не установлен, сравнение невозможно."
|
|
|
fi
|
|
|
-
|
|
|
- # 3. Запрос на замену
|
|
|
- warn "Заменить системный файл '$target_file'?"
|
|
|
- read -p " [y/N/b] (Да / Нет / Бэкап и замена): " choice < /dev/tty
|
|
|
-
|
|
|
- case "$choice" in
|
|
|
- y|Y)
|
|
|
- sudo cp "$source_file" "$target_file"
|
|
|
- msg " -> ЗАМЕНЕНО: $target_file"
|
|
|
- ;;
|
|
|
- b|B)
|
|
|
- sudo mv "$target_file" "$target_file.bak"
|
|
|
- sudo cp "$source_file" "$target_file"
|
|
|
- msg " -> БЭКАП СОЗДАН: $target_file.bak"
|
|
|
- msg " -> ЗАМЕНЕНО: $target_file"
|
|
|
- ;;
|
|
|
- *)
|
|
|
- msg " -> Пропущено."
|
|
|
- ;;
|
|
|
- esac
|
|
|
done
|
|
|
-
|
|
|
- msg "--- СИСТЕМНЫЕ КОНФИГИ ОБРАБОТАНЫ ---"
|
|
|
}
|
|
|
|
|
|
-# 7. (НОВАЯ ФУНКЦИЯ) Создание стандартных папок пользователя
|
|
|
+# 8. Создание папок пользователя
|
|
|
create_user_dirs() {
|
|
|
- msg "Cоздание стандартных папок пользователя"
|
|
|
- # Создаем стандартный набор
|
|
|
- mkdir -p \
|
|
|
- "$HOME/Documents" \
|
|
|
- "$HOME/Downloads" \
|
|
|
- "$HOME/Pictures"
|
|
|
-
|
|
|
- msg " -> Базовые папки созданы."
|
|
|
+ msg "Проверка стандартных папок пользователя..."
|
|
|
+ # Если xdg-user-dirs установлен, лучше использовать его
|
|
|
+ if command -v xdg-user-dirs-update &>/dev/null; then
|
|
|
+ xdg-user-dirs-update
|
|
|
+ msg " -> Выполнен xdg-user-dirs-update"
|
|
|
+ else
|
|
|
+ mkdir -p "$HOME/Documents" "$HOME/Downloads" "$HOME/Pictures"
|
|
|
+ msg " -> Папки созданы (fallback)."
|
|
|
+ fi
|
|
|
}
|
|
|
|
|
|
|
|
|
-# --- ГЛАВНЫЙ БЛОК (ВЫБОР РЕЖИМА) ---
|
|
|
+# --- ГЛАВНЫЙ БЛОК ---
|
|
|
|
|
|
show_help() {
|
|
|
- echo "Скрипт управления конфигурацией Arch Linux (Dotfiles)"
|
|
|
- echo "Использование: $0 [команда]"
|
|
|
- echo
|
|
|
+ echo "Dotfiles Manager"
|
|
|
echo "Команды:"
|
|
|
- echo " install - Установить все пакеты и создать симлинки (полная установка)."
|
|
|
- echo " check - Проверить, все ли установлено и настроено."
|
|
|
- echo " update - Обновить конфиг из Git и применить изменения (пакеты, симлинки)."
|
|
|
- echo " drivers - Проверить оборудование и предложить драйверы."
|
|
|
- echo " system - Интерактивно применить системные конфиги из папки '$SYSTEM_DIR_NAME'."
|
|
|
- echo " help - Показать это сообщение."
|
|
|
+ echo " install - Установить пакеты, создать ссылки."
|
|
|
+ echo " check - Проверка статуса."
|
|
|
+ echo " update - git pull + install."
|
|
|
+ echo " drivers - Рекомендации по драйверам."
|
|
|
+ echo " system - Системные конфиги (/etc)."
|
|
|
}
|
|
|
|
|
|
-# Проверяем, что скрипт не запущен от root
|
|
|
if [ "$EUID" -eq 0 ]; then
|
|
|
- err "Не запускайте этот скрипт от имени root (используйте 'sudo' только когда он сам попросит)."
|
|
|
+ err "Запускайте от пользователя, не от root!"
|
|
|
exit 1
|
|
|
fi
|
|
|
|
|
|
-# Если нет аргументов, показать помощь
|
|
|
-if [ $# -eq 0 ]; then
|
|
|
- show_help
|
|
|
- exit 0
|
|
|
-fi
|
|
|
+if [ $# -eq 0 ]; then show_help; exit 0; fi
|
|
|
|
|
|
case "$1" in
|
|
|
install)
|
|
|
- msg "--- РЕЖИМ: ПОЛНАЯ УСТАНОВКА ---"
|
|
|
+ msg "--- УСТАНОВКА ---"
|
|
|
install_packages
|
|
|
link_dotfiles
|
|
|
- create_user_dirs # <-- ДОБАВЛЕНО
|
|
|
- msg "--- УСТАНОВКА ЗАВЕРШЕНА ---"
|
|
|
- msg "Для применения системных конфигов (vconsole.conf и т.д.) запустите: $0 system"
|
|
|
+ create_user_dirs
|
|
|
+ msg "Готово."
|
|
|
;;
|
|
|
check)
|
|
|
- msg "--- РЕЖИМ: ПРОВЕРКА КОНФИГУРАЦИИ ---"
|
|
|
check_config
|
|
|
;;
|
|
|
update)
|
|
|
- msg "--- РЕЖИМ: ОБНОВЛЕНИЕ КОНФИГУРАЦИИ ---"
|
|
|
- msg "1. Получение изменений из Git (git pull)..."
|
|
|
- if ! git pull; then
|
|
|
- err "Не удалось выполнить 'git pull'. Проверьте подключение и статус репозитория."
|
|
|
- exit 1
|
|
|
+ msg "--- ОБНОВЛЕНИЕ ---"
|
|
|
+ if git pull; then
|
|
|
+ install_packages
|
|
|
+ link_dotfiles
|
|
|
+ create_user_dirs
|
|
|
+ msg "Обновлено."
|
|
|
+ else
|
|
|
+ err "Ошибка git pull."
|
|
|
fi
|
|
|
- msg "2. Применение изменений (установка/линковка)..."
|
|
|
- install_packages
|
|
|
- link_dotfiles
|
|
|
- create_user_dirs # <-- ДОБАВЛЕНО
|
|
|
- msg "--- ОБНОВЛЕНИЕ ЗАВЕРШЕНО ---"
|
|
|
;;
|
|
|
drivers)
|
|
|
- msg "--- РЕЖИМ: ПРОВЕРКА ДРАЙВЕРОВ ---"
|
|
|
check_drivers
|
|
|
;;
|
|
|
system)
|
|
|
- # (НОВЫЙ РЕЖИМ)
|
|
|
apply_system_configs
|
|
|
;;
|
|
|
help|*)
|
|
|
show_help
|
|
|
;;
|
|
|
-esac
|
|
|
+esac
|