Add Firefox and uBlock Origin sections

This commit is contained in:
2Shirt 2021-09-18 16:11:09 -06:00
parent 578925cb70
commit 14ff5a9437
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C
3 changed files with 145 additions and 4 deletions

View file

@ -23,6 +23,9 @@ PRESETS = {
'Enable Windows Updates', 'Enable Windows Updates',
'Windows Explorer', 'Windows Explorer',
), ),
'Install Software': (
'Firefox', # Needed to handle profile upgrade nonsense
),
'System Summary': ( 'System Summary': (
'Operating System', 'Operating System',
'Windows Activation', 'Windows Activation',
@ -111,10 +114,11 @@ BASE_MENUS = {
'Install Software': ( 'Install Software': (
MenuEntry('Visual C++ Runtimes', 'auto_install_vcredists'), MenuEntry('Visual C++ Runtimes', 'auto_install_vcredists'),
#MenuEntry('ESET NOD32 Antivirus', no_op), #MenuEntry('ESET NOD32 Antivirus', no_op),
MenuEntry('Firefox', 'auto_install_firefox'),
MenuEntry('LibreOffice', 'auto_install_libreoffice'), MenuEntry('LibreOffice', 'auto_install_libreoffice'),
MenuEntry('Open Shell', 'auto_install_open_shell'), MenuEntry('Open Shell', 'auto_install_open_shell'),
MenuEntry('uBlock Origin', no_op), MenuEntry('uBlock Origin', 'auto_install_ublock_origin'),
MenuEntry('Software Bundle', no_op), # include FF x32 -> x64 convertion? MenuEntry('Software Bundle', no_op),
), ),
'Configure System': ( 'Configure System': (
MenuEntry('Chrome Notifications', no_op), MenuEntry('Chrome Notifications', no_op),

View file

@ -32,7 +32,8 @@ SOURCES = {
'FastCopy': 'https://ftp.vector.co.jp/73/10/2323/FastCopy392_installer.exe', 'FastCopy': 'https://ftp.vector.co.jp/73/10/2323/FastCopy392_installer.exe',
'Fluent-Metro': 'https://github.com/bonzibudd/Fluent-Metro/releases/download/v1.5.2/Fluent-Metro_1.5.2.zip', 'Fluent-Metro': 'https://github.com/bonzibudd/Fluent-Metro/releases/download/v1.5.2/Fluent-Metro_1.5.2.zip',
'FurMark': 'https://geeks3d.com/dl/get/569', 'FurMark': 'https://geeks3d.com/dl/get/569',
'Firefox uBO': 'https://addons.mozilla.org/firefox/downloads/file/3740966/ublock_origin-1.34.0-an+fx.xpi', 'Firefox32': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win&lang=en-US',
'Firefox64': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=en-US',
'HitmanPro': 'https://dl.surfright.nl/HitmanPro.exe', 'HitmanPro': 'https://dl.surfright.nl/HitmanPro.exe',
'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe', 'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe',
'HWiNFO': 'https://files1.majorgeeks.com/c8a055180587599139f8f454712dcc618cd1740e/systeminfo/hwi_702.zip', 'HWiNFO': 'https://files1.majorgeeks.com/c8a055180587599139f8f454712dcc618cd1740e/systeminfo/hwi_702.zip',

View file

@ -1,7 +1,9 @@
"""WizardKit: Setup - Windows""" """WizardKit: Setup - Windows"""
# vim: sts=2 sw=2 ts=2 # vim: sts=2 sw=2 ts=2
import configparser
import logging import logging
import json
import os import os
import platform import platform
import re import re
@ -13,11 +15,13 @@ from subprocess import CalledProcessError, DEVNULL
from wk.cfg.main import KIT_NAME_FULL, KIT_NAME_SHORT from wk.cfg.main import KIT_NAME_FULL, KIT_NAME_SHORT
from wk.exe import ( from wk.exe import (
get_procs, get_procs,
kill_procs,
run_program, run_program,
popen_program, popen_program,
wait_for_procs, wait_for_procs,
) )
from wk.io import ( from wk.io import (
case_insensitive_path,
delete_folder, delete_folder,
get_path_obj, get_path_obj,
non_clobber_path, non_clobber_path,
@ -96,6 +100,13 @@ PROGRAMFILES_64 = os.environ.get(
'PROGRAMFILES', r'C:\Program Files', 'PROGRAMFILES', r'C:\Program Files',
), ),
) )
REG_CHROME_UBLOCK_ORIGIN = {
'HKLM': {
r'Software\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm': (
('update_url', 'https://clients2.google.com/service/update2/crx', 'SZ', '32'),
)
},
}
REG_OPEN_SHELL_SETTINGS = { REG_OPEN_SHELL_SETTINGS = {
'HKCU': { 'HKCU': {
r'Software\OpenShell\StartMenu': ( r'Software\OpenShell\StartMenu': (
@ -382,6 +393,11 @@ def auto_config_open_shell():
TRY_PRINT.run('Open Shell...', reg_write_settings, REG_OPEN_SHELL_SETTINGS) TRY_PRINT.run('Open Shell...', reg_write_settings, REG_OPEN_SHELL_SETTINGS)
def auto_install_firefox():
"""Install Firefox."""
TRY_PRINT.run('Firefox...', install_firefox)
def auto_install_libreoffice(): def auto_install_libreoffice():
"""Install LibreOffice. """Install LibreOffice.
@ -396,6 +412,13 @@ def auto_install_open_shell():
TRY_PRINT.run('Open Shell...', install_open_shell) TRY_PRINT.run('Open Shell...', install_open_shell)
def auto_install_ublock_origin():
"""Update the registry to auto-add uBlock Origin to Chrome."""
TRY_PRINT.run(
'uBlock Origin...', reg_write_settings, REG_CHROME_UBLOCK_ORIGIN,
)
def auto_install_vcredists(): def auto_install_vcredists():
"""Install latest supported Visual C++ runtimes.""" """Install latest supported Visual C++ runtimes."""
TRY_PRINT.run('Visual C++ Runtimes...', install_vcredists) TRY_PRINT.run('Visual C++ Runtimes...', install_vcredists)
@ -406,6 +429,77 @@ def auto_install_vcredists():
# Install Functions # Install Functions
def install_firefox():
"""Install Firefox.
As far as I can tell if you use the EXE installers then it will use
the same installation directory as the installed version. As such a
32-bit installation could be upgraded to a 64-bit one and still use
%PROGRAMFILES(X86)% However, if a 64-bit MSI installer is used then
it ignores the 32-bit directory and just installs a new copy to
%PROGRAMFILES% resulting in two copies of Firefox to be in place.
To address this issue this function will uninstall all copies of
Firefox under 64-bit Windows if it's detected in %PROGRAMFILES(X86)%
before installing the latest 64-bit version.
Firefox 67 changed how profiles are named to avoid reusing the same
profile between different channels of Firefox (std, beta, ESR, etc).
However the logic used when upgrading from versions before 67 to
current isn't ideal. It can, but doesn't always?, create a new
profile and set it as default; even if there's an existing profile
being used. To address this profiles.ini is read to compare with the
post-install/upgrade state. If the default is changed to a new
profile then it is reverted so the original existing profile instead.
"""
current_default_profile = None
firefox_exe = f'{os.environ["PROGRAMFILES"]}/Mozilla Firefox/firefox.exe'
profiles_ini = case_insensitive_path(
f'{os.environ["APPDATA"]}/Mozilla/Firefox/profiles.ini',
)
program_path_32bit_exists = False
try:
case_insensitive_path(
f'{PROGRAMFILES_32}/Mozilla Firefox/firefox.exe',
)
except FileNotFoundError:
# Ignore
pass
else:
program_path_32bit_exists = True
revert_default = False
# Save current default profile
if profiles_ini.exists():
current_default_profile = get_firefox_default_profile(profiles_ini)
# Uninstall Firefox if needed
if ARCH == '64' and program_path_32bit_exists:
uninstall_firefox()
# Install Firefox
run_tool('Firefox', 'Firefox', '/S', download=True)
# Open Firefox to force profiles.ini update
popen_program(firefox_exe)
sleep(5)
kill_procs('firefox.exe', force=True)
# Check if default profile changed
if current_default_profile:
new_default = get_firefox_default_profile(profiles_ini)
revert_default = new_default and new_default != current_default_profile
# Revert default profile if needed
if revert_default:
out = []
for line in profiles_ini.read_text().splitlines():
if 'Default=Profile' in line:
out.append(f'Default={current_default_profile}')
else:
out.append(line)
profiles_ini.write_text('\n'.join(out))
def install_libreoffice( def install_libreoffice(
register_mso_types=True, use_mso_formats=False, vcredist=True): register_mso_types=True, use_mso_formats=False, vcredist=True):
"""Install LibreOffice.""" """Install LibreOffice."""
@ -480,8 +574,50 @@ def install_vcredists():
run_program([installer, *cmd_args]) run_program([installer, *cmd_args])
def uninstall_firefox():
"""Uninstall all copies of Firefox."""
json_file = format_log_path(log_name='Installed Programs', timestamp=True)
json_file = json_file.with_name(f'{json_file.stem}.json')
uninstall_data = None
# Get uninstall_data from UninstallView
extract_tool('UninstallView')
cmd = [get_tool_path('UninstallView', 'UninstallView'), '/sjson', json_file]
run_program(cmd)
with open(json_file, 'rb') as _f:
uninstall_data = json.load(_f)
# Uninstall Firefox if found
for item in uninstall_data:
if item['Display Name'].lower().startswith('mozilla firefox'):
uninstaller = item['Uninstall String'].replace('"', '')
run_program([uninstaller, '/S'])
# Misc Functions # Misc Functions
## TODO? def get_firefox_default_profile(profiles_ini):
"""Get Firefox default profile, returns pathlib.Path or None."""
default_profile = None
parser = None
# Bail early
if not profiles_ini.exists():
return None
# Parse INI
parser = configparser.ConfigParser()
parser.read(profiles_ini)
for section in parser.sections():
if section.lower().startswith('install'):
default_profile = parser[section].get('default')
break
value = parser[section].get('default')
if value and value == '1':
default_profile = parser[section].get('path')
# Done
return default_profile
# Tool Functions # Tool Functions
## TODO? ## TODO?