Debian 패키지에서 오류 메시지와 함께 prerm 및 preinst 스크립트가 실패하도록 만드는 방법

Debian 패키지에서 오류 메시지와 함께 prerm 및 preinst 스크립트가 실패하도록 만드는 방법

다음과 같이 데비안 패키지를 만들었습니다.

  • preinst script사용자에게 EULA를 표시하고 "y" 또는 "n"을 선택하도록 요청합니다.
  • postinst script패키지를 설치하고 initrd 이미지를 업데이트합니다.
  • prerm script, 패키지를 제거하기 전에 조건을 확인하고 조건이 일치하면 prerm을 종료합니다 exit 1.
  • postrm script체크인 prerm 스크립트가 실패하고 initrd 이미지를 업데이트하는 경우 패키지를 제거하십시오.

이제 다음과 같은 문제가 있습니다

  1. 소프트웨어 패키지가 컴퓨터에 이미 설치되어 있고 사용자가 이를 다시 설치하거나 업그레이드하려고 한다고 가정합니다. 이제 사용자가 EULA에 "예"라고 대답하면 데비안은 어떻게 합니까? 이전에 설치한 패키지를 제거하고 다시 설치한 것을 확인했는데, 전혀 문제가 없었습니다. 하지만 사용자가 EULA에 대해 "n"이라고 말하면 제거 프로세스를 어떻게 종료합니까? preinst 스크립트에 추가했지만 exit 1작동하지 않습니다. 이라고 말하면 dpkg -i package데비안은 먼저 패키지가 이미 설치되어 있는지 확인하고, 패키지가 이미 설치되어 있으면 preinst 스크립트를 호출하기 전에도 패키지의 압축을 푼다는 것을 관찰했습니다(`lsmod를 사용하여 확인). 따라서 EULA에 "n"이라고 말하면 , 변경 사항 롤백이 시작됩니다. 즉, postinst 스크립트를 호출하여 압축을 푼 패키지를 다시 설치하는 것입니다. 이는 사용자가 EULA에 "n"이라고 말했기 때문에 최종 사용자에게는 이상하게 보일 것입니다. 모듈이 지금 다시 설치되지 않는지 확인을 추가해 보았지만 앞서 말했듯이 dpkg -i package debian이 모듈을 먼저 제거하고 확인이 실패할 수 있다고 말할 때마다 발생합니다. 그렇다면 사용자가 EULA를 거부하는 경우 패키지 재설치를 어떻게 방지할 수 있습니까?

  2. 내가 말하고 dpkg -r packageprerm script fails and exits with status 1. 위와 같은 일이 여기서도 발생합니다. 라고 말하면 dpkg -r package데비안은 prerm 스크립트를 호출하기 전에 패키지를 제거한 다음 조건이 prerm일치하는지 확인한 다음 종료하고 다시 이상한 동작인 postinst 스크립트를 호출하여 변경 사항을 롤백하기 시작합니다.

이것이 데비안의 기본 동작이라는 것을 알고 있습니다. 하지만 기본 동작을 무시하고 싶다면 어떻게 해야 할까요?

답변1

이런 종류의 작업은 (pre|post)|(inst|rm)스크립트에서 수행해서는 안 됩니다. (pre|post)|(inst|rm)스크립트는 다음과 같아야 합니다.멱등성그리고비대화형.

대신 패키지를 완전히 설치하려면 질문에 답해야 하는 debconf 템플릿을 제공해야 합니다.

예시를 원하시면 sun-java*패키지를 확인해 보세요. 여기에서 debconf 템플릿을 볼 수 있습니다:dlj.템플릿.

이러한 sun-java*패키지는 Java를 설치하기 전에 승인을 받아야 하는 라이센스를 구체적으로 제공합니다.

이것은다른템플릿의 샘플 문제(라이센스가 너무 길기 때문에 여기서 재현할 수 없음):

Template: shared/accepted-sun-dlj-v1-1
Type: boolean
Default: false
_Description: Do you accept the DLJ license terms?
 In order to install this package, you must accept the license terms, the
 "Operating System Distributor License for Java" (DLJ), v1.1. Not accepting
 will cancel the installation.
  • Templatedebconf 데이터베이스에 있는 개체의 이름입니다. 고유해야 합니다.
  • Type값의 유형입니다. 이 경우에는 부울 값입니다. 즉, debconf가 예/아니요 질문을 할 것임을 의미합니다.
  • Default사용자에게 표시될 때 원래 선택된 응답을 제공합니다(또는 질문을 볼 수 있을 만큼 우선순위가 높지 않은 경우 자동으로 선택됨).
  • _Description~이다제목대화 상자.
  • 이제 남은 것은 대화 상자에 표시되는 텍스트뿐입니다. 한 칸 들여쓰기해야 합니다.
  • 템플릿은 다음 구분 기호로 구분됩니다.빈 줄(즉, \n\n)

자세한 내용은 데비안의 문서를 참조하세요.debconf 사양문서화 및개발자 참조 섹션 6.5.

관련 정보