diff --git a/files/technitium_download.sh b/files/technitium_download.sh new file mode 100644 index 0000000..cfe6f79 --- /dev/null +++ b/files/technitium_download.sh @@ -0,0 +1,257 @@ +#!/bin/sh + +dotnetDir="/opt/dotnet" +dotnetVersion="10.0" +dotnetRuntime="Microsoft.AspNetCore.App 10.0." +dotnetUrl="https://dot.net/v1/dotnet-install.sh" + +if [ -d "/etc/dns/config" ] +then + dnsDir="/etc/dns" +else + dnsDir="/opt/technitium/dns" +fi + +dnsConfig="/etc/dns" +dnsLog="/var/log/technitium/dns" +dnsTar="$dnsDir/DnsServerPortable.tar.gz" +dnsUrl="https://download.technitium.com/dns/DnsServerPortable.tar.gz" + +serviceUser="dns-server" +installLog="$dnsDir/install.log" + +echo "" +echo "===============================" +echo "Technitium DNS Server Installer" +echo "===============================" +echo "" + +mkdir -p $dnsDir +mkdir -p $dnsConfig + +echo "" > $installLog + +if dotnet --list-runtimes 2> /dev/null | grep -q "$dotnetRuntime"; +then + dotnetFound="yes" +else + dotnetFound="no" +fi + +if [ ! -d $dotnetDir ] && [ "$dotnetFound" = "yes" ] +then + echo "ASP.NET Core Runtime is already installed." +else + if [ -d $dotnetDir ] && [ "$dotnetFound" = "yes" ] + then + dotnetUpdate="yes" + echo "Updating ASP.NET Core Runtime..." + else + dotnetUpdate="no" + echo "Installing ASP.NET Core Runtime..." + fi + + curl -sSL $dotnetUrl | bash /dev/stdin -c $dotnetVersion --runtime aspnetcore --no-path --install-dir $dotnetDir --verbose >> $installLog 2>&1 + + # On Alpine Linux dotnet requires libstdc++ + if command -v apk >/dev/null 2>&1 + then + echo "Installing ASP.NET Core Runtime dependencies..." + apk add --no-cache libstdc++ >> $installLog 2>&1 + fi + + if [ ! -f "/usr/bin/dotnet" ] + then + ln -s $dotnetDir/dotnet /usr/bin >> $installLog 2>&1 + fi + + if dotnet --list-runtimes 2> /dev/null | grep -q "$dotnetRuntime"; + then + if [ "$dotnetUpdate" = "yes" ] + then + echo "ASP.NET Core Runtime was updated successfully!" + else + echo "ASP.NET Core Runtime was installed successfully!" + fi + else + echo "Failed to install ASP.NET Core Runtime. Please check '$installLog' for details." + exit 1 + fi +fi + +echo "" +echo "Downloading Technitium DNS Server..." + +if ! curl -o $dnsTar --fail $dnsUrl >> $installLog 2>&1 +then + echo "Failed to download Technitium DNS Server from: $dnsUrl" + echo "Please check '$installLog' for details." + exit 1 +fi + +if [ -d $dnsConfig ] +then + echo "Updating Technitium DNS Server..." +else + echo "Installing Technitium DNS Server..." +fi + +tar -zxf $dnsTar -C $dnsDir >> $installLog 2>&1 + +echo "" + +if $( dotnet $dnsDir/DnsServerApp.dll --icu-test >> $installLog 2>&1 ) >/dev/null 2>&1; +then + echo "ICU package is already installed." +else + echo "Checking for required ICU package..." + + if command -v apt-get >/dev/null 2>&1; then + # Debian/Ubuntu based + if ! dpkg -l | grep -q "libicu"; then + echo "Installing required ICU package..." + apt-get update >> $installLog 2>&1 + + # Try to install the most common package name + if apt-cache show libicu74 >/dev/null 2>&1; then + echo "Installing libicu74 package..." + apt-get install -y libicu74 >> $installLog 2>&1 + elif apt-cache show libicu72 >/dev/null 2>&1; then + echo "Installing libicu72 package..." + apt-get install -y libicu72 >> $installLog 2>&1 + elif apt-cache show libicu70 >/dev/null 2>&1; then + echo "Installing libicu70 package..." + apt-get install -y libicu70 >> $installLog 2>&1 + else + # Fallback to a generic approach + echo "No specific libicu package was found, trying generic installation..." + apt-get install -y libicu* >> $installLog 2>&1 + fi + fi + elif command -v dnf >/dev/null 2>&1; then + # Fedora/RHEL based + if ! rpm -qa | grep -q "libicu"; then + echo "Installing required ICU package..." + dnf install -y libicu >> $installLog 2>&1 + fi + elif command -v yum >/dev/null 2>&1; then + # Older RHEL/CentOS systems + if ! rpm -qa | grep -q "libicu"; then + echo "Installing required ICU package..." + yum install -y libicu >> $installLog 2>&1 + fi + elif command -v zypper >/dev/null 2>&1; then + # openSUSE based + if ! rpm -qa | grep -q "libicu"; then + echo "Installing required ICU package..." + zypper install -y libicu >> $installLog 2>&1 + fi + elif command -v pacman >/dev/null 2>&1; then + # Arch based + if ! pacman -Q | grep -q "icu"; then + echo "Installing required ICU package..." + pacman -S --noconfirm icu >> $installLog 2>&1 + fi + elif command -v apk >/dev/null 2>&1; then + # Alpine Linux + if ! apk list --installed | grep -q "icu"; then + echo "Installing required ICU package..." + apk add --no-cache icu >> $installLog 2>&1 + fi + else + echo "Failed to install Technitium DNS Server: could not determine package manager to install ICU package. Please install ICU package manually and try again." + echo "Please read the 'Missing ICU Package' section in this blog post to understand how to manually install the ICU package for your distro: https://blog.technitium.com/2017/11/running-dns-server-on-ubuntu-linux.html" + exit 1 + fi + + #test again to confirm + if $( dotnet $dnsDir/DnsServerApp.dll --icu-test >> $installLog 2>&1 ) >/dev/null 2>&1; + then + echo "ICU package was installed successfully!" + else + echo "Failed to install Technitium DNS Server: failed to install ICU package. Please install ICU package manually and try again." + echo "Please read the 'Missing ICU Package' section in this blog post to understand how to manually install the ICU package for your distro: https://blog.technitium.com/2017/11/running-dns-server-on-ubuntu-linux.html" + exit 1 + fi +fi + +echo "" + +if [ "$(ps --no-headers -o comm 1 | tr -d '\n')" = "systemd" ] +then + if [ -f "/etc/systemd/system/dns.service" ] + then + echo "Configuring permissions..." + chown -R $serviceUser:$serviceUser $dnsDir $dnsConfig $dnsLog >> $installLog 2>&1 + + echo "Restarting systemd service..." + systemctl restart dns.service >> $installLog 2>&1 + else + mkdir -p $dnsLog + + echo "Configuring user and permissions..." + useradd --system -M --shell /usr/sbin/nologin --user-group $serviceUser >> $installLog 2>&1 + chown -R $serviceUser:$serviceUser $dnsDir $dnsConfig $dnsLog >> $installLog 2>&1 + + echo "Configuring systemd service..." + cp $dnsDir/systemd.service /etc/systemd/system/dns.service + systemctl enable dns.service >> $installLog 2>&1 + + systemctl stop systemd-resolved >> $installLog 2>&1 + systemctl disable systemd-resolved >> $installLog 2>&1 + + systemctl start dns.service >> $installLog 2>&1 + + if [ -f "/etc/NetworkManager/NetworkManager.conf" ] + then + currentVal=$(grep -F "dns=" /etc/NetworkManager/NetworkManager.conf) + + if [ "$currentVal" = "" ] + then + printf "\n[main]\ndns=none\n" >> /etc/NetworkManager/NetworkManager.conf 2>> $installLog + elif [ "$currentVal" != "dns=none" ] + then + sed -i "s/$currentVal/dns=none/g" /etc/NetworkManager/NetworkManager.conf 2>> $installLog + fi + fi + fi +elif [ -x "/sbin/rc-service" ] +then + if [ -f "/etc/init.d/dns" ] + then + echo "Configuring permissions..." + chown -R $serviceUser:$serviceUser $dnsDir $dnsConfig $dnsLog >> $installLog 2>&1 + + echo "Restarting OpenRC service..." + rc-service dns stop >> $installLog 2>&1 + rc-service dns start >> $installLog 2>&1 + else + mkdir -p $dnsLog + + echo "Configuring user and permissions..." + addgroup -S $serviceUser >> $installLog 2>&1 + adduser -H -S -D -s /bin/false -G $serviceUser $serviceUser >> $installLog 2>&1 + chown -R $serviceUser:$serviceUser $dnsDir $dnsConfig $dnsLog >> $installLog 2>&1 + + echo "Configuring OpenRC service..." + cp $dnsDir/openrc.service /etc/init.d/dns + chmod +x /etc/init.d/dns + rc-update add dns >> $installLog 2>&1 + rc-service dns start >> $installLog 2>&1 + fi +else + echo "Failed to install Technitium DNS Server: systemd/openrc was not detected." + echo "Please read the 'Installing DNS Server Manually' section in this blog post to understand how to manually install the DNS server on your distro: https://blog.technitium.com/2017/11/running-dns-server-on-ubuntu-linux.html" + exit 1 +fi 2>/dev/null + +cp -a /etc/resolv.conf $dnsDir/resolv.conf.bak >> $installLog 2>&1 +rm /etc/resolv.conf >> $installLog 2>&1 +printf "# Generated by Technitium DNS Server Installer\n\nnameserver 127.0.0.1\n" > /etc/resolv.conf 2>> $installLog + +echo "" +echo "Technitium DNS Server was installed successfully!" +echo "Open http://$(cat /proc/sys/kernel/hostname):5380/ to access the web console." +echo "" +echo "Donate! Make a contribution by becoming a Patron: https://www.patreon.com/technitium" +echo "" diff --git a/playbooks/archlinux-servers.yml b/playbooks/archlinux-servers.yml index c796a3d..d139dc2 100644 --- a/playbooks/archlinux-servers.yml +++ b/playbooks/archlinux-servers.yml @@ -33,4 +33,5 @@ # - hostname # - sudoers # - sshd - - podman + # - podman + - technitium diff --git a/playbooks/testing.yml b/playbooks/testing.yml new file mode 100644 index 0000000..139180c --- /dev/null +++ b/playbooks/testing.yml @@ -0,0 +1,10 @@ +# code: language=ansible + +- name: Configure ssh and firewall + hosts: + - localhost + gather_facts: false + become: false + + roles: + - technitium diff --git a/roles/technitium/tasks/main.yml b/roles/technitium/tasks/main.yml new file mode 100644 index 0000000..0862a9d --- /dev/null +++ b/roles/technitium/tasks/main.yml @@ -0,0 +1,34 @@ +# code: language=ansible + +- name: Get latest release of technitium from GitHub API + ansible.builtin.uri: + url: https://api.github.com/repos/TechnitiumSoftware/DnsServer/releases/latest + register: technitium_version_response + +- name: Parse version from GitHub API response + ansible.builtin.set_fact: + technitium_version: "{{ technitium_version_response.json.tag_name }}" + technitium_version_numeric: "{{ technitium_version_response.json.tag_name | regex_replace('^v', '') }}" + +- name: Debug technitium version + ansible.builtin.debug: + msg: | + Latest Technitium release version is {{ technitium_version }} ({{ technitium_version_numeric }}) + +- name: Get release hash + ansible.builtin.uri: + return_content: true + url: https://download.technitium.com/dns/archive/{{ technitium_version_numeric }}/DnsServerPortable.tar.gz.sha256 + register: technitium_hash_response + +- name: Debug release hash + ansible.builtin.debug: + var: technitium_hash_response.content + +- name: Download release + ansible.builtin.get_url: + checksum: "sha256:{{ technitium_hash_response.content }}" + decompress: true + dest: /tmp/technitium_{{ technitium_version }}.tar + mode: '0644' + url: https://download.technitium.com/dns/archive/{{ technitium_version_numeric }}/DnsServerPortable.tar.gz diff --git a/roles/technitium/vars/main.yml b/roles/technitium/vars/main.yml new file mode 100644 index 0000000..f4366fe --- /dev/null +++ b/roles/technitium/vars/main.yml @@ -0,0 +1 @@ +# code: language=ansible