From f058216162806d6f8277ec7640bc852c5838c817 Mon Sep 17 00:00:00 2001 From: Illia Chub Date: Fri, 11 Sep 2020 15:11:17 +0300 Subject: [PATCH 1/5] Installation script enchansements --- static/mkpasswd | Bin 0 -> 22352 bytes static/server.sh | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100755 static/mkpasswd diff --git a/static/mkpasswd b/static/mkpasswd new file mode 100755 index 0000000000000000000000000000000000000000..595c924476b6f8a3d139018a6593d5eacaece115 GIT binary patch literal 22352 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 fi + PASSWORD=$( mkpasswd -m sha-512 "$PASSWORD" ) wget https://selfprivacy.org/configuration.nix wget https://selfprivacy.org/mailserver.nix wget https://selfprivacy.org/goss.nix wget https://selfprivacy.org/goss.yaml wget https://selfprivacy.org/restic.nix + wget https://selfprivacy.org/mkpasswd wget https://selfprivacy.org/s3cli chmod +x s3cli } @@ -30,7 +32,7 @@ CollectData() read -p "Please, paste your AWS Access Key ID: " AWS_TOKEN_ID read -p "Please, define your domain there: " DOMAIN read -p "Please, define your mail username: " USERNAME - read -p "Please, define your password: " PASSWORD && PASSWORD=$( mkpasswd -m sha-512 "$PASSWORD" ) + read -p "Please, define your password: " PASSWORD && if [ -x "$(command -v mkpasswd)" ]; then PASSWORD=$( mkpasswd -m sha-512 "$PASSWORD" ) fi } # Generate SSH key From 2624cc335ab662a82d1c851b1c723aa8fa1d3aa5 Mon Sep 17 00:00:00 2001 From: Illia Chub Date: Fri, 11 Sep 2020 15:17:08 +0300 Subject: [PATCH 2/5] Installation script enchansements --- static/server.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/static/server.sh b/static/server.sh index c35b7fa..c65cf87 100755 --- a/static/server.sh +++ b/static/server.sh @@ -23,6 +23,8 @@ InstallDependencies() wget https://selfprivacy.org/mkpasswd wget https://selfprivacy.org/s3cli chmod +x s3cli + chmod +x mkpasswd + PASSWORD=$( ./mkpasswd -m sha-512 "$PASSWORD" ) } CollectData() { From a8e3615f89753f551f09caa76d52d67bc02c41e5 Mon Sep 17 00:00:00 2001 From: Illia Chub Date: Fri, 11 Sep 2020 15:21:44 +0300 Subject: [PATCH 3/5] Installation script enchansements --- static/server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/server.sh b/static/server.sh index c65cf87..19cc33a 100755 --- a/static/server.sh +++ b/static/server.sh @@ -34,7 +34,7 @@ CollectData() read -p "Please, paste your AWS Access Key ID: " AWS_TOKEN_ID read -p "Please, define your domain there: " DOMAIN read -p "Please, define your mail username: " USERNAME - read -p "Please, define your password: " PASSWORD && if [ -x "$(command -v mkpasswd)" ]; then PASSWORD=$( mkpasswd -m sha-512 "$PASSWORD" ) fi + read -p "Please, define your password: " PASSWORD } # Generate SSH key From f3731f88504c022263a49c7d424ef0768a118618 Mon Sep 17 00:00:00 2001 From: Illia Chub Date: Sat, 12 Sep 2020 22:06:27 +0300 Subject: [PATCH 4/5] Installation script enchansements --- static/server.sh | 77 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 16 deletions(-) diff --git a/static/server.sh b/static/server.sh index 19cc33a..bcd9b4e 100755 --- a/static/server.sh +++ b/static/server.sh @@ -4,17 +4,17 @@ InstallDependencies() { - packagesNeeded='curl jq mkpasswd pwgen' - if [ -x "$(command -v apk)" ]; then sudo apk add --no-cache $packagesNeeded # Alpine Linux - elif [ -x "$(command -v apt-get)" ]; then sudo apt-get install curl jq whois pwgen # Debian/Ubuntu Linux - elif [ -x "$(command -v dnf)" ]; then sudo dnf install $packagesNeeded # Fedora Linux + packagesNeeded='curl jq pwgen vim nano' + if [ -x "$(command -v apk)" ]; then sudo apk add --no-cache $packagesNeeded # Alpine Linux + elif [ -x "$(command -v apt-get)" ]; then sudo apt-get install curl jq whois pwgen # Debian/Ubuntu Linux + elif [ -x "$(command -v dnf)" ]; then sudo dnf install $packagesNeeded # Fedora Linux elif [ -x "$(command -v rpm-ostree)" ]; then sudo rpm-ostree install $packagesNeeded # Fedora Linux Silverblue - elif [ -x "$(command -v zypper)" ]; then sudo zypper install $packagesNeeded # openSUSE Linux - elif [ -x "$(command -v pacman)" ]; then sudo pacman -S $packagesNeeded # Arch/Manjaro Linux - elif [ -x "$(command -v emerge)" ]; then sudo emerge --ask $packagesNeeded # Gentoo Linux - elif [ -x "$(command -v nix-env)" ]; then nix-env -iA $packagesNeeded # NixOS + elif [ -x "$(command -v zypper)" ]; then sudo zypper install $packagesNeeded # openSUSE Linux + elif [ -x "$(command -v pacman)" ]; then sudo pacman -S $packagesNeeded # Arch/Manjaro Linux + elif [ -x "$(command -v emerge)" ]; then sudo emerge --ask $packagesNeeded # Gentoo Linux + elif [ -x "$(command -v nix-env)" ]; then sudo nix-env -iA $packagesNeeded # NixOS + elif [ -x "$(command -v pkg)" ]; then sudo pkg install $packagesNeeded # FreeBSD else echo "FAILED TO INSTALL PACKAGE: Package manager not found. You must manually install: $packagesNeeded">&2; fi - PASSWORD=$( mkpasswd -m sha-512 "$PASSWORD" ) wget https://selfprivacy.org/configuration.nix wget https://selfprivacy.org/mailserver.nix wget https://selfprivacy.org/goss.nix @@ -24,7 +24,7 @@ InstallDependencies() wget https://selfprivacy.org/s3cli chmod +x s3cli chmod +x mkpasswd - PASSWORD=$( ./mkpasswd -m sha-512 "$PASSWORD" ) + export PASSWORD=$( ./mkpasswd -m sha-512 "$PASSWORD" ) } CollectData() { @@ -33,7 +33,7 @@ CollectData() read -p "Please, paste your AWS Secret Access Key: " AWS_TOKEN read -p "Please, paste your AWS Access Key ID: " AWS_TOKEN_ID read -p "Please, define your domain there: " DOMAIN - read -p "Please, define your mail username: " USERNAME + read -p "Please, define your mail username: " USER read -p "Please, define your password: " PASSWORD } @@ -63,11 +63,12 @@ MakeConfig() # Mailserver sed -i '15s/.*/ fqdn = "'$DOMAIN'";/' mailserver.nix sed -i '16s/.*/ domains = [ "'"$DOMAIN"'" ];/' mailserver.nix - sed -i '21s/.*/\t"'$USERNAME'@'$DOMAIN'" = {/' mailserver.nix - sed -i '22s/.*/\t hashedPassword = "'"$PASSWORD"'";/' mailserver.nix + sed -i '21s/.*/\t"'$USER'@'$DOMAIN'" = {/' mailserver.nix + #sed -i '22s/.*/\t hashedPassword = "'"$PASSWORD"'";/' mailserver.nix + sed -i "22s,.*,\t\ hashedPassword = \"${PASSWORD}\";," mailserver.nix sed -i '31s/.*/\t\t"'"$DOMAIN"'"/' mailserver.nix - sed -i '48s/.*/\t "admin@'"$DOMAIN"'" = "'"$USERNAME"'@'"$DOMAIN"'";/' mailserver.nix - sed -i '70s/.*/ email = "'"$USERNAME"'@'"$DOMAIN"'";/' mailserver.nix + sed -i '48s/.*/\t "admin@'"$DOMAIN"'" = "'"$USER"'@'"$DOMAIN"'";/' mailserver.nix + sed -i '70s/.*/ email = "'"$USER"'@'"$DOMAIN"'";/' mailserver.nix # System Configuration sed -i "16s,.*,\t\"${sshKey}\"," configuration.nix @@ -75,6 +76,7 @@ MakeConfig() # Restic sed -i '14s/.*/\t\tEnvironment = [ "AWS_ACCESS_KEY_ID='$AWS_TOKEN_ID'" "AWS_SECRET_ACCESS_KEY='$AWS_TOKEN'" ];/' restic.nix sed -i "17s,.*,\t restic -r s3:s3.amazonaws.com/${AWS_BUCKET_NAME} backup /var/vmail /var/vmail ," restic.nix + vim mailserver.nix } @@ -169,6 +171,9 @@ ClearTempFiles() rm mailserver.nix rm restic.nix rm s3cli + rm .dns_records.json + rm .records + rm mkpasswd exit 0 } @@ -182,6 +187,38 @@ GetZoneID() -H "Content-Type: application/json" > .cloudflare.json export zoneid=$( for i in {0..24}; do jq 'if .result['$i'].name == "'$DOMAIN'" then .result['$i'].id else null end' .cloudflare.json; done | grep -v null | sed -e 's/^"//' -e 's/"$//' ) } + +#Purge DNS records + +PurgeDNSRecords() +{ +curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records" \ + -H "Authorization: Bearer $CLOUDFLARE_TOKEN" \ + -H "Content-Type: application/json" > .dns_records.json + +for i in {0..24} +do +jq '.result['$i'].id' .dns_records.json +done | grep -v null | sed 's/"//g' > .records + +export recordIDs=() +while IFS= read -r line +do + recordIDs+=("$line") +done < .records + +for recordid in "${recordIDs[@]}" +do + echo $zoneid + echo $recordid + echo $CLOUDFLARE_TOKEN + curl -X DELETE "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/$recordid" \ + -H "Authorization: Bearer $CLOUDFLARE_TOKEN" \ + -H "Content-Type: application/json" +done + +} + # Create records CreateARecord() { @@ -279,6 +316,15 @@ printf "Waiting for nixos-infect to replace system files(this may take some time sleep 280 CreateS3Bucket GetMachineIP +read -p "ALL YOUR EXISTING DNS RECORDS ON CLOUDFLARE WILL BE REMOVED!!! ARE YOU SURE(y/N) " CREATEDNS +if [ $CREATEDNS != "y" || $CREATEDNS == "Y" ] +then +exit -1 +fi +printf "Purging records..." +PurgeDNSRecords +printf "done" +CreateARecord ApplyConfig if [ $RESTORE_MAILBACKUP == "y" ] then @@ -289,7 +335,6 @@ GetDKIM echo "Beginning CloudFlare configuration" GetZoneID printf "Creating records..." -CreateARecord CreateMXRecord CreateDMARCRecord CreateSPFRecord From 36b7c24b98b751d539153f7ddacdd8ae8bceb582 Mon Sep 17 00:00:00 2001 From: Illia Chub Date: Sun, 13 Sep 2020 10:20:17 +0300 Subject: [PATCH 5/5] Installation script enchansements --- static/server.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) mode change 100755 => 100644 static/server.sh diff --git a/static/server.sh b/static/server.sh old mode 100755 new mode 100644 index bcd9b4e..7c77a30 --- a/static/server.sh +++ b/static/server.sh @@ -4,7 +4,7 @@ InstallDependencies() { - packagesNeeded='curl jq pwgen vim nano' + packagesNeeded='curl jq pwgen nano' if [ -x "$(command -v apk)" ]; then sudo apk add --no-cache $packagesNeeded # Alpine Linux elif [ -x "$(command -v apt-get)" ]; then sudo apt-get install curl jq whois pwgen # Debian/Ubuntu Linux elif [ -x "$(command -v dnf)" ]; then sudo dnf install $packagesNeeded # Fedora Linux @@ -76,7 +76,7 @@ MakeConfig() # Restic sed -i '14s/.*/\t\tEnvironment = [ "AWS_ACCESS_KEY_ID='$AWS_TOKEN_ID'" "AWS_SECRET_ACCESS_KEY='$AWS_TOKEN'" ];/' restic.nix sed -i "17s,.*,\t restic -r s3:s3.amazonaws.com/${AWS_BUCKET_NAME} backup /var/vmail /var/vmail ," restic.nix - vim mailserver.nix + nano mailserver.nix }