wiki/sop/sop_mirrormanager2/index.html

993 lines
32 KiB
HTML

<!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="The wiki for Rocky Linux Core SIG.">
<link rel="canonical" href="https://sig-core.rocky.page/sop/sop_mirrormanager2/">
<link rel="prev" href="../sop_upstream_prep_checklist/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.4.3, mkdocs-material-9.1.13">
<title>Mirror Manager Maintenance - SIG/Core Wiki</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.85bb2934.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.a6bdf11c.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&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<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>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="teal" data-md-color-accent="teal">
<script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script>
<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="#contact-information" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="SIG/Core Wiki" class="md-header__button md-logo" aria-label="SIG/Core Wiki" data-md-component="logo">
<img src="../../assets/icon-white.svg" 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 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></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">
SIG/Core Wiki
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Mirror Manager Maintenance
</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="teal" data-md-color-accent="teal" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" 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 3 3.19.09m3.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.95 2.06.05m-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.31Z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="teal" data-md-color-accent="teal" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_2">
<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 3 3.19.09m3.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.95 2.06.05m-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.31Z"/></svg>
</label>
</form>
<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.516 6.516 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 5Z"/></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.516 6.516 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 5Z"/></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 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<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 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" 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://git.resf.org/sig_core/wiki" 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 6.4.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 2023 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
</div>
<div class="md-source__repository">
sig_core/wiki
</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 md-nav--integrated" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="SIG/Core Wiki" class="md-nav__button md-logo" aria-label="SIG/Core Wiki" data-md-component="logo">
<img src="../../assets/icon-white.svg" alt="logo">
</a>
SIG/Core Wiki
</label>
<div class="md-nav__source">
<a href="https://git.resf.org/sig_core/wiki" 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 6.4.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 2023 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
</div>
<div class="md-source__repository">
sig_core/wiki
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
SIG/Core
</a>
</li>
<li class="md-nav__item">
<a href="../../members/" class="md-nav__link">
Members
</a>
</li>
<li class="md-nav__item">
<a href="../../what_we_do/" class="md-nav__link">
What We Do
</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">
Documentation
<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>
Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../documentation/" class="md-nav__link">
Release General Overview
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_2" >
<label class="md-nav__link" for="__nav_4_2" id="__nav_4_2_label" tabindex="0">
Composing Releases
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Composing Releases
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../documentation/compose/" class="md-nav__link">
Composing and Managing Releases
</a>
</li>
<li class="md-nav__item">
<a href="../../documentation/compose/koji/" class="md-nav__link">
Manual Updates in Koji
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../documentation/empanadas/" class="md-nav__link">
Empanadas
</a>
</li>
<li class="md-nav__item">
<a href="../../documentation/peridot/" class="md-nav__link">
Peridot
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_5" >
<label class="md-nav__link" for="__nav_4_5" id="__nav_4_5_label" tabindex="0">
References
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
References
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../documentation/references/" class="md-nav__link">
References
</a>
</li>
<li class="md-nav__item">
<a href="../../documentation/references/empanadas_common/" class="md-nav__link">
Empanadas common.py Configuration
</a>
</li>
<li class="md-nav__item">
<a href="../../documentation/references/empanadas_config/" class="md-nav__link">
Empanadas config yaml Configuration
</a>
</li>
<li class="md-nav__item">
<a href="../../documentation/references/empanadas_sig_config/" class="md-nav__link">
Empanadas SIG yaml Configuration
</a>
</li>
</ul>
</nav>
</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_5" checked>
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
SOP
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
SOP
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
SOP (Standard Operationg Procedures)
</a>
</li>
<li class="md-nav__item">
<a href="../sop_release/" class="md-nav__link">
Release Procedures
</a>
</li>
<li class="md-nav__item">
<a href="../sop_compose_8/" class="md-nav__link">
Compose and Repo Sync for Rocky Linux 8
</a>
</li>
<li class="md-nav__item">
<a href="../sop_compose/" class="md-nav__link">
Compose and Repo Sync for Rocky Linux and Peridot
</a>
</li>
<li class="md-nav__item">
<a href="../sop_compose_sig/" class="md-nav__link">
Compose and Repo Sync for Rocky Linux Special Interest Groups
</a>
</li>
<li class="md-nav__item">
<a href="../sop_upstream_prep_checklist/" class="md-nav__link">
Generalized Prep Checklist for Upcoming Releases
</a>
</li>
<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">
Mirror Manager
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Mirror Manager
</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="#contact-information" class="md-nav__link">
Contact Information
</a>
</li>
<li class="md-nav__item">
<a href="#introduction" class="md-nav__link">
Introduction
</a>
</li>
<li class="md-nav__item">
<a href="#pieces" class="md-nav__link">
Pieces
</a>
<nav class="md-nav" aria-label="Pieces">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mirrorlist-server" class="md-nav__link">
Mirrorlist Server
</a>
</li>
<li class="md-nav__item">
<a href="#mirror-manager-2" class="md-nav__link">
Mirror Manager 2
</a>
</li>
<li class="md-nav__item">
<a href="#cdn" class="md-nav__link">
CDN
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#tasks" class="md-nav__link">
Tasks
</a>
<nav class="md-nav" aria-label="Tasks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#new-release" class="md-nav__link">
New Release
</a>
</li>
<li class="md-nav__item">
<a href="#out-of-date-mirrors" class="md-nav__link">
Out-of-date Mirrors
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1>Mirror Manager</h1>
<p>This SOP contains most if not all the information needed for SIG/Core to
maintain and operate Mirror Manager for Rocky Linux.</p>
<h2 id="contact-information">Contact Information<a class="headerlink" href="#contact-information" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Owner</strong></td>
<td>SIG/Core (Release Engineering &amp; Infrastructure)</td>
</tr>
<tr>
<td><strong>Email Contact</strong></td>
<td>infrastructure@rockylinux.org</td>
</tr>
<tr>
<td><strong>Email Contact</strong></td>
<td>releng@rockylinux.org</td>
</tr>
<tr>
<td><strong>Mattermost Contacts</strong></td>
<td><code>@label</code> <code>@neil</code> <code>@tgo</code></td>
</tr>
<tr>
<td><strong>Mattermost Channels</strong></td>
<td><code>~Infrastructure</code></td>
</tr>
</tbody>
</table>
<h2 id="introduction">Introduction<a class="headerlink" href="#introduction" title="Permanent link">&para;</a></h2>
<p>So you made a bad decision and now have to do things to Mirror Manager. Good
luck.</p>
<h2 id="pieces">Pieces<a class="headerlink" href="#pieces" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th><strong>Item</strong></th>
<th>Runs on...</th>
<th>Software</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mirrorlist Server</td>
<td>mirrormanager001</td>
<td>https://github.com/adrianreber/mirrorlist-server/</td>
</tr>
<tr>
<td>Mirror Manager 2</td>
<td>mirrormanager001</td>
<td>https://github.com/fedora-infra/mirrormanager2</td>
</tr>
</tbody>
</table>
<h3 id="mirrorlist-server">Mirrorlist Server<a class="headerlink" href="#mirrorlist-server" title="Permanent link">&para;</a></h3>
<p>This runs two (2) instances. Apache/httpd is configured to send <code>/mirrorlist</code>
to one and <code>/debuglist</code> to the other.</p>
<ul>
<li>
<p>Every fifteen (15) minutes: Mirrorlist cache is regenerated</p>
<ul>
<li>This queries the database for active mirrors and other information and writes a protobuf. The mirrorlist-server reads the protobuf and responds accordingly.</li>
</ul>
</li>
<li>
<p>Every twenty (20) minutes: Service hosting <code>/mirrorlist</code> is restarted</p>
</li>
<li>Every twenty-one (21) minutes: Service hosting <code>/debuglist</code> is restarted</li>
</ul>
<p>Note that the timing for the restart of the mirror list instances are arbitrary.</p>
<h3 id="mirror-manager-2">Mirror Manager 2<a class="headerlink" href="#mirror-manager-2" title="Permanent link">&para;</a></h3>
<p>This is a uwsgi service fronted by an apache/httpd instance. This is responsible
for everything else that is not <code>/mirrorlist</code> or <code>/debuglist</code>. This allows the
mirror managers to, well, manage their mirrors.</p>
<h3 id="cdn">CDN<a class="headerlink" href="#cdn" title="Permanent link">&para;</a></h3>
<p>Fastly sits in front of mirror manager. VPN is required to access the <code>/admin</code> endpoints.</p>
<p>If the backend of the CDN is down, it will attempt to guess what the user wanted to access and spit out a result on the dl.rockylinux.org website. For example, a request for AppStream-8 and x86_64 will result in a <code>AppStream/x86_64/os</code> directory on dl.rockylinux.org. Note that this isn't perfect, but it helps in potential down time or patching.</p>
<div class="highlight"><pre><span></span><code>Fastly -&gt; www firewall -&gt; mirrormanager server
</code></pre></div>
<p>In reality, the flow is a lot more complex, and a diagram should be created to map it out in a more user-friendly manner (@TODO)</p>
<div class="highlight"><pre><span></span><code>User -&gt; Fastly -&gt; AWS NLB over TLS, passthru -&gt; www firewall cluster (decrypt TLS) -&gt; mirrormanager server (Rocky CA TLS)
</code></pre></div>
<h2 id="tasks">Tasks<a class="headerlink" href="#tasks" title="Permanent link">&para;</a></h2>
<p>Below are a list of possible tasks to take with mirror manager, depending on the scenario.</p>
<h3 id="new-release">New Release<a class="headerlink" href="#new-release" title="Permanent link">&para;</a></h3>
<p>For the following steps, the following must be completed:</p>
<ul>
<li>Production rsync endpoints should have all brand new content</li>
<li>New content root should be locked down to 750 (without this, mirror manager cannot view it)</li>
<li>
<p>Disable mirrormanager user cronjobs</p>
</li>
<li>
<p>Update the database with the new content. This is run on a schedule normally (see previous section) but can be done manually.</p>
<p>a. As the mirror manager user, run the following:</p>
</li>
</ul>
<div class="highlight"><pre><span></span><code>/opt/mirrormanager/scan-primary-mirror-0.4.2/target/debug/scan-primary-mirror --debug --config $HOME/scan-primary-mirror.toml --category &#39;Rocky Linux&#39;
/opt/mirrormanager/scan-primary-mirror-0.4.2/target/debug/scan-primary-mirror --debug --config $HOME/scan-primary-mirror.toml --category &#39;Rocky Linux SIGs&#39;
</code></pre></div>
<ol>
<li>
<p>Update the redirects for <code>$reponame-$releasever</code></p>
<p>a. Use psql to mirrormanager server: <code>psql -U mirrormanager -W -h mirrormanager_db_host mirrormanager_db</code></p>
<p>b. Confirm that all three columns are filled and that the second and third columns are identical:
<div class="highlight"><pre><span></span><code>select rr.from_repo AS &quot;From Repo&quot;, rr.to_repo AS &quot;To Repo&quot;, r.prefix AS &quot;Target Repo&quot; FROM repository_redirect AS rr LEFT JOIN repository AS r ON rr.to_repo = r.prefix GROUP BY r.prefix, rr.to_repo, rr.from_repo ORDER BY r.prefix ASC;`
</code></pre></div></p>
<p>c. Change the <code>majorversion</code> redirects to point to the new point release, for example:
<div class="highlight"><pre><span></span><code>update repository_redirect set to_repo = regexp_replace(to_repo, &#39;9\.1&#39;, &#39;9.2&#39;) where from_repo ~ &#39;(\w+)-9-(debug|source)&#39;;`
</code></pre></div></p>
<p>d. Insert new redirects for the major version expected by the installer</p>
<div class="highlight"><pre><span></span><code>insert into repository_redirect (from_repo,to_repo) select REGEXP_REPLACE(rr.from_repo,&#39;9\.1&#39;,&#39;9.2&#39;),REGEXP_REPLACE(rr.to_repo,&#39;9\.1&#39;,&#39;9.2&#39;)FROM repository_redirect AS rr WHERE from_repo ~ &#39;(\w+)-9.1&#39;;
</code></pre></div>
</li>
<li>
<p>Generate the mirrorlist cache and restart the debuglist and verify.</p>
</li>
</ol>
<p>Once the bitflip is initiated, restart mirrorlist and reenable all cronjobs.</p>
<h3 id="out-of-date-mirrors">Out-of-date Mirrors<a class="headerlink" href="#out-of-date-mirrors" title="Permanent link">&para;</a></h3>
<ol>
<li>Get current shasum of repomd.xml. For example: <code>shasum=$(curl https://dl.rockylinux.org/pub/rocky/9.0/BaseOS/x86_64/os/repodata/repomd.xml | sha256sum)</code></li>
<li>Compare against latest propagation log:</li>
</ol>
<div class="highlight"><pre><span></span><code>tail -latr /var/log/mirrormanager/propagation/rocky-9.0-BaseOS-x86_64_propagation.log.*`
export VER=9.0
awk -v shasum=$(curl -s https://dl.rockylinux.org/pub/rocky/$VER/BaseOS/x86_64/os/repodata/repomd.xml | sha256sum | awk &#39;{print $1}&#39;) -F&#39;::&#39; &#39;{split($0,data,&quot;:&quot;)} {if ($4 != shasum) {print data[5], data[6], $2, $7}}&#39; &lt; $(find /var/log/mirrormanager/propagation/ -name &quot;rocky-${VER}-BaseOS-x86_64_propagation.log*&quot; -mtime -1 | tail -1)&#39;
</code></pre></div>
<p>This will generate a table. You can take the IDs in the first column and use the database to disable them by ID (table name: hosts) or go to https://mirrors.rockylinux.org/mirrormanager/host/ID and uncheck 'User active'.</p>
<p>Users can change user active, <em>but</em> they cannot change admin active. It is better to flip user active in this case.</p>
<p>Admins can also view https://mirrors.rockylinux.org/mirrormanager/admin/all_sites if necessary.</p>
<p>Example of table columns:</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>These mirrors are here soley as an example and not to call anyone out, every mirror shows up on here at one point, for some reason, due to natural variations in how mirrors sync.</p>
</div>
<div class="highlight"><pre><span></span><code>[mirrormanager@ord1-prod-mirrormanager001 propagation]$ awk -v shasum=$(curl -s https://dl.rockylinux.org/pub/rocky/9.0/BaseOS/x86_64/os/repodata/repomd.xml | sha256sum | awk &#39;{print $1}&#39;) -F&#39;::&#39; &#39;{split($0,data,&quot;:&quot;)} {if ($4 != shasum) {print data[5], data[6], $2, $7}}&#39; &lt; rocky-9.0-BaseOS-x86_64_propagation.log.1660611632 | column -t
164 mirror.host.ag http://mirror.host.ag/rocky/9.0/BaseOS/x86_64/os/repodata/repomd.xml 404
173 rocky.centos-repo.net http://rocky.centos-repo.net/9.0/BaseOS/x86_64/os/repodata/repomd.xml 403
92 rocky.mirror.co.ge http://rocky.mirror.co.ge/9.0/BaseOS/x86_64/os/repodata/repomd.xml 404
289 mirror.vsys.host http://mirror.vsys.host/rockylinux/9.0/BaseOS/x86_64/os/repodata/repomd.xml 404
269 mirrors.rackbud.com http://mirrors.rackbud.com/rocky/9.0/BaseOS/x86_64/os/repodata/repomd.xml 200
295 mirror.ps.kz http://mirror.ps.kz/rocky/9.0/BaseOS/x86_64/os/repodata/repomd.xml 200
114 mirror.liteserver.nl http://rockylinux.mirror.liteserver.nl/9.0/BaseOS/x86_64/os/repodata/repomd.xml 200
275 mirror.upsi.edu.my http://mirror.upsi.edu.my/rocky/9.0/BaseOS/x86_64/os/repodata/repomd.xml 200
190 mirror.kku.ac.th http://mirror.kku.ac.th/rocky-linux/9.0/BaseOS/x86_64/os/repodata/repomd.xml 404
292 mirrors.cat.pdx.edu http://mirrors.cat.pdx.edu/rocky/9.0/BaseOS/x86_64/os/repodata/repomd.xml 200
370 mirrors.gbnetwork.com http://mirrors.gbnetwork.com/rocky/9.0/BaseOS/x86_64/os/repodata/repomd.xml 404
308 mirror.ihost.md http://mirror.ihost.md/rockylinux/9.0/BaseOS/x86_64/os/repodata/repomd.xml 404
87 mirror.freedif.org http://mirror.freedif.org/Rocky/9.0/BaseOS/x86_64/os/repodata/repomd.xml 404
194 mirrors.bestthaihost.com http://mirrors.bestthaihost.com/rocky/9.0/BaseOS/x86_64/os/repodata/repomd.xml 404
30 mirror.admax.se http://mirror.admax.se/rocky/9.0/BaseOS/x86_64/os/repodata/repomd.xml 200
195 mirror.uepg.br http://mirror.uepg.br/rocky/9.0/BaseOS/x86_64/os/repodata/repomd.xml 404
247 mirrors.ipserverone.com http://mirrors.ipserverone.com/rocky/9.0/BaseOS/x86_64/os/repodata/repomd.xml 404&#39;
</code></pre></div>
<hr>
<div class="md-source-file">
<small>
Last update:
2023-05-16
</small>
</div>
</article>
</div>
</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 &copy; 2023 Rocky Enterprise Software Foundation
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": ["search.highlight", "search.suggest", "toc.integrate"], "search": "../../assets/javascripts/workers/search.208ed371.min.js", "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"}}</script>
<script src="../../assets/javascripts/bundle.b4d07000.min.js"></script>
</body>
</html>