Commit first portion of package module -- this includes the ability to view

categories, view packages, mark packages for installation, de-installation,
or re-installation, calculate and track dependencies, as well as ability to
review selections.

Still to come is the actual processing of selections (performing the
various actions associated with the user's selections, such as installing
dependencies first, then selections, etc.).
This commit is contained in:
Devin Teske 2013-05-07 05:40:20 +00:00
parent 7f6380ef8d
commit 87c1627502
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=250323
17 changed files with 1601 additions and 1 deletions

View File

@ -8,6 +8,7 @@ SUBDIR= console \
include \
mouse \
networking \
packages \
password \
security \
share \

View File

@ -30,17 +30,34 @@ field_username="Username:"
hline_alnum_arrows_punc_tab_enter="Use alnum, arrows, punctuation, TAB or ENTER"
hline_alnum_punc_tab_enter="Use alpha-numeric, punctuation, TAB or ENTER"
hline_arrows_tab_enter="Press arrows, TAB or ENTER"
hline_arrows_tab_punc_enter="Use arrows, TAB, punctuation, ENTER"
hline_choose_help_for_more_information_on_media_types="Choose Help for more information on the various media types"
msg_accept_continue="Accept/Continue"
msg_accessibility_desc="Ports to help disabled users."
msg_afterstep_desc="Ports to support the AfterStep window manager."
msg_all="All"
msg_all_available_packages_in_all_categories="All available packages in all categories."
msg_all_desc="All available packages in all categories."
msg_always_try_sudo_when_run_as="Always try sudo(8) when run as %s"
msg_arabic_desc="Ported software for Arab countries."
msg_archivers_desc="Utilities for archiving and unarchiving data."
msg_argentina="Argentina"
msg_assume_network_is_already_configured="Running multi-user, assume that the network is already configured?"
msg_assume_yes_to_all_non_critical_dialogs="Assume \"Yes\" answers to all non-critical dialogs"
msg_astro_desc="Applications related to astronomy."
msg_attempt_automatic_dhcp_configuration="Attempt automatic DHCP configuration of interfaces"
msg_attempt_ipv6_configuration_of_interfaces="Attempt IPv6 configuration of interfaces"
msg_attempting_to_fetch_file_from_selected_media="Attempting to fetch %s file from selected media."
msg_audio_desc="Audio utilities - most require a supported sound card."
msg_australia="Australia"
msg_austria="Austria"
msg_back="Back"
msg_becoming_root_via_sudo="Becoming root via sudo(8)..."
msg_benchmarks_desc="Utilities for measuring system performance."
msg_biology_desc="Software related to biology."
msg_brazil="Brazil"
msg_building_package_menus="Building package menu(s)..."
msg_cad_desc="Computer Aided Design utilities."
msg_canada="Canada"
msg_cancel="Cancel"
msg_cancel_exit="Cancel/Exit"
@ -52,6 +69,7 @@ msg_cd_dvd="CD/DVD"
msg_cdrom="CDROM"
msg_checking_access_to="Checking access to\n %s"
msg_china="China"
msg_chinese_desc="Ported software for the Chinese market."
msg_choose_a_cd_dvd_type="Choose a CD/DVD type"
msg_choose_a_dos_partition="Choose a DOS partition"
msg_choose_a_floppy_drive="Choose a Floppy drive"
@ -61,7 +79,9 @@ msg_choose_installation_media="Choose Installation Media"
msg_choose_installation_media_description="FreeBSD can be installed from a variety of different installation\nmedia, ranging from floppies to an Internet FTP server. If you're\ninstalling FreeBSD from a supported CD/DVD drive then this is generally\nthe best media to use if you have no overriding reason for using other\nmedia."
msg_client_error="Client error, you could try an other server"
msg_command_failed_rest_of_script_aborted="Command \`%s' failed - rest of script aborted."
msg_comms_desc="Communications utilities."
msg_configuration_for_interface="Configuration for Interface"
msg_converters_desc="Format conversion utilities."
msg_could_not_unmount_the_cdrom_dvd="Could not unmount the CDROM/DVD from %s: %s"
msg_could_not_unmount_the_dos_partition="Could not unmount the DOS partition from %s: %s"
msg_could_not_unmount_the_nfs_partition="Could not unmount the NFS partition from %s: %s"
@ -72,17 +92,27 @@ msg_couldnt_open_ftp_connection="Couldn't open FTP connection to %s:\n %s."
msg_created_path="Created %s"
msg_croatia="Croatia"
msg_czech_republic="Czech Republic"
msg_databases_desc="Database software."
msg_debugging="Debugging"
msg_denmark="Denmark"
msg_deskutils_desc="Various Desktop utilities."
msg_devel_desc="Software development utilities and libraries."
msg_device_is_not_configured="The %s device is not configured. You will need to do so\nin the Networking configuration menu before proceeding."
msg_dhcp="DHCP"
msg_dialog_mixedform_navigation_help="Use <up>/<down> arrows to navigate between fields, TAB to focus buttons, and Enter for OK/Cancel."
msg_directory="Directory"
msg_directory_not_found="%s: Directory not found."
msg_directory_where_package_temporary_files_go="The directory where package temporary files should go"
msg_dns_desc="Domain Name Service tools."
msg_docs_desc="Meta-ports for FreeBSD documentation."
msg_done="Done"
msg_dos="DOS"
msg_editor="Editor"
msg_editors_desc="Editors."
msg_elisp_desc="Things related to Emacs Lisp."
msg_emit_extra_debugging_output="Emit extra debugging output"
msg_emulators_desc="Utilities for emulating other operating systems."
msg_enlightenment_desc="Software for the Enlightenment Desktop Environment."
msg_enter_a_fully_qualified_pathname_for_the_directory="Enter a fully qualified pathname for the directory\ncontaining the FreeBSD distribution files:"
msg_enter_the_device_name_of_a_ufs_formatted_partition="Enter the device-name of a UFS formatted partition"
msg_error="Error"
@ -96,19 +126,32 @@ msg_exit_bsdconfig="Exit bsdconfig"
msg_extra_options_to_ifconfig="Extra options to ifconfig (usually empty):"
msg_failed_to_add_default_route="Failed to add a default route; please check your network configuration"
msg_file_system="File System"
msg_finance_desc="Monetary, financial and related applications."
msg_finland="Finland"
msg_floppy="Floppy"
msg_france="France"
msg_french_desc="Ported software for French countries."
msg_ftp="FTP"
msg_ftp_desc="FTP client and server utilities."
msg_ftp_passive="FTP Passive"
msg_ftp_username="FTP username"
msg_games_desc="Various games and sundry amusements."
msg_geography_desc="Geography-related software."
msg_german_desc="Ported software for Germanic countries."
msg_germany="Germany"
msg_gnome_desc="Components of the Gnome Desktop environment."
msg_gnustep_desc="Software for GNUstep desktop environment."
msg_graphics_desc="Graphics libraries and utilities."
msg_greece="Greece"
msg_hamradio_desc="Software for amateur radio."
msg_haskell_desc="Software related to the Haskell language."
msg_hebrew_desc="Ported software for Hebrew language."
msg_help="Help"
msg_host_name_including_domain="Host name (including domain)"
msg_hostname_variable_not_set="WARNING: hostname variable not set and is a non-optional\nparameter. Please add this to your installation script\nor set the netInteractive variable (see bsdconfig man page)"
msg_http="HTTP"
msg_http_proxy="HTTP Proxy"
msg_hungarian_desc="Ported software for the Hungarian market."
msg_hungary="Hungary"
msg_iceland="Iceland"
msg_install_from_a_dos_partition="Install from a DOS partition"
@ -121,39 +164,64 @@ msg_install_from_an_ftp_server_thru_firewall="Install from an FTP server through
msg_install_from_an_ftp_server_thru_proxy="Install from an FTP server through an HTTP proxy"
msg_install_from_the_existing_filesystem="Install from the existing filesystem"
msg_install_over_nfs="Install over NFS"
msg_installed="Installed"
msg_installed_desc="Leave package as-is, installed"
msg_invalid_gateway_ipv4_address_specified="Invalid gateway IPv4 address specified"
msg_invalid_hostname_value="Invalid hostname value"
msg_invalid_ipv4_address="Invalid IPv4 address"
msg_invalid_name_server_ip_address_specified="Invalid name server IP address specified"
msg_invalid_netmask_value="Invalid netmask value"
msg_invalid_nfs_path_specification="Invalid NFS path specification. Must be of the form:\nhost:/full/pathname/to/FreeBSD/distdir"
msg_io_or_format_error_on_index_file="I/O or format error on %s file.\nPlease verify media (or path to media) and try again."
msg_ipv4_address="IPv4 Address"
msg_ipv4_gateway="IPv4 Gateway"
msg_ipv6="IPv6"
msg_ipv6_desc="IPv6-related software."
msg_ipv6_ready="IPv6 ready"
msg_irc_desc="Internet Relay Chat utilities."
msg_ireland="Ireland"
msg_israel="Israel"
msg_italy="Italy"
msg_japan="Japan"
msg_japanese_desc="Ported software for the Japanese market."
msg_java_desc="Java language support."
msg_kde_desc="Software for the K Desktop Environment."
msg_kld_desc="Kernel loadable modules."
msg_korea="Korea"
msg_korean_desc="Ported software for the Korean market."
msg_lang_desc="Computer languages."
msg_length_of_specified_url_is_too_long="Length of specified URL is %u characters. Allowable maximum is %u."
msg_linux_desc="Linux programs that can run under binary compatibility."
msg_lisp_desc="Software related to the Lisp language."
msg_lithuania="Lithuania"
msg_located_index_now_reading_package_data_from_it="Located INDEX, now reading package data from it..."
msg_logging_in_to_user_at_host="Logging in to %s@%s.."
msg_looking_up_host="Looking up host %s"
msg_mail_desc="Electronic mail packages and utilities."
msg_main_menu="Main Menu"
msg_main_site="Main Site"
msg_math_desc="Mathematical computation software."
msg_mbone_desc="Applications and utilities for the MBONE."
msg_media_timeout="Media Timeout"
msg_media_type="Media Type"
msg_menu_text="If you've already installed FreeBSD, you may use\nthis menu to customize it somewhat to suit your\nparticular configuration. Most importantly, you\ncan use the Packages utility to load extra '3rd\nparty' software not provided in the base\ndistributions."
msg_misc_desc="Miscellaneous utilities."
msg_missing_ftp_host_or_directory="Missing FTP host or directory specification. FTP media not initialized."
msg_multimedia_desc="Multimedia software."
msg_must_be_root_to_execute="%s: must be root to execute"
msg_must_specify_a_host_name_of_some_sort="Must specify a host name of some sort!"
msg_name_server="Name server"
msg_net_desc="Networking utilities."
msg_net_device_init_failed="Net device init failed."
msg_net_im_desc="Instant messaging software."
msg_net_mgmt_desc="Network management tools."
msg_net_p2p_desc="Peer to peer network applications."
msg_netherlands="Netherlands"
msg_netmask="Netmask"
msg_network_configuration="Network Configuration"
msg_network_interface_information_required="Network interface information required"
msg_news_desc="USENET News support software."
msg_next_page="Next page"
msg_nfailed_attempts="%u incorrect password attempts"
msg_nfs="NFS"
msg_nfs_secure="NFS Secure"
@ -163,10 +231,12 @@ msg_nfs_tcp="NFS TCP"
msg_nfs_version_3="NFS version 3"
msg_no="No"
msg_no_cd_dvd_devices_found="No CD/DVD devices found! Please check that your system's\nconfiguration is correct and that the CD/DVD drive is of a\nsupported type. For more information, consult the hardware\nguide in the Doc menu."
msg_no_description_provided="No description provided"
msg_no_dos_primary_partitions_found="No DOS primary partitions found! This installation method is unavailable"
msg_no_floppy_devices_found="No floppy devices found! Please check that your system's configuration\nis correct. For more information, consult the hardware guide in the Doc\nmenu."
msg_no_gateway_has_been_set="No gateway has been set. You will be unable to access hosts\nnot on your local network"
msg_no_network_devices="No network devices available!"
msg_no_packages_were_selected_for_extraction="No packages were selected for extraction."
msg_no_such_file_or_directory="%s: %s: No such file or directory"
msg_no_usb_devices_found="No USB devices found (try Options/Re-scan Devices)"
msg_no_username="No username provided!"
@ -178,7 +248,14 @@ msg_ok="OK"
msg_options="Options"
msg_options_editor="Options Editor"
msg_other="other"
msg_package_temp="Package Temp"
msg_page_of_npages="(Page %s of %s)"
msg_palm_desc="Software support for the Palm(tm) series."
msg_parallel_desc="Applications dealing with parallelism in computing."
msg_pear_desc="Software related to the Pear PHP framework."
msg_perl5_desc="Utilities/modules for the PERL5 language."
msg_permission_denied="%s: %s: Permission denied"
msg_plan9_desc="Software from the Plan9 operating system."
msg_please_check_the_url_and_try_again="No such directory: %s\nplease check the URL and try again."
msg_please_enter_password="Please enter your password for sudo(8):"
msg_please_enter_the_address_of_the_http_proxy="Please enter the address of the HTTP proxy in this format:\n hostname:port (the ':port' is optional, default is 3128)"
@ -188,6 +265,7 @@ msg_please_enter_the_username_you_wish_to_login_as="Please enter the username yo
msg_please_enter_username_password="Please enter a username and password for sudo(8):"
msg_please_insert_floppy_containing="Please insert floppy containing %s in %s"
msg_please_insert_floppy_in_drive="Please insert floppy in %s"
msg_please_select_a_category_to_display="Please select a category to display."
msg_please_select_a_cd_dvd_drive="FreeBSD can be installed directly from a CD/DVD containing a valid\nFreeBSD distribution. If you are seeing this menu it is because\nmore than one CD/DVD drive was found on your system. Please select\none of the following CD/DVD drives as your installation drive."
msg_please_select_a_floppy_drive="You have more than one floppy drive. Please choose which drive\nyou would like to use."
msg_please_select_a_freebsd_ftp_distribution_site="Please select a FreeBSD FTP distribution site"
@ -196,30 +274,53 @@ msg_please_select_dos_partition="FreeBSD can be installed directly from a DOS pa
msg_please_select_ethernet_device_to_configure="Please select the ethernet or PLIP device to configure."
msg_please_select_the_site_closest_to_you_or_other="Please select the site closest to you or \"other\" if you'd like to\nspecify a different choice. Also note that not every site listed here\ncarries more than the base distribution kits. Only Primary sites are\nguaranteed to carry the full range of possible distributions."
msg_please_select_ufs_partition="FreeBSD can be installed directly from another FreeBSD partition\nthat is UFS formatted assuming, of course, that you have copied\nthe relevant distributions into said partition before starting\ninstallation."
msg_please_specify_a_temporary_directory="Please specify a temporary directory with lots of free space:"
msg_please_specify_the_name_of_the_text_editor="Please specify the name of the text editor you wish to use:"
msg_please_specify_the_number_of_seconds_to_wait="Please specify the number of seconds to wait for slow media:"
msg_please_specify_the_release_you_wish_to_load="Please specify the release you wish to load or\n\"any\" for a generic release install:"
msg_please_specify_url_of_a_freebsd_distribution="Please specify the URL of a FreeBSD distribution on a\nremote ftp site. This site must accept either anonymous\nftp or you should have set an ftp username and password\nin the Options screen.\n\nA URL looks like this: ftp://<hostname>/<path>\nWhere <path> is relative to the anonymous ftp directory or the\nhome directory of the user being logged in as."
msg_poland="Poland"
msg_polish_desc="Ported software for the Polish market."
msg_ports_mgmt_desc="Utilities for managing ports and packages."
msg_portugal="Portugal"
msg_portuguese_desc="Ported software for the Portuguese market."
msg_previous_page="Previous page"
msg_previous_syntax_errors="%s: Not overwriting \`%s' due to previous syntax errors"
msg_primary="Primary"
msg_print_desc="Utilities for dealing with printing."
msg_probing_devices_please_wait_this_can_take_a_while="Probing devices, please wait (this can take a while)..."
msg_proceed="Proceed"
msg_processing_selection="Processing selection..."
msg_python_desc="Software related to the Python language."
msg_quick_start_how_to_use_this_menu_system="Quick start - How to use this menu system"
msg_reinstall="Reinstall"
msg_reinstall_desc="Mark this package for reinstall"
msg_release_name="Release Name"
msg_rerun_bsdconfig_initial_device_probe="Re-run bsdconfig initial device probe"
msg_rescan_devices="Re-scan Devices"
msg_reset="RESET!"
msg_reset_all_values_to_startup_defaults="Reset all values to startup defaults"
msg_reuse_old_ftp_site_selection_values="Re-use old FTP site selection values?"
msg_review="Review"
msg_review_desc="Review/perform pending actions"
msg_review_help="Install, Re-Install, or Un-install selected packages and dependencies"
msg_reviewing_selected_packages="Reviewing %u selected packages:"
msg_romania="Romania"
msg_ruby_desc="Software related to the Ruby language."
msg_rubygems_desc="Ports of RubyGems packages."
msg_russia="Russia"
msg_russian_desc="Ported software for the Russian market."
msg_scanning_for_dhcp_servers="Scanning for DHCP servers..."
msg_scanning_for_ra_servers="Scanning for RA servers..."
msg_scheme_desc="Software related to the Scheme language."
msg_science_desc="Scientific software."
msg_secure_mode_requires_root="Secure-mode requires root-access!"
msg_secure_mode_requires_x11="Secure-mode requires X11 (use \`-X')!"
msg_security_desc="System security software."
msg_select="Select"
msg_select_a_site_thats_close="Select a site that's close!"
msg_server_error_when_requesting_url="Server error when requesting %s, you could try an other server"
msg_shells_desc="Various shells (tcsh, bash, etc)."
msg_singapore="Singapore"
msg_slovak_republic="Slovak Republic"
msg_slovenia="Slovenia"
@ -229,12 +330,17 @@ msg_sorry_invalid_url="Sorry, %s is an invalid URL!"
msg_sorry_try_again="Sorry, try again."
msg_south_africa="South Africa"
msg_spain="Spain"
msg_spanish_desc="Ported software for the Spanish market."
msg_specify_some_other_ftp_site="Specify some other ftp site by URL"
msg_sweden="Sweden"
msg_switzerland="Switzerland"
msg_sysutils_desc="Various system utilities."
msg_taiwan="Taiwan"
msg_tcl_desc="TCL and packages that depend on it."
msg_textproc_desc="Text processing/search utilities."
msg_the_current_installation_media_type="The current installation media type."
msg_timeout_value_in_seconds_for_slow_media="Timeout value in seconds for slow media."
msg_tk_desc="Tk and packages that depend on it."
msg_try_dhcp_configuration="Do you want to try DHCP configuration of the interface?"
msg_try_ipv6_configuration="Do you want to try IPv6 configuration of the interface?"
msg_try_sudo_only_this_once="Try sudo(8) only this once"
@ -242,10 +348,14 @@ msg_turkey="Turkey"
msg_ufs="UFS"
msg_uk="UK"
msg_ukraine="Ukraine"
msg_ukrainian_desc="Ported software for the Ukrainian market."
msg_unable_to_configure_device="Unable to configure the %s interface!\nThis installation method cannot be used."
msg_unable_to_get_file_from_selected_media="Unable to get %s file from selected media.\n\nThis may be because the packages collection is not available\non the distribution media you've chosen, most likely an FTP site\nwithout the packages collection mirrored. Please verify that\nyour media, or your path to the media, is correct and try again."
msg_unable_to_get_proper_ftp_path="Unable to get proper FTP path. FTP media not initialized."
msg_unable_to_make_directory_mountpoint="Unable to make %s directory mountpoint for %s!"
msg_unable_to_open="Unable to open %s"
msg_uninstall="Uninstall"
msg_uninstall_desc="Mark this package for deletion"
msg_unknown="unknown"
msg_unknown_user="Unknown user: %s"
msg_url_was_not_found="%s was not found, maybe directory or release-version are wrong?"
@ -260,14 +370,30 @@ msg_user_is_using_a_slow_pc_or_ethernet_card="User is using a slow PC or Etherne
msg_username_and_password_to_use="Username and password to use instead of anonymous"
msg_using_interface="Using interface %s"
msg_using_usb_device="Using USB device: %s"
msg_vietnamese_desc="Ported software for the Vietnamese market."
msg_view_set_various_media_options="View/Set various media options"
msg_what_would_you_like_to_do_with="What would you like to do with %s?"
msg_which_release_to_attempt_to_load="Which release to attempt to load from installation media"
msg_which_text_editor_to_use="Which text editor to use during installation"
msg_windowmaker_desc="Ports to support the WindowMaker window manager."
msg_would_you_like_to_bring_interface_up="Would you like to bring the %s interface up right now?"
msg_www_desc="Web utilities (browsers, HTTP servers, etc)."
msg_x11_clocks_desc="X Window System based clocks."
msg_x11_desc="X Window System based utilities."
msg_x11_drivers_desc="X Window System drivers."
msg_x11_fm_desc="X Window System based file managers."
msg_x11_fonts_desc="X Window System fonts and font utilties."
msg_x11_servers_desc="X Window System servers."
msg_x11_themes_desc="X Window System themes."
msg_x11_toolkits_desc="X Window System based development toolkits."
msg_x11_wm_desc="X Window System window managers."
msg_xfce_desc="Software related to the Xfce Desktop Environment."
msg_yes="Yes"
msg_yes_to_all="Yes to All"
msg_you_are_not_root_but="You are not root but %s can use sudo(8).\nWhat would you like to do?"
msg_you_may_remove_the_floppy="You may remove the floppy from %s"
msg_youve_already_done_the_network_configuration="You've already done the network configuration once,\nwould you like to skip over it now?"
msg_zope_desc="Software related to the Zope platform."
tcplayout_extras_help="Any interface-specific options to ifconfig you would like to add"
tcplayout_extras_help_for_plip="For PLIP configuration, you must enter the peer's IP address here."
tcplayout_gateway_help="IPv4 address of host forwarding packets to non-local destinations"

View File

@ -40,6 +40,15 @@ Debugging: Turn on the extra debugging flag
to the developers in tracking such problems down!
Yes To All: Assume "Yes" answers to all non-critical dialogs
This flag should be used with caution. It will essentially
decide NOT to ask the user about any "boundary" conditions that
might not constitute actual errors but may be warnings indicative
of other problems. It's most useful to those who are doing unattended
installs.
DHCP: Enable DHCP configuration of interfaces
This option specifies whether DHCP configuration of interfaces
@ -88,6 +97,14 @@ Media Type: Which media type is being used.
to the media menu itself.
Package Temp: Where package temporary files should go
Some packages, like emacs, can use a LOT of temporary space - up to
20 or 30MB. If you are going to configure a small / directory and no
separate /var (and hence a small /var/tmp), then you may wish to set
this to point at another location (say, /usr/tmp).
Re-scan Devices:
Reprobe the system for devices.

View File

@ -0,0 +1,52 @@
# Copyright (c) 2013 Devin Teske
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
#
# Title that will be shown on the bsdconfig menu
menu_title="Packages"
#
# a short descriptive line shown at the bottom of the bsdconfig menu.
# keep it short because any line longer than the terminal width will
# be truncated.
menu_help="Install pre-packaged software for FreeBSD"
#
# two-part variable that defines an action to take when 'keyword'
# is passed on a bsdconfig command line. variable takes the form
# "keyword|command" and multiple occurrences of the variable
# (with different 'keyword's, or different 'keyword's AND 'command's)
# are allowed. If 'command' begins with a '/' then the full
# path to the program is needed. If 'command' begins with anything
# else it is a path relative to the directory this INDEX file is in.
# 'keyword' can be i18n'ed but 'command' is the name of a script.
menu_selection="packages|packages"
#
# Items below this line do NOT need i18n translation----------------------
#
# Name of the program to be run when this menu choice is selected.
# if it begins with a '/' then the full path to the program is needed.
# if it begins with anything else it is a path relative to the directory
# this INDEX file is in.
menu_program="packages"

View File

@ -0,0 +1,16 @@
# $FreeBSD$
NO_OBJ=
SUBDIR= include
FILESDIR= ${LIBEXECDIR}/bsdconfig/030.packages
FILES= INDEX USAGE
SCRIPTSDIR= ${FILESDIR}
SCRIPTS= packages
beforeinstall:
mkdir -p ${DESTDIR}${FILESDIR}
.include <bsd.prog.mk>

View File

@ -0,0 +1,37 @@
# Copyright (c) 2013 Devin Teske
# All Rights Reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
Usage: bsdconfig @PROGRAM_NAME@ [OPTIONS]
OPTIONS:
-d Provide lots of debugging info on standard-out when running.
-D file Send debugging info to file. If file begins with a plus-sign
debug info is sent to both standard-out and file (minus the
leading plus).
-h Print this usage statement and exit.
-S Secure X11 mode (implies `-X'). As root, always prompt-for
and validate sudo(8) username/password before starting.
-X Use Xdialog(1) in place of dialog(1).

View File

@ -0,0 +1,11 @@
# $FreeBSD$
NO_OBJ=
FILESDIR= ${LIBEXECDIR}/bsdconfig/030.packages/include
FILES= messages.subr
beforeinstall:
mkdir -p ${DESTDIR}${FILESDIR}
.include <bsd.prog.mk>

View File

@ -0,0 +1,27 @@
# Copyright (c) 2013 Devin Teske
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
msg_package_selection="Package Selection"

View File

@ -0,0 +1,76 @@
#!/bin/sh
#-
# Copyright (c) 2013 Devin Teske
# All Rights Reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
#
############################################################ INCLUDES
# Prevent device.subr (included indirectly via media/*.subr below) from auto
# scanning; we'll perform this manually using f_device_get_all() during init
# but only after we've successfully completed f_mustberoot_init().
#
DEVICE_SELF_SCAN_ALL=NO
BSDCFG_SHARE="/usr/share/bsdconfig"
. $BSDCFG_SHARE/common.subr || exit 1
f_dprintf "%s: loading includes..." "$0"
f_include $BSDCFG_SHARE/dialog.subr
f_include $BSDCFG_SHARE/mustberoot.subr
f_include $BSDCFG_SHARE/packages/packages.subr
BSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="030.packages"
f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
ipgm=$( f_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" )
[ $? -eq $SUCCESS -a "$ipgm" ] && pgm="$ipgm"
############################################################ MAIN
# Incorporate rc-file if it exists
[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
#
# Process command-line arguments
#
while getopts dD:hSX flag; do
case "$flag" in
h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm";;
esac
done
shift $(( $OPTIND - 1 ))
#
# Initialize
#
f_dialog_title "$msg_package_selection"
f_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
f_mustberoot_init
f_device_get_all
#
# Display the package configuration menu and exit
#
f_package_config

View File

@ -2,7 +2,7 @@
NO_OBJ=
SUBDIR= media
SUBDIR= media packages
FILESDIR= ${SHAREDIR}/bsdconfig
FILES= common.subr device.subr dialog.subr mustberoot.subr \

View File

@ -111,6 +111,15 @@ f_media_options_menu()
'$msg_emit_extra_debugging_output'"
fi
f_getvar $VAR_NO_CONFIRM cp
if [ "$cp" ]; then menu_list="$menu_list
' $msg_yes_to_all' 'YES'
'$msg_assume_yes_to_all_non_critical_dialogs'"
else menu_list="$menu_list
' $msg_yes_to_all' 'NO'
'$msg_assume_yes_to_all_non_critical_dialogs'"
fi
f_getvar $VAR_TRY_DHCP cp
if [ "$cp" = "YES" ]; then menu_list="$menu_list
' $msg_dhcp' 'YES'
@ -179,6 +188,11 @@ f_media_options_menu()
' $msg_media_timeout' '$cp'
'$msg_timeout_value_in_seconds_for_slow_media'"
f_getvar $VAR_PKG_TMPDIR cp
menu_list="$menu_list
' $msg_package_temp' '$cp'
'$msg_directory_where_package_temporary_files_go'"
menu_list="$menu_list
' $msg_rescan_devices' '<*>'
'$msg_rerun_bsdconfig_initial_device_probe'
@ -260,6 +274,12 @@ f_media_options_menu()
else
export $VAR_DEBUG=1
fi ;;
" $msg_yes_to_all")
if f_getvar $VAR_NO_CONFIRM cp && [ "$cp" ]; then
unset $VAR_NO_CONFIRM
else
export $VAR_NO_CONFIRM=1
fi ;;
" $msg_dhcp")
f_getvar $VAR_TRY_DHCP cp
if [ "$cp" = "YES" ]; then
@ -290,6 +310,10 @@ f_media_options_menu()
f_variable_get_value $VAR_MEDIA_TIMEOUT \
"$msg_please_specify_the_number_of_seconds_to_wait"
;;
" $msg_package_temp")
f_variable_get_value $VAR_PKG_TMPDIR \
"$msg_please_specify_a_temporary_directory"
;;
" $msg_rescan_devices")
f_device_rescan ;;
" $msg_use_defaults")

View File

@ -0,0 +1,11 @@
# $FreeBSD$
NO_OBJ=
FILESDIR= ${SHAREDIR}/bsdconfig/packages
FILES= categories.subr index.subr packages.subr
beforeinstall:
mkdir -p ${DESTDIR}${FILESDIR}
.include <bsd.prog.mk>

View File

@ -0,0 +1,203 @@
if [ ! "$_PACKAGES_CATEGORIES_SUBR" ]; then _PACKAGES_CATEGORIES_SUBR=1
#
# Copyright (c) 2013 Devin Teske
# All Rights Reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
#
############################################################ INCLUDES
BSDCFG_SHARE="/usr/share/bsdconfig"
. $BSDCFG_SHARE/common.subr || exit 1
f_dprintf "%s: loading includes..." packages/categories.subr
f_include $BSDCFG_SHARE/strings.subr
BSDCFG_LIBE="/usr/libexec/bsdconfig"
f_include_lang $BSDCFG_LIBE/include/messages.subr
############################################################ GLOBALS
CATEGORIES=
############################################################ FUNCTIONS
# f_category_desc_get $category [$var_to_set]
#
# Fetch the description of a given category. Returns success if a match was
# found, otherwise failure.
#
# If $var_to_set is missing or NULL, the category description is printed to
# standard out for capturing in a sub-shell (which is less-recommended because
# of performance degredation; for example, when called in a loop).
#
f_category_desc_get()
{
local __category="$1" __var_to_set="$2" __cat __varcat
# Return failure if $category
[ "$__category" ] || return $FAILURE
for __cat in $CATEGORIES; do
[ "$__cat" = "$__category" ] || continue
f_str2varname $__cat __varcat
f_getvar _category_$__varcat $__var_to_set
return $?
done
return $FAILURE
}
# f_category_desc_set $category $desc
#
# Store a description in-association with a category. $category should be
# alphanumeric and can include the underscore [_] but should not contain
# whitespace. Returns success unless $category is NULL or no arguments. Use the
# f_category_desc_get() routine with the same $category to retrieve the stored
# description.
#
f_category_desc_set()
{
local category="$1" desc="$2"
local cat varcat found=
[ "$category" ] || return $FAILURE
for cat in $CATEGORIES; do
[ "$cat" = "$category" ] || continue
f_str2varname $cat varcat
f_quietly f_getvar _category_$varcat || continue
found=1 && break
done
if [ ! "$found" ]; then
CATEGORIES="$CATEGORIES $category"
fi
f_str2varname $category varcat
setvar "_category_$varcat" "$desc"
# Export the variable for awk(1) ENVIRON visibility
export "_category_$varcat"
return $SUCCESS
}
############################################################ MAIN
#
# Load descriptions for package categories
#
f_category() { f_category_desc_set "$1" "$2"; }
f_category All "$msg_all_available_packages_in_all_categories"
f_category accessibility "$msg_accessibility_desc"
f_category afterstep "$msg_afterstep_desc"
f_category arabic "$msg_arabic_desc"
f_category archivers "$msg_archivers_desc"
f_category astro "$msg_astro_desc"
f_category audio "$msg_audio_desc"
f_category benchmarks "$msg_benchmarks_desc"
f_category biology "$msg_biology_desc"
f_category cad "$msg_cad_desc"
f_category chinese "$msg_chinese_desc"
f_category comms "$msg_comms_desc"
f_category converters "$msg_converters_desc"
f_category databases "$msg_databases_desc"
f_category deskutils "$msg_deskutils_desc"
f_category devel "$msg_devel_desc"
f_category dns "$msg_dns_desc"
f_category docs "$msg_docs_desc"
f_category editors "$msg_editors_desc"
f_category elisp "$msg_elisp_desc"
f_category emulators "$msg_emulators_desc"
f_category enlightenment "$msg_enlightenment_desc"
f_category finance "$msg_finance_desc"
f_category french "$msg_french_desc"
f_category ftp "$msg_ftp_desc"
f_category games "$msg_games_desc"
f_category geography "$msg_geography_desc"
f_category german "$msg_german_desc"
f_category gnome "$msg_gnome_desc"
f_category gnustep "$msg_gnustep_desc"
f_category graphics "$msg_graphics_desc"
f_category hamradio "$msg_hamradio_desc"
f_category haskell "$msg_haskell_desc"
f_category hebrew "$msg_hebrew_desc"
f_category hungarian "$msg_hungarian_desc"
f_category ipv6 "$msg_ipv6_desc"
f_category irc "$msg_irc_desc"
f_category japanese "$msg_japanese_desc"
f_category java "$msg_java_desc"
f_category kde "$msg_kde_desc"
f_category kld "$msg_kld_desc"
f_category korean "$msg_korean_desc"
f_category lang "$msg_lang_desc"
f_category linux "$msg_linux_desc"
f_category lisp "$msg_lisp_desc"
f_category mail "$msg_mail_desc"
f_category math "$msg_math_desc"
f_category mbone "$msg_mbone_desc"
f_category misc "$msg_misc_desc"
f_category multimedia "$msg_multimedia_desc"
f_category net "$msg_net_desc"
f_category net-im "$msg_net_im_desc"
f_category net-mgmt "$msg_net_mgmt_desc"
f_category net-p2p "$msg_net_p2p_desc"
f_category news "$msg_news_desc"
f_category palm "$msg_palm_desc"
f_category parallel "$msg_parallel_desc"
f_category pear "$msg_pear_desc"
f_category perl5 "$msg_perl5_desc"
f_category plan9 "$msg_plan9_desc"
f_category polish "$msg_polish_desc"
f_category ports-mgmt "$msg_ports_mgmt_desc"
f_category portuguese "$msg_portuguese_desc"
f_category print "$msg_print_desc"
f_category python "$msg_python_desc"
f_category ruby "$msg_ruby_desc"
f_category rubygems "$msg_rubygems_desc"
f_category russian "$msg_russian_desc"
f_category scheme "$msg_scheme_desc"
f_category science "$msg_science_desc"
f_category security "$msg_security_desc"
f_category shells "$msg_shells_desc"
f_category spanish "$msg_spanish_desc"
f_category sysutils "$msg_sysutils_desc"
f_category tcl "$msg_tcl_desc"
f_category textproc "$msg_textproc_desc"
f_category tk "$msg_tk_desc"
f_category ukrainian "$msg_ukrainian_desc"
f_category vietnamese "$msg_vietnamese_desc"
f_category windowmaker "$msg_windowmaker_desc"
f_category www "$msg_www_desc"
f_category x11 "$msg_x11_desc"
f_category x11-clocks "$msg_x11_clocks_desc"
f_category x11-drivers "$msg_x11_drivers_desc"
f_category x11-fm "$msg_x11_fm_desc"
f_category x11-fonts "$msg_x11_fonts_desc"
f_category x11-servers "$msg_x11_servers_desc"
f_category x11-themes "$msg_x11_themes_desc"
f_category x11-toolkits "$msg_x11_toolkits_desc"
f_category x11-wm "$msg_x11_wm_desc"
f_category xfce "$msg_xfce_desc"
f_category zope "$msg_zope_desc"
f_dprintf "%s: Initialized %u package category descriptions." \
packages/categories.subr "$( set -- $CATEGORIES; echo $# )"
f_dprintf "%s: Successfully loaded." packages/categories.subr
fi # ! $_PACKAGES_CATEGORIES_SUBR

View File

@ -0,0 +1,244 @@
if [ ! "$_PACKAGES_INDEX_SUBR" ]; then _PACKAGES_INDEX_SUBR=1
#
# Copyright (c) 2013 Devin Teske
# All Rights Reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
#
############################################################ INCLUDES
BSDCFG_SHARE="/usr/share/bsdconfig"
. $BSDCFG_SHARE/common.subr || exit 1
f_dprintf "%s: loading includes..." packages/index.subr
f_include $BSDCFG_SHARE/device.subr
f_include $BSDCFG_SHARE/media/common.subr
f_include $BSDCFG_SHARE/strings.subr
BSDCFG_LIBE="/usr/libexec/bsdconfig"
f_include_lang $BSDCFG_LIBE/include/messages.subr
############################################################ GLOBALS
PACKAGE_INDEX=
_INDEX_INITTED=
############################################################ FUNCTIONS
# f_index_initialize $path [$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.
#
# 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}"
[ "$_INDEX_INITTED" ] && return $SUCCESS
[ "$__path" ] || return $FAILURE
# Got any media?
f_media_verify || return $FAILURE
# 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" | sort )'
if [ $? -ne $SUCCESS ]; then
f_show_msg "$msg_unable_to_get_file_from_selected_media" \
"$__path"
f_device_shutdown media
return $FAILURE
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"
return $FAILURE
fi
_INDEX_INITTED=1
return $SUCCESS
}
# f_index_read [$var_to_get]
#
# Process the INDEX file (contents contained in $var_to_get) and...
#
# 1. create a list ($CATEGORY_MENU_LIST) of categories with package counts
# 2. For convenience, create $_npkgs holding the total number of all packages
# 3. extract associative categories for each package into $_categories_$varpkg
# 4. extract runtime dependencies for each package into $_rundeps_$varpkg
# 5. extract a [sorted] list of categories into $PACKAGE_CATEGORIES
# 6. create $_npkgs_$varcat holding the total number of packages in category
#
# NOTE: $varpkg is the product of f_str2varname $package varpkg
# NOTE: $package is the name as it appears in the INDEX (no archive suffix)
# NOTE: We only show categories for which there are at least one package.
# NOTE: $varcat is the product of f_str2varname $category varcat
#
f_index_read()
{
local var_to_get="${1:-PACKAGE_INDEX}"
# Export variables required by awk(1) below
export msg_no_description_provided
export msg_all msg_all_desc
export VALID_VARNAME_CHARS
eval "$( debug= f_getvar "$var_to_get" | awk -F'|' '
function asorti(src, dest)
{
# Copy src indices to dest and calculate array length
nitems = 0; for (i in src) dest[++nitems] = i
# Sort the array of indices (dest) using insertion sort method
for (i = 1; i <= nitems; k = i++)
{
idx = dest[i]
while ((k > 0) && (dest[k] > idx))
{
dest[k+1] = dest[k]
k--
}
dest[k+1] = idx
}
return nitems
}
function print_category(category, npkgs, desc)
{
cat = category
# Accent the category if the first page has been
# cached (also acting as a visitation indicator)
if ( ENVIRON["_index_page_" varcat "_1"] )
cat = cat "*"
printf "'\''%s'\'' '\''%s packages'\'' '\''%s'\''\n",
cat, npkgs, desc
}
BEGIN {
valid_chars = ENVIRON["VALID_VARNAME_CHARS"]
default_desc = ENVIRON["msg_no_description_provided"]
npkgs = 0
prefix = ""
}
{
npkgs++
varpkg = $1
gsub("[^" valid_chars "]", "_", varpkg)
print "_categories_" varpkg "=\"" $7 "\""
split($7, pkg_categories, /[[:space:]]+/)
for (pkg_category in pkg_categories)
categories[pkg_categories[pkg_category]]++
print "_rundeps_" varpkg "=\"" $9 "\""
}
END {
print "_npkgs=" npkgs # For convenience, total package count
n = asorti(categories, categories_sorted)
# Produce package counts for each category
for (i = 1; i <= n; i++)
{
cat = varcat = categories_sorted[i]
npkgs = categories[cat]
gsub("[^" valid_chars "]", "_", varcat)
print "_npkgs_" varcat "=\"" npkgs "\""
}
# Create menu list and generate list of categories at same time
print "CATEGORY_MENU_LIST=\""
print_category(ENVIRON["msg_all"], npkgs,
ENVIRON["msg_all_desc"])
category_list = ""
for (i = 1; i <= n; i++)
{
cat = varcat = categories_sorted[i]
npkgs = categories[cat]
cur_prefix = tolower(substr(cat, 1, 1))
if ( prefix != cur_prefix )
prefix = cur_prefix
else
cat = " " cat
gsub("[^" valid_chars "]", "_", varcat)
desc = ENVIRON["_category_" varcat]
if ( ! desc ) desc = default_desc
print_category(cat, npkgs, desc)
category_list = category_list " " cat
}
print "\""
# Produce the list of categories (calculated in above block)
sub(/^ /, "", category_list)
print "PACKAGE_CATEGORIES=\"" category_list "\""
}' )" # End-Quote
}
# f_index_extract_pages $var_to_get $var_basename $pagesize [$category]
#
# Extracts the package INDEX into a series of sequential variables
# corresponding to "pages" containing up to $pagesize packages. The package
# INDEX data must be contained in the variable $var_to_get. The extracted pages
# are stored in variables ${var_basename}_# -- where "#" is a the page number.
# If $category is set, only packages for that category are extracted.
# Otherwise, if $category is "All", missing, or NULL, all packages are
# extracted and no filtering is done.
#
f_index_extract_pages()
{
local var_to_get="$1" var_basename="$2" pagesize="$3"
local category="$4" # Optional
eval "$(
debug= f_getvar "$var_to_get" | awk -F'|' \
-v cat="$category" \
-v pagesize="$pagesize" \
-v var_basename="$var_basename" '
BEGIN { n = page = 0 }
/'\''/{ gsub(/'\''/, "'\''\\'\'\''") }
{
if ( cat !~ /(^$|^All$)/ && $7 !~ \
"(^|[[:space:]])" cat "([[:space:]]|$)" ) next
starting_new_page = (n++ == (pagesize * page))
if ( starting_new_page )
printf "%s%s", ( n > 1 ? "'\''\n" : "" ),
var_basename "_" ++page "='\''"
printf "%s%s", ( starting_new_page ? "" : "\n" ), $0
}
END { if ( n > 0 ) print "'\''" }'
)"
}
############################################################ MAIN
f_dprintf "%s: Successfully loaded." packages/index.subr
fi # ! $_PACKAGES_INDEX_SUBR

View File

@ -0,0 +1,746 @@
if [ ! "$_PACKAGES_PACKAGES_SUBR" ]; then _PACKAGES_PACKAGES_SUBR=1
#
# Copyright (c) 2013 Devin Teske
# All Rights Reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
#
############################################################ INCLUDES
BSDCFG_SHARE="/usr/share/bsdconfig"
. $BSDCFG_SHARE/common.subr || exit 1
f_dprintf "%s: loading includes..." "$0"
f_include $BSDCFG_SHARE/dialog.subr
f_include $BSDCFG_SHARE/strings.subr
f_include $BSDCFG_SHARE/packages/categories.subr
f_include $BSDCFG_SHARE/packages/index.subr
BSDCFG_LIBE="/usr/libexec/bsdconfig"
f_include_lang $BSDCFG_LIBE/include/messages.subr
############################################################ CONFIGURATION
#
# How many packages to display (maximum) per dialog menubox.
#
: ${PACKAGE_MENU_PAGESIZE:=2000}
############################################################ GLOBALS
PACKAGE_CATEGORIES=
SELECTED_PACKAGES=
#
# Options
#
[ "${SHOW_DESC+set}" ] || SHOW_DESC=1
############################################################ FUNCTIONS
# eval f_package_accent_category_menu $var_to_set $CATEGORY_MENU_LIST
#
# Accent the CATEGORY_MENU_LIST produced by f_index_read() (see
# packages/index.subr). Accented information includes adding an asterisk to the
# category name if its index has been cached, adding the number of installed
# packages for each category, and adding the number _selected_ packages for
# each category.
#
# NOTE: The reason `eval' is recommended/shown for the syntax above is because
# the $CATEGORY_MENU_LIST generated by f_index_read() is meant to be expanded
# prior to execution (it contains a series of pre-quoted strings which act as
# the interpolated command arguments).
#
f_package_accent_category_menu()
{
local var_to_set="$1" cat desc help varcat menu_buf n
shift 1 # var_to_set
while [ $# -gt 0 ]; do
cat="${1%\*}" desc="${2%%; *}" help="$3"
shift 3 # cat/desc/help
f_str2varname "${cat# }" varcat
# Add an asterisk to the category if its index has been cached
f_isset _index_page_${varcat}_1 && cat="$cat*"
# Add number of installed packages for this category (if any)
n=0
debug= f_getvar "_${varcat}_ninstalled" n &&
[ $n -ge 1 ] && desc="$desc; $n installed"
# Add number of selected packages for this category (if any)
n=0
debug= f_getvar "_${varcat}_nselected" n &&
[ $n -ge 1 ] && desc="$desc; $n selected"
# Update buffer with modified elements
menu_buf="$menu_buf
'$cat' '$desc' '$help'" # End-Quote
done
setvar "$var_to_set" "$menu_buf" # return our buffer
}
# f_package_select $package ...
#
# Add $package to the list of tracked/selected packages. If $package is already
# being tracked (already apears in $SELECTED_PACKAGES), this function amounts
# to having no effect.
#
f_package_select()
{
local package pkgsel
while [ $# -gt 0 ]; do
package="$1"
shift 1 # package
for pkgsel in $SELECTED_PACKAGES; do
[ "$package" = "$pkgsel" ] && return
done
SELECTED_PACKAGES="$SELECTED_PACKAGES $package"
done
SELECTED_PACKAGES="${SELECTED_PACKAGES# }" # Trim leading space
}
# f_package_deselect $package ...
#
# Remove $package from teh list of tracked/selected packages. If $package is
# not being tracked (doesn't appear in $SELECTED_PACKAGES), this function
# amounts to having no effet.
#
f_package_deselect()
{
local package pkgsel
while [ $# -gt 1 ]; do
local new_list=""
package="$1"
shift 1 # package
for pkgsel in $SELECTED_PACKAGES; do
[ "$pkgsel" = "$package" ] && continue
new_list="$new_list${new_list:+ }$pkgsel"
done
SELECTED_PACKAGES="$new_list"
done
}
# f_package_detect_installed
#
# Detect installed packages. Currently this searches /var/db/pkg for directory
# entries and marks each entry as an installed/selected package.
#
f_package_detect_installed()
{
local installed package varpkg
installed=$( find -s /var/db/pkg -mindepth 1 -maxdepth 1 -type d |
sed -e 's:/var/db/pkg/::' )
for package in $installed; do
f_str2varname $package varpkg
export _mark_$varpkg=X # exported for awk(1) ENVIRON[]
f_package_select $package
done
}
# f_package_calculate_totals
#
# Calculate number of installed/selected packages for each category listed in
# $PACKAGE_CATEGORIES (the number of installed packages for $category is stored
# as $_${varcat}_ninstalled -- where $varcat is the product of `f_str2varname
# $category varcat' -- and number selected packages as $_${varcat}_nselected).
# Also calculates the total number of installed/selected packages stored as
# $_All_ninstalled and $_All_nselected.
#
# Calculations are peformed by checking "marks". A "mark" is stored as
# $_mark_$varpkg -- where $varpkg is the product of `f_str2varname $package
# varpkg'. A mark can be "X" for an installed package, `I' for a package that
# is marked for installation, "R" for a package that is marked for re-install,
# and "U" for a package that is marked for uninstallation. If a package mark is
# NULL or a single space (e.g., " "), the package is considered to be NOT
# selected (and therefore does not increment the counts calculated herein).
#
f_package_calculate_totals()
{
local pkg varpkg mark cat varcat pkgcat n tselected=0 tinstalled=0
for cat in $PACKAGE_CATEGORIES; do
f_str2varname $cat varcat
setvar _${varcat}_ninstalled=0
setvar _${varcat}_nselected=0
done
for pkg in $SELECTED_PACKAGES; do
f_str2varname $pkg varpkg
mark=
f_getvar _mark_$varpkg mark
case "$mark" in
""|" ") : ;;
X) tinstalled=$(( $tinstalled + 1 ));;
*) tselected=$(( $tselected + 1 ))
esac
f_getvar _categories_$varpkg pkgcat
for cat in $pkgcat; do
f_str2varname $cat varcat
case "$mark" in
""|" ") : ;;
X) debug= f_getvar _${varcat}_ninstalled n
setvar _${varcat}_ninstalled $(( $n + 1 ));;
*) debug= f_getvar _${varcat}_nselected n
setvar _${varcat}_nselected $(( $n + 1 ))
esac
done
done
_All_nselected=$tselected
_All_ninstalled=$tinstalled
}
# f_package_calculate_rundeps
#
# Update package dependencies by first unmarking all dependencies and then
# re-marking all dependencies of packages marked for either install ("I") or
# re-install ("R").
#
f_package_calculate_rundeps()
{
local pkg varpkg mark rundeps dep vardep
#
# First unmark all the existing run-dependencies
#
f_dprintf "Unselecting package run-dependencies..."
for pkg in $SELECTED_PACKAGES; do
f_str2varname $pkg varpkg
mark=
debug= f_getvar _mark_$varpkg mark
# Only unmark if it's marked as a Dependency
if [ "$mark" = "D" ]; then
f_dprintf "%s unselected" $pkg
unset _mark_$varpkg
f_package_deselect $pkg
fi
done
#
# Processes selected packages, adding dependencies
#
f_dprintf "Re-selecting package run-dependencies..."
for pkg in $SELECTED_PACKAGES; do
f_str2varname $pkg varpkg
mark=
debug= f_getvar _mark_$varpkg mark
# Skip pkg unless marked for [Re-]Install
[ "$mark" = "I" -o "$mark" = "R" ] || continue
f_getvar _rundeps_$varpkg rundeps
for dep in $rundeps; do
f_str2varname $dep vardep
mark=
debug= f_getvar _mark_$vardep mark
# Skip dep if already marked
[ "${mark:- }" = " " ] || continue
export _mark_$vardep="D"
f_package_select $dep
done
done
f_dprintf "Finished recalculating dependencies."
}
# f_package_menu_categories $var_to_set $defaultitem
#
# Dislay the menu of package categories, complete with package counts for each
# category, accents, and other miscellany. If $defaultitem is non-NULL and
# matches one of the existing menu-items, it will be pre-highlighted in the
# menu dialog (HINT: Use f_dialog_menutag() to populate a local variable that
# is passed as $defaultitem to highlight the user's last selection by default).
#
f_package_menu_categories()
{
local var_to_get="$1" defaultitem="$2" category_list menu_list
f_package_calculate_rundeps
# updates package mark variables and SELECTED_PACKAGES
f_package_calculate_totals
# creates _{varcat}_ninstalled and _{varcat}_nselected
debug= f_getvar "$var_to_get" category_list || return $FAILURE
# Accent the category menu list with ninstalled/nselected
eval f_package_accent_category_menu category_list $category_list
local prompt="$msg_please_select_a_category_to_display"
local hline=""
menu_list="
'> $msg_review' '$msg_review_desc' '$msg_review_help'
$category_list
" # End-Quote
local size dialog_menu
size=$( eval f_dialog_menu_with_help_size \
\"\$DIALOG_TITLE\" \
\"\$DIALOG_BACKTITLE\" \
\"\$prompt\" \
\"\$hline\" \
$menu_list )
dialog_menu=$( eval $DIALOG \
--title \"\$DIALOG_TITLE\" \
--backtitle \"\$DIALOG_BACKTITLE\" \
--hline \"\$hline\" \
--item-help \
--default-item \"\$defaultitem\" \
--ok-label \"$msg_select\" \
--cancel-label \"$msg_cancel\" \
--menu \"\$prompt\" $size \
$menu_list \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
)
local retval=$?
setvar DIALOG_MENU_$$ "$dialog_menu"
return $retval
}
# f_package_index_get_page $category $page [$var_to_set [$var_to_get]]
#
# Obtain a [potentially cached] page of the INDEX file for a given $category.
# If $page is 1 and the cache has not yet been generated, the cache-generating
# function f_index_extract_pages() (above) is called to generate all pages
# (not just the requested page) in cache before returning the requested page.
# If $page is not 1 and there is no cached page, failure status is returned.
#
f_package_index_get_page()
{
local category="$1" page="$2" var_to_set="$3" var_to_get="$4" varcat
f_str2varname "$category" varcat
if ! debug= f_getvar "_index_page_${varcat}_$page" $var_to_set &&
[ "$page" = "1" ]
then
f_show_info "$msg_building_package_menus"
local pagesize="$PACKAGE_MENU_PAGESIZE"
f_index_extract_pages "${var_to_get:-PACKAGE_INDEX}" \
_index_page_${varcat} "$pagesize" "$category"
debug= f_getvar _index_page_${varcat}_$page $var_to_set
# Update category default-item because now we're cached
[ $page -eq 1 ] &&
category_defaultitem="${category_defaultitem%\*}*"
else
return $FAILURE
fi
}
# f_package_menu_select $category [ $page [ $defaultitem ] ]
#
# Display list of packages for $category, optionally $page N and with a default
# item selected. If $page is omitted, the first page is displayed (but this
# only matters if there are multiple pages; which is determined by the global
# maximum $PACKAGE_MENU_PAGESIZE).
#
# On success, if the user doesn't press ESC or choose Cancel, the environment
# variable $DIALOG_MENUITEM_$$ will hold the item associated with the chosen
# tag (accessible through f_dialog_menutag()).
#
f_package_menu_select()
{
local category="$1" page="${2:-1}" defaultitem="$3"
local varcat npkgs=0 npages menu_list
f_isinteger "$page" || return $FAILURE
f_str2varname "$category" varcat
f_package_index_get_page "$category" $page index_page
# Get number of packages for this category
case "$category" in
"All"|"") npkgs="${_npkgs:-0}";;
*) f_getvar _npkgs_$varcat npkgs
esac
# Calculate number of pages
npages=$(( ${npkgs:=0} / $PACKAGE_MENU_PAGESIZE ))
# Add a page to the pagecount if not evenly divisible
[ $(( $npages * $PACKAGE_MENU_PAGESIZE )) -lt $npkgs ] &&
npages=$(( $npages + 1 ))
# Print some debugging information
f_dprintf "f_package_menu_select: category=[%s] npkgs=%u npages=%u" \
"$category" "$npkgs" "$npages"
local add_prev="" add_next=""
local previous_page="$msg_previous_page" next_page="$msg_next_page"
if [ $page -gt 1 ]; then
add_prev=1
# Accent the `Previous Page' item with an asterisk
# if the page-before-previous is loaded/cached
f_isset _index_page_${varcat}_$(( $page - 1 )) &&
previous_page="$previous_page*"
fi
if [ $page -lt $npages ]; then
add_next=1
# Accent the `Next Page' item with an asterisk
# if the page-after-next is loaded/cached
f_isset _index_page_${varcat}_$(( $page + 1 )) &&
next_page="$next_page*"
fi
menu_list="
${add_prev:+'> $previous_page' '' ${SHOW_DESC:+''}}
${add_next:+'> $next_page' '' ${SHOW_DESC:+''}}
$(
export SHOW_DESC
export VALID_VARNAME_CHARS
echo "$index_page" | awk -F'|' -v view="port" '
BEGIN {
valid_chars = ENVIRON["VALID_VARNAME_CHARS"]
prefix = ""
}
{
cur_prefix = tolower(substr($1, 1, 1))
printf "'\''"
if ( prefix != cur_prefix )
prefix = cur_prefix
else
printf " "
package = $1
if ( view == "port" )
desc = $2
varpkg = package
gsub("[^" valid_chars "]", "_", varpkg)
mark = ENVIRON["_mark_" varpkg]
if ( ! mark ) mark = " "
printf "%s'\'' '\''[%c] %s'\''",
package, mark, desc
if ( ENVIRON["SHOW_DESC"] ) {
help = $4
gsub(/'\''/, "'\''\\'\'\''", help)
printf " '\''%s'\''", help
}
printf "\n"
}'
)
${add_prev:+'> $previous_page' '' ${SHOW_DESC:+''}}
${add_next:+'> $next_page' '' ${SHOW_DESC:+''}}
" # End-Quote
local prompt=""
f_category_desc_get "$category" prompt
prompt="$prompt $( printf "$msg_page_of_npages" \
"$page" "$npages" )"
local hline="$hline_arrows_tab_punc_enter"
local size isize dialog_menu item
size=$( eval f_dialog_menu${SHOW_DESC:+_with_help}_size \
\"\$DIALOG_TITLE\" \
\"\$DIALOG_BACKTITLE\" \
\"\$prompt\" \
\"\$hline\" \
$menu_list )
isize=$( f_dialog_infobox_size \
"$DIALOG_TITLE" \
"$DIALOG_BACKTITLE" \
"$msg_processing_selection" )
dialog_menu=$( eval $DIALOG \
--title \"\$DIALOG_TITLE\" \
--backtitle \"\$DIALOG_BACKTITLE\" \
--hline \"\$hline\" \
--keep-tite \
--ok-label \"$msg_select\" \
--cancel-label \"$msg_back\" \
${SHOW_DESC:+--item-help} \
--default-item \"\$defaultitem\" \
--menu \"\$prompt\" $size \
$menu_list \
--and-widget \
${USE_XDIALOG:+--no-buttons} \
--infobox \"\$msg_processing_selection\" $isize \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
)
local retval=$?
setvar DIALOG_MENU_$$ "$dialog_menu"
if [ $retval -eq $SUCCESS ]; then
item=$( eval f_dialog_menutag2item${SHOW_DESC:+_with_help} \
\"\$dialog_menu\" $menu_list )
setvar DIALOG_MENUITEM_$$ "$item"
fi
return $retval
}
# f_package_menu_deselect $package
#
# Display a menu, asking the user what they would like to do with $package
# with regard to "deselecting" an already installed package. Choices include
# uninstall, re-install, or cancel (leave $package marked as installed).
# Returns success if the user does not press ESC or choose Cnacel. Use the
# f_dialog_menutag() function upon success to retrieve the user's choice.
#
f_package_menu_deselect()
{
local package="$1" prompt menu_list size dialog_menu
prompt=$( printf "$msg_what_would_you_like_to_do_with" "$package" )
local hline="$hline_alnum_arrows_punc_tab_enter"
menu_list="
'X $msg_installed' '$msg_installed_desc'
'R $msg_reinstall' '$msg_reinstall_desc'
'U $msg_uninstall' '$msg_uninstall_desc'
" # End-Quote
size=$( eval f_dialog_menu_size \
\"\$DIALOG_TITLE\" \
\"\$DIALOG_BACKTITLE\" \
\"\$prompt\" \
\"\$hline\" \
$menu_list )
dialog_menu=$( eval $DIALOG \
--title \"\$DIALOG_TITLE\" \
--backtitle \"\$DIALOG_BACKTITLE\" \
--hline \"\$hline\" \
--ok-label \"$msg_select\" \
--cancel-label \"$msg_cancel\" \
--menu \"\$prompt\" $size \
$menu_list \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
)
local retval=$?
setvar DIALOG_MENU_$$ "$dialog_menu"
return $retval
}
# f_package_review
#
# Display a review screen, showing selected packages and what they are marked
# for, before proceeding (if the user does not press ESC or choose Cancel) to
# operate on each selection. Returns error if no packages have been selected,
# or the user has pressed ESC, or if they have chosen Cancel.
#
f_package_review()
{
local prompt size dialog_menu package varpkg mark menu_list=
prompt=$( printf "$msg_reviewing_selected_packages" \
"$_All_nselected" )
local hline="$hline_alnum_arrows_punc_tab_enter"
f_dprintf "f_package_review: SELECTED_PACKAGES=[%s]" \
"$SELECTED_PACKAGES"
for package in $SELECTED_PACKAGES; do
mark=
f_str2varname "$package" varpkg
f_getvar _mark_$varpkg mark
[ "$mark" -a ! "${mark#[IRUD]}" ] || continue
menu_list="$menu_list
'$mark' '$package'
" # End-Quote
done
if [ ! "$menu_list" ]; then
f_show_msg "$msg_no_packages_were_selected_for_extraction"
return $FAILURE # They might have selected this by accident
fi
menu_list=$( echo "$menu_list" | sort )
size=$( eval f_dialog_menu_size \
\"\$DIALOG_TITLE\" \
\"\$DIALOG_BACKTITLE\" \
\"\$prompt\" \
\"\$hline\" \
$menu_list )
dialog_menu=$( eval $DIALOG \
--title \"\$DIALOG_TITLE\" \
--backtitle \"\$DIALOG_BACKTITLE\" \
--hline \"\$hline\" \
--ok-label \"\$msg_proceed\" \
--cancel-label \"\$msg_cancel\" \
--menu \"\$prompt\" $size \
$menu_list \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
)
local retval=$?
setvar DIALOG_MENU_$$ "$dialog_menu"
#
# XXX
#
f_show_msg "Coming soon..."
#
# XXX
#
return $retval
}
# f_package_config
#
# Allow the user to configure packages and install them. Initially, a list of
# package categories is loaded/displayed. When the user selects a category,
# the menus for that category are built (unlike sysinstall which built all
# category menus up-front -- which also took forever, despite the fact that
# few people visit more than a couple of categories each time).
#
f_package_config()
{
# Did we get an INDEX?
f_index_initialize packages/INDEX || return $FAILURE
# Creates following variables (indirectly via f_index_read())
# CATEGORY_MENU_LIST _categories_{varpkg} _rundeps_{varpkg}
# PACKAGE_CATEGORIES _npkgs
# Detect installed packages (updates marks/SELECTED_PACKAGES)
f_package_detect_installed
local retval category varcat defaultitem category_defaultitem=""
while :; do
# Display the list of package categories
f_package_menu_categories \
CATEGORY_MENU_LIST "$category_defaultitem"
retval=$?
category=$( f_dialog_menutag )
f_dprintf "retval=%u mtag=[%s]" $retval "$category"
category_defaultitem="$category"
[ $retval -eq $SUCCESS ] || break
# Maybe the user chose an action (like `Review')
case "$category" in
"> $msg_review")
f_package_review && break
continue ;;
"> "*)
continue
esac
# Anything else is a package category
category=${category# } # Trim leading space if present
category=${category%\*} # Trim trailing asterisk if present
f_str2varname "$category" varcat
local page package varpkg mark
while :; do
# Display the list of packages for selected category
page=1 defaultitem=""
f_getvar _defaultitem_$varcat defaultitem
f_getvar _defaultpage_$varcat page
f_package_menu_select \
"$category" "${page:=1}" "$defaultitem"
retval=$?
dialog_menu=$( f_dialog_menutag )
f_dprintf "retval=%u mtag=[%s]" $retval "$dialog_menu"
# NOTE: When --and-widget is used only ESC will cause
# dialog(1) to return without going to the next widget.
# This is alright in our case as we can still detect
# the Cancel button because stdout will be NULL.
# Alternatively, Xdialog(1) will terminate with 1
# if/when Cancel is chosen on any widget.
if [ $retval -eq 255 -o ! "$dialog_menu" ]; then
# User pressed ESC or chose Cancel
break
elif [ $retval -eq 1 ]; then
# Using X11, Xdialog(1) returned 1 for Cancel
f_show_msg "%s" "$dialog_menu"
break
elif [ $retval -ne $SUCCESS ]; then
# X11-related error occurred using Xdialog(1)
f_show_msg "%s" "$dialog_menu"
break
fi
defaultitem="$dialog_menu"
# NOTE: f_package_menu_select() does not show the
# `Previous Page' or `Next Page' items unless needed
case "$dialog_menu" in
"> $msg_previous_page"|"> $msg_previous_page*")
page=$(( $page - 1 ))
setvar _defaultpage_$varcat $page
# Update default-item to match accent that will
# be applied by f_package_menu_select(); if the
# page-before-prev is cached, add an asterisk.
if f_isset \
_index_page_${varcat}_$(( $page - 1 ))
then
defaultitem="${defaultitem%\*}*"
else
defaultitem="${defaultitem%\*}"
fi
setvar _defaultitem_$varcat "$defaultitem"
continue ;;
"> $msg_next_page"|"> $msg_next_page*")
page=$(( $page + 1 ))
setvar _defaultpage_$varcat $page
# Update default-item to match accent that will
# be applied by f_package_menu_select(); if the
# page-after-next is cached, add an asterisk.
if f_isset \
_index_page_${varcat}_$(( $page + 1 ))
then
defaultitem="${defaultitem%\*}*"
else
defaultitem="${defaultitem%\*}"
fi
setvar _defaultitem_$varcat "$defaultitem"
continue ;;
"> "*) # Unknown navigation/action item
setvar _defaultpage_$varcat $page
continue ;; # Do not treat as a package
*)
setvar _defaultitem_$varcat "$defaultitem"
esac
# Treat any other selection as a package
package="${dialog_menu# }" # Trim leading space
f_str2varname $package varpkg
f_getvar DIALOG_MENUITEM_$$ mark
mark="${mark#?}"
mark="${mark%%\] *}"
case "$mark" in
"I")
mark=" "
f_package_deselect $package
;;
" "|"D")
mark="I"
f_package_select $package
;;
"X"|"R"|"U")
f_package_menu_deselect $package || continue
dialog_menu=$( f_dialog_menutag )
case "$dialog_menu" in
"X $msg_installed")
f_package_deselect "$package"
mark="X"
;;
"R $msg_reinstall")
f_package_select "$package"
mark="R"
;;
"U $msg_uninstall")
f_package_select "$package"
mark="U"
;;
esac
;;
esac
export _mark_$varpkg="$mark"
# NOTE: exported for awk(1) ENVIRON[]
done
done
}
############################################################ MAIN
f_dprintf "%s: Successfully loaded." packages/packages.subr
fi # ! $_PACKAGES_PACKAGES_SUBR

View File

@ -35,6 +35,7 @@ f_include $BSDCFG_SHARE/device.subr
f_include $BSDCFG_SHARE/variable.subr
f_include $BSDCFG_SHARE/media/any.subr
f_include $BSDCFG_SHARE/media/tcpip.subr
f_include $BSDCFG_SHARE/packages/packages.subr
############################################################ GLOBALS
@ -188,6 +189,9 @@ f_resword_new mediaSetFTPUserPass f_media_set_ftp_userpass
f_resword_new mediaSetHTTP f_media_set_http_proxy
f_resword_new mediaSetHTTPProxy f_media_set_http_proxy
# packages/packages.subr
f_resword_new configPackages f_package_config
f_dprintf "%s: Successfully loaded." script.subr
fi # ! $_SCRIPT_SUBR

View File

@ -117,6 +117,7 @@ f_variable_set_defaults()
setvar $VAR_NFS_SECURE "NO"
setvar $VAR_NFS_TCP "NO"
setvar $VAR_NFS_V3 "YES"
setvar $VAR_PKG_TMPDIR "/var/tmp"
setvar $VAR_RELNAME "$UNAME_R"
f_dprintf "f_variable_set_defaults: Defaults initialized."
@ -224,8 +225,12 @@ f_variable_new VAR_NFS_SECURE nfs_reserved_port_only
f_variable_new VAR_NFS_TCP nfs_use_tcp
f_variable_new VAR_NFS_V3 nfs_use_v3
f_variable_new VAR_NONINTERACTIVE nonInteractive
f_variable_new VAR_NO_CONFIRM noConfirm
f_variable_new VAR_NO_ERROR noError
f_variable_new VAR_NO_INET6 noInet6
f_variable_new VAR_PACKAGE package
f_variable_new VAR_PKG_TMPDIR PKG_TMPDIR
f_variable_new VAR_PORTS_PATH ports
f_variable_new VAR_RELNAME releaseName
f_variable_new VAR_SLOW_ETHER slowEthernetCard
f_variable_new VAR_TRY_DHCP tryDHCP