├── Previews
├── img-more.png
├── img-emoji.png
├── img-enable.png
├── img-networks.png
└── img-networks2.png
├── README.md
├── wifimenu
└── COPYING
/Previews/img-more.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/podobu/wifimenu/HEAD/Previews/img-more.png
--------------------------------------------------------------------------------
/Previews/img-emoji.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/podobu/wifimenu/HEAD/Previews/img-emoji.png
--------------------------------------------------------------------------------
/Previews/img-enable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/podobu/wifimenu/HEAD/Previews/img-enable.png
--------------------------------------------------------------------------------
/Previews/img-networks.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/podobu/wifimenu/HEAD/Previews/img-networks.png
--------------------------------------------------------------------------------
/Previews/img-networks2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/podobu/wifimenu/HEAD/Previews/img-networks2.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # wifimenu
2 |
3 | A Bash script to connect to a Wi-Fi network using NetworkManager and a launcher.
4 |
5 | 
6 | 
7 | 
8 | 
9 | 
10 |
11 | Launcher style in the screenshots above is not include.
12 |
13 | ## Features
14 |
15 | - Enable/Disable Wi-Fi device
16 | - Select the Wi-Fi interface to use
17 | - Connection options: forget, DNS, static IP...
18 | - Wireguard support
19 | - Connect to a hidden Wi-Fi network
20 | - Disconnect from the current connected Wi-Fi network
21 | - Shows if Wi-Fi network is secure via WPA 1/2
22 | - Shows signal level visually
23 | - A submenu to contain all of the above options
24 | - Desktop notifications via notify-send
25 | - Translate to your language by modifying script variables in a configuration file
26 | - Can be use with your preferred launcher:
27 | - wofi
28 | - rofi
29 | - wmenu
30 | - dmenu
31 | - bemenu
32 | - Or a custom one!
33 |
34 | ## Considerations
35 |
36 | - Does not show Wi-Fi networks with WEP security
37 | - When using this script with dmenu launcher, the botton to hide passwords does not work
38 |
39 | ## Dependencies
40 |
41 | ### Required
42 |
43 | - Bash (wifimenu was developed for Bash 5. I don't know if it works on previous versions or with other shells)
44 | - NetworkManager
45 | - A menu launcher
46 | - A [Nerd Fonts](https://www.nerdfonts.com/) font or a font that support emojis
47 |
48 | ### Optional
49 |
50 | - libnotify (optional)
51 |
52 | ## Translation and customization
53 |
54 | ### Configuration file location
55 |
56 | The following files are sourced in the corresponding order. If one of the files is found, the following files will not be searched:
57 |
58 | 1. \$XDG\_CONFIG\_HOME/\$program\_name/config
59 | 2. \$HOME/.config/\$program\_name/config
60 | 3. \$HOME/.\$program\_name
61 |
62 | The variable `program_name` is set to `basename $0`.
63 |
64 | Any modification of the program can be made in the configuration file to avoid losing modifications when updating the script.
65 | Command line options overwrite this file.
66 |
67 | ### Variables for configuration file
68 |
69 | Some variables of interest may be:
70 |
71 | - **launcher**: A string defining the launcher (default is 'wofi'). The possible values are:
72 | - wofi
73 | - rofi
74 | - wmenu
75 | - dmenu
76 | - bemenu
77 | - custom
78 | - **custom_opts**: It's an asosiative array with 4 values that must be set when `launcher` variable is set to 'custom'.
79 | - **custom_opts[launcher]**: Launcher command or path.
80 | - **custom_opts[insensitive]**: Launcher options for case-insensitive input.
81 | - **custom_opts[sensitive]**: Launcer options for case-sensitive input.
82 | - **custom_opts[password]**: Launcher options for password-prompt mode.
83 | - **submenu**: If set, shows Wi-Fi options in a submenu (unset by default).
84 | - **emoji**: If set, shows emoji icons instead of Nerd Fonts icons.
85 | - **wireguard**: If set, shows wireguard connections option in the main manu (unset by default).
86 | - **notifications**: If set, sends desktop notifications (if notify-send can be found by the user's PATH, then it is set).
87 |
88 | That a variable is set means that it has a value assigned to it (any value). For example:
89 |
90 | ```sh
91 | launcher='rofi' # It's set
92 | submenu=1 # It's set
93 | wireguard= # It's not set
94 | ```
95 |
96 | ### Custom launcher syntax
97 |
98 | The custom launcher options must be given with the corresponding dashes.
99 |
100 | ```sh
101 | # In config file
102 | custom_opts[launcher]='wofi'
103 | custom_opts[insensitive]='--dmenu --insensitive --prompt'
104 | custom_opts[sensitive]='-d -p'
105 | custom_opts[password]='--dmenu --password -p'
106 |
107 | # or
108 |
109 | # In command line
110 | wifimenu --custom wofi '--dmenu --insensitive --prompt' '-d -p' '-d --password --prompt'
111 | ```
112 |
113 | Note that the last flag must be the one to set the prompt.
114 |
115 | If your launcher don't support password prompt, just set it case-sensitive.
116 |
117 | ### Icons
118 |
119 | By default Nerd Fonts icons are use. If you don't want to use a Nerd Fonts font, emojis can be use for icons.
120 |
121 | ```sh
122 | # In config file
123 | emoji=1
124 |
125 | # or
126 |
127 | # In command line
128 | wifimenu --emoji
129 | ```
130 |
131 | Each icon can be customized in the configuration file setting the following variables:
132 |
133 | ```sh
134 | icon_dragon=
135 | icon_config=
136 | icon_close=
137 | icon_check=
138 | icon_eye=
139 | icon_eye_closed=
140 | icon_saved=
141 | icon_automatic=
142 | icon_wifi_enable=
143 | icon_wifi_disable=
144 | icon_wifi_1=
145 | icon_wifi_2=
146 | icon_wifi_3=
147 | icon_wifi_4=
148 | icon_wifi_5=
149 | icon_wifi_6=
150 | icon_interface=
151 | icon_4_1=
152 | icon_4_2=
153 | icon_6_1=
154 | icon_6_2=
155 | icon_plug=
156 | icon_trash=
157 | icon_pen=
158 | icon_wireless=
159 | icon_net_1=
160 | icon_net_2=
161 | icon_net_3=
162 | icon_net_4=
163 | icon_net_5=
164 | icon_unlock=
165 | icon_on=
166 | icon_off=
167 | ```
168 |
169 | Which icon does each variable belong to? Find out on your own, to much documentation.
170 |
171 | If you customize the icons, it's better to set just one character (UTF-8 is fine) for each one,
172 | as it could have unexpected behavior otherwise, or not, it is just not tested.
173 |
174 | ### Translation
175 |
176 | The following variables can be changed in the the configuration file to translate the text:
177 |
178 | ```sh
179 | tr_scanning_networks='Scanning networks'
180 | tr_scanning_networks_complete='Scanning completed'
181 | tr_submenu_message='More options'
182 | tr_disable_message='Disable Wi-Fi'
183 | tr_enable_message='Enable Wi-Fi'
184 | tr_interface_message='Interface:'
185 | tr_known_connections_message='Known connections'
186 | tr_autoconnect_message='Autoconnect'
187 | tr_ipv4_config_message='DHCP configuration'
188 | tr_dns4_message='DNS IPv4'
189 | tr_ipv6_config_message='IPv6 configuration'
190 | tr_dns6_message='DNS IPv6'
191 | tr_autoip_message='Automatic IP configuration'
192 | tr_autodns_message='Automatic DNS'
193 | tr_address_message='Addresses'
194 | tr_gateway_message='Gateway:'
195 | tr_forget_message='Forget connection'
196 | tr_wireguard_message='Wireguard connections'
197 | tr_wireguard_enable_message='Enable VPN'
198 | tr_rename_connection_message='Rename connection'
199 | tr_hidden_message='Connect to a hidden network'
200 |
201 | tr_main_menu_prompt='Wi-Fi SSID:'
202 | tr_select_interface_prompt='Interface to use:'
203 | tr_ask_password_prompt='Password:'
204 | tr_menu_dns_prompt='New DNS:'
205 | tr_menu_dns_sure_prompt_1='Remove DNS'
206 | tr_menu_dns_sure_prompt_2='?'
207 | tr_menu_ip_config_addresses_prompt='address1/CIDR_mask,address2/CIDR_mask,...'
208 | tr_menu_ip_config_gateway_prompt='New gateway:'
209 | tr_menu_addresses_prompt='New address:'
210 | tr_menu_addresses_sure_prompt_1='Remove address'
211 | tr_menu_addresses_sure_prompt_2='?'
212 | tr_forget_connection_prompt='Connection to forget:'
213 | tr_forget_connection_sure_prompt_1='Forget'
214 | tr_forget_connection_sure_prompt_2='?'
215 | tr_rename_connection_prompt='New name:'
216 | tr_connect_hidden_prompt='Network name:'
217 |
218 | tr_notice_connected_summary='Connected to network'
219 | tr_notice_disconnected_summary='Disconnected from network'
220 | tr_notice_error_summary='Connection error'
221 | tr_notice_enable_wifi_summary='Wi-Fi enabled'
222 | tr_notice_disable_wifi_summary='Wi-Fi disabled'
223 | tr_notice_connected_wifi_body='Successful connection to Wi-Fi network'
224 | tr_notice_disconnected_wifi_body='Successful disconnection from Wi-Fi network'
225 | tr_notice_error_wifi_connection_body='An error occurred while trying to connect to the Wi-Fi network'
226 | tr_notice_error_wifi_disconnection_body='An error occurred while trying to disconnect to the Wi-Fi network'
227 | tr_notice_connected_vpn_body='Successful connection to VPN'
228 | tr_notice_disconnected_vpn_body='Successful disconnection from VPN'
229 | tr_notice_error_vpn_connection_body='An error occurred while trying to connect to the VPN'
230 | tr_notice_error_vpn_disconnection_body='An error occurred while trying to disconnect to the VPN'
231 | tr_notice_enable_wifi_body='Wi-Fi was successfully enabled'
232 | tr_notice_disable_wifi_body='Wi-Fi was successfully disabled'
233 | ```
234 |
235 | ## Wireguard support
236 |
237 | The wireguard connection must already exist. To import a wireguard profile FILE.conf:
238 | ```sh
239 | sudo nmcli connection import type wireguard file /PATH/TO/FILE.conf
240 | ```
241 | Replace `/PATH/TO/FILE.conf` with the actual path of your *.conf* wireguard file.
242 |
243 | To learn more about wireguard configuration in NetworkManager, see:
244 |
245 | ## Donations
246 |
247 | Monero:
248 | ```txt
249 | 8C7q6JRYpehXAWotiHhrnQ4PuVKnAJZSVQ1pTM8xXXRtUdS9ofAyrLy6chP5SvmKDN2LWvESLME8W897vdQGf4rM4DQchhw
250 | ```
251 | PayPal:
252 | ```txt
253 | podopodadobu@gmail.com
254 | ```
255 |
256 | ## License
257 |
258 | wifimenu is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
259 |
260 | wifimenu is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
261 |
262 | You should have received a copy of the GNU General Public License along with this program. If not, see .
263 |
--------------------------------------------------------------------------------
/wifimenu:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright © 2024 Jesús Arenas
4 |
5 | # This program is free software: you can redistribute it and/or modify it under the terms
6 | # of the GNU General Public License as published by the Free Software Foundation, either
7 | # version 3 of the License, or (at your option) any later version.
8 | #
9 | # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
10 | # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11 | # See the GNU General Public License for more details.
12 | #
13 | # You should have received a copy of the GNU General Public License along with this program.
14 | # If not, see .
15 |
16 | print_usage() {
17 | echo -n "\
18 | Usage: $program_name [OPTIONS...]
19 |
20 | Displays a menu with a launcher to select a Wi-Fi network.
21 |
22 | Options:
23 | -s, --submenu Show Wi-Fi options in a submenu.
24 | -S, --no-submenu Do not show Wi-Fi options in a submenu (default).
25 | -w, --wireguard Show wireguard connections option.
26 | -W, --no-wireguard Do not show wireguard connections option
27 | (default).
28 | -j, --emoji Use emojis instead of Nerd Fonts font for icons.
29 | -J, --no-emoji Use Nerd Fonts font instead of emojis for icons
30 | (default).
31 | --no-notify Do not send notifications.
32 |
33 | -i INTERFACE
34 | --interface INTERFACE Start using Wi-Fi interface INTERFACE.
35 |
36 | --wofi Use wofi launcher (default).
37 | --rofi Use rofi launcher.
38 | --wmenu Use wmenu launcher.
39 | --dmenu Use dmenu launcher.
40 | --bemenu Use bemenu launcher.
41 | --custom LAUNCHER 1 2 3 Use launcher LAUNCHER with options for
42 | case-insensitive (1), case-sensitive (2)
43 | and password-prompt (3) input.
44 |
45 | -h, --help Print this help and exit.
46 | -v, --version Print version and other info and exit.
47 |
48 | Nerd Fonts icons are used. A font can be downloaded at:
49 | https://www.nerdfonts.com/
50 |
51 | Dependencies:
52 | - NetworkManager.
53 | - A menu launcher.
54 |
55 | About dmenu:
56 | Hide password button does not work, since dmenu does not support this.
57 |
58 | Exit status:
59 | Returns 1 if a wrong option is given.
60 | Returns 2 if no Wi-Fi interface is detected with nmcli.
61 | if an unknown interface is given with -i.
62 | Returns 3 if the launcher selected is not installed.
63 | Returns 4 if custom launcher options are not completely defined.
64 | Returns 0 otherwise.
65 |
66 | This program is licensed under GPL-3.0-or-later.
67 | "
68 | exit 0
69 | }
70 |
71 | print_about() {
72 | echo -n "\
73 | wifimenu 2.7.1
74 | Copyright © 2024 Jesús Arenas
75 | Official repository: https://github.com/podobu/wifimenu
76 | License GPLv3+: GNU GPL version 3 or later .
77 | "
78 | exit 0
79 | }
80 |
81 | display_menu() {
82 | declare form=$1
83 | declare prompt="$2"
84 |
85 | case "$launcher" in
86 | 'wofi')
87 | case $form in
88 | 1) wofi --dmenu --insensitive --prompt "$prompt" ;;
89 | 2) wofi --dmenu --prompt "$prompt" ;;
90 | 3) wofi --dmenu --password --prompt "$prompt" ;;
91 | esac
92 | ;;
93 | 'rofi')
94 | case $form in
95 | 1) rofi -dmenu -i -p "$prompt" ;;
96 | 2) rofi -dmenu -p "$prompt" ;;
97 | 3) rofi -dmenu -password -p "$prompt" ;;
98 | esac
99 | ;;
100 | 'wmenu')
101 | case $form in
102 | 1) wmenu -l 10 -i -p "$prompt" ;;
103 | 2) wmenu -l 10 -p "$prompt" ;;
104 | 3) wmenu -l 10 -P -p "$prompt" ;;
105 | esac
106 | ;;
107 | 'dmenu')
108 | case $form in
109 | 1) dmenu -l 10 -i -p "$prompt" ;;
110 | 2) dmenu -l 10 -p "$prompt" ;;
111 | 3) dmenu -l 10 -p "$prompt" ;; # Cannot hide the password
112 | esac
113 | ;;
114 | 'bemenu')
115 | case $form in
116 | 1) bemenu --list 10 --ignorecase --prompt "$prompt" ;;
117 | 2) bemenu --list 10 --prompt "$prompt" ;;
118 | 3) bemenu --list 10 --password "indicator" --prompt "$prompt" ;;
119 | esac
120 | ;;
121 | 'custom')
122 | case $form in
123 | 1) "${custom_opts[launcher]}" ${custom_opts[insensitive]} "$prompt" ;;
124 | 2) "${custom_opts[launcher]}" ${custom_opts[sensitive]} "$prompt" ;;
125 | 3) "${custom_opts[launcher]}" ${custom_opts[password]} "$prompt" ;;
126 | esac
127 | ;;
128 | *)
129 | echo "$program_name: Unknown launcher. See variable 'launcher'." >&2
130 | exit 1
131 | ;;
132 | esac
133 | }
134 |
135 | send_notification() {
136 | [ -z "$notifications" ] && return
137 | declare specific icon
138 | declare summary="$3"
139 | declare body="$4"
140 | # Notification category format specified by freedesktop.org
141 | case "$1" in
142 | 1) specific='connected' ;;
143 | 2) specific='disconnected' ;;
144 | 3) specific='error' ;;
145 | esac
146 | # Icon naming format specified by freedesktop.org
147 | case "$2" in
148 | 1) icon='network-wireless' ;;
149 | 2) icon='network-offline' ;;
150 | 3) icon='network-transmit-receive' ;;
151 | 4) icon='network-error' ;;
152 | esac
153 | notify-send --app-name "$program_name" --category "network.$specific" --icon "$icon" --transient "$summary" "$body"
154 | }
155 |
156 | ask_password() {
157 | declare middle_option=${1:-}
158 | declare wifi_password="$icon_eye"
159 | until [[ -z "$wifi_password" || "$wifi_password" == !(${icon_eye_closed}*|${icon_eye}*) ]]; do
160 | if [[ "$wifi_password" =~ ^$icon_eye_closed ]]; then
161 | wifi_password=$(echo -e "$icon_eye${middle_option}\n$icon_close" | display_menu 3 "$tr_ask_password_prompt")
162 | else
163 | wifi_password=$(echo -e "$icon_eye_closed${middle_option}\n$icon_close" | display_menu 2 "$tr_ask_password_prompt")
164 | fi
165 | done
166 | echo "$wifi_password"
167 | }
168 |
169 | select_interface() {
170 | chosen=$( (for (( i = 0; i < ${#interfaces[@]}; i++ )); do echo "$icon_interface ${interfaces[$i]}" ; done; echo "$icon_close") | display_menu 1 "$tr_select_interface_prompt")
171 |
172 | if [ -z "$chosen" ]; then
173 | exit 0
174 | elif [[ "$chosen" =~ ^$icon_close ]]; then
175 | return
176 | else
177 | interface_to_use="${chosen:3}"
178 | fi
179 | }
180 |
181 | menu_addresses() {
182 | declare connection="$1"
183 | declare ipv="$2"
184 | declare -a addresses_list
185 | declare -i addresses_list_length
186 | declare sure
187 | while true; do
188 | addresses_list=($(nmcli --get-values ipv${ipv}.addresses connection show $connection | sed 's/,//g'))
189 | chosen="$( (for i in "${addresses_list[@]}"; do echo "$i"; done; echo "$icon_close") | display_menu 1 "$tr_menu_addresses_prompt")"
190 |
191 | if [ -z "$chosen" ]; then
192 | exit 0
193 | elif [[ "$chosen" =~ ^$icon_close ]]; then
194 | return
195 | fi
196 |
197 | addresses_list_length=${#addresses_list[@]}
198 |
199 | for ((i=0; i < $addresses_list_length; i++)) do
200 | if [ "$chosen" = "${addresses_list[$i]}" ]; then
201 | sure=$(echo -e "$icon_check\n$icon_close" | display_menu 1 "$tr_menu_addresses_sure_prompt_1 ${chosen}$tr_menu_addresses_sure_prompt_2")
202 | if [ -z "$sure" ]; then
203 | exit 0
204 | elif [[ "$sure" =~ ^$icon_check ]]; then
205 | if [ $addresses_list_length -eq 1 ]; then
206 | nmcli connection modify uuid "$connection" ipv${ipv}.gateway ''
207 | nmcli connection modify uuid "$connection" ipv${ipv}.method auto
208 | fi
209 | nmcli connection modify uuid "$connection" -ipv${ipv}.addresses $chosen
210 | [ $addresses_list_length -eq 1 ] && break 2
211 | fi
212 | continue 2
213 | fi
214 | done
215 |
216 | nmcli connection modify uuid "$connection" +ipv${ipv}.addresses $chosen
217 |
218 | done
219 | }
220 |
221 | menu_ip_config() {
222 | declare chosen_connection="$1"
223 | declare connection="$2"
224 | declare ipv="$3"
225 | declare autoip_state autodns_state message new_addresses new_gateway
226 | while true; do
227 | autoip_state="$([ "$(nmcli --get-values ipv${ipv}.method connection show "$connection")" = "auto" ] && echo "$icon_on" || echo "$icon_off")"
228 |
229 | if [ "$autoip_state" = "$icon_on" ]; then
230 | autodns_state="$([ "$(nmcli --get-values ipv${ipv}.ignore-auto-dns connection show "$connection")" = "no" ] && echo "$icon_on" || echo "$icon_off")"
231 | message="$autodns_message $autodns_state"
232 | else
233 | message="$address_message\n$gateway_message $(nmcli --get-values ipv${ipv}.gateway connection show "$connection")"
234 | fi
235 |
236 | chosen="$(echo -e "$autoip_message $autoip_state\n$message\n$icon_close" | display_menu 1 "$chosen_connection")"
237 |
238 | case "$chosen" in
239 | '') exit 0 ;;
240 | "$icon_close"*) return ;;
241 | "$icon_net_1"*)
242 | if [ "$autoip_state" = "$icon_on" ]; then
243 | if [ -z "$(nmcli --get-values ipv4.addresses connection show "$connection")" ]; then
244 | new_addresses="$(echo "$icon_close" | display_menu 1 "$tr_menu_ip_config_addresses_prompt")"
245 | if [ -z "$new_addresses" ]; then
246 | exit 0
247 | elif [[ "$new_addresses" =~ ^$icon_close ]]; then
248 | continue
249 | fi
250 | nmcli connection modify uuid "$connection" ipv${ipv}.addresses "$new_addresses" || continue
251 | fi
252 | nmcli connection modify uuid "$connection" ipv${ipv}.method manual
253 | else
254 | nmcli connection modify uuid "$connection" ipv${ipv}.gateway ''
255 | nmcli connection modify uuid "$connection" ipv${ipv}.method auto
256 | fi
257 | ;;
258 | "$icon_net_4"*) [ "$autodns_state" = "$icon_on" ] && nmcli connection modify uuid "$connection" ipv${ipv}.ignore-auto-dns yes || nmcli connection modify uuid "$connection" ipv${ipv}.ignore-auto-dns no ;;
259 | "$icon_net_3"*) menu_addresses "$connection" "$ipv" ;;
260 | "$icon_net_2"*)
261 | new_gateway="$(echo "$icon_close" | display_menu 1 "$tr_menu_ip_config_gateway_prompt")"
262 | if [ -z "$new_gateway" ]; then
263 | exit 0
264 | elif [[ "$new_gateway" =~ ^$icon_close ]]; then
265 | continue
266 | fi
267 | nmcli connection modify uuid "$connection" ipv${ipv}.gateway "$new_gateway"
268 | ;;
269 | esac
270 | done
271 | }
272 |
273 | menu_dns() {
274 | declare connection="$1"
275 | declare ipv="$2"
276 | declare -a dns_list
277 | declare sure
278 | while true; do
279 | dns_list=($(nmcli --get-values ipv${ipv}.dns connection show $connection | sed 's/,/ /g'))
280 | chosen="$( (for i in "${dns_list[@]}"; do echo "$i"; done; echo "$icon_close") | display_menu 1 "$tr_menu_dns_prompt")"
281 |
282 | if [ -z "$chosen" ]; then
283 | exit 0
284 | elif [[ "$chosen" =~ ^$icon_close ]]; then
285 | return
286 | fi
287 |
288 | for ((i=0; i < ${#dns_list[@]}; i++)) do
289 | if [ "$chosen" = "${dns_list[$i]}" ]; then
290 | sure=$(echo -e "$icon_check\n$icon_close" | display_menu 1 "$tr_menu_dns_sure_prompt_1 ${chosen}$tr_menu_dns_sure_prompt_2")
291 | if [ -z "$sure" ]; then
292 | exit 0
293 | elif [[ "$sure" =~ ^$icon_check ]]; then
294 | nmcli connection modify uuid "$connection" -ipv${ipv}.dns $chosen
295 | fi
296 | continue 2
297 | fi
298 | done
299 |
300 | nmcli connection modify uuid "$connection" +ipv${ipv}.dns $chosen
301 |
302 | done
303 | }
304 |
305 | forget_connection() {
306 | declare chosen_connection="$1"
307 | declare connection="$2"
308 | declare sure="$(echo -e "$icon_check\n$icon_close" | display_menu 1 "$tr_forget_connection_sure_prompt_1 ${chosen_connection}$tr_forget_connection_sure_prompt_2")"
309 |
310 | if [ -z "$sure" ]; then
311 | exit 0
312 | elif [[ "$sure" =~ ^$icon_check ]]; then
313 | nmcli connection delete uuid "$connection" && return 0
314 | fi
315 |
316 | return 1
317 | }
318 |
319 | rename_connection() {
320 | declare connection="$1"
321 | new_name="$(echo "$icon_close" | display_menu 1 "$tr_rename_connection_prompt")"
322 |
323 | if [ -z "$new_name" ]; then
324 | exit 0
325 | elif [[ "$new_name" =~ ^$icon_close ]]; then
326 | return 1
327 | fi
328 |
329 | nmcli connection modify uuid "$connection" connection.id "$new_name"
330 | }
331 |
332 | menu_connection() {
333 | declare chosen_connection="$1"
334 | declare connection="$2"
335 | declare autoconnect_state
336 | while true; do
337 | autoconnect_state="$([ "$(nmcli --get-values connection.autoconnect connection show "$connection")" = "yes" ] && echo "$icon_on" || echo "$icon_off")"
338 | chosen="$(echo -e "$autoconnect_message $autoconnect_state\n$ipv4_config_message\n$dns4_message\n$ipv6_config_message\n$dns6_message\n$forget_message\n$icon_close" | display_menu 1 "$chosen_connection")"
339 |
340 | case "$chosen" in
341 | '') exit 0 ;;
342 | "$icon_close"*) return ;;
343 | "$icon_automatic"*) [ "$autoconnect_state" = "$icon_on" ] && nmcli connection modify uuid "$connection" autoconnect no || nmcli connection modify uuid "$connection" autoconnect yes ;;
344 | "$icon_4_1"*) menu_ip_config "$@" "4" ;;
345 | "$icon_4_2"*) menu_dns "$connection" "4" ;;
346 | "$icon_6_1"*) menu_ip_config "$@" "6" ;;
347 | "$icon_6_2"*) menu_dns "$connection" "6" ;;
348 | "$icon_trash"*) forget_connection "$@" && return ;;
349 | esac
350 | done
351 | }
352 |
353 | menu_wireguard_connection(){
354 | declare chosen_connection="$1"
355 | declare connection="$2"
356 | declare state autoconnect_state new_name
357 | while true; do
358 | state="$([ "$(nmcli --get-values GENERAL.STATE connection show "$connection")" = "activated" ] && echo "$icon_on" || echo "$icon_off")"
359 | autoconnect_state="$([ "$(nmcli --get-values connection.autoconnect connection show "$connection")" = "yes" ] && echo "$icon_on" || echo "$icon_off")"
360 | chosen="$(echo -e "$wireguard_enable_message $state\n$autoconnect_message $autoconnect_state\n$rename_connection_message\n$forget_message\n$icon_close" | display_menu 1 "$chosen_connection")"
361 |
362 | case "$chosen" in
363 | '') exit 0 ;;
364 | "$icon_close"*) return ;;
365 | "$icon_plug"*) [ "$state" = "$icon_on" ] && {
366 | nmcli connection down uuid "$connection" &&
367 | send_notification 1 2 "$tr_notice_disconnected_summary" "$tr_notice_disconnected_vpn_body" ||
368 | send_notification 3 4 "$tr_notice_error_summary" "$tr_notice_error_vpn_disconnection_body"
369 | } || {
370 | nmcli connection up uuid "$connection" &&
371 | send_notification 1 3 "$tr_notice_connected_summary" "$tr_notice_connected_vpn_body" ||
372 | send_notification 3 4 "$tr_notice_error_summary" "$tr_notice_error_vpn_connection_body"
373 | }
374 | ;;
375 | "$icon_automatic"*) [ "$autoconnect_state" = "$icon_on" ] && nmcli connection modify uuid "$connection" autoconnect no || nmcli connection modify uuid "$connection" autoconnect yes ;;
376 | "$icon_pen"*) rename_connection "$connection" && chosen_connection="$new_name" ;;
377 | "$icon_trash"*) forget_connection "$@" && return ;;
378 | esac
379 | done
380 | }
381 |
382 | menu_known_connections() {
383 | case "$1" in
384 | "wifi" | "802-11-wireless")
385 | connection_type="802-11-wireless"
386 | icon="$icon_wireless"
387 | menu_type="menu_connection"
388 | ;;
389 | "wireguard")
390 | connection_type="$1"
391 | icon="$icon_net_5"
392 | menu_type="menu_wireguard_connection"
393 | ;;
394 | esac
395 | declare -a profiles_list
396 | while true; do
397 |
398 | mapfile -t profiles_list < <(nmcli --colors no --get-values TYPE,UUID,NAME connection show | awk -F ':' -v ct="$connection_type" -v icon="$icon" '$1 == ct {print $2 "\\0" icon " " $3}')
399 | chosen=$( (for i in "${profiles_list[@]}"; do echo -e "$i" | cut --delimiter $'\0' --fields 2; done; echo "$icon_close") | display_menu 1 "$tr_known_connections_message")
400 |
401 | if [ -z "$chosen" ]; then
402 | exit 0
403 | elif [[ "$chosen" =~ ^$icon_close ]]; then
404 | return
405 | fi
406 |
407 | for i in "${profiles_list[@]}"; do
408 | if [ "$chosen" = "$(echo -e "$i" | cut --delimiter $'\0' --fields 2)" ]; then
409 | eval "$menu_type \"$(sed 's/"/\\"/g' <<< "${chosen:3}")\" \"$(echo -e "$i" | cut --delimiter $'\0' --fields 1)\""
410 | break
411 | fi
412 | done
413 |
414 | done
415 | }
416 |
417 | connect_hidden() {
418 | declare wifi_name="$(echo "$icon_close"| display_menu 2 "$tr_connect_hidden_prompt")"
419 |
420 | if [ -z "$wifi_name" ]; then
421 | exit 0
422 | elif [[ "$wifi_name" =~ ^$icon_close ]]; then
423 | return
424 | fi
425 |
426 | declare wifi_password="$(ask_password "\n$icon_unlock")"
427 |
428 | if [ -z "$wifi_password" ]; then
429 | exit 0
430 | elif [[ "$wifi_password" =~ ^$icon_unlock ]]; then
431 | wifi_password=""
432 | elif [[ "$wifi_password" =~ ^$icon_close ]]; then
433 | return
434 | fi
435 |
436 | nmcli --wait 15 device wifi connect "$wifi_name" hidden yes password "$wifi_password" &&
437 | send_notification 1 1 "$tr_notice_connected_summary" "$tr_notice_connected_wifi_body" ||
438 | send_notification 3 4 "$tr_notice_error_summary" "$tr_notice_error_wifi_connection_body"
439 | }
440 |
441 | connect_wifi() {
442 | declare wifi_security="${1:0:${#icon_wifi_1}}"
443 | declare wifi_ssid="${1#* }"
444 | declare -a connections_matching
445 |
446 | mapfile -t connections_matching < <(nmcli --colors no --get-values NAME connection show | grep --color=never --word-regexp --fixed-strings "$wifi_ssid" )
447 |
448 | for (( i = 0; i < ${#connections_matching[@]}; i++ )); do
449 | if [ $(nmcli --get-values connection.interface-name connection show "${connections_matching[$i]}") = "$interface_to_use" ]; then
450 | if [[ "$wifi_security" =~ ^$icon_check ]]; then
451 | nmcli connection down id "${connections_matching[$i]}" &&
452 | send_notification 2 1 "$tr_notice_disconnected_summary" "$tr_notice_disconnected_wifi_body" ||
453 | send_notification 3 4 "$tr_notice_error_summary" "$tr_notice_error_wifi_disconnection_body"
454 | else
455 | nmcli --wait 15 connection up id "${connections_matching[$i]}" ifname "$interface_to_use" &&
456 | send_notification 1 1 "$tr_notice_connected_summary" "$tr_notice_connected_wifi_body" ||
457 | send_notification 3 4 "$tr_notice_error_summary" "$tr_notice_error_wifi_connection_body"
458 | fi
459 | exit 0
460 | fi
461 | done
462 |
463 | if [[ "$wifi_security" =~ ^(${icon_wifi_1}|${icon_wifi_2}|${icon_wifi_3}) ]]; then
464 | declare wifi_password=$(ask_password)
465 | if [ -z "$wifi_password" ]; then
466 | exit 0
467 | elif [[ "$wifi_password" =~ ^$icon_close ]]; then
468 | return
469 | fi
470 | fi
471 | nmcli --wait 15 device wifi connect "$wifi_ssid" ifname "$interface_to_use" password "$wifi_password" &&
472 | send_notification 1 1 "$tr_notice_connected_summary" "$tr_notice_connected_wifi_body" ||
473 | send_notification 3 4 "$tr_notice_error_summary" "$tr_notice_error_wifi_connection_body"
474 |
475 | exit 0
476 | }
477 |
478 | menu_submenu() {
479 | while true; do
480 | chosen="$(echo -e "$disable_message\n${interfaces[1]:+$interface_message ${interface_to_use}\n}$known_connections_message\n${wireguard:+${wireguard_message}\n}$hidden_message\n$icon_close" | display_menu 1 "$tr_submenu_message")"
481 | case "$chosen" in
482 | '') exit 0 ;;
483 | "$icon_close"*) return ;;
484 | "$icon_wifi_disable"*) nmcli radio wifi off ; send_notification 1 1 "$tr_notice_disable_wifi_summary" "$tr_notice_disable_wifi_body" ; exit 0 ;;
485 | "$icon_interface"*) select_interface ;;
486 | "$icon_saved"*) menu_known_connections "wifi" ;;
487 | "$icon_dragon"*) menu_known_connections "wireguard" ;;
488 | "$icon_eye"*) connect_hidden ;;
489 | esac
490 | done
491 | }
492 |
493 | menu_main() {
494 | declare connection_state wifi_list options
495 | while true; do
496 |
497 | connection_state=$(nmcli --colors no --get-values WIFI general)
498 |
499 | if [ "$connection_state" = "disabled" ]; then
500 | options="$enable_message\n$known_connections_message"
501 | elif [ "$connection_state" = "enabled" ]; then
502 |
503 | if [ -n "$submenu" ]; then
504 | options="$submenu_message"
505 | else
506 | options="$disable_message\n${interfaces[1]:+$interface_message ${interface_to_use}\n}$known_connections_message\n${wireguard:+${wireguard_message}\n}$hidden_message"
507 | fi
508 |
509 | echo "$tr_scanning_networks"
510 | wifi_list=$(nmcli --colors no --get-values SECURITY,SIGNAL,SSID,IN-USE device wifi list --rescan auto ifname $interface_to_use | awk -F ':' \
511 | -v wifi_1="$icon_wifi_1" \
512 | -v wifi_2="$icon_wifi_2" \
513 | -v wifi_3="$icon_wifi_3" \
514 | -v wifi_4="$icon_wifi_4" \
515 | -v wifi_5="$icon_wifi_5" \
516 | -v wifi_6="$icon_wifi_6" \
517 | -v check="$icon_check" \
518 | '
519 | BEGIN {
520 | x = 1
521 | }
522 | $3 {
523 | if ($1 ~ /^WPA/)
524 | if ($2 > 80)
525 | sub($1, wifi_1)
526 | else if ($2 > 60)
527 | sub($1, wifi_2)
528 | else
529 | sub($1, wifi_3)
530 | else if ($1 == "")
531 | if ($2 > 80)
532 | sub($1, wifi_4)
533 | else if ($2 > 60)
534 | sub($1, wifi_5)
535 | else
536 | sub($1, wifi_6)
537 | if ($4 == "*")
538 | networks[0] = check " " $3
539 | else
540 | networks[x++] = $1 " " $3
541 | }
542 | END {
543 | if (0 in networks)
544 | print networks[0]
545 | for (i = 1; i < x; i++)
546 | print networks[i]
547 | }
548 | ')
549 | echo "$tr_scanning_networks_complete"
550 |
551 | fi
552 |
553 | chosen="$(echo -e "${options}${wifi_list:+\n}$wifi_list" | display_menu 1 "$tr_main_menu_prompt")"
554 |
555 | case "$chosen" in
556 | '') exit 0 ;;
557 | "$icon_config"*) menu_submenu ;;
558 | "$icon_wifi_enable"*) nmcli radio wifi on ; send_notification 1 1 "$tr_notice_enable_wifi_summary" "$tr_notice_enable_wifi_body" ; exit 0 ;;
559 | "$icon_wifi_disable"*) nmcli radio wifi off ; send_notification 1 1 "$tr_notice_disable_wifi_summary" "$tr_notice_disable_wifi_body" ; exit 0 ;;
560 | "$icon_interface"*) select_interface ;;
561 | "$icon_saved"*) menu_known_connections "wifi" ;;
562 | "$icon_dragon"*) menu_known_connections "wireguard" ;;
563 | "$icon_eye"*) connect_hidden ;;
564 | *) connect_wifi "$chosen" ;;
565 | esac
566 |
567 | done
568 | }
569 |
570 | ############################################################ MAIN ############################################################
571 |
572 | # tr_* variables are for translation or customization (for editing in config file, not here!).
573 | tr_scanning_networks='Scanning networks'
574 | tr_scanning_networks_complete='Scanning completed'
575 | tr_submenu_message='More options'
576 | tr_disable_message='Disable Wi-Fi'
577 | tr_enable_message='Enable Wi-Fi'
578 | tr_interface_message='Interface:'
579 | tr_known_connections_message='Known connections'
580 | tr_autoconnect_message='Autoconnect'
581 | tr_ipv4_config_message='DHCP configuration'
582 | tr_dns4_message='DNS IPv4'
583 | tr_ipv6_config_message='IPv6 configuration'
584 | tr_dns6_message='DNS IPv6'
585 | tr_autoip_message='Automatic IP configuration'
586 | tr_autodns_message='Automatic DNS'
587 | tr_address_message='Addresses'
588 | tr_gateway_message='Gateway:'
589 | tr_forget_message='Forget connection'
590 | tr_wireguard_message='Wireguard connections'
591 | tr_wireguard_enable_message='Enable VPN'
592 | tr_rename_connection_message='Rename connection'
593 | tr_hidden_message='Connect to a hidden network'
594 |
595 | tr_main_menu_prompt='Wi-Fi SSID:'
596 | tr_select_interface_prompt='Interface to use:'
597 | tr_ask_password_prompt='Password:'
598 | tr_menu_dns_prompt='New DNS:'
599 | tr_menu_dns_sure_prompt_1='Remove DNS'
600 | tr_menu_dns_sure_prompt_2='?'
601 | tr_menu_ip_config_addresses_prompt='address1/CIDR_mask,address2/CIDR_mask,...'
602 | tr_menu_ip_config_gateway_prompt='New gateway:'
603 | tr_menu_addresses_prompt='New address:'
604 | tr_menu_addresses_sure_prompt_1='Remove address'
605 | tr_menu_addresses_sure_prompt_2='?'
606 | tr_forget_connection_prompt='Connection to forget:'
607 | tr_forget_connection_sure_prompt_1='Forget'
608 | tr_forget_connection_sure_prompt_2='?'
609 | tr_rename_connection_prompt='New name:'
610 | tr_connect_hidden_prompt='Network name:'
611 |
612 | tr_notice_connected_summary='Connected to network'
613 | tr_notice_disconnected_summary='Disconnected from network'
614 | tr_notice_error_summary='Connection error'
615 | tr_notice_enable_wifi_summary='Wi-Fi enabled'
616 | tr_notice_disable_wifi_summary='Wi-Fi disabled'
617 | tr_notice_connected_wifi_body='Successful connection to Wi-Fi network'
618 | tr_notice_disconnected_wifi_body='Successful disconnection from Wi-Fi network'
619 | tr_notice_error_wifi_connection_body='An error occurred while trying to connect to the Wi-Fi network'
620 | tr_notice_error_wifi_disconnection_body='An error occurred while trying to disconnect to the Wi-Fi network'
621 | tr_notice_connected_vpn_body='Successful connection to VPN'
622 | tr_notice_disconnected_vpn_body='Successful disconnection from VPN'
623 | tr_notice_error_vpn_connection_body='An error occurred while trying to connect to the VPN'
624 | tr_notice_error_vpn_disconnection_body='An error occurred while trying to disconnect to the VPN'
625 | tr_notice_enable_wifi_body='Wi-Fi was successfully enabled'
626 | tr_notice_disable_wifi_body='Wi-Fi was successfully disabled'
627 |
628 | # Detecting Wi-Fi interfaces and add them to the array
629 | mapfile -t interfaces < <(nmcli --colors no --get-values TYPE,DEVICE device status | awk -F ':' '$1 == "wifi" {print $2}')
630 | if [ -z "${interfaces[0]}" ]; then
631 | echo "$program_name: No Wi-Fi interfaces detected." >&2
632 | exit 2
633 | fi
634 |
635 | # Default launcher (for editing in config file)
636 | launcher='wofi'
637 | # Custom launcher options
638 | declare -A custom_opts
639 | # Default icon display (for editing in config file)
640 | emoji=
641 | # Default menu display. Set variable to anything for submenu options (for editing in config file)
642 | submenu=
643 | # Default interface (edit in config file on your risk, if you know your hardware, or use --interface option instead)
644 | interface_to_use="${interfaces[0]}"
645 | # Default wireguard menus visibility. Set variable to anything for wireguard support (for editing in config file)
646 | wireguard=
647 | # Default is to check if notify-send is installed and, if it is, enable notifications
648 | notifications=$(command -v notify-send &> /dev/null && echo 1)
649 |
650 | program_name="$(basename $0)"
651 |
652 | { [ -n "$XDG_CONFIG_HOME" ] && [ -f "${XDG_CONFIG_HOME}/${program_name}/config" ] && . "${XDG_CONFIG_HOME}/${program_name}/config"; } ||
653 | { [ -f "${HOME}/.config/${program_name}/config" ] && . "${HOME}/.config/${program_name}/config"; } ||
654 | { [ -f "${HOME}/.${program_name}" ] && . "${HOME}/.${program_name}"; }
655 |
656 | # Options
657 | while [ -n "$1" ]; do
658 | case "$1" in
659 | '-h' | '--help') print_usage ;;
660 | '-v' | '--version') print_about ;;
661 | '-s' | '--submenu') submenu=1 ;;
662 | '-S' | '--no-submenu') submenu= ;;
663 | '-i' | '--interface')
664 | if [ ! $(nmcli --colors no --get-values TYPE,DEVICE device status | awk -F ':' '$1 == "wifi" {print $2}' | grep --word-regexp "$2") ]; then
665 | echo "$program_name: Unknown interface given: $2" >&2
666 | exit 2
667 | fi
668 | interface_to_use="$2"
669 | shift
670 | ;;
671 | '-w' | '--wireguard') wireguard=1 ;;
672 | '-W' | '--no-wireguard') wireguard= ;;
673 | '-j' | '--emoji') emoji=1 ;;
674 | '-J' | '--no-emoji') emoji= ;;
675 | '--no-notify') notifications= ;;
676 | '--wofi') launcher='wofi' ;;
677 | '--rofi') launcher='rofi' ;;
678 | '--wmenu') launcher='wmenu' ;;
679 | '--dmenu') launcher='dmenu' ;;
680 | '--bemenu') launcher='bemenu' ;;
681 | '--custom')
682 | launcher='custom'
683 | custom_opts[launcher]="$2"
684 | custom_opts[insensitive]="$3"
685 | custom_opts[sensitive]="$4"
686 | custom_opts[password]="$5"
687 | shift 4
688 | ;;
689 | *) echo "$program_name: Wrong option given. See usage with -h or --help." >&2 ; exit 1 ;;
690 | esac
691 | shift
692 | done
693 |
694 | if [ "$launcher" = 'custom' ]; then
695 | [ -n "${custom_opts[launcher]}" ] &&
696 | [ -n "${custom_opts[insensitive]}" ] &&
697 | [ -n "${custom_opts[sensitive]}" ] &&
698 | [ -n "${custom_opts[password]}" ] || {
699 | echo "$program_name: Custom launcher options not defined. See usage with -h or --help." >&2
700 | exit 4
701 | }
702 | fi
703 |
704 | command -v ${custom_opts[launcher]:-$launcher} &> /dev/null || {
705 | echo "$program_name: The launcher selected is not installed: $launcher. See usage with -h or --help." >&2
706 | exit 3
707 | }
708 |
709 | # Icon variables
710 | icon_dragon="${icon_dragon:-$([ -z "$emoji" ] && echo || echo 🐉)}"
711 | icon_config="${icon_config:-$([ -z "$emoji" ] && echo || echo ⚙️)}"
712 | icon_close="${icon_close:-$([ -z "$emoji" ] && echo || echo ❌)}"
713 | icon_check="${icon_check:-$([ -z "$emoji" ] && echo || echo ✅)}"
714 | icon_eye="${icon_eye:-$([ -z "$emoji" ] && echo || echo 👁️)}"
715 | icon_eye_closed="${icon_eye_closed:-$([ -z "$emoji" ] && echo || echo 🙈)}"
716 | icon_saved="${icon_saved:-$([ -z "$emoji" ] && echo || echo 💾)}"
717 | icon_automatic="${icon_automatic:-$([ -z "$emoji" ] && echo || echo 🤖)}"
718 | icon_wifi_enable="${icon_wifi_enable:-$([ -z "$emoji" ] && echo || echo 🌇)}"
719 | icon_wifi_disable="${icon_wifi_disable:-$([ -z "$emoji" ] && echo || echo 🌃)}"
720 | icon_wifi_1="${icon_wifi_1:-$([ -z "$emoji" ] && echo || echo 🚀🔒)}"
721 | icon_wifi_2="${icon_wifi_2:-$([ -z "$emoji" ] && echo || echo 🚗🔒)}"
722 | icon_wifi_3="${icon_wifi_3:-$([ -z "$emoji" ] && echo || echo 🦽🔒)}"
723 | icon_wifi_4="${icon_wifi_4:-$([ -z "$emoji" ] && echo || echo 🚀)}"
724 | icon_wifi_5="${icon_wifi_5:-$([ -z "$emoji" ] && echo || echo 🚗)}"
725 | icon_wifi_6="${icon_wifi_6:-$([ -z "$emoji" ] && echo || echo 🦽)}"
726 | icon_interface="${icon_interface:-$([ -z "$emoji" ] && echo || echo 🛰️)}"
727 | icon_4_1="${icon_4_1:-$([ -z "$emoji" ] && echo || echo 🔧4️⃣)}"
728 | icon_4_2="${icon_4_2:-$([ -z "$emoji" ] && echo || echo 🔍4️⃣)}"
729 | icon_6_1="${icon_6_1:-$([ -z "$emoji" ] && echo || echo 🔧6️⃣)}"
730 | icon_6_2="${icon_6_2:-$([ -z "$emoji" ] && echo || echo 🔍6️⃣)}"
731 | icon_plug="${icon_plug:-$([ -z "$emoji" ] && echo || echo 🔌)}"
732 | icon_trash="${icon_trash:-$([ -z "$emoji" ] && echo || echo 🗑️)}"
733 | icon_pen="${icon_pen:-$([ -z "$emoji" ] && echo || echo 📝)}"
734 | icon_wireless="${icon_wireless:-$([ -z "$emoji" ] && echo || echo 🛜)}"
735 | icon_net_1="${icon_net_1:-$([ -z "$emoji" ] && echo || echo 🤖)}"
736 | icon_net_2="${icon_net_2:-$([ -z "$emoji" ] && echo || echo 🛣️)}"
737 | icon_net_3="${icon_net_3:-$([ -z "$emoji" ] && echo || echo 🏠)}"
738 | icon_net_4="${icon_net_4:-$([ -z "$emoji" ] && echo || echo 🌐)}"
739 | icon_net_5="${icon_net_5:-$([ -z "$emoji" ] && echo || echo 💻)}"
740 | icon_unlock="${icon_unlock:-$([ -z "$emoji" ] && echo || echo 🔓)}"
741 | icon_on="${icon_on:-$([ -z "$emoji" ] && echo || echo 🟢)}"
742 | icon_off="${icon_off:-$([ -z "$emoji" ] && echo || echo 🔴)}"
743 |
744 | # Messages with icons
745 | submenu_message="$icon_config $tr_submenu_message"
746 | submenu_close_message="$icon_close $tr_submenu_close_message"
747 | disable_message="$icon_wifi_disable $tr_disable_message"
748 | enable_message="$icon_wifi_enable $tr_enable_message"
749 | interface_message="$icon_interface $tr_interface_message"
750 | known_connections_message="$icon_saved $tr_known_connections_message"
751 | autoconnect_message="$icon_automatic $tr_autoconnect_message"
752 | ipv4_config_message="$icon_4_1 $tr_ipv4_config_message"
753 | dns4_message="$icon_4_2 $tr_dns4_message"
754 | ipv6_config_message="$icon_6_1 $tr_ipv6_config_message"
755 | dns6_message="$icon_6_2 $tr_dns6_message"
756 | autoip_message="$icon_net_1 $tr_autoip_message"
757 | autodns_message="$icon_net_4 $tr_autodns_message"
758 | address_message="$icon_net_3 $tr_address_message"
759 | gateway_message="$icon_net_2 $tr_gateway_message"
760 | forget_message="$icon_trash $tr_forget_message"
761 | wireguard_message="$icon_dragon $tr_wireguard_message"
762 | wireguard_enable_message="$icon_plug $tr_wireguard_enable_message"
763 | rename_connection_message="$icon_pen $tr_rename_connection_message"
764 | hidden_message="$icon_eye $tr_hidden_message"
765 |
766 | menu_main
767 |
--------------------------------------------------------------------------------
/COPYING:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------