├── .github
└── FUNDING.yml
├── appcast.xml
├── README.md
├── README_EN.md
├── logi-options-plus-mini.command
├── logi-options-plus-mini.ps1
└── LICENSE
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: qeteshi
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
12 | polar: # Replace with a single Polar username
13 | buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
14 | thanks_dev: # Replace with a single thanks.dev username
15 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
16 |
--------------------------------------------------------------------------------
/appcast.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Logi Options+ mini
5 |
6 | 1.5
7 | Fri, 11 Oct 2025 00:00:00 +0800
8 | 16
9 | 1.5
10 | 14.0
11 |
12 |
13 | ul{margin-top: 0;margin-bottom: 7;padding-left: 18;}
15 |
🎉 Logi Options+ mini 1.5 is now available!
16 |
17 |
Chinese language support
18 |
Improved macOS 26 Glass effect compatibility
19 |
Improved quiet installation logic
20 |
Bug fixes and general improvements
21 |
22 |
🔄 Recent Updates:
23 |
24 |
Added quiet install support
25 |
New background service to skip repeated password prompts
26 |
Automatic region detection for installer downloads
New background service option to skip repeated passwords
74 |
Automatic region detection for installer download
75 |
Quiet install support
76 |
Bug fixes and improvements
77 |
78 |
Recent Updates:
79 |
80 |
Compatibility update: v1.93.755983
81 |
Added Actions Ring feature
82 |
Added log level setting
83 |
UI improvements for macOS 26
84 |
85 | ]]>
86 |
87 |
88 |
89 | 1.2
90 | Sat, 09 Aug 2025 18:04:55 +0800
91 | 10
92 | 1.2
93 | 14.0
94 |
95 |
96 | Logi Options+ mini 1.2 is now available! 🎉
97 |
98 | New Features:
99 | - Compatibility version 1.93.755983
100 |
101 |
102 | Recent Updates:
103 | - Add Actions Ring feature
104 | - Add log level setting
105 | - UI improvements for macOS 26
106 |
107 |
108 |
109 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Logi Options Plus Mini
2 |
3 | [中文](README.md) | [English](README_EN.md)
4 |
5 | **Logi Options+ mini** 提供了一种选择来自定义 Logi Options+,方便用户能够更好地控制其功能。
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | ## 项目简介
20 |
21 | 参考官方[Logitech Options 软件的批量安装和配置](https://prosupport.logi.com/hc/zh-cn/articles/6046882446359-Logitech-Options-软件的批量安装和配置)
22 |
23 | 项目通过官方安装包命令行选项定制化Logi Options+功能。
24 | 支持macOS原生应用、macOS Shell、Windows PowerShell。
25 |
26 | ## 特性
27 |
28 | - 定制化Logi Options+功能
29 | - 易于使用的交互设计
30 | - 卸载升级时自动保留配置
31 | - 可定制功能
32 | - analytics 用户分享应用程序使用情况和诊断数据
33 | - flow
34 | - sso 用户登录应用程序的功能
35 | - update 应用程序更新
36 | - dfu 设备固件更新
37 | - logivoice 罗技语音功能
38 | - aipromptbuilder AI Prompt Builder 功能(仅限macOS)
39 | - smartactions
40 | - actions-ring
41 | - device-recommendation 设备推荐功能(仅限macOS)
42 |
43 | ## 使用方法
44 |
45 | ### 使用 macOS 原生应用
46 |
47 | 下载最新版本 [here](https://v.qetesh.cc/d/Public/Logi%20Options%2B%20mini.dmg)
48 |
49 | [``](https://v.qetesh.cc/d/Public/Logi%20Options%2B%20mini.dmg)
50 |
51 | 🔔 由于没有使用开发者证书签署应用,macOS可能会显示安全警告,需前往系统设置 → 隐私与安全 → 已阻止“Logi Options+mini”以保护Mac。然后点击“仍要打开”以运行该应用程序。
52 |
53 | 
54 |
55 | ### 使用 macOS Shell
56 |
57 | 1. 克隆此项目到本地
58 |
59 | ```bash
60 | git clone https://github.com/Qetesh/logi-options-plus-mini.git
61 | cd logi-options-plus-mini
62 | ```
63 | 2. 运行Shell脚本(需要 `sudo`权限卸载旧版本)
64 |
65 | - macOS
66 |
67 | ```bash
68 | chmod u+x logi-options-plus-mini.command
69 | ./logi-options-plus-mini.command
70 |
71 | ##############################################################
72 | 2024年12月15日 星期日 23时32分33秒 +08 | Starting install of Logi Options+
73 | ##############################################################
74 |
75 | Please select the features you want to keep:
76 | 1. analytics: Shows or hides choice for users to opt in to share app usage and diagnostics data.
77 | 2. flow: Shows or hides the Flow feature. Default value is Yes
78 | 3. sso: Shows or hides ability for users to sign into the app.
79 | 4. update: Enables or disables app updates.
80 | 5. dfu: Enables or disables device firmware updates.
81 | 6. backlight: Enables or disables keyboard backlight on the supported keyboards.
82 | 7. logivoice: Enables or disables LogiVoice feature.
83 | 8. aipromptbuilder: Enables or disables AI Prompt Builder feature.
84 | 9. device-recommendation: Enables or disables device recommendation feature.
85 | 10. smartactions: Enables or disables Smart Actions feature.
86 | 11. actions-ring: Enables or disables Actions Ring feature.
87 | 12. all
88 | Press enter for none
89 |
90 | Enter your choices(e.g. 2 6, default is none):
91 | ```
92 | - Windows(需要管理员终端运行一次 `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned`,具体见:[#5](https://github.com/Qetesh/logi-options-plus-mini/issues/5))
93 |
94 | 右键ps1脚本,`使用PowerShell运行`
95 |
96 | ```powershell
97 | ##############################################################
98 | 12/17/2024 19:50:23 | Starting install of Logi Options+
99 | ##############################################################
100 | 12/17/2024 19:50:24 | Downloading Logi Options+ Installer...
101 | 12/17/2024 19:51:06 | Download completed successfully.
102 | 12/17/2024 19:51:06 | Uninstalling existing version of Logi Options+...
103 |
104 | Please select the features you want to keep:
105 | 1. analytics: Shows or hides choice for users to opt in to share app usage and diagnostics data.
106 | 2. flow: Shows or hides the Flow feature. Default value is Yes
107 | 3. sso: Shows or hides ability for users to sign into the app.
108 | 4. update: Enables or disables app updates.
109 | 5. dfu: Enables or disables device firmware updates.
110 | 6. backlight: Enables or disables keyboard backlight on the supported keyboards.
111 | 7. logivoice: Enables or disables LogiVoice feature.
112 | 8. aipromptbuilder: Enables or disables AI Prompt Builder feature.
113 | 9. device-recommendation: Enables or disables device recommendation feature.
114 | 10. smartactions: Enables or disables Smart Actions feature.
115 | 11. actions-ring: Enables or disables Actions Ring feature.
116 | 12. all
117 | Press enter for none
118 |
119 | Enter your choices(e.g. 2 6, default is none):
120 |
121 | ```
122 |
123 | 脚本将会自动下载官方安装包,并进行精简安装。
124 |
125 | ## 系统要求
126 |
127 | - macOS
128 | - Windows
129 | - 网络连接以下载官方安装包
130 |
131 | ## FAQ
132 |
133 | - 部分Mac无法使用官方方式卸载,需使用第三方工具卸载后重新运行。已测试使用 `Pearcleaner`卸载后可正常运行安装
134 |
135 | ### Contributors
136 |
137 |
138 |
139 |
140 |
141 | 
142 |
143 | [CDN acceleration and security protection for this project are sponsored by Tencent EdgeOne.](https://edgeone.ai/?from=github)
144 |
145 | ## 贡献
146 |
147 | 欢迎提交问题和请求。您可以通过以下方式贡献代码:
148 |
149 | 1. Fork 此仓库
150 | 2. 创建您的分支 (`git checkout -b feature/AmazingFeature`)
151 | 3. 提交您的更改 (`git commit -m 'Add some AmazingFeature'`)
152 | 4. 推送到分支 (`git push origin feature/AmazingFeature`)
153 | 5. 打开一个Pull Request
154 |
155 | ## 许可证
156 |
157 | 此项目使用 [Apache 许可证](LICENSE)。
158 |
--------------------------------------------------------------------------------
/README_EN.md:
--------------------------------------------------------------------------------
1 | # Logi Options Plus Mini
2 | [中文](README.md) | [English](README_EN.md)
3 |
4 | **Logi Options+ mini** Provides an option to customize Logi Options+ so that the user can better control its functions.
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | ## Project Overview
19 | Refer to the official [Mass installation and configuration of Logitech Options+ software](https://prosupport.logi.com/hc/en-us/articles/6046882446359-Mass-installation-and-configuration-of-Logitech-Options-software)
20 |
21 | This project customizes the Logi Options+ functionality through official installer command-line options. It supports macOS native applications, macOS Shell, and Windows PowerShell.
22 |
23 | ## Features
24 |
25 | - customizes the Logi Options+ functionality
26 | - Automatically retain configuration when uninstalling and upgrading
27 | - Customizable features:
28 | - analytics: user sharing of application usage and diagnostic data
29 | - flow
30 | - sso: user login
31 | - update: application updates
32 | - dfu: device firmware updates
33 | - logivoice: Logitech voice
34 | - aipromptbuilder: AI Prompt Builder (macOS only)
35 | - smartactions
36 | - actions-ring
37 | - device-recommendation: device recommendation (macOS only)
38 | - Easy-to-use
39 |
40 | ## Usage
41 |
42 | ### Using macOS Native Application
43 |
44 | Download the latest version [here](https://github.com/Qetesh/logi-options-plus-mini/releases/latest)
45 |
46 | [](https://github.com/Qetesh/logi-options-plus-mini/releases/latest)
47 |
48 | 🔔 Due to the application not being signed with a developer certificate. macOS may show a security warning, simply go to System Settings → Privacy & Security → "Logi Options+mini"was blocked to protect your Mac. and click “Open Anyway” to run the app.
49 |
50 | 
51 |
52 | ### Using macOS Shell
53 |
54 | 1. Clone this project locally
55 | ```bash
56 | git clone https://github.com/Qetesh/logi-options-plus-mini.git
57 | cd logi-options-plus-mini
58 | ```
59 |
60 | 2. Run the shell script (requires `sudo` permission to uninstall the old version)
61 | - macOS
62 | ```bash
63 | chmod u+x logi-options-plus-mini.command
64 | ./logi-options-plus-mini.command
65 |
66 | ##############################################################
67 | 2024年12月15日 星期日 23时32分33秒 +08 | Starting install of Logi Options+
68 | ##############################################################
69 |
70 | Please select the features you want to keep:
71 | 1. analytics: Shows or hides choice for users to opt in to share app usage and diagnostics data.
72 | 2. flow: Shows or hides the Flow feature. Default value is Yes
73 | 3. sso: Shows or hides ability for users to sign into the app.
74 | 4. update: Enables or disables app updates.
75 | 5. dfu: Enables or disables device firmware updates.
76 | 6. backlight: Enables or disables keyboard backlight on the supported keyboards.
77 | 7. logivoice: Enables or disables LogiVoice feature.
78 | 8. aipromptbuilder: Enables or disables AI Prompt Builder feature.
79 | 9. device-recommendation: Enables or disables device recommendation feature.
80 | 10. smartactions: Enables or disables Smart Actions feature.
81 | 11. actions-ring: Enables or disables Actions Ring feature.
82 | 12. all
83 | Press enter for none
84 |
85 | Enter your choices(e.g. 2 6, default is none):
86 | ```
87 |
88 | - Windows (Requires running the `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned` command once in an administrator terminal)
89 |
90 | Right-click on the ps1 script and "Run with PowerShell"
91 | ```powershell
92 | ##############################################################
93 | 12/17/2024 19:50:23 | Starting install of Logi Options+
94 | ##############################################################
95 | 12/17/2024 19:50:24 | Downloading Logi Options+ Installer...
96 | 12/17/2024 19:51:06 | Download completed successfully.
97 | 12/17/2024 19:51:06 | Uninstalling existing version of Logi Options+...
98 |
99 | Please select the features you want to keep:
100 | 1. analytics: Shows or hides choice for users to opt in to share app usage and diagnostics data.
101 | 2. flow: Shows or hides the Flow feature. Default value is Yes
102 | 3. sso: Shows or hides ability for users to sign into the app.
103 | 4. update: Enables or disables app updates.
104 | 5. dfu: Enables or disables device firmware updates.
105 | 6. backlight: Enables or disables keyboard backlight on the supported keyboards.
106 | 7. logivoice: Enables or disables LogiVoice feature.
107 | 8. aipromptbuilder: Enables or disables AI Prompt Builder feature.
108 | 9. device-recommendation: Enables or disables device recommendation feature.
109 | 10. smartactions: Enables or disables Smart Actions feature.
110 | 11. actions-ring: Enables or disables Actions Ring feature.
111 | 12. all
112 | Press enter for none
113 |
114 | Enter your choices (e.g. 2 6, default is none):
115 | ```
116 |
117 | The script will automatically download the official installer and perform a streamlined installation.
118 |
119 | ## System Requirements
120 |
121 | - macOS
122 | - Windows
123 | - Internet connection to download the official installer
124 |
125 | ## FAQ
126 |
127 | - Some Macs cannot be uninstalled using the official method, and a third-party tool is required for uninstallation and then re-running. It has been tested that after using `Pearcleaner` for uninstallation, it can run normally after installation.
128 |
129 | ## Contributors
130 |
131 |
132 |
133 |
134 |
135 | ## Contributing
136 |
137 | Welcome to submit issues and requests. You can contribute code as follows:
138 |
139 | 1. Fork this repository
140 | 2. Create your branch (`git checkout -b feature/AmazingFeature`)
141 | 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
142 | 4. Push to the branch (`git push origin feature/AmazingFeature`)
143 | 5. Open a Pull Request
144 |
145 | ## License
146 |
147 | This project is licensed under the [Apache License](LICENSE).
148 |
--------------------------------------------------------------------------------
/logi-options-plus-mini.command:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | #set -x
3 |
4 | ############################################################################################
5 | ##
6 | ## Script to install latest Logi Options+ on macOS
7 | ##
8 | ###############################################
9 |
10 | # Path.
11 | package="logioptionsplus_installer"
12 | unarchived_name="logioptionsplus_installer.app"
13 | downloaded_path="/private/tmp/logioptionsplus" #Path, from where the install operation happens.
14 | downloaded_package_path="$downloaded_path/$package.zip"
15 | package_unarchived_path="$downloaded_path/$unarchived_name"
16 | weburl="https://download01.logi.com/web/ftp/pub/techsupport/optionsplus/logioptionsplus_installer.zip"
17 | weburl_cn="https://download.logitech.com.cn/web/ftp/pub/techsupport/optionsplus/logioptionsplus_installer.zip"
18 | appname="Logi Options+"
19 | installer_name="logioptionsplus_installer"
20 | install_path="$package_unarchived_path/Contents/MacOS/$installer_name"
21 |
22 | echo ""
23 | echo "##############################################################"
24 | echo "$(date) | Starting install of $appname"
25 | echo "##############################################################"
26 | echo ""
27 | echo "Please select the features you want to keep:"
28 | echo "0. quiet: Install the application silently without UI."
29 | echo "1. analytics: Shows or hides choice for users to opt in to share app usage and diagnostics data."
30 | echo "2. flow: Shows or hides the Flow feature. Default value is Yes"
31 | echo "3. sso: Shows or hides ability for users to sign into the app."
32 | echo "4. update: Enables or disables app updates."
33 | echo "5. dfu: Enables or disables device firmware updates."
34 | echo "6. backlight: Enables or disables keyboard backlight on the supported keyboards."
35 | echo "7. logivoice: Enables or disables LogiVoice feature."
36 | echo "8. aipromptbuilder: Enables or disables AI Prompt Builder feature."
37 | echo "9. device-recommendation: Enables or disables device recommendation feature."
38 | echo "10. smartactions: Enables or disables Smart Actions feature."
39 | echo "11. actions-ring: Enables or disables Actions Ring feature."
40 | echo "12. all"
41 | echo "Press enter for none"
42 | echo ""
43 |
44 | read -p "Enter your choices(e.g. 2 6, default is none): " features
45 |
46 | # Initialize all options as "No"
47 | quiet=""
48 | analytics="No"
49 | flow="No"
50 | sso="No"
51 | update="No"
52 | dfu="No"
53 | backlight="No"
54 | logivoice="No"
55 | aipromptbuilder="No"
56 | device_recommendation="No"
57 | smartactions="No"
58 | actions_ring="No"
59 |
60 | # If "all" (12) is selected, set all options to "Yes"
61 | if [[ "$features" == *12* ]]; then
62 | analytics="Yes"
63 | flow="Yes"
64 | sso="Yes"
65 | update="Yes"
66 | dfu="Yes"
67 | backlight="Yes"
68 | logivoice="Yes"
69 | aipromptbuilder="Yes"
70 | device_recommendation="Yes"
71 | smartactions="Yes"
72 | actions_ring="Yes"
73 | else
74 | # Set selected options to "Yes"
75 | for feature in $features; do
76 | case $feature in
77 | 0) quiet="--quiet" ;;
78 | 1) analytics="Yes" ;;
79 | 2) flow="Yes" ;;
80 | 3) sso="Yes" ;;
81 | 4) update="Yes" ;;
82 | 5) dfu="Yes" ;;
83 | 6) backlight="Yes" ;;
84 | 7) logivoice="Yes" ;;
85 | 8) aipromptbuilder="Yes" ;;
86 | 9) device_recommendation="Yes" ;;
87 | 10) smartactions="Yes" ;;
88 | 11) actions_ring="Yes" ;;
89 | *) echo "Invalid option: $feature";;
90 | esac
91 | done
92 | fi
93 |
94 |
95 | echo "Please confirm the following settings:"
96 | echo "quiet: $quiet"
97 | echo "analytics: $analytics"
98 | echo "flow: $flow"
99 | echo "sso: $sso"
100 | echo "update: $update"
101 | echo "dfu: $dfu"
102 | echo "backlight: $backlight"
103 | echo "logivoice: $logivoice"
104 | echo "aipromptbuilder: $aipromptbuilder"
105 | echo "device-recommendation: $device_recommendation"
106 | echo "smartactions: $smartactions"
107 | echo "actions-ring: $actions_ring"
108 | echo ""
109 |
110 | read -p "Are these settings correct? [y/n](default: y): " confirm
111 | if [[ $confirm != "Y" && $confirm != "y" && $confirm != "" ]]; then
112 | echo "Installation cancelled."
113 | exit 1
114 | fi
115 |
116 | pushd "/private/tmp"
117 | if [ -d "$downloaded_path" ]; then
118 | echo "$(date) | Cleaning up previous cache."
119 | rm -rf logioptionsplus
120 | fi
121 |
122 | echo "$(date) | Creating $downloaded_path directory..."
123 | mkdir -p logioptionsplus
124 | popd
125 |
126 | # Detect region
127 | echo "$(date) | Detecting region via https://cloudflare.com/cdn-cgi/trace"
128 | if trace_response=$(curl -s --connect-timeout 10 --max-time 10 "https://cloudflare.com/cdn-cgi/trace" 2>/dev/null) && echo "$trace_response" | grep -q "loc=CN"; then
129 | echo "$(date) | Detected region: China, using CN download URL"
130 | selected_weburl="$weburl_cn"
131 | else
132 | echo "$(date) | Detected region: International (or detection failed), using default download URL"
133 | selected_weburl="$weburl"
134 | fi
135 |
136 | # Downloading the Installer.
137 | echo "$(date) | Downloading $appname Installer from: $selected_weburl"
138 | curl -L -f -o "$downloaded_package_path" "$selected_weburl" || { echo "Failed to download installer"; exit 1; }
139 |
140 | # Unzip the Installer.
141 | package_zip="$downloaded_package_path"
142 | package_unzip="$downloaded_path"
143 | echo "$(date) | Unarchiving $package_zip to $package_unzip..."
144 | ditto -x -k "$package_zip" "$package_unzip" || { echo "Failed to unzip installer"; exit 1; }
145 |
146 | # Configure backup
147 | echo "$(date) | Backing up existing configuration..."
148 | mv ~/Library/"Application Support/LogiOptionsPlus" ~/Library/"Application Support/LogiOptionsPlus_bak"
149 |
150 | echo "$(date) | Uninstalling existing version of $appname"
151 | uninstall_command="$install_path --uninstall"
152 | echo "Executing: $uninstall_command"
153 | sudo "$install_path" --uninstall >> /dev/null 2>&1
154 |
155 | echo "$(date) | Restoring configuration from backup..."
156 | mv ~/Library/"Application Support/LogiOptionsPlus_bak" ~/Library/"Application Support/LogiOptionsPlus"
157 |
158 | # Installing...
159 | # Change the following arguments to 'Yes' if you want to install the module.
160 | # disable analytics,flow,sso,update,dfu,logivoice,aipromptbuilder,device-recommendation,smartactions
161 | echo "$(date) | Installing $appname..."
162 |
163 | # Construct the install command with selected options
164 | install_command="$install_path $quiet --analytics $analytics --flow $flow --sso $sso --update $update --dfu $dfu --backlight $backlight --logivoice $logivoice --aipromptbuilder $aipromptbuilder --device-recommendation $device_recommendation --smartactions $smartactions --actions-ring $actions_ring"
165 | echo "Executing: $install_command"
166 |
167 | sudo "$install_path" \
168 | $quiet \
169 | --analytics $analytics \
170 | --flow $flow \
171 | --sso $sso \
172 | --update $update \
173 | --dfu $dfu \
174 | --backlight $backlight \
175 | --logivoice $logivoice \
176 | --aipromptbuilder $aipromptbuilder \
177 | --device-recommendation $device_recommendation \
178 | --smartactions $smartactions \
179 | --actions-ring $actions_ring >> /dev/null 2>&1
180 |
181 | if [ "$?" = "0" ]; then
182 | echo "$(date) | $appname Installed successfully."
183 | echo "$(date) | Cleaning Up"
184 | rm -rf $downloaded_path
185 | exit 0
186 | else
187 | # Something went wrong here, either the download failed or the install Failed
188 | # intune will pick up the exit status and the IT Pro can use that to determine what went wrong.
189 | # Intune can also return the log file if requested by the admin
190 | echo "$(date) | Failed to install $appname"
191 | exit -1
192 | fi
193 |
--------------------------------------------------------------------------------
/logi-options-plus-mini.ps1:
--------------------------------------------------------------------------------
1 | # Script to install latest Logi Options+ on Windows
2 |
3 | # Variables
4 | $appName = "Logi Options+"
5 | $installerName = "logioptionsplus_installer.exe"
6 | $downloadUrl = "https://download01.logi.com/web/ftp/pub/techsupport/optionsplus/logioptionsplus_installer.exe"
7 | $downloadUrlCN = "https://download.logitech.com.cn/web/ftp/pub/techsupport/optionsplus/logioptionsplus_installer.exe"
8 | $downloadPath = "$env:TEMP\$installerName"
9 | $configPath = "$env:LOCALAPPDATA\LogiOptionsPlus"
10 | $backupPath = "$env:LOCALAPPDATA\LogiOptionsPlus_bak"
11 |
12 | Write-Host ""
13 | Write-Host "##############################################################"
14 | Write-Host "$(Get-Date) | Starting install of $appName"
15 | Write-Host "##############################################################"
16 | Write-Host ""
17 |
18 | # Download the installer
19 | Write-Host "$(Get-Date) | Detecting region via https://cloudflare.com/cdn-cgi/trace"
20 | try {
21 | $traceResponse = Invoke-RestMethod -Uri "https://cloudflare.com/cdn-cgi/trace" -TimeoutSec 10
22 | if ($traceResponse -match "loc=CN") {
23 | Write-Host "$(Get-Date) | Detected region: China, using CN download URL"
24 | $selectedDownloadUrl = $downloadUrlCN
25 | } else {
26 | Write-Host "$(Get-Date) | Detected region: International, using default download URL"
27 | $selectedDownloadUrl = $downloadUrl
28 | }
29 | } catch {
30 | Write-Host "$(Get-Date) | Failed to detect region, using default download URL"
31 | $selectedDownloadUrl = $downloadUrl
32 | }
33 |
34 | Write-Host "$(Get-Date) | Downloading $appName Installer from: $selectedDownloadUrl"
35 | Invoke-WebRequest -Uri $selectedDownloadUrl -OutFile $downloadPath
36 |
37 | # Check if download was successful
38 | if (Test-Path $downloadPath) {
39 | Write-Host "$(Get-Date) | Download completed successfully."
40 | } else {
41 | Write-Host "$(Get-Date) | Failed to download $appName installer."
42 | exit 1
43 | }
44 |
45 | # Interactive Feature Selection
46 | Write-Host ""
47 | Write-Host "Please select the features you want to keep:"
48 | Write-Host "0. quiet: Install the application silently without UI."
49 | Write-Host "1. analytics: Shows or hides choice for users to opt in to share app usage and diagnostics data."
50 | Write-Host "2. flow: Shows or hides the Flow feature. Default value is Yes"
51 | Write-Host "3. sso: Shows or hides ability for users to sign into the app."
52 | Write-Host "4. update: Enables or disables app updates."
53 | Write-Host "5. dfu: Enables or disables device firmware updates."
54 | Write-Host "6. backlight: Enables or disables keyboard backlight on the supported keyboards."
55 | Write-Host "7. logivoice: Enables or disables LogiVoice feature."
56 | Write-Host "8. aipromptbuilder: Enables or disables AI Prompt Builder feature."
57 | Write-Host "9. device-recommendation: Enables or disables device recommendation feature."
58 | Write-Host "10. smartactions: Enables or disables Smart Actions feature."
59 | Write-Host "11. actions-ring: Enables or disables Actions Ring feature."
60 | Write-Host "12. all"
61 | Write-Host "Press enter for none"
62 | Write-Host ""
63 |
64 | # Get user input for feature selection
65 | $selectedFeatures = Read-Host "Enter your choices (e.g. 2 6, default is none)"
66 | if ($selectedFeatures -eq "") {
67 | $selectedFeatures = "none"
68 | }
69 |
70 | # Initialize all options as "No"
71 | $quiet = " "
72 | $analytics = "No"
73 | $flow = "No"
74 | $sso = "No"
75 | $update = "No"
76 | $dfu = "No"
77 | $backlight = "No"
78 | $logivoice = "No"
79 | $aipromptbuilder = "No"
80 | $device_recommendation = "No"
81 | $smartactions = "No"
82 | $actions_ring = "No"
83 |
84 | # If "all" (12) is selected, set all options to "Yes"
85 | if ($selectedFeatures -eq "12") {
86 | $quiet = " "
87 | $analytics = "Yes"
88 | $flow = "Yes"
89 | $sso = "Yes"
90 | $update = "Yes"
91 | $dfu = "Yes"
92 | $backlight = "Yes"
93 | $logivoice = "Yes"
94 | $aipromptbuilder = "Yes"
95 | $device_recommendation = "Yes"
96 | $smartactions = "Yes"
97 | $actions_ring = "Yes"
98 | } else {
99 | # Set selected options to "Yes"
100 | $featureList = $selectedFeatures -split " "
101 | foreach ($feature in $featureList) {
102 | switch ($feature) {
103 | "0" { $quiet = "/quiet" }
104 | "1" { $analytics = "Yes" }
105 | "2" { $flow = "Yes" }
106 | "3" { $sso = "Yes" }
107 | "4" { $update = "Yes" }
108 | "5" { $dfu = "Yes" }
109 | "6" { $backlight = "Yes" }
110 | "7" { $logivoice = "Yes" }
111 | "8" { $aipromptbuilder = "Yes" }
112 | "9" { $device_recommendation = "Yes" }
113 | "10" { $smartactions = "Yes" }
114 | "11" { $actions_ring = "Yes" }
115 | default { Write-Host "Invalid option: $feature" }
116 | }
117 | }
118 | }
119 |
120 | # Confirm settings with the user
121 | Write-Host ""
122 | Write-Host "Please confirm the following settings:"
123 | Write-Host "quiet: $quiet"
124 | Write-Host "analytics: $analytics"
125 | Write-Host "flow: $flow"
126 | Write-Host "sso: $sso"
127 | Write-Host "update: $update"
128 | Write-Host "dfu: $dfu"
129 | Write-Host "backlight: $backlight"
130 | Write-Host "logivoice: $logivoice"
131 | Write-Host "aipromptbuilder: $aipromptbuilder"
132 | Write-Host "device-recommendation: $device_recommendation"
133 | Write-Host "smartactions: $smartactions"
134 | Write-Host "actions-ring: $actions_ring"
135 | Write-Host ""
136 |
137 | $confirm = Read-Host "Are these settings correct? [y/n](default: y)"
138 | if ($confirm -ne "Y" -and $confirm -ne "y" -and $confirm -ne "") {
139 | Write-Host "$(Get-Date) | Installation cancelled."
140 | exit 1
141 | }
142 |
143 | # Backup existing configuration
144 | if (Test-Path $configPath) {
145 | Write-Host "$(Get-Date) | Backing up existing configuration..."
146 | if (Test-Path $backupPath) {
147 | Remove-Item $backupPath -Recurse -Force
148 | }
149 | Copy-Item $configPath $backupPath -Recurse
150 | Write-Host "$(Get-Date) | Configuration backed up to $backupPath"
151 | }
152 |
153 | # Uninstall existing version
154 | Write-Host "$(Get-Date) | Uninstalling existing version of $appName..."
155 | Start-Process -FilePath $downloadPath -ArgumentList "/uninstall" -Wait -Verb RunAs
156 |
157 | # Restore configuration backup
158 | if (Test-Path $backupPath) {
159 | Write-Host "$(Get-Date) | Restoring configuration from backup..."
160 | if (Test-Path $configPath) {
161 | Remove-Item $configPath -Recurse -Force
162 | }
163 | Move-Item -Path $backupPath -Destination $configPath
164 | Write-Host "$(Get-Date) | Configuration restored from $backupPath"
165 | }
166 |
167 | # Install new version
168 | Write-Host "$(Get-Date) | Installing $appName..."
169 | $installArgs = $quiet, "/analytics", $analytics, "/flow", $flow, "/sso", $sso, "/update", $update, "/dfu", $dfu, "/backlight", $backlight, "/logivoice", $logivoice, "/aipromptbuilder", $aipromptbuilder, "/device-recommendation", $device_recommendation, "/smartactions", $smartactions, "/actions-ring", $actions_ring
170 | $process = Start-Process -FilePath $downloadPath -ArgumentList $installArgs -PassThru -Verb RunAs
171 | $Handle = $process.Handle
172 | $process.WaitForExit()
173 |
174 | if ($process.ExitCode -eq 0) {
175 | Write-Host "$(Get-Date) | $appName installed successfully."
176 | # Clean up
177 | Remove-Item $downloadPath -Force
178 | Write-Host "$(Get-Date) | Cleaned up temporary files."
179 | Write-Host "Installation completed, press any key to exit..."
180 | [void][System.Console]::ReadKey($true)
181 | exit 0
182 | } else {
183 | Write-Host "$(Get-Date) | Failed to install $appName. Exit code: $($process.ExitCode)"
184 | Write-Host "Installation completed, press any key to exit..."
185 | [void][System.Console]::ReadKey($true)
186 | exit 1
187 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------