├── .gitignore
├── img
├── .gitignore
├── jb-img.png
├── logo1.png
├── logo2.png
└── screengrab.png
├── .gitattributes
├── local.lcars.DNSCryptLoopback.plist
├── LICENSE
├── README.md
└── DNSCryptMenu.30s.sh
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .CS_Store
3 | TODO
4 | *.base64
--------------------------------------------------------------------------------
/img/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .CS_Store
3 | TODO
4 | *.base64
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/img/jb-img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayBrown/DNSCrypt-Menu/HEAD/img/jb-img.png
--------------------------------------------------------------------------------
/img/logo1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayBrown/DNSCrypt-Menu/HEAD/img/logo1.png
--------------------------------------------------------------------------------
/img/logo2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayBrown/DNSCrypt-Menu/HEAD/img/logo2.png
--------------------------------------------------------------------------------
/img/screengrab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayBrown/DNSCrypt-Menu/HEAD/img/screengrab.png
--------------------------------------------------------------------------------
/local.lcars.DNSCryptLoopback.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | AbandonProcessGroup
6 |
7 | KeepAlive
8 |
9 | Label
10 | local.lcars.DNSCryptLoopback
11 | Nice
12 | 8
13 | ProgramArguments
14 |
15 | /sbin/ifconfig
16 | lo0
17 | alias
18 | 127.0.0.54
19 |
20 | RunAtLoad
21 |
22 | StandardErrorPath
23 | /tmp/local.lcars.DNSCryptLoopback.stderr
24 | StandardOutPath
25 | /tmp/local.lcars.DNSCryptLoopback.stdout
26 |
27 |
28 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Joss Brown (pseud.) -- German laws apply -- Place of jurisdiction: Berlin, Germany
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 | 
3 | [](https://github.com/jedisct1/dnscrypt-proxy)
4 | [](https://github.com/matryer/bitbar)
5 | [](https://github.com/JayBrown/DNSCrypt-Menu/blob/master/LICENSE)
6 |
7 | # DNSCrypt Menu
8 |
9 | **DNSCrypt Menu is a [BitBar](https://github.com/matryer/bitbar) plugin to manage the [DNSCrypt](https://github.com/jedisct1/dnscrypt-proxy) proxy from the macOS menu bar.**
10 |
11 | **DNSCrypt Menu** also works as a tool to configure your default DNS setup.
12 |
13 | ## Functionality
14 | * start, stop or force-restart the DNSCrypt service with support for Homebrew installations
15 | * switch between settings (_see below_; exception: **Other DNS** via VPN)
16 | * configure additional resolvers for **DNSCrypt + Fallback** setting
17 | * configure resolvers for the **Default DNS** setting
18 | * _Note_: at initial run the user's original DNS resolvers, as specified in the **Network** preference pane, are saved to `$HOME/.config/dnscrypt/backup-*`, followed by the service name and `-initial`, e.g. `backup-Wi-Fi-initial`; backed-up resolvers can be reloaded at any time.
19 | * display DNS information: service, devices (incl. TUN/TAP), current resolvers (`/etc/resolv.conf`), configured resolvers (Network preferences), internal fallback resolver (DNSCrypt), configured fallback resolvers (DNSCrypt Menu), public DNS IP with hostname, Whois & ping, local area DNS
20 | * display DNSCrypt executable and service information: owner, PID, version, network status, used resolvers, ignored resolvers, executable path, config path, latest log & output, full log, log settings
21 | * backup and reload resolvers from **Other DNS** setups (excluding VPN tunnels)
22 | * options to clear DNS cache or renew DHCP lease
23 | * links to robtex (IP & hostname), current resolver source, this repository, the dnscrypt-proxy repository, and a list of available public DNSCrypt server
24 |
25 | 
26 |
27 | ## Installation
28 | * install `dnscrypt-proxy` version 2, e.g. with **[Homebrew](https://brew.sh)** (recommended): `brew install dnscrypt-proxy`
29 | * configure `dnscrypt-proxy` by editing the `.toml` configuration file
30 | * download the latest version of **BitBar**, currently at **[v2.0.0 beta 10](https://github.com/matryer/bitbar/releases/tag/v2.0.0-beta10)**
31 | * install and configure BitBar
32 | * quit BitBar
33 | * clone the **DNSCrypt Menu** GitHub repository and symlink `DNSCryptMenu.30s.sh` to your BitBar plugins folder
34 | * refresh clone for updates
35 | * install **[terminal-notifier](https://github.com/julienXX/terminal-notifier)** (optional, recommended)
36 | * launch BitBar
37 |
38 | ## Settings
39 | * **DNSCrypt** — basic DNSCrypt setting without fallback DNS except the one specified in the TOML configuration file
40 | * **DNSCrypt + Fallback** — DNSCrypt using additional fallback DNS, with Quad9 (9.9.9.9) as initial preset
41 | * **Default DNS** — DNS without DNSCrypt and without initial resolvers, i.e. macOS will use the LAN DNS
42 | * **Other DNS**
43 | * fixed auto-setting when using a VPN
44 | * user-defined settings based on manual configuration in the Network preference pane (excluding VPN scenarios)
45 |
46 | ## Notes
47 | * The file `local.lcars.DNSCryptLoopback.plist` is a LaunchDaemon for demonstration purposes. If you use a different proxy address than the default `127.0.0.1`, you need to map your alternate address at every system boot for DNSCrypt to work. This particular daemon runs the command `ifconfig lo0 alias 127.0.0.54`. Edit to your needs and install/enable using the following commands:
48 |
49 | * `cp local.lcars.DNSCryptLoopback.plist /Library/LaunchDaemons/local.lcars.DNSCryptLoopback.plist`
50 | * `chmod 0644 /Library/LaunchDaemons/local.lcars.DNSCryptLoopback.plist`
51 | * `launchctl load /Library/LaunchDaemons/local.lcars DNSCryptLoopback.plist`
52 | * Verify with: `netstat -nr | grep "^127\.0\.0\..*lo0$"`
53 |
54 | * Stop and restart the plugin from external scripts with:
55 | * stop: `mv $HOME/.config/dnscrypt/run $HOME/.config/dnscrypt/stop`
56 | * restart: `mv $HOME/.config/dnscrypt/stop $HOME/.config/dnscrypt/run`
57 |
58 | * This BitBar plugin has only been tested on El Capitan (OS X 10.11.6); IPv6 network setups have _not_ been tested; please report any issues or create a **pull request**.
59 |
60 | ## Todo
61 | * Tweaking & testing, lots of testing
62 | * script comments
63 | * TOML parsing (blocklists, IPv6 etc.)?
64 |
65 | ## Thank you
66 | Thank you to **[Frank Denis](https://github.com/jedisct1/bitbar-dnscrypt-proxy-switcher)** for kicking this off with his original plugin.
67 |
--------------------------------------------------------------------------------
/DNSCryptMenu.30s.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # DNSCrypt Menu
4 | # 1.0.34
5 | # Joss Brown
6 | # JayBrown
7 | # Manage DNSCrypt from the macOS menu bar
8 | # https://raw.githubusercontent.com/JayBrown/DNSCrypt-Menu/master/img/screengrab.png
9 | # https://github.com/JayBrown/DNSCrypt-Menu
10 |
11 | # DNSCrypt Menu
12 | # version 1.0.34
13 | # Copyright (c) 2018 Joss Brown (pseud.)
14 | # License: MIT+
15 | # derived from: dnscrypt-proxy-switcher by Frank Denis (jedisct1) https://github.com/jedisct1/bitbar-dnscrypt-proxy-switcher
16 |
17 | dcmver="1.0.34"
18 | dcmvadd=""
19 |
20 | export LANG=en_US.UTF-8
21 | export HISTIGNORE='*sudo -S*'
22 | export PATH=$PATH:/usr/local/bin:/usr/local/sbin:/opt/local/bin:/opt/local/sbin:/sw/bin:/sw/sbin:$HOME/bin:$HOME/sbin
23 |
24 | osversion=$(sw_vers -productVersion)
25 | osmajor=$(echo "$osversion" | awk -F. '{print $2}')
26 | [ $osmajor -lt 7 ] && exit 1
27 |
28 | theme="classic"
29 | if test -t 0 ; then
30 | theme="emoji"
31 | fi
32 |
33 | if [[ $theme == "classic" ]] ; then
34 | ERROR_ICON="| dropdown=false templateImage=JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGlVE1vgzAMvedX+FwpaUIhIedO27nqYT+g0tZJsKnisL8/2yHY6XqYNAkFeGD7+fnjBie4gYcQYaYDr4kOjzfP57V+fd3BJ+xflgDvC+yf5wBPX2xtk0uxTz4amzI/BnQ2RncYutyDgJMCg49uGMcO42z2YCtqJrhCcPj9MBzAjtlxAHSbokseDRU4EYjxh8xgH0KiLCpobI4uIzoWcDVHsDxhvlsgBXaO/PQJlLkRECnVQGK+8fxFv7hCiTmRIRvKqYAUn7K7oy+goq/AVM2NxM8bqHRqwSKEfQyuOqH6KN76p0q0ASt5BFdFm4xK6Zo07ypaJeG+khy2eHe1ZrULM6lgLauYN2Kp/qnFEhLMrcAzMAnvInzA/ogtflnAuxGrr8/lolrlAU/lkRX8B08jPFVTz/C245GTfB/QUAZCo5kCMf+7XOLVrHJ18I3ybJIdz/g25K45z0daLzydNOy0Uqy8Co+ahrnM/BNOCs4DbSG681biJaW3ksd1cEY5Tj9np/mWCmVuZHN0cmVhbQplbmRvYmoKNSAwIG9iagozOTAKZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAzIDAgUiAvUmVzb3VyY2VzIDYgMCBSIC9Db250ZW50cyA0IDAgUiAvTWVkaWFCb3ggWzAgMCAxNiAxNl0KPj4KZW5kb2JqCjYgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIF0gL0NvbG9yU3BhY2UgPDwgL0NzMSAxMCAwIFIgPj4gL0V4dEdTdGF0ZSA8PCAvR3MxIDExIDAgUgo+PiAvWE9iamVjdCA8PCAvRm0xIDcgMCBSID4+ID4+CmVuZG9iago3IDAgb2JqCjw8IC9MZW5ndGggOCAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0Zvcm0gL0Zvcm1UeXBlCjEgL0JCb3ggWzAgMCAxNiAxNl0gL1Jlc291cmNlcyA5IDAgUiAvR3JvdXAgPDwgL1MgL1RyYW5zcGFyZW5jeSAvQ1MgMTIgMCBSCi9JIHRydWUgL0sgZmFsc2UgPj4gPj4Kc3RyZWFtCngBbVJLTsUwDNznFF4jYeI4H2fNCd7qHaACgVSQ4N1fwk4bpwukLlxnZjzj5Adu8AMRiJFa5QJf9pOxcRECwlQTNQaqkFAS1yxWbwuvf7sTgv7ZZ/wmg+bCyrmIKEdxKp+pL/zyEaIO8ZHRZpzgaAanr7gw2zXFDh8KEnVcOFDCFhNZttkz/1m4k/IL5UyaNSPpCgowpt4kD1tHR62fEsFRamhKeG8VdlTKRWIK2OrOQcEHjQUeo8xOjT0d6kPijOEeVojNvQYPto9Eh4QzZ7HCzo57UF9nb+3LtpixcBJdHkVkLlF0ixWlxSICovfigIK15q7XusMsw3lovYa9S2U2du2pNrvTqXnBEWGujcRFFNeRUs+Ugg10gLMvQn64qzmjCSflTENODhfjF53/896f4Ftfl7678bx/3+BuDazwCS+vDwrbYxxHeGzwnJCLuQWSo7J3N0sv1PPsLcYeVr0qu4Z3uP0BN5q6dAplbmRzdHJlYW0KZW5kb2JqCjggMCBvYmoKMzYzCmVuZG9iago5IDAgb2JqCjw8IC9Qcm9jU2V0IFsgL1BERiBdIC9Db2xvclNwYWNlIDw8IC9DczEgMTAgMCBSID4+ID4+CmVuZG9iagoxMSAwIG9iago8PCAvVHlwZSAvRXh0R1N0YXRlIC9jYSAwLjQ1ID4+CmVuZG9iagoxMyAwIG9iago8PCAvTGVuZ3RoIDE0IDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGFVd9v21QUPolvUqQWPyBYR4eKxa9VU1u5GxqtxgZJk6XtShal6dgqJOQ6N4mpGwfb6baqT3uBNwb8AUDZAw9IPCENBmJ72fbAtElThyqqSUh76MQPISbtBVXhu3ZiJ1PEXPX6yznfOec7517bRD1fabWaGVWIlquunc8klZOnFpSeTYrSs9RLA9Sr6U4tkcvNEi7BFffO6+EdigjL7ZHu/k72I796i9zRiSJPwG4VHX0Z+AxRzNRrtksUvwf7+Gm3BtzzHPDTNgQCqwKXfZwSeNHHJz1OIT8JjtAq6xWtCLwGPLzYZi+3YV8DGMiT4VVuG7oiZpGzrZJhcs/hL49xtzH/Dy6bdfTsXYNY+5yluWO4D4neK/ZUvok/17X0HPBLsF+vuUlhfwX4j/rSfAJ4H1H0qZJ9dN7nR19frRTeBt4Fe9FwpwtN+2p1MXscGLHR9SXrmMgjONd1ZxKzpBeA71b4tNhj6JGoyFNp4GHgwUp9qplfmnFW5oTdy7NamcwCI49kv6fN5IAHgD+0rbyoBc3SOjczohbyS1drbq6pQdqumllRC/0ymTtej8gpbbuVwpQfyw66dqEZyxZKxtHpJn+tZnpnEdrYBbueF9qQn93S7HQGGHnYP7w6L+YGHNtd1FJitqPAR+hERCNOFi1i1alKO6RQnjKUxL1GNjwlMsiEhcPLYTEiT9ISbN15OY/jx4SMshe9LaJRpTvHr3C/ybFYP1PZAfwfYrPsMBtnE6SwN9ib7AhLwTrBDgUKcm06FSrTfSj187xPdVQWOk5Q8vxAfSiIUc7Z7xr6zY/+hpqwSyv0I0/QMTRb7RMgBxNodTfSPqdraz/sDjzKBrv4zu2+a2t0/HHzjd2Lbcc2sG7GtsL42K+xLfxtUgI7YHqKlqHK8HbCCXgjHT1cAdMlDetv4FnQ2lLasaOl6vmB0CMmwT/IPszSueHQqv6i/qluqF+oF9TfO2qEGTumJH0qfSv9KH0nfS/9TIp0Wboi/SRdlb6RLgU5u++9nyXYe69fYRPdil1o1WufNSdTTsp75BfllPy8/LI8G7AUuV8ek6fkvfDsCfbNDP0dvRh0CrNqTbV7LfEEGDQPJQadBtfGVMWEq3QWWdufk6ZSNsjG2PQjp3ZcnOWWing6noonSInvi0/Ex+IzAreevPhe+CawpgP1/pMTMDo64G0sTCXIM+KdOnFWRfQKdJvQzV1+Bt8OokmrdtY2yhVX2a+qrykJfMq4Ml3VR4cVzTQVz+UoNne4vcKLoyS+gyKO6EHe+75Fdt0Mbe5bRIf/wjvrVmhbqBN97RD1vxrahvBOfOYzoosH9bq94uejSOQGkVM6sN/7HelL4t10t9F4gPdVzydEOx83Gv+uNxo7XyL/FtFl8z9ZAHF4CmVuZHN0cmVhbQplbmRvYmoKMTQgMCBvYmoKMTA0NwplbmRvYmoKMTIgMCBvYmoKWyAvSUNDQmFzZWQgMTMgMCBSIF0KZW5kb2JqCjE1IDAgb2JqCjw8IC9MZW5ndGggMTYgMCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AZ2Wd1RT2RaHz703vdASIiAl9Bp6CSDSO0gVBFGJSYBQAoaEJnZEBUYUESlWZFTAAUeHImNFFAuDgmLXCfIQUMbBUURF5d2MawnvrTXz3pr9x1nf2ee319ln733XugBQ/IIEwnRYAYA0oVgU7uvBXBITy8T3AhgQAQ5YAcDhZmYER/hEAtT8vT2ZmahIxrP27i6AZLvbLL9QJnPW/3+RIjdDJAYACkXVNjx+JhflApRTs8UZMv8EyvSVKTKGMTIWoQmirCLjxK9s9qfmK7vJmJcm5KEaWc4ZvDSejLtQ3pol4aOMBKFcmCXgZ6N8B2W9VEmaAOX3KNPT+JxMADAUmV/M5yahbIkyRRQZ7onyAgAIlMQ5vHIOi/k5aJ4AeKZn5IoEiUliphHXmGnl6Mhm+vGzU/liMSuUw03hiHhMz/S0DI4wF4Cvb5ZFASVZbZloke2tHO3tWdbmaPm/2d8eflP9Pch6+1XxJuzPnkGMnlnfbOysL70WAPYkWpsds76VVQC0bQZA5eGsT+8gAPIFALTenPMehmxeksTiDCcLi+zsbHMBn2suK+g3+5+Cb8q/hjn3mcvu+1Y7phc/gSNJFTNlReWmp6ZLRMzMDA6Xz2T99xD/48A5ac3Jwyycn8AX8YXoVVHolAmEiWi7hTyBWJAuZAqEf9Xhfxg2JwcZfp1rFGh1XwB9hTlQuEkHyG89AEMjAyRuP3oCfetbEDEKyL68aK2Rr3OPMnr+5/ofC1yKbuFMQSJT5vYMj2RyJaIsGaPfhGzBAhKQB3SgCjSBLjACLGANHIAzcAPeIACEgEgQA5YDLkgCaUAEskE+2AAKQTHYAXaDanAA1IF60AROgjZwBlwEV8ANcAsMgEdACobBSzAB3oFpCILwEBWiQaqQFqQPmULWEBtaCHlDQVA4FAPFQ4mQEJJA+dAmqBgqg6qhQ1A99CN0GroIXYP6oAfQIDQG/QF9hBGYAtNhDdgAtoDZsDscCEfCy+BEeBWcBxfA2+FKuBY+DrfCF+Eb8AAshV/CkwhAyAgD0UZYCBvxREKQWCQBESFrkSKkAqlFmpAOpBu5jUiRceQDBoehYZgYFsYZ44dZjOFiVmHWYkow1ZhjmFZMF+Y2ZhAzgfmCpWLVsaZYJ6w/dgk2EZuNLcRWYI9gW7CXsQPYYew7HA7HwBniHHB+uBhcMm41rgS3D9eMu4Drww3hJvF4vCreFO+CD8Fz8GJ8Ib4Kfxx/Ht+PH8a/J5AJWgRrgg8hliAkbCRUEBoI5wj9hBHCNFGBqE90IoYQecRcYimxjthBvEkcJk6TFEmGJBdSJCmZtIFUSWoiXSY9Jr0hk8k6ZEdyGFlAXk+uJJ8gXyUPkj9QlCgmFE9KHEVC2U45SrlAeUB5Q6VSDahu1FiqmLqdWk+9RH1KfS9HkzOX85fjya2Tq5FrleuXeyVPlNeXd5dfLp8nXyF/Sv6m/LgCUcFAwVOBo7BWoUbhtMI9hUlFmqKVYohimmKJYoPiNcVRJbySgZK3Ek+pQOmw0iWlIRpC06V50ri0TbQ62mXaMB1HN6T705PpxfQf6L30CWUlZVvlKOUc5Rrls8pSBsIwYPgzUhmljJOMu4yP8zTmuc/jz9s2r2le/7wplfkqbip8lSKVZpUBlY+qTFVv1RTVnaptqk/UMGomamFq2Wr71S6rjc+nz3eez51fNP/k/IfqsLqJerj6avXD6j3qkxqaGr4aGRpVGpc0xjUZmm6ayZrlmuc0x7RoWgu1BFrlWue1XjCVme7MVGYls4s5oa2u7act0T6k3as9rWOos1hno06zzhNdki5bN0G3XLdTd0JPSy9YL1+vUe+hPlGfrZ+kv0e/W3/KwNAg2mCLQZvBqKGKob9hnmGj4WMjqpGr0SqjWqM7xjhjtnGK8T7jWyawiZ1JkkmNyU1T2NTeVGC6z7TPDGvmaCY0qzW7x6Kw3FlZrEbWoDnDPMh8o3mb+SsLPYtYi50W3RZfLO0sUy3rLB9ZKVkFWG206rD6w9rEmmtdY33HhmrjY7POpt3mta2pLd92v+19O5pdsN0Wu067z/YO9iL7JvsxBz2HeIe9DvfYdHYou4R91RHr6OG4zvGM4wcneyex00mn351ZzinODc6jCwwX8BfULRhy0XHhuBxykS5kLoxfeHCh1FXbleNa6/rMTdeN53bEbcTd2D3Z/bj7Kw9LD5FHi8eUp5PnGs8LXoiXr1eRV6+3kvdi72rvpz46Pok+jT4Tvna+q30v+GH9Av12+t3z1/Dn+tf7TwQ4BKwJ6AqkBEYEVgc+CzIJEgV1BMPBAcG7gh8v0l8kXNQWAkL8Q3aFPAk1DF0V+nMYLiw0rCbsebhVeH54dwQtYkVEQ8S7SI/I0shHi40WSxZ3RslHxUXVR01Fe0WXRUuXWCxZs+RGjFqMIKY9Fh8bFXskdnKp99LdS4fj7OIK4+4uM1yWs+zacrXlqcvPrpBfwVlxKh4bHx3fEP+JE8Kp5Uyu9F+5d+UE15O7h/uS58Yr543xXfhl/JEEl4SyhNFEl8RdiWNJrkkVSeMCT0G14HWyX/KB5KmUkJSjKTOp0anNaYS0+LTTQiVhirArXTM9J70vwzSjMEO6ymnV7lUTokDRkUwoc1lmu5iO/kz1SIwkmyWDWQuzarLeZ0dln8pRzBHm9OSa5G7LHcnzyft+NWY1d3Vnvnb+hvzBNe5rDq2F1q5c27lOd13BuuH1vuuPbSBtSNnwy0bLjWUb326K3tRRoFGwvmBos+/mxkK5QlHhvS3OWw5sxWwVbO3dZrOtatuXIl7R9WLL4oriTyXckuvfWX1X+d3M9oTtvaX2pft34HYId9zd6brzWJliWV7Z0K7gXa3lzPKi8re7V+y+VmFbcWAPaY9kj7QyqLK9Sq9qR9Wn6qTqgRqPmua96nu37Z3ax9vXv99tf9MBjQPFBz4eFBy8f8j3UGutQW3FYdzhrMPP66Lqur9nf19/RO1I8ZHPR4VHpcfCj3XVO9TXN6g3lDbCjZLGseNxx2/94PVDexOr6VAzo7n4BDghOfHix/gf754MPNl5in2q6Sf9n/a20FqKWqHW3NaJtqQ2aXtMe9/pgNOdHc4dLT+b/3z0jPaZmrPKZ0vPkc4VnJs5n3d+8kLGhfGLiReHOld0Prq05NKdrrCu3suBl69e8blyqdu9+/xVl6tnrjldO32dfb3thv2N1h67npZf7H5p6bXvbb3pcLP9luOtjr4Ffef6Xfsv3va6feWO/50bA4sG+u4uvnv/Xtw96X3e/dEHqQ9eP8x6OP1o/WPs46InCk8qnqo/rf3V+Ndmqb307KDXYM+ziGePhrhDL/+V+a9PwwXPqc8rRrRG6ketR8+M+YzderH0xfDLjJfT44W/Kf6295XRq59+d/u9Z2LJxPBr0euZP0reqL45+tb2bedk6OTTd2nvpqeK3qu+P/aB/aH7Y/THkensT/hPlZ+NP3d8CfzyeCZtZubf94Tz+wplbmRzdHJlYW0KZW5kb2JqCjE2IDAgb2JqCjI2MTIKZW5kb2JqCjEwIDAgb2JqClsgL0lDQ0Jhc2VkIDE1IDAgUiBdCmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAvTWVkaWFCb3ggWzAgMCAxNiAxNl0gL0NvdW50IDEgL0tpZHMgWyAyIDAgUiBdID4+CmVuZG9iagoxNyAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMyAwIFIgL1ZlcnNpb24gLzEuNCA+PgplbmRvYmoKMTggMCBvYmoKKE1hYyBPUyBYIDEwLjkuNSBRdWFydHogUERGQ29udGV4dCkKZW5kb2JqCjE5IDAgb2JqCihEOjIwMTYwMzAzMTkwNDI3WjAwJzAwJykKZW5kb2JqCjEgMCBvYmoKPDwgL1Byb2R1Y2VyIDE4IDAgUiAvQ3JlYXRpb25EYXRlIDE5IDAgUiAvTW9kRGF0ZSAxOSAwIFIgPj4KZW5kb2JqCnhyZWYKMCAyMAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDU2NTkgMDAwMDAgbiAKMDAwMDAwMDUwNSAwMDAwMCBuIAowMDAwMDA1NDIwIDAwMDAwIG4gCjAwMDAwMDAwMjIgMDAwMDAgbiAKMDAwMDAwMDQ4NiAwMDAwMCBuIAowMDAwMDAwNjA3IDAwMDAwIG4gCjAwMDAwMDA3MzEgMDAwMDAgbiAKMDAwMDAwMTMwMyAwMDAwMCBuIAowMDAwMDAxMzIyIDAwMDAwIG4gCjAwMDAwMDUzODMgMDAwMDAgbiAKMDAwMDAwMTM5MSAwMDAwMCBuIAowMDAwMDAyNjEwIDAwMDAwIG4gCjAwMDAwMDE0MzkgMDAwMDAgbiAKMDAwMDAwMjU4OSAwMDAwMCBuIAowMDAwMDAyNjQ3IDAwMDAwIG4gCjAwMDAwMDUzNjIgMDAwMDAgbiAKMDAwMDAwNTUwMSAwMDAwMCBuIAowMDAwMDA1NTY1IDAwMDAwIG4gCjAwMDAwMDU2MTcgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAyMCAvUm9vdCAxNyAwIFIgL0luZm8gMSAwIFIgL0lEIFsgPDY3NGRkZmQ4MGY5ZTc3Yzg4ZDhjNjZhMTJhYTk4NTk0Pgo8Njc0ZGRmZDgwZjllNzdjODhkOGM2NmExMmFhOTg1OTQ+IF0gPj4Kc3RhcnR4cmVmCjU3MzQKJSVFT0YK"
35 | elif [[ $theme == "emoji" ]] ; then
36 | ERROR_ICON="✖"︎
37 | fi
38 |
39 | cfgdir="$HOME/.config/dnscrypt"
40 | if ! [[ -d "$cfgdir" ]] ; then
41 | mkdir -p "$cfgdir"
42 | touch "$cfgdir/run"
43 | fi
44 |
45 | if [[ $1 == "toggle" ]] ; then
46 | if [[ $2 == "stop" ]] ; then
47 | mv "$cfgdir/run" "$cfgdir/stop"
48 | elif [[ $2 == "start" ]] ; then
49 | mv "$cfgdir/stop" "$cfgdir/run"
50 | fi
51 | exit 0
52 | fi
53 |
54 | if [[ -e "$cfgdir/stop" ]] ; then
55 | echo "$ERROR_ICON"
56 | echo "---"
57 | echo "Plugin Stopped"
58 | echo "---"
59 | echo "Restart… | refresh=true terminal=false bash=$0 param1=toggle param2=start"
60 | exit 0
61 | else
62 | stopped=false
63 | fi
64 |
65 | interface=$(route get 0.0.0.0 2>/dev/null | awk '/interface: / {print $2}')
66 | if ! [[ $interface ]] ; then
67 | echo "$ERROR_ICON"
68 | echo "---"
69 | echo "No Connection Available | color=red"
70 | echo "---"
71 | echo "Refresh… | refresh=true"
72 | exit 0
73 | fi
74 |
75 | dcpver=$(dnscrypt-proxy --version 2>/dev/null)
76 | if ! [[ $dcpver ]] ; then
77 | echo "$ERROR_ICON"
78 | echo "---"
79 | echo "dnscrypt-proxy is not in your \$PATH | color=red"
80 | echo "Please make sure to install DNSCrypt correctly"
81 | echo "---"
82 | echo "Refresh… | refresh=true"
83 | exit 0
84 | fi
85 | dcploc=$(which dnscrypt-proxy 2>/dev/null)
86 |
87 | read -d '' ltoml <<"EOF"
88 | /usr/local/etc/dnscrypt-proxy.toml
89 | /opt/local/etc/dnscrypt-proxy.toml
90 | /sw/etc/dnscrypt-proxy.toml
91 | $HOME/etc/dnscrypt-proxy.toml
92 | /private/etc/dnscrypt-proxy.toml
93 | EOF
94 |
95 | while read -r TOML
96 | do
97 | [[ -f $TOML ]] && break
98 | done < <(echo "$ltoml")
99 | if ! [[ $TOML ]] ; then
100 | echo "$ERROR_ICON"
101 | echo "---"
102 | echo "dnscrypt-proxy.toml not available | color=red"
103 | echo "Please make sure to install DNSCrypt correctly"
104 | echo "---"
105 | echo "Refresh… | refresh=true"
106 | exit 0
107 | fi
108 | etcdir=$(dirname "$TOML")
109 |
110 | process="DNSCrypt Menu"
111 | account=$(id -un)
112 |
113 | _beep () {
114 | osascript -e "beep"
115 | }
116 |
117 | _notify () {
118 | if [[ $tn_status == "osa" ]] ; then
119 | osascript &>/dev/null << EOT
120 | tell application "System Events"
121 | display notification "$2" with title "$process [" & "$account" & "]" subtitle "$1"
122 | end tell
123 | EOT
124 | elif [[ $tn_status == "tn-app-new" ]] || [[ $tn_status == "tn-app-old" ]] ; then
125 | "$tn_loc/Contents/MacOS/terminal-notifier" \
126 | -title "$process [$account]" \
127 | -subtitle "$1" \
128 | -message "$2" \
129 | -appIcon "$icon_loc" \
130 | >/dev/null
131 | elif [[ $tn_status == "tn-cli" ]] ; then
132 | "$tn" \
133 | -title "$process [$account]" \
134 | -subtitle "$1" \
135 | -message "$2" \
136 | -appIcon "$icon_loc" \
137 | >/dev/null
138 | fi
139 | }
140 |
141 | tn=$(which terminal-notifier 2>/dev/null)
142 | if [[ $tn == "" ]] || [[ $tn == *"not found" ]] ; then
143 | tn_loc=$(mdfind "kMDItemCFBundleIdentifier == 'fr.julienxx.oss.terminal-notifier'" 2>/dev/null | awk 'NR==1')
144 | if [[ $tn_loc == "" ]] ; then
145 | tn_loc=$(mdfind "kMDItemCFBundleIdentifier == 'nl.superalloy.oss.terminal-notifier'" 2>/dev/null | awk 'NR==1')
146 | if ! [[ $tn_loc ]] ; then
147 | tn_status="osa"
148 | else
149 | tn_status="tn-app-old"
150 | fi
151 | else
152 | tn_status="tn-app-new"
153 | fi
154 | else
155 | tn_vers=$("$tn" -help | head -1 | awk -F'[()]' '{print $2}' | awk -F. '{print $1"."$2}')
156 | if (( $(echo "$tn_vers >= 1.8" | bc -l) )) && (( $(echo "$tn_vers < 2.0" | bc -l) )) ; then
157 | tn_status="tn-cli"
158 | else
159 | tn_loc=$(mdfind "kMDItemCFBundleIdentifier == 'fr.julienxx.oss.terminal-notifier'" 2>/dev/null | awk 'NR==1')
160 | if ! [[ $tn_loc ]] ; then
161 | tn_loc=$(mdfind "kMDItemCFBundleIdentifier == 'nl.superalloy.oss.terminal-notifier'" 2>/dev/null | awk 'NR==1')
162 | if ! [[ $tn_loc ]] ; then
163 | tn_status="osa"
164 | else
165 | tn_status="tn-app-old"
166 | fi
167 | else
168 | tn_status="tn-app-new"
169 | fi
170 | fi
171 | fi
172 |
173 | service=$(networksetup -listnetworkserviceorder | grep -B1 "Device: $interface)$" | head -1 | awk -F")" '{print substr($0, index($0,$2))}' | xargs)
174 |
175 | _flush () {
176 | if [[ $osmajor -le 8 ]] ; then
177 | killall -HUP mDNSResponder 2>/dev/null
178 | elif [[ $osmajor == 9 ]] ; then
179 | dscacheutil -flushcache 2>/dev/null
180 | killall -HUP mDNSResponder 2>/dev/null
181 | elif [[ $osmajor == 10 ]] ; then
182 | osminor=$(echo "$osversion" | awk -F. '{print $3}')
183 | if [[ $osminor -le 3 ]] ; then
184 | discoveryutil mdnsflushcache 2>/dev/null
185 | discoveryutil udnsflushcaches 2>/dev/null
186 | else
187 | dscacheutil -flushcache 2>/dev/null
188 | killall -HUP mDNSResponder 2>/dev/null
189 | fi
190 | elif [[ $osmajor == 11 ]] ; then
191 | dscacheutil -flushcache 2>/dev/null
192 | killall -HUP mDNSResponder 2>/dev/null
193 | elif [[ $osmajor == 12 ]] ; then
194 | osminor=$(echo "$osversion" | awk -F. '{print $3}')
195 | if [[ $osminor -le 2 ]] ; then
196 | killall -HUP mDNSResponder 2>/dev/null
197 | else
198 | killall -HUP mDNSResponder 2>/dev/null
199 | killall mDNSResponderHelper 2>/dev/null
200 | dscacheutil -flushcache 2>/dev/null
201 | fi
202 | else
203 | killall -HUP mDNSResponder 2>/dev/null
204 | fi
205 | }
206 |
207 | _rootpw () {
208 | if [[ $1 == "dhcp" ]] ; then
209 | osascript 2>/dev/null << EOT
210 | tell application "System Events"
211 | activate
212 | set theLogoPath to ((path to home folder from user domain) as text) & ".cache:dnscrypt:icon.png"
213 | set thePW to text returned of (display dialog "Please enter your administrator password to renew the DHCP lease for the $service service on interface $interface." & ¬
214 | return & return & ¬
215 | "Please note that this operation can reset your system's resolvers configuration file, and you might need to reboot your Mac to restore your network settings to the desired state." ¬
216 | default answer "" ¬
217 | with hidden answer ¬
218 | buttons {"Cancel", "Renew"} ¬
219 | default button 2 ¬
220 | with title "DNSCrypt: DHCP Lease" ¬
221 | with icon file theLogoPath ¬
222 | giving up after 180)
223 | end tell
224 | thePW
225 | EOT
226 | elif [[ $1 == "service" ]] ; then
227 | osascript 2>/dev/null << EOT
228 | tell application "System Events"
229 | activate
230 | set theLogoPath to ((path to home folder from user domain) as text) & ".cache:dnscrypt:icon.png"
231 | set thePW to text returned of (display dialog "Please enter your administrator password to $2 the DNSCrypt Service." & ¬
232 | return & return & ¬
233 | "Please wait for the process to finish. You will need to enter your password again to change the macOS Network configuration." ¬
234 | default answer "" ¬
235 | with hidden answer ¬
236 | buttons {"Cancel", "$3"} ¬
237 | default button 2 ¬
238 | with title "DNSCrypt: Service" ¬
239 | with icon file theLogoPath ¬
240 | giving up after 180)
241 | end tell
242 | thePW
243 | EOT
244 | fi
245 | }
246 |
247 | CONFIG=$(cat "$TOML" | sed -e 's/^[ \t]*//' | grep -v -e "^$" -e "##" -e "^# *#$")
248 |
249 | DNSCRYPT_PROXY_ALL=$(echo "$CONFIG" | awk -F"'" '/^listen_addresses =/{print $2}')
250 | DNSCRYPT_PROXY_IPS=$(echo "$DNSCRYPT_PROXY_ALL" | awk -F: '{print $1}')
251 | ! [[ $DNSCRYPT_PROXY_IPS ]] && DNSCRYPT_PROXY_IPS="127.0.0.1"
252 | dnsport=$(echo "$DNSCRYPT_PROXY_ALL" | awk -F: '{print $2}')
253 | ! [[ $dnsport ]] && dnsport="53"
254 |
255 | nstat_all=$(netstat -nr 2>/dev/null)
256 |
257 | if [[ $DNSCRYPT_PROXY_IPS != "127.0.0.1" ]] ; then
258 | int1=$(echo "$DNSCRYPT_PROXY_IPS" | awk -F. '{print $1}')
259 | int2=$(echo "$DNSCRYPT_PROXY_IPS" | awk -F. '{print $2}')
260 | int3=$(echo "$DNSCRYPT_PROXY_IPS" | awk -F. '{print $3}')
261 | int4=$(echo "$DNSCRYPT_PROXY_IPS" | awk -F. '{print $4}')
262 | chnstat=$(echo "$nstat_all" | grep "^$int1\.$int2\.$int3\.$int4.*lo0")
263 | if ! [[ $chnstat ]] ; then
264 | echo "$ERROR_ICON"
265 | echo "---"
266 | echo "$DNSCRYPT_PROXY_IPS is not in your routing table | color=red"
267 | echo "Please make sure to install DNSCrypt correctly"
268 | echo "---"
269 | echo "You should either"
270 | echo "● edit and load the provided LaunchDaemon, or"
271 | echo "● manually run the following command:"
272 | echo "sudo ifconfig lo0 alias $DNSCRYPT_PROXY_IPS | font=Menlo size=12"
273 | echo "---"
274 | echo "Refresh… | refresh=true"
275 | exit 0
276 | fi
277 | nstat_listen=$(netstat -an 2>/dev/null | grep "$int1\.$int2\.$int3\.$int4\.$dnsport")
278 | else
279 | chnstat=$(echo "$nstat_all" | grep "^127\.0\.0\.1.*lo0")
280 | nstat_listen=$(netstat -an 2>/dev/null | grep "127\.0\.0\.1\.$dnsport")
281 | fi
282 |
283 | localdns=$(ipconfig getoption $interface domain_name_server 2>/dev/null)
284 |
285 | fbloc="$cfgdir/cdefault"
286 | dfloc="$cfgdir/pdefault"
287 | udfloc="$cfgdir/udefault"
288 | dfb="# FALLBACK SERVER LIST FOR DNSCRYPT\n# Please enter the DNS IP address in column 1.\n# You may add a description in column 2.\n# Columns must be separated by a whitespace character.\n\n1.1.1.1 Cloudflare\n1.0.0.1 Cloudflare"
289 | udf="# DNS LIST FOR DEFAULT DNS WITHOUT DNSCRYPT\n# Please enter the DNS IP address in column 1.\n# You may add a description in column 2.\n# Columns must be separated by a whitespace character.\n\nempty empty"
290 |
291 | ! [[ -f "$fbloc" ]] && echo -e "$dfb" > "$fbloc"
292 | ! [[ -f "$udfloc" ]] && echo -e "$udf" > "$udfloc"
293 | ! [[ -f "$dfloc" ]] && echo "${DNSCRYPT_PROXY_IPS}" > "$dfloc"
294 |
295 | cachedir="$HOME/.cache/dnscrypt"
296 | currloc="$cachedir/current"
297 | if ! [[ -d "$cachedir" ]] ; then
298 | mkdir -p "$cachedir"
299 | echo "0.0.0.0 placeholder" > "$currloc"
300 | else
301 | ! [[ -f "$currloc" ]] && echo "0.0.0.0 placeholder" > "$currloc"
302 | fi
303 |
304 | dcpicon="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
916 | qbJmapq8h96eliZvotvPHyynXjVIlmGL+aeNkFmL0mXCtCypqgpIGfYrYfIoYuLI
917 | Z8wtDUm4NCjBEuDA3jnA4kPZhYBREJbM/LCk45v0SEQywhFJ16AwKlBy8iwoavLL
918 | lzRK5nQmwzQPKGnRHqXQTKLRbGIXcrqbikRXJi4kHW0MEovtu3R7kKxxEfniJGeQ
919 | M97JdAJOudOfXNLJuZ8+WlVDscm/fkiOUVrF4BC6fgEQtS7wOyq7S50ezixn2MC+
920 | GRdGd8A7mY0fvQHUza5zqzXvXqac0lmjn/3gA71Zw4KRqsCwM0yWMWRajjUuRk5n
921 | VspQRsf4mWq2whk5hcpBpHqcFcFpRRNzZNTiDJlydqrMw+HLb+8nZz3aWy7+c3e5
922 | 5p+d5NaP28v929vI47vayjO72shLu9vKP/e0kbf2tpV397aTDz5rKx/ubydrD7SV
923 | dV+0lc/vD8mhsyZZAclZUwDGSsFyhoFFZRmt06bId0sq5L8E11dTlQBjCmBMJWNM
924 | NjqA9msBB9pHAO9l3MOotJtA3k1g7+LxLh7v5PEOHu+IjoDBYy2+v43gN0rT2goA
925 | m9FGYFgPBOumpspaIPgIfTA9Vd6bkSrvzEiTt9Dr6N8z0+TeZ7rJ1Tvayk/RFTva
926 | yaXb28ol6KJtbeTcT1Pk1Lc7yUl/7SYL/tBLZv+6r0z6+WAZddFwKV2ZLrkzfJJT
927 | EZRsYMnCF5kWlAwNSkT7LC2M/8j66fgyzWaUtGx8zSSYpiZDNSmqGBjuzSYFNpt4
928 | IOltIelhIMm2kKjY8wHJ8E6BjU5v50qnr3MWcMylLS8jf6Q51SBzNeWVahM26lhu
929 | Xgcg8ZDU23ckwqG0CwL/RR9yD0nsDGcAaSsno3PBmmi/0aU41m944MhUH9CWVBne
930 | kspmDdXIpdN8p2VaOJQBMaQ2KGCkq5lIpW9msMjcbCkFgDHXDpap9/WTuX/sIUv+
931 | 1UVOWZcip29pJ2duaSvnbG0rF2xrJxdvb4fD28o1O1Lkhp3t5BbAuGt3O7kfMB5D
932 | z+xpJ3/Z01b+ARxv7msr73zWTt4HkA8/T5GPD7STXS+MkK9uKZavbyyT7386QQ7+
933 | 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
1154 | mOhLeGda6bTnJlw3gdx0L7gLbNOSYRVoBQG5ZKqRM8QiLSEK5SyRLv+CO4bfK2im
1155 | 0JPC4CWUPlv8nyTG50sWWoZRJamyVGlKGPq3LSJhMuUMU8zvL9RgmhrpEwaRNC55
1156 | xwbZSavwlLWUOBEzIu6aPm/6UwmehB+mrkk/lH1Pzpn8Rws/KXp21r+UvFz66ewf
1157 | zDFDeEVTLpdZyszRFIGUZdJSea7SsOjPCIv+jLLQOoS9/srn63XS6zrq8///2v/Z
1158 | rOdKfl3wROHf5dyX+2H6pozBxPqkvTNui/o+ZoQnELudcka4U0uE9XKZ1C4HSBoo
1159 | PVoyLOHl+kRjLg+uNMjSuwT9ZZ5IiFieJWhApiW/Wj59yUkx2p+vBFHLMPXOYk8Y
1160 | Wo7Riz5Ng7QkowaLWSaPP36byFfOxx0Wyk5aiTtWaYkTkFNtO3ewTB6weVLCpPum
1161 | zp3+dGx1/CtJranvpm/KPJ69M/f8zEcK/zz/6Vn/WPhc6a9LXi7771nfLzO/CEpe
1162 | mRtUvTzm678/N6h6+cuqTziKXpjz24Jvlvxb7mNFf5N9X95HGVuzTyd3pHXHuhPe
1163 | jlwY9dKUrOufHDdp3P3o/3vkTLAd0HvCJpkEXXJ51CpfomuDiSCWScvkALmAP2mi
1164 | pblYLuXwcp1ermk1omYIWjaphLBmCVo6jTf+wJJitD9f0RgnoYpTVk/khKGGqSUZ
1165 | NVjNMiJpEvnlijqHOkksz4q1xLlFTrXL+C986MMAkTw+OQo1ype3djn7rOFAiYBt
1166 | Hjdh3LZJsZPuv7542uMzFkc/H+NIeD2hMeWd5NUZR9O35Axm3J17PvuBgp/mfr3o
1167 | L2c+MevvC745+1/zv13668IXyn5b9PLc/wFmkJc0fcm2DxS/PC+oXH5pblDHdL62
1168 | LxzFmhbLexVr9Qk+88V5/1X4nbLf5D9T+qu8J0v+aeajxb/Ifqjwk6x7899P2zpz
1169 | JGVtZl9iS+qhOE/iT6KWx746dc6M71ybOuWxcZMn3CeNv0OO/vROsEXOABt4cBKz
1170 | QIdMgCY5gPnl8rlGfqK0XL4vLOS/hxCJUMLLJFpNiHeHNFsyiNnBgEcM+ndROGpw
1171 | MkQYIiHCzRJ/sElxpT9XThjRYGo4dcBkcJ0hOmUqmAGiQCxIAMkgDWSCmQb9RItB
1172 | P/llzAZlBv2MpIEEon/IbxhLwQqDfjWFgSQyDCfwGPRvmA2jHjSCZtAKOsAqg37P
1173 | i4E1sIHgG5iVDBjBgCEMjIiGcce4ceO2R0yL2Dk55bqvXV8w7cmpZTO+Ne2W6Ocj
1174 | l8S9FFWe8Gp0deIbsd7kt+LqUt5JaErbn9iWcSRpVeax5K6s3uQ12SdS1mb1pazP
1175 | 6U9dnz2YsjFnKGVTznDq5pmn0rbkjqRtzR1B+TRtY/9Qyoack8nrswdS1uX0J63J
1176 | 6ktenXmc7pPUkdmd2JJ+KD6Qug/P2h3jTPpxdHnC6zOWxb4yfWH0izfOi3ruhqLp
1177 | 35qScf0TEdGTHhoXMe5e1H0HuAvcCbaDbbJNm2Ubqa3rZdvXgNWyT9pAC2gCAVAL
1178 | fMANHKAKrATLwGJwK1gA5oE5YBYoBLkgG6SDFJAI4kAMiASUCDeC6w0rGSYZ4ZPh
1179 | jz4hrvbnK8aVk0ZPHOok6izqND1xphuiY6MNK3mSQKohgpBliATKM0SAKFClhkii
1180 | +YYI4kJwG1hiiABToCmZKOg1hkgoMoLXEElVZ4jEajCs5CLzUIK1gXZDmKrTEMlG
1181 | JuuSkOnWStZprB8j+jXqPmskXfJZqySdsh7tsl6tsq5Nsu4B2RZqE5mdBg2XIQxP
1182 | A0klKAfLDTHILDKE8W82xAA01xDmLwFFoMCwEiDDEAMYDWR6EkTJmFHs9ESYLGMc
1183 | bmb4k0mIsfy5UtKESxzqUHvyUKdT59sTiAJEgVJJRCMYBZGCSYmUY4gA02xEyUQz
1184 | EgWfEoqMQIagEZHMQYlFM5RKrkWGSDAyEiUZmYpmLUo2MhklXKWEEq9aUmPDcQX0
1185 | 89T1VZJK+Yxy+cwVsg7LZJ2obotlXW+VdVdGny/bVibbSm2mgUSZngYXGmTI+DRj
1186 | 08CTaljmjzfE4BQt+5pmezUT3CBjopLAvjwaSyL8ySbD5/kzWuJcKXnsCUQB0pOI
1187 | gqcnEgXWnkwUfEooMoJKqlRDJBYZhZKLTEMJRgaiJCMzUaKRsSjZyGSUcEWSYsks
1188 | jRIbsyX2/SW269S9iuQzCuQz8+Xzc2V9cmT9smSd02UbUmWbkmX7lOGp7cr0UbJf
1189 | qI+mGdbof4MROgOo5dA1xtiSIFwi/EEmw/8CAAD//wMAaoKUNkxPr+QAAAAASUVO
1190 | RK5CYII="
1191 | if ! [[ -f "$cachedir/icon.png" ]] ; then
1192 | echo "$dcpicon" > "$cachedir/icon.base64"
1193 | base64 -D -i "$cachedir/icon.base64" -o "$cachedir/icon.png" && rm -f "$cachedir/icon.base64" 2>/dev/null
1194 | fi
1195 | [[ -f "$cachedir/icon.base64" ]] && rm -f "$cachedir/icon.base64" 2>/dev/null
1196 | icon_loc="$cachedir/icon.png"
1197 |
1198 | if [[ $1 == "dnscopy" ]] ; then
1199 | if [[ $2 == "ip" ]] ; then
1200 | copynote="IP address"
1201 | elif [[ $2 == "hostname" ]] ; then
1202 | copynote="hostname"
1203 | fi
1204 | echo -n "$3" | pbcopy
1205 | _notify "Copied DNS $copynote to clipboard" "$3"
1206 | exit 0
1207 | fi
1208 |
1209 | if [[ $1 == "network" ]] ; then
1210 | if [[ $2 == "flush" ]] ; then
1211 | _flush
1212 | elif [[ $2 == "dhcp" ]] ; then
1213 | rootpw=$(_rootpw dhcp)
1214 | if [[ $rootpw ]] ; then
1215 | echo "$rootpw" | sudo -S 2>/dev/null ipconfig set $interface DHCP || { _beep ; _notify "⚠️ Error!" "Renew DHCP Lease" ; }
1216 | sudo -k && rootpw="" && sleep 1
1217 | fi
1218 | fi
1219 | exit 0
1220 | fi
1221 |
1222 | if [[ $localdns ]] ; then
1223 | fallbacks=$(cat "$fbloc" | grep -v -e "^#" -e "^$" | awk '!seen[$0]++' | grep -v "$localdns")
1224 | else
1225 | fallbacks=$(cat "$fbloc" | grep -v -e "^#" -e "^$" | awk '!seen[$0]++')
1226 | fi
1227 | fbips=$(echo "$fallbacks" | awk '{print $1}')
1228 | fbipss=$(echo "$fbips" | sort)
1229 | ADDITIONAL_IP=$(echo "$fbips" | xargs)
1230 | ADDITIONAL_IPS=$(echo "$fbipss" | xargs)
1231 |
1232 | _service_resolvers () {
1233 | fservice="$1"
1234 | getdnsservers=$(networksetup -getdnsservers "$fservice" | awk '!seen[$0]++')
1235 | if [[ $(echo "$getdnsservers" | grep "^There") != "" ]] ; then
1236 | echo "None"
1237 | else
1238 | ips=""
1239 | while read -r ip
1240 | do
1241 | [[ $ips ]] && ips="$ips "
1242 | ips="$ips$ip"
1243 | done < <(echo "$getdnsservers")
1244 | echo "$ips" | sed 's/^ //'
1245 | fi
1246 | }
1247 |
1248 | baklocname=$(echo "backup-$service" | sed -e 's/:/-/g' -e 's,/,-,g' -e 's/ /_/g')
1249 | bakloc="$cfgdir/$baklocname"
1250 | ibakloc="$bakloc-initial"
1251 | if ! [[ -f "$ibakloc" ]] ; then
1252 | if [[ -f "$bakloc" ]] ; then
1253 | obak=$(cat "$bakloc" | grep -v "^#")
1254 | pdate=$(date +%s)
1255 | echo -e "# $pdate\n$obak" > "$ibakloc" && rm -f "$bakloc" 2>/dev/null
1256 | else
1257 | iresolvers=$(_service_resolvers "$service")
1258 | pdate=$(date +%s)
1259 | echo "# $pdate" > "$ibakloc"
1260 | if [[ $iresolvers != "None" ]] ; then
1261 | echo ${iresolvers} >> "$ibakloc" && _notify "✅ Initial backup successful!" "${iresolvers}"
1262 | fi
1263 | fi
1264 | fi
1265 |
1266 | if [[ $1 == "cbackup" ]] ; then
1267 | bresolvers=$(_service_resolvers "$service")
1268 | if [[ $bresolvers == "None" ]] ; then
1269 | _beep
1270 | _notify "⚠️ Backup error!" "No resolvers detected"
1271 | else
1272 | pdate=$(date +%s)
1273 | echo ${bresolvers} > "$bakloc-d$pdate" && _notify "✅ Backup successful!" "${bresolvers}"
1274 | fi
1275 | exit 0
1276 | fi
1277 |
1278 | if [[ $1 == "rload" ]] ; then
1279 | if [[ $2 == "initial" ]] ; then
1280 | lresolvers=$(cat "$ibakloc" | grep -v "^#")
1281 | else
1282 | lresolvers=$(cat "$bakloc-d$2")
1283 | fi
1284 | if [[ $lresolvers ]] ; then
1285 | networksetup -setdnsservers "$service" ${lresolvers} 2>/dev/null && _flush 2>/dev/null
1286 | else
1287 | _beep
1288 | _notify "⚠️ Error!" "No resolvers detected"
1289 | fi
1290 | exit 0
1291 | fi
1292 |
1293 | if [[ $localdns ]] ; then
1294 | defaultdns=$(cat "$udfloc" | grep -v -e "^#" -e "^$" -e "^empty empty$" | awk '!seen[$0]++' | grep -v "$localdns")
1295 | else
1296 | defaultdns=$(cat "$udfloc" | grep -v -e "^#" -e "^$" -e "^empty empty$" | awk '!seen[$0]++')
1297 | fi
1298 | nodefault=false
1299 | if ! [[ $defaultdns ]] ; then
1300 | if ! [[ $localdns ]] ; then
1301 | UDEFAULT="1.1.1.1 1.0.0.1"
1302 | UDEFAULTS="1.0.0.1 1.1.1.1"
1303 | nodefault=true
1304 | else
1305 | UDEFAULT="empty"
1306 | UDEFAULTS=""
1307 | fi
1308 | else
1309 | udfips=$(echo "$defaultdns" | awk '{print $1}')
1310 | udfipss=$(echo "$udfips" | sort)
1311 | UDEFAULT=$(echo "$udfips" | xargs)
1312 | UDEFAULTS=$(echo "$udfipss" | xargs)
1313 | [[ $localdns ]] && UDEFAULT="${UDEFAULT} $localdns"
1314 | fi
1315 |
1316 | proxystatus=$(pgrep -U 0 "dnscrypt-proxy")
1317 | ! [[ $proxystatus ]] && proxy=false || proxy=true
1318 |
1319 | service_resolvers=$(_service_resolvers "$service")
1320 |
1321 | SCRNAME=$(basename $0)
1322 |
1323 | _setdefault () {
1324 | networksetup -setdnsservers "$service" ${UDEFAULT} 2>/dev/null && _flush 2>/dev/null
1325 | }
1326 |
1327 | nstat=$(echo "$nstat_all" | awk '/^0\/1/ {print $6}')
1328 | if [[ $(echo "$nstat" | grep 'tun\|tap') == "" ]] ; then
1329 | vpn=false
1330 | else
1331 | vpn=true
1332 | fi
1333 |
1334 | if [[ $service_resolvers == "None" ]] && [[ $UDEFAULTS ]] && ! $vpn ; then
1335 | _beep
1336 | _notify "Detected Network DNS Reset!" "Resetting to Default DNS…"
1337 | _setdefault && /usr/bin/open "bitbar://refreshPlugin?name=$SCRNAME"
1338 | exit 0
1339 | fi
1340 |
1341 | dnsip=$(dig whoami.akamai.net +short 2>/dev/null)
1342 | if [[ $(echo "$dnsip" | wc -l | xargs) -gt 1 ]] ; then
1343 | echo "$ERROR_ICON"
1344 | echo "---"
1345 | echo "No Connection Available | color=red"
1346 | echo "---"
1347 | echo "Refresh… | refresh=true"
1348 | exit 0
1349 | fi
1350 |
1351 | if [[ $1 == "default" ]] ; then
1352 | if [[ $2 == "dcp" ]] ; then
1353 | echo "${DNSCRYPT_PROXY_IPS}" > "$dfloc"
1354 | elif [[ $2 == "dcpfb" ]] ; then
1355 | echo "${DNSCRYPT_PROXY_IPS} ${ADDITIONAL_IP}" > "$dfloc"
1356 | fi
1357 | exit 0
1358 | fi
1359 |
1360 | currentdns=$(cat "$currloc")
1361 | currentdnsip=$(echo "$currentdns" | awk '{print $1}')
1362 | currentdnsname=$(echo "$currentdns" | awk '{print substr($0, index($0,$2))}')
1363 |
1364 | DEFAULT=$(cat "$dfloc")
1365 |
1366 | _abspath () {
1367 | python - "$1" << 'EOF'
1368 | import os.path
1369 | import sys
1370 | for arg in sys.argv[1:]:
1371 | print os.path.realpath(os.path.abspath(arg))
1372 | EOF
1373 | }
1374 |
1375 | if [[ $1 == "proxyservice" ]] ; then
1376 | if [[ $2 == "start" ]] ; then
1377 | mprompt="Start"
1378 | servopt="start"
1379 | elif [[ $2 == "stop" ]] ; then
1380 | mprompt="Stop"
1381 | servopt="stop"
1382 | elif [[ $2 == "force-restart" ]] ; then
1383 | mprompt="Restart"
1384 | servopt="restart"
1385 | fi
1386 | rootpw=$(_rootpw service $2 $mprompt)
1387 | if [[ $rootpw != "" ]] ; then
1388 | dcptloc=$(_abspath "$dcploc")
1389 | brewed=false
1390 | [[ $(echo "$dcptloc" | grep "/Cellar/") != "" ]] && brewed=true
1391 | brewstatus=$(brew help 2>/dev/null)
1392 | if [[ $brewstatus ]] && $brewed ; then
1393 | echo "$rootpw" | sudo -S 2>/dev/null brew services $servopt dnscrypt-proxy > "$cachedir/service" 2>&1 \
1394 | && sleep 1
1395 | if [[ $2 == "stop" ]] ; then
1396 | sudo -k && rootpw=""
1397 | networksetup -setdnsservers "$service" ${UDEFAULT} 2>/dev/null \
1398 | && _flush 2>/dev/null \
1399 | && /usr/bin/open "bitbar://refreshPlugin?name=$SCRNAME"
1400 | else
1401 | proxystatus=$(pgrep -U 0 "dnscrypt-proxy")
1402 | if [[ $proxystatus ]] ; then
1403 | sudo -k && rootpw=""
1404 | networksetup -setdnsservers "$service" ${DEFAULT} 2>/dev/null \
1405 | && _flush 2>/dev/null \
1406 | && /usr/bin/open "bitbar://refreshPlugin?name=$SCRNAME"
1407 | else
1408 | if [[ $servopt == "start" ]] ; then
1409 | echo "$rootpw" | sudo -S 2>/dev/null brew services restart dnscrypt-proxy >> "$cachedir/service" 2>&1 \
1410 | && sudo -k && rootpw="" && sleep 1
1411 | proxystatus=$(pgrep -U 0 "dnscrypt-proxy")
1412 | if [[ $proxystatus ]] ; then
1413 | networksetup -setdnsservers "$service" ${DEFAULT} 2>/dev/null \
1414 | && _flush 2>/dev/null \
1415 | && /usr/bin/open "bitbar://refreshPlugin?name=$SCRNAME"
1416 | else
1417 | _beep
1418 | _notify "DNSCrypt Service Error!" "Resetting to Default DNS…"
1419 | _setdefault && /usr/bin/open "bitbar://refreshPlugin?name=$SCRNAME"
1420 | fi
1421 | else
1422 | _beep
1423 | _notify "DNSCrypt Service Error!" "Resetting to Default DNS…"
1424 | _setdefault && /usr/bin/open "bitbar://refreshPlugin?name=$SCRNAME"
1425 | fi
1426 | fi
1427 | fi
1428 | else
1429 | if [[ $dcpver ]] ; then
1430 | echo "$rootpw" | sudo -S 2>/dev/null dnscrypt-proxy -service stop > "$cachedir/service" 2>&1 \
1431 | && sleep 1
1432 | if [[ $2 == "stop" ]] ; then
1433 | sudo -k && rootpw=""
1434 | networksetup -setdnsservers "$service" ${UDEFAULT} 2>/dev/null \
1435 | && _flush 2>/dev/null \
1436 | && /usr/bin/open "bitbar://refreshPlugin?name=$SCRNAME"
1437 | else
1438 | proxystatus=$(pgrep -U 0 "dnscrypt-proxy")
1439 | if [[ $proxystatus ]] ; then
1440 | sudo -k && rootpw=""
1441 | networksetup -setdnsservers "$service" ${DEFAULT} 2>/dev/null \
1442 | && _flush 2>/dev/null \
1443 | && /usr/bin/open "bitbar://refreshPlugin?name=$SCRNAME"
1444 | else
1445 | if [[ $servopt == "start" ]] ; then
1446 | echo "$rootpw" | sudo -S 2>/dev/null dnscrypt-proxy -service restart >> "$cachedir/service" 2>&1 \
1447 | && sudo -k && rootpw="" && sleep 1
1448 | proxystatus=$(pgrep -U 0 "dnscrypt-proxy")
1449 | if [[ $proxystatus ]] ; then
1450 | networksetup -setdnsservers "$service" ${DEFAULT} 2>/dev/null \
1451 | && _flush 2>/dev/null \
1452 | && /usr/bin/open "bitbar://refreshPlugin?name=$SCRNAME"
1453 | else
1454 | _beep
1455 | _notify "DNSCrypt Service Error!" "Resetting to Default DNS…"
1456 | _setdefault && /usr/bin/open "bitbar://refreshPlugin?name=$SCRNAME"
1457 | fi
1458 | else
1459 | _beep
1460 | _notify "DNSCrypt Service Error!" "Resetting to Default DNS…"
1461 | _setdefault && /usr/bin/open "bitbar://refreshPlugin?name=$SCRNAME"
1462 | fi
1463 | fi
1464 | fi
1465 | fi
1466 | fi
1467 | fi
1468 | exit 0
1469 | fi
1470 |
1471 | if ! $proxy && [[ $(echo "$service_resolvers" | grep "$DNSCRYPT_PROXY_IPS") != "" ]] ; then
1472 | _beep
1473 | _notify "DNSCrypt Service Error!" "Resetting to Default DNS…"
1474 | _setdefault && /usr/bin/open "bitbar://refreshPlugin?name=$SCRNAME"
1475 | exit 0
1476 | fi
1477 |
1478 | tomldir=$(dirname "$TOML")
1479 |
1480 | if [[ $1 == "opensource" ]] ; then
1481 | shift
1482 | for resolversource in ${@}
1483 | do
1484 | resloc=$(basename "$resolversource")
1485 | open "$tomldir/$resloc"
1486 | done
1487 | exit 0
1488 | fi
1489 |
1490 | if [[ $# -gt 0 ]] ; then
1491 | resopt="$*"
1492 | # shellcheck disable=2086
1493 | networksetup -setdnsservers "$service" $resopt
1494 | _flush 2>/dev/null
1495 | exit 0
1496 | fi
1497 |
1498 | if [[ $theme == "classic" ]] ; then
1499 | CONNECTED_ICON="| dropdown=false templateImage=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agoyNjEyCmVuZG9iago3IDAgb2JqClsgL0lDQ0Jhc2VkIDggMCBSIF0KZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9NZWRpYUJveCBbMCAwIDE2IDE2XSAvQ291bnQgMSAvS2lkcyBbIDIgMCBSIF0gPj4KZW5kb2JqCjEwIDAgb2JqCjw8IC9UeXBlIC9DYXRhbG9nIC9QYWdlcyAzIDAgUiA+PgplbmRvYmoKMTEgMCBvYmoKKE1hYyBPUyBYIDEwLjkuNSBRdWFydHogUERGQ29udGV4dCkKZW5kb2JqCjEyIDAgb2JqCihEOjIwMTYwMzA0MjExMjA0WjAwJzAwJykKZW5kb2JqCjEgMCBvYmoKPDwgL1Byb2R1Y2VyIDExIDAgUiAvQ3JlYXRpb25EYXRlIDEyIDAgUiAvTW9kRGF0ZSAxMiAwIFIgPj4KZW5kb2JqCnhyZWYKMCAxMwowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDM4NzQgMDAwMDAgbiAKMDAwMDAwMDcxMSAwMDAwMCBuIAowMDAwMDAzNjQ5IDAwMDAwIG4gCjAwMDAwMDAwMjIgMDAwMDAgbiAKMDAwMDAwMDY5MiAwMDAwMCBuIAowMDAwMDAwODEzIDAwMDAwIG4gCjAwMDAwMDM2MTQgMDAwMDAgbiAKMDAwMDAwMDg4MSAwMDAwMCBuIAowMDAwMDAzNTk0IDAwMDAwIG4gCjAwMDAwMDM3MzAgMDAwMDAgbiAKMDAwMDAwMzc4MCAwMDAwMCBuIAowMDAwMDAzODMyIDAwMDAwIG4gCnRyYWlsZXIKPDwgL1NpemUgMTMgL1Jvb3QgMTAgMCBSIC9JbmZvIDEgMCBSIC9JRCBbIDw1NGY5OWIwZmViMWMxNzViOGE0NmQ3NTM2MTdlNmFhMD4KPDU0Zjk5YjBmZWIxYzE3NWI4YTQ2ZDc1MzYxN2U2YWEwPiBdID4+CnN0YXJ0eHJlZgozOTQ5CiUlRU9GCg=="
1500 | DISCONNECTED_ICON="| dropdown=false templateImage=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IC9QYWdlcyAvTWVkaWFCb3ggWzAgMCAxNiAxNl0gL0NvdW50IDEgL0tpZHMgWyAyIDAgUiBdID4+CmVuZG9iagoxNyAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMyAwIFIgL1ZlcnNpb24gLzEuNCA+PgplbmRvYmoKMTggMCBvYmoKKE1hYyBPUyBYIDEwLjkuNSBRdWFydHogUERGQ29udGV4dCkKZW5kb2JqCjE5IDAgb2JqCihEOjIwMTYwMzA0MjA1OTAzWjAwJzAwJykKZW5kb2JqCjEgMCBvYmoKPDwgL1Byb2R1Y2VyIDE4IDAgUiAvQ3JlYXRpb25EYXRlIDE5IDAgUiAvTW9kRGF0ZSAxOSAwIFIgPj4KZW5kb2JqCnhyZWYKMCAyMAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDU2MjMgMDAwMDAgbiAKMDAwMDAwMDU1MyAwMDAwMCBuIAowMDAwMDA1Mzg0IDAwMDAwIG4gCjAwMDAwMDAwMjIgMDAwMDAgbiAKMDAwMDAwMDUzNCAwMDAwMCBuIAowMDAwMDAwNjU1IDAwMDAwIG4gCjAwMDAwMDA3NzkgMDAwMDAgbiAKMDAwMDAwMTI2NyAwMDAwMCBuIAowMDAwMDAxMjg2IDAwMDAwIG4gCjAwMDAwMDUzNDcgMDAwMDAgbiAKMDAwMDAwMTM1NSAwMDAwMCBuIAowMDAwMDAyNTc0IDAwMDAwIG4gCjAwMDAwMDE0MDMgMDAwMDAgbiAKMDAwMDAwMjU1MyAwMDAwMCBuIAowMDAwMDAyNjExIDAwMDAwIG4gCjAwMDAwMDUzMjYgMDAwMDAgbiAKMDAwMDAwNTQ2NSAwMDAwMCBuIAowMDAwMDA1NTI5IDAwMDAwIG4gCjAwMDAwMDU1ODEgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAyMCAvUm9vdCAxNyAwIFIgL0luZm8gMSAwIFIgL0lEIFsgPDZlYTc3ZjkwNzY2OGY2YTkzY2UyNDliYWM1NzMyYWEwPgo8NmVhNzdmOTA3NjY4ZjZhOTNjZTI0OWJhYzU3MzJhYTA+IF0gPj4Kc3RhcnR4cmVmCjU2OTgKJSVFT0YK"
1501 | elif [[ $theme == "emoji" ]] ; then
1502 | CONNECTED_ICON='✔️'
1503 | DISCONNECTED_ICON='❕'
1504 | fi
1505 |
1506 | _current_resolvers () {
1507 | confrs=$(cat /etc/resolv.conf | awk '/^nameserver /{print $2}' | awk '!seen[$0]++' | sort)
1508 | [[ $confrs == "" ]] && exit 0
1509 | [[ $localdns ]] && confrs=$(echo "$confrs" | grep -v "$localdns")
1510 | ips=""
1511 | while read -r confr
1512 | do
1513 | [[ $ips ]] && ips="$ips "
1514 | ips="$ips$confr"
1515 | done < <(echo "$confrs")
1516 | echo "$ips"
1517 | }
1518 |
1519 | _displayname () {
1520 | resolvers="$1"
1521 | if [[ $resolvers == $DNSCRYPT_PROXY_IPS ]] ; then
1522 | echo "DNSCrypt"
1523 | elif [[ $resolvers == "$DNSCRYPT_PROXY_IPS $ADDITIONAL_IPS" ]] ; then
1524 | echo "DNSCrypt + Fallback"
1525 | elif [[ $resolvers == $UDEFAULTS ]] ; then
1526 | if [[ $UDEFAULTS == $DNSCRYPT_PROXY_IPS ]] ; then
1527 | echo "DNSCrypt"
1528 | elif [[ $UDEFAULTS == "$DNSCRYPT_PROXY_IPS $ADDITIONAL_IPS" ]] ; then
1529 | echo "DNSCrypt + Fallback"
1530 | else
1531 | echo "Default DNS"
1532 | fi
1533 | else
1534 | echo "Other DNS"
1535 | fi
1536 | }
1537 |
1538 | current_resolvers=$(_current_resolvers)
1539 | setting=$(_displayname "$current_resolvers")
1540 |
1541 | if $proxy ; then
1542 | if [[ $setting == "DNSCrypt" ]] ; then
1543 | echo "$CONNECTED_ICON"
1544 | dnsc=true
1545 | dnscf=false
1546 | dnsd=false
1547 | dnso=false
1548 | elif [[ $setting == "DNSCrypt + Fallback" ]] ; then
1549 | echo "$CONNECTED_ICON"
1550 | dnsc=false
1551 | dnscf=true
1552 | dnsd=false
1553 | dnso=false
1554 | elif [[ $setting == "Default DNS" ]] ; then
1555 | echo "$DISCONNECTED_ICON"
1556 | dnsc=false
1557 | dnscf=false
1558 | dnsd=true
1559 | dnso=false
1560 | elif [[ $setting == "Other DNS" ]] ; then
1561 | echo "$DISCONNECTED_ICON"
1562 | dnsc=false
1563 | dnscf=false
1564 | dnsd=false
1565 | dnso=true
1566 | fi
1567 | else
1568 | echo "$ERROR_ICON"
1569 | dnsc=false
1570 | dnscf=false
1571 | if [[ $setting == "Default DNS" ]] ; then
1572 | dnsd=true
1573 | dnso=false
1574 | else
1575 | dnsd=false
1576 | dnso=true
1577 | fi
1578 | fi
1579 |
1580 | echo "---"
1581 |
1582 | if ! [[ $localdns ]] ; then
1583 | localdns="None"
1584 | ldnsname=""
1585 | else
1586 | ldnsname=$(ipconfig getpacket $interface 2>/dev/null | awk -F": " '/^domain_name \(string\): /{print $2}')
1587 | [[ "$ldnsname" == "" ]] && ldnsname="Unknown Hostname"
1588 | fi
1589 |
1590 | oneshotline=$(echo "$CONFIG" | grep "^fallback_resolver = ")
1591 | if [[ $oneshotline ]] ; then
1592 | oneshotres=$(echo "$oneshotline" | awk -F\' '{print $2}')
1593 | fi
1594 |
1595 | _dnsinfo () {
1596 | echo "--Service | size=11 color=gray"
1597 | echo "--${service}"
1598 | echo "-----"
1599 | devifcfg=$(ifconfig $interface 2>/dev/null | sed 's/^'"$interface"': //')
1600 | if [[ $nstat ]] ; then
1601 | echo "--Devices | size=11 color=gray"
1602 | echo "--$interface (Default)"
1603 | while read -r devifcfgline
1604 | do
1605 | echo "----$devifcfgline | font=Menlo size=11"
1606 | done < <(echo "$devifcfg")
1607 | nstatifcfg=$(ifconfig $nstat 2>/dev/null | sed 's/^'"$nstat"': //')
1608 | if $vpn ; then
1609 | echo "--$nstat (TUN/TAP)"
1610 | else
1611 | echo "--$nstat (Other)"
1612 | fi
1613 | while read -r nstatifcfgline
1614 | do
1615 | echo "----$nstatifcfgline | font=Menlo size=11"
1616 | done < <(echo "$nstatifcfg")
1617 | else
1618 | echo "--Device | size=11 color=gray"
1619 | echo "--$interface"
1620 | while read -r devifcfgline
1621 | do
1622 | echo "----$devifcfgline | font=Menlo size=11"
1623 | done < <(echo "$devifcfg")
1624 | fi
1625 | echo "-----"
1626 | echo "--Current DNS Resolvers | size=11 color=gray"
1627 | if ! [[ ${current_resolvers} ]] ; then
1628 | echo "--None"
1629 | else
1630 | for cres in ${current_resolvers}
1631 | do
1632 | if $dnso ; then
1633 | echo "--$cres"
1634 | elif $dnsd ; then
1635 | cresname=$(echo "$defaultdns" | grep -F "$cres" | awk '{print substr($0, index($0,$2))}')
1636 | ! [[ $cresname ]] && cresname="n/a"
1637 | echo "--$cres ($cresname)"
1638 | else
1639 | if [[ $cres == $DNSCRYPT_PROXY_IPS ]] ; then
1640 | cresname="DNSCrypt"
1641 | else
1642 | if $dnscf ; then
1643 | cresname=$(echo "$fallbacks" | grep -F "$cres" | awk '{print substr($0, index($0,$2))}')
1644 | ! [[ $cresname ]] && cresname="n/a"
1645 | else
1646 | cresname="n/a"
1647 | fi
1648 | fi
1649 | echo "--$cres ($cresname)"
1650 | fi
1651 | done
1652 | fi
1653 | echo "-----"
1654 | if ! [[ $dnsip ]] ; then
1655 | echo "--Public DNS Information | size=11 color=gray"
1656 | echo "--Unknown IP"
1657 | echo "--Unknown Hostname"
1658 | echo "--No Ping Result"
1659 | else
1660 | if [[ $dnsip != $currentdnsip ]] ; then
1661 | whois $dnsip > "$cachedir/whois.log" 2>/dev/null
1662 | dnsname=""
1663 | method=""
1664 | dnsname=$(nslookup "$dnsip" 2>/dev/null | grep -v "canonical name = " | awk -F" = " '/name = /{print substr($0, index($0,$2))}' | sed 's/\.$//')
1665 | if ! [[ $dnsname ]] ; then
1666 | hostall=$(host "$dnsip" 2>/dev/null)
1667 | if [[ $hostall ]] && ! [[ $(echo "$hostall" | grep "not found") ]] && ! [[ $(echo "$hostall" | grep "timed out") ]] ; then
1668 | dnsname=$(echo "$hostall" | awk -F"domain name pointer " '{print substr($0, index($0,$2))}' | sed 's/\.$//')
1669 | fi
1670 | if ! [[ $dnsname ]] || ! [[ $hostall ]] || [[ $(echo "$hostall" | grep "not found") ]] || [[ $(echo "$hostall" | grep "timed out") ]] ; then
1671 | dnsname=$(dig +short -x "$dnsip" 2>/dev/null | sed 's/\.$//')
1672 | if ! [[ $dnsname ]] ; then
1673 | dnsname=$(curl -sL "https://ipinfo.io/$dnsip/hostname" 2>/dev/null | xargs)
1674 | if ! [[ $dnsname ]] || [[ $(echo "$dnsname" | grep "requests") ]] ; then
1675 | dnsname=$(curl -sL "https://www.robtex.com/ip/$dnsip.html" 2>/dev/null | grep -m1 "The PTR is" | awk -F"The PTR is " '{print $2}' | awk -F". " '{print $1}' | xargs)
1676 | [[ $dnsname ]] && method="robtex"
1677 | else
1678 | method="ipinfo"
1679 | fi
1680 | else
1681 | method="dig"
1682 | fi
1683 | else
1684 | method="host"
1685 | fi
1686 | else
1687 | method="nslookup"
1688 | fi
1689 | ! [[ $dnsname ]] && dnsname="Unknown Hostname"
1690 | echo "$dnsip $dnsname" > "$currloc"
1691 | else
1692 | dnsname="$currentdnsname"
1693 | ! [[ $dnsname ]] && dnsname="Unknown Hostname"
1694 | fi
1695 | ! [[ $method ]] && method="cache"
1696 | echo "--Public DNS Information ($method)| size=11 color=gray"
1697 | echo "--$dnsip | href=\"https://www.robtex.com/ip-lookup/$dnsip\""
1698 | echo "--Copy Address… | alternate=true terminal=false bash=$0 param1=dnscopy param2=ip param3=\"$dnsip\""
1699 | if [[ $dnsname != "Unknown Hostname" ]] ; then
1700 | echo "--$dnsname | href=\"https://www.robtex.com/dns-lookup/$dnsname\""
1701 | echo "--Copy Hostname… | alternate=true terminal=false bash=$0 param1=dnscopy param2=hostname param3=\"$dnsname\""
1702 | else
1703 | echo "--$dnsname"
1704 | fi
1705 | whoisout=$(cat "$cachedir/whois.log" 2>/dev/null)
1706 | if [[ $whoisout ]] ; then
1707 | echo "--Whois Information"
1708 | echo "----Open Current Whois Log File… | terminal=false bash=/usr/bin/open param1=\"$cachedir/whois.log\""
1709 | echo "-------"
1710 | while read -r line
1711 | do
1712 | ! [[ $line ]] && { echo "-------" ; continue ; }
1713 | ! [[ $(echo "$line" | grep ":") ]] && continue
1714 | echo -e "----$line | font=Menlo size=11"
1715 | done < <(echo "$whoisout" | grep -v -e "^#" -e "^%" -e "^remarks:" -e "^Comment:" -e ":$")
1716 | else
1717 | echo "--Whois"
1718 | fi
1719 | millisecs=$(ping -c 2 -n -q "$dnsip" 2>/dev/null | tail -n 1 | awk -F/ '{print $5}')
1720 | if [[ $millisecs ]] ; then
1721 | echo "--$millisecs ms"
1722 | else
1723 | echo "--No Ping Result"
1724 | fi
1725 | fi
1726 | if $dnsc || $dnscf ; then
1727 | if [[ $oneshotres ]] ; then
1728 | echo "-----"
1729 | echo "--Internal Fallback Resolver | size=11 color=gray"
1730 | echo "--$oneshotres"
1731 | fi
1732 | fi
1733 | if $dnsd ; then
1734 | echo "-----"
1735 | echo "--Local Area DNS | size=11 color=gray"
1736 | if [[ $ldnsname != "" ]] ; then
1737 | echo "--$localdns ($ldnsname)"
1738 | else
1739 | echo "--$localdns"
1740 | fi
1741 | fi
1742 | echo "-----"
1743 | echo "--Configured $service Resolvers | size=11 color=gray"
1744 | for sresolv in ${service_resolvers}
1745 | do
1746 | echo "--$sresolv"
1747 | done
1748 | if $dnso && ! $vpn ; then
1749 | echo "-----"
1750 | echo "--Backup Current $service Resolvers… | terminal=false refresh=true bash=$0 param1=cbackup"
1751 | echo "-----"
1752 | _omenu
1753 | fi
1754 | }
1755 |
1756 | _dnscmenu () {
1757 | echo "--Configured Resolver | size=11 color=gray"
1758 | for proxyip in ${DNSCRYPT_PROXY_IPS}
1759 | do
1760 | echo "--$proxyip"
1761 | done
1762 | if [[ $oneshotres ]] ; then
1763 | echo "-----"
1764 | echo "--Internal Fallback Resolver | size=11 color=gray"
1765 | echo "--$oneshotres"
1766 | fi
1767 | }
1768 |
1769 | _fbmenu () {
1770 | echo "--Configured DNSCrypt Resolver | size=11 color=gray"
1771 | for proxyip in ${DNSCRYPT_PROXY_IPS}
1772 | do
1773 | echo "--$proxyip"
1774 | done
1775 | if [[ $oneshotres ]] ; then
1776 | echo "-----"
1777 | echo "--Internal Fallback Resolver | size=11 color=gray"
1778 | echo "--$oneshotres"
1779 | fi
1780 | echo "-----"
1781 | echo "--Configured Fallback Resolvers | size=11 color=gray"
1782 | if ! [[ $fbipss ]] ; then
1783 | echo "--None"
1784 | else
1785 | while read -r fbip
1786 | do
1787 | fbname=$(echo "$fallbacks" | grep -F "$fbip" | awk '{print substr($0, index($0,$2))}')
1788 | [[ $fbname == "" ]] && fbname="n/a"
1789 | echo "--$fbip ($fbname)"
1790 | done < <(echo "$fbipss")
1791 | fi
1792 | echo "-----"
1793 | echo "--Edit Fallback Resolvers… | terminal=false bash=/usr/bin/open param1=-a param2=TextEdit param3=$fbloc"
1794 | }
1795 |
1796 | _dfmenu () {
1797 | if $nodefault ; then
1798 | echo "--Preconfigured Resolvers | size=11 color=gray"
1799 | for precfg in ${UDEFAULTS}
1800 | do
1801 | echo "--$precfg"
1802 | done
1803 | else
1804 | echo "--Configured Resolvers | size=11 color=gray"
1805 | if ! [[ $udfipss ]] ; then
1806 | echo "--None"
1807 | else
1808 | while read -r cddnsr
1809 | do
1810 | cddnsrname=$(echo "$defaultdns" | grep -F "$cddnsr" | awk '{print substr($0, index($0,$2))}')
1811 | [[ $cddnsrname == "" ]] && fbname="n/a"
1812 | echo "--$cddnsr ($cddnsrname)"
1813 | done < <(echo "$udfipss")
1814 | fi
1815 | fi
1816 | echo "-----"
1817 | echo "--Available Local Area DNS | size=11 color=gray"
1818 | if [[ $ldnsname != "" ]] ; then
1819 | echo "--$localdns ($ldnsname)"
1820 | else
1821 | echo "--$localdns"
1822 | fi
1823 | echo "-----"
1824 | echo "--Edit Default DNS Resolvers… | terminal=false bash=/usr/bin/open param1=-a param2=TextEdit param3=$udfloc"
1825 | }
1826 |
1827 | _omenu () {
1828 | echo "--$service Resolver Backups | size=11 color=gray"
1829 | rbackuplist=$(find "$cfgdir" -maxdepth 1 -type f -name "$baklocname-d*")
1830 | if [[ $rbackuplist ]] ; then
1831 | while read -r rbackup
1832 | do
1833 | bpdate=$(basename "$rbackup" | awk -F"-d" '{print $2}')
1834 | bdate=$(date -j -f "%s" "$bpdate" "%a %d %b %Y %T %Z" 2>/dev/null)
1835 | ! [[ $bdate ]] && bdate="Undated Backup"
1836 | echo "--$bdate"
1837 | bresolvers=$(cat "$rbackup")
1838 | if [[ $bresolvers ]] ; then
1839 | for bresolver in ${bresolvers}
1840 | do
1841 | echo "----$bresolver"
1842 | done
1843 | echo "-------"
1844 | if [[ ${bresolvers} != ${service_resolvers} ]] ; then
1845 | echo "----Load Resolvers From Backup… | terminal=false refresh=true bash=$0 param1=rload param2=\"$bpdate\""
1846 | else
1847 | echo "----Currently Loaded"
1848 | fi
1849 | else
1850 | echo "----Empty"
1851 | fi
1852 | done < <(echo "$rbackuplist" | sort -r)
1853 | fi
1854 | iball=$(cat "$ibakloc" 2>/dev/null)
1855 | if [[ $iball ]] ; then
1856 | bpdate=$(echo "$iball" | grep "^#" | awk '{print $2}')
1857 | bdate=$(date -j -f "%s" "$bpdate" "%a %d %b %Y %T %Z" 2>/dev/null)
1858 | ! [[ $bdate ]] && bdate="Undated Backup"
1859 | echo "--$bdate"
1860 | echo "----Initial Resolver Backup | size=11 color=gray"
1861 | ibresolvers=$(echo "$iball" | grep -v "^#")
1862 | if [[ $ibresolvers ]] ; then
1863 | for ibresolver in ${ibresolvers}
1864 | do
1865 | echo "----$ibresolver"
1866 | done
1867 | echo "-------"
1868 | if [[ ${ibresolvers} != ${service_resolvers} ]] ; then
1869 | echo "----Load Resolvers From Backup… | terminal=false refresh=true bash=$0 param1=rload param2=initial"
1870 | else
1871 | echo "----Currently Loaded"
1872 | fi
1873 | echo "-----"
1874 | else
1875 | echo "----Empty"
1876 | fi
1877 | else
1878 | echo "--No Initial Backup Detected"
1879 | fi
1880 | }
1881 |
1882 | echo "---"
1883 |
1884 | if $proxy ; then
1885 | if $dnsc ; then
1886 | echo "DNSCrypt | checked=true"
1887 | _dnsinfo
1888 | echo "Set As Default… | alternate=true refresh=true terminal=false checked=true bash=$0 param1=default param2=dcp"
1889 | _dnsinfo
1890 | else
1891 | if ! $dnso ; then
1892 | echo "DNSCrypt | terminal=false refresh=true bash=$0 param1='${DNSCRYPT_PROXY_IPS}'"
1893 | _dnscmenu
1894 | echo "Set As Default… | alternate=true refresh=true terminal=false bash=$0 param1=default param2=dcp"
1895 | _dnscmenu
1896 | else
1897 | if $vpn ; then
1898 | echo "DNSCrypt | color=gray"
1899 | else
1900 | echo "DNSCrypt | terminal=false refresh=true bash=$0 param1='${DNSCRYPT_PROXY_IPS}'"
1901 | fi
1902 | _dnscmenu
1903 | echo "Set As Default… | alternate=true refresh=true terminal=false bash=$0 param1=default param2=dcp"
1904 | _dnscmenu
1905 | fi
1906 | fi
1907 | if $dnscf ; then
1908 | echo "DNSCrypt + Fallback | checked=true"
1909 | _dnsinfo
1910 | echo "Set As Default… | alternate=true refresh=true terminal=false checked=true bash=$0 param1=default param2=dcpfb"
1911 | _dnsinfo
1912 | else
1913 | if ! $dnso ; then
1914 | echo "DNSCrypt + Fallback | terminal=false refresh=true bash=$0 param1='${DNSCRYPT_PROXY_IPS} ${ADDITIONAL_IP}'"
1915 | _fbmenu
1916 | echo "Set As Default… | alternate=true refresh=true terminal=false bash=$0 param1=default param2=dcpfb"
1917 | _fbmenu
1918 | else
1919 | if $vpn ; then
1920 | echo "DNSCrypt + Fallback | color=gray"
1921 | else
1922 | echo "DNSCrypt + Fallback | terminal=false refresh=true bash=$0 param1='${DNSCRYPT_PROXY_IPS} ${ADDITIONAL_IP}'"
1923 | fi
1924 | _fbmenu
1925 | echo "Set As Default… | alternate=true refresh=true terminal=false bash=$0 param1=default param2=dcpfb"
1926 | _fbmenu
1927 | fi
1928 | fi
1929 | if $dnsd ; then
1930 | echo "Default DNS | checked=true"
1931 | _dnsinfo
1932 | echo "Other DNS"
1933 | _omenu
1934 | else
1935 | if $dnso ; then
1936 | if $vpn ; then
1937 | echo "Default DNS | color=gray"
1938 | else
1939 | echo "Default DNS | terminal=false refresh=true bash=$0 param1='${UDEFAULT}'"
1940 | fi
1941 | _dfmenu
1942 | echo "Other DNS | checked=true"
1943 | _dnsinfo
1944 | else
1945 | echo "Default DNS | terminal=false refresh=true bash=$0 param1='${UDEFAULT}'"
1946 | _dfmenu
1947 | echo "Other DNS"
1948 | _omenu
1949 | fi
1950 | fi
1951 | else
1952 | echo "DNSCrypt"
1953 | echo "Set As Default… | alternate=true refresh=true terminal=false bash=$0 param1=default param2=dcp"
1954 | echo "DNSCrypt + Fallback"
1955 | echo "Set As Default… | alternate=true refresh=true terminal=false bash=$0 param1=default param2=dcpfb"
1956 | if $dnsd ; then
1957 | echo "Default DNS | checked=true"
1958 | _dnsinfo
1959 | echo "Other DNS"
1960 | _omenu
1961 | elif $dnso ; then
1962 | if $vpn ; then
1963 | echo "Default DNS | color=gray"
1964 | else
1965 | echo "Default DNS | terminal=false refresh=true bash=$0 param1='${UDEFAULT}'"
1966 | fi
1967 | _dfmenu
1968 | echo "Other DNS | checked=true"
1969 | _dnsinfo
1970 | fi
1971 | fi
1972 |
1973 | scrparent="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
1974 | scrpath="$scrparent/$SCRNAME"
1975 | scrshort="${scrpath/#$HOME/~}"
1976 |
1977 | _serviceinfo () {
1978 | echo "--Configure… | terminal=false bash=/usr/bin/open param1=\"$TOML\""
1979 | echo "-----"
1980 | ! [[ $dcpver ]] && dcpverp="n/a" || dcpverp="v$dcpver"
1981 | if $proxy ; then
1982 | echo "--PID $proxystatus ($dcpverp)"
1983 | echo "--$DNSCRYPT_PROXY_IPS:$dnsport"
1984 | else
1985 | echo "--Disabled ($dcpverp)"
1986 | fi
1987 | servout=$(cat "$cachedir/service" 2>/dev/null)
1988 | if [[ $servout ]] ; then
1989 | mdate=$(stat -f "%Sc" "$cachedir/service")
1990 | servout=$(echo "$servout" | sed -e 's/^Password://g' -e 's/^==> //g')
1991 | if $proxy ; then
1992 | servlabel=$(echo "$servout" | grep "label: " | awk -F": " '{print $2}' | sed 's/)$//g' | awk '!seen[$0]++')
1993 | ! [[ $servlabel ]] && servlabel="Unknown Service Name"
1994 | echo "--$servlabel"
1995 | fi
1996 | if [[ $servout ]] ; then
1997 | echo "-----"
1998 | echo "--Latest Output"
1999 | echo "----$mdate | font=Menlo size=11"
2000 | while read -r line
2001 | do
2002 | echo "----$line | font=Menlo size=11"
2003 | done < <(echo -e "$servout" | sed 's/ (label: .*)$//g')
2004 | fi
2005 | fi
2006 | echo "-----"
2007 | echo "--Network Status"
2008 | if [[ $chnstat ]] || [[ $nstat_listen ]] ; then
2009 | if [[ $chnstat ]] ; then
2010 | while read -r nstati
2011 | do
2012 | echo "----$nstati | font=Menlo size=11"
2013 | done < <(echo "$chnstat")
2014 | echo "-------"
2015 | liface=$(echo "$chnstat" | rev | awk '{print $1}' | rev)
2016 | ifcfg=$(ifconfig "$liface" 2>/dev/null | sed 's/^'"$liface"': //')
2017 | fi
2018 | if [[ $nstat_listen ]] ; then
2019 | while read -r nstatl
2020 | do
2021 | echo "----$nstatl | font=Menlo size=11"
2022 | done < <(echo "$nstat_listen")
2023 | else
2024 | echo "----$DNSCRYPT_PROXY_IPS.$dnsport NOT LISTENING | font=Menlo size=11"
2025 | fi
2026 | if [[ $ifcfg ]] ; then
2027 | echo "-------"
2028 | while read -r ifcfgline
2029 | do
2030 | echo "----$ifcfgline | font=Menlo size=11"
2031 | done < <(echo "$ifcfg")
2032 | fi
2033 | else
2034 | echo "----No Information"
2035 | fi
2036 | logline=$(echo "$CONFIG" | grep "log_file = " | head -n 1)
2037 | echo "-----"
2038 | if [[ $logline != "#"* ]] ; then
2039 | logloc=$(echo "$logline" | awk -F\' '{print $2}')
2040 | if [[ $logloc != "/"* ]] ; then
2041 | logloc="$etcdir/$logloc"
2042 | fi
2043 | if [[ -f $logloc ]] ; then
2044 | if $proxy ; then
2045 | logcont=$(tail -r "$logloc" | awk '{print} / Source \[/ {exit}' | tail -r)
2046 | if [[ $logcont ]] ; then
2047 | logcont=$(echo "$logcont" | grep -v "^$")
2048 | echo "--Latest Log Data"
2049 | loglevelline=$(echo "$CONFIG" | grep "log_level = ")
2050 | if [[ $loglevelline == "#"* ]] ; then
2051 | loglevel="2"
2052 | else
2053 | loglevel=$(echo "$loglevelline" | awk -F" = " '{print $2}')
2054 | ! [[ $loglevel ]] && loglevel="2"
2055 | fi
2056 | echo "----Log Level: $loglevel"
2057 | syslogline=$(echo "$CONFIG" | grep "use_syslog = ")
2058 | if [[ $syslogline == "#"* ]] ; then
2059 | syslog="false"
2060 | else
2061 | syslog=$(echo "$syslogline" | awk -F" = " '{print $2}')
2062 | fi
2063 | echo "----System Logging: $syslog"
2064 | echo "-------"
2065 | today=$(date +"%Y-%m-%d")
2066 | logtimeouts=$(echo -e "$logcont" | grep "TIMEOUT$" | sed -e 's/TIMEOUT$//g' -e 's/\[NOTICE\] //g' | grep "^\[$today")
2067 | logerrors=$(echo -e "$logcont" | grep -F "[ERROR]" | sed -e 's/\[ERROR\] //g' | grep "^\[$today")
2068 | logfatal=$(echo -e "$logcont" | grep -F "[FATAL]" | sed -e 's/\[FATAL\] //g' | grep "^\[$today")
2069 | logwarnings=$(echo -e "$logcont" | grep -F "[WARNING]" | sed -e 's/\[WARNING\] //g' | grep "^\[$today" | sed -e "s/ -- if you don't manage this server, tell the server operator about it/ -- notify operator/g")
2070 | lowlat=$(echo -e "$logcont" | grep "\] \[NOTICE\] Server with the lowest initial latency: " | sed -e '$!d' -e 's/\[NOTICE\] //g' -e 's/Server with the lowest/Lowest/')
2071 | logcont=$(echo -e "$logcont" | grep -v -e "\[ERROR\]" -e "\[FATAL\]" -e "\[WARNING\]" -e "TIMEOUT$" -e "\] \[NOTICE\] Server with the lowest initial latency: " | sed 's/\[NOTICE\] //g')
2072 | if [[ $logfatal ]] ; then
2073 | echo "----Fatal Errors"
2074 | while read -r line
2075 | do
2076 | echo "------$line | font=Menlo size=11"
2077 | done < <(echo "$logfatal")
2078 | fi
2079 | if [[ $logerrors ]] ; then
2080 | echo "----Errors"
2081 | while read -r line
2082 | do
2083 | echo "------$line | font=Menlo size=11"
2084 | done < <(echo "$logerrors")
2085 | fi
2086 | if [[ $logwarnings ]] ; then
2087 | echo "----Warnings"
2088 | while read -r line
2089 | do
2090 | echo "------$line | font=Menlo size=11"
2091 | done < <(echo "$logwarnings")
2092 | fi
2093 | if [[ $logtimeouts ]] ; then
2094 | echo "----Timeouts"
2095 | while read -r line
2096 | do
2097 | echo "------$line | font=Menlo size=11"
2098 | done < <(echo "$logtimeouts")
2099 | fi
2100 | if [[ $logcont ]] ; then
2101 | echo "-------"
2102 | while read -r line
2103 | do
2104 | echo "----$line | font=Menlo size=11"
2105 | done < <(echo "$logcont" | sed 's/dnscrypt-proxy is //g')
2106 | fi
2107 | if [[ $lowlat ]] ; then
2108 | echo "-------"
2109 | echo "----$lowlat | font=Menlo size=11"
2110 | fi
2111 | fi
2112 | echo "--View Full Log… | terminal=false bash=/usr/bin/open param1=\"$logloc\""
2113 | else
2114 | echo "--View Log… | terminal=false bash=/usr/bin/open param1=\"$logloc\""
2115 | fi
2116 | else
2117 | echo "--Logging Disabled"
2118 | fi
2119 | fi
2120 | echo "-----"
2121 | serverscfg=$(echo "$CONFIG" | grep "^server_names =" | awk -F'[][]' '{print $2}' | sed -e 's/, /\\n/g' -e "s/\\'//g")
2122 | serverscfg=$(echo -e "$serverscfg" | sort)
2123 | cd "$tomldir"
2124 | serversall=$(dnscrypt-proxy -list-all 2>/dev/null)
2125 | resolversources=$(echo "$CONFIG" | grep "url = " | grep -v -e "# url = " -e "# url = " | awk -F\' '{print $2}' | xargs)
2126 | if [[ $serverscfg ]] ; then
2127 | serversreal=$(dnscrypt-proxy -list 2>/dev/null | sort)
2128 | serversrej=$(comm -23 <(echo "$serverscfg") <(echo "$serversreal"))
2129 | echo "--Current DNSCrypt Servers"
2130 | [[ $serversrej ]] && echo "----Configured | color=gray size=11"
2131 | while read -r server
2132 | do
2133 | echo "----$server | font=Menlo size=11"
2134 | done < <(echo "$serverscfg")
2135 | if [[ $serversrej ]] ; then
2136 | echo "-------"
2137 | echo "----Ignored | size=11 color=gray"
2138 | while read -r server
2139 | do
2140 | echo "----$server | font=Menlo size=11"
2141 | done < <(echo "$serversrej")
2142 | fi
2143 | echo "--Available DNSCrypt Servers"
2144 | echo "----Open Resolver Lists… | terminal=false bash=$0 param1=opensource param2=\"${resolversources}\""
2145 | echo "-------"
2146 | while read -r server
2147 | do
2148 | echo "----$server | font=Menlo size=11"
2149 | done < <(echo "$serversall")
2150 | else
2151 | echo "--Current DNSCrypt Servers"
2152 | while read -r server
2153 | do
2154 | echo "----$server | font=Menlo size=11"
2155 | done < <(echo "$serversall")
2156 | fi
2157 | if [[ $resolversources ]] ; then
2158 | echo "--Configured Resolver Sources"
2159 | for resolversource in ${resolversources}
2160 | do
2161 | echo "----$resolversource | font=Menlo size=11 href=\"$resolversource\""
2162 | done
2163 | fi
2164 | echo "--DNSCrypt Public Server List | href=https://dnscrypt.info/public-servers"
2165 | echo "-----"
2166 | echo "--Paths"
2167 | echo "----Executable | size=11 color=gray"
2168 | shortpath="${dcploc/#$HOME/~}"
2169 | pathdir=$(dirname "$dcploc")
2170 | echo "----$shortpath | font=Menlo size=11 terminal=false bash=/usr/bin/open param1=\"$pathdir\""
2171 | if [[ -h $dcploc ]] ; then
2172 | dcpaloc=$(_abspath "$dcploc")
2173 | dcpashort="${dcpaloc/#$HOME/~}"
2174 | dcpaparent=$(dirname "$dcpaloc")
2175 | echo "----→ $dcpashort | font=Menlo size=11 terminal=false bash=/usr/bin/open param1=\"$dcpaparent\""
2176 | fi
2177 | echo "-------"
2178 | echo "----Configuration File | size=11 color=gray"
2179 | shorttoml="${TOML/#$HOME/~}"
2180 | echo "----$shorttoml | font=Menlo size=11 terminal=false bash=/usr/bin/open param1=\"$tomldir\""
2181 | if [[ -h $TOML ]] ; then
2182 | tomla=$(_abspath "$TOML")
2183 | tomlashort="${tomla/#$HOME/~}"
2184 | tomlaparent=$(dirname "$tomla")
2185 | echo "----→ $tomlashort | font=Menlo size=11 terminal=false bash=/usr/bin/open param1=\"$tomlaparent\""
2186 | fi
2187 | echo "-----"
2188 | echo "--Clear DNS Cache… | terminal=false refresh=true bash=$0 param1=network param2=flush"
2189 | echo "--Renew DHCP Lease… | terminal=false refresh=true bash=$0 param1=network param2=dhcp"
2190 | echo "-----"
2191 | echo "--Open Network Preferences… | terminal=false bash=/usr/bin/open param1=\"/System/Library/PreferencePanes/Network.prefPane\""
2192 | }
2193 |
2194 | echo "---"
2195 |
2196 | if $proxy ; then
2197 | echo "DNSCrypt Service | checked=true terminal=false bash=$0 param1=proxyservice param2=stop"
2198 | _serviceinfo
2199 | echo "Force-Restart… | checked=true alternate=true terminal=false bash=$0 param1=proxyservice param2=force-restart"
2200 | _serviceinfo
2201 | else
2202 | echo "DNSCrypt Service | terminal=false bash=$0 param1=proxyservice param2=start"
2203 | _serviceinfo
2204 | fi
2205 |
2206 | echo "---"
2207 |
2208 | echo "DNSCrypt Menu"
2209 | if ! $stopped ; then
2210 | echo "--Stop Plugin… | terminal=false refresh=true bash=$0 param1=toggle param2=stop"
2211 | echo "-----"
2212 | fi
2213 | echo "--Version $dcmver$dcmvadd"
2214 | echo "-----"
2215 | if [[ -h $scrpath ]] ; then
2216 | echo "--Plugin Script Paths"
2217 | echo "----$scrshort | font=Menlo size=11 terminal=false bash=/usr/bin/open param1=\"$scrparent\""
2218 | scrapath=$(_abspath "$scrpath")
2219 | scrashort="${scrapath/#$HOME/~}"
2220 | scraparent=$(dirname "$scrapath")
2221 | echo "----→ $scrashort | font=Menlo size=11 terminal=false bash=/usr/bin/open param1=\"$scraparent\""
2222 | else
2223 | echo "--Plugin Script Path"
2224 | echo "----$scrshort | font=Menlo size=11 terminal=false bash=/usr/bin/open param1=\"$scrparent\""
2225 | fi
2226 | echo "-----"
2227 | echo "--Edit Plugin… | terminal=false bash=/usr/bin/open param1=\"$scrpath\""
2228 | echo "--Open Configuration Directory… | terminal=false bash=/usr/bin/open param1=\"$cfgdir\""
2229 | echo "--Open Cache Directory… | terminal=false bash=/usr/bin/open param1=\"$cachedir\""
2230 | echo "-----"
2231 | echo "--External Links"
2232 | echo "----DNSCrypt Menu | size=11 color=gray"
2233 | echo "----GitHub Repository | href=https://github.com/JayBrown/DNSCrypt-Menu"
2234 | echo "----Issues | href=https://github.com/JayBrown/DNSCrypt-Menu/issues"
2235 | echo "-------"
2236 | echo "----dnscrypt-proxy | size=11 color=gray"
2237 | echo "----GitHub Repository | href=https://github.com/jedisct1/dnscrypt-proxy"
2238 | echo "----Documentation | href=https://github.com/jedisct1/dnscrypt-proxy/wiki"
2239 | echo "----Issues | href=https://github.com/jedisct1/dnscrypt-proxy/issues"
2240 | echo "-------"
2241 | echo "----DNSCrypt | size=11 color=gray"
2242 | echo "----Homepage | href= https://dnscrypt.info"
2243 | echo "-----"
2244 | echo "Refresh… | refresh=true"
2245 |
--------------------------------------------------------------------------------