getreadystack's picture
Upload index.html with huggingface_hub
fb29186 verified
Raw History Blame Contribute Delete
40 kB
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Centos 7 end of support — check operating system support in vagrant</title>
<meta name="description" content="This browser tool flags Vagrantfile boxes with operating systems past end of support and shows the line, date, and elapsed days.">
<style>
:root{color-scheme:light}body{margin:0;font:15px/1.55 system-ui,-apple-system,"Segoe UI",sans-serif;background:#faf9f5;color:#1a1512}
.wrap{max-width:960px;margin:0 auto;padding:28px 18px 60px}h1{font-size:26px;margin:0 0 6px}.lede{color:#4a403a;margin:0 0 16px}
textarea{width:100%;min-height:260px;font:13px/1.45 ui-monospace,Menlo,Consolas,monospace;padding:12px;border:1px solid #d9d0c4;border-radius:8px;box-sizing:border-box}
.bar{display:flex;gap:10px;align-items:center;margin:12px 0}button{font:600 15px system-ui;padding:10px 18px;border:0;border-radius:8px;background:#1a1512;color:#fff;cursor:pointer}
input[type=date]{font:14px system-ui;padding:8px;border:1px solid #d9d0c4;border-radius:6px}
table{border-collapse:collapse;width:100%;font-size:14px;margin-top:10px}th,td{text-align:left;padding:8px 10px;border-bottom:1px solid #eee;vertical-align:top}th{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:#7a6e65}
.sev.error{color:#a8551f;font-weight:700}.sev.warn,.sev.warning{color:#96691f}.ok{color:#2a6446;font-weight:600}.sum{font-weight:600}
.note{font-size:13px;color:#7a6e65;margin-top:18px}#paid{margin-top:22px;padding:14px 16px;border:1px solid #e2d8cb;border-radius:10px;background:#fffdfa}
</style>
<script data-grow-initializer="">!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e);}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTphZjljMzgyMC0yMmU5LTRhYjgtYTIxNS03OTRhMGY1N2ExYzM=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t);})();</script>
<!--yj-canon-s101--><link rel="canonical" href="https://getreadystack.com/tools/vagrantfile-eol-box-lint"></head>
<body>
<div class="wrap">
<h1>Centos 7 end of support — check operating system support in vagrant</h1>
<p class="lede">Flags Vagrantfile boxes whose OS is past end of support: Debian 11 LTS ended 2026-08-31, CentOS 7 2024-06-30, Ubuntu 20.04 2025-05-31. Each finding shows the line, the date and the days since it passed. Runs entirely in your browser — nothing is uploaded.</p>
<textarea id="src" spellcheck="false"># -*- mode: ruby -*-
# vi: set ft=ruby :
# Legacy QA lab, last touched in 2022.
BOXES = [
{ name: "api", box: "ubuntu/focal64" },
]
Vagrant.configure("2") do |config|
BOXES.each do |b|
config.vm.define b[:name] do |node|
node.vm.box = b[:box]
end
end
config.vm.define "db" do |db|
db.vm.box = "centos/7"
db.vm.provision "shell", inline: &lt;&lt;-SHELL
sed -i 's|^#baseurl|baseurl|' /etc/yum.repos.d/CentOS-Base.repo
curl -s http://mirrorlist.centos.org/?release=7 &gt; /tmp/mirrors
SHELL
end
config.vm.define "cache" do |cache|
cache.vm.box = "debian/bullseye64"
end
config.vm.define "legacy" do |legacy|
legacy.vm.box = "bento/debian-10.13"
end
config.vm.define "bsd" do |bsd|
bsd.vm.box = "freebsd/FreeBSD-13.2-RELEASE"
end
end</textarea>
<div class="bar"><button id="go">Check</button><label>as of <input type="date" id="today"></label></div>
<div id="out" aria-live="polite"></div>
<div id="paid"><strong>Free here:</strong> Check one Vagrantfile: every box past end of support, with its line, date and days since it passed.. <strong>In the editor:</strong> Scan every Vagrantfile in the workspace at once and export one migration report for the whole lab. — that part asks for a licence key.</div>
<p class="note">Same engine as the VS Code extension, byte for byte.</p>
</div>
<script>var VEOL_RULES = [
{"id": "ubuntu-12.04", "kind": "box", "os": "Ubuntu 12.04 LTS (precise)", "re": "precise|ubuntu[-_/]?12\\.?04", "eol": "2017-04-28", "fix": "move to an Ubuntu 24.04 box such as bento/ubuntu-24.04"},
{"id": "ubuntu-14.04", "kind": "box", "os": "Ubuntu 14.04 LTS (trusty)", "re": "trusty|ubuntu[-_/]?14\\.?04", "eol": "2019-04-30", "fix": "move to an Ubuntu 24.04 box such as bento/ubuntu-24.04"},
{"id": "ubuntu-16.04", "kind": "box", "os": "Ubuntu 16.04 LTS (xenial)", "re": "xenial|ubuntu[-_/]?16\\.?04", "eol": "2021-04-30", "fix": "move to an Ubuntu 24.04 box such as bento/ubuntu-24.04"},
{"id": "ubuntu-18.04", "kind": "box", "os": "Ubuntu 18.04 LTS (bionic)", "re": "bionic|ubuntu[-_/]?18\\.?04", "eol": "2023-05-31", "fix": "move to an Ubuntu 24.04 box such as bento/ubuntu-24.04"},
{"id": "ubuntu-20.04", "kind": "box", "os": "Ubuntu 20.04 LTS (focal)", "re": "focal|ubuntu[-_/]?20\\.?04", "eol": "2025-05-31", "fix": "move to an Ubuntu 24.04 box such as bento/ubuntu-24.04"},
{"id": "debian-8", "kind": "box", "os": "Debian 8 (jessie)", "re": "jessie|debian[-_/]?8(?:[._-]\\d+)*$", "eol": "2020-06-30", "fix": "move to a Debian 12 or 13 box"},
{"id": "debian-9", "kind": "box", "os": "Debian 9 (stretch)", "re": "stretch|debian[-_/]?9(?:[._-]\\d+)*$", "eol": "2022-06-30", "fix": "move to a Debian 12 or 13 box"},
{"id": "debian-10", "kind": "box", "os": "Debian 10 (buster)", "re": "buster|debian[-_/]?10(?:[._-]\\d+)*$", "eol": "2024-06-30", "fix": "move to a Debian 12 or 13 box"},
{"id": "debian-11", "kind": "box", "os": "Debian 11 (bullseye) LTS", "re": "bullseye|debian[-_/]?11(?:[._-]\\d+)*$", "eol": "2026-08-31", "fix": "move to a Debian 12 or 13 box"},
{"id": "centos-6", "kind": "box", "os": "CentOS 6", "re": "centos[-_/]?6(?:[._-]\\d+)*$", "eol": "2020-11-30", "fix": "move to almalinux/9 or rockylinux/9"},
{"id": "centos-7", "kind": "box", "os": "CentOS 7", "re": "centos[-_/]?7(?:[._-]\\d+)*$", "eol": "2024-06-30", "fix": "move to almalinux/9 or rockylinux/9"},
{"id": "centos-8", "kind": "box", "os": "CentOS Linux 8", "re": "centos[-_/]?8(?:[._-]\\d+)*$", "eol": "2021-12-31", "fix": "move to almalinux/9 or rockylinux/9"},
{"id": "centos-stream-8", "kind": "box", "os": "CentOS Stream 8", "re": "centos[-_/]?(?:stream[-_]?8|8s)(?:[._-]\\d+)*$", "eol": "2024-05-31", "fix": "move to almalinux/9, rockylinux/9 or a CentOS Stream 9 box"},
{"id": "freebsd-13", "kind": "box", "os": "FreeBSD 13", "re": "freebsd[-_/]?13(?:[._-]|$)", "eol": "2026-04-30", "fix": "move to a FreeBSD 14 box"},
{"id": "centos-mirrorlist", "kind": "line", "os": "mirrorlist.centos.org", "re": "mirrorlist\\.centos\\.org", "eol": "2024-06-30", "fix": "point yum at vault.centos.org or drop the CentOS box"}
]
;</script>
<script>// Vagrantfile EOL box lint: flags config.vm.box values whose OS is past end of support.
(function () {
var RULES = (typeof module !== 'undefined') ? require('./rules.json') : window.VEOL_RULES;
var DAY = 86400000;
function parseDay(s) {
var m = /(\d{4})-(\d{2})-(\d{2})/.exec(String(s || ''));
if (!m) return null;
var t = Date.UTC(+m[1], +m[2] - 1, +m[3]);
return isNaN(t) ? null : t;
}
function todayOf(opts) {
var t = parseDay(opts && opts.today);
if (t !== null) return t;
var n = new Date();
return Date.UTC(n.getFullYear(), n.getMonth(), n.getDate());
}
// box = "x" · box: "x" · :box => "x" · box: x (unquoted, YAML-driven labs)
var BOX_RE = /(?:^|[\s.{,(:])(?::)?box["']?\s*(?:=>|=|:)\s*["']?([A-Za-z0-9._\/-]+)["']?/;
function check(text, opts) {
var today = todayOf(opts);
var warnDays = (opts && opts.warnDays) || 180;
var lines = String(text || '').replace(/\r\n?/g, '\n').split('\n');
var findings = [];
for (var i = 0; i < lines.length; i++) {
var raw = lines[i];
var line = raw.replace(/\s+/g, ' ').trim();
if (!line || line.charAt(0) === '#') continue;
var code = line.replace(/\s#.*$/, '');
var bm = BOX_RE.exec(code);
var box = bm ? bm[1] : null;
for (var r = 0; r < RULES.length; r++) {
var rule = RULES[r];
var re = new RegExp(rule.re, 'i');
var hit = rule.kind === 'box' ? (box && re.test(box)) : re.test(code);
if (!hit) continue;
var eol = parseDay(rule.eol);
var days = Math.round((today - eol) / DAY);
var what = rule.kind === 'box' ? 'box "' + box + '" is ' + rule.os : rule.os + ' is used on this line';
if (days >= 0) {
findings.push({ check: rule.id, sev: 'error', line: i + 1,
msg: what + ' - end of support ' + rule.eol + ' (' + days + ' days ago). Fix: ' + rule.fix + '.' });
} else if (-days <= warnDays) {
findings.push({ check: rule.id, sev: 'warning', line: i + 1,
msg: what + ' - end of support ' + rule.eol + ' (in ' + (-days) + ' days). Fix: ' + rule.fix + '.' });
}
if (rule.kind === 'box') break;
}
}
return { findings: findings };
}
var api = { engine: { check: check }, RULES: RULES, RULE_COUNT: RULES.length };
if (typeof module !== 'undefined' && module.exports) module.exports = api;
if (typeof window !== 'undefined') window.VEOLENGINE = api;
})();
</script>
<script>// ⛔뼈대 — kit/scaffold.py 가 찍는다 (s143). findings [{check,sev,msg,line?}] → 글/HTML. 같은 파일이 Node 와 브라우저에서 산다.
'use strict';
function escapeHtml(s) { return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;'); }
function summaryLine(res) {
const f = (res && res.findings) || []; const e = f.filter(function (x) { return String(x.sev || 'error').toLowerCase().startsWith('err'); }).length;
return f.length ? (f.length + ' finding' + (f.length === 1 ? '' : 's') + ' (' + e + ' error' + (e === 1 ? '' : 's') + ')') : 'Clean — no findings.';
}
function toText(res, label) {
const f = (res && res.findings) || [];
const lines = ['== ' + (label || '') + ' — ' + summaryLine(res)];
f.forEach(function (x) { lines.push(' ' + String(x.sev || 'error').toUpperCase().slice(0, 4) + ' ' + (x.line ? 'L' + x.line + ' ' : '') + (x.check || x.id || '') + ' ' + (x.msg || x.message || '')); });
return lines.join('\n');
}
function toHtml(res) {
const f = (res && res.findings) || [];
if (!f.length) return '<p class="ok">' + escapeHtml(summaryLine(res)) + '</p>';
const rows = f.map(function (x) { return '<tr><td class="sev ' + escapeHtml(String(x.sev || 'error')) + '">' + escapeHtml(String(x.sev || 'error')) + '</td><td>' + (x.line ? 'L' + escapeHtml(x.line) : '') + '</td><td><code>' + escapeHtml(x.check || x.id || '') + '</code></td><td>' + escapeHtml(x.msg || x.message || '') + '</td></tr>'; }).join('');
return '<p class="sum">' + escapeHtml(summaryLine(res)) + '</p><table><thead><tr><th>Level</th><th>Line</th><th>Check</th><th>What</th></tr></thead><tbody>' + rows + '</tbody></table>';
}
var VEOLREPORT = { escapeHtml: escapeHtml, summaryLine: summaryLine, toText: toText, toHtml: toHtml };
if (typeof module !== 'undefined' && module.exports) module.exports = VEOLREPORT;
else window.VEOLREPORT = VEOLREPORT;
</script>
<script>
(function(){
var src=document.getElementById('src'), out=document.getElementById('out'), go=document.getElementById('go'), today=document.getElementById('today');
today.value=new Date().toISOString().slice(0,10);
function run(){ try { var res=window.VEOLENGINE.engine.check(src.value,{today:today.value}); out.innerHTML=window.VEOLREPORT.toHtml(res); } catch(e){ out.innerHTML='<p class="sev error">Could not run: '+String(e.message||e)+'</p>'; } }
go.onclick=run; if (src.value.trim()) run();
})();
</script>
<section data-yj-install="free" style="margin:2rem auto 1rem;max-width:46rem;padding:1.25rem 1.25rem;border:1px solid #cfe3d6;border-radius:12px;background:#f6fbf8;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .4rem;font-size:1.2rem">Install free</h2><p style="margin:0 0 .8rem;color:#41505f">Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.</p><a href="https://open-vsx.org/extension/readystack/vagrantfile-eol-box-lint" rel="noopener" data-yj-install-door="ovsx" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'vagrantfile-eol-box-lint',src:'ovsx',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Open VSX (Cursor, VSCodium)</a><a href="https://www.npmjs.com/package/@readystack/vagrantfile-eol-box-lint" rel="noopener" data-yj-install-door="npm" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'vagrantfile-eol-box-lint',src:'npm',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">npm</a><a href="https://hub.docker.com/r/getreadystack/vagrantfile-eol-box-lint" rel="noopener" data-yj-install-door="docker" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'vagrantfile-eol-box-lint',src:'docker',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Docker Hub</a><pre style="margin:.5rem 0 0;padding:.6rem .8rem;background:#f3f5f8;border-radius:8px;font-size:.9rem;overflow:auto">npx @readystack/vagrantfile-eol-box-lint &lt;file&gt;
docker run --rm -v &quot;$PWD:/w&quot; getreadystack/vagrantfile-eol-box-lint /w</pre><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://getreadystack.com/api/buy/cl/polar_cl_l6iN1uWt0FwWu7tBsczD0jWpP2vxFM54Wdwqb3KPi1G" rel="nofollow" style="color:#0f7b3f;text-decoration:underline">Team? One key for every ReadyStack linter, 5 seats, $149 once</a></p></section>
<section data-yj-alert="rule" style="margin:1rem auto 1.5rem;max-width:46rem;padding:1.1rem 1.25rem;border:1px solid #d9dee6;border-radius:12px;background:#fbfcfd;font:15px/1.55 system-ui,-apple-system,Segoe UI,sans-serif"><b style="font-size:1.05rem">Get one email when this rule changes</b><div style="opacity:.78;margin:.35rem 0 .8rem">We watch the regulation and vendor sources behind Vagrantfile EOL Box Lint every day. When a rule changes, you get a single email with what changed and the updated check. No newsletter.</div><div style="display:flex;gap:8px;flex-wrap:wrap"><input id="yjae" type="email" placeholder="you@example.com" style="flex:1;min-width:210px;padding:11px 13px;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:#fff;color:inherit"><button id="yjab" style="padding:11px 18px;border-radius:8px;border:0;cursor:pointer;background:#0f7b3f;color:#fff;font:600 15px system-ui,sans-serif">Notify me</button></div><div id="yjao" hidden style="margin-top:.6rem;color:#0f7b3f">You're on the list. One email when it changes.</div><script>(function(){var b=document.getElementById("yjab"),e=document.getElementById("yjae");if(!b||!e)return;b.addEventListener("click",function(){var v=e.value.trim();if(!/.+@.+\..+/.test(v))return;try{localStorage.setItem("yj_em","1");}catch(_){}fetch(location.origin+"/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:v,slug:"vagrantfile-eol-box-lint",lang:"en",source:"rule_alert"+((b.closest&&b.closest("section")&&b.closest("section").getAttribute("data-yj-moved"))?"_at_result":"")})}).then(function(r){var o=document.getElementById("yjao");o.hidden=false;if(!r.ok){o.textContent="Could not save - please try again.";}}).catch(function(){var o=document.getElementById("yjao");o.hidden=false;o.textContent="Could not save - please try again.";});});})();</script><script>(function(){var e=document.getElementById("yjae"),s=e&&e.closest?e.closest("section"):null,o=document.getElementById("out");if(!s||!o)return;var d=false;function mv(ev){if(d)return;if(ev&&ev.target&&s.contains(ev.target))return;d=true;var b=o;while(b.parentNode&&b.parentNode!==document.body&&b.parentNode.tagName!=="MAIN"&&b.parentNode.tagName!=="ARTICLE")b=b.parentNode;if(!b.parentNode||b===s||b.contains(s))return;try{b.parentNode.insertBefore(s,b.nextSibling);s.setAttribute("data-yj-moved","1");}catch(_){}}document.addEventListener("input",mv,true);document.addEventListener("change",mv,true);})();</script></section>
<section data-yj-cta="paid" style="margin:3rem auto;max-width:46rem;padding:1.5rem 1.25rem;border:1px solid #d8dee9;border-radius:12px;background:#fbfcfe;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .5rem;font-size:1.25rem">Get the complete version <span class="yj-price">$29</span></h2><p style="margin:.25rem 0 1rem;color:#41505f">This page is the working piece. The full pack has everything below.</p><p style="margin:0 0 1rem;color:#41505f">6 findings in 1 file: boxes past end of support, with the date and the box to move to</p><a href="https://getreadystack.com/api/buy/cl/polar_cl_V7QtBX4V2E3XUIKVrEbN77vUFPXzkCCMtGEOl17yhbk" rel="nofollow" style="display:inline-block;padding:.7rem 1.3rem;border-radius:8px;background:#1b64f2;color:#fff;text-decoration:none;font-weight:600">Buy the full version — $29</a></section>
<!--yj-share-s101--><div style="margin:28px 0 8px;text-align:center"><button id="yjcp" type="button" style="font:inherit;padding:10px 18px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Copy link</button><button id="yjimg" type="button" style="font:inherit;padding:10px 18px;margin-left:8px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Save result as image</button></div><script>(function(){var b=document.getElementById("yjimg");if(!b)return;b.addEventListener("click",function(){var o=document.getElementById("out");var txt=(o&&(o.innerText||o.textContent)||"").trim();if(!txt){b.textContent="(no result yet)";setTimeout(function(){b.textContent="Save result as image";},1500);return;}var lines=txt.split(String.fromCharCode(10)).filter(function(x){return x.trim();}).slice(0,10);var W=1200,P=56,c=document.createElement("canvas");c.width=W;var lh=38,H=P*2+70+lines.length*lh+60;c.height=H;var x=c.getContext("2d");x.fillStyle="#1a1512";x.fillRect(0,0,W,H);x.fillStyle="#f3e9d2";x.font="600 34px system-ui,Segoe UI,Arial";var t=(document.title||"").split("|")[0].trim();x.fillText(t.slice(0,54),P,P+34);x.font="22px ui-monospace,Menlo,Consolas,monospace";x.fillStyle="#e8dcc4";for(var i=0;i<lines.length;i++){x.fillText(lines[i].slice(0,88),P,P+70+i*lh+22);}x.font="600 22px system-ui,Segoe UI,Arial";x.fillStyle="#c9a227";var d=location.hostname.replace("www.","");x.fillText(d,W-P-x.measureText(d).width,H-P+6);c.toBlob(function(bl){var u=URL.createObjectURL(bl),a=document.createElement("a");a.href=u;a.download=(t||"result").replace(/[^a-z0-9]+/gi,"-").toLowerCase()+"-"+d+".png";document.body.appendChild(a);a.click();setTimeout(function(){URL.revokeObjectURL(u);a.remove();},2000);},"image/png");});})();</script><script>(function(){var b=document.getElementById("yjcp");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var u=location.href.split("#")[0];function d(){b.textContent="Link copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(u).then(d,function(){prompt("",u);});}else{prompt("",u);}});})();</script>
<script data-yj="yj-view-beacon">(function(){try{var p=location.pathname;var k='yjv:'+p;if(sessionStorage.getItem(k))return;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",ref:(document.referrer||''),src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}catch(e){}})();</script>
<script data-yj="yj-use-beacon">(function(){try{var o=document.getElementById('out');if(!o)return;var p=location.pathname,k='yju:'+p,sent=false;function fire(){if(sent||sessionStorage.getItem(k))return;if(!(o.textContent||'').replace(/\s+/g,'').length)return;sent=true;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",t:'use',src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}var mo=new MutationObserver(function(){fire();if(sent)mo.disconnect();});mo.observe(o,{childList:true,characterData:true,subtree:true});}catch(e){}})();</script><div class="yj-home-find"><div class="yj-lgbar"><a href="/" class="yj-lg on">EN</a><a href="/de/" class="yj-lg">DE</a><a href="/ja/" class="yj-lg">JA</a><a href="/es/" class="yj-lg">ES</a><a href="/pt/" class="yj-lg">PT</a></div><section class="yj-find"><h2>Find a tool</h2><input id="yjq" type="search" autocomplete="off" placeholder="Type a product name, format or task"><div id="yjr"></div></section><style>.yj-lgbar{position:absolute;top:14px;right:18px;display:flex;gap:6px;z-index:60}.yj-lg{font:600 12px/1 system-ui,sans-serif;padding:6px 9px;border-radius:4px;text-decoration:none;color:#8b96a3;border:1px solid rgba(140,150,165,.28)}.yj-lg:hover{color:#e8eaed;border-color:rgba(160,175,195,.6)}.yj-lg.on{color:#0e1116;background:#cfd6de;border-color:#cfd6de}.yj-find{max-width:760px;margin:34px auto 8px;padding:0 20px}.yj-find h2{font:600 20px/1.3 system-ui,sans-serif;margin:0 0 10px}#yjq{width:100%;box-sizing:border-box;padding:13px 15px;font:400 15.5px system-ui,sans-serif;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:rgba(255,255,255,.04);color:inherit}#yjq:focus{outline:none;border-color:#7FD1C4}#yjr{margin-top:10px;display:flex;flex-direction:column;gap:6px}#yjr a{display:flex;justify-content:space-between;gap:12px;padding:11px 14px;border:1px solid rgba(140,150,165,.22);border-radius:6px;text-decoration:none;font:400 14.5px/1.4 system-ui,sans-serif;color:inherit}#yjr a:hover{border-color:#7FD1C4}#yjr .pr{font:600 13px system-ui,sans-serif;color:#5fbf9a;white-space:nowrap}</style><script>(function(){var q=document.getElementById("yjq"),r=document.getElementById("yjr"),D=null;function load(){if(D)return Promise.resolve(D);return fetch("/search-index.json").then(function(x){return x.json();}).then(function(j){D=j;return j;}).catch(function(){D=[];return D;});}function esc(t){return String(t).replace(/[&<>"]/g,function(c){return {"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[c];});}function run(){var v=q.value.trim().toLowerCase();if(v.length<2){r.innerHTML="";return;}load().then(function(j){var w=v.split(/\s+/),o=[];for(var i=0;i<j.length&&o.length<12;i++){var t=j[i].t.toLowerCase();var ok=true;for(var k=0;k<w.length;k++){if(t.indexOf(w[k])<0){ok=false;break;}}if(ok)o.push(j[i]);}r.innerHTML=o.length?o.map(function(x){return "<a href=\""+esc(x.u)+"\">"+"<span>"+esc(x.t)+"</span>"+(x.p?"<span class=\"pr\">$"+x.p+"</span>":"")+"</a>";}).join(""):"";});}q.addEventListener("input",run);q.addEventListener("focus",load);})();</script></div><section data-yj="yj-facts-v1" style="max-width:920px;margin:48px auto 0;padding:0 20px;font-family:system-ui,sans-serif"><style>.yj-article p{font:400 15.5px/1.7 system-ui,sans-serif;color:#26313b;margin:0 0 12px;max-width:72ch}.yj-article h2,.yj-article h3,.yj-article h4{font:600 17px/1.35 system-ui,sans-serif;color:#1b1f24;margin:22px 0 8px}.yj-article table{border-collapse:collapse;margin:10px 0 16px;font:14px/1.45 system-ui,sans-serif}.yj-article th,.yj-article td{border:1px solid #e2e6ea;padding:6px 10px;text-align:left}.yj-article th{background:#f4f6f8}.yj-article pre{background:#0f1720;color:#e6edf3;padding:12px 14px;border-radius:8px;overflow:auto;font:13px/1.5 ui-monospace,Menlo,monospace}.yj-article code{font:13px ui-monospace,Menlo,monospace;background:#f1f3f5;padding:1px 4px;border-radius:3px}.yj-article pre code{background:none;padding:0}.yj-article ul,.yj-article ol{font:15px/1.6 system-ui,sans-serif;color:#26313b}</style><p style="font:400 13px/1.5 system-ui,sans-serif;color:#6b7680;margin:0 0 14px"><time datetime="2026-09-27">Updated 2026-09-27</time> · ReadyStack</p><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","dateModified":"2026-09-27","author":{"@type":"Organization","name":"ReadyStack"}}</script><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Worked example</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 16px;color:#5b6570">Real numbers from this tool, line by line.</p><div class="yj-article"><p><img src="https://getreadystack.com/img/promo/sku326300_result_card.jpg" alt="Vagrantfile EOL Box Lint" loading="lazy" style="max-width:100%;border-radius:6px"></p>
<p>A DevOps or QA engineer running one old Vagrant lab gets 6 findings in 1 file: six lines in a single Vagrantfile point at an operating system past end of support, and the newest is Debian 11, whose LTS ended on 2026-08-31.</p>
<p>That is the measured result on the sample lab that ships with Vagrantfile EOL Box Lint. Five machines, one provision script.</p>
<h3>What was in the file</h3>
<p>The lab defines an API box on <code>ubuntu/focal64</code>, a database on <code>centos/7</code> with a shell provisioner, a cache on <code>debian/bullseye64</code>, a legacy service on <code>bento/debian-10.13</code> and a build host on <code>freebsd/FreeBSD-13.2-RELEASE</code>. None of these lines look wrong.</p>
<p>The lint reported, on 2026-09-27:</p>
<pre><code>L5 ubuntu/focal64 Ubuntu 20.04 ended 2025-05-31 (484 days ago)
L16 centos/7 CentOS 7 ended 2024-06-30 (819 days ago)
L19 mirrorlist.centos.org CentOS 7 ended 2024-06-30 (819 days ago)
L24 debian/bullseye64 Debian 11 LTS ended 2026-08-31 (27 days ago)
L28 bento/debian-10.13 Debian 10 ended 2024-06-30 (819 days ago)
L32 freebsd/FreeBSD-13.2-RELEASE FreeBSD 13 ended 2026-04-30 (150 days ago)</code></pre>
<p>The Debian 11 line is only 27 days past its date. That box was inside support in August and outside it in September, and nothing in Vagrant says so.</p>
<h3>Why the usual checks miss it</h3>
<p><code>vagrant box outdated</code> answers one question: is there a newer version of this box? For <code>debian/bullseye64</code> the answer can be &quot;no, you are current&quot;, which is true and still leaves you on an OS with no LTS coverage. The command has no idea what an end-of-support date is.</p>
<p>Chatbots have the opposite problem. They know what end of support means, but their dates stop at the training cutoff. Ask one trained before 2026-08-31 about Debian 11 and it will tell you LTS is still running.</p>
<p>The CentOS 7 case costs the most. The database box&#x27;s provision script calls <code>mirrorlist.centos.org</code>, which no longer answers. Any teammate who runs <code>vagrant destroy &amp;&amp; vagrant up</code> gets a failed <code>yum</code> step instead of a database. The lint flags that line on its own (rule <code>centos-mirrorlist</code>) because the box name alone does not show which provision steps will break.</p>
<h3>How the lint decides</h3>
<p>There are 15 rules in a plain JSON table: 14 OS releases (Ubuntu 12.04 to 20.04, Debian 8 to 11, CentOS 6, 7, 8 and Stream 8, FreeBSD 13) plus the mirrorlist line. For each <code>config.vm.box</code>, <code>box:</code> or <code>:box =&gt;</code> value the engine matches the release number or codename, so <code>ubuntu/focal64</code>, <code>bento/ubuntu-20.04</code> and <code>generic/ubuntu2004</code> all hit the same rule. It then counts days from today to the end-of-support date. A date in the past is an error. A date less than 180 days away is a warning.</p>
<p>A clean file with <code>bento/ubuntu-24.04</code>, <code>almalinux/9</code> and <code>debian/bookworm64</code> returns 0 findings.</p>
<h3>What to do with the six lines</h3>
<p>Every finding names a target: <code>bento/ubuntu-24.04</code> for the Ubuntu boxes, <code>almalinux/9</code> or <code>rockylinux/9</code> for CentOS, a Debian 12 or 13 box for bullseye and buster, a FreeBSD 14 box for the build host, and <code>vault.centos.org</code> if you truly have to keep CentOS 7 alive for a while longer.</p>
<h3>Free and licensed</h3>
<p>The free check runs on one Vagrantfile, fully, in the editor or on the web page, and nothing is uploaded. If you keep a dozen labs, the licensed tier scans every Vagrantfile in the workspace at once and exports one migration report you can attach to the ticket.</p>
<p>Open your oldest Vagrantfile and see how many lines come back.</p></div><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:30px 0 10px;color:#1b1f24">15 seconds — what it actually does</h2><video controls muted playsinline preload="none" poster="/img/promo/sku326300_result_card.jpg" style="width:100%;max-width:360px;border-radius:10px;display:block;margin:0 auto"><source src="/media/sku326300_short.mp4" type="video/mp4"></video><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:34px 0 6px;color:#1b1f24">Questions people ask</h2><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does Vagrantfile EOL Box Lint do?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">It reads each config.vm.box line in a Vagrantfile and flags boxes whose operating system is past end of support. It has 15 rules: 14 OS releases (Ubuntu 12.04 to 20.04, Debian 8 to 11, CentOS 6, 7, 8 and Stream 8, FreeBSD 13) and the dead mirrorlist.centos.org line. Each finding gives the line, the date, the days since and the box to move to.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Who is this lint for?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">DevOps, QA and platform engineers who still keep Vagrant labs for local testing, training or CI, often boxes set up years ago on CentOS 7, Ubuntu 20.04 or Debian 11. Debian 11 LTS ended on 2026-08-31, so a debian/bullseye64 lab that was fine in August stopped getting security fixes in September.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why not use vagrant box outdated or ask a chatbot?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">vagrant box outdated only reports whether a newer version of the same box exists. It never says that the OS inside the box has reached end of support. A chatbot trained before 2026-08-31 can still describe Debian 11 as supported. This lint compares each box against a dated table and counts days from today.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What is free and what needs a licence key?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">The free tier checks one Vagrantfile completely: every end-of-life box and the mirrorlist.centos.org line, each with its date and the box to move to. The sample lab gives 6 findings in 1 file. A licence key adds a workspace scan of every Vagrantfile at once, plus one exported migration report for the whole lab.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does checking this by hand cost?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">By hand you open every Vagrantfile, map each box name such as generic/ubuntu2004 or bento/debian-10.13 to its OS release, then look up 14 separate vendor end-of-support pages and do the date arithmetic. The lint does that in the editor as you type, and the free check needs no account.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why not just ask ChatGPT or another AI chat?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. Vagrantfile EOL Box Lint checks the file you open against 15 rules from a rule set dated 2026-09-27, and points at the exact line with the fix. For a filing, an audit or a client you need that dated result on your own files.</p></details><script type="application/ld+json" data-yj="yj-faq-ld">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does Vagrantfile EOL Box Lint do?", "acceptedAnswer": {"@type": "Answer", "text": "It reads each config.vm.box line in a Vagrantfile and flags boxes whose operating system is past end of support. It has 15 rules: 14 OS releases (Ubuntu 12.04 to 20.04, Debian 8 to 11, CentOS 6, 7, 8 and Stream 8, FreeBSD 13) and the dead mirrorlist.centos.org line. Each finding gives the line, the date, the days since and the box to move to."}}, {"@type": "Question", "name": "Who is this lint for?", "acceptedAnswer": {"@type": "Answer", "text": "DevOps, QA and platform engineers who still keep Vagrant labs for local testing, training or CI, often boxes set up years ago on CentOS 7, Ubuntu 20.04 or Debian 11. Debian 11 LTS ended on 2026-08-31, so a debian/bullseye64 lab that was fine in August stopped getting security fixes in September."}}, {"@type": "Question", "name": "Why not use vagrant box outdated or ask a chatbot?", "acceptedAnswer": {"@type": "Answer", "text": "vagrant box outdated only reports whether a newer version of the same box exists. It never says that the OS inside the box has reached end of support. A chatbot trained before 2026-08-31 can still describe Debian 11 as supported. This lint compares each box against a dated table and counts days from today."}}, {"@type": "Question", "name": "What is free and what needs a licence key?", "acceptedAnswer": {"@type": "Answer", "text": "The free tier checks one Vagrantfile completely: every end-of-life box and the mirrorlist.centos.org line, each with its date and the box to move to. The sample lab gives 6 findings in 1 file. A licence key adds a workspace scan of every Vagrantfile at once, plus one exported migration report for the whole lab."}}, {"@type": "Question", "name": "What does checking this by hand cost?", "acceptedAnswer": {"@type": "Answer", "text": "By hand you open every Vagrantfile, map each box name such as generic/ubuntu2004 or bento/debian-10.13 to its OS release, then look up 14 separate vendor end-of-support pages and do the date arithmetic. The lint does that in the editor as you type, and the free check needs no account."}}, {"@type": "Question", "name": "Why not just ask ChatGPT or another AI chat?", "acceptedAnswer": {"@type": "Answer", "text": "A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. Vagrantfile EOL Box Lint checks the file you open against 15 rules from a rule set dated 2026-09-27, and points at the exact line with the fix. For a filing, an audit or a client you need that dated result on your own files."}}]}</script><div id="yj-ask" style="margin:36px 0 0;padding:18px 18px 16px;border:1px solid #e2e6ea;border-radius:10px;background:#fbfbfc"><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:0 0 4px;color:#1b1f24">Ask about this tool</h2><p style="font:400 13.5px/1.5 system-ui,sans-serif;margin:0 0 12px;color:#5b6570">One question, answered by the person who built it. Your email only if you want the answer sent.</p><form onsubmit="return yjAsk(event)" style="display:grid;gap:8px"><textarea name="question" required minlength="10" maxlength="2000" rows="3" placeholder="Your question" style="font:14px/1.5 system-ui,sans-serif;padding:10px;border:1px solid #cfd6dd;border-radius:6px"></textarea><div style="display:flex;gap:8px;flex-wrap:wrap"><input type="email" name="email" placeholder="Email (optional)" style="flex:1;min-width:200px;font:14px system-ui,sans-serif;padding:9px 10px;border:1px solid #cfd6dd;border-radius:6px"><button type="submit" style="font:600 14px system-ui,sans-serif;padding:9px 18px;border:0;border-radius:6px;background:#1b1f24;color:#fff;cursor:pointer">Send</button></div><p id="yj-ask-msg" style="font:13px system-ui,sans-serif;margin:2px 0 0;color:#0a6238;min-height:1em"></p></form><script>function yjAsk(e){e.preventDefault();var f=e.target,m=document.getElementById("yj-ask-msg");m.style.color="#0a6238";fetch(location.origin+"/api/ask",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sku:326300,slug:"vagrantfile-eol-box-lint",lang:"en",question:f.question.value,email:f.email.value,page:location.pathname})}).then(function(r){if(!r.ok)throw 0;m.textContent="Thanks \u2014 noted. Answers land on this page and, if you left an email, in your inbox.";f.question.value="";}).catch(function(){m.style.color="#a8551f";m.textContent="Could not send. Please try again in a minute.";});return false;}</script></div></section><section class="yj-related" style="max-width:920px;margin:56px auto 40px;padding:0 20px"><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Same job, next tool</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Free in the browser. The full version is a one-time licence.</p><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px"><a class="yj-rel-c" href="https://getreadystack.com/tools/dotnet-eol-support-gate"><span class="yj-rel-t">.NET EOL &amp; CRA Support Window Gate</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/base-image-eol-lint"><span class="yj-rel-t">Base Image EOL Lint - Dockerfile and CI end-of-life check</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/aks-eks-support-cliff-lint"><span class="yj-rel-t">AKS LTS &amp; EKS Extended Support Lint for Terraform</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/actions-deprecation-lint-2026"><span class="yj-rel-t">GitHub Actions Deprecation Lint: the 2026 runner and action EOL dates</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/rds-extended-support-cost-lint"><span class="yj-rel-t">RDS Extended Support Cost Lint for Terraform</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/runtime-eol-deploy-block-audit"><span class="yj-rel-t">Runtime EOL and Deploy-Block Audit for Docker, CI and AWS Lambda</span><span class="yj-rel-p">$29</span></a></div><style>.yj-rel-c{display:flex;flex-direction:column;gap:8px;padding:15px 16px;border:1px solid #e2e6ea;border-radius:6px;text-decoration:none;background:#fff}.yj-rel-c:hover{border-color:#b9c2cb;background:#fafbfc}.yj-rel-t{font:500 14.5px/1.42 system-ui,sans-serif;color:#1b1f24}.yj-rel-p{font:600 13px system-ui,sans-serif;color:#0a6238}</style></section></body>
</html>