Setting Cart Order

Joe Kaiser edited this page Jan 25, 2018 · 4 revisions

Cart ordering

I've been asked the same question twice in the past month so I figured I would record it for posterity.

If you add a couple of carts and enable them on a box, the cart will always run as one of the last installation snippets. Hoever, the carts themselves are picked up in random order. So when you add a cart with a sensible name, what if you want to run one before the other?

I'll create and enable two carts, "custom1" and "custom2." (You should use something descriptive for your site that tells anyone who has to manage this infrastructure exactly what is in the cart, like: "puppet" or "ddosattack" [Hi NSA!] or "stupidcrapymycompanymakesmeinstall.")

Without any ordering changes, this is the order these two carts will have when a kickstart is generated:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom1-backend.xml
info - parsed carts/custom1/nodes/cart-custom2-backend.xml
info - parsed carts/site-custom/nodes/cart-site-custom-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/peerdone.xml
</snip>

( # stack list host profile <nodename> reveals the kickstart that will be generated and run during install. The "Node Traversal Order" at the beginning of this output, tells you what order kickstart snippets [in xml files] are compiled into the full kickstart script.)

Okay, so let's say we want the "custom1" cart to follow the "custom2" cart. We are going to manipulate the graph file in the "custom1" cart to get the order we want. So we are going to manipulate the order for the cart that we want to be second.

(Graph files place a node xml into the kickstart profile for a machine. These are compiled as long as the cart is enabled. Disable the cart, the graph file and, hence, the kickstart node xml files, are not compiled into the kickstart profile.)

Go into the graph directory of the "custom1" cart:

# cd /export/stack/cart/custom1/graph

and get into the cart-custom1.xml

It will look like this:

<?xml version="1.0" standalone="no"?>
<graph>
<description>
custom1 cart
</description>
<order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>
</graph>

and these are the lines we care about:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>

Every cart has an "order" tag and an "edge" tag.

The "order" tag tells this cart what it should follow if it has a "tail" in it and what to precede if it has a "head" in it.

The "edge" tag tells what node xml file (Those are in the "nodes" directory in your cart.) should be used in the graph. The order will tell the kickstart compiler where to place it.

So to have "custom1" follow "custom2," we would edit it this way:

 <order head="cart-custom2-backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which gives us this:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom2-backend.xml
info - parsed carts/custom1/nodes/cart-custom1-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
</snip>

There are other ways of doing it. What I showed is the simplest and easiest to understand.

Now we can get weird about it.

You can also do something like this:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which will give you the same thing. but it's more obscure and it depends on the sure knowledge that ordering for "cart-custom2" is tailed to "backend," which it is by default unless one of your co-workers/buddies changed it just because.

So this way is indirect. I recommend the first way because it's obvious that way, and it assures that cart1 will always follow cart2 even if someone messes with the ordering in cart2's graph. Capisce?

We can get even weirder and edit "custom2" to always be the head to "custom1," but then we're just being fancy.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Setting Cart Order

Joe Kaiser edited this page Jan 25, 2018 · 4 revisions

Cart ordering

I've been asked the same question twice in the past month so I figured I would record it for posterity.

If you add a couple of carts and enable them on a box, the cart will always run as one of the last installation snippets. Hoever, the carts themselves are picked up in random order. So when you add a cart with a sensible name, what if you want to run one before the other?

I'll create and enable two carts, "custom1" and "custom2." (You should use something descriptive for your site that tells anyone who has to manage this infrastructure exactly what is in the cart, like: "puppet" or "ddosattack" [Hi NSA!] or "stupidcrapymycompanymakesmeinstall.")

Without any ordering changes, this is the order these two carts will have when a kickstart is generated:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom1-backend.xml
info - parsed carts/custom1/nodes/cart-custom2-backend.xml
info - parsed carts/site-custom/nodes/cart-site-custom-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/peerdone.xml
</snip>

( # stack list host profile <nodename> reveals the kickstart that will be generated and run during install. The "Node Traversal Order" at the beginning of this output, tells you what order kickstart snippets [in xml files] are compiled into the full kickstart script.)

Okay, so let's say we want the "custom1" cart to follow the "custom2" cart. We are going to manipulate the graph file in the "custom1" cart to get the order we want. So we are going to manipulate the order for the cart that we want to be second.

(Graph files place a node xml into the kickstart profile for a machine. These are compiled as long as the cart is enabled. Disable the cart, the graph file and, hence, the kickstart node xml files, are not compiled into the kickstart profile.)

Go into the graph directory of the "custom1" cart:

# cd /export/stack/cart/custom1/graph

and get into the cart-custom1.xml

It will look like this:

<?xml version="1.0" standalone="no"?>
<graph>
<description>
custom1 cart
</description>
<order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>
</graph>

and these are the lines we care about:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>

Every cart has an "order" tag and an "edge" tag.

The "order" tag tells this cart what it should follow if it has a "tail" in it and what to precede if it has a "head" in it.

The "edge" tag tells what node xml file (Those are in the "nodes" directory in your cart.) should be used in the graph. The order will tell the kickstart compiler where to place it.

So to have "custom1" follow "custom2," we would edit it this way:

 <order head="cart-custom2-backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which gives us this:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom2-backend.xml
info - parsed carts/custom1/nodes/cart-custom1-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
</snip>

There are other ways of doing it. What I showed is the simplest and easiest to understand.

Now we can get weird about it.

You can also do something like this:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which will give you the same thing. but it's more obscure and it depends on the sure knowledge that ordering for "cart-custom2" is tailed to "backend," which it is by default unless one of your co-workers/buddies changed it just because.

So this way is indirect. I recommend the first way because it's obvious that way, and it assures that cart1 will always follow cart2 even if someone messes with the ordering in cart2's graph. Capisce?

We can get even weirder and edit "custom2" to always be the head to "custom1," but then we're just being fancy.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Setting Cart Order

Joe Kaiser edited this page Jan 25, 2018 · 4 revisions

Cart ordering

I've been asked the same question twice in the past month so I figured I would record it for posterity.

If you add a couple of carts and enable them on a box, the cart will always run as one of the last installation snippets. Hoever, the carts themselves are picked up in random order. So when you add a cart with a sensible name, what if you want to run one before the other?

I'll create and enable two carts, "custom1" and "custom2." (You should use something descriptive for your site that tells anyone who has to manage this infrastructure exactly what is in the cart, like: "puppet" or "ddosattack" [Hi NSA!] or "stupidcrapymycompanymakesmeinstall.")

Without any ordering changes, this is the order these two carts will have when a kickstart is generated:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom1-backend.xml
info - parsed carts/custom1/nodes/cart-custom2-backend.xml
info - parsed carts/site-custom/nodes/cart-site-custom-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/peerdone.xml
</snip>

( # stack list host profile <nodename> reveals the kickstart that will be generated and run during install. The "Node Traversal Order" at the beginning of this output, tells you what order kickstart snippets [in xml files] are compiled into the full kickstart script.)

Okay, so let's say we want the "custom1" cart to follow the "custom2" cart. We are going to manipulate the graph file in the "custom1" cart to get the order we want. So we are going to manipulate the order for the cart that we want to be second.

(Graph files place a node xml into the kickstart profile for a machine. These are compiled as long as the cart is enabled. Disable the cart, the graph file and, hence, the kickstart node xml files, are not compiled into the kickstart profile.)

Go into the graph directory of the "custom1" cart:

# cd /export/stack/cart/custom1/graph

and get into the cart-custom1.xml

It will look like this:

<?xml version="1.0" standalone="no"?>
<graph>
<description>
custom1 cart
</description>
<order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>
</graph>

and these are the lines we care about:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>

Every cart has an "order" tag and an "edge" tag.

The "order" tag tells this cart what it should follow if it has a "tail" in it and what to precede if it has a "head" in it.

The "edge" tag tells what node xml file (Those are in the "nodes" directory in your cart.) should be used in the graph. The order will tell the kickstart compiler where to place it.

So to have "custom1" follow "custom2," we would edit it this way:

 <order head="cart-custom2-backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which gives us this:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom2-backend.xml
info - parsed carts/custom1/nodes/cart-custom1-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
</snip>

There are other ways of doing it. What I showed is the simplest and easiest to understand.

Now we can get weird about it.

You can also do something like this:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which will give you the same thing. but it's more obscure and it depends on the sure knowledge that ordering for "cart-custom2" is tailed to "backend," which it is by default unless one of your co-workers/buddies changed it just because.

So this way is indirect. I recommend the first way because it's obvious that way, and it assures that cart1 will always follow cart2 even if someone messes with the ordering in cart2's graph. Capisce?

We can get even weirder and edit "custom2" to always be the head to "custom1," but then we're just being fancy.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Setting Cart Order

Joe Kaiser edited this page Jan 25, 2018 · 4 revisions

Cart ordering

I've been asked the same question twice in the past month so I figured I would record it for posterity.

If you add a couple of carts and enable them on a box, the cart will always run as one of the last installation snippets. Hoever, the carts themselves are picked up in random order. So when you add a cart with a sensible name, what if you want to run one before the other?

I'll create and enable two carts, "custom1" and "custom2." (You should use something descriptive for your site that tells anyone who has to manage this infrastructure exactly what is in the cart, like: "puppet" or "ddosattack" [Hi NSA!] or "stupidcrapymycompanymakesmeinstall.")

Without any ordering changes, this is the order these two carts will have when a kickstart is generated:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom1-backend.xml
info - parsed carts/custom1/nodes/cart-custom2-backend.xml
info - parsed carts/site-custom/nodes/cart-site-custom-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/peerdone.xml
</snip>

( # stack list host profile <nodename> reveals the kickstart that will be generated and run during install. The "Node Traversal Order" at the beginning of this output, tells you what order kickstart snippets [in xml files] are compiled into the full kickstart script.)

Okay, so let's say we want the "custom1" cart to follow the "custom2" cart. We are going to manipulate the graph file in the "custom1" cart to get the order we want. So we are going to manipulate the order for the cart that we want to be second.

(Graph files place a node xml into the kickstart profile for a machine. These are compiled as long as the cart is enabled. Disable the cart, the graph file and, hence, the kickstart node xml files, are not compiled into the kickstart profile.)

Go into the graph directory of the "custom1" cart:

# cd /export/stack/cart/custom1/graph

and get into the cart-custom1.xml

It will look like this:

<?xml version="1.0" standalone="no"?>
<graph>
<description>
custom1 cart
</description>
<order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>
</graph>

and these are the lines we care about:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>

Every cart has an "order" tag and an "edge" tag.

The "order" tag tells this cart what it should follow if it has a "tail" in it and what to precede if it has a "head" in it.

The "edge" tag tells what node xml file (Those are in the "nodes" directory in your cart.) should be used in the graph. The order will tell the kickstart compiler where to place it.

So to have "custom1" follow "custom2," we would edit it this way:

 <order head="cart-custom2-backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which gives us this:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom2-backend.xml
info - parsed carts/custom1/nodes/cart-custom1-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
</snip>

There are other ways of doing it. What I showed is the simplest and easiest to understand.

Now we can get weird about it.

You can also do something like this:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which will give you the same thing. but it's more obscure and it depends on the sure knowledge that ordering for "cart-custom2" is tailed to "backend," which it is by default unless one of your co-workers/buddies changed it just because.

So this way is indirect. I recommend the first way because it's obvious that way, and it assures that cart1 will always follow cart2 even if someone messes with the ordering in cart2's graph. Capisce?

We can get even weirder and edit "custom2" to always be the head to "custom1," but then we're just being fancy.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Setting Cart Order

Joe Kaiser edited this page Jan 25, 2018 · 4 revisions

Cart ordering

I've been asked the same question twice in the past month so I figured I would record it for posterity.

If you add a couple of carts and enable them on a box, the cart will always run as one of the last installation snippets. Hoever, the carts themselves are picked up in random order. So when you add a cart with a sensible name, what if you want to run one before the other?

I'll create and enable two carts, "custom1" and "custom2." (You should use something descriptive for your site that tells anyone who has to manage this infrastructure exactly what is in the cart, like: "puppet" or "ddosattack" [Hi NSA!] or "stupidcrapymycompanymakesmeinstall.")

Without any ordering changes, this is the order these two carts will have when a kickstart is generated:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom1-backend.xml
info - parsed carts/custom1/nodes/cart-custom2-backend.xml
info - parsed carts/site-custom/nodes/cart-site-custom-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/peerdone.xml
</snip>

( # stack list host profile <nodename> reveals the kickstart that will be generated and run during install. The "Node Traversal Order" at the beginning of this output, tells you what order kickstart snippets [in xml files] are compiled into the full kickstart script.)

Okay, so let's say we want the "custom1" cart to follow the "custom2" cart. We are going to manipulate the graph file in the "custom1" cart to get the order we want. So we are going to manipulate the order for the cart that we want to be second.

(Graph files place a node xml into the kickstart profile for a machine. These are compiled as long as the cart is enabled. Disable the cart, the graph file and, hence, the kickstart node xml files, are not compiled into the kickstart profile.)

Go into the graph directory of the "custom1" cart:

# cd /export/stack/cart/custom1/graph

and get into the cart-custom1.xml

It will look like this:

<?xml version="1.0" standalone="no"?>
<graph>
<description>
custom1 cart
</description>
<order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>
</graph>

and these are the lines we care about:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>

Every cart has an "order" tag and an "edge" tag.

The "order" tag tells this cart what it should follow if it has a "tail" in it and what to precede if it has a "head" in it.

The "edge" tag tells what node xml file (Those are in the "nodes" directory in your cart.) should be used in the graph. The order will tell the kickstart compiler where to place it.

So to have "custom1" follow "custom2," we would edit it this way:

 <order head="cart-custom2-backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which gives us this:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom2-backend.xml
info - parsed carts/custom1/nodes/cart-custom1-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
</snip>

There are other ways of doing it. What I showed is the simplest and easiest to understand.

Now we can get weird about it.

You can also do something like this:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which will give you the same thing. but it's more obscure and it depends on the sure knowledge that ordering for "cart-custom2" is tailed to "backend," which it is by default unless one of your co-workers/buddies changed it just because.

So this way is indirect. I recommend the first way because it's obvious that way, and it assures that cart1 will always follow cart2 even if someone messes with the ordering in cart2's graph. Capisce?

We can get even weirder and edit "custom2" to always be the head to "custom1," but then we're just being fancy.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Setting Cart Order

Joe Kaiser edited this page Jan 25, 2018 · 4 revisions

Cart ordering

I've been asked the same question twice in the past month so I figured I would record it for posterity.

If you add a couple of carts and enable them on a box, the cart will always run as one of the last installation snippets. Hoever, the carts themselves are picked up in random order. So when you add a cart with a sensible name, what if you want to run one before the other?

I'll create and enable two carts, "custom1" and "custom2." (You should use something descriptive for your site that tells anyone who has to manage this infrastructure exactly what is in the cart, like: "puppet" or "ddosattack" [Hi NSA!] or "stupidcrapymycompanymakesmeinstall.")

Without any ordering changes, this is the order these two carts will have when a kickstart is generated:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom1-backend.xml
info - parsed carts/custom1/nodes/cart-custom2-backend.xml
info - parsed carts/site-custom/nodes/cart-site-custom-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/peerdone.xml
</snip>

( # stack list host profile <nodename> reveals the kickstart that will be generated and run during install. The "Node Traversal Order" at the beginning of this output, tells you what order kickstart snippets [in xml files] are compiled into the full kickstart script.)

Okay, so let's say we want the "custom1" cart to follow the "custom2" cart. We are going to manipulate the graph file in the "custom1" cart to get the order we want. So we are going to manipulate the order for the cart that we want to be second.

(Graph files place a node xml into the kickstart profile for a machine. These are compiled as long as the cart is enabled. Disable the cart, the graph file and, hence, the kickstart node xml files, are not compiled into the kickstart profile.)

Go into the graph directory of the "custom1" cart:

# cd /export/stack/cart/custom1/graph

and get into the cart-custom1.xml

It will look like this:

<?xml version="1.0" standalone="no"?>
<graph>
<description>
custom1 cart
</description>
<order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>
</graph>

and these are the lines we care about:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>

Every cart has an "order" tag and an "edge" tag.

The "order" tag tells this cart what it should follow if it has a "tail" in it and what to precede if it has a "head" in it.

The "edge" tag tells what node xml file (Those are in the "nodes" directory in your cart.) should be used in the graph. The order will tell the kickstart compiler where to place it.

So to have "custom1" follow "custom2," we would edit it this way:

 <order head="cart-custom2-backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which gives us this:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom2-backend.xml
info - parsed carts/custom1/nodes/cart-custom1-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
</snip>

There are other ways of doing it. What I showed is the simplest and easiest to understand.

Now we can get weird about it.

You can also do something like this:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which will give you the same thing. but it's more obscure and it depends on the sure knowledge that ordering for "cart-custom2" is tailed to "backend," which it is by default unless one of your co-workers/buddies changed it just because.

So this way is indirect. I recommend the first way because it's obvious that way, and it assures that cart1 will always follow cart2 even if someone messes with the ordering in cart2's graph. Capisce?

We can get even weirder and edit "custom2" to always be the head to "custom1," but then we're just being fancy.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Setting Cart Order

Joe Kaiser edited this page Jan 25, 2018 · 4 revisions

Cart ordering

I've been asked the same question twice in the past month so I figured I would record it for posterity.

If you add a couple of carts and enable them on a box, the cart will always run as one of the last installation snippets. Hoever, the carts themselves are picked up in random order. So when you add a cart with a sensible name, what if you want to run one before the other?

I'll create and enable two carts, "custom1" and "custom2." (You should use something descriptive for your site that tells anyone who has to manage this infrastructure exactly what is in the cart, like: "puppet" or "ddosattack" [Hi NSA!] or "stupidcrapymycompanymakesmeinstall.")

Without any ordering changes, this is the order these two carts will have when a kickstart is generated:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom1-backend.xml
info - parsed carts/custom1/nodes/cart-custom2-backend.xml
info - parsed carts/site-custom/nodes/cart-site-custom-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/peerdone.xml
</snip>

( # stack list host profile <nodename> reveals the kickstart that will be generated and run during install. The "Node Traversal Order" at the beginning of this output, tells you what order kickstart snippets [in xml files] are compiled into the full kickstart script.)

Okay, so let's say we want the "custom1" cart to follow the "custom2" cart. We are going to manipulate the graph file in the "custom1" cart to get the order we want. So we are going to manipulate the order for the cart that we want to be second.

(Graph files place a node xml into the kickstart profile for a machine. These are compiled as long as the cart is enabled. Disable the cart, the graph file and, hence, the kickstart node xml files, are not compiled into the kickstart profile.)

Go into the graph directory of the "custom1" cart:

# cd /export/stack/cart/custom1/graph

and get into the cart-custom1.xml

It will look like this:

<?xml version="1.0" standalone="no"?>
<graph>
<description>
custom1 cart
</description>
<order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>
</graph>

and these are the lines we care about:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>

Every cart has an "order" tag and an "edge" tag.

The "order" tag tells this cart what it should follow if it has a "tail" in it and what to precede if it has a "head" in it.

The "edge" tag tells what node xml file (Those are in the "nodes" directory in your cart.) should be used in the graph. The order will tell the kickstart compiler where to place it.

So to have "custom1" follow "custom2," we would edit it this way:

 <order head="cart-custom2-backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which gives us this:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom2-backend.xml
info - parsed carts/custom1/nodes/cart-custom1-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
</snip>

There are other ways of doing it. What I showed is the simplest and easiest to understand.

Now we can get weird about it.

You can also do something like this:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which will give you the same thing. but it's more obscure and it depends on the sure knowledge that ordering for "cart-custom2" is tailed to "backend," which it is by default unless one of your co-workers/buddies changed it just because.

So this way is indirect. I recommend the first way because it's obvious that way, and it assures that cart1 will always follow cart2 even if someone messes with the ordering in cart2's graph. Capisce?

We can get even weirder and edit "custom2" to always be the head to "custom1," but then we're just being fancy.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Setting Cart Order

Joe Kaiser edited this page Jan 25, 2018 · 4 revisions

Cart ordering

I've been asked the same question twice in the past month so I figured I would record it for posterity.

If you add a couple of carts and enable them on a box, the cart will always run as one of the last installation snippets. Hoever, the carts themselves are picked up in random order. So when you add a cart with a sensible name, what if you want to run one before the other?

I'll create and enable two carts, "custom1" and "custom2." (You should use something descriptive for your site that tells anyone who has to manage this infrastructure exactly what is in the cart, like: "puppet" or "ddosattack" [Hi NSA!] or "stupidcrapymycompanymakesmeinstall.")

Without any ordering changes, this is the order these two carts will have when a kickstart is generated:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom1-backend.xml
info - parsed carts/custom1/nodes/cart-custom2-backend.xml
info - parsed carts/site-custom/nodes/cart-site-custom-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/peerdone.xml
</snip>

( # stack list host profile <nodename> reveals the kickstart that will be generated and run during install. The "Node Traversal Order" at the beginning of this output, tells you what order kickstart snippets [in xml files] are compiled into the full kickstart script.)

Okay, so let's say we want the "custom1" cart to follow the "custom2" cart. We are going to manipulate the graph file in the "custom1" cart to get the order we want. So we are going to manipulate the order for the cart that we want to be second.

(Graph files place a node xml into the kickstart profile for a machine. These are compiled as long as the cart is enabled. Disable the cart, the graph file and, hence, the kickstart node xml files, are not compiled into the kickstart profile.)

Go into the graph directory of the "custom1" cart:

# cd /export/stack/cart/custom1/graph

and get into the cart-custom1.xml

It will look like this:

<?xml version="1.0" standalone="no"?>
<graph>
<description>
custom1 cart
</description>
<order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>
</graph>

and these are the lines we care about:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="backend" to="cart-custom1-backend"/>

Every cart has an "order" tag and an "edge" tag.

The "order" tag tells this cart what it should follow if it has a "tail" in it and what to precede if it has a "head" in it.

The "edge" tag tells what node xml file (Those are in the "nodes" directory in your cart.) should be used in the graph. The order will tell the kickstart compiler where to place it.

So to have "custom1" follow "custom2," we would edit it this way:

 <order head="cart-custom2-backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which gives us this:

# stack list host profile backend-0-2 | less
<snip>
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/backend.xml
info - parsed carts/custom2/nodes/cart-custom2-backend.xml
info - parsed carts/custom1/nodes/cart-custom1-backend.xml
info - parsed pallets/stacki/5.0_20171128_b0ed4e3/redhat7/redhat/x86_64/nodes/base.xml
</snip>

There are other ways of doing it. What I showed is the simplest and easiest to understand.

Now we can get weird about it.

You can also do something like this:

 <order head="backend" tail="cart-custom1-backend"/>
<edge from="cart-custom2-backend" to="cart-custom1-backend"/>

Which will give you the same thing. but it's more obscure and it depends on the sure knowledge that ordering for "cart-custom2" is tailed to "backend," which it is by default unless one of your co-workers/buddies changed it just because.

So this way is indirect. I recommend the first way because it's obvious that way, and it assures that cart1 will always follow cart2 even if someone messes with the ordering in cart2's graph. Capisce?

We can get even weirder and edit "custom2" to always be the head to "custom1," but then we're just being fancy.

Clone this wiki locally