FROM ubuntu:xenial AS nsd-builder
ARG NSD_VERSION=4.3.9
RUN apt-get update
RUN apt-get install -y git gcc make libssl-dev libevent-dev wget patch
RUN wget "https://www.nlnetlabs.nl/downloads/nsd/nsd-${NSD_VERSION}.tar.gz"
RUN wget "https://www.nlnetlabs.nl/downloads/nsd/nsd-${NSD_VERSION}.tar.gz.asc"
RUN tar -xf nsd-${NSD_VERSION}.tar.gz
WORKDIR /nsd-${NSD_VERSION}
RUN sed -i 's/XFRD_MAX_TCP 128/XFRD_MAX_TCP 50/' xfrd.h
RUN ./configure --prefix /install --with-nsd_conf_file=/etc/nsd/nsd.conf --with-libevent --enable-ratelimit-default-is-off
RUN make clean && make
RUN make install
WORKDIR /
RUN nsd-${NSD_VERSION}/nsd-control-setup.sh

FROM ubuntu:xenial AS environment-builder
RUN apt-get update
RUN apt-get install -y python2.7 python2.7-dev virtualenv gcc libmysqlclient-dev locales libpq-dev patch
RUN echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen && locale-gen && update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
RUN virtualenv -p python2.7 /opt/dns-hosting
COPY requirements.txt /opt/sources/requirements.txt
RUN /opt/dns-hosting/bin/pip install -U pip
RUN /opt/dns-hosting/bin/pip install -r /opt/sources/requirements.txt

FROM environment-builder AS application-builder
WORKDIR /install
COPY MANIFEST.in /opt/sources/MANIFEST.in
COPY setup.py /opt/sources/setup.py
COPY appcore /opt/sources/appcore
COPY dns_hosting /opt/sources/dns_hosting
RUN /opt/dns-hosting/bin/pip install --prefix=/install /opt/sources
COPY profiles/application*.yml /install/profiles/

FROM ubuntu:xenial AS dnsperf-builder
RUN apt-get update
RUN apt-get install -y git gcc make libbind-dev libkrb5-dev libcap-dev libssl-dev libxml2-dev libgeoip-dev
RUN git clone https://github.com/Sinodun/dnsperf-tcp.git && \
    cd dnsperf-tcp && \
    ./configure --prefix /install && \
    make clean && make && make install

FROM ubuntu:xenial AS base
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7FCD11186050CD1A && \
    echo "deb http://dist.yandex.ru/common stable/all/" > /etc/apt/sources.list.d/yandex.list && \
    echo "deb http://dist.yandex.net/yandex-xenial stable/all/" >> /etc/apt/sources.list.d/yandex.list && \
    echo "deb http://dist.yandex.net/yandex-xenial stable/amd64/" >> /etc/apt/sources.list.d/yandex.list
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7FCC7D46ACCC4CF8 && \
    echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" > /etc/apt/sources.list.d/postgres.list
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E1DD270288B4E6030699E45FA1715D88E1DF1F24 && \
    echo "deb http://ppa.launchpad.net/git-core/ppa/ubuntu xenial main" > /etc/apt/sources.list.d/git-core.list
RUN apt-get update && apt-get install -y \
    curl \
    dnstop \
    dnsutils \
    gdb \
    git \
    htop \
    iptables \
    iputils-ping \
    libbind9-140 \
    libcap2 \
    libevent-2.0-5 \
    libgeoip1 \
    libidn2-0 \
    libkrb5-3 \
    libmysqlclient20 \
    libpython2.7 \
    libssl1.0.0 \
    libxml2 \
    locales \
    lsof \
    nmap \
    net-tools \
    postgresql-client-10 \
    ssh \
    statbox-push-client-daemon \
    strace \
    sudo \
    supervisor \
    tcpdump \
    telnet \
    unzip \
    vim \
    wget \
    && rm -rf /var/lib/apt/lists/*
RUN echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen && \
    locale-gen && \
    update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
COPY --from=nsd-builder /install /
COPY --from=dnsperf-builder /install /opt/dns-hosting
COPY docker/base /opt/dns-hosting
RUN chmod +x /opt/dns-hosting/bin/prepare.sh
EXPOSE 8300 8301 8301/udp

FROM base AS base-rtc
COPY docker/base-rtc /opt/dns-hosting
COPY --from=environment-builder /opt/dns-hosting /opt/dns-hosting
COPY --from=application-builder /install /opt/dns-hosting

FROM base AS base-qloud
COPY docker/base-qloud /opt/dns-hosting
COPY --from=environment-builder /opt/dns-hosting /opt/dns-hosting
COPY --from=application-builder /install /opt/dns-hosting
ENTRYPOINT ["/usr/bin/env", "bash", "/opt/dns-hosting/bin/prepare.sh"]

FROM base AS base-deploy
COPY docker/base-deploy /opt/dns-hosting
COPY --from=environment-builder /opt/dns-hosting /opt/dns-hosting
COPY --from=application-builder /install /opt/dns-hosting
#ENTRYPOINT ["/usr/bin/env", "bash", "/opt/dns-hosting/bin/prepare.sh"]
CMD ["/usr/bin/supervisord", "-n"]

FROM base-deploy AS dns-server-nsd
COPY docker/dns-server-nsd/usr/bin /usr/bin
COPY docker/dns-server-nsd /opt/dns-hosting
COPY dns_hosting/zonetracker_simplified/tracker.py /opt/dns-hosting/zonetracker_simplified/
EXPOSE 53 53/udp

FROM base-rtc AS dns-master-dns
COPY docker/dns-master-dns /opt/dns-hosting
EXPOSE 22

FROM base-rtc AS dns-master-http
COPY docker/dns-master-http /opt/dns-hosting
EXPOSE 22

FROM base-rtc AS migrator
COPY docker/migrator /opt/dns-hosting

FROM base-deploy AS dns-master
COPY docker/dns-master /opt/dns-hosting
EXPOSE 53 53/udp 80

FROM base-deploy AS dns-api
RUN apt-get update && apt-get install cron tzdata
RUN rm /etc/cron.daily/* /etc/cron.weekly/*
# Hack pam for cron runs
RUN sed -i '/session    required     pam_loginuid.so/c\#session    required   pam_loginuid.so' /etc/pam.d/cron
COPY docker/dns-api /opt/dns-hosting
RUN mkdir /tmp/gunicorn
EXPOSE 80

FROM base AS unittest
RUN apt-get update && apt-get install -y \
    postgresql-10 \
    postgresql-contrib-10
COPY --from=environment-builder /opt/dns-hosting /opt/dns-hosting
COPY requirements.dev.txt /opt/sources/requirements.dev.txt
COPY requirements.txt /opt/sources/requirements.txt
COPY --from=application-builder /install /opt/dns-hosting
COPY tests /opt/sources/tests
COPY docker/unittest /opt/dns-hosting
COPY setup.py /opt/sources/setup.py
COPY dns_hosting /opt/sources/dns_hosting
COPY appcore /opt/sources/appcore
RUN /opt/dns-hosting/bin/pip install -r /opt/sources/requirements.txt
RUN /opt/dns-hosting/bin/pip install -r /opt/sources/requirements.dev.txt
RUN /opt/dns-hosting/bin/pip install /opt/sources
WORKDIR /opt/sources
CMD ["/usr/bin/env", "bash", "/opt/dns-hosting/bin/unittest.sh"]
