summaryrefslogtreecommitdiffstats
path: root/usr.sbin/bsdconfig/share/packages
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/bsdconfig/share/packages')
-rwxr-xr-xusr.sbin/bsdconfig/share/packages/index.subr209
-rwxr-xr-xusr.sbin/bsdconfig/share/packages/packages.subr108
2 files changed, 241 insertions, 76 deletions
diff --git a/usr.sbin/bsdconfig/share/packages/index.subr b/usr.sbin/bsdconfig/share/packages/index.subr
index 863249c..6e14e4c 100755
--- a/usr.sbin/bsdconfig/share/packages/index.subr
+++ b/usr.sbin/bsdconfig/share/packages/index.subr
@@ -43,24 +43,53 @@ f_include_lang $BSDCFG_LIBE/include/messages.subr
PACKAGE_INDEX=
_INDEX_INITTED=
+#
+# Default path to pkg(8) repo-packagesite.sqlite database
+#
+SQLITE_REPO="/var/db/pkg/repo-packagesite.sqlite"
+
+#
+# Default path to on-disk cache INDEX file
+#
+PACKAGES_INDEX_CACHEFILE="/var/run/bsdconfig/packages_INDEX.cache"
+
+#
+# INDEX format for FreeBSD-6.0 or higher:
+#
+# package|port-origin|install-prefix|comment|port-desc-file|maintainer|
+# categories|build-deps|run-deps|www-site|reserve|reserve|reserve|disc
+#
+INDEX_FORMAT="%n-%v" # package
+INDEX_FORMAT="$INDEX_FORMAT|/usr/ports/%o" # port-origin
+INDEX_FORMAT="$INDEX_FORMAT|%p" # install-prefix
+INDEX_FORMAT="$INDEX_FORMAT|%c" # comment
+INDEX_FORMAT="$INDEX_FORMAT|/usr/ports/%o/pkg-descr" # port-desc-file
+INDEX_FORMAT="$INDEX_FORMAT|%m" # maintainer
+INDEX_FORMAT="$INDEX_FORMAT|@CATEGORIES@" # place-holder
+INDEX_FORMAT="$INDEX_FORMAT|" # build-deps
+INDEX_FORMAT="$INDEX_FORMAT|@RUNDEPS@" # place-holder
+INDEX_FORMAT="$INDEX_FORMAT|%w" # www-site
+INDEX_FORMAT="$INDEX_FORMAT|" # reserved
+INDEX_FORMAT="$INDEX_FORMAT|" # reserved
+INDEX_FORMAT="$INDEX_FORMAT|" # reserved
+INDEX_FORMAT="$INDEX_FORMAT|" # disc
+
############################################################ FUNCTIONS
-# f_index_initialize $path [$var_to_set]
+# f_index_initialize [$var_to_set]
#
-# Read and initialize the global index. $path is to be relative to the chosen
-# media (not necessarily the filesystem; e.g. FTP) -- this is usually going to
-# be `packages/INDEX'. Returns success unless media cannot be initialized for
-# any reason (e.g. user cancels media selection dialog) or an error occurs. The
-# index is sorted before being loaded into $var_to_set.
+# Read and initialize the global index. Returns success unless media cannot be
+# initialized for any reason (e.g. user cancels media selection dialog or an
+# error occurs). The index is sorted before being loaded into $var_to_set.
#
# NOTE: The index is processed with f_index_read() [below] after being loaded.
#
f_index_initialize()
{
- local __path="$1" __var_to_set="${2:-PACKAGE_INDEX}"
+ local __funcname=f_index_initialize
+ local __var_to_set="${2:-PACKAGE_INDEX}"
[ "$_INDEX_INITTED" ] && return $SUCCESS
- [ "$__path" ] || return $FAILURE
# Got any media?
f_media_verify || return $FAILURE
@@ -68,20 +97,170 @@ f_index_initialize()
# Does it move when you kick it?
f_device_init media || return $FAILURE
- f_show_info "$msg_attempting_to_fetch_file_from_selected_media" \
- "$__path"
- eval "$__var_to_set"='$( f_device_get media "$__path" )'
- if [ $? -ne $SUCCESS ]; then
- f_show_msg "$msg_unable_to_get_file_from_selected_media" \
- "$__path"
+ f_show_info "$msg_attempting_to_update_repository_catalogue"
+
+ #
+ # Generate $PACKAGESITE variable for pkg(8) based on media type
+ #
+ local __type __data __site
+ device_media get type __type
+ device_media get private __data
+ case "$__type" in
+ $DEVICE_TYPE_DIRECTORY)
+ __site="file://$__data/packages/$PKG_ABI" ;;
+ $DEVICE_TYPE_FLOPPY)
+ __site="file://${__data:-$MOUNTPOINT}/packages/$PKG_ABI" ;;
+ $DEVICE_TYPE_FTP)
+ f_getvar $VAR_FTP_PATH __site
+ __site="$__site/packages/$PKG_ABI" ;;
+ $DEVICE_TYPE_HTTP)
+ f_getvar $VAR_HTTP_PATH __site
+ __site="$__site/$PKG_ABI/latest" ;;
+ $DEVICE_TYPE_HTTP_PROXY)
+ f_getvar $VAR_HTTP_PROXY_PATH __site
+ __site="$__site/packages/$PKG_ABI" ;;
+ *) # UFS, DISK, CDROM, USB, DOS, NFS, etc.
+ __site="file://$MOUNTPOINT/packages/$PKG_ABI"
+ esac
+
+ export PACKAGESITE="$__site"
+ f_dprintf "PACKAGESITE=[%s]" "$PACKAGESITE"
+ if ! f_eval_catch $__funcname pkg "pkg update"; then
+ f_show_err "$msg_unable_to_update_pkg_from_selected_media"
+ f_device_shutdown media
+ return $FAILURE
+ fi
+
+ #
+ # Try to get contents from validated on-disk cache
+ #
+
+ #
+ # Calculate digest used to determine if the on-disk persistant cache
+ # INDEX (containing this digest on the first line) is valid and can be
+ # used to quickly populate the environment.
+ #
+ local __sqlite_digest
+ if ! __sqlite_digest=$( md5 < "$SQLITE_REPO" 2> /dev/null ); then
+ f_show_err "$msg_no_pkg_database_found"
+ f_device_shutdown media
+ return $FAILURE
+ fi
+
+ #
+ # Check to see if the persistant cache INDEX file exists
+ #
+ if [ -f "$PACKAGES_INDEX_CACHEFILE" ]; then
+ #
+ # Attempt to populate the environment with the (soon to be)
+ # validated on-disk cache. If validation fails, fall-back to
+ # generating a fresh cache.
+ #
+ if eval $__var_to_set='$(
+ ( # Get digest as the first word on first line
+ read digest rest_ignored
+
+ #
+ # If the stored digest matches the calculated-
+ # one populate the environment from the on-disk
+ # cache and provide success exit status.
+ #
+ if [ "$digest" = "$__sqlite_digest" ]; then
+ cat
+ exit $SUCCESS
+ else
+ # Otherwise, return the current value
+ eval echo \"\$__var_to_set\"
+ exit $FAILURE
+ fi
+ ) < "$PACKAGES_INDEX_CACHEFILE" 2> /dev/null
+ )'; then
+ f_show_info \
+ "$msg_located_index_now_reading_package_data_from_it"
+ if ! f_index_read "$__var_to_set"; then
+ f_show_err \
+ "$msg_io_or_format_error_on_index_file"
+ return $FAILURE
+ fi
+ _INDEX_INITTED=1
+ return $SUCCESS
+ fi
+ # Otherwise, fall-thru to create a fresh cache from scratch
+ fi
+
+ #
+ # If we reach this point, we need to generate the data from scratch
+ #
+
+ f_show_info "$msg_getting_package_categories_via_pkg_rquery"
+ if ! eval "$( pkg rquery "%n-%v %C" | awk '
+ { categories[$1] = categories[$1] " " $2 }
+ END {
+ for (package in categories)
+ {
+ cats = categories[package]
+ sub(/^ /, "", cats)
+ gsub(/[^[:alnum:]_]/, "_", package)
+ printf "local _%s_categories=\"%s\";\n", package, cats
+ }
+ }' )"; then
+ f_show_err "$msg_unable_to_pkg_rquery_package_dependencies"
+ f_device_shutdown media
+ return $FAILURE
+ fi
+
+ f_show_info "$msg_getting_package_dependencies_via_pkg_rquery"
+ if ! eval "$( pkg rquery "%n-%v %dn-%dv" | awk '
+ { rundeps[$1] = rundeps[$1] " " $2 }
+ END {
+ for (package in rundeps)
+ {
+ deps = rundeps[package]
+ sub(/^ /, "", deps)
+ gsub(/[^[:alnum:]_]/, "_", package)
+ printf "local _%s_rundeps=\"%s\";\n", package, deps
+ }
+ }' )"; then
+ f_show_err "$msg_unable_to_pkg_rquery_package_dependencies"
f_device_shutdown media
return $FAILURE
fi
+
+ f_show_info "$msg_generating_index_from_pkg_database"
+ eval "$__var_to_set"='$( pkg rquery "$INDEX_FORMAT" |
+ while read LINE; do
+ package="${LINE%%|*}";
+ f_str2varname "$package" varpkg;
+ eval f_replaceall \"\$LINE\" \"\|@CATEGORIES@\|\" \
+ \"\|\$_${varpkg}_categories\|\" LINE
+ eval f_replaceall \"\$LINE\" \"\|@RUNDEPS@\|\" \
+ \"\|\$_${varpkg}_rundeps\|\" LINE
+ echo "$LINE"
+ done
+ )' # always returns true (status of last item in pipe-chain)
eval "$__var_to_set"='$( debug= f_getvar "$__var_to_set" | sort )'
+ #
+ # Attempt to create the persistant on-disk cache
+ #
+
+ # Create a new temporary file to write to
+ local __tmpfile="$( mktemp -t "$pgm" )"
+ if [ "$__tmpfile" ]; then
+ # Write the temporary file contents
+ echo "$__sqlite_digest" > "$__tmpfile"
+ debug= f_getvar "$__var_to_set" >> "$__tmpfile"
+
+ # Finally, move the temporary file into place
+ case "$PACKAGES_INDEX_CACHEFILE" in
+ */*) f_quietly mkdir -p "${PACKAGES_INDEX_CACHEFILE%/*}"
+ esac
+ f_quietly mv -f "$__tmpfile" "$PACKAGES_INDEX_CACHEFILE"
+ fi
+
f_show_info "$msg_located_index_now_reading_package_data_from_it"
if ! f_index_read "$__var_to_set"; then
- f_show_msg "$msg_io_or_format_error_on_index_file" "$__path"
+ f_show_err "$msg_io_or_format_error_on_index_file"
return $FAILURE
fi
diff --git a/usr.sbin/bsdconfig/share/packages/packages.subr b/usr.sbin/bsdconfig/share/packages/packages.subr
index 85aebc8..a4ecdb9 100755
--- a/usr.sbin/bsdconfig/share/packages/packages.subr
+++ b/usr.sbin/bsdconfig/share/packages/packages.subr
@@ -53,7 +53,7 @@ f_include_lang $BSDCFG_LIBE/include/messages.subr
#
# Package extensions to try
#
-PACKAGE_EXTENSIONS=".tbz .tbz2 .tgz"
+PACKAGE_EXTENSIONS=".txz .tbz .tbz2 .tgz"
#
# Variables used to track runtime states
@@ -164,24 +164,13 @@ f_package_deselect()
# f_package_detect_installed
#
-# Detect installed packages. Currently this searches /var/db/pkg for directory
+# Detect installed packages. Currently this uses pkg-query(8) for querying
# entries and marks each entry as an installed/selected package.
#
f_package_detect_installed()
{
- local installed package varpkg
- #
- # XXX KLUDGE ALERT! This makes evil assumptions about how XXX
- # packages register themselves and should *really* be done with
- # `pkg_info -e <name>' except that this is too slow for an
- # item check routine.. :-(
- #
- # NOTE: When transitioning to pkgng, make a single fork to `pkg' to
- # produce a list of all installed packages and parse _that_
- #
- installed=$( find -s /var/db/pkg -mindepth 1 -maxdepth 1 -type d |
- sed -e 's:/var/db/pkg/::' )
- for package in $installed; do
+ local package varpkg
+ for package in $( pkg query "%n-%v" ); do
f_str2varname $package varpkg
export _mark_$varpkg=X # exported for awk(1) ENVIRON[]
f_package_select $package
@@ -582,12 +571,12 @@ f_package_menu_deselect()
#
f_package_review()
{
+ local funcname=f_package_review
local prompt # Calculated below
local menu_list # Calculated below
local hline="$hline_alnum_arrows_punc_tab_enter"
- local fname=f_package_review
- f_dprintf "%s: SELECTED_PACKAGES=[%s]" $fname "$SELECTED_PACKAGES"
+ f_dprintf "$funcname: SELECTED_PACKAGES=[%s]" "$SELECTED_PACKAGES"
prompt=$( printf "$msg_reviewing_selected_packages" "$_All_nselected" )
@@ -639,7 +628,7 @@ f_package_review()
f_str2varname "$package" varpkg
debug= f_getvar _mark_$varpkg mark
[ "$mark" = "I" ] || continue
- f_dprintf "%s: Installing %s package" $fname "$package"
+ f_dprintf "$funcname: Installing %s package" "$package"
f_package_add "$package"
done
for package in $SELECTED_PACKAGES; do
@@ -647,7 +636,7 @@ f_package_review()
f_str2varname "$package" varpkg
debug= f_getvar _mark_$varpkg mark
[ "$mark" = "R" ] || continue
- f_dprintf "%s: Reinstalling %s package" $fname "$package"
+ f_dprintf "$funcname: Reinstalling %s package" "$package"
f_package_reinstall "$package"
done
for package in $SELECTED_PACKAGES; do
@@ -655,7 +644,7 @@ f_package_review()
f_str2varname "$package" varpkg
debug= f_getvar _mark_$varpkg mark
[ "$mark" = "U" ] || continue
- f_dprintf "%s: Uninstalling %s package" $fname "$package"
+ f_dprintf "$funcname: Uninstalling %s package" "$package"
f_package_delete "$package" || continue
f_package_deselect "$package"
done
@@ -954,11 +943,11 @@ f_package_add()
#
f_package_extract()
{
+ local funcname=f_package_extract
local device="$1" name="$2" depended="$3"
- local fname=f_package_extract
- f_dprintf "%s: device=[%s] name=[%s] depended=[%s]" \
- $fname "$device" "$name" "$depended"
+ f_dprintf "$funcname: device=[%s] name=[%s] depended=[%s]" \
+ "$device" "$name" "$depended"
# Check to make sure it's not already there
local varpkg mark=
@@ -982,35 +971,45 @@ f_package_extract()
f_getvar $VAR_PKG_TMPDIR:-/var/tmp tmpdir
f_quietly mkdir -p -m 1777 "$tmpdir"
- local path
+ local path device_type
+ device_$device get type device_type
case "$name" in
*/*) path="$name" ;;
*)
- case "$name" in
- *-*|*_*) path="packages/All/$name" ;;
- *) path="packages/Latest/$name"
- esac
+ if [ "$device_type" = "$DEVICE_TYPE_HTTP" ]; then
+ path="$PKG_ABI/latest/All/$name"
+ else
+ path="packages/$PKG_ABI/All/$name"
+ fi
esac
- # We have a path, call the device strategy routine to get the file
+ # We have a path, call the device strategy routine to check the file
local pkg_ext found=
for pkg_ext in "" $PACKAGE_EXTENSIONS; do
if f_device_get $device "$path$pkg_ext" $PROBE_EXIST; then
path="$path$pkg_ext"
- f_dprintf "%s: found path=[%s] dev=[%s]" \
- $fname "$path" "$device"
+ found=1
+ break
+ elif [ "$device_type" = "$DEVICE_TYPE_HTTP" ] &&
+ f_device_get $device \
+ "packages/$PKG_ABI/All/$name$pkg_ext" $PROBE_EXIST
+ then
+ # Mirroring physical media over HTTP
+ path="packages/$PKG_ABI/All/$name$pkg_ext"
found=1
break
fi
done
+ [ "$found" ] && f_dprintf "$funcname: found path=[%s] dev=[%s]" \
+ "$path" "$device"
local alert=f_show_msg no_confirm=
f_getvar $VAR_NO_CONFIRM no_confirm
[ "$no_confirm" ] && alert=f_show_info
if [ ! "$found" ]; then
- f_dprintf "%s: No such %s file on %s device" \
- $fname "$path" "$device"
+ f_dprintf "$funcname: No such %s file on %s device" \
+ "$path" "$device"
$alert "$msg_unable_to_fetch_package_from_selected_media" \
"$name"
[ "$no_confirm" ] && sleep 2
@@ -1026,27 +1025,14 @@ f_package_extract()
f_show_info "$msg_adding_package_from_media" "$name" "$devname"
fi
- # Get package data and pipe into pkg_add(1) while providing feedback
- {
- if ! f_device_get $device "$path"; then
- $alert "$msg_io_error_while_reading_in_the_package" \
- "$name" \
- >&$DIALOG_TERMINAL_PASSTHRU_FD 2> /dev/null
- [ "$no_confirm" ] && sleep 2
- else
- f_show_info \
- "$msg_package_read_successfully_waiting_for_pkg_add" \
- "$name" >&$DIALOG_TERMINAL_PASSTHRU_FD 2> /dev/null
- fi
- } | {
- if f_debugging; then
- /usr/sbin/pkg_add -v -
- else
- f_quietly /usr/sbin/pkg_add -
- fi
- }
+ # Request the package be added via pkg-install(8)
+ if f_debugging; then
+ f_eval_catch $funcname pkg 'pkg -d install -y "%s"' "$name"
+ else
+ f_eval_catch $funcname pkg 'pkg install -y "%s"' "$name"
+ fi
if [ $? -ne $SUCCESS ]; then
- $alert "$msg_pkg_add_apparently_did_not_like_the_package" \
+ $alert "$msg_pkg_install_apparently_did_not_like_the_package" \
"$name"
[ "$no_confirm" ] && sleep 2
else
@@ -1063,8 +1049,8 @@ f_package_extract()
#
f_package_delete()
{
+ local funcname=f_package_delete
local name="$1"
- local fname=f_package_delete
if ! { [ "$name" ] || { f_getvar $VAR_PACKAGE name && [ "$name" ]; }; }
then
@@ -1073,7 +1059,7 @@ f_package_delete()
return $FAILURE
fi
- f_dprintf "%s: name=[%s]" $fname "$name"
+ f_dprintf "$funcname: name=[%s]" "$name"
[ "$name" ] || return $FAILURE
@@ -1110,7 +1096,7 @@ f_package_delete()
# detected the installed packages -- something we should do only once.
#
if [ ! "$PACKAGES_DETECTED" ]; then
- f_dprintf "%s: Detecting installed packages" $fname
+ f_dprintf "$funcname: Detecting installed packages"
f_package_detect_installed
export PACKAGES_DETECTED=1 # exported for awk(1) ENVIRON[]
fi
@@ -1162,8 +1148,8 @@ f_package_delete()
# Chase dependencies that are marked for uninstallation
#
for pkgsel in $udeps; do
- f_dprintf "%s: Uninstalling dependecy %s (marked for delete)" \
- $fname "$pkgsel"
+ f_dprintf "$funcname: Uninstalling dependency %s (%s)" \
+ "$pkgsel" "marked for delete"
f_package_delete "$pkgsel"
done
@@ -1172,15 +1158,15 @@ f_package_delete()
#
f_show_info "$msg_uninstalling_package_waiting_for_pkg_delete" "$name"
if f_debugging; then
- pkg_delete -v "$name"
+ f_eval_catch $funcname pkg 'pkg -d delete -y "%s"' "$name"
else
- f_quietly pkg_delete "$name"
+ f_eval_catch $funcname pkg 'pkg delete -y "%s"' "$name"
fi
if [ $? -ne $SUCCESS ]; then
f_show_msg "$msg_pkg_delete_failed" "$name"
return $FAILURE
else
- f_dprintf "%s: pkg_delete(1) of %s successful" $fname "$name"
+ f_dprintf "$funcname: pkg-delete(8) of %s successful" "$name"
f_str2varname "$name" varpkg
setvar _mark_$varpkg ""
fi
OpenPOWER on IntegriCloud