Add support for processing add-on modules from /usr/local/libexec/bsdconfig
(this is designed to allow new modules to be installed via ports/packages). To prevent conflict with itself (sysutils/bsdconfig) as a port (which installs its base modules to the above directory, it was long-ago decided that so-called `base' modules would look different than now-defined `add-on' modules. The structure of the contents for each is the same, but the naming convention for the module directory must be different. Base modules are named `[0-9][0-9][0-9].*' to allow SysV-style organization while add-on modules must avoid this naming style and are simply listed in alphabetical order by their module directory. For example, a hypothetical port named `bsdconfig-jails' could install /usr/local/libexec/bsdconfig/jails and provide `bsdconfig jails' as well as a new menu entry in the main-menu. Add-on modules are listed in the main-menu (when bsdconfig is executed with- out arguments) below a separator after the last base-module. In `bsdconfig -h' output, add-on modules are listed right alongside base modules (sorted alphabetically in columnar fashion; left-to-right). If a base module declares a keyword used by an add-on module, the base module will always win when given `bsdconfig keyword' syntax. Add-on modules should avoid declaring any keyword found in `script.subr' as a reserved-word (`Resword') since bsdconfig also supports `bsdconfig resword' as a fall-back if no keyword is found to be declared by any module.
This commit is contained in:
parent
c6470c75f5
commit
1da51566d5
@ -57,6 +57,13 @@ f_include_lang $BSDCFG_LIBE/include/messages.subr
|
||||
BSDCONFIG_HELPFILE=$BSDCFG_LIBE/include/bsdconfig.hlp
|
||||
USAGE_HELPFILE=$BSDCFG_LIBE/include/usage.hlp
|
||||
|
||||
############################################################ CONFIGURATION
|
||||
|
||||
#
|
||||
# Alternate `local' libexec directory for add-on modules (e.g., from ports)
|
||||
#
|
||||
BSDCFG_LOCAL_LIBE="/usr/local/libexec/bsdconfig"
|
||||
|
||||
############################################################ FUNCTIONS
|
||||
|
||||
# usage
|
||||
@ -83,6 +90,27 @@ usage()
|
||||
}' */$index | sort
|
||||
)
|
||||
|
||||
local alt_cmd_list # Calculated below (if $BSDCFG_LOCAL_LIBE exists)
|
||||
if f_quietly cd $BSDCFG_LOCAL_LIBE; then
|
||||
# No need to preserve CWD (headed toward exit)
|
||||
|
||||
# Test for language-specific indices
|
||||
f_quietly ls */"$index.${LANG:-$LC_ALL}" &&
|
||||
index="$index.${LANG:-$LC_ALL}"
|
||||
|
||||
alt_cmd_list=$(
|
||||
awk '/^menu_selection="/ {
|
||||
sub(/\|.*/, "")
|
||||
sub(/^menu_selection="/, "")
|
||||
print
|
||||
}' */$index 2> /dev/null | sort
|
||||
)
|
||||
|
||||
# Conflate lists, removing duplicates
|
||||
cmd_list=$( printf "%s\n%s\n" \
|
||||
"$cmd_list" "$alt_cmd_list" | sort -u )
|
||||
fi
|
||||
|
||||
#
|
||||
# Determine the longest command-length (in characters)
|
||||
#
|
||||
@ -167,6 +195,9 @@ dialog_menu_main()
|
||||
local defaultitem= # Calculated below
|
||||
local hline=
|
||||
|
||||
#
|
||||
# Pick up the base modules (directories named `[0-9][0-9][0-9].*')
|
||||
#
|
||||
local menuitem menu_title menu_help menu_selection index=2
|
||||
for menuitem in $( cd $BSDCFG_LIBE && ls -d [0-9][0-9][0-9].* ); do
|
||||
[ $index -lt ${#DIALOG_MENU_TAGS} ] || break
|
||||
@ -190,6 +221,49 @@ dialog_menu_main()
|
||||
index=$(( $index + 1 ))
|
||||
done
|
||||
|
||||
#
|
||||
# Process the `local' libexec sources.
|
||||
#
|
||||
# Whereas modules in $BSDCFG_LIBE must be named [0-9][0-9][0-9].*
|
||||
# modules in $BSDCFG_LOCAL_LIBE should NOT be named this way (making it
|
||||
# more practical for port-maintainers).
|
||||
#
|
||||
# This also has the fortunate side-effect of making the de-duplication
|
||||
# effort rather simple (because so-called `base' modules must be named
|
||||
# differently than add-on modules).
|
||||
#
|
||||
local separator_added=
|
||||
for menuitem in $( cd "$BSDCFG_LOCAL_LIBE" 2> /dev/null && ls -d * )
|
||||
do
|
||||
[ $index -lt ${#DIALOG_MENU_TAGS} ] || break
|
||||
|
||||
# Skip the module if it looks like a `base' module
|
||||
case "$menuitem" in [0-9][0-9][0-9].*) continue;; esac
|
||||
|
||||
menu_program= menu_title= menu_help=
|
||||
f_include_lang $BSDCFG_LOCAL_LIBE/$menuitem/INDEX || continue
|
||||
[ "$menu_program" ] || continue
|
||||
|
||||
if [ ! "$separator_added" ]; then
|
||||
menu_list="$menu_list '-' '-' ''"
|
||||
separator_added=1
|
||||
fi
|
||||
|
||||
case "$menu_program" in
|
||||
/*) : already fully qualified ;;
|
||||
*) menu_program="$BSDCFG_LOCAL_LIBE/$menuitem/$menu_program"
|
||||
esac
|
||||
|
||||
tag=$( f_substr "$DIALOG_MENU_TAGS" $index 1 )
|
||||
setvar "menu_program$tag" "$menu_program"
|
||||
|
||||
f_shell_escape "$menu_title" menu_title
|
||||
f_shell_escape "$menu_help" menu_help
|
||||
menu_list="$menu_list '$tag' '$menu_title' '$menu_help'"
|
||||
|
||||
index=$(( $index + 1 ))
|
||||
done
|
||||
|
||||
local height width rows
|
||||
eval f_dialog_menu_with_help_size height width rows \
|
||||
\"\$title\" \
|
||||
|
@ -531,12 +531,22 @@ f_index_file()
|
||||
|
||||
if [ "$lang" ]; then
|
||||
awk -v keyword="$keyword" "$f_index_file_awk" \
|
||||
$BSDCFG_LIBE${BSDCFG_LIBE:+/}*/INDEX.$lang &&
|
||||
return
|
||||
$BSDCFG_LIBE${BSDCFG_LIBE:+/}*/INDEX.$lang && return
|
||||
# No match, fall-thru to non-i18n sources
|
||||
fi
|
||||
awk -v keyword="$keyword" "$f_index_file_awk" \
|
||||
$BSDCFG_LIBE${BSDCFG_LIBE:+/}*/INDEX
|
||||
$BSDCFG_LIBE${BSDCFG_LIBE:+/}*/INDEX && return
|
||||
|
||||
# No match? Fall-thru to `local' libexec sources (add-on modules)
|
||||
|
||||
[ "$BSDCFG_LOCAL_LIBE" ] || return $FAILURE
|
||||
if [ "$lang" ]; then
|
||||
awk -v keyword="$keyword" "$f_index_file_awk" \
|
||||
$BSDCFG_LOCAL_LIBE/*/INDEX.$lang && return
|
||||
# No match, fall-thru to non-i18n sources
|
||||
fi
|
||||
awk -v keyword="$keyword" "$f_index_file_awk" \
|
||||
$BSDCFG_LOCAL_LIBE/*/INDEX
|
||||
}
|
||||
|
||||
# f_index_menusel_keyword $indexfile $pgm
|
||||
|
Loading…
x
Reference in New Issue
Block a user