From 1f7e34cb2447907f52841892c71f99ebbd0782e2 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Mon, 13 Nov 2017 15:38:43 +0530 Subject: [PATCH 01/54] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 575292c..695731c 100644 --- a/README.md +++ b/README.md @@ -44,4 +44,4 @@ To download older versions, checkout releases tagged v1.* [here](https://github. NOTE : It does not support PAC proxy using "proxy configuration URL". It is for setting up "manual" proxy. -#### A GUI version is under progress. However, it is not ready. If you like to contribute, you can checkout to the [gui branch](https://github.com/himanshub16/ProxyMan/tree/gui) of this project. +#### A GUI version is under consideration. However, it is ready. If you like to contribute, you can checkout to the [gui branch](https://github.com/himanshub16/ProxyMan/tree/gui) of this project. From 2342e65042a73b2f0020886705472e4c8db1edca Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Mon, 27 Nov 2017 15:15:58 +0530 Subject: [PATCH 02/54] Add gitter chat link toreadme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 695731c..e05a43c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## ProxyMan +## ProxyMan [![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/proxyman-linux/Lobby) ### Configuring proxy made so simple on Linux ([releases](https://github.com/himanshub16/ProxyMan/releases/)) From b39c0fd9900c7473d79caf5c3b0d181802e0c888 Mon Sep 17 00:00:00 2001 From: paiakshay998 Date: Tue, 28 Nov 2017 21:44:57 +0400 Subject: [PATCH 03/54] added profiles feature, exit on invalid option --- main.sh | 154 ++++++++++++++++++++++++++++++-------------- profiles/sample.txt | 10 +++ 2 files changed, 115 insertions(+), 49 deletions(-) create mode 100644 profiles/sample.txt diff --git a/main.sh b/main.sh index cb7f896..75c7b12 100755 --- a/main.sh +++ b/main.sh @@ -55,65 +55,76 @@ if [ "$1" = "list" ]; then exit fi -use_same="" -use_auth="" -echo -e " +http_host="" +http_port="" +use_same="n" +https_host="" +https_port="" +ftp_host="" +ftp_port="" +use_auth="n" +username="" +password="" +save_for_reuse="" +profile_name="" + +if [ "$1" == "load" ]; then + choice="set" + +else + echo -e " \e[1m\e[33mProxyMan =========\e[0m Tool to set up system wide proxy settings on Linux. \e[2m\e[33m🌟\e[0m\e[3m Star it \e[0m : \e[4m\e[34m https://github.com/himanshub16/ProxyMan \e[0m - \e[4mThe following options are available : \e[0m +\e[4mThe following options are available : \e[0m \e[1m set \e[0m : \e[2m Set proxy settings \e[0m \e[1m unset \e[0m : \e[2m Unset proxy settings \e[0m \e[1m list \e[0m : \e[2m List current settings \e[0m - +\e[1m load \e[0m : \e[2m Load previously saved settings \e[0m " -read -p " Enter your choice : " choice - -if [[ (! "$choice" = "set") && (! "$choice" = "unset") && (! "$choice" = "list") ]]; then - echo "Invalid choice! Start again." -fi + read -p " Enter your choice : " choice -if [ "$choice" = "set" ]; then - - # default values - http_host="" - http_port="" - use_same="no" - https_host="" - https_port="" - ftp_host="" - ftp_port="" - username="" - password="" - - echo - echo -e " \e[4mEnter details \e[0m : \e[2m\e[3m (leave blank if you don't to use any proxy settings) \e[0m" - echo - echo -ne "\e[36m HTTP Proxy host \e[0m"; read http_host - echo -ne "\e[32m HTTP Proxy port \e[0m"; read http_port - echo -ne "\e[0m Use same for HTTPS and FTP (y/n) ? \e[0m"; read use_same - echo -ne "\e[0m Use authentication (y/n) ? \e[0m "; read use_auth - - if [[ "$use_auth" = "y" || "$use_auth" = "Y" ]]; then - read -p " Enter username : " username - echo -n " Enter password (use %40 for @) : " ; read -s password + if [[ (! "$choice" = "set") && (! "$choice" = "unset") && (! "$choice" = "list") && (! "$choice" = "load") ]]; then + echo "Invalid choice! Will exit." + exit fi - if [[ "$use_same" = "y" || "$use_same" = "Y" ]]; then - https_host=$http_host - ftp_host=$http_host - https_port=$http_port - ftp_port=$http_port - rsync_host=$http_host - rsync_port=$https_port - else - echo -ne "\e[36m HTTPS Proxy host \e[0m " ; read https_host - echo -ne "\e[32m HTTPS Proxy port \e[0m " ; read https_port - echo -ne "\e[36m FTP Proxy host \e[0m " ; read ftp_host - echo -ne "\e[32m FTP Proxy port \e[0m " ; read ftp_port + if [ "$choice" = "set" ]; then + + echo + echo -e " \e[4mEnter details \e[0m : \e[2m\e[3m (leave blank if you don't to use any proxy settings) \e[0m" + echo + echo -ne "\e[36m HTTP Proxy host \e[0m"; read http_host + echo -ne "\e[32m HTTP Proxy port \e[0m"; read http_port + echo -ne "\e[0m Use same for HTTPS and FTP (y/n) ? \e[0m"; read use_same + echo -ne "\e[0m Use authentication (y/n) ? \e[0m "; read use_auth + echo -ne "\e[0m Save settings for later use (y/n) ? \e[0m"; read save_for_reuse + + if [[ "$use_auth" = "y" || "$use_auth" = "Y" ]]; then + read -p " Enter username : " username + echo -n " Enter password (use %40 for @) : " ; read -s password + fi + + if [[ "$save_for_reuse" = "y" || "$save_for_reuse" = "Y" ]]; then + read -p " Enter config name : " profile_name + fi + + if [[ "$use_same" = "y" || "$use_same" = "Y" ]]; then + https_host=$http_host + ftp_host=$http_host + https_port=$http_port + ftp_port=$http_port + rsync_host=$http_host + rsync_port=$https_port + else + echo -ne "\e[36m HTTPS Proxy host \e[0m " ; read https_host + echo -ne "\e[32m HTTPS Proxy port \e[0m " ; read https_port + echo -ne "\e[36m FTP Proxy host \e[0m " ; read ftp_host + echo -ne "\e[32m FTP Proxy port \e[0m " ; read ftp_port + fi fi fi @@ -132,11 +143,55 @@ echo echo -e " Enter your choices (\e[3m\e[2m separate multiple choices by a space \e[0m ) " echo -ne "\e[5m ? \e[0m" ; read -a targets -echo +echo case $choice in - "set") + "set"|"load") + + if [[ "$1" != "load" && ( "$save_for_reuse" = "y" || "$save_for_reuse" = "Y" ) ]]; then + config_file="http_host=$http_host%s\nhttp_port=$http_port%s\nuse_same=$use_same\nuse_auth=$use_auth\nusername=$username\npassword=$password\nhttps_host=$https_host\nhttps_port=$https_host\nftp_host=$ftp_host\nftp_host=$ftp_host" + printf $config_file > "profiles/$profile_name".txt + fi + + if [[ $choice == "load" || $1 == "load" ]]; then + + if [[ $choice == "load" ]]; then + echo -ne "\e[36m Config Name \e[0m " ; read config_name + fi + + if [ "$1" = "load" ]; then + + if [ "$2" = "" ]; then + echo -ne "\e[1m \e[31mPlease provide a config! \e[0m" + echo + exit + fi + + config_name=$2 + fi + + if [ ! -e profiles/"$config_name".txt ]; then + echo -ne "\e[1m \e[31mFile does not exist! \e[0m" + echo + exit + fi + + http_host=`grep http_host -i profiles/$config_name.txt | cut -d= -f2` + http_port=`grep http_port -i profiles/$config_name.txt | cut -d= -f2` + use_same=`grep use_same -i profiles/$config_name.txt | cut -d= -f2` + use_auth=`grep use_auth -i profiles/$config_name.txt | cut -d= -f2` + username=`grep username -i profiles/$config_name.txt | cut -d= -f2` + password=`grep password -i profiles/$config_name.txt | cut -d= -f2` + https_host=`grep https_host -i profiles/$config_name.txt | cut -d= -f2` + https_port=`grep https_port -i profiles/$config_name.txt | cut -d= -f2` + ftp_host=`grep ftp_host -i profiles/$config_name.txt | cut -d= -f2` + ftp_port=`grep ftp_port -i profiles/$config_name.txt | cut -d= -f2` + + echo -e " Config \033[0;36m$config_name\033[0m successfully loaded" + fi + args=("$http_host" "$http_port" "$use_same" "$use_auth" "$username" "$password" "$https_host" "$https_port" "$ftp_host" "$ftp_port" ) + for i in "${targets[@]}" do case $i in @@ -246,7 +301,8 @@ case $choice in ;; *) - echo "Invalid choice. Start again!" + echo "Invalid choice! Will exit now" + exit ;; esac diff --git a/profiles/sample.txt b/profiles/sample.txt new file mode 100644 index 0000000..9a4af3b --- /dev/null +++ b/profiles/sample.txt @@ -0,0 +1,10 @@ +192.99.56.254 +8080 +y +n + + +192.99.56.254 +8080 +192.99.56.254 +8080 From da8ecd8b8ab13371e0f55d43191e24f64c4d94c6 Mon Sep 17 00:00:00 2001 From: paiakshay998 Date: Sat, 9 Dec 2017 20:56:01 +0530 Subject: [PATCH 04/54] fixed bug while storing config, input order updated sample conf --- main.sh | 5 +++-- profiles/sample.txt | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/main.sh b/main.sh index 75c7b12..e9a61b4 100755 --- a/main.sh +++ b/main.sh @@ -101,13 +101,14 @@ Tool to set up system wide proxy settings on Linux. echo -ne "\e[32m HTTP Proxy port \e[0m"; read http_port echo -ne "\e[0m Use same for HTTPS and FTP (y/n) ? \e[0m"; read use_same echo -ne "\e[0m Use authentication (y/n) ? \e[0m "; read use_auth - echo -ne "\e[0m Save settings for later use (y/n) ? \e[0m"; read save_for_reuse if [[ "$use_auth" = "y" || "$use_auth" = "Y" ]]; then read -p " Enter username : " username echo -n " Enter password (use %40 for @) : " ; read -s password fi + echo -ne "\e[0m Save settings for later use (y/n) ? \e[0m"; read save_for_reuse + if [[ "$save_for_reuse" = "y" || "$save_for_reuse" = "Y" ]]; then read -p " Enter config name : " profile_name fi @@ -149,7 +150,7 @@ case $choice in "set"|"load") if [[ "$1" != "load" && ( "$save_for_reuse" = "y" || "$save_for_reuse" = "Y" ) ]]; then - config_file="http_host=$http_host%s\nhttp_port=$http_port%s\nuse_same=$use_same\nuse_auth=$use_auth\nusername=$username\npassword=$password\nhttps_host=$https_host\nhttps_port=$https_host\nftp_host=$ftp_host\nftp_host=$ftp_host" + config_file="http_host=$http_host%s\nhttp_port=$http_port%s\nuse_same=$use_same\nuse_auth=$use_auth\nusername=$username\npassword=$password\nhttps_host=$https_host\nhttps_port=$https_port\nftp_host=$ftp_host\nftp_port=$ftp_port" printf $config_file > "profiles/$profile_name".txt fi diff --git a/profiles/sample.txt b/profiles/sample.txt index 9a4af3b..cc38d3b 100644 --- a/profiles/sample.txt +++ b/profiles/sample.txt @@ -1,10 +1,10 @@ -192.99.56.254 -8080 -y -n - - -192.99.56.254 -8080 -192.99.56.254 -8080 +http_host=175.215.214.126 +http_port=8080 +use_same=y +use_auth=n +username= +password= +https_host=175.215.214.126 +https_port=8080 +ftp_host=175.215.214.126 +ftp_port=8080 \ No newline at end of file From 5ab36bee6046408e196105263e48809a61680f26 Mon Sep 17 00:00:00 2001 From: Sebastian Aburto Date: Thu, 11 Jan 2018 18:09:36 -0300 Subject: [PATCH 05/54] Change protocol https to http for 'https proxy' --- apt.sh | 4 ++-- bash.sh | 8 ++++---- environment.sh | 8 ++++---- git.sh | 4 ++-- npm.sh | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/apt.sh b/apt.sh index 72264a6..4931c3c 100644 --- a/apt.sh +++ b/apt.sh @@ -79,7 +79,7 @@ set_proxy() { if [ "$3" = "y" ]; then newvar="://$var$1:$2" echo "Acquire::Http::Proxy \"http$newvar\";" >> apt_config.tmp - echo "Acquire::Https::Proxy \"https$newvar\";" >> apt_config.tmp + echo "Acquire::Https::Proxy \"http$newvar\";" >> apt_config.tmp echo "Acquire::Ftp::Proxy \"ftp$newvar\";" >> apt_config.tmp fix_new_line "/etc/apt/apt.conf" @@ -89,7 +89,7 @@ set_proxy() { elif [ "$3" = "n" ]; then echo "Acquire::Http::Proxy \"http://$var$1:$2\";" >> apt_config.tmp - echo "Acquire::Https::Proxy \"https://$var$7:$8\";" >> apt_config.tmp + echo "Acquire::Https::Proxy \"http://$var$7:$8\";" >> apt_config.tmp echo "Acquire::Ftp::Proxy \"ftp://$var$9:$10\";" >> apt_config.tmp cat apt_config.tmp | tee -a /etc/apt/apt.conf > /dev/null diff --git a/bash.sh b/bash.sh index 1ead12f..381af8b 100644 --- a/bash.sh +++ b/bash.sh @@ -89,10 +89,10 @@ set_proxy() { if [ "$3" = "y" ]; then newvar="://$var$1:$2" echo "http_proxy=\"http$newvar\"" >> bash_config.tmp - echo "https_proxy=\"https$newvar\"" >> bash_config.tmp + echo "https_proxy=\"http$newvar\"" >> bash_config.tmp echo "ftp_proxy=\"ftp$newvar\"" >> bash_config.tmp echo "HTTP_PROXY=\"http$newvar\"" >> bash_config.tmp - echo "HTTPS_PROXY=\"https$newvar\"" >> bash_config.tmp + echo "HTTPS_PROXY=\"http$newvar\"" >> bash_config.tmp echo "FTP_PROXY=\"ftp$newvar\"" >> bash_config.tmp fix_new_line $HOME/.bashrc @@ -102,10 +102,10 @@ set_proxy() { elif [ "$3" = "n" ]; then echo "http_proxy=\"http://$var$1:$2\"" >> bash_config.tmp - echo "https_proxy=\"https://$var$7:$8\"" >> bash_config.tmp + echo "http_proxy=\"http://$var$7:$8\"" >> bash_config.tmp echo "ftp_proxy=\"ftp://$var$9:$10\"" >> bash_config.tmp echo "HTTP_PROXY=\"http://$var$1:$2\"" >> bash_config.tmp - echo "HTTPS_PROXY=\"https://$var$7:$8\"" >> bash_config.tmp + echo "HTTPS_PROXY=\"http://$var$7:$8\"" >> bash_config.tmp echo "FTP_PROXY=\"ftp://$var$9:$10\"" >> bash_config.tmp cat bash_config.tmp | tee -a $HOME/.bashrc > /dev/null diff --git a/environment.sh b/environment.sh index 3bda626..431e15e 100644 --- a/environment.sh +++ b/environment.sh @@ -90,10 +90,10 @@ set_proxy() { if [ "$3" = "y" ]; then newvar="://$var$1:$2" echo "http_proxy=\"http$newvar\"" >> bash_config.tmp - echo "https_proxy=\"https$newvar\"" >> bash_config.tmp + echo "https_proxy=\"http$newvar\"" >> bash_config.tmp echo "ftp_proxy=\"ftp$newvar\"" >> bash_config.tmp echo "HTTP_PROXY=\"http$newvar\"" >> bash_config.tmp - echo "HTTPS_PROXY=\"https$newvar\"" >> bash_config.tmp + echo "HTTPS_PROXY=\"http$newvar\"" >> bash_config.tmp echo "FTP_PROXY=\"ftp$newvar\"" >> bash_config.tmp cat bash_config.tmp | tee -a /etc/environment > /dev/null @@ -102,10 +102,10 @@ set_proxy() { elif [ "$3" = "n" ]; then echo "http_proxy=\"http://$var$1:$2\"" >> bash_config.tmp - echo "https_proxy=\"https://$var$7:$8\"" >> bash_config.tmp + echo "https_proxy=\"http://$var$7:$8\"" >> bash_config.tmp echo "ftp_proxy=\"ftp://$var$9:$10\"" >> bash_config.tmp echo "HTTP_PROXY=\"http://$var$1:$2\"" >> bash_config.tmp - echo "HTTPS_PROXY=\"https://$var$7:$8\"" >> bash_config.tmp + echo "HTTPS_PROXY=\"http://$var$7:$8\"" >> bash_config.tmp echo "FTP_PROXY=\"ftp://$var$9:$10\"" >> bash_config.tmp fix_new_line "/etc/environment" diff --git a/git.sh b/git.sh index e121343..0f4319e 100644 --- a/git.sh +++ b/git.sh @@ -58,10 +58,10 @@ set_proxy() { if [ "$3" = "y" ]; then newvar="://$var$1:$2" git config --global http.proxy "http$newvar" - git config --global https.proxy "https$newvar" + git config --global https.proxy "http$newvar" elif [ "$3" = "n" ]; then git config --global http.proxy "http://$var$1:$2" - git config --global https.proxy "https://$var$1:$2" + git config --global https.proxy "http://$var$1:$2" fi } diff --git a/npm.sh b/npm.sh index 04c60bc..9c4d784 100644 --- a/npm.sh +++ b/npm.sh @@ -59,10 +59,10 @@ set_proxy() { if [ "$3" = "y" ]; then newvar="://$var$1:$2" npm config set proxy "http$newvar" - npm config set https-proxy "https$newvar" + npm config set https-proxy "http$newvar" elif [ "$3" = "n" ]; then npm config set proxy "http://$var$1:$2" - npm config set https-proxy "https://$var$7:$8" + npm config set https-proxy "http://$var$7:$8" fi } From 76ee7e6247a551c9fceb26a34c7d2161906a42d1 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Sat, 13 Jan 2018 22:34:22 +0530 Subject: [PATCH 06/54] fix https proxy for npm, closes #41 --- npm.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/npm.sh b/npm.sh index 04c60bc..f7e076a 100644 --- a/npm.sh +++ b/npm.sh @@ -53,16 +53,17 @@ unset_proxy() { } set_proxy() { + # notice http (without `s`) in `https`, issue #41 if [ "$4" = "y" ]; then var="$5:$6@" fi if [ "$3" = "y" ]; then newvar="://$var$1:$2" npm config set proxy "http$newvar" - npm config set https-proxy "https$newvar" + npm config set https-proxy "http$newvar" elif [ "$3" = "n" ]; then npm config set proxy "http://$var$1:$2" - npm config set https-proxy "https://$var$7:$8" + npm config set https-proxy "http://$var$7:$8" fi } From 922d04fd910dea23d1eadc5dff70976d7b8c9649 Mon Sep 17 00:00:00 2001 From: paiakshay998 Date: Tue, 12 Dec 2017 10:59:05 +0530 Subject: [PATCH 07/54] added immediate exit if config not provided --- main.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/main.sh b/main.sh index e9a61b4..5098c3b 100755 --- a/main.sh +++ b/main.sh @@ -129,6 +129,12 @@ Tool to set up system wide proxy settings on Linux. fi fi +if [[ "$1" == "load" && "$2" == "" ]]; then + echo -ne "\e[1m \e[31mPlease provide a config! \e[0m" + echo + exit +fi + echo echo -e " \e[0m\e[4m\e[33mEnter targets where you want to modify settings : \e[0m" echo -e " |\e[36m 1 \e[0m| All of them ... Don't bother me" From 14a962f3dd85d9e41ff0d1b328c38b247d931920 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Sat, 13 Jan 2018 22:43:31 +0530 Subject: [PATCH 08/54] Reposition statement to appropriate place --- main.sh | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/main.sh b/main.sh index 5098c3b..66df7dc 100755 --- a/main.sh +++ b/main.sh @@ -68,6 +68,13 @@ password="" save_for_reuse="" profile_name="" + +if [[ "$1" == "load" && "$2" == "" ]]; then + echo -ne "\e[1m \e[31mPlease provide a config! \e[0m" + echo + exit +fi + if [ "$1" == "load" ]; then choice="set" @@ -129,12 +136,6 @@ Tool to set up system wide proxy settings on Linux. fi fi -if [[ "$1" == "load" && "$2" == "" ]]; then - echo -ne "\e[1m \e[31mPlease provide a config! \e[0m" - echo - exit -fi - echo echo -e " \e[0m\e[4m\e[33mEnter targets where you want to modify settings : \e[0m" echo -e " |\e[36m 1 \e[0m| All of them ... Don't bother me" From a18ccf54c4353c55e69158597553739ae0881f40 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Wed, 4 Apr 2018 22:26:18 +0530 Subject: [PATCH 09/54] remove whitespaces --- main.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/main.sh b/main.sh index 66df7dc..287ff6b 100755 --- a/main.sh +++ b/main.sh @@ -73,7 +73,7 @@ if [[ "$1" == "load" && "$2" == "" ]]; then echo -ne "\e[1m \e[31mPlease provide a config! \e[0m" echo exit -fi +fi if [ "$1" == "load" ]; then choice="set" @@ -151,7 +151,7 @@ echo echo -e " Enter your choices (\e[3m\e[2m separate multiple choices by a space \e[0m ) " echo -ne "\e[5m ? \e[0m" ; read -a targets -echo +echo case $choice in "set"|"load") @@ -162,22 +162,22 @@ case $choice in fi if [[ $choice == "load" || $1 == "load" ]]; then - + if [[ $choice == "load" ]]; then echo -ne "\e[36m Config Name \e[0m " ; read config_name - fi + fi if [ "$1" = "load" ]; then if [ "$2" = "" ]; then echo -ne "\e[1m \e[31mPlease provide a config! \e[0m" echo - exit + exit fi config_name=$2 fi - + if [ ! -e profiles/"$config_name".txt ]; then echo -ne "\e[1m \e[31mFile does not exist! \e[0m" echo From f818aab9f144b05f2f9a6ee49f72c46f93af74d3 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Wed, 4 Apr 2018 22:29:17 +0530 Subject: [PATCH 10/54] update readme for config files --- README.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e05a43c..1546bd9 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,18 @@ * Download the [zip from here](https://github.com/himanshub16/ProxyMan/releases/latest). * Extract the zip, open the folder in terminal. * Enter the following command -` -bash main.sh -` + +```bash +./main.sh +``` + +#### Save and load configs for later use +* Save your config to avoid entering values. +* Load those configs to save time + +```bash +./main.sh load home +``` ![Screenshot](https://raw.githubusercontent.com/himanshub16/ProxyMan/master/screenshot.png) From 9d2bf3b179788a629beb7998156870f2b82c0e7b Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Wed, 4 Apr 2018 23:12:55 +0530 Subject: [PATCH 11/54] update readme with remarks for v3 --- README.md | 51 +++------------------------------------------------ 1 file changed, 3 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 1546bd9..e8d36b2 100644 --- a/README.md +++ b/README.md @@ -4,53 +4,8 @@ (Download [here](https://github.com/himanshub16/ProxyMan/releases/latest/)) -#### Usage : -* Download the [zip from here](https://github.com/himanshub16/ProxyMan/releases/latest). -* Extract the zip, open the folder in terminal. -* Enter the following command -```bash -./main.sh -``` +### How this is going to be different from **v2**? +* Saves your settings in a `config_file/rc_file` (same as profiles). +* Single script sourced in `.bashrc/.zshrc` ensures the right config is sourced directly instead of manually invoking the script. -#### Save and load configs for later use -* Save your config to avoid entering values. -* Load those configs to save time - -```bash -./main.sh load home -``` - -![Screenshot](https://raw.githubusercontent.com/himanshub16/ProxyMan/master/screenshot.png) - -# FAQ -* **Why do someone need it?** - - Because many times, setting up proxy on Linux sucks (esp. authenticated proxies). There are a lot of locations to configure. This tool reduces your effort by setting the proper configuration at the desired place. - -* **For which softwares the settings by ProxyMan is effective?** - - ProxyMan sets proxy for `apt`, `dnf`, `bashrc`, `npm`, `git`, `dropbox`, `/etc/environment`, `gsettings`. - -* **There is some application/location it does not support. Any workaround?** - - Why not? Everything is possible. Just raise an issue [here](https://github.com/himanshub16/ProxyMan/issues). - If you are a developer, then your contributions are welcome. - -* **My distro works like charm. I don't need it.** - - It's great that your distro supports everything. However, many disros do not support authenticated proxy settings. - Moreover, there are several apps which don't use system proxy on certain platforms and need their own workaround. - -For older version, checkout [branch v1](https://github.com/himanshub16/ProxyMan/tree/v1). -To download older versions, checkout releases tagged v1.* [here](https://github.com/himanshub16/ProxyMan/releases). - -#### What's new in v2? -* Modular approach. Individual scripts handle individual targets requiring proxy settings. -* This means, a script can be for a single application/domain can be created and easily integrated with main.sh, without much modifications in main.sh (which was not available in v1). -* No issues of privileges for individual scripts. Main script is responsible of executing child script with required privileges. - - -NOTE : It does not support PAC proxy using "proxy configuration URL". It is for setting up "manual" proxy. - -#### A GUI version is under consideration. However, it is ready. If you like to contribute, you can checkout to the [gui branch](https://github.com/himanshub16/ProxyMan/tree/gui) of this project. From 5aeee965330dfdb3f26209f8d583c939a8a214c2 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Wed, 4 Apr 2018 23:17:16 +0530 Subject: [PATCH 12/54] cleanup --- apt.sh | 124 ----------------- bash.sh | 137 ------------------- common.txt | 49 ------- dnf.sh | 110 --------------- dropbox.sh | 79 ----------- environment.sh | 137 ------------------- git.sh | 90 ------------- gsettings.sh | 133 ------------------ main.sh | 318 -------------------------------------------- npm.sh | 92 ------------- profiles/sample.txt | 10 -- screenshot.png | Bin 63560 -> 0 bytes 12 files changed, 1279 deletions(-) delete mode 100644 apt.sh delete mode 100644 bash.sh delete mode 100644 common.txt delete mode 100644 dnf.sh delete mode 100644 dropbox.sh delete mode 100644 environment.sh delete mode 100644 git.sh delete mode 100644 gsettings.sh delete mode 100755 main.sh delete mode 100644 npm.sh delete mode 100644 profiles/sample.txt delete mode 100644 screenshot.png diff --git a/apt.sh b/apt.sh deleted file mode 100644 index 4931c3c..0000000 --- a/apt.sh +++ /dev/null @@ -1,124 +0,0 @@ -#!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "apt" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# here your code starts - -# privileges has to be set by the process which starts this script - -fix_new_line() { - if [[ $(tail -c 1 "$1" | wc --lines ) = 0 ]]; then - echo >> "$1" - fi -} - -list_proxy() { - # inefficient way as the file is read twice.. think of some better way - echo - echo -e "\e[1m APT proxy settings \e[0m" - lines="$(cat /etc/apt/apt.conf | grep proxy -i | wc -l)" - if [ "$lines" -gt 0 ]; then - cat /etc/apt/apt.conf | grep proxy -i | sed -e "s/Acquire//g" -e "s/\:\:/\ /g" -e "s/\;//g" - else - echo -e "\e[36m None \e[0m" - fi -} - -unset_proxy() { - if [ ! -e "/etc/apt/apt.conf" ]; then - return - fi - if [ "$(cat /etc/apt/apt.conf | grep proxy -i | wc -l)" -gt 0 ]; then - sed "/Proxy/d" -i /etc/apt/apt.conf - fi -} - -set_proxy() { - if [ ! -e "/etc/apt/apt.conf" ]; then - touch "/etc/apt/apt.conf" - fi - var= - if [ "$4" = "y" ]; then - var="$5:$6@" - fi - echo -n "" > apt_config.tmp - if [ "$3" = "y" ]; then - newvar="://$var$1:$2" - echo "Acquire::Http::Proxy \"http$newvar\";" >> apt_config.tmp - echo "Acquire::Https::Proxy \"http$newvar\";" >> apt_config.tmp - echo "Acquire::Ftp::Proxy \"ftp$newvar\";" >> apt_config.tmp - - fix_new_line "/etc/apt/apt.conf" - cat apt_config.tmp | tee -a /etc/apt/apt.conf > /dev/null - rm apt_config.tmp - return - - elif [ "$3" = "n" ]; then - echo "Acquire::Http::Proxy \"http://$var$1:$2\";" >> apt_config.tmp - echo "Acquire::Https::Proxy \"http://$var$7:$8\";" >> apt_config.tmp - echo "Acquire::Ftp::Proxy \"ftp://$var$9:$10\";" >> apt_config.tmp - - cat apt_config.tmp | tee -a /etc/apt/apt.conf > /dev/null - rm apt_config.tmp - return - fi -} - - -apt_available="$(which apt)" -if [ "$apt_available" = "" ]; then - exit -fi - - -if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - # that's what is needed - unset_proxy - exit - # toggle proxy had issues with commenting and uncommenting - # dropping the feature currently -elif [ "$1" = "list" ]; then - list_proxy - exit -fi - -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 diff --git a/bash.sh b/bash.sh deleted file mode 100644 index 381af8b..0000000 --- a/bash.sh +++ /dev/null @@ -1,137 +0,0 @@ -#!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "Users's bashrc" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. -# if this is "toggle", toggle settings. - - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# here your code starts - -# privileges has to be set by the process which starts this script - -# toggle_proxy() { -# if [ "$(cat $HOME/.bashrc | grep proxy -i | wc -l)" -gt 0 ]; then -# sed -e "/proxy/ s/#*//" -i $HOME/.bashrc -# else -# sed -e "/proxy/ s/^#*/#/" -i $HOME/.bashrc -# fi -# } - -fix_new_line() { - if [[ $(tail -c 1 "$1" | wc --lines ) = 0 ]]; then - echo >> "$1" - fi -} - -list_proxy() { - echo - echo -e "\e[1m Bash proxy settings \e[0m" - lines="$(cat $HOME/.bashrc | grep proxy -i | wc -l)" - if [ "$lines" -gt 0 ]; then - cat $HOME/.bashrc | grep proxy -i | sed "s/\=/\ /g" - else - echo -e "\e[36m None \e[0m" - fi -} - -unset_proxy() { - if [ ! -e "$HOME/.bashrc" ]; then - return - fi - sed -i "/proxy\=/d" $HOME/.bashrc - sed -i "/PROXY\=/d" $HOME/.bashrc -} - -set_proxy() { - if [ ! -e "$HOME/.bashrc" ]; then - touch "$HOME/.bashrc" - fi - - var= - if [ "$4" = "y" ]; then - var="$5:$6@" - fi - - echo -n "" > bash_config.tmp - if [ "$3" = "y" ]; then - newvar="://$var$1:$2" - echo "http_proxy=\"http$newvar\"" >> bash_config.tmp - echo "https_proxy=\"http$newvar\"" >> bash_config.tmp - echo "ftp_proxy=\"ftp$newvar\"" >> bash_config.tmp - echo "HTTP_PROXY=\"http$newvar\"" >> bash_config.tmp - echo "HTTPS_PROXY=\"http$newvar\"" >> bash_config.tmp - echo "FTP_PROXY=\"ftp$newvar\"" >> bash_config.tmp - - fix_new_line $HOME/.bashrc - cat bash_config.tmp | tee -a $HOME/.bashrc > /dev/null - rm bash_config.tmp - return - - elif [ "$3" = "n" ]; then - echo "http_proxy=\"http://$var$1:$2\"" >> bash_config.tmp - echo "http_proxy=\"http://$var$7:$8\"" >> bash_config.tmp - echo "ftp_proxy=\"ftp://$var$9:$10\"" >> bash_config.tmp - echo "HTTP_PROXY=\"http://$var$1:$2\"" >> bash_config.tmp - echo "HTTPS_PROXY=\"http://$var$7:$8\"" >> bash_config.tmp - echo "FTP_PROXY=\"ftp://$var$9:$10\"" >> bash_config.tmp - - cat bash_config.tmp | tee -a $HOME/.bashrc > /dev/null - rm bash_config.tmp - return - fi -} - -if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - # that's what is needed - unset_proxy - source "$HOME/.bashrc" - exit -# elif [ "$1" = "toggle" ]; then -# toggle_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 -# exit -elif [ "$1" = "list" ]; then - list_proxy - exit -fi - - -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 -source "$HOME/.bashrc" diff --git a/common.txt b/common.txt deleted file mode 100644 index 1d14b2b..0000000 --- a/common.txt +++ /dev/null @@ -1,49 +0,0 @@ -# expected command line arguments -# -# Created by "yourgoodname" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "TARGET ENVIRON" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. -# if this is "toggle", simply toggle current settings. - -# $2 : http_port -# $3 : use_same ; "yes" or "no" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# below settings are removed as of now -# reason : they are generally not required in daily use -# and some applications (like whatsapp web) are not comfortable -# with them. -# also, handling them requires rework on certain areas. -# -# most applications do follow http proxy -## $11 : socks_host -## $12 : socks_port -## $13 : rsync_host -## $14 : rsync_port -########### - -# here your code starts - diff --git a/dnf.sh b/dnf.sh deleted file mode 100644 index 8b05004..0000000 --- a/dnf.sh +++ /dev/null @@ -1,110 +0,0 @@ -#!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "dnf" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# here your code starts - -# privileges has to be set by the process which starts this script - -fix_new_line() { - if [[ $(tail -c 1 "$1" | wc --lines ) = 0 ]]; then - echo >> "$1" - fi -} - -list_proxy() { - echo - echo -e "\e[1m DNF proxy settings (raw) \e[0m" - lines="$(cat /etc/dnf/dnf.conf | grep proxy -i | wc -l)" - if [ "$lines" -gt 0 ]; then - cat /etc/dnf/dnf.conf | grep proxy -i | sed -e "s/\=/\ /g" - else - echo -e "\e[36m None \e[0m" - fi -} - -unset_proxy() { - if [ ! -e "/etc/dnf/dnf.conf" ]; then - return - fi - if [ "$(cat /etc/dnf/dnf.conf | grep proxy -i | wc -l)" -gt 0 ]; then - sed "/proxy/d" -i /etc/dnf/dnf.conf - fi -} - -set_proxy() { - if [ ! -e "/etc/dnf/dnf.conf" ]; then - touch "/etc/dnf/dnf.conf" - fi - - echo -n "" > dnf_config.tmp - echo "proxy=http://$1:$2" > dnf_config.tmp - - if [ "$4" = "y" ]; then - echo "proxy_username=$5" >> dnf_config.tmp - echo "proxy_password=$6" >> dnf_config.tmp - fi - - fix_new_line "/etc/dnf/dnf.conf" - cat dnf_config.tmp | tee -a /etc/dnf/dnf.conf > /dev/null - rm dnf_config.tmp - return -} - - -dnf_available="$(which dnf)" -if [ "$dnf_available" = "" ]; then - exit -fi - - -if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - unset_proxy - exit - # toggle proxy had issues with commenting and uncommenting - # dropping the feature currently -elif [ "$1" = "list" ]; then - list_proxy - exit -fi - -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 diff --git a/dropbox.sh b/dropbox.sh deleted file mode 100644 index b1e4889..0000000 --- a/dropbox.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "dropbox" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# here your code starts - -# privileges has to be set by the process which starts this script - -list_proxy() { - echo - echo -e "\e[1m Dropbox proxy settings \e[0m" - echo -e "\e[36m Sorry! Dropbox does not provide viewing configs". -} - -unset_proxy() { - dropbox proxy none > /dev/null -} - -set_proxy() { - dropbox proxy manual http $1 $2 $5 $6 > /dev/null -} - - -dropbox_available="$(which dropbox)" -if [ "$dropbox_available" = "" ]; then - exit -fi - -if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - # that's what is needed - unset_proxy - exit - # toggle proxy had issues with commenting and uncommenting - # dropping the feature currently -elif [ "$1" = "list" ]; then - list_proxy - exit -fi - -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 diff --git a/environment.sh b/environment.sh deleted file mode 100644 index 431e15e..0000000 --- a/environment.sh +++ /dev/null @@ -1,137 +0,0 @@ -#!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set proxy variables in /etc/environment for ProxyMan -# proxy settings in environment variables is applicable to all users -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. -# if this is "toggle", toggle settings. - - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is y, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# here your code starts - -# privileges has to be set by the process which starts this script - -# toggle_proxy() { -# if [ "$(cat /etc/environment | grep proxy -i | wc -l)" -gt 0 ]; then -# sed -e "/proxy/ s/#*//" -i /etc/environment -# else -# sed -e "/proxy/ s/^#*/#/" -i /etc/environment -# fi -# } - -fix_new_line() { - if [[ $(tail -c 1 "$1" | wc --lines ) = 0 ]]; then - echo >> "$1" - fi -} - -list_proxy() { - echo - echo -e "\e[1m Environment proxy settings \e[0m" - lines="$(cat /etc/environment | grep proxy -i | wc -l)" - if [ "$lines" -gt 0 ]; then - cat "/etc/environment" | grep proxy -i | sed "s/\=/\ /g" - else - echo -e "\e[36m None \e[0m" - fi -} - -unset_proxy() { - if [ ! -e "/etc/environment" ]; then - return - fi - sed -i "/proxy\=/d" /etc/environment - sed -i "/PROXY\=/d" /etc/environment -} - -set_proxy() { - if [ ! -e "/etc/environment" ]; then - touch "/etc/environment" - fi - - var= - if [ "$4" = "y" ]; then - var="$5:$6@" - fi - - echo -n "" > bash_config.tmp - if [ "$3" = "y" ]; then - newvar="://$var$1:$2" - echo "http_proxy=\"http$newvar\"" >> bash_config.tmp - echo "https_proxy=\"http$newvar\"" >> bash_config.tmp - echo "ftp_proxy=\"ftp$newvar\"" >> bash_config.tmp - echo "HTTP_PROXY=\"http$newvar\"" >> bash_config.tmp - echo "HTTPS_PROXY=\"http$newvar\"" >> bash_config.tmp - echo "FTP_PROXY=\"ftp$newvar\"" >> bash_config.tmp - - cat bash_config.tmp | tee -a /etc/environment > /dev/null - rm bash_config.tmp - return - - elif [ "$3" = "n" ]; then - echo "http_proxy=\"http://$var$1:$2\"" >> bash_config.tmp - echo "https_proxy=\"http://$var$7:$8\"" >> bash_config.tmp - echo "ftp_proxy=\"ftp://$var$9:$10\"" >> bash_config.tmp - echo "HTTP_PROXY=\"http://$var$1:$2\"" >> bash_config.tmp - echo "HTTPS_PROXY=\"http://$var$7:$8\"" >> bash_config.tmp - echo "FTP_PROXY=\"ftp://$var$9:$10\"" >> bash_config.tmp - - fix_new_line "/etc/environment" - cat bash_config.tmp | tee -a /etc/environment > /dev/null - rm bash_config.tmp - return - fi -} - - -if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - # that's what is needed - unset_proxy - exit -# elif [ "$1" = "toggle" ]; then -# toggle_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 - # exit -elif [ "$1" = "list" ]; then - list_proxy - exit -fi - - -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 diff --git a/git.sh b/git.sh deleted file mode 100644 index 0f4319e..0000000 --- a/git.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "git" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# here your code starts - -# privileges has to be set by the process which starts this script - -list_proxy() { - echo - echo -e "\e[1m git proxy settings \e[0m" - echo -e "\e[36m HTTP Proxy \e[0m" $(git config --global http.proxy) -} - -unset_proxy() { - git config --global --unset http.proxy - git config --global --unset https.proxy -} - -set_proxy() { - if [ "$4" = "y" ]; then - var="$5:$6@" - fi - if [ "$3" = "y" ]; then - newvar="://$var$1:$2" - git config --global http.proxy "http$newvar" - git config --global https.proxy "http$newvar" - elif [ "$3" = "n" ]; then - git config --global http.proxy "http://$var$1:$2" - git config --global https.proxy "http://$var$1:$2" - fi -} - - -git_available="$(which git)" -if [ "$git_available" = "" ]; then - exit -fi - -if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - # that's what is needed - unset_proxy - exit - # toggle proxy had issues with commenting and uncommenting - # dropping the feature currently -elif [ "$1" = "list" ]; then - list_proxy - exit -fi - -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 diff --git a/gsettings.sh b/gsettings.sh deleted file mode 100644 index e77efc4..0000000 --- a/gsettings.sh +++ /dev/null @@ -1,133 +0,0 @@ -#!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "GNOME Desktop" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this is "toggle", toggle settings. -# if this argument is "unset", proxy settings should be unset. - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# here your code starts - -# privileges has to be set by the process which starts this script - -# gettings : this is what Ubuntu and other GNOME based distributions use -# for storing configuration -# Your system settings UI uses gsettings at the backend. - -list_proxy() { - echo - echo -e "\e[1m Desktop proxy settings (GNOME)\e[0m" - mode="$(gsettings get org.gnome.system.proxy mode)" - if [ "$mode" = "'none'" ]; then - echo -e "\e[36m None \e[0m" - return - fi - - echo -e "\e[36m HTTP Proxy \e[0m" Host : $(gsettings get org.gnome.system.proxy.http host) Port : $(gsettings get org.gnome.system.proxy.http port) - echo -e "\e[36m Auth \e[0m" User : $(gsettings get org.gnome.system.proxy.http authentication-user) Password : $(gsettings get org.gnome.system.proxy.http authentication-password) - echo -e "\e[36m HTTPS Proxy \e[0m" Host : $(gsettings get org.gnome.system.proxy.https host) Port : $(gsettings get org.gnome.system.proxy.https port) - echo -e "\e[36m FTP Proxy \e[0m" Host : $(gsettings get org.gnome.system.proxy.ftp host) Port : $(gsettings get org.gnome.system.proxy.ftp port) - echo -e "\e[36m SOCKS Proxy \e[0m" Host : $(gsettings get org.gnome.system.proxy.socks host) Port : $(gsettings get org.gnome.system.proxy.socks port) - -} - -toggle_proxy() { - if [ "$(gsettings get org.gnome.system.proxy mode)" = "none" ]; then - gsettings set org.gnome.system.proxy mode "manual" - else - gsettings set org.gnome.system.proxy mode "none" - fi -} - -unset_proxy() { - gsettings set org.gnome.system.proxy mode "none" - gsettings set org.gnome.system.proxy.http host \"\" - gsettings set org.gnome.system.proxy.http port 0 - gsettings set org.gnome.system.proxy.https host "\"\"" - gsettings set org.gnome.system.proxy.https port 0 - gsettings set org.gnome.system.proxy.ftp host "\"\"" - gsettings set org.gnome.system.proxy.ftp port 0 - gsettings set org.gnome.system.proxy.http use-authentication false - gsettings set org.gnome.system.proxy.http authentication-user "\"\"" - gsettings set org.gnome.system.proxy.http authentication-password "\"\"" -} - -set_proxy() { - if [ "$4" = "y" ]; then - gsettings set org.gnome.system.proxy.http authentication-user "$5" - gsettings set org.gnome.system.proxy.http authentication-password "$6" - fi - if [ "$3" = "y" ]; then - gsettings set org.gnome.system.proxy.http host $1 - gsettings set org.gnome.system.proxy.http port $2 - gsettings set org.gnome.system.proxy.https host $1 - gsettings set org.gnome.system.proxy.https port $2 - gsettings set org.gnome.system.proxy.ftp host $1 - gsettings set org.gnome.system.proxy.ftp port $2 - elif [ "$3" = "n" ]; then - gsettings set org.gnome.system.proxy.http host $1 - gsettings set org.gnome.system.proxy.http port $2 - gsettings set org.gnome.system.proxy.https host $7 - gsettings set org.gnome.system.proxy.https port $8 - gsettings set org.gnome.system.proxy.ftp host $9 - gsettings set org.gnome.system.proxy.ftp port $10 - fi - gsettings set org.gnome.system.proxy mode "manual" -} - - -gsettings_available="$(which gsettings)" -if [ "$gsettings_available" = "" ]; then - exit -fi - -if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - # that's what is needed - unset_proxy - exit -# elif [ "$1" = "toggle" ]; then -# toggle_proxy - exit -elif [ "$1" = "list" ]; then - list_proxy - exit -fi - - -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 diff --git a/main.sh b/main.sh deleted file mode 100755 index 287ff6b..0000000 --- a/main.sh +++ /dev/null @@ -1,318 +0,0 @@ -#!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues - -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "TARGET ENVIRON" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. -# if this is "toggle", toggle settings. - -# $2 : http_port -# $3 : use_same ; "yes" or "no" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# here your code starts - -# This is the main script which calls other respective scripts. -# In case of doubts regarding how to use, refer the README.md file. -clear -if [ "$1" = "list" ]; then - echo "Someone wants to list all" - bash "bash.sh" "list" - sudo bash "environment.sh" "list" - sudo bash "apt.sh" "list" - sudo bash "dnf.sh" "list" - bash "gsettings.sh" "list" - bash "npm.sh" "list" - bash "dropbox.sh" "list" - bash "git.sh" "list" - exit -fi - -http_host="" -http_port="" -use_same="n" -https_host="" -https_port="" -ftp_host="" -ftp_port="" -use_auth="n" -username="" -password="" -save_for_reuse="" -profile_name="" - - -if [[ "$1" == "load" && "$2" == "" ]]; then - echo -ne "\e[1m \e[31mPlease provide a config! \e[0m" - echo - exit -fi - -if [ "$1" == "load" ]; then - choice="set" - -else - echo -e " -\e[1m\e[33mProxyMan -=========\e[0m -Tool to set up system wide proxy settings on Linux. -\e[2m\e[33m🌟\e[0m\e[3m Star it \e[0m : \e[4m\e[34m https://github.com/himanshub16/ProxyMan \e[0m - -\e[4mThe following options are available : \e[0m -\e[1m set \e[0m : \e[2m Set proxy settings \e[0m -\e[1m unset \e[0m : \e[2m Unset proxy settings \e[0m -\e[1m list \e[0m : \e[2m List current settings \e[0m -\e[1m load \e[0m : \e[2m Load previously saved settings \e[0m -" - - read -p " Enter your choice : " choice - - if [[ (! "$choice" = "set") && (! "$choice" = "unset") && (! "$choice" = "list") && (! "$choice" = "load") ]]; then - echo "Invalid choice! Will exit." - exit - fi - - if [ "$choice" = "set" ]; then - - echo - echo -e " \e[4mEnter details \e[0m : \e[2m\e[3m (leave blank if you don't to use any proxy settings) \e[0m" - echo - echo -ne "\e[36m HTTP Proxy host \e[0m"; read http_host - echo -ne "\e[32m HTTP Proxy port \e[0m"; read http_port - echo -ne "\e[0m Use same for HTTPS and FTP (y/n) ? \e[0m"; read use_same - echo -ne "\e[0m Use authentication (y/n) ? \e[0m "; read use_auth - - if [[ "$use_auth" = "y" || "$use_auth" = "Y" ]]; then - read -p " Enter username : " username - echo -n " Enter password (use %40 for @) : " ; read -s password - fi - - echo -ne "\e[0m Save settings for later use (y/n) ? \e[0m"; read save_for_reuse - - if [[ "$save_for_reuse" = "y" || "$save_for_reuse" = "Y" ]]; then - read -p " Enter config name : " profile_name - fi - - if [[ "$use_same" = "y" || "$use_same" = "Y" ]]; then - https_host=$http_host - ftp_host=$http_host - https_port=$http_port - ftp_port=$http_port - rsync_host=$http_host - rsync_port=$https_port - else - echo -ne "\e[36m HTTPS Proxy host \e[0m " ; read https_host - echo -ne "\e[32m HTTPS Proxy port \e[0m " ; read https_port - echo -ne "\e[36m FTP Proxy host \e[0m " ; read ftp_host - echo -ne "\e[32m FTP Proxy port \e[0m " ; read ftp_port - fi - fi -fi - -echo -echo -e " \e[0m\e[4m\e[33mEnter targets where you want to modify settings : \e[0m" -echo -e " |\e[36m 1 \e[0m| All of them ... Don't bother me" -echo -e " |\e[36m 2 \e[0m| Terminal / Bash (current user) " -echo -e " |\e[36m 3 \e[0m| Environment variables (/etc/environment)" -echo -e " |\e[36m 4 \e[0m| apt/dnf (package manager)" -echo -e " |\e[36m 5 \e[0m| Desktop settings (GNOME/Ubuntu)" -echo -e " |\e[36m 6 \e[0m| npm" -echo -e " |\e[36m 7 \e[0m| Dropbox" -echo -e " |\e[36m 8 \e[0m| Git" -echo - -echo -e " Enter your choices (\e[3m\e[2m separate multiple choices by a space \e[0m ) " -echo -ne "\e[5m ? \e[0m" ; read -a targets - -echo - -case $choice in - "set"|"load") - - if [[ "$1" != "load" && ( "$save_for_reuse" = "y" || "$save_for_reuse" = "Y" ) ]]; then - config_file="http_host=$http_host%s\nhttp_port=$http_port%s\nuse_same=$use_same\nuse_auth=$use_auth\nusername=$username\npassword=$password\nhttps_host=$https_host\nhttps_port=$https_port\nftp_host=$ftp_host\nftp_port=$ftp_port" - printf $config_file > "profiles/$profile_name".txt - fi - - if [[ $choice == "load" || $1 == "load" ]]; then - - if [[ $choice == "load" ]]; then - echo -ne "\e[36m Config Name \e[0m " ; read config_name - fi - - if [ "$1" = "load" ]; then - - if [ "$2" = "" ]; then - echo -ne "\e[1m \e[31mPlease provide a config! \e[0m" - echo - exit - fi - - config_name=$2 - fi - - if [ ! -e profiles/"$config_name".txt ]; then - echo -ne "\e[1m \e[31mFile does not exist! \e[0m" - echo - exit - fi - - http_host=`grep http_host -i profiles/$config_name.txt | cut -d= -f2` - http_port=`grep http_port -i profiles/$config_name.txt | cut -d= -f2` - use_same=`grep use_same -i profiles/$config_name.txt | cut -d= -f2` - use_auth=`grep use_auth -i profiles/$config_name.txt | cut -d= -f2` - username=`grep username -i profiles/$config_name.txt | cut -d= -f2` - password=`grep password -i profiles/$config_name.txt | cut -d= -f2` - https_host=`grep https_host -i profiles/$config_name.txt | cut -d= -f2` - https_port=`grep https_port -i profiles/$config_name.txt | cut -d= -f2` - ftp_host=`grep ftp_host -i profiles/$config_name.txt | cut -d= -f2` - ftp_port=`grep ftp_port -i profiles/$config_name.txt | cut -d= -f2` - - echo -e " Config \033[0;36m$config_name\033[0m successfully loaded" - fi - - args=("$http_host" "$http_port" "$use_same" "$use_auth" "$username" "$password" "$https_host" "$https_port" "$ftp_host" "$ftp_port" ) - - for i in "${targets[@]}" - do - case $i in - 1) - bash "bash.sh" "${args[@]}" - sudo bash "environment.sh" "${args[@]}" - sudo bash "apt.sh" "${args[@]}" - sudo bash "dnf.sh" "${args[@]}" - bash "gsettings.sh" "${args[@]}" - bash "npm.sh" "${args[@]}" - bash "dropbox.sh" "${args[@]}" - bash "git.sh" "${args[@]}" - ;; - 2) - bash "bash.sh" "${args[@]}" - ;; - 3) sudo bash "environment.sh" "${args[@]}" - ;; - 4) sudo bash "apt.sh" "${args[@]}" - sudo bash "dnf.sh" "${args[@]}" - ;; - 5) bash "gsettings.sh" "${args[@]}" - ;; - 6) bash "npm.sh" "${args[@]}" - ;; - 7) bash "dropbox.sh" "${args[@]}" - ;; - 8) bash "git.sh" "${args[@]}" - ;; - *) ;; - esac - done - ;; - - "unset") - for i in "${targets[@]}" - do - case $i in - 1) echo "Someone wants to unset all" - bash "bash.sh" "unset" - sudo bash "environment.sh" "unset" - sudo bash "apt.sh" "unset" - sudo bash "dnf.sh" "unset" - bash "gsettings.sh" "unset" - bash "npm.sh" "unset" - bash "dropbox.sh" "unset" - bash "git.sh" "unset" - ;; - 2) - bash "bash.sh" "unset" - ;; - 3) sudo bash "environment.sh" "unset" - ;; - 4) sudo bash "apt.sh" "unset" - sudo bash "dnf.sh" "unset" - ;; - 5) bash "gsettings.sh" "unset" - ;; - 6) bash "npm.sh" "unset" - ;; - 7) bash "dropbox.sh" "unset" - ;; - 8) bash "git.sh" "unset" - ;; - *) ;; - esac - done - ;; - - "list") - echo -ne "\e[1m \e[31m This will list all your passwords. Continue ? (y/n) \e[0m"; read - if [[ "$REPLY" = "y" || "$REPLY" = "Y" ]]; then - for i in "${targets[@]}" - do - case $i in - 1) echo "Someone wants to list all" - bash "bash.sh" "list" - sudo bash "environment.sh" "list" - sudo bash "apt.sh" "list" - sudo bash "dnf.sh" "list" - bash "gsettings.sh" "list" - bash "npm.sh" "list" - bash "dropbox.sh" "list" - bash "git.sh" "list" - ;; - 2) - bash "bash.sh" "list" - ;; - 3) sudo bash "environment.sh" "list" - ;; - 4) sudo bash "apt.sh" "list" - sudo bash "dnf.sh" "list" - ;; - 5) bash "gsettings.sh" "list" - ;; - 6) bash "npm.sh" "list" - ;; - 7) bash "dropbox.sh" "list" - ;; - 8) bash "git.sh" "list" - ;; - *) ;; - esac - done - - fi - ;; - - *) - echo "Invalid choice! Will exit now" - exit - ;; -esac - -echo -echo -e "\e[1m\e[36mDone!\e[0m \e[2mThanks for using :)\e[0m" diff --git a/npm.sh b/npm.sh deleted file mode 100644 index f7e076a..0000000 --- a/npm.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "npm" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# here your code starts - -# privileges has to be set by the process which starts this script - -list_proxy() { - echo - echo -e "\e[1m NPM proxy settings \e[0m" - echo -e "\e[36m HTTP Proxy \e[0m" $(npm config get proxy) - echo -e "\e[36m HTTPS Proxy \e[0m" $(npm config get https-proxy) -} - -unset_proxy() { - npm config rm proxy - npm config rm https-proxy -} - -set_proxy() { - # notice http (without `s`) in `https`, issue #41 - if [ "$4" = "y" ]; then - var="$5:$6@" - fi - if [ "$3" = "y" ]; then - newvar="://$var$1:$2" - npm config set proxy "http$newvar" - npm config set https-proxy "http$newvar" - elif [ "$3" = "n" ]; then - npm config set proxy "http://$var$1:$2" - npm config set https-proxy "http://$var$7:$8" - fi -} - - -npm_available="$(which npm)" -if [ "$npm_available" = "" ]; then - exit -fi - -if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - # that's what is needed - unset_proxy - exit - # toggle proxy had issues with commenting and uncommenting - # dropping the feature currently -elif [ "$1" = "list" ]; then - list_proxy - exit -fi - -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 diff --git a/profiles/sample.txt b/profiles/sample.txt deleted file mode 100644 index cc38d3b..0000000 --- a/profiles/sample.txt +++ /dev/null @@ -1,10 +0,0 @@ -http_host=175.215.214.126 -http_port=8080 -use_same=y -use_auth=n -username= -password= -https_host=175.215.214.126 -https_port=8080 -ftp_host=175.215.214.126 -ftp_port=8080 \ No newline at end of file diff --git a/screenshot.png b/screenshot.png deleted file mode 100644 index d3835398db5e79826c6605c31d50ad4987bff8c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63560 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

kb}Z- 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 From 393b46ab3d3f43f405ab14d46cda7fd3c3a2ec08 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Wed, 4 Apr 2018 23:21:55 +0530 Subject: [PATCH 13/54] update readme --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index e8d36b2..72d5a65 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,12 @@ * Saves your settings in a `config_file/rc_file` (same as profiles). * Single script sourced in `.bashrc/.zshrc` ensures the right config is sourced directly instead of manually invoking the script. +### How did v1 and v2 work? +Both versions modified the config files or called the appropriate command of respective tools to configure their internal proxy settings. + +### The need for this change. +Most of the tools/targets which proxyman sets proxy for work well with `http_proxy` environment variable. Thus, the need for manually configuring proxy for each target becomes insignificant. + +Also, there can be a use-case where the user wants granular control like different proxy for different application. However, such use-case is very small. + +Open for discussions at #49 . From 8f3caaa481df22962db96248c35cee8a88ca99dd Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Wed, 4 Apr 2018 23:22:53 +0530 Subject: [PATCH 14/54] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 72d5a65..9d89599 100644 --- a/README.md +++ b/README.md @@ -17,4 +17,4 @@ Most of the tools/targets which proxyman sets proxy for work well with `http_pro Also, there can be a use-case where the user wants granular control like different proxy for different application. However, such use-case is very small. -Open for discussions at #49 . +Open for discussions at [#49](https://github.com/himanshub16/ProxyMan/issues/49) . From 140c956f723e21d6240b0c45dbd2c26d0d24118d Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Wed, 27 Jun 2018 13:36:45 +0530 Subject: [PATCH 15/54] Revert "cleanup" This reverts commit 72b357090532daec583edc09bd3310adf0f5e12b. --- apt.sh | 124 +++++++++++++++++ bash.sh | 137 +++++++++++++++++++ common.txt | 49 +++++++ dnf.sh | 110 +++++++++++++++ dropbox.sh | 79 +++++++++++ environment.sh | 137 +++++++++++++++++++ git.sh | 90 +++++++++++++ gsettings.sh | 133 ++++++++++++++++++ main.sh | 318 ++++++++++++++++++++++++++++++++++++++++++++ npm.sh | 92 +++++++++++++ profiles/sample.txt | 10 ++ screenshot.png | Bin 0 -> 63560 bytes 12 files changed, 1279 insertions(+) create mode 100644 apt.sh create mode 100644 bash.sh create mode 100644 common.txt create mode 100644 dnf.sh create mode 100644 dropbox.sh create mode 100644 environment.sh create mode 100644 git.sh create mode 100644 gsettings.sh create mode 100755 main.sh create mode 100644 npm.sh create mode 100644 profiles/sample.txt create mode 100644 screenshot.png diff --git a/apt.sh b/apt.sh new file mode 100644 index 0000000..4931c3c --- /dev/null +++ b/apt.sh @@ -0,0 +1,124 @@ +#!/bin/bash +# +# If you have found some issues, or some feature request : +# Raise them here : https://github.com/himanshub16/ProxyMan/issues +# +# expected command line arguments +# +# Created by "Himanshu Shekhar" +# For ProxyMan "https://github.com/himanshub16/ProxyMan/" +# +# convention to be followed across extension made / to be made +# include this comment section in all plugins to avoid confusions while coding +# +# plugin to set "apt" proxy settings for ProxyMan +# +# The arguments are given in bash syntax to maintain universality and ease +# across all UNIX systems. +# Your language can use it's respective syntax for +# arguments and comments. +# If you don't need any particular proxy settings, ignore the variables. + +# $# : number of arguments +# $1 : http_host +# if this argument is "unset", proxy settings should be unset. + +# $2 : http_port +# $3 : use_same ; "y" or "n" +# $4 : use_auth +# $5 : username ; send empty string if not available +# $6 : password ; send empty string if not available +# +# if use same is yes, then no further arguments are considered +# +# $7 : https_host +# $8 : https_port +# $9 : ftp_host +# $10 : ftp_port + +# here your code starts + +# privileges has to be set by the process which starts this script + +fix_new_line() { + if [[ $(tail -c 1 "$1" | wc --lines ) = 0 ]]; then + echo >> "$1" + fi +} + +list_proxy() { + # inefficient way as the file is read twice.. think of some better way + echo + echo -e "\e[1m APT proxy settings \e[0m" + lines="$(cat /etc/apt/apt.conf | grep proxy -i | wc -l)" + if [ "$lines" -gt 0 ]; then + cat /etc/apt/apt.conf | grep proxy -i | sed -e "s/Acquire//g" -e "s/\:\:/\ /g" -e "s/\;//g" + else + echo -e "\e[36m None \e[0m" + fi +} + +unset_proxy() { + if [ ! -e "/etc/apt/apt.conf" ]; then + return + fi + if [ "$(cat /etc/apt/apt.conf | grep proxy -i | wc -l)" -gt 0 ]; then + sed "/Proxy/d" -i /etc/apt/apt.conf + fi +} + +set_proxy() { + if [ ! -e "/etc/apt/apt.conf" ]; then + touch "/etc/apt/apt.conf" + fi + var= + if [ "$4" = "y" ]; then + var="$5:$6@" + fi + echo -n "" > apt_config.tmp + if [ "$3" = "y" ]; then + newvar="://$var$1:$2" + echo "Acquire::Http::Proxy \"http$newvar\";" >> apt_config.tmp + echo "Acquire::Https::Proxy \"http$newvar\";" >> apt_config.tmp + echo "Acquire::Ftp::Proxy \"ftp$newvar\";" >> apt_config.tmp + + fix_new_line "/etc/apt/apt.conf" + cat apt_config.tmp | tee -a /etc/apt/apt.conf > /dev/null + rm apt_config.tmp + return + + elif [ "$3" = "n" ]; then + echo "Acquire::Http::Proxy \"http://$var$1:$2\";" >> apt_config.tmp + echo "Acquire::Https::Proxy \"http://$var$7:$8\";" >> apt_config.tmp + echo "Acquire::Ftp::Proxy \"ftp://$var$9:$10\";" >> apt_config.tmp + + cat apt_config.tmp | tee -a /etc/apt/apt.conf > /dev/null + rm apt_config.tmp + return + fi +} + + +apt_available="$(which apt)" +if [ "$apt_available" = "" ]; then + exit +fi + + +if [ "$#" = 0 ]; then + exit +fi + +if [ "$1" = "unset" ]; then + # that's what is needed + unset_proxy + exit + # toggle proxy had issues with commenting and uncommenting + # dropping the feature currently +elif [ "$1" = "list" ]; then + list_proxy + exit +fi + +unset_proxy +set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 diff --git a/bash.sh b/bash.sh new file mode 100644 index 0000000..381af8b --- /dev/null +++ b/bash.sh @@ -0,0 +1,137 @@ +#!/bin/bash +# +# If you have found some issues, or some feature request : +# Raise them here : https://github.com/himanshub16/ProxyMan/issues +# +# expected command line arguments +# +# Created by "Himanshu Shekhar" +# For ProxyMan "https://github.com/himanshub16/ProxyMan/" +# +# convention to be followed across extension made / to be made +# include this comment section in all plugins to avoid confusions while coding +# +# plugin to set "Users's bashrc" proxy settings for ProxyMan +# +# The arguments are given in bash syntax to maintain universality and ease +# across all UNIX systems. +# Your language can use it's respective syntax for +# arguments and comments. +# If you don't need any particular proxy settings, ignore the variables. + +# $# : number of arguments +# $1 : http_host +# if this argument is "unset", proxy settings should be unset. +# if this is "toggle", toggle settings. + + +# $2 : http_port +# $3 : use_same ; "y" or "n" +# $4 : use_auth +# $5 : username ; send empty string if not available +# $6 : password ; send empty string if not available +# +# if use same is yes, then no further arguments are considered +# +# $7 : https_host +# $8 : https_port +# $9 : ftp_host +# $10 : ftp_port + +# here your code starts + +# privileges has to be set by the process which starts this script + +# toggle_proxy() { +# if [ "$(cat $HOME/.bashrc | grep proxy -i | wc -l)" -gt 0 ]; then +# sed -e "/proxy/ s/#*//" -i $HOME/.bashrc +# else +# sed -e "/proxy/ s/^#*/#/" -i $HOME/.bashrc +# fi +# } + +fix_new_line() { + if [[ $(tail -c 1 "$1" | wc --lines ) = 0 ]]; then + echo >> "$1" + fi +} + +list_proxy() { + echo + echo -e "\e[1m Bash proxy settings \e[0m" + lines="$(cat $HOME/.bashrc | grep proxy -i | wc -l)" + if [ "$lines" -gt 0 ]; then + cat $HOME/.bashrc | grep proxy -i | sed "s/\=/\ /g" + else + echo -e "\e[36m None \e[0m" + fi +} + +unset_proxy() { + if [ ! -e "$HOME/.bashrc" ]; then + return + fi + sed -i "/proxy\=/d" $HOME/.bashrc + sed -i "/PROXY\=/d" $HOME/.bashrc +} + +set_proxy() { + if [ ! -e "$HOME/.bashrc" ]; then + touch "$HOME/.bashrc" + fi + + var= + if [ "$4" = "y" ]; then + var="$5:$6@" + fi + + echo -n "" > bash_config.tmp + if [ "$3" = "y" ]; then + newvar="://$var$1:$2" + echo "http_proxy=\"http$newvar\"" >> bash_config.tmp + echo "https_proxy=\"http$newvar\"" >> bash_config.tmp + echo "ftp_proxy=\"ftp$newvar\"" >> bash_config.tmp + echo "HTTP_PROXY=\"http$newvar\"" >> bash_config.tmp + echo "HTTPS_PROXY=\"http$newvar\"" >> bash_config.tmp + echo "FTP_PROXY=\"ftp$newvar\"" >> bash_config.tmp + + fix_new_line $HOME/.bashrc + cat bash_config.tmp | tee -a $HOME/.bashrc > /dev/null + rm bash_config.tmp + return + + elif [ "$3" = "n" ]; then + echo "http_proxy=\"http://$var$1:$2\"" >> bash_config.tmp + echo "http_proxy=\"http://$var$7:$8\"" >> bash_config.tmp + echo "ftp_proxy=\"ftp://$var$9:$10\"" >> bash_config.tmp + echo "HTTP_PROXY=\"http://$var$1:$2\"" >> bash_config.tmp + echo "HTTPS_PROXY=\"http://$var$7:$8\"" >> bash_config.tmp + echo "FTP_PROXY=\"ftp://$var$9:$10\"" >> bash_config.tmp + + cat bash_config.tmp | tee -a $HOME/.bashrc > /dev/null + rm bash_config.tmp + return + fi +} + +if [ "$#" = 0 ]; then + exit +fi + +if [ "$1" = "unset" ]; then + # that's what is needed + unset_proxy + source "$HOME/.bashrc" + exit +# elif [ "$1" = "toggle" ]; then +# toggle_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 +# exit +elif [ "$1" = "list" ]; then + list_proxy + exit +fi + + +unset_proxy +set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 +source "$HOME/.bashrc" diff --git a/common.txt b/common.txt new file mode 100644 index 0000000..1d14b2b --- /dev/null +++ b/common.txt @@ -0,0 +1,49 @@ +# expected command line arguments +# +# Created by "yourgoodname" +# For ProxyMan "https://github.com/himanshub16/ProxyMan/" +# +# convention to be followed across extension made / to be made +# include this comment section in all plugins to avoid confusions while coding +# +# plugin to set "TARGET ENVIRON" proxy settings for ProxyMan +# +# The arguments are given in bash syntax to maintain universality and ease +# across all UNIX systems. +# Your language can use it's respective syntax for +# arguments and comments. +# If you don't need any particular proxy settings, ignore the variables. + +# $# : number of arguments +# $1 : http_host +# if this argument is "unset", proxy settings should be unset. +# if this is "toggle", simply toggle current settings. + +# $2 : http_port +# $3 : use_same ; "yes" or "no" +# $4 : use_auth +# $5 : username ; send empty string if not available +# $6 : password ; send empty string if not available +# +# if use same is yes, then no further arguments are considered +# +# $7 : https_host +# $8 : https_port +# $9 : ftp_host +# $10 : ftp_port + +# below settings are removed as of now +# reason : they are generally not required in daily use +# and some applications (like whatsapp web) are not comfortable +# with them. +# also, handling them requires rework on certain areas. +# +# most applications do follow http proxy +## $11 : socks_host +## $12 : socks_port +## $13 : rsync_host +## $14 : rsync_port +########### + +# here your code starts + diff --git a/dnf.sh b/dnf.sh new file mode 100644 index 0000000..8b05004 --- /dev/null +++ b/dnf.sh @@ -0,0 +1,110 @@ +#!/bin/bash +# +# If you have found some issues, or some feature request : +# Raise them here : https://github.com/himanshub16/ProxyMan/issues +# +# expected command line arguments +# +# Created by "Himanshu Shekhar" +# For ProxyMan "https://github.com/himanshub16/ProxyMan/" +# +# convention to be followed across extension made / to be made +# include this comment section in all plugins to avoid confusions while coding +# +# plugin to set "dnf" proxy settings for ProxyMan +# +# The arguments are given in bash syntax to maintain universality and ease +# across all UNIX systems. +# Your language can use it's respective syntax for +# arguments and comments. +# If you don't need any particular proxy settings, ignore the variables. + +# $# : number of arguments +# $1 : http_host +# if this argument is "unset", proxy settings should be unset. + +# $2 : http_port +# $3 : use_same ; "y" or "n" +# $4 : use_auth +# $5 : username ; send empty string if not available +# $6 : password ; send empty string if not available +# +# if use same is yes, then no further arguments are considered +# +# $7 : https_host +# $8 : https_port +# $9 : ftp_host +# $10 : ftp_port + +# here your code starts + +# privileges has to be set by the process which starts this script + +fix_new_line() { + if [[ $(tail -c 1 "$1" | wc --lines ) = 0 ]]; then + echo >> "$1" + fi +} + +list_proxy() { + echo + echo -e "\e[1m DNF proxy settings (raw) \e[0m" + lines="$(cat /etc/dnf/dnf.conf | grep proxy -i | wc -l)" + if [ "$lines" -gt 0 ]; then + cat /etc/dnf/dnf.conf | grep proxy -i | sed -e "s/\=/\ /g" + else + echo -e "\e[36m None \e[0m" + fi +} + +unset_proxy() { + if [ ! -e "/etc/dnf/dnf.conf" ]; then + return + fi + if [ "$(cat /etc/dnf/dnf.conf | grep proxy -i | wc -l)" -gt 0 ]; then + sed "/proxy/d" -i /etc/dnf/dnf.conf + fi +} + +set_proxy() { + if [ ! -e "/etc/dnf/dnf.conf" ]; then + touch "/etc/dnf/dnf.conf" + fi + + echo -n "" > dnf_config.tmp + echo "proxy=http://$1:$2" > dnf_config.tmp + + if [ "$4" = "y" ]; then + echo "proxy_username=$5" >> dnf_config.tmp + echo "proxy_password=$6" >> dnf_config.tmp + fi + + fix_new_line "/etc/dnf/dnf.conf" + cat dnf_config.tmp | tee -a /etc/dnf/dnf.conf > /dev/null + rm dnf_config.tmp + return +} + + +dnf_available="$(which dnf)" +if [ "$dnf_available" = "" ]; then + exit +fi + + +if [ "$#" = 0 ]; then + exit +fi + +if [ "$1" = "unset" ]; then + unset_proxy + exit + # toggle proxy had issues with commenting and uncommenting + # dropping the feature currently +elif [ "$1" = "list" ]; then + list_proxy + exit +fi + +unset_proxy +set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 diff --git a/dropbox.sh b/dropbox.sh new file mode 100644 index 0000000..b1e4889 --- /dev/null +++ b/dropbox.sh @@ -0,0 +1,79 @@ +#!/bin/bash +# +# If you have found some issues, or some feature request : +# Raise them here : https://github.com/himanshub16/ProxyMan/issues +# +# expected command line arguments +# +# Created by "Himanshu Shekhar" +# For ProxyMan "https://github.com/himanshub16/ProxyMan/" +# +# convention to be followed across extension made / to be made +# include this comment section in all plugins to avoid confusions while coding +# +# plugin to set "dropbox" proxy settings for ProxyMan +# +# The arguments are given in bash syntax to maintain universality and ease +# across all UNIX systems. +# Your language can use it's respective syntax for +# arguments and comments. +# If you don't need any particular proxy settings, ignore the variables. + +# $# : number of arguments +# $1 : http_host +# if this argument is "unset", proxy settings should be unset. + +# $2 : http_port +# $3 : use_same ; "y" or "n" +# $4 : use_auth +# $5 : username ; send empty string if not available +# $6 : password ; send empty string if not available +# +# if use same is yes, then no further arguments are considered +# +# $7 : https_host +# $8 : https_port +# $9 : ftp_host +# $10 : ftp_port + +# here your code starts + +# privileges has to be set by the process which starts this script + +list_proxy() { + echo + echo -e "\e[1m Dropbox proxy settings \e[0m" + echo -e "\e[36m Sorry! Dropbox does not provide viewing configs". +} + +unset_proxy() { + dropbox proxy none > /dev/null +} + +set_proxy() { + dropbox proxy manual http $1 $2 $5 $6 > /dev/null +} + + +dropbox_available="$(which dropbox)" +if [ "$dropbox_available" = "" ]; then + exit +fi + +if [ "$#" = 0 ]; then + exit +fi + +if [ "$1" = "unset" ]; then + # that's what is needed + unset_proxy + exit + # toggle proxy had issues with commenting and uncommenting + # dropping the feature currently +elif [ "$1" = "list" ]; then + list_proxy + exit +fi + +unset_proxy +set_proxy $1 $2 $3 $4 $5 $6 diff --git a/environment.sh b/environment.sh new file mode 100644 index 0000000..431e15e --- /dev/null +++ b/environment.sh @@ -0,0 +1,137 @@ +#!/bin/bash +# +# If you have found some issues, or some feature request : +# Raise them here : https://github.com/himanshub16/ProxyMan/issues +# +# expected command line arguments +# +# Created by "Himanshu Shekhar" +# For ProxyMan "https://github.com/himanshub16/ProxyMan/" +# +# convention to be followed across extension made / to be made +# include this comment section in all plugins to avoid confusions while coding +# +# plugin to set proxy variables in /etc/environment for ProxyMan +# proxy settings in environment variables is applicable to all users +# +# The arguments are given in bash syntax to maintain universality and ease +# across all UNIX systems. +# Your language can use it's respective syntax for +# arguments and comments. +# If you don't need any particular proxy settings, ignore the variables. + +# $# : number of arguments +# $1 : http_host +# if this argument is "unset", proxy settings should be unset. +# if this is "toggle", toggle settings. + + +# $2 : http_port +# $3 : use_same ; "y" or "n" +# $4 : use_auth +# $5 : username ; send empty string if not available +# $6 : password ; send empty string if not available +# +# if use same is y, then no further arguments are considered +# +# $7 : https_host +# $8 : https_port +# $9 : ftp_host +# $10 : ftp_port + +# here your code starts + +# privileges has to be set by the process which starts this script + +# toggle_proxy() { +# if [ "$(cat /etc/environment | grep proxy -i | wc -l)" -gt 0 ]; then +# sed -e "/proxy/ s/#*//" -i /etc/environment +# else +# sed -e "/proxy/ s/^#*/#/" -i /etc/environment +# fi +# } + +fix_new_line() { + if [[ $(tail -c 1 "$1" | wc --lines ) = 0 ]]; then + echo >> "$1" + fi +} + +list_proxy() { + echo + echo -e "\e[1m Environment proxy settings \e[0m" + lines="$(cat /etc/environment | grep proxy -i | wc -l)" + if [ "$lines" -gt 0 ]; then + cat "/etc/environment" | grep proxy -i | sed "s/\=/\ /g" + else + echo -e "\e[36m None \e[0m" + fi +} + +unset_proxy() { + if [ ! -e "/etc/environment" ]; then + return + fi + sed -i "/proxy\=/d" /etc/environment + sed -i "/PROXY\=/d" /etc/environment +} + +set_proxy() { + if [ ! -e "/etc/environment" ]; then + touch "/etc/environment" + fi + + var= + if [ "$4" = "y" ]; then + var="$5:$6@" + fi + + echo -n "" > bash_config.tmp + if [ "$3" = "y" ]; then + newvar="://$var$1:$2" + echo "http_proxy=\"http$newvar\"" >> bash_config.tmp + echo "https_proxy=\"http$newvar\"" >> bash_config.tmp + echo "ftp_proxy=\"ftp$newvar\"" >> bash_config.tmp + echo "HTTP_PROXY=\"http$newvar\"" >> bash_config.tmp + echo "HTTPS_PROXY=\"http$newvar\"" >> bash_config.tmp + echo "FTP_PROXY=\"ftp$newvar\"" >> bash_config.tmp + + cat bash_config.tmp | tee -a /etc/environment > /dev/null + rm bash_config.tmp + return + + elif [ "$3" = "n" ]; then + echo "http_proxy=\"http://$var$1:$2\"" >> bash_config.tmp + echo "https_proxy=\"http://$var$7:$8\"" >> bash_config.tmp + echo "ftp_proxy=\"ftp://$var$9:$10\"" >> bash_config.tmp + echo "HTTP_PROXY=\"http://$var$1:$2\"" >> bash_config.tmp + echo "HTTPS_PROXY=\"http://$var$7:$8\"" >> bash_config.tmp + echo "FTP_PROXY=\"ftp://$var$9:$10\"" >> bash_config.tmp + + fix_new_line "/etc/environment" + cat bash_config.tmp | tee -a /etc/environment > /dev/null + rm bash_config.tmp + return + fi +} + + +if [ "$#" = 0 ]; then + exit +fi + +if [ "$1" = "unset" ]; then + # that's what is needed + unset_proxy + exit +# elif [ "$1" = "toggle" ]; then +# toggle_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 + # exit +elif [ "$1" = "list" ]; then + list_proxy + exit +fi + + +unset_proxy +set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 diff --git a/git.sh b/git.sh new file mode 100644 index 0000000..0f4319e --- /dev/null +++ b/git.sh @@ -0,0 +1,90 @@ +#!/bin/bash +# +# If you have found some issues, or some feature request : +# Raise them here : https://github.com/himanshub16/ProxyMan/issues +# +# expected command line arguments +# +# Created by "Himanshu Shekhar" +# For ProxyMan "https://github.com/himanshub16/ProxyMan/" +# +# convention to be followed across extension made / to be made +# include this comment section in all plugins to avoid confusions while coding +# +# plugin to set "git" proxy settings for ProxyMan +# +# The arguments are given in bash syntax to maintain universality and ease +# across all UNIX systems. +# Your language can use it's respective syntax for +# arguments and comments. +# If you don't need any particular proxy settings, ignore the variables. + +# $# : number of arguments +# $1 : http_host +# if this argument is "unset", proxy settings should be unset. + +# $2 : http_port +# $3 : use_same ; "y" or "n" +# $4 : use_auth +# $5 : username ; send empty string if not available +# $6 : password ; send empty string if not available +# +# if use same is yes, then no further arguments are considered +# +# $7 : https_host +# $8 : https_port +# $9 : ftp_host +# $10 : ftp_port + +# here your code starts + +# privileges has to be set by the process which starts this script + +list_proxy() { + echo + echo -e "\e[1m git proxy settings \e[0m" + echo -e "\e[36m HTTP Proxy \e[0m" $(git config --global http.proxy) +} + +unset_proxy() { + git config --global --unset http.proxy + git config --global --unset https.proxy +} + +set_proxy() { + if [ "$4" = "y" ]; then + var="$5:$6@" + fi + if [ "$3" = "y" ]; then + newvar="://$var$1:$2" + git config --global http.proxy "http$newvar" + git config --global https.proxy "http$newvar" + elif [ "$3" = "n" ]; then + git config --global http.proxy "http://$var$1:$2" + git config --global https.proxy "http://$var$1:$2" + fi +} + + +git_available="$(which git)" +if [ "$git_available" = "" ]; then + exit +fi + +if [ "$#" = 0 ]; then + exit +fi + +if [ "$1" = "unset" ]; then + # that's what is needed + unset_proxy + exit + # toggle proxy had issues with commenting and uncommenting + # dropping the feature currently +elif [ "$1" = "list" ]; then + list_proxy + exit +fi + +unset_proxy +set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 diff --git a/gsettings.sh b/gsettings.sh new file mode 100644 index 0000000..e77efc4 --- /dev/null +++ b/gsettings.sh @@ -0,0 +1,133 @@ +#!/bin/bash +# +# If you have found some issues, or some feature request : +# Raise them here : https://github.com/himanshub16/ProxyMan/issues +# +# expected command line arguments +# +# Created by "Himanshu Shekhar" +# For ProxyMan "https://github.com/himanshub16/ProxyMan/" +# +# convention to be followed across extension made / to be made +# include this comment section in all plugins to avoid confusions while coding +# +# plugin to set "GNOME Desktop" proxy settings for ProxyMan +# +# The arguments are given in bash syntax to maintain universality and ease +# across all UNIX systems. +# Your language can use it's respective syntax for +# arguments and comments. +# If you don't need any particular proxy settings, ignore the variables. + +# $# : number of arguments +# $1 : http_host +# if this is "toggle", toggle settings. +# if this argument is "unset", proxy settings should be unset. + +# $2 : http_port +# $3 : use_same ; "y" or "n" +# $4 : use_auth +# $5 : username ; send empty string if not available +# $6 : password ; send empty string if not available +# +# if use same is yes, then no further arguments are considered +# +# $7 : https_host +# $8 : https_port +# $9 : ftp_host +# $10 : ftp_port + +# here your code starts + +# privileges has to be set by the process which starts this script + +# gettings : this is what Ubuntu and other GNOME based distributions use +# for storing configuration +# Your system settings UI uses gsettings at the backend. + +list_proxy() { + echo + echo -e "\e[1m Desktop proxy settings (GNOME)\e[0m" + mode="$(gsettings get org.gnome.system.proxy mode)" + if [ "$mode" = "'none'" ]; then + echo -e "\e[36m None \e[0m" + return + fi + + echo -e "\e[36m HTTP Proxy \e[0m" Host : $(gsettings get org.gnome.system.proxy.http host) Port : $(gsettings get org.gnome.system.proxy.http port) + echo -e "\e[36m Auth \e[0m" User : $(gsettings get org.gnome.system.proxy.http authentication-user) Password : $(gsettings get org.gnome.system.proxy.http authentication-password) + echo -e "\e[36m HTTPS Proxy \e[0m" Host : $(gsettings get org.gnome.system.proxy.https host) Port : $(gsettings get org.gnome.system.proxy.https port) + echo -e "\e[36m FTP Proxy \e[0m" Host : $(gsettings get org.gnome.system.proxy.ftp host) Port : $(gsettings get org.gnome.system.proxy.ftp port) + echo -e "\e[36m SOCKS Proxy \e[0m" Host : $(gsettings get org.gnome.system.proxy.socks host) Port : $(gsettings get org.gnome.system.proxy.socks port) + +} + +toggle_proxy() { + if [ "$(gsettings get org.gnome.system.proxy mode)" = "none" ]; then + gsettings set org.gnome.system.proxy mode "manual" + else + gsettings set org.gnome.system.proxy mode "none" + fi +} + +unset_proxy() { + gsettings set org.gnome.system.proxy mode "none" + gsettings set org.gnome.system.proxy.http host \"\" + gsettings set org.gnome.system.proxy.http port 0 + gsettings set org.gnome.system.proxy.https host "\"\"" + gsettings set org.gnome.system.proxy.https port 0 + gsettings set org.gnome.system.proxy.ftp host "\"\"" + gsettings set org.gnome.system.proxy.ftp port 0 + gsettings set org.gnome.system.proxy.http use-authentication false + gsettings set org.gnome.system.proxy.http authentication-user "\"\"" + gsettings set org.gnome.system.proxy.http authentication-password "\"\"" +} + +set_proxy() { + if [ "$4" = "y" ]; then + gsettings set org.gnome.system.proxy.http authentication-user "$5" + gsettings set org.gnome.system.proxy.http authentication-password "$6" + fi + if [ "$3" = "y" ]; then + gsettings set org.gnome.system.proxy.http host $1 + gsettings set org.gnome.system.proxy.http port $2 + gsettings set org.gnome.system.proxy.https host $1 + gsettings set org.gnome.system.proxy.https port $2 + gsettings set org.gnome.system.proxy.ftp host $1 + gsettings set org.gnome.system.proxy.ftp port $2 + elif [ "$3" = "n" ]; then + gsettings set org.gnome.system.proxy.http host $1 + gsettings set org.gnome.system.proxy.http port $2 + gsettings set org.gnome.system.proxy.https host $7 + gsettings set org.gnome.system.proxy.https port $8 + gsettings set org.gnome.system.proxy.ftp host $9 + gsettings set org.gnome.system.proxy.ftp port $10 + fi + gsettings set org.gnome.system.proxy mode "manual" +} + + +gsettings_available="$(which gsettings)" +if [ "$gsettings_available" = "" ]; then + exit +fi + +if [ "$#" = 0 ]; then + exit +fi + +if [ "$1" = "unset" ]; then + # that's what is needed + unset_proxy + exit +# elif [ "$1" = "toggle" ]; then +# toggle_proxy + exit +elif [ "$1" = "list" ]; then + list_proxy + exit +fi + + +unset_proxy +set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 diff --git a/main.sh b/main.sh new file mode 100755 index 0000000..287ff6b --- /dev/null +++ b/main.sh @@ -0,0 +1,318 @@ +#!/bin/bash +# +# If you have found some issues, or some feature request : +# Raise them here : https://github.com/himanshub16/ProxyMan/issues + +# expected command line arguments +# +# Created by "Himanshu Shekhar" +# For ProxyMan "https://github.com/himanshub16/ProxyMan/" +# +# convention to be followed across extension made / to be made +# include this comment section in all plugins to avoid confusions while coding +# +# plugin to set "TARGET ENVIRON" proxy settings for ProxyMan +# +# The arguments are given in bash syntax to maintain universality and ease +# across all UNIX systems. +# Your language can use it's respective syntax for +# arguments and comments. +# If you don't need any particular proxy settings, ignore the variables. + +# $# : number of arguments +# $1 : http_host +# if this argument is "unset", proxy settings should be unset. +# if this is "toggle", toggle settings. + +# $2 : http_port +# $3 : use_same ; "yes" or "no" +# $4 : use_auth +# $5 : username ; send empty string if not available +# $6 : password ; send empty string if not available +# +# if use same is yes, then no further arguments are considered +# +# $7 : https_host +# $8 : https_port +# $9 : ftp_host +# $10 : ftp_port + +# here your code starts + +# This is the main script which calls other respective scripts. +# In case of doubts regarding how to use, refer the README.md file. +clear +if [ "$1" = "list" ]; then + echo "Someone wants to list all" + bash "bash.sh" "list" + sudo bash "environment.sh" "list" + sudo bash "apt.sh" "list" + sudo bash "dnf.sh" "list" + bash "gsettings.sh" "list" + bash "npm.sh" "list" + bash "dropbox.sh" "list" + bash "git.sh" "list" + exit +fi + +http_host="" +http_port="" +use_same="n" +https_host="" +https_port="" +ftp_host="" +ftp_port="" +use_auth="n" +username="" +password="" +save_for_reuse="" +profile_name="" + + +if [[ "$1" == "load" && "$2" == "" ]]; then + echo -ne "\e[1m \e[31mPlease provide a config! \e[0m" + echo + exit +fi + +if [ "$1" == "load" ]; then + choice="set" + +else + echo -e " +\e[1m\e[33mProxyMan +=========\e[0m +Tool to set up system wide proxy settings on Linux. +\e[2m\e[33m🌟\e[0m\e[3m Star it \e[0m : \e[4m\e[34m https://github.com/himanshub16/ProxyMan \e[0m + +\e[4mThe following options are available : \e[0m +\e[1m set \e[0m : \e[2m Set proxy settings \e[0m +\e[1m unset \e[0m : \e[2m Unset proxy settings \e[0m +\e[1m list \e[0m : \e[2m List current settings \e[0m +\e[1m load \e[0m : \e[2m Load previously saved settings \e[0m +" + + read -p " Enter your choice : " choice + + if [[ (! "$choice" = "set") && (! "$choice" = "unset") && (! "$choice" = "list") && (! "$choice" = "load") ]]; then + echo "Invalid choice! Will exit." + exit + fi + + if [ "$choice" = "set" ]; then + + echo + echo -e " \e[4mEnter details \e[0m : \e[2m\e[3m (leave blank if you don't to use any proxy settings) \e[0m" + echo + echo -ne "\e[36m HTTP Proxy host \e[0m"; read http_host + echo -ne "\e[32m HTTP Proxy port \e[0m"; read http_port + echo -ne "\e[0m Use same for HTTPS and FTP (y/n) ? \e[0m"; read use_same + echo -ne "\e[0m Use authentication (y/n) ? \e[0m "; read use_auth + + if [[ "$use_auth" = "y" || "$use_auth" = "Y" ]]; then + read -p " Enter username : " username + echo -n " Enter password (use %40 for @) : " ; read -s password + fi + + echo -ne "\e[0m Save settings for later use (y/n) ? \e[0m"; read save_for_reuse + + if [[ "$save_for_reuse" = "y" || "$save_for_reuse" = "Y" ]]; then + read -p " Enter config name : " profile_name + fi + + if [[ "$use_same" = "y" || "$use_same" = "Y" ]]; then + https_host=$http_host + ftp_host=$http_host + https_port=$http_port + ftp_port=$http_port + rsync_host=$http_host + rsync_port=$https_port + else + echo -ne "\e[36m HTTPS Proxy host \e[0m " ; read https_host + echo -ne "\e[32m HTTPS Proxy port \e[0m " ; read https_port + echo -ne "\e[36m FTP Proxy host \e[0m " ; read ftp_host + echo -ne "\e[32m FTP Proxy port \e[0m " ; read ftp_port + fi + fi +fi + +echo +echo -e " \e[0m\e[4m\e[33mEnter targets where you want to modify settings : \e[0m" +echo -e " |\e[36m 1 \e[0m| All of them ... Don't bother me" +echo -e " |\e[36m 2 \e[0m| Terminal / Bash (current user) " +echo -e " |\e[36m 3 \e[0m| Environment variables (/etc/environment)" +echo -e " |\e[36m 4 \e[0m| apt/dnf (package manager)" +echo -e " |\e[36m 5 \e[0m| Desktop settings (GNOME/Ubuntu)" +echo -e " |\e[36m 6 \e[0m| npm" +echo -e " |\e[36m 7 \e[0m| Dropbox" +echo -e " |\e[36m 8 \e[0m| Git" +echo + +echo -e " Enter your choices (\e[3m\e[2m separate multiple choices by a space \e[0m ) " +echo -ne "\e[5m ? \e[0m" ; read -a targets + +echo + +case $choice in + "set"|"load") + + if [[ "$1" != "load" && ( "$save_for_reuse" = "y" || "$save_for_reuse" = "Y" ) ]]; then + config_file="http_host=$http_host%s\nhttp_port=$http_port%s\nuse_same=$use_same\nuse_auth=$use_auth\nusername=$username\npassword=$password\nhttps_host=$https_host\nhttps_port=$https_port\nftp_host=$ftp_host\nftp_port=$ftp_port" + printf $config_file > "profiles/$profile_name".txt + fi + + if [[ $choice == "load" || $1 == "load" ]]; then + + if [[ $choice == "load" ]]; then + echo -ne "\e[36m Config Name \e[0m " ; read config_name + fi + + if [ "$1" = "load" ]; then + + if [ "$2" = "" ]; then + echo -ne "\e[1m \e[31mPlease provide a config! \e[0m" + echo + exit + fi + + config_name=$2 + fi + + if [ ! -e profiles/"$config_name".txt ]; then + echo -ne "\e[1m \e[31mFile does not exist! \e[0m" + echo + exit + fi + + http_host=`grep http_host -i profiles/$config_name.txt | cut -d= -f2` + http_port=`grep http_port -i profiles/$config_name.txt | cut -d= -f2` + use_same=`grep use_same -i profiles/$config_name.txt | cut -d= -f2` + use_auth=`grep use_auth -i profiles/$config_name.txt | cut -d= -f2` + username=`grep username -i profiles/$config_name.txt | cut -d= -f2` + password=`grep password -i profiles/$config_name.txt | cut -d= -f2` + https_host=`grep https_host -i profiles/$config_name.txt | cut -d= -f2` + https_port=`grep https_port -i profiles/$config_name.txt | cut -d= -f2` + ftp_host=`grep ftp_host -i profiles/$config_name.txt | cut -d= -f2` + ftp_port=`grep ftp_port -i profiles/$config_name.txt | cut -d= -f2` + + echo -e " Config \033[0;36m$config_name\033[0m successfully loaded" + fi + + args=("$http_host" "$http_port" "$use_same" "$use_auth" "$username" "$password" "$https_host" "$https_port" "$ftp_host" "$ftp_port" ) + + for i in "${targets[@]}" + do + case $i in + 1) + bash "bash.sh" "${args[@]}" + sudo bash "environment.sh" "${args[@]}" + sudo bash "apt.sh" "${args[@]}" + sudo bash "dnf.sh" "${args[@]}" + bash "gsettings.sh" "${args[@]}" + bash "npm.sh" "${args[@]}" + bash "dropbox.sh" "${args[@]}" + bash "git.sh" "${args[@]}" + ;; + 2) + bash "bash.sh" "${args[@]}" + ;; + 3) sudo bash "environment.sh" "${args[@]}" + ;; + 4) sudo bash "apt.sh" "${args[@]}" + sudo bash "dnf.sh" "${args[@]}" + ;; + 5) bash "gsettings.sh" "${args[@]}" + ;; + 6) bash "npm.sh" "${args[@]}" + ;; + 7) bash "dropbox.sh" "${args[@]}" + ;; + 8) bash "git.sh" "${args[@]}" + ;; + *) ;; + esac + done + ;; + + "unset") + for i in "${targets[@]}" + do + case $i in + 1) echo "Someone wants to unset all" + bash "bash.sh" "unset" + sudo bash "environment.sh" "unset" + sudo bash "apt.sh" "unset" + sudo bash "dnf.sh" "unset" + bash "gsettings.sh" "unset" + bash "npm.sh" "unset" + bash "dropbox.sh" "unset" + bash "git.sh" "unset" + ;; + 2) + bash "bash.sh" "unset" + ;; + 3) sudo bash "environment.sh" "unset" + ;; + 4) sudo bash "apt.sh" "unset" + sudo bash "dnf.sh" "unset" + ;; + 5) bash "gsettings.sh" "unset" + ;; + 6) bash "npm.sh" "unset" + ;; + 7) bash "dropbox.sh" "unset" + ;; + 8) bash "git.sh" "unset" + ;; + *) ;; + esac + done + ;; + + "list") + echo -ne "\e[1m \e[31m This will list all your passwords. Continue ? (y/n) \e[0m"; read + if [[ "$REPLY" = "y" || "$REPLY" = "Y" ]]; then + for i in "${targets[@]}" + do + case $i in + 1) echo "Someone wants to list all" + bash "bash.sh" "list" + sudo bash "environment.sh" "list" + sudo bash "apt.sh" "list" + sudo bash "dnf.sh" "list" + bash "gsettings.sh" "list" + bash "npm.sh" "list" + bash "dropbox.sh" "list" + bash "git.sh" "list" + ;; + 2) + bash "bash.sh" "list" + ;; + 3) sudo bash "environment.sh" "list" + ;; + 4) sudo bash "apt.sh" "list" + sudo bash "dnf.sh" "list" + ;; + 5) bash "gsettings.sh" "list" + ;; + 6) bash "npm.sh" "list" + ;; + 7) bash "dropbox.sh" "list" + ;; + 8) bash "git.sh" "list" + ;; + *) ;; + esac + done + + fi + ;; + + *) + echo "Invalid choice! Will exit now" + exit + ;; +esac + +echo +echo -e "\e[1m\e[36mDone!\e[0m \e[2mThanks for using :)\e[0m" diff --git a/npm.sh b/npm.sh new file mode 100644 index 0000000..f7e076a --- /dev/null +++ b/npm.sh @@ -0,0 +1,92 @@ +#!/bin/bash +# +# If you have found some issues, or some feature request : +# Raise them here : https://github.com/himanshub16/ProxyMan/issues +# +# expected command line arguments +# +# Created by "Himanshu Shekhar" +# For ProxyMan "https://github.com/himanshub16/ProxyMan/" +# +# convention to be followed across extension made / to be made +# include this comment section in all plugins to avoid confusions while coding +# +# plugin to set "npm" proxy settings for ProxyMan +# +# The arguments are given in bash syntax to maintain universality and ease +# across all UNIX systems. +# Your language can use it's respective syntax for +# arguments and comments. +# If you don't need any particular proxy settings, ignore the variables. + +# $# : number of arguments +# $1 : http_host +# if this argument is "unset", proxy settings should be unset. + +# $2 : http_port +# $3 : use_same ; "y" or "n" +# $4 : use_auth +# $5 : username ; send empty string if not available +# $6 : password ; send empty string if not available +# +# if use same is yes, then no further arguments are considered +# +# $7 : https_host +# $8 : https_port +# $9 : ftp_host +# $10 : ftp_port + +# here your code starts + +# privileges has to be set by the process which starts this script + +list_proxy() { + echo + echo -e "\e[1m NPM proxy settings \e[0m" + echo -e "\e[36m HTTP Proxy \e[0m" $(npm config get proxy) + echo -e "\e[36m HTTPS Proxy \e[0m" $(npm config get https-proxy) +} + +unset_proxy() { + npm config rm proxy + npm config rm https-proxy +} + +set_proxy() { + # notice http (without `s`) in `https`, issue #41 + if [ "$4" = "y" ]; then + var="$5:$6@" + fi + if [ "$3" = "y" ]; then + newvar="://$var$1:$2" + npm config set proxy "http$newvar" + npm config set https-proxy "http$newvar" + elif [ "$3" = "n" ]; then + npm config set proxy "http://$var$1:$2" + npm config set https-proxy "http://$var$7:$8" + fi +} + + +npm_available="$(which npm)" +if [ "$npm_available" = "" ]; then + exit +fi + +if [ "$#" = 0 ]; then + exit +fi + +if [ "$1" = "unset" ]; then + # that's what is needed + unset_proxy + exit + # toggle proxy had issues with commenting and uncommenting + # dropping the feature currently +elif [ "$1" = "list" ]; then + list_proxy + exit +fi + +unset_proxy +set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 diff --git a/profiles/sample.txt b/profiles/sample.txt new file mode 100644 index 0000000..cc38d3b --- /dev/null +++ b/profiles/sample.txt @@ -0,0 +1,10 @@ +http_host=175.215.214.126 +http_port=8080 +use_same=y +use_auth=n +username= +password= +https_host=175.215.214.126 +https_port=8080 +ftp_host=175.215.214.126 +ftp_port=8080 \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..d3835398db5e79826c6605c31d50ad4987bff8c7 GIT binary patch literal 63560 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

kb}Z- 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 literal 0 HcmV?d00001 From 80cf832c97aa652d528d96a5964090dce58121f2 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Thu, 28 Jun 2018 00:37:09 +0530 Subject: [PATCH 16/54] major refactor and update control flow --- main.sh | 449 +++++++++++++++++++------------------------------------- 1 file changed, 147 insertions(+), 302 deletions(-) diff --git a/main.sh b/main.sh index 287ff6b..d637ea3 100755 --- a/main.sh +++ b/main.sh @@ -2,317 +2,162 @@ # # If you have found some issues, or some feature request : # Raise them here : https://github.com/himanshub16/ProxyMan/issues - -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "TARGET ENVIRON" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. -# if this is "toggle", toggle settings. - -# $2 : http_port -# $3 : use_same ; "yes" or "no" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - +# Author : Himanshu Shekhar (@himanshub16) # here your code starts # This is the main script which calls other respective scripts. # In case of doubts regarding how to use, refer the README.md file. -clear -if [ "$1" = "list" ]; then - echo "Someone wants to list all" - bash "bash.sh" "list" - sudo bash "environment.sh" "list" - sudo bash "apt.sh" "list" - sudo bash "dnf.sh" "list" - bash "gsettings.sh" "list" - bash "npm.sh" "list" - bash "dropbox.sh" "list" - bash "git.sh" "list" - exit -fi - -http_host="" -http_port="" -use_same="n" -https_host="" -https_port="" -ftp_host="" -ftp_port="" -use_auth="n" -username="" -password="" -save_for_reuse="" -profile_name="" - - -if [[ "$1" == "load" && "$2" == "" ]]; then - echo -ne "\e[1m \e[31mPlease provide a config! \e[0m" - echo - exit -fi - -if [ "$1" == "load" ]; then - choice="set" - -else - echo -e " -\e[1m\e[33mProxyMan -=========\e[0m -Tool to set up system wide proxy settings on Linux. -\e[2m\e[33m🌟\e[0m\e[3m Star it \e[0m : \e[4m\e[34m https://github.com/himanshub16/ProxyMan \e[0m - -\e[4mThe following options are available : \e[0m -\e[1m set \e[0m : \e[2m Set proxy settings \e[0m -\e[1m unset \e[0m : \e[2m Unset proxy settings \e[0m -\e[1m list \e[0m : \e[2m List current settings \e[0m -\e[1m load \e[0m : \e[2m Load previously saved settings \e[0m -" - - read -p " Enter your choice : " choice - - if [[ (! "$choice" = "set") && (! "$choice" = "unset") && (! "$choice" = "list") && (! "$choice" = "load") ]]; then - echo "Invalid choice! Will exit." - exit - fi - - if [ "$choice" = "set" ]; then - - echo - echo -e " \e[4mEnter details \e[0m : \e[2m\e[3m (leave blank if you don't to use any proxy settings) \e[0m" - echo - echo -ne "\e[36m HTTP Proxy host \e[0m"; read http_host - echo -ne "\e[32m HTTP Proxy port \e[0m"; read http_port - echo -ne "\e[0m Use same for HTTPS and FTP (y/n) ? \e[0m"; read use_same - echo -ne "\e[0m Use authentication (y/n) ? \e[0m "; read use_auth - - if [[ "$use_auth" = "y" || "$use_auth" = "Y" ]]; then - read -p " Enter username : " username - echo -n " Enter password (use %40 for @) : " ; read -s password - fi - - echo -ne "\e[0m Save settings for later use (y/n) ? \e[0m"; read save_for_reuse - - if [[ "$save_for_reuse" = "y" || "$save_for_reuse" = "Y" ]]; then - read -p " Enter config name : " profile_name - fi - if [[ "$use_same" = "y" || "$use_same" = "Y" ]]; then - https_host=$http_host - ftp_host=$http_host - https_port=$http_port - ftp_port=$http_port - rsync_host=$http_host - rsync_port=$https_port - else - echo -ne "\e[36m HTTPS Proxy host \e[0m " ; read https_host - echo -ne "\e[32m HTTPS Proxy port \e[0m " ; read https_port - echo -ne "\e[36m FTP Proxy host \e[0m " ; read ftp_host - echo -ne "\e[32m FTP Proxy port \e[0m " ; read ftp_port - fi - fi -fi - -echo -echo -e " \e[0m\e[4m\e[33mEnter targets where you want to modify settings : \e[0m" -echo -e " |\e[36m 1 \e[0m| All of them ... Don't bother me" -echo -e " |\e[36m 2 \e[0m| Terminal / Bash (current user) " -echo -e " |\e[36m 3 \e[0m| Environment variables (/etc/environment)" -echo -e " |\e[36m 4 \e[0m| apt/dnf (package manager)" -echo -e " |\e[36m 5 \e[0m| Desktop settings (GNOME/Ubuntu)" -echo -e " |\e[36m 6 \e[0m| npm" -echo -e " |\e[36m 7 \e[0m| Dropbox" -echo -e " |\e[36m 8 \e[0m| Git" -echo - -echo -e " Enter your choices (\e[3m\e[2m separate multiple choices by a space \e[0m ) " -echo -ne "\e[5m ? \e[0m" ; read -a targets - -echo - -case $choice in - "set"|"load") - - if [[ "$1" != "load" && ( "$save_for_reuse" = "y" || "$save_for_reuse" = "Y" ) ]]; then - config_file="http_host=$http_host%s\nhttp_port=$http_port%s\nuse_same=$use_same\nuse_auth=$use_auth\nusername=$username\npassword=$password\nhttps_host=$https_host\nhttps_port=$https_port\nftp_host=$ftp_host\nftp_port=$ftp_port" - printf $config_file > "profiles/$profile_name".txt - fi - - if [[ $choice == "load" || $1 == "load" ]]; then - - if [[ $choice == "load" ]]; then - echo -ne "\e[36m Config Name \e[0m " ; read config_name - fi - - if [ "$1" = "load" ]; then - - if [ "$2" = "" ]; then - echo -ne "\e[1m \e[31mPlease provide a config! \e[0m" - echo - exit - fi - - config_name=$2 - fi - - if [ ! -e profiles/"$config_name".txt ]; then - echo -ne "\e[1m \e[31mFile does not exist! \e[0m" - echo - exit - fi - - http_host=`grep http_host -i profiles/$config_name.txt | cut -d= -f2` - http_port=`grep http_port -i profiles/$config_name.txt | cut -d= -f2` - use_same=`grep use_same -i profiles/$config_name.txt | cut -d= -f2` - use_auth=`grep use_auth -i profiles/$config_name.txt | cut -d= -f2` - username=`grep username -i profiles/$config_name.txt | cut -d= -f2` - password=`grep password -i profiles/$config_name.txt | cut -d= -f2` - https_host=`grep https_host -i profiles/$config_name.txt | cut -d= -f2` - https_port=`grep https_port -i profiles/$config_name.txt | cut -d= -f2` - ftp_host=`grep ftp_host -i profiles/$config_name.txt | cut -d= -f2` - ftp_port=`grep ftp_port -i profiles/$config_name.txt | cut -d= -f2` - - echo -e " Config \033[0;36m$config_name\033[0m successfully loaded" - fi - - args=("$http_host" "$http_port" "$use_same" "$use_auth" "$username" "$password" "$https_host" "$https_port" "$ftp_host" "$ftp_port" ) - - for i in "${targets[@]}" +function _do_it_for_all() { + # Argument + # $1 : what to do + + local what_to_do="$1" + if [ -z "$target" ]; then + bash "bash.sh" "$what_to_do" + sudo -E bash "environment.sh" "$what_to_do" + sudo -E bash "apt.sh" "$what_to_do" + sudo -E bash "dnf.sh" "$what_to_do" + bash "gsettings.sh" "$what_to_do" + bash "npm.sh" "$what_to_do" + bash "dropbox.sh" "$what_to_do" + bash "git.sh" "$what_to_do" + else + for t in "${targets[@]}" do - case $i in - 1) - bash "bash.sh" "${args[@]}" - sudo bash "environment.sh" "${args[@]}" - sudo bash "apt.sh" "${args[@]}" - sudo bash "dnf.sh" "${args[@]}" - bash "gsettings.sh" "${args[@]}" - bash "npm.sh" "${args[@]}" - bash "dropbox.sh" "${args[@]}" - bash "git.sh" "${args[@]}" - ;; - 2) - bash "bash.sh" "${args[@]}" - ;; - 3) sudo bash "environment.sh" "${args[@]}" - ;; - 4) sudo bash "apt.sh" "${args[@]}" - sudo bash "dnf.sh" "${args[@]}" - ;; - 5) bash "gsettings.sh" "${args[@]}" - ;; - 6) bash "npm.sh" "${args[@]}" - ;; - 7) bash "dropbox.sh" "${args[@]}" - ;; - 8) bash "git.sh" "${args[@]}" - ;; - *) ;; + case "$t" in + 1) _do_it_for_all "$what_to_do" + ;; + 2) bash "bash.sh" "$what_to_do" + ;; + 3) sudo -E bash "environment.sh" "$what_to_do" + ;; + 4) sudo -E bash "apt.sh" "$what_to_do" + sudo -E bash "dnf.sh" "$what_to_do" + ;; + 5) bash "Desktop/gsettings" "$what_to_do" + ;; + 6) bash "npm & yarn" "$what_to_do" + ;; + 7) bash "dropbox.sh" "$what_to_do" + ;; + 8) bash "git.sh" "$what_to_do" + ;; + *) ;; esac done - ;; - "unset") - for i in "${targets[@]}" - do - case $i in - 1) echo "Someone wants to unset all" - bash "bash.sh" "unset" - sudo bash "environment.sh" "unset" - sudo bash "apt.sh" "unset" - sudo bash "dnf.sh" "unset" - bash "gsettings.sh" "unset" - bash "npm.sh" "unset" - bash "dropbox.sh" "unset" - bash "git.sh" "unset" - ;; - 2) - bash "bash.sh" "unset" - ;; - 3) sudo bash "environment.sh" "unset" - ;; - 4) sudo bash "apt.sh" "unset" - sudo bash "dnf.sh" "unset" - ;; - 5) bash "gsettings.sh" "unset" - ;; - 6) bash "npm.sh" "unset" - ;; - 7) bash "dropbox.sh" "unset" - ;; - 8) bash "git.sh" "unset" - ;; - *) ;; - esac - done - ;; - - "list") - echo -ne "\e[1m \e[31m This will list all your passwords. Continue ? (y/n) \e[0m"; read - if [[ "$REPLY" = "y" || "$REPLY" = "Y" ]]; then - for i in "${targets[@]}" - do - case $i in - 1) echo "Someone wants to list all" - bash "bash.sh" "list" - sudo bash "environment.sh" "list" - sudo bash "apt.sh" "list" - sudo bash "dnf.sh" "list" - bash "gsettings.sh" "list" - bash "npm.sh" "list" - bash "dropbox.sh" "list" - bash "git.sh" "list" - ;; - 2) - bash "bash.sh" "list" - ;; - 3) sudo bash "environment.sh" "list" - ;; - 4) sudo bash "apt.sh" "list" - sudo bash "dnf.sh" "list" - ;; - 5) bash "gsettings.sh" "list" - ;; - 6) bash "npm.sh" "list" - ;; - 7) bash "dropbox.sh" "list" - ;; - 8) bash "git.sh" "list" - ;; - *) ;; - esac - done + fi +} + +function _dump_it_all() { + echo "HTTP > $http_host $http_port" + echo "HTTPS > $https_host $https_port" + echo "FTP > $ftp_host $ftp_port" + echo "Use auth > $use_auth $username $password" + echo "Use same > $use_same" + echo "Config > $config_name $action" + echo "Targets > ${targets[@]}" +} + +function show_current_settings() { + echo "Someone wants to list all" + _do_it_for_all "list" +} + +function unset_all_proxy() { + echo "${red}Unset all proxy settings${normal}" + _do_it_for_all "unset" +} + +function set_all_proxy() { + echo "${blue}Setting proxy...${normal}" + _do_it_for_all "set" +} + +function prompt_for_proxy_values() { + echo "${bold}${blue} Enter details to set proxy ${normal}" + + echo -n " HTTP Proxy ${bold} Host ${normal}"; read http_host + echo -n " HTTP Proxy ${bold} Port ${normal}"; read http_port + echo -n " Use same for HTTPS and FTP (y/n)? "; read use_same + echo -n " Use auth - userid/password (y/n)? "; read use_auth + + if [[ "$use_auth" = "y" || "$use_auth" = "Y" ]]; then + read -p " Enter username : " username + echo -n " Enter password (use %40 for @) : " ; read -s password + echo + fi - fi - ;; + if [[ "$use_same" = "y" || "$use_same" = "Y" ]]; then + https_host=$http_host + ftp_host=$http_host + https_port=$http_port + ftp_port=$http_port + rsync_host=$http_host + rsync_port=$https_port + else + echo -n " HTTPS Proxy ${bold} Host ${normal}"; read https_host + echo -n " HTTPS Proxy ${bold} Port ${normal}"; read https_port + echo -n " FTP Proxy ${bold} Host ${normal}"; read ftp_host + echo -n " FTP Proxy ${bold} Port ${normal}"; read ftp_port + fi - *) - echo "Invalid choice! Will exit now" - exit - ;; -esac + echo -n "Save profile for later use (y/n)? "; read save_for_reuse + if [[ "$save_for_reuse" = "y" || "$save_for_reuse" = "Y" ]]; then + read -p " Enter profile name : " config_name + fi -echo -echo -e "\e[1m\e[36mDone!\e[0m \e[2mThanks for using :)\e[0m" + echo +} + +function prompt_for_proxy_targets() { + echo "${bold}${blue} Select targets to modify ${normal}" + + echo "|${bold}${red} 1 ${normal}| All of them ... Don't bother me" + echo "|${bold}${red} 2 ${normal}| Terminal / Bash (current user) " + echo "|${bold}${red} 3 ${normal}| /etc/environment" + echo "|${bold}${red} 4 ${normal}| apt/dnf (Package manager)" + echo "|${bold}${red} 5 ${normal}| Desktop settings (GNOME/Ubuntu)" + echo "|${bold}${red} 6 ${normal}| npm & yarn" + echo "|${bold}${red} 7 ${normal}| Dropbox" + echo "|${bold}${red} 8 ${normal}| Git" + echo + echo "Separate multiple choices with space" + echo -ne "\e[5m ? \e[0m" ; read -a targets +} + +function main() { + source "./variables.sh" + source "./configs.sh" + + case "$1" in + "configs" ) list_configs + ;; + "load" ) echo "Loading profile : ${blue} $2 ${normal}" + load_config "$2" + prompt_for_proxy_targets + set_all_proxy + ;; + "delete" ) echo "Deleting profile : ${red} $2 ${normal}" + delete_config "$2" + ;; + "set" ) prompt_for_proxy_values + prompt_for_proxy_targets + set_all_proxy + ;; + "unset" ) if test -t 1; then + prompt_for_proxy_targets + fi + unset_all_proxy + ;; + "list" ) show_current_settings + ;; + * | "help" ) echo -e "$HELP_TEXT" + ;; + esac +} + + +main "$@" +_dump_it_all From 3d74694d0bd5ce8adb6f51fe6b1f3ce11860fa81 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Fri, 6 Jul 2018 23:57:43 +0530 Subject: [PATCH 17/54] relocate source to conform with C includes --- main.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/main.sh b/main.sh index d637ea3..068b14c 100755 --- a/main.sh +++ b/main.sh @@ -3,11 +3,15 @@ # If you have found some issues, or some feature request : # Raise them here : https://github.com/himanshub16/ProxyMan/issues # Author : Himanshu Shekhar (@himanshub16) -# here your code starts +# # This is the main script which calls other respective scripts. # In case of doubts regarding how to use, refer the README.md file. +source "./variables.sh" +source "./configs.sh" + + function _do_it_for_all() { # Argument # $1 : what to do @@ -128,9 +132,6 @@ function prompt_for_proxy_targets() { } function main() { - source "./variables.sh" - source "./configs.sh" - case "$1" in "configs" ) list_configs ;; From a7f55fd27391e3b38b3400a8a8836e1e81a6e702 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Sat, 21 Jul 2018 19:19:13 +0530 Subject: [PATCH 18/54] handle configs and global variables --- configs.sh | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++ variables.sh | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 197 insertions(+) create mode 100644 configs.sh create mode 100644 variables.sh diff --git a/configs.sh b/configs.sh new file mode 100644 index 0000000..ee34067 --- /dev/null +++ b/configs.sh @@ -0,0 +1,99 @@ +#!/bin/bash +# +# If you have found some issues, or some feature request : +# Raise them here : https://github.com/himanshub16/ProxyMan/issues +# Author : Himanshu Shekhar (@himanshub16) +# +# This file contains the functions (CRUD) required for config managements. +# * list_configs() +# * load_config(profile_name) +# * load_default_config +# * save_config(profile_name) +# * delete_config(profile_name) +# In case of doubts regarding how to use, refer the README.md file. +# +# Required: `variables.sh` has been sourced. + +function list_configs() { + # Arguments : None + + echo "${bold}${cyan}Here are available configs!${normal}" + ls -1 $config_dir +} + +function load_config() { + # Arguments : + # $1 -> profile_name + + local profile_path="$config_dir/$1" + if [ ! -f "$profile_path" ]; then + echo "${bold}${red}Missing config file at $profile_path. ${normal}" + exit + fi + + export http_host=`grep http_host -i $profile_path | cut -d= -f2` + export http_port=`grep http_port -i $profile_path | cut -d= -f2` + export https_host=`grep https_host -i $profile_path | cut -d= -f2` + export https_port=`grep https_port -i $profile_path | cut -d= -f2` + export ftp_host=`grep ftp_host -i $profile_path | cut -d= -f2` + export ftp_port=`grep ftp_port -i $profile_path | cut -d= -f2` + export use_same=`grep use_same -i $profile_path | cut -d= -f2` + export use_auth=`grep use_auth -i $profile_path | cut -d= -f2` + export username=`grep username -i $profile_path | cut -d= -f2` + export password=`grep password -i $profile_path | cut -d= -f2` +} + +function load_default_config() { + # Arguments : None + + load_config "$default_config" +} + +function save_config() { + # Arguments : + # $1 -> profile_name + # Rest variables are picked from environment variables. + + local profile_name="$1" + local profile_path="$config_dir/$profile_name" + mkdir -p "$config_dir" + + echo "# Proxyman profile : $profile_name + +# Example: 127.0.0.1 +http_host=$http_host + +# Example: 8080 +http_port=$http_port + +# Use same values for https and ftp +use_same=$use_same + +# use auth is 'y' or 'n', and provide username and password +use_auth=$use_auth +username=$username +password=$password + +# If use same is 'y', no need of these +https_host=$https_host +https_port=$https_port +ftp_host=$ftp_host +ftp_port=$ftp_port +" > $profile_path + + echo "${green}Saved to $profile_path.${normal}" +} + +function delete_config() { + # Arguments : + # $1 -> profile_name + + local profile_name="$1" + local profile_path="$config_dir/$profile_name" + if [ ! -f "$profile_path" ]; then + echo "${red}Can't find $profile_path ${normal}." + echo "${red}Config '$profile_name' does not exist.${normal}" + fi + + rm -f $profile_path +} diff --git a/variables.sh b/variables.sh new file mode 100644 index 0000000..4d0289f --- /dev/null +++ b/variables.sh @@ -0,0 +1,98 @@ +#!/bin/bash +# +# If you have found some issues, or some feature request : +# Raise them here : https://github.com/himanshub16/ProxyMan/issues +# +# Author : Himanshu Shekhar (@himanshub16) +# GitHub : "https://github.com/himanshub16/ProxyMan/" +# +# This file lists the variables required across all scripts. +# Credits : https://unix.stackexchange.com/a/10065/147140 + +# check if stdout is a terminal +if test -t 1; then + + # see if it supports colors + export ncolors=$(tput colors) + + if test -n "$ncolors" && test $ncolors -ge 8; then + export bold="$(tput bold)" + export underline="$(tput smul)" + export standout="$(tput smso)" + export normal="$(tput sgr0)" + export black="$(tput setaf 0)" + export red="$(tput setaf 1)" + export green="$(tput setaf 2)" + export yellow="$(tput setaf 3)" + export blue="$(tput setaf 4)" + export magenta="$(tput setaf 5)" + export cyan="$(tput setaf 6)" + export white="$(tput setaf 7)" + export star="🌟" + fi +fi + +export config_dir="$HOME/.config/proxyman" +export default_config="default" +export SHELLRC="$HOME/.bashrc" + +case "$SHELL" in + "$(which bash)") SHELLRC="$HOME/.bashrc" + ;; + "$(which zsh)") SHELLRC="$HOME/.zshrc" + ;; +esac + +export http_host="" http_port="" +export https_host="" https_port="" +export ftp_host="" ftp_port="" +export use_auth="" use_same="" +export username="" password="" +export save_for_reuse="" +export config_name="" +export action="" +export targets="" + + +# This help text contains examples for each command +HELP_TEXT="ProxyMan lets you set system-wide proxy settings. + ${star}${blue} https://github.com/himanshub16/ProxyMan ${normal} + +Usage: proxyman [command] + +Commands: +${bold} set ${normal} \t set proxy settings + > proxyman set +${bold} unset ${normal} \t unset proxy settings + > proxyman unset +${bold} list ${normal} \t list current settings + > proxyman list +${bold} configs ${normal} \t lists available configs + > proxyman configs +${bold} load ${normal} \t load a profile + > proxyman load 'profile_name' +${bold} delete ${normal} \t delete a profile + > proxyman delete 'profile_name' +${bold} help ${normal} \t show this help + > proxyman help + +Allowed options: set, unset, list, configs, load, delete, help +" + +# This help text contains each command, but without examples. +HELP_TEXT="ProxyMan lets you set system-wide proxy settings. + ${star}${blue} https://github.com/himanshub16/ProxyMan ${normal} + +Usage: proxyman [command] + +Commands: +${bold} set ${normal} \t set proxy settings +${bold} unset ${normal} \t unset proxy settings +${bold} list ${normal} \t list current settings +${bold} configs ${normal} \t lists available configs +${bold} load ${normal} \t load a profile +${bold} delete ${normal} \t delete a profile +${bold} help ${normal} \t show this help + +Allowed options: set, unset, list, configs, load, delete, help +" From fe913369d78049a4a74d2bf693186f9774cc67ca Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Mon, 12 Nov 2018 16:40:24 +0530 Subject: [PATCH 19/54] update bash/zsh to v3 --- bash-zsh.sh | 19 ++++++++++++++ main.sh | 26 +++++++++++++------ shellrc.sh | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++ variables.sh | 2 ++ 4 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 bash-zsh.sh create mode 100644 shellrc.sh diff --git a/bash-zsh.sh b/bash-zsh.sh new file mode 100644 index 0000000..f8afefd --- /dev/null +++ b/bash-zsh.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +which bash &> /dev/null +first="$?" + +which azsh &> /dev/null +second="$?" + +if [ "$#" = 0 ]; then + exit +fi + +if [ "$first" = 0 ]; then + bash shellrc.sh "$1" "$HOME/.bashrc" +fi + +if [ "$second" = 0 ]; then + bash shellrc.sh "$1" "$HOME/.zshrc" +fi diff --git a/main.sh b/main.sh index 068b14c..431fcee 100755 --- a/main.sh +++ b/main.sh @@ -14,12 +14,12 @@ source "./configs.sh" function _do_it_for_all() { # Argument - # $1 : what to do + # $1 : what to do (set/unset/list) local what_to_do="$1" if [ -z "$target" ]; then - bash "bash.sh" "$what_to_do" - sudo -E bash "environment.sh" "$what_to_do" + bash "bash-zsh.sh" "$what_to_do" + # sudo -E bash "environment.sh" "$what_to_do" sudo -E bash "apt.sh" "$what_to_do" sudo -E bash "dnf.sh" "$what_to_do" bash "gsettings.sh" "$what_to_do" @@ -32,7 +32,7 @@ function _do_it_for_all() { case "$t" in 1) _do_it_for_all "$what_to_do" ;; - 2) bash "bash.sh" "$what_to_do" + 2) bash "bash-zsh.sh" "$what_to_do" ;; 3) sudo -E bash "environment.sh" "$what_to_do" ;; @@ -58,6 +58,7 @@ function _dump_it_all() { echo "HTTP > $http_host $http_port" echo "HTTPS > $https_host $https_port" echo "FTP > $ftp_host $ftp_port" + echo "no_proxy > $no_proxy" echo "Use auth > $use_auth $username $password" echo "Use same > $use_same" echo "Config > $config_name $action" @@ -84,7 +85,6 @@ function prompt_for_proxy_values() { echo -n " HTTP Proxy ${bold} Host ${normal}"; read http_host echo -n " HTTP Proxy ${bold} Port ${normal}"; read http_port - echo -n " Use same for HTTPS and FTP (y/n)? "; read use_same echo -n " Use auth - userid/password (y/n)? "; read use_auth if [[ "$use_auth" = "y" || "$use_auth" = "Y" ]]; then @@ -93,19 +93,27 @@ function prompt_for_proxy_values() { echo fi + echo -n " Use same for HTTPS and FTP (y/n)? "; read use_same if [[ "$use_same" = "y" || "$use_same" = "Y" ]]; then https_host=$http_host ftp_host=$http_host https_port=$http_port ftp_port=$http_port - rsync_host=$http_host - rsync_port=$https_port else echo -n " HTTPS Proxy ${bold} Host ${normal}"; read https_host echo -n " HTTPS Proxy ${bold} Port ${normal}"; read https_port echo -n " FTP Proxy ${bold} Host ${normal}"; read ftp_host echo -n " FTP Proxy ${bold} Port ${normal}"; read ftp_port fi + # socks_proxy is omitted, as is usually not required + # rsync is kept same as http to reduce number of inputs in interactive mode + rsync_host=$http_host + rsync_port=$http_port + + echo -n " No Proxy ${green} (default $no_proxy) ${normal}"; read _no_proxy + if [[ $_no_proxy != "" ]]; then + no_proxy=_no_proxy + fi echo -n "Save profile for later use (y/n)? "; read save_for_reuse if [[ "$save_for_reuse" = "y" || "$save_for_reuse" = "Y" ]]; then @@ -119,7 +127,7 @@ function prompt_for_proxy_targets() { echo "${bold}${blue} Select targets to modify ${normal}" echo "|${bold}${red} 1 ${normal}| All of them ... Don't bother me" - echo "|${bold}${red} 2 ${normal}| Terminal / Bash (current user) " + echo "|${bold}${red} 2 ${normal}| Terminal / bash / zsh (current user) " echo "|${bold}${red} 3 ${normal}| /etc/environment" echo "|${bold}${red} 4 ${normal}| apt/dnf (Package manager)" echo "|${bold}${red} 5 ${normal}| Desktop settings (GNOME/Ubuntu)" @@ -162,3 +170,5 @@ function main() { main "$@" _dump_it_all + +bash shellrc.sh $1 diff --git a/shellrc.sh b/shellrc.sh new file mode 100644 index 0000000..b84b1ad --- /dev/null +++ b/shellrc.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +# This is required for Elementary OS which contains ~/.bashrc without \n +_fix_new_line() { + if [[ $(tail -c 1 "$SHELLRC" | wc --lines) = 0 ]]; then + echo >> "$1" + fi +} + +list_proxy() { + echo + echo "${bold}Shell proxy settings : $SHELLRC ${normal}" + lines="$(cat $SHELLRC | grep proxy -i | wc -l)" + if [ "$lines" -gt 0 ]; then + cat $SHELLRC | grep proxy -i | sed "s/\=/\ /g" + else + echo "${red}None${normal}" + fi +} + +unset_proxy() { + if [ ! -e "$SHELLRC" ]; then + return + fi + # extra effort required to avoid removing custom environment variables set + # by the user for personal use + for proxytype in "http" "https" "ftp" "rsync" "no"; do + sed -i "/export ${proxytype}_proxy\=/d" "$SHELLRC" + done + for PROTOTYPE in "HTTP" "HTTPS" "FTP" "RSYNC" "NO"; do + sed -i "/export ${PROTOTYPE}_PROXY\=/d" "$SHELLRC" + done +} + +set_proxy() { + unset_proxy + if [ ! -e "$SHELLRC" ]; then + touch "$SHELLRC" + fi + + local stmt="" + if [ "$use_auth" = "y" ]; then + stmt="${username}:${password}@" + fi + + # caution: do not use / after stmt + echo "export http_proxy=http://${stmt}${http_host}:${http_port}/" >> "$SHELLRC" + echo "export https_proxy=https://${stmt}${https_host}:${https_port}/" >> "$SHELLRC" + echo "export ftp_proxy=ftp://${stmt}${ftp_host}:${ftp_port}/" >> "$SHELLRC" + echo "export rsync_proxy=rsync://${stmt}${rsync_host}:${rsync_port}/" >> "$SHELLRC" + echo "export no_proxy=${no_proxy}" >> "$SHELLRC" + echo "export HTTP_PROXY=http://${stmt}${http_host}:${http_port}/" >> "$SHELLRC" + echo "export HTTPS_PROXY=https://${stmt}${https_host}:${https_port}/" >> "$SHELLRC" + echo "export FTP_PROXY=ftp://${stmt}${ftp_host}:${ftp_port}/" >> "$SHELLRC" + echo "export RSYNC_PROXY=rsync://${stmt}${rsync_host}:${rsync_port}/" >> "$SHELLRC" + echo "export NO_PROXY=${no_proxy}" >> "$SHELLRC" +} + + +SHELLRC=$2 + +what_to_do=$1 +case $what_to_do in + set) set_proxy + ;; + unset) unset_proxy + ;; + list) list_proxy + ;; + *) + ;; +esac diff --git a/variables.sh b/variables.sh index 4d0289f..759deb0 100644 --- a/variables.sh +++ b/variables.sh @@ -46,8 +46,10 @@ esac export http_host="" http_port="" export https_host="" https_port="" export ftp_host="" ftp_port="" +export rsync_host="" rsync_port="" export use_auth="" use_same="" export username="" password="" +export no_proxy="localhost,127.0.0.1,192.168.1.1" export save_for_reuse="" export config_name="" export action="" From 0883f91424c5b6e27539a172335992e44f0d43de Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 13 Nov 2018 12:44:26 +0530 Subject: [PATCH 20/54] update all scripts to v3 --- apt.sh | 137 ++++++++++++++---------------------------- bash.sh | 137 ------------------------------------------ dnf.sh | 119 ++++++++++++------------------------- dropbox.sh | 82 +++++++------------------ git.sh | 103 ++++++++++---------------------- gsettings.sh | 165 +++++++++++++++------------------------------------ main.sh | 2 +- npm.sh | 109 +++++++++++----------------------- variables.sh | 2 +- 9 files changed, 221 insertions(+), 635 deletions(-) delete mode 100644 bash.sh diff --git a/apt.sh b/apt.sh index 4931c3c..61799e3 100644 --- a/apt.sh +++ b/apt.sh @@ -1,124 +1,75 @@ #!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# # plugin to set "apt" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. +# privileges has to be set by the process which starts this script -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port -# here your code starts - -# privileges has to be set by the process which starts this script +CONF_FILE="/etc/apt/apt.conf" fix_new_line() { - if [[ $(tail -c 1 "$1" | wc --lines ) = 0 ]]; then + if [[ $(tail -c 1 "$CONF_FILE" | wc --lines ) = 0 ]]; then echo >> "$1" fi } list_proxy() { # inefficient way as the file is read twice.. think of some better way - echo - echo -e "\e[1m APT proxy settings \e[0m" - lines="$(cat /etc/apt/apt.conf | grep proxy -i | wc -l)" - if [ "$lines" -gt 0 ]; then - cat /etc/apt/apt.conf | grep proxy -i | sed -e "s/Acquire//g" -e "s/\:\:/\ /g" -e "s/\;//g" - else - echo -e "\e[36m None \e[0m" - fi + echo + echo "${bold}APT proxy settings : ${normal}" + lines="$(cat $CONF_FILE | grep proxy -i | wc -l)" + if [ "$lines" -gt 0 ]; then + cat "$CONF_FILE" | grep proxy -i | wc -l + else + echo "${red}None${normal}" + fi } unset_proxy() { - if [ ! -e "/etc/apt/apt.conf" ]; then + if [ ! -e "$CONF_FILE" ]; then return fi - if [ "$(cat /etc/apt/apt.conf | grep proxy -i | wc -l)" -gt 0 ]; then - sed "/Proxy/d" -i /etc/apt/apt.conf + if [ "$(cat $CONF_FILE | grep proxy -i | wc -l)" -gt 0 ]; then + sed -E "/^Acquire::(.)*::Proxy/d" $CONF_FILE -i fi } set_proxy() { - if [ ! -e "/etc/apt/apt.conf" ]; then - touch "/etc/apt/apt.conf" - fi - var= - if [ "$4" = "y" ]; then - var="$5:$6@" - fi - echo -n "" > apt_config.tmp - if [ "$3" = "y" ]; then - newvar="://$var$1:$2" - echo "Acquire::Http::Proxy \"http$newvar\";" >> apt_config.tmp - echo "Acquire::Https::Proxy \"http$newvar\";" >> apt_config.tmp - echo "Acquire::Ftp::Proxy \"ftp$newvar\";" >> apt_config.tmp - - fix_new_line "/etc/apt/apt.conf" - cat apt_config.tmp | tee -a /etc/apt/apt.conf > /dev/null - rm apt_config.tmp - return + unset_proxy + if [ ! -e "$CONF_FILE" ]; then + touch "$CONF_FILE" + fi - elif [ "$3" = "n" ]; then - echo "Acquire::Http::Proxy \"http://$var$1:$2\";" >> apt_config.tmp - echo "Acquire::Https::Proxy \"http://$var$7:$8\";" >> apt_config.tmp - echo "Acquire::Ftp::Proxy \"ftp://$var$9:$10\";" >> apt_config.tmp + local stmt="" + if [ "$use_auth" = "y" ]; then + stmt="${username}:${password}@" + fi - cat apt_config.tmp | tee -a /etc/apt/apt.conf > /dev/null - rm apt_config.tmp - return - fi + # caution: do not use / after stmt + echo "Acquire::Http::Proxy \"http://${stmt}${http_host}:${http_port}\"" \ + >> "$CONF_FILE" + echo "Acquire::Https::Proxy \"https_proxy=https://${stmt}${https_host}:${https_port}\"" \ + >> "$CONF_FILE" + echo "Acquire::Ftp::Proxy \"ftp://${stmt}${ftp_host}:${ftp_port}\"" \ + >> "$CONF_FILE" } -apt_available="$(which apt)" -if [ "$apt_available" = "" ]; then - exit +which apt &> /dev/null +if [ "$?" != 0 ]; then + exit fi - if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - # that's what is needed - unset_proxy - exit - # toggle proxy had issues with commenting and uncommenting - # dropping the feature currently -elif [ "$1" = "list" ]; then - list_proxy - exit + exit fi -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 +what_to_do=$1 +case $what_to_do in + set) set_proxy + ;; + unset) unset_proxy + ;; + list) list_proxy + ;; + *) + ;; +esac diff --git a/bash.sh b/bash.sh deleted file mode 100644 index 381af8b..0000000 --- a/bash.sh +++ /dev/null @@ -1,137 +0,0 @@ -#!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "Users's bashrc" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. -# if this is "toggle", toggle settings. - - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# here your code starts - -# privileges has to be set by the process which starts this script - -# toggle_proxy() { -# if [ "$(cat $HOME/.bashrc | grep proxy -i | wc -l)" -gt 0 ]; then -# sed -e "/proxy/ s/#*//" -i $HOME/.bashrc -# else -# sed -e "/proxy/ s/^#*/#/" -i $HOME/.bashrc -# fi -# } - -fix_new_line() { - if [[ $(tail -c 1 "$1" | wc --lines ) = 0 ]]; then - echo >> "$1" - fi -} - -list_proxy() { - echo - echo -e "\e[1m Bash proxy settings \e[0m" - lines="$(cat $HOME/.bashrc | grep proxy -i | wc -l)" - if [ "$lines" -gt 0 ]; then - cat $HOME/.bashrc | grep proxy -i | sed "s/\=/\ /g" - else - echo -e "\e[36m None \e[0m" - fi -} - -unset_proxy() { - if [ ! -e "$HOME/.bashrc" ]; then - return - fi - sed -i "/proxy\=/d" $HOME/.bashrc - sed -i "/PROXY\=/d" $HOME/.bashrc -} - -set_proxy() { - if [ ! -e "$HOME/.bashrc" ]; then - touch "$HOME/.bashrc" - fi - - var= - if [ "$4" = "y" ]; then - var="$5:$6@" - fi - - echo -n "" > bash_config.tmp - if [ "$3" = "y" ]; then - newvar="://$var$1:$2" - echo "http_proxy=\"http$newvar\"" >> bash_config.tmp - echo "https_proxy=\"http$newvar\"" >> bash_config.tmp - echo "ftp_proxy=\"ftp$newvar\"" >> bash_config.tmp - echo "HTTP_PROXY=\"http$newvar\"" >> bash_config.tmp - echo "HTTPS_PROXY=\"http$newvar\"" >> bash_config.tmp - echo "FTP_PROXY=\"ftp$newvar\"" >> bash_config.tmp - - fix_new_line $HOME/.bashrc - cat bash_config.tmp | tee -a $HOME/.bashrc > /dev/null - rm bash_config.tmp - return - - elif [ "$3" = "n" ]; then - echo "http_proxy=\"http://$var$1:$2\"" >> bash_config.tmp - echo "http_proxy=\"http://$var$7:$8\"" >> bash_config.tmp - echo "ftp_proxy=\"ftp://$var$9:$10\"" >> bash_config.tmp - echo "HTTP_PROXY=\"http://$var$1:$2\"" >> bash_config.tmp - echo "HTTPS_PROXY=\"http://$var$7:$8\"" >> bash_config.tmp - echo "FTP_PROXY=\"ftp://$var$9:$10\"" >> bash_config.tmp - - cat bash_config.tmp | tee -a $HOME/.bashrc > /dev/null - rm bash_config.tmp - return - fi -} - -if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - # that's what is needed - unset_proxy - source "$HOME/.bashrc" - exit -# elif [ "$1" = "toggle" ]; then -# toggle_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 -# exit -elif [ "$1" = "list" ]; then - list_proxy - exit -fi - - -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 -source "$HOME/.bashrc" diff --git a/dnf.sh b/dnf.sh index 8b05004..82dbee2 100644 --- a/dnf.sh +++ b/dnf.sh @@ -1,110 +1,69 @@ #!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# # plugin to set "dnf" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port +# privileges has to be set by the process which starts this script -# here your code starts -# privileges has to be set by the process which starts this script +CONF_FILE="/etc/dnf/dnf.conf" fix_new_line() { - if [[ $(tail -c 1 "$1" | wc --lines ) = 0 ]]; then + if [[ $(tail -c 1 "$CONF_FILE" | wc --lines ) = 0 ]]; then echo >> "$1" fi } list_proxy() { - echo - echo -e "\e[1m DNF proxy settings (raw) \e[0m" - lines="$(cat /etc/dnf/dnf.conf | grep proxy -i | wc -l)" - if [ "$lines" -gt 0 ]; then - cat /etc/dnf/dnf.conf | grep proxy -i | sed -e "s/\=/\ /g" - else - echo -e "\e[36m None \e[0m" - fi + # inefficient way as the file is read twice.. think of some better way + echo + echo "${bold}APT proxy settings : ${normal}" + lines="$(cat $CONF_FILE | grep proxy -i | wc -l)" + if [ "$lines" -gt 0 ]; then + cat "$CONF_FILE" | grep proxy -i | wc -l + else + echo "${red}None${normal}" + fi } unset_proxy() { - if [ ! -e "/etc/dnf/dnf.conf" ]; then + if [ ! -e "$CONF_FILE" ]; then return fi - if [ "$(cat /etc/dnf/dnf.conf | grep proxy -i | wc -l)" -gt 0 ]; then - sed "/proxy/d" -i /etc/dnf/dnf.conf + if [ "$(cat $CONF_FILE | grep proxy -i | wc -l)" -gt 0 ]; then + sed "/proxy/d" $CONF_FILE -i fi } set_proxy() { - if [ ! -e "/etc/dnf/dnf.conf" ]; then - touch "/etc/dnf/dnf.conf" - fi - - echo -n "" > dnf_config.tmp - echo "proxy=http://$1:$2" > dnf_config.tmp + unset_proxy + if [ ! -e "$CONF_FILE" ]; then + touch "$CONF_FILE" + fi - if [ "$4" = "y" ]; then - echo "proxy_username=$5" >> dnf_config.tmp - echo "proxy_password=$6" >> dnf_config.tmp - fi + echo "proxy=http://${http_host}:${http_port}" >> "$CONF_FILE" - fix_new_line "/etc/dnf/dnf.conf" - cat dnf_config.tmp | tee -a /etc/dnf/dnf.conf > /dev/null - rm dnf_config.tmp - return + if [ "$use_auth" = "y" ]; then + echo "proxy_username=${username}" >> "$CONF_FILE" + echo "proxy_password=${password}" >> "$CONF_FILE" + fi } -dnf_available="$(which dnf)" -if [ "$dnf_available" = "" ]; then - exit +which apt &> /dev/null +if [ "$?" != 0 ]; then + exit fi - if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - unset_proxy - exit - # toggle proxy had issues with commenting and uncommenting - # dropping the feature currently -elif [ "$1" = "list" ]; then - list_proxy - exit + exit fi -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 +what_to_do=$1 +case $what_to_do in + set) set_proxy + ;; + unset) unset_proxy + ;; + list) list_proxy + ;; + *) + ;; +esac diff --git a/dropbox.sh b/dropbox.sh index b1e4889..901e119 100644 --- a/dropbox.sh +++ b/dropbox.sh @@ -1,79 +1,41 @@ #!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "dropbox" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port +# plugin to set "dnf" proxy settings for ProxyMan +# privileges has to be set by the process which starts this script -# here your code starts -# privileges has to be set by the process which starts this script +DROPBOX_PY="dropbox" list_proxy() { - echo - echo -e "\e[1m Dropbox proxy settings \e[0m" - echo -e "\e[36m Sorry! Dropbox does not provide viewing configs". + echo + echo "${bold}${red} Dropboxy doesn't show proxy settings ${normal}" } unset_proxy() { - dropbox proxy none > /dev/null + $DROPBOX_PY proxy none &> /dev/null } set_proxy() { - dropbox proxy manual http $1 $2 $5 $6 > /dev/null + $DROPBOX_PY proxy manual $http_host $http_port $username $password &> /dev/null } -dropbox_available="$(which dropbox)" -if [ "$dropbox_available" = "" ]; then - exit +which $DROPBOX_PY &> /dev/null +if [ "$?" != 0 ]; then + exit fi if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - # that's what is needed - unset_proxy - exit - # toggle proxy had issues with commenting and uncommenting - # dropping the feature currently -elif [ "$1" = "list" ]; then - list_proxy - exit + exit fi -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 +what_to_do=$1 +case $what_to_do in + set) set_proxy + ;; + unset) unset_proxy + ;; + list) list_proxy + ;; + *) + ;; +esac diff --git a/git.sh b/git.sh index 0f4319e..2e0f814 100644 --- a/git.sh +++ b/git.sh @@ -1,90 +1,49 @@ #!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "git" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# here your code starts - +# plugin to set "dnf" proxy settings for ProxyMan # privileges has to be set by the process which starts this script + list_proxy() { - echo - echo -e "\e[1m git proxy settings \e[0m" - echo -e "\e[36m HTTP Proxy \e[0m" $(git config --global http.proxy) + echo + echo "${bold}git proxy settings : ${normal}" + echo "http $(git config --global http.proxy)" + echo "https $(git config --global https.proxy)" } unset_proxy() { - git config --global --unset http.proxy - git config --global --unset https.proxy + git config --global --unset http.proxy + git config --global --unset https.proxy } set_proxy() { - if [ "$4" = "y" ]; then - var="$5:$6@" - fi - if [ "$3" = "y" ]; then - newvar="://$var$1:$2" - git config --global http.proxy "http$newvar" - git config --global https.proxy "http$newvar" - elif [ "$3" = "n" ]; then - git config --global http.proxy "http://$var$1:$2" - git config --global https.proxy "http://$var$1:$2" - fi + local stmt="" + if [ "$use_auth" = "y" ]; then + stmt="${username}:${password}@" + fi + + # caution: do not use / after stmt + git config --global http.proxy "http://${stmt}${http_host}:${http_port}/" + git config --global https.proxy "https://${stmt}${https_host}:${https_port}/" } -git_available="$(which git)" -if [ "$git_available" = "" ]; then - exit +which git &> /dev/null +if [ "$?" != 0 ]; then + exit fi if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - # that's what is needed - unset_proxy - exit - # toggle proxy had issues with commenting and uncommenting - # dropping the feature currently -elif [ "$1" = "list" ]; then - list_proxy - exit + exit fi -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 +what_to_do=$1 +case $what_to_do in + set) set_proxy + ;; + unset) unset_proxy + ;; + list) list_proxy + ;; + *) + ;; +esac diff --git a/gsettings.sh b/gsettings.sh index e77efc4..3b33264 100644 --- a/gsettings.sh +++ b/gsettings.sh @@ -1,133 +1,64 @@ #!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "GNOME Desktop" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this is "toggle", toggle settings. -# if this argument is "unset", proxy settings should be unset. - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# here your code starts - +# plugin to set "dnf" proxy settings for ProxyMan # privileges has to be set by the process which starts this script -# gettings : this is what Ubuntu and other GNOME based distributions use -# for storing configuration -# Your system settings UI uses gsettings at the backend. list_proxy() { - echo - echo -e "\e[1m Desktop proxy settings (GNOME)\e[0m" - mode="$(gsettings get org.gnome.system.proxy mode)" - if [ "$mode" = "'none'" ]; then - echo -e "\e[36m None \e[0m" - return - fi - - echo -e "\e[36m HTTP Proxy \e[0m" Host : $(gsettings get org.gnome.system.proxy.http host) Port : $(gsettings get org.gnome.system.proxy.http port) - echo -e "\e[36m Auth \e[0m" User : $(gsettings get org.gnome.system.proxy.http authentication-user) Password : $(gsettings get org.gnome.system.proxy.http authentication-password) - echo -e "\e[36m HTTPS Proxy \e[0m" Host : $(gsettings get org.gnome.system.proxy.https host) Port : $(gsettings get org.gnome.system.proxy.https port) - echo -e "\e[36m FTP Proxy \e[0m" Host : $(gsettings get org.gnome.system.proxy.ftp host) Port : $(gsettings get org.gnome.system.proxy.ftp port) - echo -e "\e[36m SOCKS Proxy \e[0m" Host : $(gsettings get org.gnome.system.proxy.socks host) Port : $(gsettings get org.gnome.system.proxy.socks port) - -} - -toggle_proxy() { - if [ "$(gsettings get org.gnome.system.proxy mode)" = "none" ]; then - gsettings set org.gnome.system.proxy mode "manual" - else - gsettings set org.gnome.system.proxy mode "none" - fi + echo + echo "${bold}Desktop proxy settings (GNOME) ${normal}" + mode=$(gsettings get org.gnome.system.proxy | tr -d "'") + if [ "$mode" = "none"]; then + echo "${red}None${normal}" + return + fi + + echo "${bold} http ${normal} "\ + "$(gsettings get org.gnome.system.proxy.http host) "\ + "$(gsettings get org.gnome.system.proxy.http port)" + echo "${bold} Auth ${normal} "\ + "$(gsettings get org.gnome.system.proxy.http authentication-user) "\ + "$(gsettings get org.gnome.system.proxy.http authentication-password)" + echo "${bold} https ${normal} "\ + "$(gsettings get org.gnome.system.proxy.https host) "\ + "$(gsettings get org.gnome.system.proxy.https port)" + echo "${bold} ftp ${normal} "\ + "$(gsettings get org.gnome.system.proxy.ftp host) "\ + "$(gsettings get org.gnome.system.proxy.ftp port)" + echo "${bold} socks ${normal} "\ + "$(gsettings get org.gnome.system.proxy.socks host) "\ + "$(gsettings get org.gnome.system.proxy.socks port)" } unset_proxy() { - gsettings set org.gnome.system.proxy mode "none" - gsettings set org.gnome.system.proxy.http host \"\" - gsettings set org.gnome.system.proxy.http port 0 - gsettings set org.gnome.system.proxy.https host "\"\"" - gsettings set org.gnome.system.proxy.https port 0 - gsettings set org.gnome.system.proxy.ftp host "\"\"" - gsettings set org.gnome.system.proxy.ftp port 0 - gsettings set org.gnome.system.proxy.http use-authentication false - gsettings set org.gnome.system.proxy.http authentication-user "\"\"" - gsettings set org.gnome.system.proxy.http authentication-password "\"\"" + gsettings set org.gnome.system.proxy mode none } set_proxy() { - if [ "$4" = "y" ]; then - gsettings set org.gnome.system.proxy.http authentication-user "$5" - gsettings set org.gnome.system.proxy.http authentication-password "$6" - fi - if [ "$3" = "y" ]; then - gsettings set org.gnome.system.proxy.http host $1 - gsettings set org.gnome.system.proxy.http port $2 - gsettings set org.gnome.system.proxy.https host $1 - gsettings set org.gnome.system.proxy.https port $2 - gsettings set org.gnome.system.proxy.ftp host $1 - gsettings set org.gnome.system.proxy.ftp port $2 - elif [ "$3" = "n" ]; then - gsettings set org.gnome.system.proxy.http host $1 - gsettings set org.gnome.system.proxy.http port $2 - gsettings set org.gnome.system.proxy.https host $7 - gsettings set org.gnome.system.proxy.https port $8 - gsettings set org.gnome.system.proxy.ftp host $9 - gsettings set org.gnome.system.proxy.ftp port $10 - fi - gsettings set org.gnome.system.proxy mode "manual" + gsettings set org.gnome.system.proxy mode manual + gsettings set org.gnome.system.proxy.http host $http_proxy + gsettings set org.gnome.system.proxy.http port $http_proxy + gsettings set org.gnome.system.proxy.http authentication-user $username + gsettings set org.gnome.system.proxy.http authentication-password $password + gsettings set org.gnome.system.proxy.https host $https_proxy + gsettings set org.gnome.system.proxy.https port $https_proxy + gsettings set org.gnome.system.proxy.ftp host $ftp_proxy + gsettings set org.gnome.system.proxy.ftp port $ftp_proxy } -gsettings_available="$(which gsettings)" -if [ "$gsettings_available" = "" ]; then - exit -fi - -if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - # that's what is needed - unset_proxy - exit -# elif [ "$1" = "toggle" ]; then -# toggle_proxy - exit -elif [ "$1" = "list" ]; then - list_proxy - exit +which $gsettings &> /dev/null +if [ "$#" != 0 ]; then + exit fi - -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 +what_to_do=$1 +case $what_to_do in + set) set_proxy + ;; + unset) unset_proxy + ;; + list) list_proxy + ;; + *) + ;; +esac diff --git a/main.sh b/main.sh index 431fcee..c213789 100755 --- a/main.sh +++ b/main.sh @@ -171,4 +171,4 @@ function main() { main "$@" _dump_it_all -bash shellrc.sh $1 +bash npm.sh $1 diff --git a/npm.sh b/npm.sh index f7e076a..12d8283 100644 --- a/npm.sh +++ b/npm.sh @@ -1,92 +1,53 @@ #!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set "npm" proxy settings for ProxyMan -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is yes, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# here your code starts - +# plugin to set "dnf" proxy settings for ProxyMan # privileges has to be set by the process which starts this script list_proxy() { - echo - echo -e "\e[1m NPM proxy settings \e[0m" - echo -e "\e[36m HTTP Proxy \e[0m" $(npm config get proxy) - echo -e "\e[36m HTTPS Proxy \e[0m" $(npm config get https-proxy) + echo + echo "${bold}npm proxy settings : ${normal}" + echo "http $(npm config get proxy)" + echo "https $(npm config get https-proxy)" + + if [ $(npm config get strict-ssl) = "true" ]; then + echo "${bold}${red} strict-ssl is true. Would recommend to set it false" + echo "> ${white} npm config set strict-ssl false ${normal}" + fi } unset_proxy() { - npm config rm proxy - npm config rm https-proxy + npm config delete proxy + npm config delete https-proxy } set_proxy() { - # notice http (without `s`) in `https`, issue #41 - if [ "$4" = "y" ]; then - var="$5:$6@" - fi - if [ "$3" = "y" ]; then - newvar="://$var$1:$2" - npm config set proxy "http$newvar" - npm config set https-proxy "http$newvar" - elif [ "$3" = "n" ]; then - npm config set proxy "http://$var$1:$2" - npm config set https-proxy "http://$var$7:$8" - fi + local stmt="" + if [ "$use_auth" = "y" ]; then + stmt="${username}:${password}@" + fi + + # caution: do not use / after stmt + npm config set proxy "http://${stmt}${http_host}:${http_port}/" + npm config set https-proxy "https://${stmt}${https_host}:${https_port}/" } - -npm_available="$(which npm)" -if [ "$npm_available" = "" ]; then - exit +which npm &> /dev/null +if [ "$?" != 0 ]; then + exit fi if [ "$#" = 0 ]; then - exit + exit fi -if [ "$1" = "unset" ]; then - # that's what is needed - unset_proxy - exit - # toggle proxy had issues with commenting and uncommenting - # dropping the feature currently -elif [ "$1" = "list" ]; then - list_proxy - exit -fi -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 +what_to_do=$1 +case $what_to_do in + set) set_proxy + ;; + unset) unset_proxy + ;; + list) list_proxy + ;; + *) + ;; +esac diff --git a/variables.sh b/variables.sh index 759deb0..2cac2c0 100644 --- a/variables.sh +++ b/variables.sh @@ -49,7 +49,7 @@ export ftp_host="" ftp_port="" export rsync_host="" rsync_port="" export use_auth="" use_same="" export username="" password="" -export no_proxy="localhost,127.0.0.1,192.168.1.1" +export no_proxy="localhost,127.0.0.1,192.168.1.1,::1" export save_for_reuse="" export config_name="" export action="" From c767a680d35edc5dfa1e68df7351ea565da5d7ae Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 13 Nov 2018 12:49:34 +0530 Subject: [PATCH 21/54] fix main.sh --- main.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/main.sh b/main.sh index c213789..3259360 100755 --- a/main.sh +++ b/main.sh @@ -170,5 +170,3 @@ function main() { main "$@" _dump_it_all - -bash npm.sh $1 From 3f25cbab6f03e48675d45cad03e4a0a2db600365 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 13 Nov 2018 21:02:08 +0530 Subject: [PATCH 22/54] apply encosing quotes to config values --- shellrc.sh | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/shellrc.sh b/shellrc.sh index b84b1ad..ac22a28 100644 --- a/shellrc.sh +++ b/shellrc.sh @@ -12,7 +12,7 @@ list_proxy() { echo "${bold}Shell proxy settings : $SHELLRC ${normal}" lines="$(cat $SHELLRC | grep proxy -i | wc -l)" if [ "$lines" -gt 0 ]; then - cat $SHELLRC | grep proxy -i | sed "s/\=/\ /g" + cat $SHELLRC | grep proxy -i else echo "${red}None${normal}" fi @@ -44,20 +44,20 @@ set_proxy() { fi # caution: do not use / after stmt - echo "export http_proxy=http://${stmt}${http_host}:${http_port}/" >> "$SHELLRC" - echo "export https_proxy=https://${stmt}${https_host}:${https_port}/" >> "$SHELLRC" - echo "export ftp_proxy=ftp://${stmt}${ftp_host}:${ftp_port}/" >> "$SHELLRC" - echo "export rsync_proxy=rsync://${stmt}${rsync_host}:${rsync_port}/" >> "$SHELLRC" - echo "export no_proxy=${no_proxy}" >> "$SHELLRC" - echo "export HTTP_PROXY=http://${stmt}${http_host}:${http_port}/" >> "$SHELLRC" - echo "export HTTPS_PROXY=https://${stmt}${https_host}:${https_port}/" >> "$SHELLRC" - echo "export FTP_PROXY=ftp://${stmt}${ftp_host}:${ftp_port}/" >> "$SHELLRC" - echo "export RSYNC_PROXY=rsync://${stmt}${rsync_host}:${rsync_port}/" >> "$SHELLRC" - echo "export NO_PROXY=${no_proxy}" >> "$SHELLRC" + echo "export http_proxy=\"http://${stmt}${http_host}:${http_port}/\"" >> "$SHELLRC" + echo "export https_proxy=\"https://${stmt}${https_host}:${https_port}/\"" >> "$SHELLRC" + echo "export ftp_proxy=\"ftp://${stmt}${ftp_host}:${ftp_port}/\"" >> "$SHELLRC" + echo "export rsync_proxy=\"rsync://${stmt}${rsync_host}:${rsync_port}/\"" >> "$SHELLRC" + echo "export no_proxy=\"${no_proxy}"\" >> "$SHELLRC" + echo "export HTTP_PROXY=\"http://${stmt}${http_host}:${http_port}/\"" >> "$SHELLRC" + echo "export HTTPS_PROXY=\"https://${stmt}${https_host}:${https_port}/\"" >> "$SHELLRC" + echo "export FTP_PROXY=\"ftp://${stmt}${ftp_host}:${ftp_port}/\"" >> "$SHELLRC" + echo "export RSYNC_PROXY=\"rsync://${stmt}${rsync_host}:${rsync_port}/\"" >> "$SHELLRC" + echo "export NO_PROXY=\"${no_proxy}"\" >> "$SHELLRC" } -SHELLRC=$2 +export SHELLRC=$2 what_to_do=$1 case $what_to_do in From ef43e99fa43e6fc1d9d38fdabbf84621648b73d7 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 13 Nov 2018 21:02:52 +0530 Subject: [PATCH 23/54] minor changes and cleanup cleanup minor fixes --- apt.sh | 18 +++--- bash-zsh.sh | 2 +- configs.sh | 21 +++---- dnf.sh | 16 +++--- dropbox.sh | 2 +- environment.sh | 137 -------------------------------------------- gsettings.sh | 6 +- main.sh | 15 +++-- npm.sh | 2 +- profiles/sample.txt | 10 ---- screenshot.png | Bin 63560 -> 0 bytes 11 files changed, 47 insertions(+), 182 deletions(-) delete mode 100644 environment.sh delete mode 100644 profiles/sample.txt delete mode 100644 screenshot.png diff --git a/apt.sh b/apt.sh index 61799e3..02fdf61 100644 --- a/apt.sh +++ b/apt.sh @@ -12,8 +12,8 @@ fix_new_line() { } list_proxy() { - # inefficient way as the file is read twice.. think of some better way - echo + # inefficient way as the file is read twice.. think of some better way + echo echo "${bold}APT proxy settings : ${normal}" lines="$(cat $CONF_FILE | grep proxy -i | wc -l)" if [ "$lines" -gt 0 ]; then @@ -24,12 +24,12 @@ list_proxy() { } unset_proxy() { - if [ ! -e "$CONF_FILE" ]; then - return - fi - if [ "$(cat $CONF_FILE | grep proxy -i | wc -l)" -gt 0 ]; then - sed -E "/^Acquire::(.)*::Proxy/d" $CONF_FILE -i - fi + if [ ! -e "$CONF_FILE" ]; then + return + fi + if [ "$(cat $CONF_FILE | grep proxy -i | wc -l)" -gt 0 ]; then + sed -E "/^Acquire::(.)*::Proxy/d" $CONF_FILE -i + fi } set_proxy() { @@ -46,7 +46,7 @@ set_proxy() { # caution: do not use / after stmt echo "Acquire::Http::Proxy \"http://${stmt}${http_host}:${http_port}\"" \ >> "$CONF_FILE" - echo "Acquire::Https::Proxy \"https_proxy=https://${stmt}${https_host}:${https_port}\"" \ + echo "Acquire::Https::Proxy \"https://${stmt}${https_host}:${https_port}\"" \ >> "$CONF_FILE" echo "Acquire::Ftp::Proxy \"ftp://${stmt}${ftp_host}:${ftp_port}\"" \ >> "$CONF_FILE" diff --git a/bash-zsh.sh b/bash-zsh.sh index f8afefd..7536ac9 100644 --- a/bash-zsh.sh +++ b/bash-zsh.sh @@ -3,7 +3,7 @@ which bash &> /dev/null first="$?" -which azsh &> /dev/null +which zsh &> /dev/null second="$?" if [ "$#" = 0 ]; then diff --git a/configs.sh b/configs.sh index ee34067..d7e07ce 100644 --- a/configs.sh +++ b/configs.sh @@ -31,16 +31,17 @@ function load_config() { exit fi - export http_host=`grep http_host -i $profile_path | cut -d= -f2` - export http_port=`grep http_port -i $profile_path | cut -d= -f2` - export https_host=`grep https_host -i $profile_path | cut -d= -f2` - export https_port=`grep https_port -i $profile_path | cut -d= -f2` - export ftp_host=`grep ftp_host -i $profile_path | cut -d= -f2` - export ftp_port=`grep ftp_port -i $profile_path | cut -d= -f2` - export use_same=`grep use_same -i $profile_path | cut -d= -f2` - export use_auth=`grep use_auth -i $profile_path | cut -d= -f2` - export username=`grep username -i $profile_path | cut -d= -f2` - export password=`grep password -i $profile_path | cut -d= -f2` + export http_host=`grep http_host\= -i $profile_path | cut -d= -f2` + export http_port=`grep http_port\= -i $profile_path | cut -d= -f2` + export https_host=`grep https_host\= -i $profile_path | cut -d= -f2` + export https_port=`grep https_port\= -i $profile_path | cut -d= -f2` + export ftp_host=`grep ftp_host\= -i $profile_path | cut -d= -f2` + export ftp_port=`grep ftp_port\= -i $profile_path | cut -d= -f2` + export rsync_host=$http_host rsync_port=$http_port + export use_same=`grep use_same\= -i $profile_path | cut -d= -f2` + export use_auth=`grep use_auth\= -i $profile_path | cut -d= -f2` + export username=`grep username\= -i $profile_path | cut -d= -f2` + export password=`grep password\= -i $profile_path | cut -d= -f2` } function load_default_config() { diff --git a/dnf.sh b/dnf.sh index 82dbee2..ec526cd 100644 --- a/dnf.sh +++ b/dnf.sh @@ -12,8 +12,8 @@ fix_new_line() { } list_proxy() { - # inefficient way as the file is read twice.. think of some better way - echo + # inefficient way as the file is read twice.. think of some better way + echo echo "${bold}APT proxy settings : ${normal}" lines="$(cat $CONF_FILE | grep proxy -i | wc -l)" if [ "$lines" -gt 0 ]; then @@ -24,12 +24,12 @@ list_proxy() { } unset_proxy() { - if [ ! -e "$CONF_FILE" ]; then - return - fi - if [ "$(cat $CONF_FILE | grep proxy -i | wc -l)" -gt 0 ]; then - sed "/proxy/d" $CONF_FILE -i - fi + if [ ! -e "$CONF_FILE" ]; then + return + fi + if [ "$(cat $CONF_FILE | grep proxy -i | wc -l)" -gt 0 ]; then + sed "/proxy/d" $CONF_FILE -i + fi } set_proxy() { diff --git a/dropbox.sh b/dropbox.sh index 901e119..edaa2e1 100644 --- a/dropbox.sh +++ b/dropbox.sh @@ -7,7 +7,7 @@ DROPBOX_PY="dropbox" list_proxy() { echo - echo "${bold}${red} Dropboxy doesn't show proxy settings ${normal}" + echo "${blue} Dropbox doesn't show proxy settings. No worries! ${normal}" } unset_proxy() { diff --git a/environment.sh b/environment.sh deleted file mode 100644 index 431e15e..0000000 --- a/environment.sh +++ /dev/null @@ -1,137 +0,0 @@ -#!/bin/bash -# -# If you have found some issues, or some feature request : -# Raise them here : https://github.com/himanshub16/ProxyMan/issues -# -# expected command line arguments -# -# Created by "Himanshu Shekhar" -# For ProxyMan "https://github.com/himanshub16/ProxyMan/" -# -# convention to be followed across extension made / to be made -# include this comment section in all plugins to avoid confusions while coding -# -# plugin to set proxy variables in /etc/environment for ProxyMan -# proxy settings in environment variables is applicable to all users -# -# The arguments are given in bash syntax to maintain universality and ease -# across all UNIX systems. -# Your language can use it's respective syntax for -# arguments and comments. -# If you don't need any particular proxy settings, ignore the variables. - -# $# : number of arguments -# $1 : http_host -# if this argument is "unset", proxy settings should be unset. -# if this is "toggle", toggle settings. - - -# $2 : http_port -# $3 : use_same ; "y" or "n" -# $4 : use_auth -# $5 : username ; send empty string if not available -# $6 : password ; send empty string if not available -# -# if use same is y, then no further arguments are considered -# -# $7 : https_host -# $8 : https_port -# $9 : ftp_host -# $10 : ftp_port - -# here your code starts - -# privileges has to be set by the process which starts this script - -# toggle_proxy() { -# if [ "$(cat /etc/environment | grep proxy -i | wc -l)" -gt 0 ]; then -# sed -e "/proxy/ s/#*//" -i /etc/environment -# else -# sed -e "/proxy/ s/^#*/#/" -i /etc/environment -# fi -# } - -fix_new_line() { - if [[ $(tail -c 1 "$1" | wc --lines ) = 0 ]]; then - echo >> "$1" - fi -} - -list_proxy() { - echo - echo -e "\e[1m Environment proxy settings \e[0m" - lines="$(cat /etc/environment | grep proxy -i | wc -l)" - if [ "$lines" -gt 0 ]; then - cat "/etc/environment" | grep proxy -i | sed "s/\=/\ /g" - else - echo -e "\e[36m None \e[0m" - fi -} - -unset_proxy() { - if [ ! -e "/etc/environment" ]; then - return - fi - sed -i "/proxy\=/d" /etc/environment - sed -i "/PROXY\=/d" /etc/environment -} - -set_proxy() { - if [ ! -e "/etc/environment" ]; then - touch "/etc/environment" - fi - - var= - if [ "$4" = "y" ]; then - var="$5:$6@" - fi - - echo -n "" > bash_config.tmp - if [ "$3" = "y" ]; then - newvar="://$var$1:$2" - echo "http_proxy=\"http$newvar\"" >> bash_config.tmp - echo "https_proxy=\"http$newvar\"" >> bash_config.tmp - echo "ftp_proxy=\"ftp$newvar\"" >> bash_config.tmp - echo "HTTP_PROXY=\"http$newvar\"" >> bash_config.tmp - echo "HTTPS_PROXY=\"http$newvar\"" >> bash_config.tmp - echo "FTP_PROXY=\"ftp$newvar\"" >> bash_config.tmp - - cat bash_config.tmp | tee -a /etc/environment > /dev/null - rm bash_config.tmp - return - - elif [ "$3" = "n" ]; then - echo "http_proxy=\"http://$var$1:$2\"" >> bash_config.tmp - echo "https_proxy=\"http://$var$7:$8\"" >> bash_config.tmp - echo "ftp_proxy=\"ftp://$var$9:$10\"" >> bash_config.tmp - echo "HTTP_PROXY=\"http://$var$1:$2\"" >> bash_config.tmp - echo "HTTPS_PROXY=\"http://$var$7:$8\"" >> bash_config.tmp - echo "FTP_PROXY=\"ftp://$var$9:$10\"" >> bash_config.tmp - - fix_new_line "/etc/environment" - cat bash_config.tmp | tee -a /etc/environment > /dev/null - rm bash_config.tmp - return - fi -} - - -if [ "$#" = 0 ]; then - exit -fi - -if [ "$1" = "unset" ]; then - # that's what is needed - unset_proxy - exit -# elif [ "$1" = "toggle" ]; then -# toggle_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 - # exit -elif [ "$1" = "list" ]; then - list_proxy - exit -fi - - -unset_proxy -set_proxy $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 diff --git a/gsettings.sh b/gsettings.sh index 3b33264..19a5b5f 100644 --- a/gsettings.sh +++ b/gsettings.sh @@ -47,7 +47,11 @@ set_proxy() { which $gsettings &> /dev/null -if [ "$#" != 0 ]; then +if [ "$?" != 0 ]; then + exit +fi + +if [ "$#" = 0 ]; then exit fi diff --git a/main.sh b/main.sh index 3259360..16a95ba 100755 --- a/main.sh +++ b/main.sh @@ -20,12 +20,16 @@ function _do_it_for_all() { if [ -z "$target" ]; then bash "bash-zsh.sh" "$what_to_do" # sudo -E bash "environment.sh" "$what_to_do" - sudo -E bash "apt.sh" "$what_to_do" - sudo -E bash "dnf.sh" "$what_to_do" bash "gsettings.sh" "$what_to_do" bash "npm.sh" "$what_to_do" bash "dropbox.sh" "$what_to_do" bash "git.sh" "$what_to_do" + + # isn't required, but still checked to avoid sudo in main all the time + if [[ $(which apt &> /dev/null) || $(which dnf &> /dev/null) ]]; then + sudo -E bash "apt.sh" "$what_to_do" + sudo -E bash "dnf.sh" "$what_to_do" + fi else for t in "${targets[@]}" do @@ -66,7 +70,7 @@ function _dump_it_all() { } function show_current_settings() { - echo "Someone wants to list all" + echo "Hmm... listing it all" _do_it_for_all "list" } @@ -107,6 +111,7 @@ function prompt_for_proxy_values() { fi # socks_proxy is omitted, as is usually not required # rsync is kept same as http to reduce number of inputs in interactive mode + # and used only in shellrc rsync_host=$http_host rsync_port=$http_port @@ -118,6 +123,7 @@ function prompt_for_proxy_values() { echo -n "Save profile for later use (y/n)? "; read save_for_reuse if [[ "$save_for_reuse" = "y" || "$save_for_reuse" = "Y" ]]; then read -p " Enter profile name : " config_name + save_config $config_name fi echo @@ -145,6 +151,7 @@ function main() { ;; "load" ) echo "Loading profile : ${blue} $2 ${normal}" load_config "$2" + _dump_it_all prompt_for_proxy_targets set_all_proxy ;; @@ -169,4 +176,4 @@ function main() { main "$@" -_dump_it_all +# _dump_it_all diff --git a/npm.sh b/npm.sh index 12d8283..1f23dd9 100644 --- a/npm.sh +++ b/npm.sh @@ -8,7 +8,7 @@ list_proxy() { echo "http $(npm config get proxy)" echo "https $(npm config get https-proxy)" - if [ $(npm config get strict-ssl) = "true" ]; then + if [[ $(npm config get strict-ssl) = "true" && $(npm config get proxy) != "null" ]]; then echo "${bold}${red} strict-ssl is true. Would recommend to set it false" echo "> ${white} npm config set strict-ssl false ${normal}" fi diff --git a/profiles/sample.txt b/profiles/sample.txt deleted file mode 100644 index cc38d3b..0000000 --- a/profiles/sample.txt +++ /dev/null @@ -1,10 +0,0 @@ -http_host=175.215.214.126 -http_port=8080 -use_same=y -use_auth=n -username= -password= -https_host=175.215.214.126 -https_port=8080 -ftp_host=175.215.214.126 -ftp_port=8080 \ No newline at end of file diff --git a/screenshot.png b/screenshot.png deleted file mode 100644 index d3835398db5e79826c6605c31d50ad4987bff8c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63560 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

kb}Z- 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 From 8ebaffea44130a8bd39dc9fa278982853ee70bd5 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 13 Nov 2018 22:06:29 +0530 Subject: [PATCH 24/54] fixed incorrect gsettings parameters --- bash-zsh.sh | 5 +++++ gsettings.sh | 14 +++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/bash-zsh.sh b/bash-zsh.sh index 7536ac9..ed88c67 100644 --- a/bash-zsh.sh +++ b/bash-zsh.sh @@ -12,8 +12,13 @@ fi if [ "$first" = 0 ]; then bash shellrc.sh "$1" "$HOME/.bashrc" + echo "To activate in current terminal window" + echo "run ${bold}source ~/.bashrc${normal}" fi if [ "$second" = 0 ]; then bash shellrc.sh "$1" "$HOME/.zshrc" + echo "To activate in current terminal window" + echo "run ${bold}source ~/.zshrc${normal}" + echo fi diff --git a/gsettings.sh b/gsettings.sh index 19a5b5f..46c470a 100644 --- a/gsettings.sh +++ b/gsettings.sh @@ -35,18 +35,18 @@ unset_proxy() { set_proxy() { gsettings set org.gnome.system.proxy mode manual - gsettings set org.gnome.system.proxy.http host $http_proxy - gsettings set org.gnome.system.proxy.http port $http_proxy + gsettings set org.gnome.system.proxy.http host $http_host + gsettings set org.gnome.system.proxy.http port $http_port gsettings set org.gnome.system.proxy.http authentication-user $username gsettings set org.gnome.system.proxy.http authentication-password $password - gsettings set org.gnome.system.proxy.https host $https_proxy - gsettings set org.gnome.system.proxy.https port $https_proxy - gsettings set org.gnome.system.proxy.ftp host $ftp_proxy - gsettings set org.gnome.system.proxy.ftp port $ftp_proxy + gsettings set org.gnome.system.proxy.https host $https_host + gsettings set org.gnome.system.proxy.https port $https_port + gsettings set org.gnome.system.proxy.ftp host $ftp_host + gsettings set org.gnome.system.proxy.ftp port $ftp_port } -which $gsettings &> /dev/null +which gsettings &> /dev/null if [ "$?" != 0 ]; then exit fi From 0396656a1b4d699ea5c7a172013cb3816a281a34 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 13 Nov 2018 22:08:37 +0530 Subject: [PATCH 25/54] update readme with usage --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index 9d89599..8735b9b 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,20 @@ (Download [here](https://github.com/himanshub16/ProxyMan/releases/latest/)) +### Usage + +* Set + `./main.sh set` + +* Unset + `./main.sh unset` + +* List available configs + `./main.sh configs` + +* Load config (say proxy4) + `./main.sh load proxy4` + ### How this is going to be different from **v2**? * Saves your settings in a `config_file/rc_file` (same as profiles). From 604b15236620eeb8f73ab55694235737de9a1933 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Sun, 25 Nov 2018 12:38:00 +0530 Subject: [PATCH 26/54] fix errors messages in gsettings by quoting variables --- gsettings.sh | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/gsettings.sh b/gsettings.sh index 46c470a..9387dae 100644 --- a/gsettings.sh +++ b/gsettings.sh @@ -7,7 +7,7 @@ list_proxy() { echo echo "${bold}Desktop proxy settings (GNOME) ${normal}" mode=$(gsettings get org.gnome.system.proxy | tr -d "'") - if [ "$mode" = "none"]; then + if [ "$mode" = "none" ]; then echo "${red}None${normal}" return fi @@ -34,15 +34,16 @@ unset_proxy() { } set_proxy() { - gsettings set org.gnome.system.proxy mode manual - gsettings set org.gnome.system.proxy.http host $http_host - gsettings set org.gnome.system.proxy.http port $http_port - gsettings set org.gnome.system.proxy.http authentication-user $username - gsettings set org.gnome.system.proxy.http authentication-password $password - gsettings set org.gnome.system.proxy.https host $https_host - gsettings set org.gnome.system.proxy.https port $https_port - gsettings set org.gnome.system.proxy.ftp host $ftp_host - gsettings set org.gnome.system.proxy.ftp port $ftp_port + # do quote the variables as blank variables mean nothing when not quoted and show errors + gsettings set org.gnome.system.proxy mode "manual" + gsettings set org.gnome.system.proxy.http host "$http_host" + gsettings set org.gnome.system.proxy.http port "$http_port" + gsettings set org.gnome.system.proxy.http authentication-password "$password" + gsettings set org.gnome.system.proxy.http authentication-user "$username" + gsettings set org.gnome.system.proxy.https host "$https_host" + gsettings set org.gnome.system.proxy.https port "$https_port" + gsettings set org.gnome.system.proxy.ftp host "$ftp_host" + gsettings set org.gnome.system.proxy.ftp port "$ftp_port" } From 58f796f515bdb8aa1f822c830efdb1fe8919b779 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Sun, 25 Nov 2018 12:38:23 +0530 Subject: [PATCH 27/54] have an installation mechanism --- install | 34 ++++++++++++++++++++++++++++++++++ proxyman | 5 +++++ 2 files changed, 39 insertions(+) create mode 100755 install create mode 100644 proxyman diff --git a/install b/install new file mode 100755 index 0000000..2465377 --- /dev/null +++ b/install @@ -0,0 +1,34 @@ +#!/bin/bash +# This script does not download the package to install it. +# This is because I assume wget/curl might not work as proxy hasn't been set. + +# Working from current directory having proxyman + +TARGET_DIR="$HOME/.proxyman" + + +# verify if this is current directory +if [[ -f "main.sh" && -f "shellrc.sh" && -f "dropbox.sh" ]]; then + : +else + echo "please cd to the folder containing proxyman" + exit 1 +fi + +# copy the contents to ~/.proxyman/ +mkdir -p $TARGET_DIR +cp * $TARGET_DIR + +# add to path +mkdir -p $HOME/.local/bin +cp proxyman $HOME/.local/bin +chmod +x $HOME/.local/bin/proxyman + +which proxyman &> /dev/null +if [ "$?" != 0 ]; then + echo "Failed to install :(" + echo "You can still use it > ./main.sh set" + exit +fi + +echo "Installed successfully." diff --git a/proxyman b/proxyman new file mode 100644 index 0000000..37e0a82 --- /dev/null +++ b/proxyman @@ -0,0 +1,5 @@ +#!/bin/bash + +cd $HOME/.proxyman +./main.sh $@ +cd $OLDPWD From 6250217b3ff39e2d5fa26cfa4594057d4078bb8c Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Sun, 25 Nov 2018 12:59:11 +0530 Subject: [PATCH 28/54] don't show source messages when listing for bash/zsh --- bash-zsh.sh | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/bash-zsh.sh b/bash-zsh.sh index ed88c67..4b146ea 100644 --- a/bash-zsh.sh +++ b/bash-zsh.sh @@ -12,13 +12,16 @@ fi if [ "$first" = 0 ]; then bash shellrc.sh "$1" "$HOME/.bashrc" - echo "To activate in current terminal window" - echo "run ${bold}source ~/.bashrc${normal}" + if [ ! "$1" = "list" ]; then + echo "To activate in current terminal window" + echo "run ${bold}source ~/.bashrc${normal}" + fi fi if [ "$second" = 0 ]; then bash shellrc.sh "$1" "$HOME/.zshrc" - echo "To activate in current terminal window" - echo "run ${bold}source ~/.zshrc${normal}" - echo + if [ ! "$1" = "list" ]; then + echo "To activate in current terminal window" + echo "run ${bold}source ~/.zshrc${normal}" + fi fi From 9a5d0ce31c170ab54abf919767193589084cb4dc Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Sun, 25 Nov 2018 12:59:51 +0530 Subject: [PATCH 29/54] remove gsettings error when list --- gsettings.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gsettings.sh b/gsettings.sh index 9387dae..c00b079 100644 --- a/gsettings.sh +++ b/gsettings.sh @@ -6,7 +6,7 @@ list_proxy() { echo echo "${bold}Desktop proxy settings (GNOME) ${normal}" - mode=$(gsettings get org.gnome.system.proxy | tr -d "'") + mode=$(gsettings get org.gnome.system.proxy mode | tr -d "'") if [ "$mode" = "none" ]; then echo "${red}None${normal}" return From 81e5741d50277d39b418841686e22d0b851e1467 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Sun, 25 Nov 2018 13:00:12 +0530 Subject: [PATCH 30/54] fix infinite recursion when setting for all remove useless debugging messages --- main.sh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/main.sh b/main.sh index 16a95ba..da1dc64 100755 --- a/main.sh +++ b/main.sh @@ -17,7 +17,7 @@ function _do_it_for_all() { # $1 : what to do (set/unset/list) local what_to_do="$1" - if [ -z "$target" ]; then + if [[ -z "$targets" || "$targets" = "1" ]]; then bash "bash-zsh.sh" "$what_to_do" # sudo -E bash "environment.sh" "$what_to_do" bash "gsettings.sh" "$what_to_do" @@ -34,8 +34,10 @@ function _do_it_for_all() { for t in "${targets[@]}" do case "$t" in - 1) _do_it_for_all "$what_to_do" - ;; + # THIS stmt WILL CAUSE INFINITE RECURSION. DO NOT USE THIS. + # COMMENTED FOR WARNING + # 1) _do_it_for_all "$what_to_do" + # ;; 2) bash "bash-zsh.sh" "$what_to_do" ;; 3) sudo -E bash "environment.sh" "$what_to_do" @@ -43,9 +45,9 @@ function _do_it_for_all() { 4) sudo -E bash "apt.sh" "$what_to_do" sudo -E bash "dnf.sh" "$what_to_do" ;; - 5) bash "Desktop/gsettings" "$what_to_do" + 5) bash "gsettings.sh" "$what_to_do" ;; - 6) bash "npm & yarn" "$what_to_do" + 6) bash "npm.sh" "$what_to_do" ;; 7) bash "dropbox.sh" "$what_to_do" ;; @@ -142,7 +144,7 @@ function prompt_for_proxy_targets() { echo "|${bold}${red} 8 ${normal}| Git" echo echo "Separate multiple choices with space" - echo -ne "\e[5m ? \e[0m" ; read -a targets + echo -ne "\e[5m ? \e[0m" ; read targets } function main() { From 70980b35fab8968486efe99d44c8e7f03252bc3c Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Sun, 25 Nov 2018 13:11:11 +0530 Subject: [PATCH 31/54] fix multiple targets getting read as one --- main.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.sh b/main.sh index da1dc64..f30b047 100755 --- a/main.sh +++ b/main.sh @@ -145,6 +145,7 @@ function prompt_for_proxy_targets() { echo echo "Separate multiple choices with space" echo -ne "\e[5m ? \e[0m" ; read targets + export targets=(`echo ${targets}`) } function main() { @@ -179,3 +180,4 @@ function main() { main "$@" # _dump_it_all +echo "Done" From 7667662e83fdf00e096888d45531a1ccc9fa306d Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 4 Dec 2018 13:13:26 +0530 Subject: [PATCH 32/54] add *.local to default no_proxy --- variables.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variables.sh b/variables.sh index 2cac2c0..8a680e1 100644 --- a/variables.sh +++ b/variables.sh @@ -49,7 +49,7 @@ export ftp_host="" ftp_port="" export rsync_host="" rsync_port="" export use_auth="" use_same="" export username="" password="" -export no_proxy="localhost,127.0.0.1,192.168.1.1,::1" +export no_proxy="localhost,127.0.0.1,192.168.1.1,::1,*.local" export save_for_reuse="" export config_name="" export action="" From 96dae3544765849bf3f6eb32c2c5ba23bcf8cad8 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 4 Dec 2018 13:24:27 +0530 Subject: [PATCH 33/54] use http_proxy for https_proxy (#41 and #42) --- npm.sh | 7 ++++++- shellrc.sh | 12 ++++++++++-- variables.sh | 7 +++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/npm.sh b/npm.sh index 1f23dd9..6ca258b 100644 --- a/npm.sh +++ b/npm.sh @@ -27,7 +27,12 @@ set_proxy() { # caution: do not use / after stmt npm config set proxy "http://${stmt}${http_host}:${http_port}/" - npm config set https-proxy "https://${stmt}${https_host}:${https_port}/" + + if [ "$USE_HTTP_PROXY_FOR_HTTPS" = "true" ]; then + npm config set https-proxy "http://${stmt}${http_host}:${http_port}/" + else + npm config set https-proxy "https://${stmt}${https_host}:${https_port}/" + fi } which npm &> /dev/null diff --git a/shellrc.sh b/shellrc.sh index ac22a28..34b46df 100644 --- a/shellrc.sh +++ b/shellrc.sh @@ -45,15 +45,23 @@ set_proxy() { # caution: do not use / after stmt echo "export http_proxy=\"http://${stmt}${http_host}:${http_port}/\"" >> "$SHELLRC" - echo "export https_proxy=\"https://${stmt}${https_host}:${https_port}/\"" >> "$SHELLRC" + # $https_proxy at the end echo "export ftp_proxy=\"ftp://${stmt}${ftp_host}:${ftp_port}/\"" >> "$SHELLRC" echo "export rsync_proxy=\"rsync://${stmt}${rsync_host}:${rsync_port}/\"" >> "$SHELLRC" echo "export no_proxy=\"${no_proxy}"\" >> "$SHELLRC" echo "export HTTP_PROXY=\"http://${stmt}${http_host}:${http_port}/\"" >> "$SHELLRC" - echo "export HTTPS_PROXY=\"https://${stmt}${https_host}:${https_port}/\"" >> "$SHELLRC" + # $HTTPS_PROXY at the end echo "export FTP_PROXY=\"ftp://${stmt}${ftp_host}:${ftp_port}/\"" >> "$SHELLRC" echo "export RSYNC_PROXY=\"rsync://${stmt}${rsync_host}:${rsync_port}/\"" >> "$SHELLRC" echo "export NO_PROXY=\"${no_proxy}"\" >> "$SHELLRC" + + if [ "$USE_HTTP_PROXY_FOR_HTTPS" = "true" ]; then + echo "export https_proxy=$http_proxy" >> "$SHELLRC" + echo "export HTTPS_PROXY=$HTTP_PROXY" >> "$SHELLRC" + else + echo "export https_proxy=\"https://${stmt}${https_host}:${https_port}/\"" >> "$SHELLRC" + echo "export HTTPS_PROXY=\"https://${stmt}${https_host}:${https_port}/\"" >> "$SHELLRC" + fi } diff --git a/variables.sh b/variables.sh index 8a680e1..81d102a 100644 --- a/variables.sh +++ b/variables.sh @@ -55,6 +55,13 @@ export config_name="" export action="" export targets="" +# Some proxies cause problem when using https_proxy for https (#43 and #42) +# Instead, they work with http_proxy. Also, found many scripts on stackoverflow +# using http_proxy for https_proxy +# This affects bash/zsh/shellrc and npm +export USE_HTTP_PROXY_FOR_HTTPS="true" + + # This help text contains examples for each command HELP_TEXT="ProxyMan lets you set system-wide proxy settings. From b48a331635c9755e1395c122afe1f279b681daf5 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 4 Dec 2018 20:20:57 +0530 Subject: [PATCH 34/54] add workaround when sudo unavailable (closes #27) add warning message when sudo not available --- main.sh | 12 ++++++------ variables.sh | 10 ++++++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/main.sh b/main.sh index f30b047..a88cf74 100755 --- a/main.sh +++ b/main.sh @@ -19,7 +19,7 @@ function _do_it_for_all() { local what_to_do="$1" if [[ -z "$targets" || "$targets" = "1" ]]; then bash "bash-zsh.sh" "$what_to_do" - # sudo -E bash "environment.sh" "$what_to_do" + # sudo bash "environment.sh" "$what_to_do" bash "gsettings.sh" "$what_to_do" bash "npm.sh" "$what_to_do" bash "dropbox.sh" "$what_to_do" @@ -27,8 +27,8 @@ function _do_it_for_all() { # isn't required, but still checked to avoid sudo in main all the time if [[ $(which apt &> /dev/null) || $(which dnf &> /dev/null) ]]; then - sudo -E bash "apt.sh" "$what_to_do" - sudo -E bash "dnf.sh" "$what_to_do" + sudo bash "apt.sh" "$what_to_do" + sudo bash "dnf.sh" "$what_to_do" fi else for t in "${targets[@]}" @@ -40,10 +40,10 @@ function _do_it_for_all() { # ;; 2) bash "bash-zsh.sh" "$what_to_do" ;; - 3) sudo -E bash "environment.sh" "$what_to_do" + 3) sudo bash "environment.sh" "$what_to_do" ;; - 4) sudo -E bash "apt.sh" "$what_to_do" - sudo -E bash "dnf.sh" "$what_to_do" + 4) sudo bash "apt.sh" "$what_to_do" + sudo bash "dnf.sh" "$what_to_do" ;; 5) bash "gsettings.sh" "$what_to_do" ;; diff --git a/variables.sh b/variables.sh index 81d102a..869e63e 100644 --- a/variables.sh +++ b/variables.sh @@ -62,6 +62,16 @@ export targets="" export USE_HTTP_PROXY_FOR_HTTPS="true" +# Adding a custom wrapper for sudo helps it run on systems without sudo. +# Mentioned in issue #27 - Github +which sudo &> /dev/null +if [ "$?" = 0 ]; then + alias sudo="sudo -E" +else + echo "${red} sudo is not available. Root scripts will run as user. ${normal}" + alias sudo="" +fi + # This help text contains examples for each command HELP_TEXT="ProxyMan lets you set system-wide proxy settings. From 2a091513ecb999dbdc19962e5fe69207f6b4648f Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Wed, 5 Dec 2018 00:18:52 +0530 Subject: [PATCH 35/54] avoid the star as doesn't work everywhere --- variables.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/variables.sh b/variables.sh index 869e63e..c38732f 100644 --- a/variables.sh +++ b/variables.sh @@ -28,7 +28,8 @@ if test -t 1; then export magenta="$(tput setaf 5)" export cyan="$(tput setaf 6)" export white="$(tput setaf 7)" - export star="🌟" + # export star="🌟" + export star="" fi fi From 0cf50491ff5b92c7ff11a0de0fa511ddbdddfcf0 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Wed, 5 Dec 2018 00:22:52 +0530 Subject: [PATCH 36/54] update readme --- README.md | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 8735b9b..40bd510 100644 --- a/README.md +++ b/README.md @@ -6,29 +6,27 @@ ### Usage +* Install + `./install` + * Set - `./main.sh set` + `proxyman set` * Unset - `./main.sh unset` + `proxyman unset` * List available configs - `./main.sh configs` + `proxyman configs` * Load config (say proxy4) - `./main.sh load proxy4` + `proxyman load proxy4` ### How this is going to be different from **v2**? * Saves your settings in a `config_file/rc_file` (same as profiles). -* Single script sourced in `.bashrc/.zshrc` ensures the right config is sourced directly instead of manually invoking the script. +* Simple install script lets you use proxyman from anywhere. ### How did v1 and v2 work? Both versions modified the config files or called the appropriate command of respective tools to configure their internal proxy settings. -### The need for this change. -Most of the tools/targets which proxyman sets proxy for work well with `http_proxy` environment variable. Thus, the need for manually configuring proxy for each target becomes insignificant. - -Also, there can be a use-case where the user wants granular control like different proxy for different application. However, such use-case is very small. - Open for discussions at [#49](https://github.com/himanshub16/ProxyMan/issues/49) . From b6f2ab4d97a7cb88325fda7f54d5353052291766 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Wed, 5 Dec 2018 00:49:44 +0530 Subject: [PATCH 37/54] update readme --- README.md | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 40bd510..5a86fc5 100644 --- a/README.md +++ b/README.md @@ -2,31 +2,37 @@ ### Configuring proxy made so simple on Linux ([releases](https://github.com/himanshub16/ProxyMan/releases/)) -(Download [here](https://github.com/himanshub16/ProxyMan/releases/latest/)) -### Usage +v3 is ready with new features, necessary improvements, updates, restructured code and much better experience. :tada: -* Install - `./install` +## How to use it now +* Download and install with single-step process. +```./install``` -* Set - `proxyman set` +Proxyman is now available in your path. +Open a new terminal window and start playing. -* Unset - `proxyman unset` - -* List available configs - `proxyman configs` - -* Load config (say proxy4) - `proxyman load proxy4` +* Set proxy +```proxyman set``` +* Save your settings for later use. +* View your saved configs +```proxyman configs``` +* Load your previously saved config - say you saved it by the name *point4*. +```proxyman load point4``` -### How this is going to be different from **v2**? -* Saves your settings in a `config_file/rc_file` (same as profiles). -* Simple install script lets you use proxyman from anywhere. +## What's new? +* Saved configs made more organized and works flawlessly. +* Installation script makes it available in your path. Just call the command `proxyman`, no `cd` to your downloads. +* Lots of issues got closed. +* Restructured codebase with better code quality than before - easier to maintain. -### How did v1 and v2 work? -Both versions modified the config files or called the appropriate command of respective tools to configure their internal proxy settings. -Open for discussions at [#49](https://github.com/himanshub16/ProxyMan/issues/49) . +## Why still a release candidate? +Just letting it be for about a month from now to let me use it and find more bugs and edge cases (if any). :see_no_evil: +If you find one, feel free to open an [issue](https://github.com/ProxyMan/issues). +Would release during the first week of 2019. :smiley: + + +### DISCLAIMER +Please don't save your passwords on public machines. Instead use proxyman without providing password and log-in from the browser. From 83bf0d69a1a5c65a75665b736d8efd27c8bb7821 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Wed, 5 Dec 2018 00:51:10 +0530 Subject: [PATCH 38/54] show warning for shared system when saving password --- main.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/main.sh b/main.sh index a88cf74..3b2aa92 100755 --- a/main.sh +++ b/main.sh @@ -94,6 +94,7 @@ function prompt_for_proxy_values() { echo -n " Use auth - userid/password (y/n)? "; read use_auth if [[ "$use_auth" = "y" || "$use_auth" = "Y" ]]; then + echo "${bold}${red} Please don't save your passwords on shared computers.${normal}" read -p " Enter username : " username echo -n " Enter password (use %40 for @) : " ; read -s password echo From 06c51f7b7a2aff47a11da5d16304bf630ac2336b Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Wed, 5 Dec 2018 01:12:38 +0530 Subject: [PATCH 39/54] add asciiname video --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5a86fc5..4f2e5cb 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,9 @@ v3 is ready with new features, necessary improvements, updates, restructured code and much better experience. :tada: -## How to use it now +## How to use it +[![asciicast](https://asciinema.org/a/53PYofBkTUz26FmuhWaSeqF15.png)](https://asciinema.org/a/53PYofBkTUz26FmuhWaSeqF15) + * Download and install with single-step process. ```./install``` From 80f819cba3b0264d2f2ee541b7ab0d174ea9b5c1 Mon Sep 17 00:00:00 2001 From: tuxfy Date: Wed, 16 Jan 2019 13:32:33 +0100 Subject: [PATCH 40/54] added docker support --- docker.sh | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ main.sh | 4 +++ 2 files changed, 82 insertions(+) create mode 100644 docker.sh diff --git a/docker.sh b/docker.sh new file mode 100644 index 0000000..677f838 --- /dev/null +++ b/docker.sh @@ -0,0 +1,78 @@ +#!/bin/bash +# plugin to set "dnf" proxy settings for ProxyMan +# privileges has to be set by the process which starts this script + +CONF_FILE="/etc/systemd/system/docker.service.d/http-proxy.conf" + + +list_proxy() { + # inefficient way as the file is read twice.. think of some better way + echo -e "${bold}docker proxy settings: ${normal}" + if [ ! -e "$CONF_FILE" ]; then + echo -e "${red}None${normal}" + return + else + lines="$(cat $CONF_FILE | grep proxy -i | wc -l)" + if [ "$lines" -gt 0 ]; then + cat $CONF_FILE | grep proxy -i | sed -e "s/Environment=//g" -e "s/\_/\ /g" + else + echo -e "${red}None${normal}" + fi + fi +} + +unset_proxy() { + if [ ! -e "$CONF_FILE" ]; then + return + fi + if [ "$(cat $CONF_FILE | grep proxy -i | wc -l)" -gt 0 ]; then + sudo rm $CONF_FILE + sudo service docker restart + fi +} + +set_proxy() { + unset_proxy + if [ ! -e "$CONF_FILE" ]; then + sudo touch "$CONF_FILE" + fi + + local stmt="" + if [ "$use_auth" = "y" ]; then + stmt="${username}:${password}@" + fi + + echo -n "" > docker_config.tmp + echo "[Service]" >> docker_config.tmp + echo "Environment=\"HTTP_PROXY=http://${stmt}${http_host}:${http_port}\";" \ + >> docker_config.tmp + echo "Environment=\"HTTP_PROXY=http://${stmt}${http_host}:${http_port}\";" \ + >> docker_config.tmp + + cat docker_config.tmp | sudo tee -a $CONF_FILE > /dev/null + rm docker_config.tmp + sudo service docker restart + return +} + + +which docker &> /dev/null +if [ "$?" != 0 ]; then + exit +fi + +if [ "$#" = 0 ]; then + exit +fi + +what_to_do=$1 +case $what_to_do in + set) set_proxy + ;; + unset) unset_proxy + ;; + list) list_proxy + ;; + *) + ;; +esac diff --git a/main.sh b/main.sh index 3b2aa92..983105a 100755 --- a/main.sh +++ b/main.sh @@ -24,6 +24,7 @@ function _do_it_for_all() { bash "npm.sh" "$what_to_do" bash "dropbox.sh" "$what_to_do" bash "git.sh" "$what_to_do" + bash "docker.sh" "$what_to_do" # isn't required, but still checked to avoid sudo in main all the time if [[ $(which apt &> /dev/null) || $(which dnf &> /dev/null) ]]; then @@ -53,6 +54,8 @@ function _do_it_for_all() { ;; 8) bash "git.sh" "$what_to_do" ;; + 9) bash "docker.sh" "$what_to_do" + ;; *) ;; esac done @@ -143,6 +146,7 @@ function prompt_for_proxy_targets() { echo "|${bold}${red} 6 ${normal}| npm & yarn" echo "|${bold}${red} 7 ${normal}| Dropbox" echo "|${bold}${red} 8 ${normal}| Git" + echo "|${bold}${red} 9 ${normal}| Docker" echo echo "Separate multiple choices with space" echo -ne "\e[5m ? \e[0m" ; read targets From dfd58b37d89d997882604d552424a32647b3d3a2 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 22 Jan 2019 00:37:05 +0530 Subject: [PATCH 41/54] fix identation --- docker.sh | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/docker.sh b/docker.sh index 677f838..30ea316 100644 --- a/docker.sh +++ b/docker.sh @@ -7,52 +7,52 @@ CONF_FILE="/etc/systemd/system/docker.service.d/http-proxy.conf" list_proxy() { # inefficient way as the file is read twice.. think of some better way - echo -e "${bold}docker proxy settings: ${normal}" + echo -e "${bold}docker proxy settings: ${normal}" if [ ! -e "$CONF_FILE" ]; then echo -e "${red}None${normal}" - return + return else lines="$(cat $CONF_FILE | grep proxy -i | wc -l)" - if [ "$lines" -gt 0 ]; then - cat $CONF_FILE | grep proxy -i | sed -e "s/Environment=//g" -e "s/\_/\ /g" - else - echo -e "${red}None${normal}" - fi - fi + if [ "$lines" -gt 0 ]; then + cat $CONF_FILE | grep proxy -i | sed -e "s/Environment=//g" -e "s/\_/\ /g" + else + echo -e "${red}None${normal}" + fi + fi } unset_proxy() { if [ ! -e "$CONF_FILE" ]; then - return - fi - if [ "$(cat $CONF_FILE | grep proxy -i | wc -l)" -gt 0 ]; then - sudo rm $CONF_FILE + return + fi + if [ "$(cat $CONF_FILE | grep proxy -i | wc -l)" -gt 0 ]; then + sudo rm $CONF_FILE sudo service docker restart - fi + fi } set_proxy() { unset_proxy if [ ! -e "$CONF_FILE" ]; then - sudo touch "$CONF_FILE" - fi + sudo touch "$CONF_FILE" + fi local stmt="" if [ "$use_auth" = "y" ]; then stmt="${username}:${password}@" fi - echo -n "" > docker_config.tmp + echo -n "" > docker_config.tmp echo "[Service]" >> docker_config.tmp - echo "Environment=\"HTTP_PROXY=http://${stmt}${http_host}:${http_port}\";" \ - >> docker_config.tmp - echo "Environment=\"HTTP_PROXY=http://${stmt}${http_host}:${http_port}\";" \ - >> docker_config.tmp + echo "Environment=\"HTTP_PROXY=http://${stmt}${http_host}:${http_port}\";" \ + >> docker_config.tmp + echo "Environment=\"HTTP_PROXY=http://${stmt}${http_host}:${http_port}\";" \ + >> docker_config.tmp - cat docker_config.tmp | sudo tee -a $CONF_FILE > /dev/null - rm docker_config.tmp + cat docker_config.tmp | sudo tee -a $CONF_FILE > /dev/null + rm docker_config.tmp sudo service docker restart - return + return } From 74e845db425186141a30048dadbdc2c25844b2b1 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 22 Jan 2019 00:54:23 +0530 Subject: [PATCH 42/54] invoke script with sudo instead of inside it --- docker.sh | 10 +++++----- main.sh | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docker.sh b/docker.sh index 30ea316..97ea972 100644 --- a/docker.sh +++ b/docker.sh @@ -26,15 +26,15 @@ unset_proxy() { return fi if [ "$(cat $CONF_FILE | grep proxy -i | wc -l)" -gt 0 ]; then - sudo rm $CONF_FILE - sudo service docker restart + rm $CONF_FILE + service docker restart fi } set_proxy() { unset_proxy if [ ! -e "$CONF_FILE" ]; then - sudo touch "$CONF_FILE" + touch "$CONF_FILE" fi local stmt="" @@ -49,9 +49,9 @@ set_proxy() { echo "Environment=\"HTTP_PROXY=http://${stmt}${http_host}:${http_port}\";" \ >> docker_config.tmp - cat docker_config.tmp | sudo tee -a $CONF_FILE > /dev/null + cat docker_config.tmp | tee -a $CONF_FILE > /dev/null rm docker_config.tmp - sudo service docker restart + service docker restart return } diff --git a/main.sh b/main.sh index 983105a..0669b8f 100755 --- a/main.sh +++ b/main.sh @@ -24,12 +24,12 @@ function _do_it_for_all() { bash "npm.sh" "$what_to_do" bash "dropbox.sh" "$what_to_do" bash "git.sh" "$what_to_do" - bash "docker.sh" "$what_to_do" # isn't required, but still checked to avoid sudo in main all the time - if [[ $(which apt &> /dev/null) || $(which dnf &> /dev/null) ]]; then + if [[ $(which apt &> /dev/null) || $(which dnf &> /dev/null) || $(which docker &> /dev/null) ]]; then sudo bash "apt.sh" "$what_to_do" sudo bash "dnf.sh" "$what_to_do" + sudo bash "docker.sh" "$what_to_do" fi else for t in "${targets[@]}" @@ -54,7 +54,7 @@ function _do_it_for_all() { ;; 8) bash "git.sh" "$what_to_do" ;; - 9) bash "docker.sh" "$what_to_do" + 9) sudo bash "docker.sh" "$what_to_do" ;; *) ;; esac From cdeb2c2123c0dbfdd35abaacc56deada75052d1b Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 22 Jan 2019 00:54:53 +0530 Subject: [PATCH 43/54] [docker] make config dir if not exists --- docker.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/docker.sh b/docker.sh index 97ea972..fc169b2 100644 --- a/docker.sh +++ b/docker.sh @@ -33,6 +33,7 @@ unset_proxy() { set_proxy() { unset_proxy + mkdir -p /etc/systemd/system/docker.service.d if [ ! -e "$CONF_FILE" ]; then touch "$CONF_FILE" fi From 1b43af9e3df5c8916d38003b3df35faae7c3beeb Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 22 Jan 2019 01:24:48 +0530 Subject: [PATCH 44/54] refactor and work without temp file and sudo --- docker.sh | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/docker.sh b/docker.sh index fc169b2..2c2d9f7 100644 --- a/docker.sh +++ b/docker.sh @@ -5,6 +5,14 @@ CONF_FILE="/etc/systemd/system/docker.service.d/http-proxy.conf" +reload_docker_service() { + echo "reloading docker" + systemctl daemon-reload + systemctl restart docker.service + echo "done" +} + + list_proxy() { # inefficient way as the file is read twice.. think of some better way echo -e "${bold}docker proxy settings: ${normal}" @@ -25,17 +33,17 @@ unset_proxy() { if [ ! -e "$CONF_FILE" ]; then return fi - if [ "$(cat $CONF_FILE | grep proxy -i | wc -l)" -gt 0 ]; then - rm $CONF_FILE - service docker restart - fi + for PROTOTYPE in "HTTP" "HTTPS" "FTP" "RSYNC" "NO"; do + sed -i "/${PROTOTYPE}_PROXY\=/d" "$CONF_FILE" + done } set_proxy() { unset_proxy mkdir -p /etc/systemd/system/docker.service.d - if [ ! -e "$CONF_FILE" ]; then - touch "$CONF_FILE" + if [[ ! -e "$CONF_FILE" ]]; then + echo -n "" > $CONF_FILE + echo "[Service]" >> $CONF_FILE fi local stmt="" @@ -43,16 +51,9 @@ set_proxy() { stmt="${username}:${password}@" fi - echo -n "" > docker_config.tmp - echo "[Service]" >> docker_config.tmp - echo "Environment=\"HTTP_PROXY=http://${stmt}${http_host}:${http_port}\";" \ - >> docker_config.tmp - echo "Environment=\"HTTP_PROXY=http://${stmt}${http_host}:${http_port}\";" \ - >> docker_config.tmp + echo 'Environment="HTTP_PROXY=http://'${stmt}${http_host}:${http_port}'/" "HTTPS_PROXY=http://'${stmt}${https_host}:${https_port}'/" "NO_PROXY='${no_proxy}'"'\ + >> $CONF_FILE - cat docker_config.tmp | tee -a $CONF_FILE > /dev/null - rm docker_config.tmp - service docker restart return } @@ -69,8 +70,10 @@ fi what_to_do=$1 case $what_to_do in set) set_proxy + reload_docker_service ;; unset) unset_proxy + reload_docker_service ;; list) list_proxy ;; From c5e6c44e4176bf7ffd38547af161e62e0208352a Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 22 Jan 2019 01:25:12 +0530 Subject: [PATCH 45/54] pass env vars to scripts running with sudo --- main.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/main.sh b/main.sh index 0669b8f..8937b21 100755 --- a/main.sh +++ b/main.sh @@ -27,9 +27,9 @@ function _do_it_for_all() { # isn't required, but still checked to avoid sudo in main all the time if [[ $(which apt &> /dev/null) || $(which dnf &> /dev/null) || $(which docker &> /dev/null) ]]; then - sudo bash "apt.sh" "$what_to_do" - sudo bash "dnf.sh" "$what_to_do" - sudo bash "docker.sh" "$what_to_do" + sudo -E bash "apt.sh" "$what_to_do" + sudo -E bash "dnf.sh" "$what_to_do" + sudo -E bash "docker.sh" "$what_to_do" fi else for t in "${targets[@]}" @@ -41,10 +41,10 @@ function _do_it_for_all() { # ;; 2) bash "bash-zsh.sh" "$what_to_do" ;; - 3) sudo bash "environment.sh" "$what_to_do" + 3) sudo -E bash "environment.sh" "$what_to_do" ;; - 4) sudo bash "apt.sh" "$what_to_do" - sudo bash "dnf.sh" "$what_to_do" + 4) sudo -E bash "apt.sh" "$what_to_do" + sudo -E bash "dnf.sh" "$what_to_do" ;; 5) bash "gsettings.sh" "$what_to_do" ;; @@ -54,7 +54,7 @@ function _do_it_for_all() { ;; 8) bash "git.sh" "$what_to_do" ;; - 9) sudo bash "docker.sh" "$what_to_do" + 9) sudo -E bash "docker.sh" "$what_to_do" ;; *) ;; esac From 63bc044630b462a9be1300b734d204cb3353fa7a Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 22 Jan 2019 01:31:40 +0530 Subject: [PATCH 46/54] use http proxy for https when asked --- docker.sh | 10 ++++++++-- shellrc.sh | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/docker.sh b/docker.sh index 2c2d9f7..2e33e33 100644 --- a/docker.sh +++ b/docker.sh @@ -51,8 +51,14 @@ set_proxy() { stmt="${username}:${password}@" fi - echo 'Environment="HTTP_PROXY=http://'${stmt}${http_host}:${http_port}'/" "HTTPS_PROXY=http://'${stmt}${https_host}:${https_port}'/" "NO_PROXY='${no_proxy}'"'\ - >> $CONF_FILE + if [ "$USE_HTTP_PROXY_FOR_HTTPS" = "true" ]; then + echo 'Environment="HTTP_PROXY=http://'${stmt}${http_host}:${http_port}'/" "HTTPS_PROXY=http://'${stmt}${https_host}:${https_port}'/" "NO_PROXY='${no_proxy}'"'\ + >> $CONF_FILE + else + echo 'Environment="HTTP_PROXY=http://'${stmt}${http_host}:${http_port}'/" "HTTPS_PROXY=https://'${stmt}${https_host}:${https_port}'/" "NO_PROXY='${no_proxy}'"'\ + >> $CONF_FILE + fi + return } diff --git a/shellrc.sh b/shellrc.sh index 34b46df..6b87288 100644 --- a/shellrc.sh +++ b/shellrc.sh @@ -56,8 +56,8 @@ set_proxy() { echo "export NO_PROXY=\"${no_proxy}"\" >> "$SHELLRC" if [ "$USE_HTTP_PROXY_FOR_HTTPS" = "true" ]; then - echo "export https_proxy=$http_proxy" >> "$SHELLRC" - echo "export HTTPS_PROXY=$HTTP_PROXY" >> "$SHELLRC" + echo "export https_proxy=\"${http_proxy}/\"" >> "$SHELLRC" + echo "export HTTPS_PROXY=\"${HTTP_PROXY}/\"" >> "$SHELLRC" else echo "export https_proxy=\"https://${stmt}${https_host}:${https_port}/\"" >> "$SHELLRC" echo "export HTTPS_PROXY=\"https://${stmt}${https_host}:${https_port}/\"" >> "$SHELLRC" From c420a651e0c717a3a9b5f826f1cd4201bcc01442 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 22 Jan 2019 01:41:17 +0530 Subject: [PATCH 47/54] update reamde --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4f2e5cb..b1d6b5c 100644 --- a/README.md +++ b/README.md @@ -31,9 +31,8 @@ Open a new terminal window and start playing. ## Why still a release candidate? -Just letting it be for about a month from now to let me use it and find more bugs and edge cases (if any). :see_no_evil: -If you find one, feel free to open an [issue](https://github.com/ProxyMan/issues). -Would release during the first week of 2019. :smiley: +If you find any bugs/edge-cases not taken care of :see_no_evil:, feel free to open an [issue](https://github.com/ProxyMan/issues). +:smiley: ### DISCLAIMER From 46034ec278d441671daf3125e0e2479b668ab9d4 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 22 Jan 2019 02:27:57 +0530 Subject: [PATCH 48/54] fix dropbox set command --- dropbox.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dropbox.sh b/dropbox.sh index edaa2e1..bc04997 100644 --- a/dropbox.sh +++ b/dropbox.sh @@ -15,7 +15,7 @@ unset_proxy() { } set_proxy() { - $DROPBOX_PY proxy manual $http_host $http_port $username $password &> /dev/null + eval "$DROPBOX_PY proxy manual http $http_host $http_port $username $password &> /dev/null" } From c90807c3c5e7e883a1e6024b9807419dee3b3ce5 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Tue, 22 Jan 2019 02:36:06 +0530 Subject: [PATCH 49/54] update video demo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b1d6b5c..8d83dcc 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ v3 is ready with new features, necessary improvements, updates, restructured code and much better experience. :tada: ## How to use it -[![asciicast](https://asciinema.org/a/53PYofBkTUz26FmuhWaSeqF15.png)](https://asciinema.org/a/53PYofBkTUz26FmuhWaSeqF15) +[![asciicast](https://asciinema.org/a/CVha4PPMdjkU7a1XihD9PItrz.png)](https://asciinema.org/a/CVha4PPMdjkU7a1XihD9PItrz) * Download and install with single-step process. ```./install``` From a3db7879508a07ab1576ef8dd1e11cc80f3c4c01 Mon Sep 17 00:00:00 2001 From: tuxfy Date: Tue, 22 Jan 2019 13:29:42 +0100 Subject: [PATCH 50/54] added missing $ for _no_proxy --- main.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.sh b/main.sh index 8937b21..6b9e1fb 100755 --- a/main.sh +++ b/main.sh @@ -123,7 +123,7 @@ function prompt_for_proxy_values() { echo -n " No Proxy ${green} (default $no_proxy) ${normal}"; read _no_proxy if [[ $_no_proxy != "" ]]; then - no_proxy=_no_proxy + no_proxy=$_no_proxy fi echo -n "Save profile for later use (y/n)? "; read save_for_reuse From c980da37b5ec5b2483e0e5312f093ce25d9207fc Mon Sep 17 00:00:00 2001 From: tuxfy Date: Tue, 22 Jan 2019 14:02:08 +0100 Subject: [PATCH 51/54] Fixed wrong validation Checked for existing apt instead of dnf before --- dnf.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dnf.sh b/dnf.sh index ec526cd..423b52f 100644 --- a/dnf.sh +++ b/dnf.sh @@ -47,7 +47,7 @@ set_proxy() { } -which apt &> /dev/null +which dnf &> /dev/null if [ "$?" != 0 ]; then exit fi From aa54817ca38149a4c34297ca1a43115ae4014dba Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Wed, 23 Jan 2019 01:36:33 +0530 Subject: [PATCH 52/54] fix #62 _all_ handling for programs using sudo --- main.sh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/main.sh b/main.sh index 6b9e1fb..bd911a9 100755 --- a/main.sh +++ b/main.sh @@ -26,11 +26,10 @@ function _do_it_for_all() { bash "git.sh" "$what_to_do" # isn't required, but still checked to avoid sudo in main all the time - if [[ $(which apt &> /dev/null) || $(which dnf &> /dev/null) || $(which docker &> /dev/null) ]]; then - sudo -E bash "apt.sh" "$what_to_do" - sudo -E bash "dnf.sh" "$what_to_do" - sudo -E bash "docker.sh" "$what_to_do" - fi + SUDO_CMDS="apt dnf docker" + for cmd in $SUDO_CMDS; do + command -v $cmd > /dev/null && sudo -E bash "${cmd}.sh" "$what_to_do" || : + done else for t in "${targets[@]}" do From bccde2770928c0b84e3f424e7841f9c0138df1df Mon Sep 17 00:00:00 2001 From: tuxfy Date: Wed, 23 Jan 2019 09:30:23 +0100 Subject: [PATCH 53/54] added check for USE_HTTP_PROXY_FOR_HTTPS --- apt.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apt.sh b/apt.sh index 02fdf61..3b181f9 100644 --- a/apt.sh +++ b/apt.sh @@ -46,8 +46,13 @@ set_proxy() { # caution: do not use / after stmt echo "Acquire::Http::Proxy \"http://${stmt}${http_host}:${http_port}\"" \ >> "$CONF_FILE" - echo "Acquire::Https::Proxy \"https://${stmt}${https_host}:${https_port}\"" \ - >> "$CONF_FILE" + if [ "$USE_HTTP_PROXY_FOR_HTTPS" = "true" ]; then + echo "Acquire::Https::Proxy \"http://${stmt}${https_host}:${https_port}\";" \ + >> "$CONF_FILE" + else + echo "Acquire::Https::Proxy \"https://${stmt}${https_host}:${https_port}\";" \ + >> "$CONF_FILE" + fi echo "Acquire::Ftp::Proxy \"ftp://${stmt}${ftp_host}:${ftp_port}\"" \ >> "$CONF_FILE" } From 73a5232837baefec83bb2c6292f0d052e87dd977 Mon Sep 17 00:00:00 2001 From: tuxfy Date: Wed, 23 Jan 2019 09:38:45 +0100 Subject: [PATCH 54/54] added check for USE_HTTP_PROXY_FOR_HTTPS --- git.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/git.sh b/git.sh index 2e0f814..2959ed0 100644 --- a/git.sh +++ b/git.sh @@ -23,7 +23,11 @@ set_proxy() { # caution: do not use / after stmt git config --global http.proxy "http://${stmt}${http_host}:${http_port}/" - git config --global https.proxy "https://${stmt}${https_host}:${https_port}/" + if [ "$USE_HTTP_PROXY_FOR_HTTPS" = "true" ]; then + git config --global https.proxy "http://${stmt}${https_host}:${https_port}/" + else + git config --global https.proxy "https://${stmt}${https_host}:${https_port}/" + fi }