Files
infix/dev/branding/index.html
T

2732 lines
74 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en" class="no-js"><head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Infix Documentation">
<link rel="canonical" href="https://kernelkit.github.io/infix/dev/branding/">
<link rel="prev" href="../scripting-restconf/">
<link rel="next" href="../developers-guide/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.0">
<title>Branding &amp; Releases - User's Guide</title>
<link rel="stylesheet" href="../assets/stylesheets/main.618322db.min.css">
<link rel="stylesheet" href="../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&amp;display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../extra.css">
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<link href="../assets/stylesheets/glightbox.min.css" rel="stylesheet"><script src="../assets/javascripts/glightbox.min.js"></script><style id="glightbox-style">
html.glightbox-open { overflow: initial; height: 100%; }
.gslide-title { margin-top: 0px; user-select: text; }
.gslide-desc { color: #666; user-select: text; }
.gslide-image img { background: black; }
.glightbox-clean .gslide-media { -webkit-box-shadow: none; box-shadow: none; }
.gscrollbar-fixer { padding-right: 15px; }
.gdesc-inner { font-size: 0.75rem; }
body[data-md-color-scheme="slate"] .gdesc-inner { background: var(--md-default-bg-color); }
body[data-md-color-scheme="slate"] .gslide-title { color: var(--md-default-fg-color); }
body[data-md-color-scheme="slate"] .gslide-desc { color: var(--md-default-fg-color); }
</style></head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="orange" data-md-color-accent="orange">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#branding-releases" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<div data-md-color-scheme="default" data-md-component="outdated" hidden>
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://kernelkit.org/" title="User's Guide" class="md-header__button md-logo" aria-label="User's Guide" data-md-component="logo">
<img src="../logo-plain.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"></path></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
User's Guide
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Branding &amp; Releases
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="orange" data-md-color-accent="orange" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"></path></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="orange" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"></path></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"></path></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"></path></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"></path></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/kernelkit/infix/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"></path></svg>
</div>
<div class="md-source__repository">
kernelkit/infix
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://kernelkit.org/" title="User's Guide" class="md-nav__button md-logo" aria-label="User's Guide" data-md-component="logo">
<img src="../logo-plain.png" alt="logo">
</a>
User's Guide
</label>
<div class="md-nav__source">
<a href="https://github.com/kernelkit/infix/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"></path></svg>
</div>
<div class="md-source__repository">
kernelkit/infix
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2">
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
CLI
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
CLI
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../cli/introduction/" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/configure/" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/keybindings/" class="md-nav__link">
<span class="md-ellipsis">
Keybindings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/netcalc/" class="md-nav__link">
<span class="md-ellipsis">
Network Calculator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/tcpdump/" class="md-nav__link">
<span class="md-ellipsis">
Network Monitoring
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/quick/" class="md-nav__link">
<span class="md-ellipsis">
Quickstart Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/text-editor/" class="md-nav__link">
<span class="md-ellipsis">
Text Editor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/upgrade/" class="md-nav__link">
<span class="md-ellipsis">
Upgrading
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../container/" class="md-nav__link">
<span class="md-ellipsis">
Docker Containers
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4">
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
Networking
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Networking
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../networking/" class="md-nav__link">
<span class="md-ellipsis">
Network Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../firewall/" class="md-nav__link">
<span class="md-ellipsis">
Firewall Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../qos/" class="md-nav__link">
<span class="md-ellipsis">
Quality of Service
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../eth-counters/" class="md-nav__link">
<span class="md-ellipsis">
RMON Counters
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../tunnels/" class="md-nav__link">
<span class="md-ellipsis">
Tunneling (L2/L3)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../wifi/" class="md-nav__link">
<span class="md-ellipsis">
Wireless LAN (WiFi)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5">
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
Services
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../discovery/" class="md-nav__link">
<span class="md-ellipsis">
Device Discovery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dhcp/" class="md-nav__link">
<span class="md-ellipsis">
DHCP Server
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6">
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
System
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
System
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../boot/" class="md-nav__link">
<span class="md-ellipsis">
Boot Procedure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../system/" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../hardware/" class="md-nav__link">
<span class="md-ellipsis">
Hardware Info &amp; Status
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../management/" class="md-nav__link">
<span class="md-ellipsis">
Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../syslog/" class="md-nav__link">
<span class="md-ellipsis">
Syslog Support
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../support/" class="md-nav__link">
<span class="md-ellipsis">
Support Data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../upgrade/" class="md-nav__link">
<span class="md-ellipsis">
Upgrade
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7">
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
Scripting
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Scripting
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../scripting/" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../scripting-sysrepocfg/" class="md-nav__link">
<span class="md-ellipsis">
Legacy Scripting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../scripting-prod/" class="md-nav__link">
<span class="md-ellipsis">
Production Testing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../scripting-netconf/" class="md-nav__link">
<span class="md-ellipsis">
With NETCONF
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../scripting-restconf/" class="md-nav__link">
<span class="md-ellipsis">
With RESTCONF
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" checked>
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
Developer's Corner
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Developer's Corner
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Branding &amp; Releases
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Branding &amp; Releases
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#branding" class="md-nav__link">
<span class="md-ellipsis">
Branding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#factory-failure-config" class="md-nav__link">
<span class="md-ellipsis">
Factory &amp; Failure Config
</span>
</a>
<nav class="md-nav" aria-label="Factory &amp; Failure Config">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#variables-format-specifiers" class="md-nav__link">
<span class="md-ellipsis">
Variables &amp; Format Specifiers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#static-files" class="md-nav__link">
<span class="md-ellipsis">
Static Files
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#dynamically-generated" class="md-nav__link">
<span class="md-ellipsis">
Dynamically Generated
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#example-snippets" class="md-nav__link">
<span class="md-ellipsis">
Example Snippets
</span>
</a>
<nav class="md-nav" aria-label="Example Snippets">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#ietf-system" class="md-nav__link">
<span class="md-ellipsis">
IETF System
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ietf-keystore" class="md-nav__link">
<span class="md-ellipsis">
IETF Keystore
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ietf-netconf-server" class="md-nav__link">
<span class="md-ellipsis">
IETF NETCONF Server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#infix-services" class="md-nav__link">
<span class="md-ellipsis">
Infix Services
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#integration" class="md-nav__link">
<span class="md-ellipsis">
Integration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#releases" class="md-nav__link">
<span class="md-ellipsis">
Releases
</span>
</a>
<nav class="md-nav" aria-label="Releases">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#versioning" class="md-nav__link">
<span class="md-ellipsis">
Versioning
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#specifying-versioning-information" class="md-nav__link">
<span class="md-ellipsis">
Specifying Versioning Information
</span>
</a>
<nav class="md-nav" aria-label="Specifying Versioning Information">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#infix_build_id" class="md-nav__link">
<span class="md-ellipsis">
INFIX_BUILD_ID
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#infix_release" class="md-nav__link">
<span class="md-ellipsis">
INFIX_RELEASE
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../developers-guide/" class="md-nav__link">
<span class="md-ellipsis">
Developer's Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../override-package/" class="md-nav__link">
<span class="md-ellipsis">
Developing with Buildroot
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../netboot/" class="md-nav__link">
<span class="md-ellipsis">
Netboot HowTo
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../testing/" class="md-nav__link">
<span class="md-ellipsis">
Regression Testing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../test-arch/" class="md-nav__link">
<span class="md-ellipsis">
Test System Architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../virtual/" class="md-nav__link">
<span class="md-ellipsis">
Virtual Environments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../vpd/" class="md-nav__link">
<span class="md-ellipsis">
Vital Product Data (VPD)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../license/" class="md-nav__link">
<span class="md-ellipsis">
Origin &amp; Licensing
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#branding" class="md-nav__link">
<span class="md-ellipsis">
Branding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#factory-failure-config" class="md-nav__link">
<span class="md-ellipsis">
Factory &amp; Failure Config
</span>
</a>
<nav class="md-nav" aria-label="Factory &amp; Failure Config">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#variables-format-specifiers" class="md-nav__link">
<span class="md-ellipsis">
Variables &amp; Format Specifiers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#static-files" class="md-nav__link">
<span class="md-ellipsis">
Static Files
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#dynamically-generated" class="md-nav__link">
<span class="md-ellipsis">
Dynamically Generated
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#example-snippets" class="md-nav__link">
<span class="md-ellipsis">
Example Snippets
</span>
</a>
<nav class="md-nav" aria-label="Example Snippets">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#ietf-system" class="md-nav__link">
<span class="md-ellipsis">
IETF System
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ietf-keystore" class="md-nav__link">
<span class="md-ellipsis">
IETF Keystore
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ietf-netconf-server" class="md-nav__link">
<span class="md-ellipsis">
IETF NETCONF Server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#infix-services" class="md-nav__link">
<span class="md-ellipsis">
Infix Services
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#integration" class="md-nav__link">
<span class="md-ellipsis">
Integration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#releases" class="md-nav__link">
<span class="md-ellipsis">
Releases
</span>
</a>
<nav class="md-nav" aria-label="Releases">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#versioning" class="md-nav__link">
<span class="md-ellipsis">
Versioning
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#specifying-versioning-information" class="md-nav__link">
<span class="md-ellipsis">
Specifying Versioning Information
</span>
</a>
<nav class="md-nav" aria-label="Specifying Versioning Information">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#infix_build_id" class="md-nav__link">
<span class="md-ellipsis">
INFIX_BUILD_ID
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#infix_release" class="md-nav__link">
<span class="md-ellipsis">
INFIX_RELEASE
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<nav class="md-path" aria-label="Navigation">
<ol class="md-path__list">
<li class="md-path__item">
<a href=".." class="md-path__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-path__item">
<a href="./" class="md-path__link">
<span class="md-ellipsis">
Developer's Corner
</span>
</a>
</li>
</ol>
</nav>
<article class="md-content__inner md-typeset">
<h1 id="branding-releases">Branding &amp; Releases<a class="headerlink" href="#branding-releases" title="Permanent link"></a></h1>
<p>This document is for projects using Infix as a br2-external, i.e., OEMs
that want to create <em>their own "Spin"</em> of Infix.</p>
<h2 id="branding">Branding<a class="headerlink" href="#branding" title="Permanent link"></a></h2>
<p>Branding is done in menuconfig, there are several settings affecting
it, most are in the Infix external subsection called "Branding", but
there is also <code>BR2_TARGET_GENERIC_HOSTNAME</code>, which deserves a
special mention.</p>
<p>The hostname is used for the system default <code>/etc/hostname</code>, which
is the base name for the "unique:ified" hostname + the last three
octets of the base MAC<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup> address, e.g., <code>infix-c0-ff-ee</code>. This in
turn is the hostname that is set at first boot and also advertised
by device discovery protocols like mDNS-SD and LLDP.</p>
<p>See the help texts for the <em>Infix Branding</em> settings to understand
which ones are mandatory and which are optional, menuconfig does not
check this for you and you may end up with odd results.</p>
<p>Verify the result after a build by inspecting:</p>
<ul>
<li><code>output/images/*</code>: names, missing prefix, etc.</li>
<li><code>output/target/etc/os-release</code>: this file is sourced by other build
scripts, e.g., <code>mkgns3a.sh</code>. For reference, see <a href="https://www.freedesktop.org/software/systemd/man/os-release.html">os-release(5)</a></li>
</ul>
<div class="admonition tip">
<p class="admonition-title">Important</p>
<p>To get a proper GIT revision (hash) from your OS spin, remember to set
in menuconfig <code>INFIX_OEM_PATH</code>. When unset, the Infix <code>post-build.sh</code>
script defaults to the Infix base path. The revision is stored in the
file <code>/etc/os-release</code> as <code>BUILD_ID</code>, also in the file <code>/etc/version</code>.
See below for more info.</p>
</div>
<h2 id="factory-failure-config">Factory &amp; Failure Config<a class="headerlink" href="#factory-failure-config" title="Permanent link"></a></h2>
<p>To support booting the same image (CPU architecture) on multiple boards,
Infix by default generates the device's initial configuration every time
at boot. This also ensures the device can always be restored to a known
state after a factory reset, since the <code>factory-config</code> is guaranteed to
be compatible with the YANG models for the given software version. (For
more information on how the system boots, please see the section <a href="../#key-concepts">Key
Concepts</a> in the Introduction document.)</p>
<p>However, for custom builds of Infix it is possible to override this with
a single static <code>/etc/factory-config.cfg</code> (and failure-config) in your
rootfs overlay -- with a <a href="../vpd/">VPD</a> you can even support several!</p>
<h3 id="variables-format-specifiers">Variables &amp; Format Specifiers<a class="headerlink" href="#variables-format-specifiers" title="Permanent link"></a></h3>
<p>Parts of the configuration you likely always want to generated, like the
SSH hostkey used by SSH server and NETCONF, a unique hostname, or the <code>admin</code> user's
unique (per-device with a VPD) password hash. This section lists the
available keywords, see the next section for examples of how to use
them:</p>
<ul>
<li><strong>Default password hash:</strong> <code>$factory$</code> (from VPD, .dtb, or built-in)<br>
XPath: <code>/ietf-system:system/authentication/user/password</code></li>
<li><strong>Default SSH and NETCONF hostkey:</strong> <code>genkey</code> (regenerated at factory reset)
XPath: <code>/ietf-keystore:keystore/asymmetric-keys/asymmetric-key[name='genkey']</code></li>
<li><strong>Hostname format specifiers:</strong><br>
XPath: <code>/ietf-system:system/hostname</code></li>
<li><code>%i</code>: OS ID, from <code>/etc/os-release</code>, from Menuconfig branding</li>
<li><code>%h</code>: Default hostname, from <code>/etc/os-release</code>, from branding</li>
<li><code>%m</code>: NIC specific part of base MAC, e.g., to <code>c0-ff-ee</code></li>
<li><code>%%</code>: Literal %</li>
</ul>
<h3 id="static-files">Static Files<a class="headerlink" href="#static-files" title="Permanent link"></a></h3>
<div class="admonition warning">
<p class="admonition-title">Caution</p>
<p>Maintaining a static <code>factory-config</code> and <code>failure-config</code> may seem
like an obvious choice, but as YANG models evolve (even the IETF
models get upgraded), you may need to upgrade your static files.</p>
</div>
<p>First, for one-off builds (one image per product), the simplest way is
to override the location where the system looks for the files, <code>/etc</code>
already at build time. This can be done using a Buildroot rootfs
overlay providing, e.g., <code>/etc/factory-config.cfg</code>. Example: <a href="https://github.com/kernelkit/infix/blob/main/board/aarch64/r2s/rootfs/etc/factory-config.cfg">NanoPi
R2S</a> in <code>${INFIX}/board/aarch64/r2s/rootfs/etc/factory-config.cfg</code>.</p>
<p>Second, to support multiple products in a single image, we can employ
another method to install a <code>/etc/factory-config.cfg</code> override -- at
runtime. This relies on the very early system <code>probe</code> that detects the
specific product from VPD data.</p>
<p>The <code>probe</code> consists of several sequential steps that currently run from
<code>${INFIX}/board/common/rootfs/usr/libexec/infix/init.d/</code>. One of them
check if <code>/usr/share/product/&lt;PRODUCT&gt;</code> exists, and if so attempts to
copy the entire contents to <code>/</code>. Here, <code>&lt;PRODUCT&gt;</code> is determined from
the VPD, which is available in <code>/run/system.json</code> as <code>"product-name"</code>,
after <code>00-probe</code> has run. The lower case version of the string is used.</p>
<p>I.e., create a rootfs overlay that provides any combination of:</p>
<ul>
<li><code>/usr/share/product/&lt;PRODUCT&gt;/etc/factory-config.cfg</code></li>
<li><code>/usr/share/product/&lt;PRODUCT&gt;/etc/failure-config.cfg</code></li>
</ul>
<h3 id="dynamically-generated">Dynamically Generated<a class="headerlink" href="#dynamically-generated" title="Permanent link"></a></h3>
<p>The generated <code>factory-config</code> and <code>failure-config</code> files consist of
both static JSON files and part generated files at runtime for each
device. The resulting files are written to the RAM disk in <code>/run</code>:</p>
<ul>
<li><code>/run/confd/factory-config.gen</code></li>
<li><code>/run/confd/failure-config.gen</code></li>
</ul>
<p>Provided no custom overrides (see above) have been installed already,
these files are then copied to:</p>
<ul>
<li><code>/etc/factory-config.cfg</code></li>
<li><code>/etc/failure-config.cfg</code></li>
</ul>
<p>... where the bootstrap process expects them to be in the next step.</p>
<p>Examples of generated contents are the SSH hostkey and hostname. The
latter is constructed from the file <code>/etc/hostname</code>, appended with the
last three octets of the system's base MAC address. To override the
base hostname, set <code>BR2_TARGET_GENERIC_HOSTNAME</code> in your defconfig.</p>
<p>The static files are installed by Infix <code>confd</code> in <code>/usr/share/confd/</code>
at build time. It contains two subdirectories:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>/usr/share/confd/
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> |- factory.d/
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> | |- 10-foo.json
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> | |- 10-bar.json
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> | `- 10-qux.json
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> `- failure.d/
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> |- 10-xyzzy.json
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> `- 10-garply.json
</code></pre></div>
<p>To override, or extend, these files in you br2-external, set up a rootfs
overlay and add it last in <code>BR2_ROOTFS_OVERLAY</code>. Your overlay can look
something like this:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>./board/common/rootfs/
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a> |- etc/
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a> | |- confdrc # See below
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a> | `- confdrc.local
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> `- usr/
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> `- share/
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a> `- confd/
<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a> |- 10-foo.json # Override Infix foo
<a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a> |- 30-bar.json # Extend, probably 10-bar.json
<a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a> `- 30-fred.json # Extend, your own defaults
</code></pre></div>
<p>Using the same filename in your overlay, here <code>10-foo.json</code>, completely
replaces the contents of the same file provided by Infix. If you just
want to extend, or replace parts of an Infix default, use <code>30-....json</code>.
Here the file <code>30-bar.json</code> is just a helpful hit to maintainers of your
br2-external that it probably extends Infix' <code>10-bar.json</code>.</p>
<p>The reason for the jump in numbers is that 20 is reserved for files
generated by Infix' <code>gen-function</code> scripts. Your br2-external can
provide a few custom ones that the <code>bootstrap</code> knows about, e.g.,
<code>gen-ifs-custom</code> that overrides <code>20-interfaces.json</code>. See the
bootstrap script for more help, and up-to-date information.</p>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>You may not need to provide your own <code>/etc/confdrc</code> for your spin.
The one installed by <code>confd</code> is usually enough. However, if you want
to adjust the behavior of <code>bootstrap</code> you may want to override it.
There is also <code>confdrc.local</code>, which usually is enough to change
arguments to scripts like <code>gen-interfaces</code>, e.g., to create a bridge
by default, you may want to look into <code>GEN_IFACE_OPTS</code>.</p>
</div>
<h3 id="example-snippets">Example Snippets<a class="headerlink" href="#example-snippets" title="Permanent link"></a></h3>
<h4 id="ietf-system">IETF System<a class="headerlink" href="#ietf-system" title="Permanent link"></a></h4>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a> "ietf-system:system": {
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a> "hostname": "example-%m",
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a> "ntp": {
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a> "enabled": true,
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a> "server": [
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> {
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a> "name": "ntp.org",
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a> "udp": {
<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a> "address": "pool.ntp.org"
<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a> }
<a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a> }
<a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a> ]
<a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a> },
<a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a> "authentication": {
<a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a> "user": [
<a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a> {
<a id="__codelineno-2-17" name="__codelineno-2-17" href="#__codelineno-2-17"></a> "name": "admin",
<a id="__codelineno-2-18" name="__codelineno-2-18" href="#__codelineno-2-18"></a> "password": "$factory$",
<a id="__codelineno-2-19" name="__codelineno-2-19" href="#__codelineno-2-19"></a> "infix-system:shell": "bash"
<a id="__codelineno-2-20" name="__codelineno-2-20" href="#__codelineno-2-20"></a> }
<a id="__codelineno-2-21" name="__codelineno-2-21" href="#__codelineno-2-21"></a> ]
<a id="__codelineno-2-22" name="__codelineno-2-22" href="#__codelineno-2-22"></a> },
<a id="__codelineno-2-23" name="__codelineno-2-23" href="#__codelineno-2-23"></a> "infix-system:motd-banner": "Li0tLS0tLS0uCnwgIC4gLiAgfCBJbmZpeCAtLSBhIE5ldHdvcmsgT3BlcmF0aW5nIFN5c3RlbQp8LS4gdiAuLXwgaHR0cHM6Ly9rZXJuZWxraXQuZ2l0aHViLmlvCictJy0tLSctJwo="
<a id="__codelineno-2-24" name="__codelineno-2-24" href="#__codelineno-2-24"></a> }, # &lt;---- REMEMBER COMMA SEPARATORS IN SNIPPETS!
<a id="__codelineno-2-25" name="__codelineno-2-25" href="#__codelineno-2-25"></a> # &lt;---- ... and no comments.
</code></pre></div>
<p>The <code>motd-banner</code> is a binary type, which is basically a Base64 encoded
text file without line breaks (<code>-w0</code>):</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>$ echo "Li0tLS0tLS0uCnwgIC4gLiAgfCBJbmZpeCAtLSBhIE5ldHdvcmsgT3BlcmF0aW5nIFN5c3RlbQp8LS4gdiAuLXwgaHR0cHM6Ly9rZXJuZWxraXQuZ2l0aHViLmlvCictJy0tLSctJwo=" \
<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a> | base64 -d
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>.-------.
<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a>| . . | Infix OS — Immutable.Friendly.Secure
<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>|-. v .-| https://kernelkit.github.io
<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a>'-'---'-'
</code></pre></div>
<h4 id="ietf-keystore">IETF Keystore<a class="headerlink" href="#ietf-keystore" title="Permanent link"></a></h4>
<p>Notice how both the public and private keys are left empty here, this
cause them to be always automatically regenerated after each factory reset.
Keeping the <code>factory-config</code> snippet like this means we can use the same
file on multiple devices, without risking them sharing the same host
keys. Sometimes you may want the same host keys, but that is the easy
use-case and not documented here.</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="w"> </span><span class="nt">"ietf-keystore:keystore"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="w"> </span><span class="nt">"asymmetric-keys"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="w"> </span><span class="nt">"asymmetric-key"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="w"> </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"genkey"</span><span class="p">,</span>
<a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a><span class="w"> </span><span class="nt">"public-key-format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ietf-crypto-types:ssh-public-key-format"</span><span class="p">,</span>
<a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a><span class="w"> </span><span class="nt">"public-key"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span>
<a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a><span class="w"> </span><span class="nt">"private-key-format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ietf-crypto-types:rsa-private-key-format"</span><span class="p">,</span>
<a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a><span class="w"> </span><span class="nt">"cleartext-private-key"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span>
<a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a><span class="w"> </span><span class="nt">"certificates"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span>
<a id="__codelineno-4-11" name="__codelineno-4-11" href="#__codelineno-4-11"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-4-12" name="__codelineno-4-12" href="#__codelineno-4-12"></a><span class="w"> </span><span class="p">]</span>
<a id="__codelineno-4-13" name="__codelineno-4-13" href="#__codelineno-4-13"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-4-14" name="__codelineno-4-14" href="#__codelineno-4-14"></a><span class="w"> </span><span class="p">},</span>
</code></pre></div>
<h4 id="ietf-netconf-server">IETF NETCONF Server<a class="headerlink" href="#ietf-netconf-server" title="Permanent link"></a></h4>
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="w"> </span><span class="nt">"ietf-netconf-server:netconf-server"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a><span class="w"> </span><span class="nt">"listen"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a><span class="w"> </span><span class="nt">"endpoints"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="w"> </span><span class="nt">"endpoint"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a><span class="w"> </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"default-ssh"</span><span class="p">,</span>
<a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="w"> </span><span class="nt">"ssh"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a><span class="w"> </span><span class="nt">"tcp-server-parameters"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a><span class="w"> </span><span class="nt">"local-address"</span><span class="p">:</span><span class="w"> </span><span class="s2">"::"</span>
<a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a><span class="w"> </span><span class="p">},</span>
<a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a><span class="w"> </span><span class="nt">"ssh-server-parameters"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-5-12" name="__codelineno-5-12" href="#__codelineno-5-12"></a><span class="w"> </span><span class="nt">"server-identity"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-5-13" name="__codelineno-5-13" href="#__codelineno-5-13"></a><span class="w"> </span><span class="nt">"host-key"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<a id="__codelineno-5-14" name="__codelineno-5-14" href="#__codelineno-5-14"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-5-15" name="__codelineno-5-15" href="#__codelineno-5-15"></a><span class="w"> </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"default-key"</span><span class="p">,</span>
<a id="__codelineno-5-16" name="__codelineno-5-16" href="#__codelineno-5-16"></a><span class="w"> </span><span class="nt">"public-key"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-5-17" name="__codelineno-5-17" href="#__codelineno-5-17"></a><span class="w"> </span><span class="nt">"central-keystore-reference"</span><span class="p">:</span><span class="w"> </span><span class="s2">"genkey"</span>
<a id="__codelineno-5-18" name="__codelineno-5-18" href="#__codelineno-5-18"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-5-19" name="__codelineno-5-19" href="#__codelineno-5-19"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-5-20" name="__codelineno-5-20" href="#__codelineno-5-20"></a><span class="w"> </span><span class="p">]</span>
<a id="__codelineno-5-21" name="__codelineno-5-21" href="#__codelineno-5-21"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-5-22" name="__codelineno-5-22" href="#__codelineno-5-22"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-5-23" name="__codelineno-5-23" href="#__codelineno-5-23"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-5-24" name="__codelineno-5-24" href="#__codelineno-5-24"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-5-25" name="__codelineno-5-25" href="#__codelineno-5-25"></a><span class="w"> </span><span class="p">]</span>
<a id="__codelineno-5-26" name="__codelineno-5-26" href="#__codelineno-5-26"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-5-27" name="__codelineno-5-27" href="#__codelineno-5-27"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-5-28" name="__codelineno-5-28" href="#__codelineno-5-28"></a><span class="w"> </span><span class="p">},</span>
</code></pre></div>
<h4 id="infix-services">Infix Services<a class="headerlink" href="#infix-services" title="Permanent link"></a></h4>
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="w"> </span><span class="nt">"infix-services:ssh"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="w"> </span><span class="nt">"enabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
<a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a><span class="w"> </span><span class="nt">"hostkey"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="w"> </span><span class="s2">"genkey"</span>
<a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a><span class="w"> </span><span class="p">],</span>
<a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a><span class="w"> </span><span class="nt">"listen"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a><span class="w"> </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ipv4"</span><span class="p">,</span>
<a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a><span class="w"> </span><span class="nt">"address"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.0.0.0"</span><span class="p">,</span>
<a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a><span class="w"> </span><span class="nt">"port"</span><span class="p">:</span><span class="w"> </span><span class="mi">22</span>
<a id="__codelineno-6-11" name="__codelineno-6-11" href="#__codelineno-6-11"></a><span class="w"> </span><span class="p">},</span>
<a id="__codelineno-6-12" name="__codelineno-6-12" href="#__codelineno-6-12"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-6-13" name="__codelineno-6-13" href="#__codelineno-6-13"></a><span class="w"> </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ipv6"</span><span class="p">,</span>
<a id="__codelineno-6-14" name="__codelineno-6-14" href="#__codelineno-6-14"></a><span class="w"> </span><span class="nt">"address"</span><span class="p">:</span><span class="w"> </span><span class="s2">"::1"</span><span class="p">,</span>
<a id="__codelineno-6-15" name="__codelineno-6-15" href="#__codelineno-6-15"></a><span class="w"> </span><span class="nt">"port"</span><span class="p">:</span><span class="w"> </span><span class="mi">22</span>
<a id="__codelineno-6-16" name="__codelineno-6-16" href="#__codelineno-6-16"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-6-17" name="__codelineno-6-17" href="#__codelineno-6-17"></a><span class="w"> </span><span class="p">]</span>
<a id="__codelineno-6-18" name="__codelineno-6-18" href="#__codelineno-6-18"></a><span class="w"> </span><span class="p">}</span>
</code></pre></div>
<h2 id="integration">Integration<a class="headerlink" href="#integration" title="Permanent link"></a></h2>
<p>When integrating your software stack with Infix there may be protocols
that want to change system settings like hostname and dynamically set
IP address and default gateway, e.g. PROFINET. This section detail a
few recommendations for maintaining co-existence in this scenario of
the multiple producers problem.</p>
<p>First, there's a clear difference between "singleton" like hostsname
and an interface IP address. Consider the case of a static IP and a
DHCP assigned IP, these can co-exist because of the <code>proto NUM</code> field
available in iproute2. This is used in Infix so that static addresses
can be flushed independently of DHCP addresses. The same can be done
by other "address providers", e.g., PROFINET.</p>
<p>Changing properties like hostname should be done by injecting a change
into Infix, by for example calling <code>sysrepocfg -Ediff.xml</code>. Here is an
example of how to get the current hostname and apply an XML diff:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>root@infix-00-00-00:~# sysrepocfg -X -x "/system/hostname" &gt; hostnm.xml
<a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a>root@infix-00-00-00:~# cat hostnm.xml
<a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a>&lt;system xmlns="urn:ietf:params:xml:ns:yang:ietf-system"&gt;
<a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a> &lt;hostname&gt;infix-00-00-00&lt;/hostname&gt;
<a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a>&lt;/system&gt;
<a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a>root@infix-00-00-00:~# edit hostnm.xml
<a id="__codelineno-7-7" name="__codelineno-7-7" href="#__codelineno-7-7"></a>root@infix-00-00-00:~# sysrepocfg -Ehostnm.xml
<a id="__codelineno-7-8" name="__codelineno-7-8" href="#__codelineno-7-8"></a>root@example:~#
</code></pre></div>
<p>Second, perform all changes on <code>running-config</code>, the running datastore.
That way you have a clear state to return to if your application needs
to do a factory reset. E.g., in PROFINET a type 1/2 factory reset will
reset only the PROFINET specific settings. That way you can actually
have your system <code>startup-config</code> disable all physical ports and the
PROFINET application enables only ports that are not deactivated. (On
factory reset it will not know of any ports to deactivate so it will
activate all.)</p>
<p>You can consider the system composed of two entities:</p>
<ul>
<li>NETCONF starts up the system using <code>startup-config</code>, then</li>
<li>Hands over control to your application at runtime</li>
</ul>
<p>Infix is prepared for this by already having two "runlevels" for these
two states. The <code>startup-config</code> is applied in runlevel S (bootstrap)
and the system then enters runlevel 2 for normal operation.</p>
<p>This allow you to keep a set of functionality that is provided by the
underlying system, and another managed by your application. You can
of course in your br2-external provide a sysrepo plugin that block
operations on certain datastores when your application is enabled.
E.g., to prevent changes to startup after initial deployment. In
that case a proper factory reset would be needed to get back to a
"pre-deployment" state where you can reconfigure your baseline.</p>
<h2 id="releases">Releases<a class="headerlink" href="#releases" title="Permanent link"></a></h2>
<p>A release build requires the global variable <code>INFIX_RELEASE</code> to be set.
It can be derived from GIT, if the source tree is kept in GIT VCS. First,
let us talk about versioning in general.</p>
<h3 id="versioning">Versioning<a class="headerlink" href="#versioning" title="Permanent link"></a></h3>
<p>Two popular scheme for versioning a product derived from Infix:</p>
<ol>
<li>Track Infix major.minor, e.g. <em>Foobar v23.08.z</em>, where <code>z</code> is
your patch level. I.e., Foobar v23.08.0 could be based on Infix
v23.08.0, or v23.08.12, it is up to you. Maybe you based it on
v23.08.12 and then back ported changes from v23.10.0, but it was
the first release you made to your customer(s).</li>
<li>Start from v1.0.0 and step the major number every time you sync
with a new Infix release, or every time Infix bumps to the next
Buildroot LTS.</li>
</ol>
<p>The important thing is to be consistent, not only for your own sake,
but also for your end customers. The <em>major.minor.patch</em> style is
the most common and often recommended style, which usually maps well
to other systems, e.g. PROFINET GSDML files require this (<em>VX.Y.Z</em>).
But you can of course use only two numbers, <em>major.minor</em>, as well.</p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>What could be confusing, however, is if you use the name <em>Infix</em>
with your own versioning scheme.</p>
</div>
<h3 id="specifying-versioning-information">Specifying Versioning Information<a class="headerlink" href="#specifying-versioning-information" title="Permanent link"></a></h3>
<p>Two optional environment variables control the version information
recorded in images. Both of these <strong>must be</strong> a lower-case string (no
spaces or other characters outside of 09, az, '.', '_' and '-')
identifying the operating system version, excluding any OS name
information or release code name, and suitable for processing by
scripts or usage in generated filenames.</p>
<h4 id="infix_build_id"><code>INFIX_BUILD_ID</code><a class="headerlink" href="#infix_build_id" title="Permanent link"></a></h4>
<p>Used for <code>BUILD_ID</code> in <code>/etc/os-release</code>.</p>
<p><strong>Default:</strong> <code>$(git describe --always --dirty --tags)</code>, from the <em>top
directory</em>. By default, the top directory refers to the root of the
Infix source tree, but this can be changed by setting the branding
variable <code>INFIX_OEM_PATH</code>, e.g. in a <code>defconfig</code> file or via <code>make
menuconfig</code>, to the path of an enclosing br2-external.</p>
<h4 id="infix_release"><code>INFIX_RELEASE</code><a class="headerlink" href="#infix_release" title="Permanent link"></a></h4>
<p>Used for <code>VERSION</code> and <code>VERSION_ID</code> in <code>/etc/os-release</code> and
generated file names like disk images, etc.</p>
<p><strong>Default:</strong> <code>${INFIX_BUILD_ID}</code></p>
<div class="footnote">
<hr>
<ol>
<li id="fn:1">
<p>The base MAC address is defined in the device's Vital Product
Data (VPD) EEPROM, or similar, which is used by the kernel to
create the system interfaces. This MAC address is usually also
printed on a label on the device.&nbsp;<a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"></a></p>
</li>
</ol>
</div>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright © 2022-2025 The KernelKit Team
</div>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["toc.follow", "navigation.path", "navigation.instant", "navigation.instant.progress", "navigation.tracking", "navigation.indexes", "search.highlight", "search.share", "content.code.copy", "content.code.annotate", "content.footnote.tooltips"], "search": "../assets/javascripts/workers/search.7a47a382.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script>
<script src="../assets/javascripts/bundle.e71a0d61.min.js"></script>
<script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
document$.subscribe(()=>{ lightbox.reload(); });
</script></body></html>