#!/usr/bin/env bash
# Real demos for P106 "How Email Works on the Internet (SMTP) in 10 Minutes". Made on the Mac (Docker Desktop).
# A small internet in Docker, all from one image (lab/Dockerfile), on the documentation range 203.0.113.0/24
# (RFC 5737) with the reserved .test names (RFC 2606), so nothing here is anyone's real address:
#   dns         the lab's DNS server (dnsmasq): MX, A and TXT records for bloom.test and harbor.test
#   mail-bloom  mail.bloom.test, the mail server of Bloom, Ana's flower shop: Postfix + Dovecot for logins
#   mx-harbor   mx.harbor.test, the mail server of Harbor, the cafe Ben works at: Postfix receives, Dovecot IMAP
#   ana-laptop  Ana's laptop (swaks sends her email)
#   ben-laptop  Ben's laptop (curl reads his inbox over IMAP)
# Every command shown is typed into a real interactive bash in a pty, one per machine (demo_driver.py).
set -euo pipefail
cd "$(dirname "$0")"
P=ce-p106
M="dns mail-bloom mx-harbor ana-laptop ben-laptop"
cleanup() {
  for m in $M; do docker rm -f $P-$m >/dev/null 2>&1 || true; done
  docker network rm $P-inet >/dev/null 2>&1 || true
}
cleanup
[ -n "${KEEP:-}" ] || trap cleanup EXIT
# A throwaway certificate authority for the lab, made fresh each run and never committed.
CA=lab/.ca; rm -rf $CA; mkdir -p $CA
openssl req -x509 -newkey rsa:2048 -nodes -days 30 -keyout $CA/lab-ca.key -out $CA/lab-ca.crt -subj "/CN=Mail Lab CA" 2>/dev/null
for h in mail.bloom.test mx.harbor.test; do
  openssl req -newkey rsa:2048 -nodes -keyout $CA/$h.key -out $CA/$h.csr -subj "/CN=$h" 2>/dev/null
  printf "subjectAltName=DNS:%s" $h > $CA/ext
  openssl x509 -req -in $CA/$h.csr -CA $CA/lab-ca.crt -CAkey $CA/lab-ca.key -CAcreateserial -days 30 -out $CA/$h.crt -extfile $CA/ext 2>/dev/null
done
rm -f $CA/*.csr $CA/ext $CA/*.srl $CA/lab-ca.key
docker build -q -t $P lab >/dev/null
docker network create --subnet 203.0.113.0/24 $P-inet >/dev/null
run() { # name hostname ip
  docker run -d --name $P-$1 --hostname $2 --network $P-inet --ip $3 $P >/dev/null
}
run dns dns 203.0.113.53
run mail-bloom mail 203.0.113.25
run mx-harbor mx 203.0.113.30
run ana-laptop ana-laptop 203.0.113.101
run ben-laptop ben-laptop 203.0.113.102
docker cp lab/conf/dnsmasq.conf $P-dns:/etc/dnsmasq.conf >/dev/null
python3 - $P < demo_driver.py
