패키지를 처음 설치하거나 업그레이드하는 동안에 만 스크립트를 실행하는 방법은 무엇입니까?


14

최근에 소프트웨어 일부를 패키징하고 Launchpad에 게시하기 시작했습니다. 설치 및 제거는 정상적으로 작동하지만 패키지를 한 버전에서 다음 버전으로 업그레이드하는 데 문제가 있습니다.

문제는 패키지를 처음 설치할 때만 실행해야하는 스크립트가 있다는 것입니다. 이 스크립트는 DB를 채우고 사용자를 생성하는 등의 작업을 수행합니다. 현재 package.postinst configure)섹션 에서 호출됩니다 . 그러나 이로 인해 다이어그램에 표시된대로 업그레이 드하는 동안 호출됩니다 .

업그레이드하지 않고 패키지를 처음 설치할 때만 실행되는 .deb 패키지에 관리자 스크립트를 포함시키는 방법이 있습니까? 또는 .deb 패키지에 일부 초기 설정 스크립트를 포함시키는 우아한 방법은 무엇입니까?

답변:


15

debian/preinst파일을 사용하면 설치 작업을 수행 할 수 있지만 업그레이드 할 수는 없습니다.

#!/bin/sh
set -e

case "$1" in
    install)
        # do some magic
        ;;

    upgrade|abort-upgrade)
        ;;

    *)
        echo "postinst called with unknown argument \`$1'" >&2
        exit 0
        ;;
esac

#DEBHELPER#

exit 0

이름에서 알 수 있듯이 패키지가 설치되기 전에 실행됩니다. 따라서 여기서 필요한 것을 수행하지 못할 수도 있습니다. 대부분의 패키지 postinst는 사용자가 이미 생성 된 경우 구성 단계에서 테스트합니다 . 여기colord

$ cat  /var/lib/dpkg/info/colord.postinst
#!/bin/sh

set -e

case "$1" in
    configure)

# create colord group if it isn't already there
    if ! getent group colord >/dev/null; then
            addgroup --quiet --system colord
    fi

# create the scanner group if it isn't already there
    if ! getent group scanner >/dev/null; then
        addgroup --quiet --system scanner
    fi

# create colord user if it isn't already there
    if ! getent passwd colord >/dev/null; then
            adduser --system --ingroup colord --home /var/lib/colord colord \
        --gecos "colord colour management daemon"
        # Add colord user to scanner group
        adduser --quiet colord scanner
    fi

# ensure /var/lib/colord has appropriate permissions
    chown -R colord:colord /var/lib/colord

    ;;
esac    



exit 0

28

관리자 스크립트가 어떻게 호출되는지 데비안 위키 에서이 다이어그램을 확인하십시오 . 데비안 메인테이너 스크립트 순서도

왼쪽을 따라 가면 (“모든 것이 정상입니다”경로) postinst가장 최근에 구성된 버전으로 스크립트가 호출 된 것을 볼 수 있습니다. 이를 통해 업그레이드와 새로 설치를 구분할 수 있습니다. 업그레이드의 경우 postinst가 다음과 같이 호출됩니다.

postinst configure 1.23-0ubuntu1

1.23-0ubuntu1이전에 설치된 패키지 버전은 어디에 있고 새로 설치하는 경우 다음과 같이 호출됩니다

postinst configure

또한 특정 버전에서 업그레이드 할 때 작업을 수행해야하는 경우를 처리 할 수 ​​있습니다 postinst. 해당 버전을 확인할 수 있습니다 .

이를 통해 스크립트가 '설치'또는 '업그레이드'에서 수행되고 있는지 쉽게 확인할 수 있습니다. $ 2가 null이면 설치입니다. 그래서:

if [ -z "$2" ]; then
  do install stuff
else
  do upgrade stuff
fi

1
패키지를 제거했지만 제거하지 않은 경우에도 추가 매개 변수가 전달됩니다.
skyking

3

postinst와 함께 debian / preinst 스크립트를 사용할 수 있습니다.

preinst 스크립트에서 pkg이 확실히 설치 한 파일을 확인하십시오. 존재하는 경우, 패키지가 이전에 설치되었으므로 아무 것도하지 마십시오. 그렇지 않으면 설정 단계를 수행하십시오.

설치 단계에서 pkg을 설치해야하는 경우 (이 경우 설치 전에 preinst가 실행되므로 위의 작업이 작동하지 않음) preinst 스크립트는 파일을 작성할 수 있습니다 (예 : / tmp / setupmypkg). postinst 스크립트는 해당 파일이 있는지 여부와 단순히 두 가지 경우 만 테스트 할 수 있습니다.

  • 초기 설정 단계
  • / tmp / setupmypkg 파일을 삭제하십시오.

1
예, 이것이 작동하고 현재 비슷한 것을하고 있습니다. 그러나 여전히 약간 해키처럼 보입니다 ... 나는 더 네이티브 방식을 원했습니다. 이국적인 요청처럼 보이지 않습니까?
Jeroen

1

패키지를 이미 한 번 설치 한 다음 제거했지만 (제거하지 않고) 다시 설치하려고하면 "postinst configure"스크립트에서 $ 2 테스트가 제대로 작동하지 않는 것으로 나타났습니다. 이 경우 postinst 스크립트는 여전히 "postinst configure"단계에 대한 버전 인수를 가져옵니다.

그러나 이전에 패키지를 설치 한 후 제거하고 제거한 다음 다시 설치하면 "postinst configure"스크립트가 $ 2의 버전 인수를 얻지 못합니다.


0

그렇게 생각하지는 않지만 패키지가 처음 설치되는지 확인하고 표준 조치를 취하도록 preinst / postinst 스크립트를 쉽게 수정할 수 있습니다.

이런 식일지도 모르지만

preinst.

if not is_package_istalled():
    export MY_PACKAGE_FIRST_INSTALL

postinst에서

if MY_PACKAGE_FIRST_INSTALL:
    Do First Install Setup 

편집하다

dpkg가 postinst를 실행하기 전에 설치된 패키지 상태를 설정하지 않았지만 확실하지 않기 때문에 postinst 에서이 모든 것을 직접 확인할 수 있습니까? 위의 내용이 올 수 있습니다.

postinst에서

if not is_package_istalled():
    Do First Install Setup 

여기서 is_package_installed를 사용하면 설치 상태를 감지 할 수 있습니다. 'dpkg --status packagename'과 같은 것일 수 있습니다.

또는

변경하려는 내용이 이미 있는지 확인하고없는 경우에만 진행하십시오.


이해가 안 돼요 IS_INSTALLED는 어디에서 왔습니까?
Jeroen

IS_INSTALLED가 없으며 단지 의사 코드입니다. 단지 예입니다. IS_INSTALLED는 'dpkg --status package_name'과 같은 명령의 출력 일 수 있습니다. 패키지가 preinst에 설치되어 있는지 확인하고 상태 var를 설정 한 다음이 상태를 기반으로 postinst에서 조치를 취하십시오.
Owais Lone
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.