Obtenha alterações no diff entre os arquivos originais instalados com os arquivos apt e current

13

Eu instalei php5-fpm package usando apt ; então fiz algumas alterações nos arquivos de configuração do PHP.

Agora eu obteria os diffs entre as versões dos arquivos originais (as do pacote instalado) e as versões atuais (modificadas por mim). Como fazer isso?

    
por mdesantis 17.04.2013 / 12:57

3 respostas

9

Tente algo assim:

# exit on failure
set -e

package=php5-fpm
mkdir $package
cd $package

# you could also get the file from a package mirror if you have
#  an older version of apt-get that doesn't support 'download' 
#  or if you would like more control over what package version
#  you are downloading.
# (e.g. http://archive.ubuntu.com/ubuntu/pool/main/)
apt-get download $package

# deb package files are ar archives
ar vx ${package}*.deb
# containing some compressed tar archives
tar xzf data.tar.gz
# now you have the files

# you can get diffs for all of the files in etc if you would like
find etc -type f |
while read file ; do
    diff $file /$file
done

Como sugerido por outros, definitivamente coloque seus arquivos de configuração sob controle de revisão. Dessa forma, você pode ver exatamente o que mudou e quando mudou.

    
por 17.04.2013 / 15:27
6
diretório

etc

Para rastrear alterações no diretório /etc , você pode fazer como o @Anthon sugeriu e usar o git, o subversion, o mercurial, etc. para controlar o diretório da versão. Você também pode usar uma ferramenta como etckeeper . Há um tutorial aqui , bem como here .

etckeeper is a collection of tools to let /etc be stored in a git, mercurial, bazaar or darcs repository. It hooks into apt to automatically commit changes made to /etc during package upgrades. It tracks file metadata that git does not normally support, but that is important for /etc, such as the permissions of /etc/shadow. It's quite modular and configurable, while also being simple to use if you understand the basics of working with version control.

arquivos de pacote

De acordo com meu conhecimento, apt não tem como verificar os arquivos no disco em comparação com os arquivos que estão no .deb real. Nem dpkg , a ferramenta que apt está realmente usando para fazer o gerenciamento de arquivos.

No entanto, você pode usar uma ferramenta como debsums para comparar alguns os arquivos que você instalou, ele apenas verifica suas somas de verificação (md5sum) do que está no arquivo .deb versus o que está no disco do seu sistema.

Veja esta pergunta sobre o servidor para mais detalhes sobre debsum e dpkg checksumming, assim como este pergunta do askubuntu .

debsum example

% debsums openssh-server
/usr/lib/openssh/sftp-server                                                  OK
/usr/sbin/sshd                                                                OK
/usr/share/lintian/overrides/openssh-server                                   OK
/usr/share/man/man5/sshd_config.5.gz                                          OK
/usr/share/man/man8/sshd.8.gz                                                 OK
/usr/share/man/man8/sftp-server.8.gz                                          OK
    
por 17.04.2013 / 14:03
4

Eu escrevi o seguinte script simples para recuperar automaticamente o arquivo original do pacote Debian correto e comparar o arquivo atual com ele: link

Use da seguinte forma: debdiffconf FILE

#!/bin/bash

# Usage: debdiffconf.sh FILE
# Produce on stdout diff of FILE against the first installed Debian package
# found that provides it.
# Returns the exit code of diff if everything worked, 3 or 4 otherwise.

command -v apt-get >/dev/null 2>&1 || {
  echo "apt-get not found, this is probably not a Debian system. Aborting." >&2;
  exit 4; }
command -v apt-file >/dev/null 2>&1 || {
  echo "Please install apt-file: sudo apt-get install apt-file. Aborting." >&2;
  exit 4; }

FILE=$(readlink -f "$1")
while read PACKAGE
do
  # verify from first installed package
  if dpkg-query -W --showformat='${Status}\n' | grep installed > /dev/null
  then
    DIR=$(mktemp -d)
    cd "$DIR"
    echo "Trying $PACKAGE..." >&2
    apt-get download "$PACKAGE" >&2
    # downloaded archive is the only file present...
    ARCHIVE=$(ls)
    mkdir contents
    # extract entire archive
    dpkg-deb -x "$ARCHIVE" contents/ >&2
    if [ -f "contents$FILE" ]
    then
      # package contained required file
      diff "contents$FILE" "$FILE"
      RET=$?
      # cleanup
      cd
      rm -Rf "$DIR"
      # exit entire script as this is the main shell
      # with the return code from diff
      exit $RET
    else
      # cleanup
      cd
      rm -Rf "$DIR"
    fi
  fi
done < <(apt-file -l search "$FILE")
# if we are here, it means we have found no suitable package
echo "Could not find original package for $FILE" >&2
exit 3
    
por 03.08.2014 / 14:01