apt-get 후크를 사용하여 특정 패키지가 설치되어 있는지 감지하는 더 깔끔한 방법은 무엇입니까?

apt-get 후크를 사용하여 특정 패키지가 설치되어 있는지 감지하는 더 깔끔한 방법은 무엇입니까?

주어진 패키지에 패치를 적용하는 간단한 스크립트가 있는데, 해당 패키지가 업그레이드될 때마다 패치를 덮어쓰므로 각 업그레이드 후에 자동으로 패치를 적용하고 싶습니다.

/etc/apt/apt.conf.d/이를 달성하기 위해 에 파일을 생성 하고 DPkg::Post-Invoke. man apt-get하지만 이 후크는 아무 관련이 없는 것 같습니다.apt-getdpkg어떤 특정 패키지이미 설치되어 있어서 패치를 적용해야 할지 모르겠습니다. 표준 입력에는 아무 것도 전달되지 않으며, 인수로 전달되는 것도 없으며 매뉴얼 페이지에는 이에 대해 아무 것도 나와 있지 않습니다.

그래서 이 문제를 해결하기 위해 제가 생각할 수 있는 유일한 일을 했습니다: 에 대한 또 다른 후크를 추가했습니다 DPkg::Pre-Install-Pkgs.apt-get 앞으로패키지가 설치되었습니다. 이 후크는 (stdin을 통해) .deb설치될 파일 목록을 가져 dpkg오므로 파일 이름 중 패치하려는 패키지 이름과 일치하는 것이 있는지 확인하고 일치하면 설치될 파일 목록을 가져옵니다. /tmp다른 후크가 실행될 때 먼저 해당 파일이 있는지 확인하고, 그렇다면 방금 설치된 패키지에 패치를 적용합니다.

이것은 내가 만든 파일입니다 /etc/apt/apt.conf.d/.

DPkg::Pre-Install-Pkgs {
    "while read -r pkg; do case $pkg in *somepkg*) touch /tmp/.patch && exit 0; esac done < /dev/stdin";
};

DPkg::Post-Invoke {
    "[ -f /tmp/.patch ] && /home/marco/scripts/apply_somepkg_patch.sh && rm -f /tmp/.patch; exit 0";
};

분명히 해야 할 것은: apply_somepkg_patch.sh단순히 패키지에서 제공하는 파일의 내용을 편집합니다. 나는 그 파일이업그레이드 및 패치매번 업그레이드되지 않도록 "잠그고" 싶지 않습니다.

이제 이 모든 것이 훌륭하게 작동하지만 제 눈에는 정말 더러워 보이고 약간 이상해 보입니다.이것을 달성하는 더 깨끗한 방법이 있습니까?어쩌면 그냥 DPkg::Post-Invoke후크를 사용할까요? 아니면, DPkg::Post-InvokeHook에 어떤 패키지가 설치되어 있는지 알 수 있는 방법이 있나요?


편집하다: 101% 명확성을 위해 내가 하고 있는 작업에 대한 자세한 예를 추가합니다. 하지만 위에서 말한 내용에 더 많은 정보를 추가하지는 않는다고 생각합니다.

somepkg제가 말하는 패키지가 바로 somefile제가 패치하고 싶은 패키지에 의해 설치된 파일이라고 가정해보겠습니다 .

  1. 최초 설치 somepkg, 내용 somefile:

    some_opt1 = some_value
    some_opt2 = some_value
    some_opt3 = a, b, c, d
    some_opt4 = some_value
    
  2. 패치를 적용하고 다음과 같이 변경합니다.

    some_opt1 = some_value
    some_opt2 = some_value
    some_opt3 = X, Y, Z, d
    some_opt4 = some_value
    
  3. 업그레이드된 somepkg콘텐츠 somefile:

    some_opt1 = some_value
    some_opt2 = some_value
    some_opt5 = some_value
    some_opt3 = a, b, c, d
    some_opt6 = some_value
    some_opt4 = some_value
    
  4. 패치를 적용하고 다음과 같이 변경합니다.

    some_opt1 = some_value
    some_opt2 = some_value
    some_opt5 = some_value
    some_opt3 = X, Y, Z, d
    some_opt6 = some_value
    some_opt4 = some_value
    

자, 그게 무엇인지 somepackage, somefile어디에 있는지, 그 안에 무엇이 있는지 somefile: 그게 전부입니다전혀 관련이 없는내 질문에. 당신이 알아야 할 것은동적으로 수정하고 싶은 것은 파일의 업그레이드 버전을 얻은 후 somefile입니다 .somepkg.

somefile이것은 분명히 정적으로 수행될 수 없습니다. 내용을 읽고, 구문 분석하고 그에 따라 패치하려면 스크립트가 필요합니다 . 따라서 somepkg업데이트할 때마다 스크립트가 자동으로 실행 되도록 하려면 apt-get해당 스크립트가 자동으로 실행되어야 합니다.

답변1

현재 사용하고 있는 스타일이나 후크를 사용하여 apt이를 수행하는 좋은 방법은 없습니다. dpkg수정 중인 특정 패키지와 파일의 업그레이드를 위해 이러한 패치를 처리하는 쉬운 방법이 있을 수 있지만, 일반적인 솔루션을 원한다면 현재 데비안을 위한 가장 좋은 방법은 다음을 사용하는 것입니다.파일 트리거.

여기에는 다른 패키지(패치하려는 파일이 포함된 패키지)가 업그레이드될 때 파일 패치를 담당할 (간단한) 패키지를 생성하는 작업이 포함됩니다. 패치 패키지는 파일 트리거에 대한 관심을 선언해야 합니다. 이를 수행하려면 debian/triggers단일 행을 포함하는 )이라는 파일을 추가하십시오.

interest /path/to/the/file/to/patch

그런 다음 패키지의 postinst( debian/postinst)에서 첫 번째 인수가 인지 확인하고 triggered, 그렇다면 패치 스크립트를 실행합니다(또는 자신의 인수에 병합 postinst). 패치 스크립트를 별도로 유지하려면 패치 패키지에 넣어 콘텐츠를 그대로 유지하면 됩니다.

이 모든 작업이 완료되면 패치 패키지를 빌드하고 설치합니다. 그러면 수정 중인 패키지를 업그레이드할 때마다 postinst패치 패키지가 호출됩니다 .

관련 정보