diff --git a/apps/m9zCtrlTty/firefox_install.go b/apps/m9zCtrlTty/firefox_install.go index 9d51d01..ab6075c 100644 --- a/apps/m9zCtrlTty/firefox_install.go +++ b/apps/m9zCtrlTty/firefox_install.go @@ -46,6 +46,10 @@ var forbiddenFirefoxDebPackages = map[string]struct{}{ "util-linux": {}, } +var optionalFirefoxDebPackages = map[string]string{ + "lubuntu-icon-theme": "theme package may conflict with existing adwaita-icon-theme-full and is not required by Firefox", +} + type firefoxBundleInstallPlan struct { TotalPackageCount int HasFirefoxPackage bool @@ -94,6 +98,8 @@ func installFirefox() error { return err } baseSystemPackages := strings.Join(plan.BaseSystemPackages, " ") + optionalSkipPackages := strings.Join(optionalFirefoxDebPackageNames(), " ") + kioskInfof("firefox install package filter baseSystemPackages=%q optionalSkipPackages=%q", baseSystemPackages, optionalSkipPackages) var p struct { DebPkgPath string `json:"DebPkgPath"` @@ -129,9 +135,11 @@ echo "" echo "3. filter Firefox deb packages..." base_system_packages=%s +optional_skip_packages=%s mkdir -p /opt/firefox-installable selected_count=0 skipped_installed_count=0 +skipped_optional_count=0 selected_missing_base_count=0 selected_regular_count=0 firefox_selected=0 @@ -170,6 +178,14 @@ for deb in /opt/firefox-deb/*.deb; do continue fi + case " $optional_skip_packages " in + *" $pkg "*) + echo "skip optional package: $file package=$pkg" + skipped_optional_count=$((skipped_optional_count + 1)) + continue + ;; + esac + case " $base_system_packages " in *" $pkg "*) if [ "$installed" -eq 1 ]; then @@ -193,7 +209,7 @@ for deb in /opt/firefox-deb/*.deb; do select_deb selected_regular_count=$((selected_regular_count + 1)) done -echo "selected packages: $selected_count, selected missing base: $selected_missing_base_count, selected regular: $selected_regular_count, skipped installed: $skipped_installed_count" +echo "selected packages: $selected_count, selected missing base: $selected_missing_base_count, selected regular: $selected_regular_count, skipped installed: $skipped_installed_count, skipped optional: $skipped_optional_count" if [ "$selected_count" -eq 0 ]; then echo "error: no packages selected for install" exit 1 @@ -205,7 +221,12 @@ fi echo "" echo "4. install selected Firefox packages..." -cd /opt/firefox-installable && sudo dpkg -i ./*.deb || { echo "error: install selected Firefox deb packages failed"; exit 1; } +cd /opt/firefox-installable || { echo "error: enter installable package directory failed"; exit 1; } +install_status=0 +sudo dpkg -i ./*.deb || install_status=$? +if [ "$install_status" -ne 0 ]; then + echo "warning: selected Firefox deb package install returned status $install_status, verify Firefox next" +fi echo "" echo "5. verify Firefox..." @@ -213,7 +234,7 @@ firefox --version || { echo "error: Firefox verification failed"; exit 1; } echo "" echo "=== Firefox install complete ===" -`, shellQuote(bundlePath), shellQuote(baseSystemPackages))) +`, shellQuote(bundlePath), shellQuote(baseSystemPackages), shellQuote(optionalSkipPackages))) command.Stdout = os.Stdout command.Stderr = os.Stderr @@ -351,6 +372,15 @@ func unsafeFirefoxDebPackages(packages []string) []string { return blocked } +func optionalFirefoxDebPackageNames() []string { + names := make([]string, 0, len(optionalFirefoxDebPackages)) + for name := range optionalFirefoxDebPackages { + names = append(names, name) + } + sort.Strings(names) + return names +} + func shellQuote(value string) string { return "'" + strings.ReplaceAll(value, "'", "'\\''") + "'" } diff --git a/apps/m9zCtrlTty/firefox_install_test.go b/apps/m9zCtrlTty/firefox_install_test.go index 20afa89..6ee8feb 100644 --- a/apps/m9zCtrlTty/firefox_install_test.go +++ b/apps/m9zCtrlTty/firefox_install_test.go @@ -58,6 +58,14 @@ func TestFirefoxBundleInstallPlanDetectsBasePackages(t *testing.T) { } } +func TestOptionalFirefoxDebPackageNames(t *testing.T) { + got := optionalFirefoxDebPackageNames() + want := []string{"lubuntu-icon-theme"} + if !stringSlicesEqual(got, want) { + t.Fatalf("optionalFirefoxDebPackageNames() = %v, want %v", got, want) + } +} + func stringSlicesEqual(left []string, right []string) bool { if len(left) != len(right) { return false