cinc-migration-check / index.html
getreadystack's picture
Upload index.html with huggingface_hub
a8cfb8f verified
Raw History Blame Contribute Delete
41.5 kB
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Cinc Chef Migration — check your code for free</title>
<meta name="description" content="This free tool flags Chef Infra installs, licence acceptance and server use, with the Cinc replacement.">
<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 defer data-auto-init src="https://cdn.jsdelivr.net/npm/@polar-sh/checkout@latest/dist/embed.global.js"></script>
<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/cinc-migration-check"><style data-yj-mfit="1">#out{max-width:100%}#out td,#out th{overflow-wrap:anywhere}#out pre,#out code{white-space:pre-wrap;overflow-wrap:anywhere}@media (max-width:640px){table{display:block;max-width:100%;overflow-x:auto}pre{max-width:100%;overflow-x:auto}code,a{overflow-wrap:anywhere}img,svg,video,canvas,iframe{max-width:100%}textarea,input,select{max-width:100%;box-sizing:border-box}.yj-lgbar{position:static!important;justify-content:flex-end;margin:0 0 10px}#out table:not(:has(tr>:nth-child(4))){display:table;table-layout:fixed;width:100%}#out table:has(tr>:nth-child(4)),#out table:has(tr>:nth-child(4)) tbody,#out table:has(tr>:nth-child(4)) tr,#out table:has(tr>:nth-child(4)) td{display:block;width:auto;overflow:visible}#out table:has(tr>:nth-child(4)) thead{display:none}#out table:has(tr>:nth-child(4)) tr{padding:10px 0;border-bottom:1px solid rgba(128,128,128,.28)}#out table:has(tr>:nth-child(4)) td{border:0;padding:1px 0}#out table:has(tr>:nth-child(4)) td:nth-child(-n+3){display:inline-block;margin-right:10px;font-size:12px;opacity:.78}}</style>
</head>
<body>
<div class="wrap">
<h1>Cinc Chef Migration — check your code for free</h1>
<p class="lede">Cinc migration check for Chef users: flags lines that install Chef Infra Client 15+, accept the Chef licence or run Chef Infra Server (open-source EOL 2026-11-30), with the Cinc replacement. Runs entirely in your browser — nothing is uploaded.</p>
<textarea id="src" spellcheck="false">#!/bin/sh
# provision.sh - bring a new web node and the config server under Chef
set -e
curl -L https://omnitruck.chef.io/install.sh | sudo bash -s -- -v 18
export CHEF_LICENSE=accept
sudo mkdir -p /etc/chef
sudo cp client.rb /etc/chef/client.rb
sudo chef-client --chef-license accept -o 'role[web]'
echo 'export PATH=/opt/chef/bin:$PATH' | sudo tee /etc/profile.d/chef.sh
knife bootstrap web02.example.com -U ubuntu --sudo -N web02
ssh config01.example.com 'sudo chef-server-ctl reconfigure'</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> Checks the open file (bootstrap script, kitchen.yml, client.rb, Dockerfile, CI workflow) and names every line that pulls licensed Chef or the retiring Chef Infra Server, with the Cinc replacement. <strong>In the editor:</strong> Scans the whole repository in one pass and exports one Cinc migration checklist (Markdown) per file, ready for the change ticket. — that part asks for a licence key.</div>
<div id="buy" style="margin:8px 0"><a href="https://getreadystack.com/api/buy/cl/polar_cl_ULZCqlDDVlAkHEIimwceeRBLwIN5jkGYnqeFk2iWJhm" data-polar-checkout data-polar-checkout-theme="light">Full version: repository scan + Markdown checklist per file — $29 once</a> · one licence key per person or team seat. Progress Chef Business costs $59 per node per year.</div>
<p class="note">Same engine as the VS Code extension, byte for byte.</p>
</div>
<script>var CINC_RULES = [
{
"id": "chef-install-url",
"sev": "error",
"label": "omnitruck.chef.io install script",
"re": "(?:omnitruck\\.chef\\.io|packages\\.chef\\.io|(?:www\\.)?chef\\.io/chef/install\\.(?:sh|ps1))",
"flags": "i",
"msg": "Installs Chef's own build; Chef Infra Client 15 and later stop until the Chef licence is accepted",
"fix": "https://omnitruck.cinc.sh/install.sh (install.ps1 on Windows), the Apache-2.0 Cinc build of the same source"
},
{
"id": "chef-license-flag",
"sev": "error",
"label": "--chef-license accept",
"re": "--chef-license(?:\\s+|=)[\"']?accept",
"flags": "i",
"msg": "Accepts the Chef licence on this node (Chef Infra Client 15+ licence gate)",
"fix": "drop the flag after switching to Cinc Client; Cinc is not a licensed product and asks for no acceptance"
},
{
"id": "chef-license-env",
"sev": "error",
"label": "CHEF_LICENSE=accept",
"re": "CHEF_LICENSE[\"']?\\s*[=:]\\s*[\"']?accept",
"flags": "i",
"msg": "CHEF_LICENSE environment variable accepts the Chef licence for every Chef binary in this shell or job",
"fix": "remove CHEF_LICENSE once the job installs Cinc Client, Cinc Workstation or Cinc Auditor"
},
{
"id": "chef-license-config",
"sev": "error",
"label": "chef_license 'accept'",
"re": "(?:^|\\s)chef_license\\s*(?::|=)?\\s*[\"']?accept",
"flags": "",
"msg": "chef_license in client.rb, config.rb or kitchen.yml accepts the Chef licence",
"fix": "delete the chef_license line and install Cinc Client; in kitchen.yml set product_name: cinc"
},
{
"id": "kitchen-product-chef",
"sev": "error",
"label": "product_name: chef",
"re": "product_name\\s*:\\s*[\"']?chef(?:[\"'\\s]|$)",
"flags": "i",
"msg": "Test Kitchen installs Chef Infra Client and runs the licence check on every converge",
"fix": "product_name: cinc (Test Kitchen skips licence acceptance for Cinc)"
},
{
"id": "chef-docker-image",
"sev": "error",
"label": "chef/chef image",
"re": "(?:^\\s*FROM\\s+|image:\\s*[\"']?)(?:docker\\.io/)?chef/(?:chef|inspec|chef-workstation)(?::[\\w.\\-]+)?",
"flags": "i",
"msg": "Chef-published container image ships the licensed Chef binaries",
"fix": "build from your base image and install Cinc from https://omnitruck.cinc.sh/install.sh"
},
{
"id": "chef-package-install",
"sev": "error",
"label": "package install of chef",
"re": "\\b(?:apt-get|apt|yum|dnf|zypper|choco|brew|gem)\\s+(?:install|upgrade)\\b[^#\\n]*\\b(?:chef|chef-client|chef-workstation|chefdk|inspec|inspec-bin)(?![\\w.\\-])",
"flags": "i",
"msg": "Package or gem install of Chef's licensed Chef, Workstation or InSpec build",
"fix": "install cinc, cinc-workstation or cinc-auditor instead; the chef-client, chef and inspec wrappers keep old scripts working"
},
{
"id": "chef-install-action",
"sev": "error",
"label": "actionshub/chef-install",
"re": "uses:\\s*[\"']?actionshub/chef-install",
"flags": "i",
"msg": "CI step installs Chef Workstation from Chef, so the job must accept the Chef licence",
"fix": "run curl -L https://omnitruck.cinc.sh/install.sh | sudo bash -s -- -P cinc-workstation"
},
{
"id": "knife-bootstrap-default",
"sev": "warn",
"label": "knife bootstrap (default installer)",
"re": "\\bknife\\s+bootstrap\\b(?![^#\\n]*--bootstrap-(?:url|install-command))",
"flags": "i",
"msg": "knife bootstrap without --bootstrap-url installs Chef Infra Client from Chef on the new node",
"fix": "add --bootstrap-url https://omnitruck.cinc.sh/install.sh"
},
{
"id": "opt-chef-path",
"sev": "warn",
"label": "/opt/chef path",
"re": "/opt/chef(?:/|\\b)(?!-)",
"flags": "",
"msg": "Hard-coded /opt/chef path; Cinc packages install under /opt/cinc",
"fix": "/opt/cinc (or call chef-client from PATH and let the Cinc wrapper resolve it)"
},
{
"id": "chef-infra-server",
"sev": "error",
"label": "chef-server-ctl",
"re": "\\bchef-server-(?:ctl|core)\\b|chef-server\\.rb|/opt/opscode\\b",
"flags": "i",
"msg": "Open-source Chef Infra Server",
"fix": "move to Cinc Server with a knife-ec-backup backup and restore; nodes re-attach when the FQDN is unchanged",
"eol": {
"date": "2026-11-30",
"before": "Progress ends the open-source Chef Infra Server on 2026-11-30 ({days} days left)",
"after": "the open-source Chef Infra Server reached end of life on 2026-11-30 ({days} days ago)"
}
}
];</script>
<script>/* Cinc migration check: one rule per line that pulls licensed Chef. Same file runs in VS Code and in the browser. */
(function () {
var RULES = (typeof module !== 'undefined') ? require('./rules.json') : window.CINC_RULES;
var DAY = 86400000;
function toDay(v) {
var s = String(v || '').slice(0, 10);
var d = new Date(s + 'T00:00:00Z');
if (isNaN(d.getTime())) { var n = new Date(); d = new Date(Date.UTC(n.getFullYear(), n.getMonth(), n.getDate())); }
return d;
}
function eolNote(rule, today) {
var e = rule.eol;
if (!e) return '';
var cut = toDay(e.date);
var days = Math.round(Math.abs(cut - today) / DAY);
return ': ' + (today < cut ? e.before : e.after).replace('{days}', days);
}
function check(text, opts) {
opts = opts || {};
var today = toDay(opts.today);
var lines = String(text || '').split(/\r?\n/);
var findings = [];
lines.forEach(function (line, i) {
var t = line.trim();
if (!t || t.charAt(0) === '#' || t.indexOf('//') === 0 || t.indexOf('REM ') === 0) return;
RULES.forEach(function (r) {
if (!new RegExp(r.re, r.flags || '').test(line)) return;
findings.push({ check: r.id, sev: r.sev, line: i + 1,
msg: r.msg + eolNote(r, today) + '. Fix: ' + r.fix + '.',
text: t.slice(0, 120), fix: r.fix });
});
});
return { findings: findings, errors: findings.filter(function (f) { return f.sev === 'error'; }).length,
warnings: findings.filter(function (f) { return f.sev === 'warn'; }).length, rules: RULES.length };
}
var api = { engine: { check: check }, RULES: RULES, RULE_COUNT: RULES.length };
if (typeof window !== 'undefined') window.CINCENGINE = api;
if (typeof module !== 'undefined') module.exports = 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 CINCREPORT = { escapeHtml: escapeHtml, summaryLine: summaryLine, toText: toText, toHtml: toHtml };
if (typeof module !== 'undefined' && module.exports) module.exports = CINCREPORT;
else window.CINCREPORT = CINCREPORT;
</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.CINCENGINE.engine.check(src.value,{today:today.value}); out.innerHTML=window.CINCREPORT.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://marketplace.visualstudio.com/items?itemName=ReadyStack.cinc-migration-check" rel="noopener" data-yj-install-door="mp" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'cinc-migration-check',src:'mp',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">VS Code Marketplace</a><a href="https://open-vsx.org/extension/readystack/cinc-migration-check" rel="noopener" data-yj-install-door="ovsx" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'cinc-migration-check',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><pre style="margin:.5rem 0 0;padding:.6rem .8rem;background:#f3f5f8;border-radius:8px;font-size:.9rem;overflow:auto">ext install ReadyStack.cinc-migration-check</pre><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://getreadystack.com/api/buy/team" 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 Cinc Migration Check: Chef Infra licence gate 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:"cinc-migration-check",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);document.addEventListener("click",function(ev){var b=ev.target&&ev.target.closest?ev.target.closest("button,input[type=submit]"):null;if(b&&!b.closest("[data-yj],[data-yj-cta],[data-yj-install],[data-yj-alert],.yj-find,.yj-related,#yj-ask,.yjp"))mv(ev);},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 full version <span class="yj-price">$29</span></h2><p class="yj-cta-paid" style="margin:.25rem 0 .6rem;color:#1f2a37">Scans the whole repository in one pass and exports one Cinc migration checklist (Markdown) per file, ready for the change ticket.</p><p class="yj-cta-pay" style="margin:.25rem 0 1rem;color:#5b6b7c;font-size:.94rem">One payment, one licence key for this tool. The key is shown right after payment.</p><p class="yj-cta-anchor" style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">Progress Chef Business costs $59 per node per year (chef.io/how-to-buy).</p><a href="https://getreadystack.com/api/buy/cl/polar_cl_ULZCqlDDVlAkHEIimwceeRBLwIN5jkGYnqeFk2iWJhm" 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-29">Updated 2026-09-29</time> · ReadyStack</p><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","dateModified":"2026-09-29","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/sku398535_result_card.jpg" alt="Cinc Migration Check: Chef Infra licence gate lint" loading="lazy" style="max-width:100%;border-radius:6px"></p>
<p>Migrate from Chef Infra Client to Cinc: six lines in a provision.sh that still pull licensed Chef</p>
<p>6 lines in a sample provision.sh still pull licensed Chef, and DevOps engineers and SREs moving a Chef fleet to Cinc usually find them one converge at a time. Since Chef Infra Client 15, Chef&#x27;s own binaries stop until the Chef licence is accepted (docs.chef.io/chef_license_accept). Progress has also announced that the open-source Chef Infra Server reaches end of life on 2026-11-30, with no security fixes after the end of October 2026. Cinc is the Apache-2.0 build of the same source, and Cinc Client asks for no licence acceptance.</p>
<h3>The sample file</h3>
<p>The sample is a short provision.sh that installs Chef Infra Client 18 on a web node, runs one role, bootstraps a second node and reconfigures the config server. Cinc Migration Check gives 6 findings on it: 4 errors and 2 warnings. The Cinc rewrite of the same script gives 0.</p>
<table><thead><tr><th>Line that pulls licensed Chef (left)</th><th>Cinc fix (right)</th></tr></thead><tbody><tr><td>omnitruck.chef.io install.sh</td><td>omnitruck.cinc.sh install.sh</td></tr><tr><td>export CHEF_LICENSE=accept</td><td>delete it, Cinc needs none</td></tr><tr><td>chef-client --chef-license accept</td><td>drop the flag</td></tr><tr><td>PATH=/opt/chef/bin</td><td>/opt/cinc/bin</td></tr><tr><td>knife bootstrap (default installer)</td><td>--bootstrap-url omnitruck.cinc.sh</td></tr><tr><td>chef-server-ctl reconfigure</td><td>Cinc Server via knife-ec-backup</td></tr></tbody></table>
<h3>Why each line matters</h3>
<p>The install line fetches install.sh from omnitruck.chef.io, which installs Chef&#x27;s licensed build. The Cinc omnitruck at omnitruck.cinc.sh takes the same -v flag, so the line change is one host name.</p>
<p><code>export CHEF_LICENSE=accept</code> and <code>--chef-license accept</code> both accept the Chef licence for the node. They are easy to miss because the run succeeds; the licence was accepted silently. After the switch to Cinc they are dead weight and should go, so that nobody later reinstalls Chef&#x27;s build and inherits the acceptance.</p>
<p>The PATH line hard-codes /opt/chef/bin. Cinc packages install under /opt/cinc. The Cinc binaries include wrappers for the upstream names (chef-client, chef, inspec), so calls that go through PATH keep working, but a hard-coded path does not.</p>
<p><code>knife bootstrap</code> without --bootstrap-url installs Chef Infra Client from Chef on the new node, even when every existing node runs Cinc. Adding <code>--bootstrap-url https://omnitruck.cinc.sh/install.sh</code> fixes it.</p>
<p><code>chef-server-ctl reconfigure</code> shows the script still manages an open-source Chef Infra Server. The finding counts the days to 2026-11-30 from the check date: 62 days on 2026-09-29. The Cinc migration guide moves the server with a knife-ec-backup backup and restore; nodes re-attach when the FQDN is unchanged.</p>
<h3>What grep and chatbots miss</h3>
<p>Grep for chef matches every cookbook, role, resource and directory name, so the six licence lines drown in noise. Chatbots tend to answer &quot;install Cinc&quot; and stop; they rarely mention knife&#x27;s default installer, Test Kitchen&#x27;s product_name: cinc switch, or the Chef Infra Server date.</p>
<h3>The other file types</h3>
<p>The same 11 rules read kitchen.yml (product_name: chef, chef_license: accept), client.rb, Dockerfiles that start FROM chef/chef, package installs of chef, chef-workstation or inspec, and GitHub workflows that use actionshub/chef-install.</p>
<h3>Try it</h3>
<p>Install Cinc Migration Check in VS Code or open the free web page, paste a bootstrap script or kitchen.yml, and read the findings with their Cinc fix. For comparison, Progress lists Chef Business at $59 per node per year.</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/sku398535_result_card.jpg" style="width:100%;max-width:360px;border-radius:10px;display:block;margin:0 auto"><source src="/media/sku398535_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 Cinc Migration Check do?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">It reads a bootstrap script, kitchen.yml, client.rb, Dockerfile or CI workflow and flags every line that still pulls licensed Chef: Chef&#x27;s omnitruck install script, CHEF_LICENSE=accept, --chef-license accept, chef_license in config, product_name: chef, Chef images and packages, the default knife bootstrap installer, /opt/chef paths and the open-source Chef Infra Server. Each finding names the Cinc replacement. It has 11 rules and runs locally.</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 Cinc Migration Check for?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">DevOps engineers, SREs and platform teams who run Chef Infra Client, Test Kitchen or a self-hosted Chef Infra Server and are moving to Cinc, the Apache-2.0 build of the same Chef source. It suits teams that do not want to accept the Chef licence on every node, and teams whose open-source Chef Infra Server reaches end of life on 2026-11-30.</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 grep for chef or ask a chatbot?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Grep for chef hits every cookbook, role and resource name, so the licence lines drown. A chatbot rarely knows that knife bootstrap installs Chef&#x27;s own build unless --bootstrap-url is set, that Test Kitchen skips licence acceptance only with product_name: cinc, or that Progress ends the open-source Chef Infra Server on 2026-11-30. This check flags those lines and gives the Cinc fix.</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 does the paid version add?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Free: check the open file in VS Code, or paste it into the web page, and every finding is shown with its line number and Cinc fix, with no key and no limit. Paid, $29 once: scan the whole repository in one pass and export one Markdown migration checklist per file for the change ticket. One licence key per person or team seat.</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 staying on licensed Chef cost compared with this check?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Staying on Chef&#x27;s commercial licence is priced per node: Progress lists Chef Business at $59 per node per year and Enterprise at $189 per node per year on chef.io/how-to-buy. Cinc itself is free under Apache-2.0. The free check of one file costs nothing, and the repository scan with checklist export costs $29 once.</p></details><script type="application/ld+json" data-yj="yj-faq-ld">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does Cinc Migration Check do?", "acceptedAnswer": {"@type": "Answer", "text": "It reads a bootstrap script, kitchen.yml, client.rb, Dockerfile or CI workflow and flags every line that still pulls licensed Chef: Chef's omnitruck install script, CHEF_LICENSE=accept, --chef-license accept, chef_license in config, product_name: chef, Chef images and packages, the default knife bootstrap installer, /opt/chef paths and the open-source Chef Infra Server. Each finding names the Cinc replacement. It has 11 rules and runs locally."}}, {"@type": "Question", "name": "Who is Cinc Migration Check for?", "acceptedAnswer": {"@type": "Answer", "text": "DevOps engineers, SREs and platform teams who run Chef Infra Client, Test Kitchen or a self-hosted Chef Infra Server and are moving to Cinc, the Apache-2.0 build of the same Chef source. It suits teams that do not want to accept the Chef licence on every node, and teams whose open-source Chef Infra Server reaches end of life on 2026-11-30."}}, {"@type": "Question", "name": "Why not just grep for chef or ask a chatbot?", "acceptedAnswer": {"@type": "Answer", "text": "Grep for chef hits every cookbook, role and resource name, so the licence lines drown. A chatbot rarely knows that knife bootstrap installs Chef's own build unless --bootstrap-url is set, that Test Kitchen skips licence acceptance only with product_name: cinc, or that Progress ends the open-source Chef Infra Server on 2026-11-30. This check flags those lines and gives the Cinc fix."}}, {"@type": "Question", "name": "What is free and what does the paid version add?", "acceptedAnswer": {"@type": "Answer", "text": "Free: check the open file in VS Code, or paste it into the web page, and every finding is shown with its line number and Cinc fix, with no key and no limit. Paid, $29 once: scan the whole repository in one pass and export one Markdown migration checklist per file for the change ticket. One licence key per person or team seat."}}, {"@type": "Question", "name": "What does staying on licensed Chef cost compared with this check?", "acceptedAnswer": {"@type": "Answer", "text": "Staying on Chef's commercial licence is priced per node: Progress lists Chef Business at $59 per node per year and Enterprise at $189 per node per year on chef.io/how-to-buy. Cinc itself is free under Apache-2.0. The free check of one file costs nothing, and the repository scan with checklist export costs $29 once."}}]}</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:398535,slug:"cinc-migration-check",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/pekko-migration-gate"><span class="yj-rel-t">Pekko Migration Gate — Akka BSL licence check</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/pyside6-migration-lint"><span class="yj-rel-t">PySide6 Migration Lint: PyQt5/PyQt6 Licence 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/firestore-rules-guard"><span class="yj-rel-t">Firestore Rules Guard</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/js-licence-key-gate"><span class="yj-rel-t">JS Licence Key Gate: GPL &amp; Eval Keys</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/mcp-2026-migration-lint"><span class="yj-rel-t">MCP 2026 Migration Lint</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>