Скрипт проверки целосности системы, кэш Pacman

Так как в пакмене нет функций для проверки целосности системы, какие файлы изменились и изменились ли у них группы, владельцы и т.п., а умеет от только проверять отсутствие файлов, то решил исправить положение.

Данный скрипт служит для поиска и вывода списка новых файлов которые отсутствуют в пакетах и появились в процессе жизни системы. Так же скрипт умеет сравнивать файлы в пакетах и в системе, выводя список измененных.

Для полноценной проверки, в кэше должны присутствовать все установленные пакеты!!!

Полезно для контролля целостности системы и поиска "мусора". А так же для частичного бекапа системы.

Использует библиотечку functions от сюда viewtopic.php?f=29&t=9957#p89236

pacman-files-list - скрипт выводящий списки файлов

#!/bin/bash
#
#   pacman-files-list (pacman-save-sys)
#
#   Copyright (c) 2012 ArchAnTavr <archlinux@antavr.ru>
#   http://archlinux.antavr.ru
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Имя текущего скрипта
SCRNAME=$(basename "$BASH_SOURCE")
# Путь к папке со скриптом
SCRDIR=$(dirname "$BASH_SOURCE")
source "$SCRDIR/functions"
# Переключатели параметров
CACHE=0
# Функция вывода помощи
echo_help()
{
  echo_help1
  echo -e "\t${BLDWHT}-c${TXTRST}
\t\t$(gettext 'вывести файлы которые отличаются от файлов из пакетов в кэше')
\t\t\t$(gettext 'по умолчанию:') $(gettext 'новые файлы в системе')\n" >&2
}

pdisowned()
{
# Временный каталог
  local TEMPDIR=$(mktemp -d)
# Удалять при выходе
  trap "rm -rf $TEMPDIR" EXIT RETURN

# Временные файлы для сохранения списков файлов
  local DB="$TEMPDIR/db"
  local FS="$TEMPDIR/fs"

# Список системных папок, которые могут быть примонтированны
# так как поиск ведется только в пределах раздела
  local PATHS='/ /boot /usr /usr/local'
  local P
# Получаем список установленных файлов
  echo -e "${BLDYLW}$(gettext 'получаю список файлов'), pacman -Qlq$PACMANOPT${TXTRST}" >&2
  eval "pacman -Qlq$PACMANOPT" \
    | sort -u \
    > "$DB"
# Получаем список файлов в системе
  for P in $PATHS
  do
    echo -e "${BLDYLW}$(gettext 'проверяю раздел'), findmnt $PROOT$P${TXTRST}" >&2
    if [ "$(findmnt "$PROOT$P")" ]
    then
      echo -e "${BLDYLW}$(gettext 'получаю список файлов'), find $PROOT$P${TXTRST}" >&2
      find "$PROOT$P" \
        -mount \
        ! -path "*/tmp/*" \
        ! -path "*/lost+found/*" \
        ! -name 'lost+found' \
        ! -path "$PROOT/home/*" \
        ! -path "$PROOT/root/*" \
        \( -type d -printf '%p/\n' -o -print \)
    fi
  done \
    | sort -u \
    | grep -v '//$' \
    > "$FS"
# Выбираем список файлов которых нет в пакетах
  echo -e "${BLDYLW}$(gettext 'выбираю файлы которых нет в пакетах')${TXTRST}" >&2
  if [ "$PROOT" ]
  then
    PROOT=$(echo "$PROOT" | sed 's/\//\\\//g')
    comm -23 "$FS" "$DB" \
      | sed s/^"$PROOT"//
  else
    comm -23 "$FS" "$DB"
  fi
}

modified ()
{
# Временный файл
  local TEMPFILE=$(mktemp)
# Удалять при выходе
  trap "rm -f $TEMPFILE" EXIT RETURN
  local PKG
  local OUTSTR
  local LINE

  while read LINE
  do
    echo -e "${BLDYLW}$(gettext 'Проверяю пакет ')$LINE${TXTRST}" >&2
    eval "LINE=($LINE)"
    PKG=$(find "$PROOT$PACMANCACHE/${LINE[0]}-${LINE[1]}"-*.pkg.tar.[gx]z)
    if [ "$PKG" ]
    then
      OUTSTR=$(LC_ALL=en tar -ad --format=pax -C "$PACMANROOT" --exclude='.PKGINFO' --exclude='.INSTALL' --exclude='.CHANGELOG' -f "$PKG")
      if [[ $? -ne 0 ]]
      then
        OUTSTR=$(echo "$OUTSTR" | grep -v 'Mod time differs')
        if [ "$OUTSTR" ]
        then
          echo ">>> $PKG"
          echo ''
          echo "$OUTSTR" | sed 's/^/\//g'
          echo ''
        fi
      fi
    else
      echo -e "${BLDRED}$(gettext 'не найден в кэше, пропускаю') $LINE${TXTRST}" >&2
    fi
  done
}
# Обработка параметров командной строки
while getopts hp:r:b:e:c OPTION
do
  case $OPTION in
    h|\?|p|r|b|e)
        choption "$OPTION" "$OPTARG"
        ;;
    c)
        CACHE=1
        ;;
  esac
done
setoption
# Если нет root привилегий вывести предупреждение
if [[ $EUID -ne 0 ]]
then
  echo -e "${BLDRED}$(gettext 'Для корректной работы скрипта у Вас должны быть root привилегии!!!')${TXTRST}" >&2
fi
# Выполняем
if [[ $CACHE -ne 0 ]]
then
  echo -e "${BLDYLW}$(gettext 'получаю список пакетов'), pacman -Q$PACMANOPT${TXTRST}" >&2
  eval "pacman -Q$PACMANOPT" | modified
else
  pdisowned
fi


Пример использования
# Список новых файлов в системе
bash pacman-files-list > files-new.list

# Списки измененных файлов
bash pacman-files-list -c > files-modified.list
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
(из viewtopic.php?f=6&t=10086 )
Попробовал использовать скрипт, но некоторые пакеты в кэше пакмана почищены , но и за этого ли сыпятся ошибки вроде :

Проверяю пакет systemd 192-1
find: `//systemd-192-1-*.pkg.tar.[gx]z': Нет такого файла или каталога
не найден в кэше, пропускаю systemd
Проверяю пакет sysvinit 2.88-8
find: `//sysvinit-2.88-8-*.pkg.tar.[gx]z': Нет такого файла или каталога
не найден в кэше, пропускаю sysvinit
Проверяю пакет sysvinit-tools 2.88-8
find: `//sysvinit-tools-2.88-8-*.pkg.tar.[gx]z': Нет такого файла или каталога
не найден в кэше, пропускаю sysvinit-tools
Проверяю пакет taglib 1.8-1
find: `//taglib-1.8-1-*.pkg.tar.[gx]z': Нет такого файла или каталога
не найден в кэше, пропускаю taglib
Проверяю пакет taglib-extras 1.0.1-2
find: `//taglib-extras-1.0.1-2-*.pkg.tar.[gx]z': Нет такого файла или каталога
не найден в кэше, пропускаю taglib-extras
Проверяю пакет talloc 2.0.7-1
find: `//talloc-2.0.7-1-*.pkg.tar.[gx]z': Нет такого файла или каталога
не найден в кэше, пропускаю talloc
Проверяю пакет tar 1.26-2
find: `//tar-1.26-2-*.pkg.tar.[gx]z': Нет такого файла или каталога

Фитч реквест : автоматическая докачка ненайденых в кэше пакетов; возможность поиска пакетов в других местах.


Необходимы ли скрипту рут права, может для некоторых ключей их можно смягчить (например -с)?

ps
возможно скажу глупость, но нельзя получить необходимую информацию о файлах пакета , не скачивая его?
(из базы пакмана, из packages.archlinux.org)
Hascee
Фитч реквест : автоматическая докачка ненайденых в кэше пакетов; возможность поиска пакетов в других местах.
Этот скрипт работает только с тем что уже есть в кэше.
Докачку можно сделать, но в другом скрипте, например список недостающих пакетов в кэше выводит вот этот скрипт viewtopic.php?f=29&t=9957#p89236 , а скормить списки на загрузку пакмену и йогурту минутное дело...

Просто не все пакеты могут быть установлены из реп.
Например локально установленные пакеты командой pacman -U <пакет> вообще не попадают в кэш, их только ручками нужно туда копировать...
А чтобы собранные из AUR с помощью yaourt пакеты в кэш отправлялись нужно соответственно настроить yaourtrc и makepkg.conf

Hascee
Необходимы ли скрипту рут права, может для некоторых ключей их можно смягчить (например -с)?
Частично необходимы, в некоторые папки без рут прав не пустит, соответственно и не проверятся там файлы... Хотя можно сделать просто вывод предупреждения типа - "Сюда меня не пустили, пропускаю"

Hascee
нельзя получить необходимую информацию о файлах пакета , не скачивая его?
(из базы пакмана, из packages.archlinux.org)
В базе пакмена только имена файлов и больше ничего (огромное упущение), могли хотя бы хеш файла, группу, пользователя и доп атрибуты в базу записывать. Проще было проверить систему на несоответствия...
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Изменил, теперь при запуске без привилегий root, в начале будет выводится сообщение, а куда tar не пустят он сам выведет предупреждение.
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Hascee
find: `//systemd-192-1-*.pkg.tar.z': Нет такого файла или каталога
Исправил и это, была ошибка удаления последнего слеша из пути…
Нужно загрузить исправленную версию functions от сюда viewtopic.php?f=29&t=9957&p=89236#p89236
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
использую
(sudo) bash  pacman-pkg-list -с 

при этом скрипт ничего не выводит (только две системные строчки ) и завершает свою работу

Однако при использовании
sudo pacman-files-list -c > files.list 
некоторые пакеты скрипт не находит

Проверяю пакет zip 3.0-3
find: `/var/cache/pacman/pkg/zip-3.0-3-*.pkg.tar.[gx]z': Нет такого файла или каталога
не найден в кэше, пропускаю zip
Проверяю пакет zlib 1.2.7-1
find: `/var/cache/pacman/pkg/zlib-1.2.7-1-*.pkg.tar.[gx]z': Нет такого файла или каталога
не найден в кэше, пропускаю zlib
Проверяю пакет zsh 5.0.0-2
tar: Ignoring unknown extended header keyword `SCHILY.fflags'

+ сначала иногда ругается
Проверяю пакет amarok 2.6.0-1
tar: Ignoring unknown extended header keyword `SCHILY.fflags'
tar: Ignoring unknown extended header keyword `SCHILY.fflags'
tar: Ignoring unknown extended header keyword `SCHILY.fflags'
а потом и вовсе выдает километры вышеуказанных строчек

содержание файла changed list
cat changed.list 
>>> /var/cache/pacman/pkg/filesystem-2012.8-1-any.pkg.tar.xz
/etc/fstab: Size differs
/etc/group: Size differs
/etc/hosts: Size differs
/etc/passwd: Size differs
/etc/resolv.conf: Size differs
/etc/shells: Size differs
/etc/gshadow: Size differs
/etc/shadow: Size differs
>>> /var/cache/pacman/pkg/flashplugin-11.2.202.238-1-i686.pkg.tar.xz
/etc/adobe/mms.cfg: Size differs
>>> /var/cache/pacman/pkg/glibc-2.16.0-4-i686.pkg.tar.xz
/etc/locale.gen: Size differs
>>> /var/cache/pacman/pkg/initscripts-2012.09.1-1-any.pkg.tar.xz
/etc/inittab: Contents differ
/etc/rc.conf: Size differs
>>> /var/cache/pacman/pkg/linux-3.5.4-1-i686.pkg.tar.xz
/usr/lib/modules/3.5.4-1-ARCH/modules.symbols: Size differs
/usr/lib/modules/3.5.4-1-ARCH/modules.symbols.bin: Size differs
/usr/lib/modules/3.5.4-1-ARCH/modules.dep.bin: Size differs
/usr/lib/modules/3.5.4-1-ARCH/modules.alias.bin: Contents differ
/usr/lib/modules/3.5.4-1-ARCH/modules.dep: Size differs
>>> /var/cache/pacman/pkg/lxde-common-0.5.5-2-any.pkg.tar.xz
/etc/xdg/lxsession/LXDE/autostart: Size differs
>>> /var/cache/pacman/pkg/lxdm-0.4.1-15-i686.pkg.tar.xz
                                                                                                                                     
/etc/lxdm/lxdm.conf: Mode differs                                                                                                    
/etc/lxdm/lxdm.conf: Gid differs                                                                                                     
                                                                                                                                     
>>> /var/cache/pacman/pkg/mc-4.8.6-1-i686.pkg.tar.xz                                                                                 
                                                                                                                                     
/etc/mc/filehighlight.ini: Size differs                                                                                              
/etc/mc/edit.indent.rc: Mode differs                                                                                                 
                                                                                                                                     
>>> /var/cache/pacman/pkg/mysql-5.5.28-1-i686.pkg.tar.xz                                                                             
                                                                                                                                     
/etc/mysql/my.cnf: Uid differs                                                                                                       
/etc/mysql/my.cnf: Gid differs                                                                                                       
/etc/mysql/my.cnf: Size differs                                                                                                      
                                                                                                                                     
>>> /var/cache/pacman/pkg/pacman-4.0.3-3-i686.pkg.tar.xz                                                                             
                                                                                                                                     
/etc/pacman.conf: Size differs                                                                                                       
                                                                                                                                     
>>> /var/cache/pacman/pkg/perl-test-pod-1.45-1-any.pkg.tar.xz                                                                        
                                                                                                                                     
/usr/share/man/man3/Test\:\:Pod.3pm.gz: Mode differs                                                                                 
/usr/share/perl5/vendor_perl/Test/Pod.pm: Mode differs                                                                               
                                                                                                                                     
>>> /var/cache/pacman/pkg/perl-yaml-syck-1.20-2-i686.pkg.tar.xz                                                                      
                                                                                                                                     
/usr/lib/perl5/vendor_perl/YAML/Syck.pm: Mode differs                                                                                
/usr/lib/perl5/vendor_perl/YAML/Loader/Syck.pm: Mode differs                                                                         
/usr/lib/perl5/vendor_perl/YAML/Dumper/Syck.pm: Mode differs
/usr/lib/perl5/vendor_perl/JSON/Syck.pm: Mode differs
/usr/lib/perl5/vendor_perl/auto/YAML/Syck/Syck.so: Mode differs
/usr/lib/perl5/vendor_perl/auto/YAML/Syck/Syck.bs: Mode differs
/usr/share/man/man3/JSON\:\:Syck.3pm.gz: Mode differs
/usr/share/man/man3/YAML\:\:Syck.3pm.gz: Mode differs
>>> /var/cache/pacman/pkg/prelink-20111012-1-i686.pkg.tar.xz
/etc/prelink.conf: Size differs
>>> /var/cache/pacman/pkg/sudo-1.8.6.p3-1-i686.pkg.tar.xz
/etc/sudoers: Size differs
>>> /var/cache/pacman/pkg/tzdata-2012f-1-any.pkg.tar.xz
/usr/share/zoneinfo/iso3166.tab: Mode differs
/usr/share/zoneinfo/zone.tab: Mode differs
>>> /var/cache/pacman/pkg/vlc-2.0.3-4-i686.pkg.tar.xz
/usr/lib/vlc/plugins/plugins.dat: Size differs
Hascee
использую
Код: Выделить всё
(sudo) bash pacman-pkg-list -с
при этом скрипт ничего не выводит (только две системные строчки ) и завершает свою работу
Тут вместо русской “-с” нужно использовать английскую!!!
Hascee
некоторые пакеты скрипт не находит
Скрипт правильно не находит пакеты, так как их НЕТ в кэше.

Hascee
+ сначала иногда ругается
Проверяю пакет amarok 2.6.0-1
tar: Ignoring unknown extended header keyword `SCHILY.fflags'
Это предупреждение связано с разными версиями TAR-а. Ничего в нем страшного нет. Сначала хотел подавить эти сообщения, но потом решил что лучше их выводить, если вывод скрипта перенаправляется в файл они все равно туда не попадут, потому что идут на стандартный поток ошибок (stderr)

Hascee
содержание файла changed list
Правильное содержание.
Тут указано в каком пакете и какие файлы изменились и что в них изменилось

>>> /var/cache/pacman/pkg/filesystem-2012.8-1-any.pkg.tar.xz (расположение пакета)
/etc/fstab: Size differs (тут сказано что размер файла изменился)
/etc/inittab: Contents differ (тут что данные в файле изменились)
/etc/lxdm/lxdm.conf: Gid differs (изменилась группа)
/etc/mysql/my.cnf: Uid differs (изменился пользователь)
/etc/mc/edit.indent.rc: Mode differs (изменились права)

Все правильно.
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Тут вместо русской “-с” нужно использовать английскую!!!
Извиняюсь, на форуме сработал xneur , но когда в терминале ввожу :
sudo bash pacman-pkg-list -c  
[sudo] password for hascee: 
получаю список пакетов, pacman -Qme
проверяю существование пакетов в кэше
… И это все что получилось (если я правильно понимаю, то на этом месте должен быть список пакетов , которых нет в кэше , но таковые присутствуют в системе!)
стало быть у меня все пакеты присутствуют, однако:

Скрипт правильно не находит пакеты, так как их НЕТ в кэше.

выходит у меня в кэше по одним данным есть пакет amarok , по другим - он отсутствует.

Значит либо pacman-files-list -c выборочно не видит пакеты из кэша, либо (что более вероятно) pacman-pkg-list -c работает неверно
pacman-pkg-list -c проверяет только явно установленные пакеты, может amarok был установлен как зависимость к другому пакету

попробуй выполнить pacman-pkg-list -cd
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
сейчас проверю - явно поставлю и удалю из кэша

фитчреквест:
Имхо, было бы логично еще добавить функциональность нахождения и вывода новых версий конфигов в системе (.pacnew).
Часто после обновления системы бывает необходимо проверить версии конфигов на актуальность
 
Зарегистрироваться или войдите чтобы оставить сообщение.