Commit 18e372d062

18e372d06257e62a1003c563fb26fb4c491f50a9

parent: 5c78e03ec0

Unsigned

cmc <hello@cleberg.net> · 2023-12-04 04:43 UTC

feat: add nextdns pot

Layout: unified · split

blog/2023-11-12-consolefonts.org deleted −5
@@ -1,5 +0,0 @@
1+++
2date = 2023-11-12T02:03:25.924298748+00:00
3title = "How to Configure Console Fonts on Alpine Linux"
4description = ""
5+++
blog/2023-12-03-unifi-nextdns.org added +1275
@@ -0,0 +1,1275 @@
1#+title: How to Install NextDNS on the Unifi Dream Machine
2#+date: 2023-12-03
3
4* Overview
5:PROPERTIES:
6:ID: 711309AE-955D-4B2D-B716-CFD700079157
7:PUBDATE: 2023-12-03 Sun 22:32
8:END:
9
10I recently installed NextDNS on my Unifi Dream Machine router using the
11[[https://github.com/nextdns/nextdns/wiki/UnifiOS][UnifiOS]] wiki page on
12NextDNS's GitHub repository.
13
14As a result of this, I wanted to write down the process in case the wiki or
15installer ever gets lost.
16
17* Wiki
18:PROPERTIES:
19:ID: 8457B7A9-AE62-448D-B092-C04759F8D468
20:PUBDATE: 2023-12-03 Sun 22:32
21:END:
22
23The following is copied from the wiki page linked above, with one difference in
24the =ssh= command.
25
26Install instructions for Unifi Dream Machine (UDM) standard and pro routers.
27
28** Install
29:PROPERTIES:
30:ID: 907F595C-6D53-409D-AB97-2B830D09B62E
31:END:
32
33Enable SSH:
34
35- Go to your unifi admin interface and select your device (not the controller
36 settings, but the Dream Machine settings)
37- Click on "Settings" at the bottom of the page
38- Go to the "Advanced" section on the left pan
39- Enable SSH
40- Set a SSH password
41
42Connect to your router using =ssh root@xxx.xxx.xxx.xxx= with the password you
43configured.
44
45Run the following command and follow the instructions:
46
47#+begin_src sh
48sh -c 'sh -c "$(curl -sL https://nextdns.io/install)"'
49#+end_src
50
51Note: Queries from the UDM itself won’t be routed to NextDNS nor encrypted due
52to current system limitation. All traffic from other devices on then network
53will.
54
55** Upgrade
56:PROPERTIES:
57:ID: 3836C070-2C7C-456D-AB3B-15DDE60D2F99
58:END:
59
60To upgrade to the last version, simply re-run the installer above. If a new
61version is available, the upgrade action will added to the list of possible
62actions.
63
64** Uninstall
65:PROPERTIES:
66:ID: DFD1BA2F-EC4E-4B5C-9CEA-098DFF0AD62F
67:END:
68
69To uninstall, re-run the installer above and select "Remove" in the menu.
70
71** Troubleshooting
72:PROPERTIES:
73:ID: 0B0F4E70-FACC-4C7C-8EB9-55398AA8476F
74:END:
75
76If the installation fail, please the installer in debug mode and contact us at
77team@nextdns.io with the transcript of the installation:
78
79#+begin_src sh
80sh -c 'DEBUG=1 sh -c "$(curl -sL https://nextdns.io/install)"'
81#+end_Ssrc
82
83*** Content Filtering Conflict
84:PROPERTIES:
85:ID: BCDD3267-4C04-45AC-BAAD-9D15F414ED4D
86:END:
87
88NextDNS CLI and the UDM Content Filtering or the Ad Blocking features are
89incompatible. If you want to use NextDNS CLI, please make sure they are
90disabled.
91
92To disable Content Filtering, go to Settings > Network, then for each network,
93set the Content Filtering feature to None
94
95To disable Ad Blocking, go to Settings > Application Firewall. In the General
96tab, uncheck the Ad Blocking checkbox.
97
98*** APT Error
99:PROPERTIES:
100:ID: 83244A13-7154-475A-8193-064A1B81D3AE
101:END:
102
103If you get an apt error as follow:
104
105#+begin_src sh
106E: Failed to fetch http://security.debian.org/dists/stretch/updates/main/binary-arm64/Packages 404 Not Found [IP: 151.101.70.132 80]
107#+end_src
108
109You may try to following:
110
111#+begin_src sh
112sed -i -e 's/deb.debian.org/archive.debian.org/g' \
113 -e 's|security.debian.org|archive.debian.org/|g' \
114 -e '/stretch-updates/d' /etc/apt/sources.list
115#+end_src
116
117* install.sh
118:PROPERTIES:
119:ID: 91DE0DD0-8177-4594-B067-373ABF99C343
120:PUBDATE: 2023-12-03 Sun 22:34
121:END:
122
123Here are the contents of the =install.sh= file used above, as of 2023-12-03:
124
125#+begin_src sh
126#!/bin/sh
127
128main() {
129 OS=$(detect_os)
130 GOARCH=$(detect_goarch)
131 GOOS=$(detect_goos)
132 NEXTDNS_BIN=$(bin_location)
133 INSTALL_RELEASE=$(get_release)
134
135 export NEXTDNS_INSTALLER=1
136
137 log_info "OS: $OS"
138 log_info "GOARCH: $GOARCH"
139 log_info "GOOS: $GOOS"
140 log_info "NEXTDNS_BIN: $NEXTDNS_BIN"
141 log_info "INSTALL_RELEASE: $INSTALL_RELEASE"
142
143 if [ -z "$OS" ] || [ -z "$GOARCH" ] || [ -z "$GOOS" ] || [ -z "$NEXTDNS_BIN" ] || [ -z "$INSTALL_RELEASE" ]; then
144 log_error "Cannot detect running environment."
145 exit 1
146 fi
147
148 case "$RUN_COMMAND" in
149 install|upgrade|uninstall|configure) "$RUN_COMMAND"; exit ;;
150 esac
151
152 while true; do
153 CURRENT_RELEASE=$(get_current_release)
154 log_debug "Start install loop with CURRENT_RELEASE=$CURRENT_RELEASE"
155
156 if [ "$CURRENT_RELEASE" ]; then
157 if ! is_version_current; then
158 log_debug "NextDNS is out of date ($CURRENT_RELEASE != $INSTALL_RELEASE)"
159 menu \
160 u "Upgrade NextDNS from $CURRENT_RELEASE to $INSTALL_RELEASE" upgrade \
161 c "Configure NextDNS" configure \
162 r "Remove NextDNS" uninstall \
163 e "Exit" exit
164 else
165 log_debug "NextDNS is up to date ($CURRENT_RELEASE)"
166 menu \
167 c "Configure NextDNS" configure \
168 r "Remove NextDNS" uninstall \
169 e "Exit" exit
170 fi
171 else
172 log_debug "NextDNS is not installed"
173 menu \
174 i "Install NextDNS" install \
175 e "Exit" exit
176 fi
177 done
178}
179
180install() {
181 if [ "$(get_current_release)" ]; then
182 log_info "Already installed"
183 return
184 fi
185 if type=$(install_type); then
186 log_info "Installing NextDNS..."
187 log_debug "Using $type install type"
188 if "install_$type"; then
189 if [ ! -x "$NEXTDNS_BIN" ]; then
190 log_error "Installation failed: binary not installed in $NEXTDNS_BIN"
191 return 1
192 fi
193 configure
194 post_install
195 exit 0
196 fi
197 else
198 return $?
199 fi
200}
201
202upgrade() {
203 if [ "$(get_current_release)" = "$INSTALL_RELEASE" ]; then
204 log_info "Already on the latest version"
205 return
206 fi
207 if type=$(install_type); then
208 log_info "Upgrading NextDNS..."
209 log_debug "Using $type install type"
210 "upgrade_$type"
211 else
212 return $?
213 fi
214}
215
216uninstall() {
217 if type=$(install_type); then
218 log_info "Uninstalling NextDNS..."
219 log_debug "Using $type uninstall type"
220 "uninstall_$type"
221 else
222 return $?
223 fi
224}
225
226precheck() {
227 if [ -e "/data/unifi" ] && [ -f "/run/dnsfilter/dnsfilter" ]; then
228 log_warn "UDM Content Filtering and/or Ad Blocking feature is enabled."
229 log_warn "Please disable it to use NextDNS."
230 log_warn ""
231 log_warn " To disable Content Filtering, go to Settings > Network."
232 log_warn " For each network, set the Content Filtering feature to None."
233 log_warn ""
234 log_warn " To disable Ad Blocking, go to Settings > Application Firewall"
235 log_warn " In the General tab, uncheck the Ad Blocking checkbox."
236 log_warn ""
237 while [ -f "/run/dnsfilter/dnsfilter" ]; do
238 sleep 1
239 done
240 log_info "Content Filtering feature successfuly disabled."
241 fi
242}
243
244configure() {
245 log_debug "Start configure"
246 precheck
247 args=""
248 add_arg() {
249 for value in $2; do
250 log_debug "Add arg -$1=$value"
251 args="$args -$1=$value"
252 done
253 }
254 add_arg_bool_ask() {
255 arg=$1
256 msg=$2
257 default=$3
258 if [ -z "$default" ]; then
259 default=$(get_config_bool "$arg")
260 fi
261 # shellcheck disable=SC2046
262 add_arg "$arg" $(ask_bool "$msg" "$default")
263 }
264 # Use profile from now on
265 add_arg profile "$(get_profile_id)"
266
267 doc "Sending your devices name lets you filter analytics and logs by device."
268 add_arg_bool_ask report-client-info 'Report device name?' true
269
270 case $(guess_host_type) in
271 router)
272 add_arg setup-router true
273 ;;
274 unsure)
275 doc "Accept DNS request from other network hosts."
276 if [ "$(get_config_bool setup-router)" = "true" ]; then
277 router_default=true
278 fi
279 if [ "$(ask_bool 'Setup as a router?' $router_default)" = "true" ]; then
280 add_arg setup-router true
281 fi
282 ;;
283 esac
284
285 doc "Make NextDNS CLI cache responses. This improves latency and reduces the amount"
286 doc "of queries sent to NextDNS."
287 if [ "$(guess_host_type)" = "router" ]; then
288 doc "Note that enabling this feature will disable dnsmasq for DNS to avoid double"
289 doc "caching."
290 fi
291 if [ "$(get_config cache-size)" != "0" ]; then
292 cache_default=true
293 fi
294 if [ "$(ask_bool 'Enable caching?' $cache_default)" = "true" ]; then
295 add_arg cache-size "10MB"
296
297 doc "Instant refresh will force low TTL on responses sent to clients so they rely"
298 doc "on CLI DNS cache. This will allow changes on your NextDNS config to be applied"
299 doc "on your LAN hosts without having to wait for their cache to expire."
300 if [ "$(get_config max-ttl)" = "5s" ]; then
301 instant_refresh_default=true
302 fi
303 if [ "$(ask_bool 'Enable instant refresh?' $instant_refresh_default)" = "true" ]; then
304 add_arg max-ttl "5s"
305 fi
306 fi
307
308 if [ "$(guess_host_type)" != "router" ]; then
309 doc "Changes DNS settings of the host automatically when NextDNS is started."
310 doc "If you say no here, you will have to manually configure DNS to 127.0.0.1."
311 add_arg_bool_ask auto-activate 'Automatically setup local host DNS?' true
312 fi
313 # shellcheck disable=SC2086
314 asroot "$NEXTDNS_BIN" install $args
315}
316
317post_install() {
318 println
319 println "Congratulations! NextDNS is now installed."
320 println
321 println "To upgrade/uninstall, run this command again and select the appropriate option."
322 println
323 println "You can use the NextDNS command to control the daemon."
324 println "Here are a few important commands to know:"
325 println
326 println "# Start, stop, restart the daemon:"
327 println "nextdns start"
328 println "nextdns stop"
329 println "nextdns restart"
330 println
331 println "# Configure the local host to point to NextDNS or not:"
332 println "nextdns activate"
333 println "nextdns deactivate"
334 println
335 println "# Explore daemon logs:"
336 println "nextdns log"
337 println
338 println "# For more commands, use:"
339 println "nextdns help"
340 println
341}
342
343install_bin() {
344 bin_path=$NEXTDNS_BIN
345 if [ "$1" ]; then
346 bin_path=$1
347 fi
348 log_debug "Installing $INSTALL_RELEASE binary for $GOOS/$GOARCH to $bin_path"
349 case "$INSTALL_RELEASE" in
350 */*)
351 # Snapshot
352 branch=${INSTALL_RELEASE%/*}
353 hash=${INSTALL_RELEASE#*/}
354 url="https://snapshot.nextdns.io/${branch}/nextdns-${hash}_${GOOS}_${GOARCH}.tar.gz"
355 ;;
356 *)
357 url="https://github.com/nextdns/nextdns/releases/download/v${INSTALL_RELEASE}/nextdns_${INSTALL_RELEASE}_${GOOS}_${GOARCH}.tar.gz"
358 ;;
359 esac
360 log_debug "Downloading $url"
361 asroot mkdir -p "$(dirname "$bin_path")" &&
362 curl -sL "$url" | asroot sh -c "tar Ozxf - nextdns > \"$bin_path\"" &&
363 asroot chmod 755 "$bin_path"
364}
365
366upgrade_bin() {
367 tmp=$NEXTDNS_BIN.tmp
368 if install_bin "$tmp"; then
369 asroot "$NEXTDNS_BIN" uninstall
370 asroot mv "$tmp" "$NEXTDNS_BIN"
371 asroot "$NEXTDNS_BIN" install
372 fi
373 log_debug "Removing spurious temporary install file"
374 asroot rm -rf "$tmp"
375}
376
377uninstall_bin() {
378 asroot "$NEXTDNS_BIN" uninstall
379 asroot rm -f "$NEXTDNS_BIN"
380}
381
382install_rpm() {
383 asroot curl -Ls https://repo.nextdns.io/nextdns.repo -o /etc/yum.repos.d/nextdns.repo &&
384 asroot yum install -y nextdns
385}
386
387upgrade_rpm() {
388 asroot yum update -y nextdns
389}
390
391uninstall_rpm() {
392 asroot yum remove -y nextdns
393}
394
395install_zypper() {
396 if asroot zypper repos | grep -q nextdns >/dev/null; then
397 echo "Repository nextdns already exists. Skipping adding repository..."
398 else
399 asroot zypper ar -f -r https://repo.nextdns.io/nextdns.repo nextdns
400 fi
401 asroot zypper refresh && asroot zypper in -y nextdns
402}
403
404upgrade_zypper() {
405 asroot zypper up nextdns
406}
407
408uninstall_zypper() {
409 asroot zypper remove -y nextdns
410 case $(ask_bool 'Do you want to remove the repository from the repositories list?' true) in
411 true)
412 asroot zypper removerepo nextdns
413 ;;
414 esac
415}
416
417install_deb() {
418 if [ -f /etc/default/ubnt-dpkg-cache ]; then
419 # On UnifiOS 2, make sure the package is persisted over upgrades
420 sed -e '/^DPKG_CACHE_UBNT_PKGS+=" nextdns"/{:a;n;ba;q}' \
421 -e '$aDPKG_CACHE_UBNT_PKGS+=" nextdns"' \
422 -i /etc/default/ubnt-dpkg-cache
423 fi
424
425 install_deb_keyring &&
426 asroot sh -c 'echo "deb [signed-by=/etc/apt/keyrings/nextdns.gpg] https://repo.nextdns.io/deb stable main" > /etc/apt/sources.list.d/nextdns.list' &&
427 (dpkg --compare-versions $(dpkg-query --showformat='${Version}' --show apt) ge 1.1 ||
428 asroot ln -s /etc/apt/keyrings/nextdns.gpg /etc/apt/trusted.gpg.d/.) &&
429 (test "$OS" = "debian" && asroot apt-get -y install apt-transport-https || true) &&
430 asroot apt-get update &&
431 asroot apt-get install -y nextdns
432}
433
434install_deb_keyring() {
435 # Fallback on curl, some debian based distrib don't have wget while debian
436 # doesn't have curl by default.
437 asroot mkdir -p /etc/apt/keyrings
438 ( asroot wget -qO /etc/apt/keyrings/nextdns.gpg https://repo.nextdns.io/nextdns.gpg ||
439 asroot curl -sfL https://repo.nextdns.io/nextdns.gpg -o /etc/apt/keyrings/nextdns.gpg ) &&
440 asroot chmod 0644 /etc/apt/keyrings/nextdns.gpg
441}
442
443upgrade_deb() {
444 install_deb_keyring &&
445 asroot apt-get update &&
446 asroot apt-get install -y nextdns
447}
448
449uninstall_deb() {
450 asroot apt-get remove -y nextdns
451}
452
453install_apk() {
454 repo=https://repo.nextdns.io/apk
455 asroot wget -O /etc/apk/keys/nextdns.pub https://repo.nextdns.io/nextdns.pub &&
456 (grep -v $repo /etc/apk/repositories; echo $repo) | asroot tee /etc/apk/repositories >/dev/null &&
457 asroot apk update &&
458 asroot apk add nextdns
459}
460
461upgrade_apk() {
462 asroot apk update && asroot apk upgrade nextdns
463}
464
465uninstall_apk() {
466 asroot apk del nextdns
467}
468
469install_arch() {
470 asroot pacman -Sy yay &&
471 yay -Sy nextdns
472}
473
474upgrade_arch() {
475 yay -Suy nextdns
476}
477
478uninstall_arch() {
479 asroot pacman -R nextdns
480}
481
482install_merlin_path() {
483 # Add next to Merlin's path
484 mkdir -p /tmp/opt/sbin
485 ln -sf "$NEXTDNS_BIN" /tmp/opt/sbin/nextdns
486}
487
488install_merlin() {
489 if install_bin; then
490 install_merlin_path
491 fi
492}
493
494uninstall_merlin() {
495 uninstall_bin
496 rm -f /tmp/opt/sbin/nextdns
497}
498
499upgrade_merlin() {
500 if upgrade_bin; then
501 install_merlin_path
502 fi
503}
504
505install_openwrt() {
506 opkg update &&
507 opkg install nextdns
508 rt=$?
509 if [ $rt -eq 0 ]; then
510 case $(ask_bool 'Install the GUI?' true) in
511 true)
512 opkg install luci-app-nextdns
513 rt=$?
514 ;;
515 esac
516 fi
517 return $rt
518}
519
520upgrade_openwrt() {
521 opkg update &&
522 opkg upgrade nextdns
523}
524
525uninstall_openwrt() {
526 opkg remove nextdns
527}
528
529install_ddwrt() {
530 if [ "$(nvram get enable_jffs2)" = "0" ]; then
531 log_error "JFFS support not enabled"
532 log_info "To enabled JFFS:"
533 log_info " 1. On the router web page click on Administration."
534 log_info " 2. Scroll down until you see JFFS2 Support section."
535 log_info " 3. Click Enable JFFS."
536 log_info " 4. Click Save."
537 log_info " 5. Wait couple seconds, then click Apply."
538 log_info " 6. Wait again. Go back to the Enable JFFS section, and enable Clean JFFS."
539 log_info " 7. Do not click Save. Click Apply instead."
540 log_info " 8. Wait till you get the web-GUI back, then disable Clean JFFS again."
541 log_info " 9. Click Save."
542 log_info "10. Relaunch this installer."
543 exit 1
544 fi
545 mkdir -p /jffs/nextdns &&
546 openssl_get https://curl.haxx.se/ca/cacert.pem | http_body > /jffs/nextdns/ca.pem &&
547 install_bin
548}
549
550upgrade_ddwrt() {
551 upgrade_bin
552}
553
554uninstall_ddwrt() {
555 uninstall_bin
556 rm -rf /jffs/nextdns
557}
558
559install_brew() {
560 silent_exec brew install nextdns/tap/nextdns
561}
562
563upgrade_brew() {
564 silent_exec brew upgrade nextdns/tap/nextdns
565 asroot "$NEXTDNS_BIN" install
566}
567
568uninstall_brew() {
569 silent_exec brew uninstall nextdns/tap/nextdns
570}
571
572install_freebsd() {
573 # TODO: port install
574 install_bin
575}
576
577upgrade_freebsd() {
578 # TODO: port upgrade
579 upgrade_bin
580}
581
582uninstall_freebsd() {
583 # TODO: port uninstall
584 uninstall_bin
585}
586
587install_pfsense() {
588 # TODO: port install + UI
589 install_bin
590}
591
592upgrade_pfsense() {
593 # TODO: port upgrade
594 upgrade_bin
595}
596
597uninstall_pfsense() {
598 # TODO: port uninstall
599 uninstall_bin
600}
601
602install_opnsense() {
603 # TODO: port install + UI
604 install_bin
605}
606
607upgrade_opnsense() {
608 # TODO: port upgrade
609 upgrade_bin
610}
611
612uninstall_opnsense() {
613 # TODO: port uninstall
614 uninstall_bin
615}
616
617ubios_install_source() {
618 echo "deb [signed-by=/etc/apt/keyrings/nextdns.gpg] https://repo.nextdns.io/deb stable main" > /data/nextdns.list
619 podman exec unifi-os mv /data/nextdns.list /etc/apt/sources.list.d/nextdns.list
620 rm -f /tmp/nextdns.list
621 podman exec unifi-os apt-get install -y gnupg1 curl
622 podman exec unifi-os mkdir -p /etc/apt/keyrings/
623 podman exec unifi-os curl -sfL https://repo.nextdns.io/nextdns.gpg -o /etc/apt/keyrings/nextdns.gpg
624 podman exec unifi-os apt-get update -o Dir::Etc::sourcelist="sources.list.d/nextdns.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
625}
626
627install_ubios() {
628 ubios_install_source
629 podman exec unifi-os apt-get install -y nextdns
630}
631
632upgrade_ubios() {
633 ubios_install_source
634 podman exec unifi-os apt-get install --only-upgrade -y nextdns
635}
636
637uninstall_ubios() {
638 podman exec unifi-os apt-get remove -y nextdns
639}
640
641install_ubios_snapshot() {
642 branch=${INSTALL_RELEASE%/*}
643 hash=${INSTALL_RELEASE#*/}
644 url="https://snapshot.nextdns.io/${branch}/nextdns-${hash}_${GOOS}_${GOARCH}.tar.gz"
645 podman exec unifi-os sh -c "curl -o- $url | tar Ozxf - nextdns > /usr/bin/nextdns; /usr/bin/nextdns install"
646}
647
648upgrade_ubios_snapshot() {
649 /data/nextdns uninstall
650 install_ubios_snapshot
651}
652
653install_type() {
654 if [ "$FORCE_INSTALL_TYPE" ]; then
655 echo "$FORCE_INSTALL_TYPE"; return 0
656 fi
657 case "$INSTALL_RELEASE" in
658 */*)
659 case $OS in
660 ubios)
661 echo "ubios_snapshot"; return 0
662 ;;
663 *)
664 # Snapshot mode always use binary install
665 echo "bin"; return 0
666 ;;
667 esac
668 esac
669 case $OS in
670 centos|fedora|rhel)
671 echo "rpm"
672 ;;
673 opensuse-tumbleweed|opensuse-leap|opensuse)
674 echo "zypper"
675 ;;
676 debian|ubuntu|elementary|raspbian|linuxmint|pop|neon|sparky|vyos|Deepin)
677 echo "deb"
678 ;;
679 alpine)
680 echo "apk"
681 ;;
682 arch|manjaro|steamos)
683 #echo "arch" # TODO: fix AUR install
684 echo "bin"
685 ;;
686 openwrt)
687 # shellcheck disable=SC1091
688 . /etc/os-release
689 major=$(echo "$VERSION_ID" | cut -d. -f1)
690 case $major in
691 *[!0-9]*)
692 if [ "$VERSION_ID" = "19.07.0-rc1" ]; then
693 # No opkg support before 19.07.0-rc2
694 echo "bin"
695 else
696 # Likely 'snapshot' build in this case, but still > major version 19
697 echo "openwrt"
698 fi
699 ;;
700 *)
701 if [ "$major" -lt 19 ]; then
702 # No opkg support before 19.07.0-rc2
703 echo "bin"
704 else
705 echo "openwrt"
706 fi
707 ;;
708 esac
709 ;;
710 asuswrt-merlin)
711 echo "merlin"
712 ;;
713 edgeos|synology|clear-linux-os|solus|openbsd|netbsd|overthebox)
714 echo "bin"
715 ;;
716 ddwrt)
717 echo "ddwrt"
718 ;;
719 darwin)
720 if [ -x /usr/local/bin/brew ] || [ -x /opt/homebrew/bin/brew ]; then
721 echo "brew"
722 else
723 log_debug "Homebrew not installed, fallback on binary install"
724 echo "bin"
725 fi
726 ;;
727 freebsd)
728 echo "freebsd"
729 ;;
730 pfsense)
731 echo "pfsense"
732 ;;
733 opnsense)
734 echo "opnsense"
735 ;;
736 ubios)
737 echo "ubios"
738 ;;
739 gentoo)
740 echo "bin"
741 ;;
742 void)
743 # TODO: pkg for xbps
744 echo "bin"
745 ;;
746 *)
747 log_error "Unsupported installation for $(detect_os)"
748 return 1
749 ;;
750 esac
751}
752
753get_config() {
754 "$NEXTDNS_BIN" config | grep -E "^$1 " | cut -d' ' -f 2
755}
756
757get_config_bool() {
758 val=$(get_config "$1")
759 case $val in
760 true|false)
761 echo "$val"
762 ;;
763 esac
764 echo "$2"
765}
766
767get_profile_id() {
768 log_debug "Get profile ID"
769 if [ "$CONFIG_ID" ]; then
770 # backward compat
771 PROFILE_ID="$CONFIG_ID"
772 fi
773 while [ -z "$PROFILE_ID" ]; do
774 default=
775 prev_id=$(get_config profile)
776 if [ -z "$prev_id" ]; then
777 # backward compat
778 prev_id=$(get_config config)
779 fi
780 if [ "$prev_id" ]; then
781 log_debug "Previous profile ID: $prev_id"
782 default=" (default=$prev_id)"
783 fi
784 print "NextDNS Profile ID%s: " "$default"
785 read -r id
786 if [ -z "$id" ]; then
787 id=$prev_id
788 fi
789 if echo "$id" | grep -qE '^[0-9a-f]{6}$'; then
790 PROFILE_ID=$id
791 break
792 else
793 log_error "Invalid profile ID."
794 println
795 println "ID format is 6 alphanumerical lowercase characters (example: 123abc)."
796 println "Your ID can be found on the Setup tab of https://my.nextdns.io."
797 println
798 fi
799 done
800 echo "$PROFILE_ID"
801}
802
803log_debug() {
804 if [ "$DEBUG" = "1" ]; then
805 printf "\033[30;1mDEBUG: %s\033[0m\n" "$*" >&2
806 fi
807}
808
809log_info() {
810 printf "INFO: %s\n" "$*" >&2
811}
812
813log_warn() {
814 printf "\033[33mWARN: %s\033[0m\n" "$*" >&2
815}
816
817log_error() {
818 printf "\033[31mERROR: %s\033[0m\n" "$*" >&2
819}
820
821print() {
822 format=$1
823 if [ $# -gt 0 ]; then
824 shift
825 fi
826 # shellcheck disable=SC2059
827 printf "$format" "$@" >&2
828}
829
830println() {
831 format=$1
832 if [ $# -gt 0 ]; then
833 shift
834 fi
835 # shellcheck disable=SC2059
836 printf "$format\n" "$@" >&2
837}
838
839doc() {
840 # shellcheck disable=SC2059
841 printf "\033[30;1m%s\033[0m\n" "$*" >&2
842}
843
844menu() {
845 while true; do
846 n=0
847 default=
848 for item in "$@"; do
849 case $((n%3)) in
850 0)
851 key=$item
852 if [ -z "$default" ]; then
853 default=$key
854 fi
855 ;;
856 1)
857 echo "$key) $item"
858 ;;
859 esac
860 n=$((n+1))
861 done
862 print "Choice (default=%s): " "$default"
863 read -r choice
864 if [ -z "$choice" ]; then
865 choice=$default
866 fi
867 n=0
868 for item in "$@"; do
869 case $((n%3)) in
870 0)
871 key=$item
872 ;;
873 2)
874 if [ "$key" = "$choice" ]; then
875 if ! "$item"; then
876 log_error "$item: exit $?"
877 fi
878 break 2
879 fi
880 ;;
881 esac
882 n=$((n+1))
883 done
884 echo "Invalid choice"
885 done
886}
887
888ask_bool() {
889 msg=$1
890 default=$2
891 case $default in
892 true)
893 msg="$msg [Y|n]: "
894 ;;
895 false)
896 msg="$msg [y|N]: "
897 ;;
898 *)
899 msg="$msg (y/n): "
900 esac
901 while true; do
902 print "%s" "$msg"
903 read -r answer
904 if [ -z "$answer" ]; then
905 answer=$default
906 fi
907 case $answer in
908 y|Y|yes|YES|true)
909 echo "true"
910 return 0
911 ;;
912 n|N|no|NO|false)
913 echo "false"
914 return 0
915 ;;
916 *)
917 echo "Invalid input, use yes or no"
918 ;;
919 esac
920 done
921}
922
923detect_endiannes() {
924 if ! hexdump /dev/null 2>/dev/null; then
925 # Some firmwares do not contain hexdump, for those, try to detect endianness
926 # differently.
927 case $(cat /proc/cpuinfo) in
928 *BCM5300*)
929 # RT-AC66U does not support Merlin version over 380.70 which
930 # lacks hexdump command.
931 echo "le"
932 ;;
933 *)
934 log_error "Cannot determine endianness"
935 return 1
936 ;;
937 esac
938 return 0
939 fi
940 case $(hexdump -s 5 -n 1 -e '"%x"' /bin/sh | head -c1) in
941 1)
942 echo "le"
943 ;;
944 2)
945 echo ""
946 ;;
947 esac
948}
949
950detect_goarch() {
951 if [ "$FORCE_GOARCH" ]; then
952 echo "$FORCE_GOARCH"; return 0
953 fi
954 case $(uname -m) in
955 x86_64|amd64)
956 echo "amd64"
957 ;;
958 i386|i686)
959 echo "386"
960 ;;
961 arm)
962 # FreeBSD does not include arm version
963 case "$(sysctl -b hw.model 2>/dev/null)" in
964 *A9*)
965 echo "armv7"
966 ;;
967 *)
968 # Unknown version, fallback to the lowest
969 echo "armv5"
970 ;;
971 esac
972 ;;
973 armv5*)
974 echo "armv5"
975 ;;
976 armv6*|armv7*)
977 if grep -q vfp /proc/cpuinfo 2>/dev/null; then
978 echo "armv$(uname -m | sed -e 's/[[:alpha:]]//g')"
979 else
980 # Soft floating point
981 echo "armv5"
982 fi
983 ;;
984 aarch64)
985 case "$(uname -o 2>/dev/null)" in
986 ASUSWRT-Merlin*)
987 # XXX when using arm64 build on ASUS AC66U and ACG86U, we get Go error:
988 # "out of memory allocating heap arena metadata".
989 echo "armv7"
990 ;;
991 *)
992 echo "arm64"
993 ;;
994 esac
995 ;;
996 armv8*|arm64)
997 echo "arm64"
998 ;;
999 mips*)
1000 # TODO: detect hardfloat
1001 echo "$(uname -m)$(detect_endiannes)_softfloat"
1002 ;;
1003 *)
1004 log_error "Unsupported GOARCH: $(uname -m)"
1005 return 1
1006 ;;
1007 esac
1008}
1009
1010detect_goos() {
1011 if [ "$FORCE_GOOS" ]; then
1012 echo "$FORCE_GOOS"; return 0
1013 fi
1014 case $(uname -s) in
1015 Linux)
1016 echo "linux"
1017 ;;
1018 Darwin)
1019 echo "darwin"
1020 ;;
1021 FreeBSD)
1022 echo "freebsd"
1023 ;;
1024 NetBSD)
1025 echo "netbsd"
1026 ;;
1027 OpenBSD)
1028 echo "openbsd"
1029 ;;
1030 *)
1031 log_error "Unsupported GOOS: $(uname -s)"
1032 return 1
1033 esac
1034}
1035
1036detect_os() {
1037 if [ "$FORCE_OS" ]; then
1038 echo "$FORCE_OS"; return 0
1039 fi
1040 case $(uname -s) in
1041 Linux)
1042 case $(uname -o) in
1043 GNU/Linux|Linux)
1044 if grep -q -e '^EdgeRouter' -e '^UniFiSecurityGateway' /etc/version 2> /dev/null; then
1045 echo "edgeos"; return 0
1046 fi
1047 if uname -u 2>/dev/null | grep -q '^synology'; then
1048 echo "synology"; return 0
1049 fi
1050 # shellcheck disable=SC1091
1051 dist=$(. /etc/os-release; echo "$ID")
1052 case $dist in
1053 ubios)
1054 if [ -z "$(command -v podman)" ]; then
1055 log_error "This version of UnifiOS is not supported. Make sure you run version 1.7.0 or above."
1056 return 1
1057 fi
1058 echo "$dist"; return 0
1059 ;;
1060 debian|ubuntu|elementary|raspbian|centos|fedora|rhel|arch|manjaro|openwrt|clear-linux-os|linuxmint|opensuse-tumbleweed|opensuse-leap|opensuse|solus|pop|neon|overthebox|sparky|vyos|void|alpine|Deepin|gentoo|steamos)
1061 echo "$dist"; return 0
1062 ;;
1063 esac
1064 # shellcheck disable=SC1091
1065 for dist in $(. /etc/os-release; echo "$ID_LIKE"); do
1066 case $dist in
1067 debian|ubuntu|rhel|fedora|openwrt)
1068 log_debug "Using ID_LIKE"
1069 echo "$dist"; return 0
1070 ;;
1071 esac
1072 done
1073 ;;
1074 ASUSWRT-Merlin*)
1075 echo "asuswrt-merlin"; return 0
1076 ;;
1077 DD-WRT)
1078 echo "ddwrt"; return 0
1079 esac
1080 ;;
1081 Darwin)
1082 echo "darwin"; return 0
1083 ;;
1084 FreeBSD)
1085 if [ -f /etc/platform ]; then
1086 case $(cat /etc/platform) in
1087 pfSense)
1088 echo "pfsense"; return 0
1089 ;;
1090 esac
1091 fi
1092 if [ -x /usr/local/sbin/opnsense-version ]; then
1093 case $(/usr/local/sbin/opnsense-version -N) in
1094 OPNsense)
1095 echo "opnsense"; return 0
1096 ;;
1097 esac
1098 fi
1099 echo "freebsd"; return 0
1100 ;;
1101 NetBSD)
1102 echo "netbsd"; return 0
1103 ;;
1104 OpenBSD)
1105 echo "openbsd"; return 0
1106 ;;
1107 *)
1108 esac
1109 log_error "Unsupported OS: $(uname -o) $(grep ID "/etc/os-release" 2>/dev/null | xargs)"
1110 return 1
1111}
1112
1113guess_host_type() {
1114 if [ -d /data/unifi ]; then
1115 # Special case when installer is run from inside the ubios podman
1116 echo "router"; return 0
1117 fi
1118
1119 case $OS in
1120 pfsense|opnsense|openwrt|asuswrt-merlin|edgeos|ddwrt|synology|overthebox|ubios)
1121 echo "router"
1122 ;;
1123 darwin|steamos)
1124 echo "workstation"
1125 ;;
1126 *)
1127 echo "unsure"
1128 ;;
1129 esac
1130}
1131
1132asroot() {
1133 # Some platform (Merlin) do not have the "id" command and $USER report a non root username with uid 0.
1134 if [ "$(grep '^Uid:' /proc/$$/status 2>/dev/null|cut -f2)" = "0" ] || [ "$USER" = "root" ] || [ "$(id -u 2>/dev/null)" = "0" ]; then
1135 "$@"
1136 elif [ "$(command -v sudo 2>/dev/null)" ]; then
1137 sudo "$@"
1138 else
1139 echo "Root required"
1140 su -m root -c "$*"
1141 fi
1142}
1143
1144silent_exec() {
1145 if [ "$DEBUG" = 1 ]; then
1146 "$@"
1147 else
1148 if ! out=$("$@" 2>&1); then
1149 rt=$?
1150 println "\033[30;1m%s\033[0m" "$out"
1151 return $rt
1152 fi
1153 fi
1154}
1155
1156bin_location() {
1157 case $OS in
1158 centos|fedora|rhel|debian|ubuntu|elementary|raspbian|arch|manjaro|clear-linux-os|linuxmint|opensuse-tumbleweed|opensuse-leap|opensuse|solus|pop|neon|sparky|vyos|void|alpine|Deepin|gentoo)
1159 echo "/usr/bin/nextdns"
1160 ;;
1161 openwrt|overthebox)
1162 echo "/usr/sbin/nextdns"
1163 ;;
1164 synology)
1165 echo "/usr/local/bin/nextdns"
1166 ;;
1167 darwin)
1168 echo "$(brew --prefix 2>/dev/null || echo /usr/local)/bin/nextdns"
1169 ;;
1170 asuswrt-merlin|ddwrt)
1171 echo "/jffs/nextdns/nextdns"
1172 ;;
1173 freebsd|pfsense|opnsense|netbsd|openbsd)
1174 echo "/usr/local/sbin/nextdns"
1175 ;;
1176 edgeos)
1177 echo "/config/nextdns/nextdns"
1178 ;;
1179 ubios)
1180 echo "/data/nextdns"
1181 ;;
1182 steamos)
1183 echo "$HOME/.local/bin/nextdns"
1184 ;;
1185 *)
1186 log_error "Unknown bin location for $OS"
1187 ;;
1188 esac
1189}
1190
1191is_version_current() {
1192 case "$INSTALL_RELEASE" in
1193 */*)
1194 # Snapshot
1195 hash=${INSTALL_RELEASE#*/}
1196 test "0.0.0-$hash" = "$CURRENT_RELEASE"
1197 ;;
1198 *)
1199 test "$INSTALL_RELEASE" = "$CURRENT_RELEASE"
1200 ;;
1201 esac
1202}
1203
1204get_current_release() {
1205 if [ -x "$NEXTDNS_BIN" ]; then
1206 $NEXTDNS_BIN version|cut -d' ' -f 3
1207 fi
1208}
1209
1210get_release() {
1211 if [ "$NEXTDNS_VERSION" ]; then
1212 echo "$NEXTDNS_VERSION"
1213 else
1214 for cmd in curl wget openssl true; do
1215 # command is the "right" way but may be compiled out of busybox shell
1216 ! command -v $cmd > /dev/null 2>&1 || break
1217 ! which $cmd > /dev/null 2>&1 || break
1218 done
1219 case "$cmd" in
1220 curl) cmd="curl -A curl -s" ;;
1221 wget) cmd="wget -qO- -U curl" ;;
1222 openssl) cmd="openssl_get" ;;
1223 *)
1224 log_error "Cannot retrieve latest version"
1225 return
1226 ;;
1227 esac
1228 v=$($cmd "https://api.github.com/repos/nextdns/nextdns/releases/latest" | \
1229 grep '"tag_name":' | esed 's/.*"([^"]+)".*/\1/' | sed -e 's/^v//')
1230 if [ -z "$v" ]; then
1231 log_error "Cannot get latest version: $out"
1232 fi
1233 echo "$v"
1234 fi
1235}
1236
1237esed() {
1238 if (echo | sed -E '' >/dev/null 2>&1); then
1239 sed -E "$@"
1240 else
1241 sed -r "$@"
1242 fi
1243}
1244
1245http_redirect() {
1246 while read -r header; do
1247 case $header in
1248 Location:*)
1249 echo "${header#Location: }"
1250 return
1251 ;;
1252 esac
1253 if [ "$header" = "" ]; then
1254 break
1255 fi
1256 done
1257 cat > /dev/null
1258 return 1
1259}
1260
1261http_body() {
1262 sed -n '/^\r/,$p' | sed 1d
1263}
1264
1265openssl_get() {
1266 host=${1#https://*} # https://dom.com/path -> dom.com/path
1267 path=/${host#*/} # dom.com/path -> /path
1268 host=${host%$path} # dom.com/path -> dom.com
1269 printf "GET %s HTTP/1.0\nHost: %s\nUser-Agent: curl\n\n" "$path" "$host" |
1270 openssl s_client -quiet -connect "$host:443" 2>/dev/null
1271}
1272
1273umask 0022
1274main
1275#+end_src
blog/index.org +25
@@ -4,7 +4,12 @@
4Use =C-f= to search blog post titles for keywords. 4Use =C-f= to search blog post titles for keywords.
5 5
6* 2023 6* 2023
7:PROPERTIES:
8:ID: 21779F03-E65E-4A80-A958-3D08723EB8AD
9:PUBDATE: 2023-12-03 Sun 22:35
10:END:
7 11
12- 2023-12-03 [[./2023-12-03-unifi-nextdns.org][Installing NextDNS on the Unifi Dream Machine]]
8- 2023-11-08 [[./2023-11-08-scli.org][Installing scli on Alpine Linux (musl)]] 13- 2023-11-08 [[./2023-11-08-scli.org][Installing scli on Alpine Linux (musl)]]
9- 2023-10-17 [[./2023-10-17-self-hosting-anonymousoverflow.org][Self-Hosting AnonymousOverflow]] 14- 2023-10-17 [[./2023-10-17-self-hosting-anonymousoverflow.org][Self-Hosting AnonymousOverflow]]
10- 2023-10-15 [[./2023-10-15-alpine-ssh-hardening.org][SSH Hardening for Alpine Linux]] 15- 2023-10-15 [[./2023-10-15-alpine-ssh-hardening.org][SSH Hardening for Alpine Linux]]
@@ -33,6 +38,10 @@ Use =C-f= to search blog post titles for keywords.
33- 2023-01-03 [[./2023-01-03-recent-website-changes.org][Recent Website Changes]] 38- 2023-01-03 [[./2023-01-03-recent-website-changes.org][Recent Website Changes]]
34 39
35* 2022 40* 2022
41:PROPERTIES:
42:ID: 3B281087-A3B6-46B7-8A29-77F74DAD5F15
43:PUBDATE: 2023-12-03 Sun 22:35
44:END:
36 45
37- 2022-12-23 [[./2022-12-23-alpine-desktop.org][Alpine Linux as a Desktop OS]] 46- 2022-12-23 [[./2022-12-23-alpine-desktop.org][Alpine Linux as a Desktop OS]]
38- 2022-12-17 [[./2022-12-17-st.org][Simple Terminal]] 47- 2022-12-17 [[./2022-12-17-st.org][Simple Terminal]]
@@ -76,6 +85,10 @@ Use =C-f= to search blog post titles for keywords.
76- 2022-02-10 [[./2022-02-10-leaving-the-office.org][Leaving Office-Based Work In the Past]] 85- 2022-02-10 [[./2022-02-10-leaving-the-office.org][Leaving Office-Based Work In the Past]]
77 86
78* 2021 87* 2021
88:PROPERTIES:
89:ID: 7603D51F-513F-4407-9CDC-F55C555D35D4
90:PUBDATE: 2023-12-03 Sun 22:35
91:END:
79 92
80- 2021-12-04 [[./2021-12-04-cisa.org][I Passed the CISA!]] 93- 2021-12-04 [[./2021-12-04-cisa.org][I Passed the CISA!]]
81- 2021-10-09 [[./2021-10-09-apache-redirect.org][Apache Redirect HTML Files to a Directory]] 94- 2021-10-09 [[./2021-10-09-apache-redirect.org][Apache Redirect HTML Files to a Directory]]
@@ -95,6 +108,10 @@ Use =C-f= to search blog post titles for keywords.
95- 2021-01-01 [[./2021-01-01-seum.org][SEUM: Speedrunners from Hell]] 108- 2021-01-01 [[./2021-01-01-seum.org][SEUM: Speedrunners from Hell]]
96 109
97* 2020 110* 2020
111:PROPERTIES:
112:ID: 8442803D-FB00-498D-9936-51029E80B367
113:PUBDATE: 2023-12-03 Sun 22:35
114:END:
98 115
99- 2020-12-29 [[./2020-12-29-zork.org][Zork: Let's Explore a Classic]] 116- 2020-12-29 [[./2020-12-29-zork.org][Zork: Let's Explore a Classic]]
100- 2020-12-28 [[./2020-12-28-neon-drive.org][Neon Drive: A Nostalgic 80s Arcade Racing Game]] 117- 2020-12-28 [[./2020-12-28-neon-drive.org][Neon Drive: A Nostalgic 80s Arcade Racing Game]]
@@ -115,6 +132,10 @@ Use =C-f= to search blog post titles for keywords.
115- 2020-01-25 [[./2020-01-25-linux-software.org][Linux Software]] 132- 2020-01-25 [[./2020-01-25-linux-software.org][Linux Software]]
116 133
117* 2019 134* 2019
135:PROPERTIES:
136:ID: CC0E4E85-6094-48AD-B78A-68DE97E56A17
137:PUBDATE: 2023-12-03 Sun 22:35
138:END:
118 139
119- 2019-12-16 [[./2019-12-16-password-security.org][Password Security]] 140- 2019-12-16 [[./2019-12-16-password-security.org][Password Security]]
120- 2019-12-03 [[./2019-12-03-the-ansoff-matrix.org][The Ansoff Matrix]] 141- 2019-12-03 [[./2019-12-03-the-ansoff-matrix.org][The Ansoff Matrix]]
@@ -122,6 +143,10 @@ Use =C-f= to search blog post titles for keywords.
122- 2019-01-07 [[./2019-01-07-useful-css.org][Useful CSS Snippets]] 143- 2019-01-07 [[./2019-01-07-useful-css.org][Useful CSS Snippets]]
123 144
124* 2018 145* 2018
146:PROPERTIES:
147:ID: 4FE32AD6-AC36-43DD-ACEF-B2D98450FB2D
148:PUBDATE: 2023-12-03 Sun 22:35
149:END:
125 150
126- 2018-12-08 [[./2018-12-08-aes-encryption.org][AES Encryption]] 151- 2018-12-08 [[./2018-12-08-aes-encryption.org][AES Encryption]]
127- 2018-11-28 [[./2018-11-28-cpp-compiler.org][The C++ Compiler]] 152- 2018-11-28 [[./2018-11-28-cpp-compiler.org][The C++ Compiler]]
blog/rss.org +1 −1
@@ -1,5 +1,6 @@
1#+TITLE: cleberg.net 1#+TITLE: cleberg.net
2 2
3- [[file:2023-12-03-unifi-nextdns.org][How to Install NextDNS on the Unifi Dream Machine]]
3- [[file:2021-03-28-vaporwave-vs-outrun.org][2021-03-28-vaporwave-vs-outrun]] 4- [[file:2021-03-28-vaporwave-vs-outrun.org][2021-03-28-vaporwave-vs-outrun]]
4- [[file:2023-06-23-self-hosting-convos-irc.org][2023-06-23-self-hosting-convos-irc]] 5- [[file:2023-06-23-self-hosting-convos-irc.org][2023-06-23-self-hosting-convos-irc]]
5- [[file:2020-07-26-business-analysis.org][Algorithmically Analyzing Local Businesses]] 6- [[file:2020-07-26-business-analysis.org][Algorithmically Analyzing Local Businesses]]
@@ -66,7 +67,6 @@
66- [[file:2022-02-20-nginx-caching.org][2022-02-20-nginx-caching]] 67- [[file:2022-02-20-nginx-caching.org][2022-02-20-nginx-caching]]
67- [[file:2022-08-31-privacy.com-changes.org][2022-08-31-privacy.com-changes]] 68- [[file:2022-08-31-privacy.com-changes.org][2022-08-31-privacy.com-changes]]
68- [[file:2022-03-02-note-taking.org][2022-03-02-note-taking]] 69- [[file:2022-03-02-note-taking.org][2022-03-02-note-taking]]
69- [[file:2023-11-12-consolefonts.org][2023-11-12-consolefonts]]
70- [[file:2021-04-28-photography.org][2021-04-28-photography]] 70- [[file:2021-04-28-photography.org][2021-04-28-photography]]
71- [[file:2020-09-22-internal-audit.org][What is Internal Audit?]] 71- [[file:2020-09-22-internal-audit.org][What is Internal Audit?]]
72- [[file:2022-07-25-curseradio.org][2022-07-25-curseradio]] 72- [[file:2022-07-25-curseradio.org][2022-07-25-curseradio]]