Vitaliy Timtsurak 2 сар өмнө
parent
commit
dd41f23526

+ 1 - 0
aurlist.txt

@@ -7,3 +7,4 @@ nomacs
 google-chrome
 clipton
 ttf-times-new-roman
+snitch-bin

+ 12 - 0
config/systemd/user/default.target.wants/clipton.service

@@ -0,0 +1,12 @@
+[Unit]
+Description=Daemon for Clipton (Clipboard Manager)
+After=graphical-session.target
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/clipton watcher
+Restart=on-failure
+RestartSec=2
+
+[Install]
+WantedBy=default.target

+ 158 - 195
install.sh

@@ -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

+ 3 - 0
pkglist-pentest.txt

@@ -1 +1,4 @@
 rustscan # A modern port scanner
+ghex # HEX редактор
+wireshark-qt
+openbsd-netcat

+ 7 - 0
pkglist-work.txt

@@ -0,0 +1,7 @@
+networkmanager-l2tp strongswan xl2tpd
+minicom
+freerdp
+remmina
+libvncserver
+qrencode
+