Skip to content

Instantly share code, notes, and snippets.

@don-rumata
Last active September 17, 2019 07:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save don-rumata/583910f73fcfc48d3d09cdefb7f8a013 to your computer and use it in GitHub Desktop.
Save don-rumata/583910f73fcfc48d3d09cdefb7f8a013 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
# WORK
# LANG=ru_RU.UTF-8
# Собираем ГОТОВЫЙ бинарник coredns в пакет для установки с помощью fpm. Он уже должен быть установлен.
# https://github.com/jordansissel/fpm
# https://fpm.readthedocs.io/en/latest/installing.html
MAIN_SERVER="10.10.10.10"
WEB_SERVER="$MAIN_SERVER"
WEB_NAME_OF_MODULE_FOR_SOFT="soft"
PACKAGE_NAME="coredns"
PACKAGE_USER="$PACKAGE_NAME"
PACKAGE_GROUP="$PACKAGE_NAME"
PACKAGE_VERSION="$(curl http://$WEB_SERVER/$WEB_NAME_OF_MODULE_FOR_SOFT/coredns/latest)"
# https://github.com/coredns/coredns/blob/master/LICENSE
PACKAGE_LICENSE="Apache License 2.0"
PACKAGE_CONFIG_DIR="/etc/coredns"
# PACKAGE_HOMEDIR="/var/lib/$PACKAGE_USER"
PACKAGE_CONFIG_FILE="Corefile"
PACKAGE_ARCHITECTURE="x86_64"
PACKAGE_MAINTAINER="don Rumata"
# https://github.com/coredns/coredns
PACKAGE_DESCRIPTION="CoreDNS is a DNS server/forwarder, written in Go, that chains plugins. Each plugin performs a (DNS) function."
PACKAGE_URL="https://github.com/coredns/coredns"
PACKAGE_WORKDIR="/tmp/$PACKAGE_NAME"
PACKAGE_SCRIPT_BEFORE_INSTALL="$PACKAGE_NAME-before-install.sh"
PACKAGE_SCRIPT_AFTER_INSTALL="$PACKAGE_NAME-after-install.sh"
PACKAGE_FORMAT="rpm"
# Создаём и переходим в папку, где будет твориться магия^W сборка.
mkdir -p "$PACKAGE_WORKDIR" && cd "$PACKAGE_WORKDIR" || exit 1
# Для бинарника.
mkdir -p ./usr/bin
# Для файла настроек.
mkdir -p ./"$PACKAGE_CONFIG_DIR"
# Для юнита systemd.
mkdir -p ./usr/lib/systemd/system
# Для временных скриптов, которых пока один.
mkdir -p ./"$PACKAGE_WORKDIR"
#--- Бинарник ---#
cd ./usr/bin
wget "http://$WEB_SERVER/$WEB_NAME_OF_MODULE_FOR_SOFT/coredns/coredns_latest_linux_$(arch).tgz" || exit 1
tar -xvf coredns_latest_linux_x86_64.tgz
rm coredns_latest_linux_x86_64.tgz
cd "$PACKAGE_WORKDIR"
#----------------#
#--- Создаём скрипт, который будет создавать нам ограниченную системную учётку. ---#
cd ./"$PACKAGE_WORKDIR"
cat > "$PACKAGE_SCRIPT_BEFORE_INSTALL" << EOF
#! /bin/bash
adduser --system --shell /sbin/nologin --comment 'CoreDNS user' $PACKAGE_USER
# --home-dir $PACKAGE_HOMEDIR
groupadd $PACKAGE_GROUP
usermod -g $PACKAGE_GROUP $PACKAGE_USER
# mkdir $PACKAGE_HOMEDIR
# chown $PACKAGE_USER:$PACKAGE_GROUP $PACKAGE_HOMEDIR
# chmod 775 $PACKAGE_HOMEDIR
EOF
chmod +x "$PACKAGE_SCRIPT_BEFORE_INSTALL"
cd "$PACKAGE_WORKDIR"
#----------------------------------------------------------------------------------#
#--- Создаём скрипт, который будет конфигурить сервис сразу после его установки. ---#
cd ./"$PACKAGE_WORKDIR"
cat > "$PACKAGE_SCRIPT_AFTER_INSTALL" << EOF
#! /bin/bash
systemctl enable coredns.service
systemctl start coredns.service
EOF
chmod +x "$PACKAGE_SCRIPT_AFTER_INSTALL"
cd "$PACKAGE_WORKDIR"
#---------------------------------------------------------------------------------------#
#--- Простейший пример конфига, который работает (проверял на 7-м Центе). Да. Начинается с ".:53". ---#
cd ./"$PACKAGE_CONFIG_DIR"
cat > "$PACKAGE_CONFIG_FILE" << EOF
.:53
{
forward . 8.8.8.8 1.1.1.1 {
}
cache {
success 5000
denial 2500
}
log . {combined} {
class denial error
}
errors
cancel
}
EOF
cd "$PACKAGE_WORKDIR"
#-----------------------------------------------------------------------------------------------------#
#--- SystemD Unit ---#
cd ./usr/lib/systemd/system
wget --output-document coredns.service "http://$WEB_SERVER/$WEB_NAME_OF_MODULE_FOR_SOFT/coredns/coredns.service" || exit 1
cd "$PACKAGE_WORKDIR"
#--------------------#
#--- BUILD ---#
cd "$PACKAGE_WORKDIR"
# Внимание на "./", потому что относительные пути очень важны!
# https://www.debian.org/doc/manuals/maint-guide/dother.ru.html#conffiles
fpm --force \
--name "$PACKAGE_NAME" \
--version "$PACKAGE_VERSION" \
--license "$PACKAGE_LICENSE" \
--config-files ./"$PACKAGE_CONFIG_DIR"/"$PACKAGE_CONFIG_FILE" \
--architecture "$PACKAGE_ARCHITECTURE" \
--maintainer "$PACKAGE_MAINTAINER" \
--description "$PACKAGE_DESCRIPTION" \
--url "$PACKAGE_URL" \
--before-install ./"$PACKAGE_WORKDIR"/"$PACKAGE_SCRIPT_BEFORE_INSTALL" \
--after-install ./"$PACKAGE_WORKDIR"/"$PACKAGE_SCRIPT_AFTER_INSTALL" \
--no-depends \
--no-auto-depends \
--input-type dir --output-type "$PACKAGE_FORMAT" ./
#-------------#
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment