วิธีรันสคริปต์เฉพาะระหว่างการติดตั้งแพ็กเกจแรกและระหว่างการอัพเกรด?


14

ฉันเพิ่งเริ่มต้นบรรจุซอฟต์แวร์ของฉันและเผยแพร่บน Launchpad การติดตั้งและการลบทำงานได้ดี แต่การอัปเกรดแพ็กเกจหนึ่งเวอร์ชันเป็นเวอร์ชันถัดไปถือเป็นปัญหา

ปัญหาคือมีสคริปต์บางตัวที่ต้องรันในระหว่างการติดตั้งแพ็กเกจครั้งแรกเท่านั้น สคริปต์เหล่านี้จะเติมฐานข้อมูลสร้างผู้ใช้เป็นต้นซึ่งปัจจุบันถูกเรียกในconfigure)ส่วนpackage.postinst อย่างไรก็ตามผลการนี้ในพวกเขาถูกเรียกว่าในระหว่างการอัพเกรดเช่นเดียวกับที่แสดงในแผนภาพ

มีวิธีการรวมสคริปต์ผู้ดูแลในแพ็คเกจ. 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

ลองดูแผนภาพนี้จากDebian wikiเกี่ยวกับวิธีเรียกใช้สคริปต์ผู้ดูแลรักษา: แผนผังลำดับงานสคริปต์ของผู้ดูแล Debian

หากคุณติดตามทางซ้ายมือ (เส้นทาง“ ทุกอย่างใช้ได้ดี”) คุณจะเห็นว่าpostinstสคริปต์นั้นถูกเรียกด้วยเวอร์ชันที่กำหนดค่าล่าสุด สิ่งนี้จะให้โอกาสคุณในการแยกความแตกต่างระหว่างการอัพเกรดและการติดตั้งใหม่ - ในกรณีการอัพเกรดโพสต์ของคุณจะถูกเรียกว่า

postinst configure 1.23-0ubuntu1

โดยที่1.23-0ubuntu1เป็นเวอร์ชันที่ติดตั้งไว้ก่อนหน้าของแพ็คเกจของคุณในขณะที่การติดตั้งใหม่จะถูกเรียกว่า

postinst configure

นอกจากนี้ยังช่วยให้คุณสามารถจัดการกรณีและปัญหาเมื่อคุณต้องการดำเนินการเมื่ออัปเกรดจากรุ่นใดรุ่นหนึ่ง - คุณสามารถตรวจสอบในpostinstเวอร์ชันนั้นได้

สิ่งนี้ทำให้ง่ายต่อการตรวจสอบว่าสคริปต์กำลังทำอยู่ใน 'ติดตั้ง' หรือ 'อัพเกรด' ถ้า $ 2 เป็นโมฆะแสดงว่าเป็นการติดตั้ง ดังนั้น:

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

1
โปรดทราบว่าพารามิเตอร์พิเศษจะถูกส่งผ่านในกรณีที่คุณลบแพ็คเกจ (แต่ไม่ได้ลบทิ้ง) และติดตั้งอีกครั้ง
skyking

3

คุณอาจสามารถใช้สคริปต์ debian / preinst ร่วมกับ postinst

ในสคริปต์ preinst ให้ตรวจสอบไฟล์ที่ pkg ของคุณติดตั้งอย่างแน่นอน ถ้ามีอยู่อย่าทำอะไรเลย (เพราะแพ็คเกจของคุณติดตั้งไว้ก่อนหน้านี้) มิฉะนั้นให้ทำตามขั้นตอนการตั้งค่าของคุณ

หากขั้นตอนการตั้งค่าของคุณต้องการติดตั้ง pkg ของคุณ (ซึ่งในกรณีข้างต้นจะไม่ทำงานเนื่องจาก preinst ทำงานก่อนการติดตั้ง) จากนั้นสคริปต์ preinst ของคุณสามารถเขียนไฟล์ได้ตัวอย่างเช่น: / tmp / setupmypkg สคริปต์ postinst ของคุณสามารถทดสอบได้ว่ามีไฟล์นั้นอยู่หรือไม่และทำสองสิ่งดังนี้:

  • ขั้นตอนการตั้งค่าเริ่มต้นของคุณ
  • ลบไฟล์ / tmp / setupmypkg

1
ใช่มันจะทำงานได้และตอนนี้ฉันกำลังทำสิ่งที่คล้ายกัน แต่มันก็ยังดูแฮ็กอยู่หน่อย ... ฉันหวังว่าจะได้ทำแบบนั้น ดูเหมือนจะไม่เป็นคำขอที่แปลกใหม่ใช่มั้ย
Jeroen

1

ฉันพบว่าการทดสอบ $ 2 ในสคริปต์ "postinst configure" ของคุณไม่ทำงานอย่างถูกต้องหากคุณได้ติดตั้งแพ็กเกจของคุณหนึ่งครั้งก่อนหน้านี้จากนั้นถอนการติดตั้ง (แต่ไม่ต้องล้างข้อมูล) จากนั้นลองติดตั้งอีกครั้ง ในกรณีนี้สคริปต์ 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 

แก้ไข

อืมคุณอาจจะสามารถตรวจสอบทั้งหมดนี้ได้โดยตรงใน postinst เพราะฉันคิดว่า dpkg จะไม่ตั้งค่าสถานะของแพ็กเกจที่ติดตั้งไว้ก่อนที่จะดำเนินการ postinst แต่ฉันไม่แน่ใจ ดังนั้นข้างต้นอาจจะมา

ใน postinst

if not is_package_istalled():
    Do First Install Setup 

โดยที่ is_package_installed คุณสามารถทำงานเพื่อตรวจสอบสถานะการติดตั้ง อาจเป็นบางสิ่งเช่น 'dpkg - สถานะ packagename'

หรือ

ทำไมไม่เพียงแค่ตรวจสอบว่าการเปลี่ยนแปลงที่คุณต้องการมีอยู่แล้วและดำเนินการต่อหากไม่ได้


ฉันไม่เข้าใจ IS_INSTALLED มาจากไหน
Jeroen

ไม่มี IS_INSTALLED มันเป็นรหัสหลอก เป็นเพียงตัวอย่าง IS_INSTALLED อาจเป็นผลลัพธ์ของคำสั่งเช่น 'dpkg --status package_name' สิ่งที่ฉันหมายถึงคือคุณสามารถตรวจสอบได้ว่ามีการติดตั้งแพ็คเกจใน preinst หรือไม่ตั้งสถานะ var จากนั้นดำเนินการตามสถานะ var ใน postinst
Owais Lone
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.