Skip to content

Instantly share code, notes, and snippets.

@JPvRiel
Last active May 24, 2023 12:15
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save JPvRiel/4e3f6f055b4ac9c31a302450bfdf0758 to your computer and use it in GitHub Desktop.
Save JPvRiel/4e3f6f055b4ac9c31a302450bfdf0758 to your computer and use it in GitHub Desktop.
a shell wrapper to pull org.gnome.proxy settings into env, e.g. http_proxy, which is useful for .desktop files

Why?

Useful for:

  • updating current terminal's shell env proxy settings, or
  • wrapping exec in .desktop files to inject env proxy settings

GNOME proxy settings should normally get propergated into the shell (bash) environment via gnome-terminal, e.g. http_proxy and no_proxy. However:

  • I noticed that applications exectuted via .desktop entries sometimes don't work. This happens when an app ignores org.gnome.proxy settings but can often use proxy env vars from the shell.
  • If you're proxy settings change, existing shell processes will still have the old proxy enviroment variables, so this can help refresh them whithout having to create a new shell.

How?

Telegram .desktop file example

See #2777 for Telegram Desktop. Bascially:

  • It's defaults works with http_proxy when executed via a shell
  • It's defaults don't work via the telegramdesktop.desktop file

E.g. if avaialbe via $PATH:

...
Exec=gnome_proxy_to_env.sh Telegram -- %u
...

Bash

Sourcing the proxy settings into a current shell (changes current shell's proxy env vars)

$ source gnome_proxy_to_env.sh
$ grep http_proxy
http_proxy=http://localhost:8080

Wrap a command (doesn't change current shell's proxy proxy env vars, only called shell subprocess)

$ ./gnome_proxy_to_env env.sh | grep http_proxy
http_proxy=http://localhost:8080
#!/usr/bin/env bash
# Deal with some proxy pain for Linux apps! Note:
# - Default is let desktop env manage proxy env
# - However, GNOME does't always set the proxy enviroment when an application is
# executed via a .desktop file #sadpanda
# - This tries to help pull org.gnome.proxy settings into http_proxy, etc
# - `gsettings list-recursively org.gnome.system.proxy`
set -e
function un_single_quote() {
s="$1"
s=${s%\'}
s=${s#\'}
echo "$s"
}
function proxy_on() {
# http org.gnome.system.proxy.http
http_host="$(un_single_quote "$(gsettings get org.gnome.system.proxy.http host)")"
http_port="$(un_single_quote "$(gsettings get org.gnome.system.proxy.http port)")"
export http_proxy="http://$http_host:$http_port"
export HTTP_PROXY=$http_proxy
# org.gnome.system.proxy.https
https_host="$(un_single_quote "$(gsettings get org.gnome.system.proxy.https host)")"
https_port="$(un_single_quote "$(gsettings get org.gnome.system.proxy.https port)")"
export https_proxy="https://$https_host:$https_port"
export HTTPS_PROXY=$https_proxy
# org.gnome.system.proxy.ftp
ftp_host="$(un_single_quote "$(gsettings get org.gnome.system.proxy.ftp host)")"
ftp_port="$(un_single_quote "$(gsettings get org.gnome.system.proxy.ftp port)")"
export ftp_proxy="ftp://$ftp_host:$ftp_port"
export FTP_PROXY=$ftp_proxy
# socks org.gnome.system.proxy.socks
# TODO: not proccessed for now
# org.gnome.system.proxy ignore-hosts
ignore_hosts="$(gsettings get org.gnome.system.proxy ignore-hosts)"
no_proxy="${ignore_hosts:1:-1}"
no_proxy="${no_proxy// /}"
no_proxy="${no_proxy//\'/}"
export no_proxy
export NO_PROXY=$no_proxy
}
function proxy_off() {
unset no_proxy
unset NO_PROXY
unset http_proxy
unset HTTP_PROXY
unset https_proxy
unset HTTPS_PROXY
unset ftp_proxy
unset FTP_PROXY
}
# check for unsupported settings
case "$(un_single_quote "$(gsettings get org.gnome.system.proxy mode)")" in
manual)
proxy_on
;;
auto)
echo "ERROR: Auto, autoconfig-url (PAC) is not yet supported" >&2
exit 1
;;
none)
proxy_off
;;
*)
echo "ERROR: org.gnome.system.proxy mode unknown" >&2
exit 1
;;
esac
if [[ "$(gsettings get org.gnome.system.proxy.http use-authentication)" == 'true' ]]; then
echo "ERROR: HTTP proxy authentication is not yet supported" >&2
exit 1
fi
# if not sourced, then wrap
if ! [[ "${BASH_SOURCE[0]}" != "${0}" ]]; then
if [ -z "$1" ] || [ "$1" == '-h' ] || [ "$1" == '--help' ] ; then
echo 'Usage:'
echo ' - This can be sourced, e.g.'
echo ' `. gnome_proxy_to_env.sh; <command>`'
echo ' - Or can wrap the command, e.g.'
echo ' `./gnome_proxy_to_env.sh <command/application>``'
elif [ "$#" -gt 0 ]; then
exec $@
fi
fi
@tony--
Copy link

tony-- commented Jun 15, 2018

Hi @JPvRiel.
Thanks for providing this; it is exactly what I was looking for.
What is the license for this?
I'd like to use it but cannot without the license being set.
Can you add a license statement to the .md?

@egroeper
Copy link

Hi,
thanks for the script!
I made a small improvement (handling empty fields). Perhaps you want to apply that changes, too.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment