\documentclass[aspectratio=169]{beamer}
\usepackage{lmodern}
\usepackage[czech]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{textpos}
\usepackage{tikz,calc}
\usepackage{graphicx}
\usepackage{wrapfig}
\usepackage{color}
\usepackage{mathtools}
\usepackage{hyperref}
\usepackage{epstopdf}
\usepackage{amsmath}
\usepackage{minted}
\hypersetup{
	colorlinks,
	citecolor=black,
	filecolor=black,
	linkcolor=black,
	urlcolor=black
}
\usepackage{pdflscape}

\input{theme/theme.tex}

\title{Migrace z Turris OS 3.x}
\author{Karel Kočí}
\date{10.11.2021}

\begin{document}

\input{theme/title.tex}

\begin{frame}{Migrace z Turris OS 3.x pro uživatele}
	Dokumentace: https://docs.turris.cz/geek/tos3-migration/

	\vspace{1cm}

	\includegraphics[width=10cm]{migration.png}\\
	S vydáním Turris OS 5.3.1..

	\vspace{1cm}
	Do konce roku spuštění automatické migrace ve vlnách.
\end{frame}

\begin{frame}{Proč je nutná migrace?}
	Obrovské změny mezi lety 2016 a 2018.

	Turris OS 3.x: OpenWrt 15.05 (poslední merge Leden 2016)

	Turris OS 4.0: OpenWrt 18.06

	\begin{itemize}
		\item Velké změny v konfiguraci
		\item Změna LibC na Turris 1.x
		\item Změny v repozitářích (jiná dispozice)
		\item Změny v balíčkách
		\item Odstranění některých funkcionalit
	\end{itemize}
\end{frame}

\begin{frame}{Konfigurace}
	\begin{itemize}
		\item Přechod od swconfig k DSA pro switch konfiguraci
		\item Správa SFP v kernelu (chybějící přepínání za běhu)
		\item Změna identifikace Wi-Fi karet
		\item Přesun od UCI konfigurace k nativní pro sshd
		\item Update LXC z 1.0 na 3.0 (4.0)
		\item Přechod od uCollect k Sentinel
	\end{itemize}

	Spousta změn v druhotném softwaru..
\end{frame}

\begin{frame}[fragile]{Migrace konfigurace}
	Balíček \textit{tos3to4} s migračními skripty.
	Pro budoucí rozšiřitelnost v Turris OS 4.0+.

	\begin{minted}[frame=lines]{bash}
config_load wireless
wifi_handle() {
	local radio="$1"
	config_get path "$radio" path
	mac="$(cat /sys/devices/platform/"$path"/ieee80211/phy*/macaddress)"
	uci set "wireless.$radio.macaddr=$mac"
	uci delete "wireless.$radio.path"
}
config_foreach wifi_handle wifi-device
uci commit wireless
	\end{minted}
\end{frame}

\begin{frame}[fragile]{Offline aktualizace}
	Nahrajeme nový systém, zmigrujeme konfiguraci a provedeme reboot...

	\vspace{0.2cm}

	Výhody:
	\begin{itemize}
		\item Jednoduché
		\item Atomické díky BTRFS
	\end{itemize}

	\vspace{0.2cm}

	Proč to nejde:
	\begin{minted}[frame=lines]{lua}
[ -n "$IPKG_INSTROOT" ] || {
	package_migration
}
\end{minted}
	⇒ Aktualizace za běhu
\end{frame}

\begin{frame}[fragile]{Trocha teorie... Updater}
	Lua předpis/konfigurace z online zdrojů (updater lists).

	\begin{minted}[frame=lines]{lua}
Repository('turris/core', '../packages/core')
Install('updater-ng', 'updater-supervisor', { critical = true })
Package('updater-ng', { replan = 'finished' })
\end{minted}
\end{frame}

\begin{frame}[fragile]{Trocha teorie... Package extras}
	\begin{minted}[frame=lines]{lua}
Package('updater-ng', { replan = 'finished' })
\end{minted}

	\begin{itemize}
		\item \textbf{virtual}: k danému názvu balíčku neexistuje binární balíček
		\item \textbf{deps}: dodatečné závislosti balíčku
		\item \textbf{reboot}: \textit{delayed} vyžádá reboot a
			\textit{finished} bezpodmínečně provede na konci transakce
		\item \textbf{replan}: \textit{finished} způsobí znovu spuštění updateru
			okamžitě po ukončení a \textit{immediate} způsobí to samé, ale
			okamžitě o instalaci balíčku
		\item \textbf{abi\_change} a \textbf{abichange\_deep} způsobí reinstalaci
			všech závislých balíčků
		\item \textbf{order\_before} a \textbf{order\_after} nikdy nefungovaly
	\end{itemize}
\end{frame}

\begin{frame}[fragile]{První iterace aneb "tohle nebude fungovat"}
	Balíček \textit{tos3to4} v Turris OS 3.x:
	\begin{minted}[frame=lines]{lua}
Script("https://repo.turris.cz/hbs/omnia/lists/migrate3x.lua", {
	security = "Local", ca = system_cas, crl = no_crl,
	pubkey = { "file:///etc/updater/keys/release.pub" }
})
\end{minted}

	\textit{migrate3x.lua} na serveru:
	\begin{minted}[frame=lines]{lua}
Repository("turris", "https://repo.turris.cz/hbs/"..board.."/packages", {
	priority = 60,
	subdirs = { "base", "core", "packages", "turrispackages"}
})
\end{minted}
\end{frame}

\begin{frame}[fragile]{Druhá iterace aneb "update updater"}
	\begin{minted}[frame=lines]{lua}
if version_match(self_version, "<64.0") then
  Repository("turris", "https://repo.turris.cz/hbs/"..board.."/packages", {
    priority = 60,
    subdirs = { "base", "core", "packages", "turrispackages"}
  })
  Install('updater-ng', { critical = true })
  Package('updater-ng', {
    replan = 'immediate',
    deps = { 'libgcc', 'busybox', 'tos3to4-early' }
  })
end
Package("libc", { abi_change_deep = true })
\end{minted}
\end{frame}

\begin{frame}[fragile]{Updater: vítejte v pekle}
	Kontrola kolizí...
	\begin{minted}[frame=lines]{md}
DIE: [string "transaction"]:334: [string "transaction"]:158: Collisions:
• /usr/sbin/cron: vixie-cron (existing-file), cronie (new-file)
\end{minted}

	\vspace{0.4cm}

	Dobře tak:
	\begin{minted}[frame=lines]{lua}
Package("cronie", { virtual = true })
\end{minted}
	\begin{minted}[frame=lines]{md}
ERROR: inconsistent: Candidate exists for virtual package gettext-tools
\end{minted}
\end{frame}

\begin{frame}[fragile]{Pokračování teorie... pořadí změn}
	\begin{minted}[frame=lines]{lua}
Install('updater-ng', { critical = true, priority = 50 })
\end{minted}

	Pravidla řazení, první v pořadí:
	\begin{enumerate}
		\item Závislý balíček na následujícím v pořadí
		\item Balíček který má konflikt s následujícím v pořadí
		\item Kriticky vyžádané balíčky
		\item Priorita (vyšší hodnota znamená dřívější zařazení)
		\item Instalace balíčku (odstranění se provádí až na konci)
	\end{enumerate}
	BTW, toto platí jen pro nové verze updateru.
\end{frame}

\begin{frame}[fragile]{Třetí iterace aneb "early later"}
	\begin{minted}[frame=lines]{lua}
  Package('updater-ng', {
    replan = 'immediate',
    deps = { 'libgcc', 'busybox' }
  })
else
  if version_match(installed["tos3to4"].version, "<2.0.0") then
    Install('tos3to4-early', { critical = true, priority = 100 })
    Package('tos3to4-early', { replan = 'immediate' })
  end
end
\end{minted}
\end{frame}

\begin{frame}[fragile]{Čtvrtá iterace aneb "ufff to trvá"}
	OpenWrt používá Procd jako init systém, a ten komunikuje přes ubus.

	Nová verze ubus nekomunikuje se starou a čeká na timeout dvě minuty.

	\begin{minted}[frame=lines]{bash}
[ -n "${IPKG_INSTROOT}" ] || {
  ubus call system info 2>/dev/null >&2 || killall ubusd
}
\end{minted}

	\begin{minted}[frame=lines]{lua}
if version_match(installed["ubus"].version, "<2018") then
  Package("ubus", { replan = 'immediate' })
end
\end{minted}
\end{frame}

\begin{frame}[fragile]{Pátá iterace aneb "chybí mi balík"}
	\begin{minted}[frame=lines]{lua}
Install("cups")
\end{minted}

	\begin{minted}[frame=lines]{md}
ERROR: inconsistent: Requested package cups that is not available.
\end{minted}

	\vspace{0.2cm}

	Po implementaci v updateru:
	\begin{minted}[frame=lines]{lua}
Mode("optional_installs")
\end{minted}
\end{frame}

\begin{frame}[fragile]{Šestá iterace aneb "localrepo ach localrepo"}
	Localrepo uchovává balíčky, které nebyly nainstalované z repozitáře.

	Jo, ty které se neaktualizují, a rozhodně fungovat nebudou.

	\begin{minted}[frame=lines]{bash}
SOURCE="/usr/share/updater/localrepo"
COLLIDED="/usr/share/updater/collided$SOURCE"
mv "$SOURCE" "$COLLIDED"
\end{minted}

	\begin{minted}[frame=lines]{lua}
  Package('updater-ng', {
    replan = 'immediate',
    deps = { 'libgcc', 'busybox', 'tos3to4-earliest' }
  })
else
\end{minted}
\end{frame}

\begin{frame}[fragile]{Sedmá iterace aneb "brick"}
	Po aktualizaci máme DSA nastavení, ale nemáme DSA v jádře..

	\begin{minted}[frame=lines]{lua}
Package("tos3to4", { reboot = "finished" })
\end{minted}
\end{frame}

\begin{frame}[fragile]{Osmá iterace... no nic, to by bylo na dlouho}
	Takže takový update vypadá takto:
	\begin{enumerate}
		\item Instalace \textit{tos3to4} v Turris OS 3.x
		\item Aktualizace updateru na nejnovější verzi a instalace
			\textit{tos3to4-earliest}
		\item Aktualizace ubus (dvě minuty čekání)
		\item Instalace \textit{tos3to4-early} a migrace nastavení updateru
		\item Aktualizace zbytku systému včetně odstranění starých balíčků
		\item Poslední replan (pšš, stejně nám nejde síť)
		\item Reboot
		\item Odstranění \textit{tos3to4} a dalších migračních balíčků
	\end{enumerate}
	Plus nějaké další přeplánování a další speciální balíčky (\textit{fix-*}).
\end{frame}

\begin{frame}
	\Large Děkuji za pozornost. Otázky?\\

	\vspace{0.5cm}
	\small karel.koci@nic.cz

	\vspace{0.5cm}
	\small \url{git.cynerd.cz/presentations/about/}
\end{frame}

\end{document}
