From b1b72fed39a9e87b5481983ee31eea7f8a6017d9 Mon Sep 17 00:00:00 2001 From: Rayhaan Jaufeerally Date: Thu, 1 Oct 2026 20:40:55 +0200 Subject: [PATCH] lab: multi-line answer boxes, one sheet per student The fill-in fields put the label on its own line with dotted lines to write on. handout.tex takes \studentnum and \studenthex; build-class.py compiles one copy per student with the prefix filled in, checks each is two pages and joins them for double-sided printing. Co-Authored-By: Claude Fable 5.1 --- docs/lab/handout/build-class.py | 63 ++++++++++++++++++++++++++++++++ docs/lab/handout/handout.pdf | Bin 114506 -> 114823 bytes docs/lab/handout/handout.tex | 33 +++++++++++++---- 3 files changed, 89 insertions(+), 7 deletions(-) create mode 100755 docs/lab/handout/build-class.py diff --git a/docs/lab/handout/build-class.py b/docs/lab/handout/build-class.py new file mode 100755 index 0000000..b4db1ee --- /dev/null +++ b/docs/lab/handout/build-class.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +"""One exercise sheet per student, with their prefix filled in, in one PDF. + + python3 build-class.py 100 # students 1..100 -> class.pdf + python3 build-class.py 100 -o out.pdf + python3 build-class.py 5 12 -o few.pdf # students 5..12 + +Student n gets 2a0d:d741:::/48; the lab /40 allows 1..255. Each +sheet is compiled separately and must come out to exactly two pages, so +the result prints double-sided with one student per leaf. Needs pdflatex +and pdfunite (poppler). +""" +import argparse +import os +import shutil +import subprocess +import sys +import tempfile + +HERE = os.path.dirname(os.path.abspath(__file__)) + + +def page_count(pdf): + out = subprocess.run(["pdfinfo", pdf], capture_output=True, text=True, check=True).stdout + return int(next(line.split()[-1] for line in out.splitlines() if line.startswith("Pages:"))) + + +def main(): + ap = argparse.ArgumentParser(description=__doc__.split("\n")[0]) + ap.add_argument("first", type=int, help="first student number, or the count if it is the only number") + ap.add_argument("last", type=int, nargs="?") + ap.add_argument("-o", "--output", default=os.path.join(HERE, "class.pdf")) + args = ap.parse_args() + first, last = (1, args.first) if args.last is None else (args.first, args.last) + if not 1 <= first <= last <= 255: + sys.exit("student numbers must be within 1..255: the lab /40 has 255 usable /48s") + + with tempfile.TemporaryDirectory() as tmp: + for name in os.listdir(HERE): + if name.endswith((".tex", ".cls", ".sty", ".bst", ".bib")): + shutil.copy(os.path.join(HERE, name), tmp) + parts = [] + for n in range(first, last + 1): + job = f"student-{n:03d}" + tex = f"\\def\\studentnum{{{n}}}\\def\\studenthex{{{n:x}}}\\input{{handout.tex}}" + for _ in range(2): # twice, for the figure and table references + r = subprocess.run(["pdflatex", "-interaction=nonstopmode", "-halt-on-error", "-jobname", job, tex], + cwd=tmp, capture_output=True, text=True) + if r.returncode != 0: + sys.exit(f"student {n}: pdflatex failed:\n{r.stdout[-2000:]}") + pdf = os.path.join(tmp, job + ".pdf") + pages = page_count(pdf) + if pages != 2: + sys.exit(f"student {n}: sheet is {pages} pages, not 2; double-sided printing would misalign") + parts.append(pdf) + print(f"\rstudent {n}: 2a0d:d741:{n:x}::/48", end="", flush=True) + print() + subprocess.run(["pdfunite", *parts, args.output], check=True) + print(f"wrote {args.output}: students {first}..{last}, {page_count(args.output)} pages") + + +if __name__ == "__main__": + main() diff --git a/docs/lab/handout/handout.pdf b/docs/lab/handout/handout.pdf index 305d2e041dc9d95e488d694aba43278faabe42c6..4c25825d8e43e000effa5ab0354586ff1695c5b8 100644 GIT binary patch delta 21646 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 UbjAIQ@?6HI#$2kZuKsRZ05QeR*8l(j delta 21348 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 +\else + \newcommand{\myprefix}{\texttt{2a0d:d741:\studenthex::/48}} + \newcommand{\nhex}{\studenthex} +\fi % ---- exercise machinery ------------------------------------------------------ \lstset{basicstyle=\ttfamily\small,columns=fullflexible,keepspaces=true, @@ -54,6 +64,7 @@ \maketitle \medskip\noindent +\ifx\studentnum\empty \parbox[t]{0.44\linewidth}{Name:~\dotfill}\hfill \parbox[t]{0.27\linewidth}{Prefix: \myprefix} @@ -62,6 +73,14 @@ Your prefix is \myprefix, where \texttt{n} is your number \emph{in hexadecimal}.\par\noindent Student 10 has \texttt{2a0d:d741:a::/48} and student 26 has \texttt{2a0d:d741:1a::/48}. +\else +\parbox[t]{0.44\linewidth}{Name:~\dotfill}\hfill +\parbox[t]{0.5\linewidth}{Student \studentnum\quad Prefix: \myprefix} + +\smallskip\noindent +Your prefix is \myprefix: student number \studentnum, written in +hexadecimal. Make sure to use this prefix in the exercise. +\fi % ============================================================================== \section{Who Announces the Address You Are Using?} @@ -76,8 +95,8 @@ announces that prefix. The RIPE database records who holds address space (\texttt{inet6num}, or \texttt{inetnum} for IPv4) and who may announce it (\texttt{route6}, \texttt{route}). Look up your IPv6 address, then your lab prefix: -\begin{lstlisting} -whois whois 2a0d:d741:::/48 +\begin{lstlisting}[escapeinside={(*}{*)}] +whois whois 2a0d:d741:(*\nhex*)::/48 \end{lstlisting} \fillintwo{Your IPv6 address: held by (\texttt{netname})}{\texttt{origin} AS:} \fillintwo{Your lab prefix: \texttt{origin} AS}{is it announced right now?} @@ -116,7 +135,7 @@ Click \emph{bytes} next to your route and hover over the coloured segments. \fillintwo{AS number(s) in \texttt{AS\_PATH}:}{attribute carrying your prefix:} \task{See it from outside.} -Wait a moment, then look your prefix up on \texttt{bgp.tools}. +Wait a moment, then look your prefix up on \texttt{https://bgp.tools/super-lg}. \fillintwo{Origin AS the world sees:}{an AS path you found:} \noindent The lab daemon's AS4200000001 is missing from that path. Where did it go, and why? \answer[2] @@ -124,7 +143,7 @@ Wait a moment, then look your prefix up on \texttt{bgp.tools}. \task{Reach it.} The router answers for every address in the lab space, so your prefix is reachable exactly when your announcement got out:\quad -\texttt{ping -6 2a0d:d741:::1} +\texttt{ping -6 2a0d:d741:\nhex::1} \reach % ============================================================================== @@ -154,7 +173,7 @@ Announce your prefix again with \texttt{210036:0:0} and \texttt{210036:1:42476}; announcing a prefix you own replaces it. Before you look: who do you expect to still see it? \answer[2] -\noindent Wait a moment, then check on \texttt{bgp.tools} and with \texttt{ping}. +\noindent Wait a moment, then check on \texttt{https://bgp.tools/super-lg} and with \texttt{ping}. \reach \task{To SWITCH only.} @@ -162,7 +181,7 @@ Add \texttt{42476:0:0} and \texttt{42476:1:559} to the two you already have and announce again. Our router now tells only the route servers, and they tell only SWITCH. \reach -\noindent Is your prefix still visible on \texttt{bgp.tools}? Explain what you see. +\noindent Is your prefix still visible on \texttt{https://bgp.tools/super-lg}? Explain what you see. \answer[2] \task{Use of large communities.}