Port full site: all pages, blog posts, nav/footer, assets

This commit is contained in:
Jarvis Prime
2026-03-22 20:13:49 +00:00
parent ba8d866985
commit fbe79d4523
23 changed files with 285 additions and 34 deletions

5
dist/about/index.html vendored Normal file
View File

@@ -0,0 +1,5 @@
<!DOCTYPE html><html lang="en" data-astro-cid-5hce7sga> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>About — dd0c.net</title><link rel="icon" href="/favicon.ico"><style>[data-astro-cid-5hce7sga],[data-astro-cid-5hce7sga]:before,[data-astro-cid-5hce7sga]:after{box-sizing:border-box}body{font-family:system-ui,-apple-system,sans-serif;margin:0;background:#f8f9fa;color:#333;line-height:1.6}nav[data-astro-cid-5hce7sga]{background:#fff;border-bottom:2px solid #3294D2;padding:0 1.5rem;display:flex;align-items:center;gap:0}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga]{display:flex;align-items:center;gap:.5rem;text-decoration:none;margin-right:1.5rem;padding:.75rem 0}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga] img[data-astro-cid-5hce7sga]{height:32px;width:auto}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{color:#333;text-decoration:none;padding:.75rem .85rem;font-size:.95rem;transition:color .15s}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]:hover{color:#3294d2}nav[data-astro-cid-5hce7sga] .spacer[data-astro-cid-5hce7sga]{flex:1}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga].external{color:#3294d2}main[data-astro-cid-5hce7sga]{max-width:760px;margin:2rem auto;padding:0 1.25rem}footer[data-astro-cid-5hce7sga]{margin-top:3rem;padding:1.25rem;text-align:center;font-size:.875rem;color:#666;border-top:1px solid #e0e0e0;background:#fff}footer[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{color:#3294d2;text-decoration:none}footer[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]:hover{text-decoration:underline}h1[data-astro-cid-5hce7sga]{font-size:1.75rem;color:#1a1a1a}h2[data-astro-cid-5hce7sga]{font-size:1.2rem;margin-top:1.75rem;color:#1a1a1a}a[data-astro-cid-5hce7sga]{color:#3294d2}p[data-astro-cid-5hce7sga]{margin:.6rem 0}@media (max-width: 600px){nav[data-astro-cid-5hce7sga]{flex-wrap:wrap;padding:0 .75rem}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga]{margin-right:.5rem}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{padding:.6rem .5rem;font-size:.875rem}}
</style></head> <body data-astro-cid-5hce7sga> <nav data-astro-cid-5hce7sga> <a class="brand" href="/" data-astro-cid-5hce7sga> <img src="/images/smalllogo.png" alt="dd0c.net" data-astro-cid-5hce7sga> </a> <a href="/" data-astro-cid-5hce7sga>Home</a> <a href="/about" data-astro-cid-5hce7sga>About</a> <a href="/services" data-astro-cid-5hce7sga>Services</a> <div class="spacer" data-astro-cid-5hce7sga></div> <a class="external" href="https://github.com/ddoc" target="_blank" rel="noopener" data-astro-cid-5hce7sga>GitHub</a> </nav> <main data-astro-cid-5hce7sga> <h1>About</h1> <p>After a childhood spent tinkering on subjects such as Java programming and Linux, Brian's professional experience started with VoIP testing at 3Com in suburban Chicago. He then spent two years studying Computer Engineering at Purdue University before leaving to pursue freelance consulting in Los Angeles.</p> <p>Following several years of freelancing, he developed his expertise in enterprise infrastructure and cloud computing by working for a variety of startups and large corporations. Later he completed a Bachelor's in I.T. while working at Citrix. Brian is currently working on Citrix's Cloud Engineering and Systems Architecture team in Santa Barbara, California.</p> </main> <footer data-astro-cid-5hce7sga> <a href="/privacy" data-astro-cid-5hce7sga>Privacy Policy</a> &nbsp;·&nbsp;
<a href="/terms" data-astro-cid-5hce7sga>Terms of Service</a> &nbsp;·&nbsp;
&copy; Brian Galura 2004&ndash;2026
</footer> </body></html>

BIN
dist/favicon.ico vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
dist/images/grid.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 B

BIN
dist/images/smalllogo.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

10
dist/index.html vendored
View File

@@ -1,4 +1,6 @@
<!DOCTYPE html><html lang="en" data-astro-cid-5hce7sga> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>dd0c Tools</title><style>body{font-family:system-ui,sans-serif;max-width:720px;margin:2rem auto;padding:0 1rem;line-height:1.6;color:#333}a[data-astro-cid-5hce7sga]{color:#0f3460}footer[data-astro-cid-5hce7sga]{margin-top:2rem;font-size:.9rem;text-align:center}.center[data-astro-cid-5hce7sga]{text-align:center}h1[data-astro-cid-5hce7sga]{font-size:1.5rem}h2[data-astro-cid-5hce7sga]{font-size:1.15rem;margin-top:1.5rem}p[data-astro-cid-5hce7sga]{margin:.5rem 0}
</style></head> <body data-astro-cid-5hce7sga> <div class="center"> <img src="/logo.png" alt="dd0c Tools" width="120" height="120"> <h1>dd0c Tools</h1> <p>dd0c Tools — Personal productivity tools for Google Workspace.</p> </div> <footer data-astro-cid-5hce7sga> <a href="/privacy" data-astro-cid-5hce7sga>Privacy Policy</a> ·
<a href="/terms" data-astro-cid-5hce7sga>Terms of Service</a> ·
Contact: <a href="mailto:bgalura@gmail.com" data-astro-cid-5hce7sga>bgalura@gmail.com</a> </footer> </body></html>
<!DOCTYPE html><html lang="en" data-astro-cid-5hce7sga> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>dd0c.net — dd0c.net</title><link rel="icon" href="/favicon.ico"><style>[data-astro-cid-5hce7sga],[data-astro-cid-5hce7sga]:before,[data-astro-cid-5hce7sga]:after{box-sizing:border-box}body{font-family:system-ui,-apple-system,sans-serif;margin:0;background:#f8f9fa;color:#333;line-height:1.6}nav[data-astro-cid-5hce7sga]{background:#fff;border-bottom:2px solid #3294D2;padding:0 1.5rem;display:flex;align-items:center;gap:0}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga]{display:flex;align-items:center;gap:.5rem;text-decoration:none;margin-right:1.5rem;padding:.75rem 0}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga] img[data-astro-cid-5hce7sga]{height:32px;width:auto}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{color:#333;text-decoration:none;padding:.75rem .85rem;font-size:.95rem;transition:color .15s}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]:hover{color:#3294d2}nav[data-astro-cid-5hce7sga] .spacer[data-astro-cid-5hce7sga]{flex:1}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga].external{color:#3294d2}main[data-astro-cid-5hce7sga]{max-width:760px;margin:2rem auto;padding:0 1.25rem}footer[data-astro-cid-5hce7sga]{margin-top:3rem;padding:1.25rem;text-align:center;font-size:.875rem;color:#666;border-top:1px solid #e0e0e0;background:#fff}footer[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{color:#3294d2;text-decoration:none}footer[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]:hover{text-decoration:underline}h1[data-astro-cid-5hce7sga]{font-size:1.75rem;color:#1a1a1a}h2[data-astro-cid-5hce7sga]{font-size:1.2rem;margin-top:1.75rem;color:#1a1a1a}a[data-astro-cid-5hce7sga]{color:#3294d2}p[data-astro-cid-5hce7sga]{margin:.6rem 0}@media (max-width: 600px){nav[data-astro-cid-5hce7sga]{flex-wrap:wrap;padding:0 .75rem}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga]{margin-right:.5rem}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{padding:.6rem .5rem;font-size:.875rem}}
.post-list[data-astro-cid-j7pv25f6]{list-style:none;padding:0;margin:1.5rem 0}.post-list[data-astro-cid-j7pv25f6] li[data-astro-cid-j7pv25f6]{padding:.75rem 0;border-bottom:1px solid #e8e8e8;display:flex;justify-content:space-between;align-items:baseline;gap:1rem}.post-list[data-astro-cid-j7pv25f6] li[data-astro-cid-j7pv25f6]:last-child{border-bottom:none}.post-list[data-astro-cid-j7pv25f6] a[data-astro-cid-j7pv25f6]{font-size:1.05rem;text-decoration:none;color:#3294d2}.post-list[data-astro-cid-j7pv25f6] a[data-astro-cid-j7pv25f6]:hover{text-decoration:underline}.post-date[data-astro-cid-j7pv25f6]{font-size:.875rem;color:#888;white-space:nowrap}
</style></head> <body data-astro-cid-5hce7sga> <nav data-astro-cid-5hce7sga> <a class="brand" href="/" data-astro-cid-5hce7sga> <img src="/images/smalllogo.png" alt="dd0c.net" data-astro-cid-5hce7sga> </a> <a href="/" data-astro-cid-5hce7sga>Home</a> <a href="/about" data-astro-cid-5hce7sga>About</a> <a href="/services" data-astro-cid-5hce7sga>Services</a> <div class="spacer" data-astro-cid-5hce7sga></div> <a class="external" href="https://github.com/ddoc" target="_blank" rel="noopener" data-astro-cid-5hce7sga>GitHub</a> </nav> <main data-astro-cid-5hce7sga> <h1 data-astro-cid-j7pv25f6>dd0c.net</h1> <p data-astro-cid-j7pv25f6>Infrastructure, cloud, and systems engineering by Brian Galura.</p> <h2 data-astro-cid-j7pv25f6>Posts</h2> <ul class="post-list" data-astro-cid-j7pv25f6> <li data-astro-cid-j7pv25f6> <a href="/posts/foreman-hooks-aws-vpc" data-astro-cid-j7pv25f6>AWS VPC Buildout With Foreman Hooks for RDNS Creation</a> <span class="post-date" data-astro-cid-j7pv25f6>2014-01-15</span> </li><li data-astro-cid-j7pv25f6> <a href="/posts/cloudstack-devops" data-astro-cid-j7pv25f6>CloudStack Collab 2013: Lessons Learned at Citrix OSD</a> <span class="post-date" data-astro-cid-j7pv25f6>2013-06-23</span> </li> </ul> </main> <footer data-astro-cid-5hce7sga> <a href="/privacy" data-astro-cid-5hce7sga>Privacy Policy</a> &nbsp;·&nbsp;
<a href="/terms" data-astro-cid-5hce7sga>Terms of Service</a> &nbsp;·&nbsp;
&copy; Brian Galura 2004&ndash;2026
</footer> </body></html>

View File

@@ -0,0 +1,8 @@
<!DOCTYPE html><html lang="en" data-astro-cid-5hce7sga> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>CloudStack Collab 2013: Lessons Learned at Citrix OSD — dd0c.net</title><link rel="icon" href="/favicon.ico"><style>[data-astro-cid-5hce7sga],[data-astro-cid-5hce7sga]:before,[data-astro-cid-5hce7sga]:after{box-sizing:border-box}body{font-family:system-ui,-apple-system,sans-serif;margin:0;background:#f8f9fa;color:#333;line-height:1.6}nav[data-astro-cid-5hce7sga]{background:#fff;border-bottom:2px solid #3294D2;padding:0 1.5rem;display:flex;align-items:center;gap:0}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga]{display:flex;align-items:center;gap:.5rem;text-decoration:none;margin-right:1.5rem;padding:.75rem 0}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga] img[data-astro-cid-5hce7sga]{height:32px;width:auto}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{color:#333;text-decoration:none;padding:.75rem .85rem;font-size:.95rem;transition:color .15s}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]:hover{color:#3294d2}nav[data-astro-cid-5hce7sga] .spacer[data-astro-cid-5hce7sga]{flex:1}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga].external{color:#3294d2}main[data-astro-cid-5hce7sga]{max-width:760px;margin:2rem auto;padding:0 1.25rem}footer[data-astro-cid-5hce7sga]{margin-top:3rem;padding:1.25rem;text-align:center;font-size:.875rem;color:#666;border-top:1px solid #e0e0e0;background:#fff}footer[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{color:#3294d2;text-decoration:none}footer[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]:hover{text-decoration:underline}h1[data-astro-cid-5hce7sga]{font-size:1.75rem;color:#1a1a1a}h2[data-astro-cid-5hce7sga]{font-size:1.2rem;margin-top:1.75rem;color:#1a1a1a}a[data-astro-cid-5hce7sga]{color:#3294d2}p[data-astro-cid-5hce7sga]{margin:.6rem 0}@media (max-width: 600px){nav[data-astro-cid-5hce7sga]{flex-wrap:wrap;padding:0 .75rem}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga]{margin-right:.5rem}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{padding:.6rem .5rem;font-size:.875rem}}
.post-meta[data-astro-cid-gjtny2mx]{color:#888;font-size:.875rem;margin-bottom:1.5rem}.post-body[data-astro-cid-gjtny2mx]{line-height:1.75}.post-body[data-astro-cid-gjtny2mx] iframe[data-astro-cid-gjtny2mx]{max-width:100%}.back[data-astro-cid-gjtny2mx]{display:inline-block;margin-bottom:1.25rem;font-size:.9rem;color:#3294d2;text-decoration:none}.back[data-astro-cid-gjtny2mx]:hover{text-decoration:underline}
</style></head> <body data-astro-cid-5hce7sga> <nav data-astro-cid-5hce7sga> <a class="brand" href="/" data-astro-cid-5hce7sga> <img src="/images/smalllogo.png" alt="dd0c.net" data-astro-cid-5hce7sga> </a> <a href="/" data-astro-cid-5hce7sga>Home</a> <a href="/about" data-astro-cid-5hce7sga>About</a> <a href="/services" data-astro-cid-5hce7sga>Services</a> <div class="spacer" data-astro-cid-5hce7sga></div> <a class="external" href="https://github.com/ddoc" target="_blank" rel="noopener" data-astro-cid-5hce7sga>GitHub</a> </nav> <main data-astro-cid-5hce7sga> <a class="back" href="/" data-astro-cid-gjtny2mx>← All posts</a> <h1 data-astro-cid-gjtny2mx>CloudStack Collab 2013: Lessons Learned at Citrix OSD</h1> <p class="post-meta" data-astro-cid-gjtny2mx>2013-06-23</p> <div class="post-body" data-astro-cid-gjtny2mx> <p><a href="http://open.citrix.com/cloud-computing-vids/video/six-months-into-cloudstack-lessons-learned-at-citrix-osd-by-brian-galura.html">Open@Citrix</a></p>
<p><a href="http://prezi.com/2sgvlsz2bqoz/?utm_campaign=share&#x26;utm_medium=copy">Slides</a></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/MUcLkXr2M34" frameborder="0" allowfullscreen></iframe> </div> </main> <footer data-astro-cid-5hce7sga> <a href="/privacy" data-astro-cid-5hce7sga>Privacy Policy</a> &nbsp;·&nbsp;
<a href="/terms" data-astro-cid-5hce7sga>Terms of Service</a> &nbsp;·&nbsp;
&copy; Brian Galura 2004&ndash;2026
</footer> </body></html>

View File

@@ -0,0 +1,25 @@
<!DOCTYPE html><html lang="en" data-astro-cid-5hce7sga> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>AWS VPC Buildout With Foreman Hooks for RDNS Creation — dd0c.net</title><link rel="icon" href="/favicon.ico"><style>[data-astro-cid-5hce7sga],[data-astro-cid-5hce7sga]:before,[data-astro-cid-5hce7sga]:after{box-sizing:border-box}body{font-family:system-ui,-apple-system,sans-serif;margin:0;background:#f8f9fa;color:#333;line-height:1.6}nav[data-astro-cid-5hce7sga]{background:#fff;border-bottom:2px solid #3294D2;padding:0 1.5rem;display:flex;align-items:center;gap:0}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga]{display:flex;align-items:center;gap:.5rem;text-decoration:none;margin-right:1.5rem;padding:.75rem 0}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga] img[data-astro-cid-5hce7sga]{height:32px;width:auto}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{color:#333;text-decoration:none;padding:.75rem .85rem;font-size:.95rem;transition:color .15s}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]:hover{color:#3294d2}nav[data-astro-cid-5hce7sga] .spacer[data-astro-cid-5hce7sga]{flex:1}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga].external{color:#3294d2}main[data-astro-cid-5hce7sga]{max-width:760px;margin:2rem auto;padding:0 1.25rem}footer[data-astro-cid-5hce7sga]{margin-top:3rem;padding:1.25rem;text-align:center;font-size:.875rem;color:#666;border-top:1px solid #e0e0e0;background:#fff}footer[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{color:#3294d2;text-decoration:none}footer[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]:hover{text-decoration:underline}h1[data-astro-cid-5hce7sga]{font-size:1.75rem;color:#1a1a1a}h2[data-astro-cid-5hce7sga]{font-size:1.2rem;margin-top:1.75rem;color:#1a1a1a}a[data-astro-cid-5hce7sga]{color:#3294d2}p[data-astro-cid-5hce7sga]{margin:.6rem 0}@media (max-width: 600px){nav[data-astro-cid-5hce7sga]{flex-wrap:wrap;padding:0 .75rem}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga]{margin-right:.5rem}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{padding:.6rem .5rem;font-size:.875rem}}
.post-meta[data-astro-cid-gjtny2mx]{color:#888;font-size:.875rem;margin-bottom:1.5rem}.post-body[data-astro-cid-gjtny2mx]{line-height:1.75}.post-body[data-astro-cid-gjtny2mx] iframe[data-astro-cid-gjtny2mx]{max-width:100%}.back[data-astro-cid-gjtny2mx]{display:inline-block;margin-bottom:1.25rem;font-size:.9rem;color:#3294d2;text-decoration:none}.back[data-astro-cid-gjtny2mx]:hover{text-decoration:underline}
</style></head> <body data-astro-cid-5hce7sga> <nav data-astro-cid-5hce7sga> <a class="brand" href="/" data-astro-cid-5hce7sga> <img src="/images/smalllogo.png" alt="dd0c.net" data-astro-cid-5hce7sga> </a> <a href="/" data-astro-cid-5hce7sga>Home</a> <a href="/about" data-astro-cid-5hce7sga>About</a> <a href="/services" data-astro-cid-5hce7sga>Services</a> <div class="spacer" data-astro-cid-5hce7sga></div> <a class="external" href="https://github.com/ddoc" target="_blank" rel="noopener" data-astro-cid-5hce7sga>GitHub</a> </nav> <main data-astro-cid-5hce7sga> <a class="back" href="/" data-astro-cid-gjtny2mx>← All posts</a> <h1 data-astro-cid-gjtny2mx>AWS VPC Buildout With Foreman Hooks for RDNS Creation</h1> <p class="post-meta" data-astro-cid-gjtny2mx>2014-01-15</p> <div class="post-body" data-astro-cid-gjtny2mx> <p>Originally posted on <a href="http://digital-ducttape.com/2013/10/23/aws-vpc-buildout-with-foreman_hooks-for-rdns-creation/">Digital Ducttape</a></p>
<p><a href="http://theforeman.org/">Foreman</a> is a tool I have used for a long time as an external node classifier for Puppet and its smart-proxy for integration with DNS. However when Foreman recently <a href="http://projects.theforeman.org/issues/1871">added support</a> for building EC2 instances inside a VPC, I thought it was a great opportunity to use the same tool for a new buildout.</p>
<p>Shortly after starting I discovered that reverse DNS is <a href="http://projects.theforeman.org/issues/3166">unfortunately broken</a> for EC2 VPC builds. Foreman does not map a relationship between VPC subnets and any DNS smart-proxy. Unswayed I took to #foreman and was guided to a potential solution.</p>
<p>Enter <a href="https://github.com/theforeman/foreman_hooks">foreman_hooks</a>. This plugin for foreman allows you to subscribe to create/update/destroy events and invoke any executable. Lucky for me this was a great workaround for the functionality lacking in the recent 1.3 release. Initially I wrote a script utilizing the smart-proxy API to create PTR records but it complained that the IP address was already assigned. Fair enough. Without further investigation I wrote instead a short shell script which does the same thing using nsupdate with tsigs and viola! Integrated forward and reverse DNS for EC2 VPC deployments. A few more lines of code added support for the destroy hook and now the feature is complete.</p>
<p>I named this script <code>rdns.sh</code> and placed it in <code>/usr/share/foreman/config/hooks.d</code> and created symlinks to it in both:</p>
<p><code>/usr/share/foreman/config/hooks/host/managed/destroy/</code><br>
<code>/usr/share/foreman/config/hooks/host/managed/create/</code></p>
<p><a href="https://gist.github.com/ddoc/8447483">source for rdns.sh</a></p>
<script src="https://gist.github.com/ddoc/8447483.js"></script>
<p><a href="https://gist.github.com/ddoc/8446722">source for utils.sh</a><br>
<a href="https://github.com/theforeman/foreman_hooks/blob/master/examples/hook_functions.sh">source for hook_functions.sh</a></p>
<p>Of course, after implementing this I saw many uses for foreman_hooks including:</p>
<ul>
<li>resizing an EC2 root volume at build time</li>
<li>attaching additional volumes</li>
<li>EIP associations and DNS</li>
<li>different hooks for different domains</li>
<li>adding and removing hosts to an external monitoring system</li>
</ul>
<p>I will post updates on these implementations at another time.</p> </div> </main> <footer data-astro-cid-5hce7sga> <a href="/privacy" data-astro-cid-5hce7sga>Privacy Policy</a> &nbsp;·&nbsp;
<a href="/terms" data-astro-cid-5hce7sga>Terms of Service</a> &nbsp;·&nbsp;
&copy; Brian Galura 2004&ndash;2026
</footer> </body></html>

View File

@@ -1,4 +1,5 @@
<!DOCTYPE html><html lang="en" data-astro-cid-5hce7sga> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Privacy Policy — dd0c.net</title><style>body{font-family:system-ui,sans-serif;max-width:720px;margin:2rem auto;padding:0 1rem;line-height:1.6;color:#333}a[data-astro-cid-5hce7sga]{color:#0f3460}footer[data-astro-cid-5hce7sga]{margin-top:2rem;font-size:.9rem;text-align:center}.center[data-astro-cid-5hce7sga]{text-align:center}h1[data-astro-cid-5hce7sga]{font-size:1.5rem}h2[data-astro-cid-5hce7sga]{font-size:1.15rem;margin-top:1.5rem}p[data-astro-cid-5hce7sga]{margin:.5rem 0}
</style></head> <body data-astro-cid-5hce7sga> <h1>Privacy Policy</h1> <p><strong>Effective Date:</strong> March 22, 2026</p> <p>This application ("App") is a personal-use tool operated by Brian Galura ("Operator"). It is not offered as a commercial service.</p> <h2>Data Collection</h2> <p>The App accesses Google Workspace data (Gmail, Calendar, Drive, Sheets, Photos) solely on behalf of the authenticated account holder. No data is collected from third parties.</p> <h2>Data Use</h2> <p>Data retrieved from Google APIs is used exclusively to provide the functionality requested by the account holder, such as reading emails, managing calendar events, organizing files, and managing photos. Data is processed in transit and is not sold, shared, or disclosed to any third party.</p> <h2>Data Storage</h2> <p>OAuth tokens are stored securely on the Operator's private infrastructure. Cached data (e.g., downloaded attachments) is stored temporarily and deleted after processing.</p> <h2>Data Retention</h2> <p>The App does not retain personal data beyond what is necessary to fulfill the immediate request. OAuth refresh tokens are retained until revoked by the user.</p> <h2>Third-Party Services</h2> <p>The App uses Google APIs subject to the <a href="https://developers.google.com/terms/api-services-user-data-policy">Google API Services User Data Policy</a>.</p> <h2>Your Rights</h2> <p>You may revoke the App's access at any time via <a href="https://myaccount.google.com/permissions">Google Account Permissions</a>.</p> <h2>Contact</h2> <p>For questions, contact: <a href="mailto:bgalura@gmail.com">bgalura@gmail.com</a></p> <footer data-astro-cid-5hce7sga> <a href="/privacy" data-astro-cid-5hce7sga>Privacy Policy</a> ·
<a href="/terms" data-astro-cid-5hce7sga>Terms of Service</a> ·
Contact: <a href="mailto:bgalura@gmail.com" data-astro-cid-5hce7sga>bgalura@gmail.com</a> </footer> </body></html>
<!DOCTYPE html><html lang="en" data-astro-cid-5hce7sga> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Privacy Policy — dd0c.net</title><link rel="icon" href="/favicon.ico"><style>[data-astro-cid-5hce7sga],[data-astro-cid-5hce7sga]:before,[data-astro-cid-5hce7sga]:after{box-sizing:border-box}body{font-family:system-ui,-apple-system,sans-serif;margin:0;background:#f8f9fa;color:#333;line-height:1.6}nav[data-astro-cid-5hce7sga]{background:#fff;border-bottom:2px solid #3294D2;padding:0 1.5rem;display:flex;align-items:center;gap:0}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga]{display:flex;align-items:center;gap:.5rem;text-decoration:none;margin-right:1.5rem;padding:.75rem 0}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga] img[data-astro-cid-5hce7sga]{height:32px;width:auto}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{color:#333;text-decoration:none;padding:.75rem .85rem;font-size:.95rem;transition:color .15s}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]:hover{color:#3294d2}nav[data-astro-cid-5hce7sga] .spacer[data-astro-cid-5hce7sga]{flex:1}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga].external{color:#3294d2}main[data-astro-cid-5hce7sga]{max-width:760px;margin:2rem auto;padding:0 1.25rem}footer[data-astro-cid-5hce7sga]{margin-top:3rem;padding:1.25rem;text-align:center;font-size:.875rem;color:#666;border-top:1px solid #e0e0e0;background:#fff}footer[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{color:#3294d2;text-decoration:none}footer[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]:hover{text-decoration:underline}h1[data-astro-cid-5hce7sga]{font-size:1.75rem;color:#1a1a1a}h2[data-astro-cid-5hce7sga]{font-size:1.2rem;margin-top:1.75rem;color:#1a1a1a}a[data-astro-cid-5hce7sga]{color:#3294d2}p[data-astro-cid-5hce7sga]{margin:.6rem 0}@media (max-width: 600px){nav[data-astro-cid-5hce7sga]{flex-wrap:wrap;padding:0 .75rem}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga]{margin-right:.5rem}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{padding:.6rem .5rem;font-size:.875rem}}
</style></head> <body data-astro-cid-5hce7sga> <nav data-astro-cid-5hce7sga> <a class="brand" href="/" data-astro-cid-5hce7sga> <img src="/images/smalllogo.png" alt="dd0c.net" data-astro-cid-5hce7sga> </a> <a href="/" data-astro-cid-5hce7sga>Home</a> <a href="/about" data-astro-cid-5hce7sga>About</a> <a href="/services" data-astro-cid-5hce7sga>Services</a> <div class="spacer" data-astro-cid-5hce7sga></div> <a class="external" href="https://github.com/ddoc" target="_blank" rel="noopener" data-astro-cid-5hce7sga>GitHub</a> </nav> <main data-astro-cid-5hce7sga> <h1>Privacy Policy</h1> <p><strong>Effective Date:</strong> March 22, 2026</p> <p>This application ("App") is a personal-use tool operated by Brian Galura ("Operator"). It is not offered as a commercial service.</p> <h2>Data Collection</h2> <p>The App accesses Google Workspace data (Gmail, Calendar, Drive, Sheets, Photos) solely on behalf of the authenticated account holder. No data is collected from third parties.</p> <h2>Data Use</h2> <p>Data retrieved from Google APIs is used exclusively to provide the functionality requested by the account holder, such as reading emails, managing calendar events, organizing files, and managing photos. Data is processed in transit and is not sold, shared, or disclosed to any third party.</p> <h2>Data Storage</h2> <p>OAuth tokens are stored securely on the Operator's private infrastructure. Cached data (e.g., downloaded attachments) is stored temporarily and deleted after processing.</p> <h2>Data Retention</h2> <p>The App does not retain personal data beyond what is necessary to fulfill the immediate request. OAuth refresh tokens are retained until revoked by the user.</p> <h2>Third-Party Services</h2> <p>The App uses Google APIs subject to the <a href="https://developers.google.com/terms/api-services-user-data-policy">Google API Services User Data Policy</a>.</p> <h2>Your Rights</h2> <p>You may revoke the App's access at any time via <a href="https://myaccount.google.com/permissions">Google Account Permissions</a>.</p> <h2>Contact</h2> <p>For questions, contact: <a href="mailto:contact@dd0c.net">contact@dd0c.net</a></p> </main> <footer data-astro-cid-5hce7sga> <a href="/privacy" data-astro-cid-5hce7sga>Privacy Policy</a> &nbsp;·&nbsp;
<a href="/terms" data-astro-cid-5hce7sga>Terms of Service</a> &nbsp;·&nbsp;
&copy; Brian Galura 2004&ndash;2026
</footer> </body></html>

6
dist/services/index.html vendored Normal file
View File

@@ -0,0 +1,6 @@
<!DOCTYPE html><html lang="en" data-astro-cid-5hce7sga> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Services — dd0c.net</title><link rel="icon" href="/favicon.ico"><style>[data-astro-cid-5hce7sga],[data-astro-cid-5hce7sga]:before,[data-astro-cid-5hce7sga]:after{box-sizing:border-box}body{font-family:system-ui,-apple-system,sans-serif;margin:0;background:#f8f9fa;color:#333;line-height:1.6}nav[data-astro-cid-5hce7sga]{background:#fff;border-bottom:2px solid #3294D2;padding:0 1.5rem;display:flex;align-items:center;gap:0}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga]{display:flex;align-items:center;gap:.5rem;text-decoration:none;margin-right:1.5rem;padding:.75rem 0}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga] img[data-astro-cid-5hce7sga]{height:32px;width:auto}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{color:#333;text-decoration:none;padding:.75rem .85rem;font-size:.95rem;transition:color .15s}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]:hover{color:#3294d2}nav[data-astro-cid-5hce7sga] .spacer[data-astro-cid-5hce7sga]{flex:1}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga].external{color:#3294d2}main[data-astro-cid-5hce7sga]{max-width:760px;margin:2rem auto;padding:0 1.25rem}footer[data-astro-cid-5hce7sga]{margin-top:3rem;padding:1.25rem;text-align:center;font-size:.875rem;color:#666;border-top:1px solid #e0e0e0;background:#fff}footer[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{color:#3294d2;text-decoration:none}footer[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]:hover{text-decoration:underline}h1[data-astro-cid-5hce7sga]{font-size:1.75rem;color:#1a1a1a}h2[data-astro-cid-5hce7sga]{font-size:1.2rem;margin-top:1.75rem;color:#1a1a1a}a[data-astro-cid-5hce7sga]{color:#3294d2}p[data-astro-cid-5hce7sga]{margin:.6rem 0}@media (max-width: 600px){nav[data-astro-cid-5hce7sga]{flex-wrap:wrap;padding:0 .75rem}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga]{margin-right:.5rem}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{padding:.6rem .5rem;font-size:.875rem}}
ul[data-astro-cid-ucd2ps2b]{padding-left:1.25rem}ul[data-astro-cid-ucd2ps2b] li[data-astro-cid-ucd2ps2b]{margin:.35rem 0}.contact[data-astro-cid-ucd2ps2b]{margin:1rem 0}.contact[data-astro-cid-ucd2ps2b] a[data-astro-cid-ucd2ps2b]{color:#3294d2}
</style></head> <body data-astro-cid-5hce7sga> <nav data-astro-cid-5hce7sga> <a class="brand" href="/" data-astro-cid-5hce7sga> <img src="/images/smalllogo.png" alt="dd0c.net" data-astro-cid-5hce7sga> </a> <a href="/" data-astro-cid-5hce7sga>Home</a> <a href="/about" data-astro-cid-5hce7sga>About</a> <a href="/services" data-astro-cid-5hce7sga>Services</a> <div class="spacer" data-astro-cid-5hce7sga></div> <a class="external" href="https://github.com/ddoc" target="_blank" rel="noopener" data-astro-cid-5hce7sga>GitHub</a> </nav> <main data-astro-cid-5hce7sga> <h1 data-astro-cid-ucd2ps2b>Services</h1> <p data-astro-cid-ucd2ps2b>Hourly and flat-cost projects.</p> <p class="contact" data-astro-cid-ucd2ps2b>Contact: <a href="mailto:contact@dd0c.net" data-astro-cid-ucd2ps2b>contact@dd0c.net</a></p> <h2 data-astro-cid-ucd2ps2b>Successful projects include</h2> <ul data-astro-cid-ucd2ps2b> <li data-astro-cid-ucd2ps2b>Service deployments into and out of the cloud</li> <li data-astro-cid-ucd2ps2b>Zip-code based retail store locator</li> <li data-astro-cid-ucd2ps2b>Data-mining applications</li> <li data-astro-cid-ucd2ps2b>Custom web traffic reports</li> <li data-astro-cid-ucd2ps2b>Trouble ticket reporting</li> <li data-astro-cid-ucd2ps2b>Custom IVR application</li> <li data-astro-cid-ucd2ps2b>System automation with Puppet</li> <li data-astro-cid-ucd2ps2b>Ruby and PHP development</li> <li data-astro-cid-ucd2ps2b>SNMP network discovery</li> <li data-astro-cid-ucd2ps2b>CloudStack/XenServer implementation</li> </ul> <h2 data-astro-cid-ucd2ps2b>Skills</h2> <ul data-astro-cid-ucd2ps2b> <li data-astro-cid-ucd2ps2b>DNS configuration</li> <li data-astro-cid-ucd2ps2b>File system sizing and creation</li> <li data-astro-cid-ucd2ps2b>Startup and shutdown scripts</li> <li data-astro-cid-ucd2ps2b>Kernel performance tuning</li> <li data-astro-cid-ucd2ps2b>Disaster recovery process implementation</li> <li data-astro-cid-ucd2ps2b>Installation and configuration of new hardware</li> <li data-astro-cid-ucd2ps2b>Installation of third party software packages</li> </ul> </main> <footer data-astro-cid-5hce7sga> <a href="/privacy" data-astro-cid-5hce7sga>Privacy Policy</a> &nbsp;·&nbsp;
<a href="/terms" data-astro-cid-5hce7sga>Terms of Service</a> &nbsp;·&nbsp;
&copy; Brian Galura 2004&ndash;2026
</footer> </body></html>

View File

@@ -1,4 +1,5 @@
<!DOCTYPE html><html lang="en" data-astro-cid-5hce7sga> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Terms of Service — dd0c.net</title><style>body{font-family:system-ui,sans-serif;max-width:720px;margin:2rem auto;padding:0 1rem;line-height:1.6;color:#333}a[data-astro-cid-5hce7sga]{color:#0f3460}footer[data-astro-cid-5hce7sga]{margin-top:2rem;font-size:.9rem;text-align:center}.center[data-astro-cid-5hce7sga]{text-align:center}h1[data-astro-cid-5hce7sga]{font-size:1.5rem}h2[data-astro-cid-5hce7sga]{font-size:1.15rem;margin-top:1.5rem}p[data-astro-cid-5hce7sga]{margin:.5rem 0}
</style></head> <body data-astro-cid-5hce7sga> <h1>Terms of Service</h1> <p><strong>Effective Date:</strong> March 22, 2026</p> <h2>Acceptance</h2> <p>By using this application ("App"), you agree to these terms. The App is a personal-use tool and is not offered as a commercial service.</p> <h2>Description</h2> <p>The App provides automated access to Google Workspace services (Gmail, Calendar, Drive, Sheets, Photos) for the authenticated account holder's personal use.</p> <h2>Eligibility</h2> <p>Use of this App is limited to the account holder and authorized users explicitly granted access by the Operator.</p> <h2>Acceptable Use</h2> <p>The App is intended for lawful, personal use only. You agree not to use the App to violate any applicable laws or third-party rights.</p> <h2>Disclaimer</h2> <p>The App is provided "as is" without warranties of any kind. The Operator is not liable for any damages arising from the use of the App.</p> <h2>Modifications</h2> <p>These terms may be updated at any time. Continued use constitutes acceptance of the updated terms.</p> <h2>Contact</h2> <p>For questions, contact: <a href="mailto:bgalura@gmail.com">bgalura@gmail.com</a></p> <footer data-astro-cid-5hce7sga> <a href="/privacy" data-astro-cid-5hce7sga>Privacy Policy</a> ·
<a href="/terms" data-astro-cid-5hce7sga>Terms of Service</a> ·
Contact: <a href="mailto:bgalura@gmail.com" data-astro-cid-5hce7sga>bgalura@gmail.com</a> </footer> </body></html>
<!DOCTYPE html><html lang="en" data-astro-cid-5hce7sga> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Terms of Service — dd0c.net</title><link rel="icon" href="/favicon.ico"><style>[data-astro-cid-5hce7sga],[data-astro-cid-5hce7sga]:before,[data-astro-cid-5hce7sga]:after{box-sizing:border-box}body{font-family:system-ui,-apple-system,sans-serif;margin:0;background:#f8f9fa;color:#333;line-height:1.6}nav[data-astro-cid-5hce7sga]{background:#fff;border-bottom:2px solid #3294D2;padding:0 1.5rem;display:flex;align-items:center;gap:0}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga]{display:flex;align-items:center;gap:.5rem;text-decoration:none;margin-right:1.5rem;padding:.75rem 0}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga] img[data-astro-cid-5hce7sga]{height:32px;width:auto}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{color:#333;text-decoration:none;padding:.75rem .85rem;font-size:.95rem;transition:color .15s}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]:hover{color:#3294d2}nav[data-astro-cid-5hce7sga] .spacer[data-astro-cid-5hce7sga]{flex:1}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga].external{color:#3294d2}main[data-astro-cid-5hce7sga]{max-width:760px;margin:2rem auto;padding:0 1.25rem}footer[data-astro-cid-5hce7sga]{margin-top:3rem;padding:1.25rem;text-align:center;font-size:.875rem;color:#666;border-top:1px solid #e0e0e0;background:#fff}footer[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{color:#3294d2;text-decoration:none}footer[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]:hover{text-decoration:underline}h1[data-astro-cid-5hce7sga]{font-size:1.75rem;color:#1a1a1a}h2[data-astro-cid-5hce7sga]{font-size:1.2rem;margin-top:1.75rem;color:#1a1a1a}a[data-astro-cid-5hce7sga]{color:#3294d2}p[data-astro-cid-5hce7sga]{margin:.6rem 0}@media (max-width: 600px){nav[data-astro-cid-5hce7sga]{flex-wrap:wrap;padding:0 .75rem}nav[data-astro-cid-5hce7sga] .brand[data-astro-cid-5hce7sga]{margin-right:.5rem}nav[data-astro-cid-5hce7sga] a[data-astro-cid-5hce7sga]{padding:.6rem .5rem;font-size:.875rem}}
</style></head> <body data-astro-cid-5hce7sga> <nav data-astro-cid-5hce7sga> <a class="brand" href="/" data-astro-cid-5hce7sga> <img src="/images/smalllogo.png" alt="dd0c.net" data-astro-cid-5hce7sga> </a> <a href="/" data-astro-cid-5hce7sga>Home</a> <a href="/about" data-astro-cid-5hce7sga>About</a> <a href="/services" data-astro-cid-5hce7sga>Services</a> <div class="spacer" data-astro-cid-5hce7sga></div> <a class="external" href="https://github.com/ddoc" target="_blank" rel="noopener" data-astro-cid-5hce7sga>GitHub</a> </nav> <main data-astro-cid-5hce7sga> <h1>Terms of Service</h1> <p><strong>Effective Date:</strong> March 22, 2026</p> <h2>Acceptance</h2> <p>By using this application ("App"), you agree to these terms. The App is a personal-use tool and is not offered as a commercial service.</p> <h2>Description</h2> <p>The App provides automated access to Google Workspace services (Gmail, Calendar, Drive, Sheets, Photos) for the authenticated account holder's personal use.</p> <h2>Eligibility</h2> <p>Use of this App is limited to the account holder and authorized users explicitly granted access by the Operator.</p> <h2>Acceptable Use</h2> <p>The App is intended for lawful, personal use only. You agree not to use the App to violate any applicable laws or third-party rights.</p> <h2>Disclaimer</h2> <p>The App is provided "as is" without warranties of any kind. The Operator is not liable for any damages arising from the use of the App.</p> <h2>Modifications</h2> <p>These terms may be updated at any time. Continued use constitutes acceptance of the updated terms.</p> <h2>Contact</h2> <p>For questions, contact: <a href="mailto:contact@dd0c.net">contact@dd0c.net</a></p> </main> <footer data-astro-cid-5hce7sga> <a href="/privacy" data-astro-cid-5hce7sga>Privacy Policy</a> &nbsp;·&nbsp;
<a href="/terms" data-astro-cid-5hce7sga>Terms of Service</a> &nbsp;·&nbsp;
&copy; Brian Galura 2004&ndash;2026
</footer> </body></html>

4
node_modules/.cache/wrangler/pages.json generated vendored Normal file
View File

@@ -0,0 +1,4 @@
{
"account_id": "3fac2810084531aeee0ac157b792ef98",
"project_name": "dd0c-site"
}

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
public/images/grid.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 B

BIN
public/images/smalllogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -6,23 +6,92 @@ const { title } = Astro.props;
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{title}</title>
<title>{title ? `${title} — dd0c.net` : 'dd0c.net'}</title>
<link rel="icon" href="/favicon.ico">
<style>
body { font-family: system-ui, sans-serif; max-width: 720px; margin: 2rem auto; padding: 0 1rem; line-height: 1.6; color: #333; }
a { color: #0f3460; }
footer { margin-top: 2rem; font-size: 0.9rem; text-align: center; }
.center { text-align: center; }
h1 { font-size: 1.5rem; }
h2 { font-size: 1.15rem; margin-top: 1.5rem; }
p { margin: 0.5rem 0; }
*, *::before, *::after { box-sizing: border-box; }
body {
font-family: system-ui, -apple-system, sans-serif;
margin: 0;
background: #f8f9fa;
color: #333;
line-height: 1.6;
}
nav {
background: #fff;
border-bottom: 2px solid #3294D2;
padding: 0 1.5rem;
display: flex;
align-items: center;
gap: 0;
}
nav .brand {
display: flex;
align-items: center;
gap: 0.5rem;
text-decoration: none;
margin-right: 1.5rem;
padding: 0.75rem 0;
}
nav .brand img {
height: 32px;
width: auto;
}
nav a {
color: #333;
text-decoration: none;
padding: 0.75rem 0.85rem;
font-size: 0.95rem;
transition: color 0.15s;
}
nav a:hover { color: #3294D2; }
nav .spacer { flex: 1; }
nav a.external { color: #3294D2; }
main {
max-width: 760px;
margin: 2rem auto;
padding: 0 1.25rem;
}
footer {
margin-top: 3rem;
padding: 1.25rem;
text-align: center;
font-size: 0.875rem;
color: #666;
border-top: 1px solid #e0e0e0;
background: #fff;
}
footer a { color: #3294D2; text-decoration: none; }
footer a:hover { text-decoration: underline; }
h1 { font-size: 1.75rem; color: #1a1a1a; }
h2 { font-size: 1.2rem; margin-top: 1.75rem; color: #1a1a1a; }
a { color: #3294D2; }
p { margin: 0.6rem 0; }
@media (max-width: 600px) {
nav { flex-wrap: wrap; padding: 0 0.75rem; }
nav .brand { margin-right: 0.5rem; }
nav a { padding: 0.6rem 0.5rem; font-size: 0.875rem; }
}
</style>
</head>
<body>
<slot />
<nav>
<a class="brand" href="/">
<img src="/images/smalllogo.png" alt="dd0c.net" />
</a>
<a href="/">Home</a>
<a href="/about">About</a>
<a href="/services">Services</a>
<div class="spacer"></div>
<a class="external" href="https://github.com/ddoc" target="_blank" rel="noopener">GitHub</a>
</nav>
<main>
<slot />
</main>
<footer>
<a href="/privacy">Privacy Policy</a> ·
<a href="/terms">Terms of Service</a> ·
Contact: <a href="mailto:bgalura@gmail.com">bgalura@gmail.com</a>
<a href="/privacy">Privacy Policy</a> &nbsp;·&nbsp;
<a href="/terms">Terms of Service</a> &nbsp;·&nbsp;
&copy; Brian Galura 2004&ndash;2026
</footer>
</body>
</html>

View File

@@ -0,0 +1,19 @@
---
import Base from './Base.astro';
const { frontmatter } = Astro.props;
---
<Base title={frontmatter.title}>
<style>
.post-meta { color: #888; font-size: 0.875rem; margin-bottom: 1.5rem; }
.post-body { line-height: 1.75; }
.post-body iframe { max-width: 100%; }
.back { display: inline-block; margin-bottom: 1.25rem; font-size: 0.9rem; color: #3294D2; text-decoration: none; }
.back:hover { text-decoration: underline; }
</style>
<a class="back" href="/">← All posts</a>
<h1>{frontmatter.title}</h1>
<p class="post-meta">{frontmatter.date}</p>
<div class="post-body">
<slot />
</div>
</Base>

8
src/pages/about.astro Normal file
View File

@@ -0,0 +1,8 @@
---
import Base from '../layouts/Base.astro';
---
<Base title="About">
<h1>About</h1>
<p>After a childhood spent tinkering on subjects such as Java programming and Linux, Brian's professional experience started with VoIP testing at 3Com in suburban Chicago. He then spent two years studying Computer Engineering at Purdue University before leaving to pursue freelance consulting in Los Angeles.</p>
<p>Following several years of freelancing, he developed his expertise in enterprise infrastructure and cloud computing by working for a variety of startups and large corporations. Later he completed a Bachelor's in I.T. while working at Citrix. Brian is currently working on Citrix's Cloud Engineering and Systems Architecture team in Santa Barbara, California.</p>
</Base>

View File

@@ -1,10 +1,29 @@
---
import Base from '../layouts/Base.astro';
const posts = [
{ title: 'AWS VPC Buildout With Foreman Hooks for RDNS Creation', date: '2014-01-15', slug: 'foreman-hooks-aws-vpc' },
{ title: 'CloudStack Collab 2013: Lessons Learned at Citrix OSD', date: '2013-06-23', slug: 'cloudstack-devops' },
];
---
<Base title="dd0c Tools">
<div class="center">
<img src="/logo.png" alt="dd0c Tools" width="120" height="120">
<h1>dd0c Tools</h1>
<p>dd0c Tools — Personal productivity tools for Google Workspace.</p>
</div>
<Base title="dd0c.net">
<style>
.post-list { list-style: none; padding: 0; margin: 1.5rem 0; }
.post-list li { padding: 0.75rem 0; border-bottom: 1px solid #e8e8e8; display: flex; justify-content: space-between; align-items: baseline; gap: 1rem; }
.post-list li:last-child { border-bottom: none; }
.post-list a { font-size: 1.05rem; text-decoration: none; color: #3294D2; }
.post-list a:hover { text-decoration: underline; }
.post-date { font-size: 0.875rem; color: #888; white-space: nowrap; }
</style>
<h1>dd0c.net</h1>
<p>Infrastructure, cloud, and systems engineering by Brian Galura.</p>
<h2>Posts</h2>
<ul class="post-list">
{posts.map(p => (
<li>
<a href={`/posts/${p.slug}`}>{p.title}</a>
<span class="post-date">{p.date}</span>
</li>
))}
</ul>
</Base>

View File

@@ -0,0 +1,11 @@
---
layout: ../../layouts/PostLayout.astro
title: "CloudStack Collab 2013: Lessons Learned at Citrix OSD"
date: "2013-06-23"
---
[Open@Citrix](http://open.citrix.com/cloud-computing-vids/video/six-months-into-cloudstack-lessons-learned-at-citrix-osd-by-brian-galura.html)
[Slides](http://prezi.com/2sgvlsz2bqoz/?utm_campaign=share&utm_medium=copy)
<iframe width="560" height="315" src="https://www.youtube.com/embed/MUcLkXr2M34" frameborder="0" allowfullscreen></iframe>

View File

@@ -0,0 +1,34 @@
---
layout: ../../layouts/PostLayout.astro
title: "AWS VPC Buildout With Foreman Hooks for RDNS Creation"
date: "2014-01-15"
---
Originally posted on [Digital Ducttape](http://digital-ducttape.com/2013/10/23/aws-vpc-buildout-with-foreman_hooks-for-rdns-creation/)
[Foreman](http://theforeman.org/) is a tool I have used for a long time as an external node classifier for Puppet and its smart-proxy for integration with DNS. However when Foreman recently [added support](http://projects.theforeman.org/issues/1871) for building EC2 instances inside a VPC, I thought it was a great opportunity to use the same tool for a new buildout.
Shortly after starting I discovered that reverse DNS is [unfortunately broken](http://projects.theforeman.org/issues/3166) for EC2 VPC builds. Foreman does not map a relationship between VPC subnets and any DNS smart-proxy. Unswayed I took to #foreman and was guided to a potential solution.
Enter [foreman_hooks](https://github.com/theforeman/foreman_hooks). This plugin for foreman allows you to subscribe to create/update/destroy events and invoke any executable. Lucky for me this was a great workaround for the functionality lacking in the recent 1.3 release. Initially I wrote a script utilizing the smart-proxy API to create PTR records but it complained that the IP address was already assigned. Fair enough. Without further investigation I wrote instead a short shell script which does the same thing using nsupdate with tsigs and viola! Integrated forward and reverse DNS for EC2 VPC deployments. A few more lines of code added support for the destroy hook and now the feature is complete.
I named this script `rdns.sh` and placed it in `/usr/share/foreman/config/hooks.d` and created symlinks to it in both:
`/usr/share/foreman/config/hooks/host/managed/destroy/`
`/usr/share/foreman/config/hooks/host/managed/create/`
[source for rdns.sh](https://gist.github.com/ddoc/8447483)
<script src="https://gist.github.com/ddoc/8447483.js"></script>
[source for utils.sh](https://gist.github.com/ddoc/8446722)
[source for hook_functions.sh](https://github.com/theforeman/foreman_hooks/blob/master/examples/hook_functions.sh)
Of course, after implementing this I saw many uses for foreman_hooks including:
- resizing an EC2 root volume at build time
- attaching additional volumes
- EIP associations and DNS
- different hooks for different domains
- adding and removing hosts to an external monitoring system
I will post updates on these implementations at another time.

View File

@@ -1,7 +1,7 @@
---
import Base from '../layouts/Base.astro';
---
<Base title="Privacy Policy — dd0c.net">
<Base title="Privacy Policy">
<h1>Privacy Policy</h1>
<p><strong>Effective Date:</strong> March 22, 2026</p>
<p>This application ("App") is a personal-use tool operated by Brian Galura ("Operator"). It is not offered as a commercial service.</p>
@@ -25,5 +25,5 @@ import Base from '../layouts/Base.astro';
<p>You may revoke the App's access at any time via <a href="https://myaccount.google.com/permissions">Google Account Permissions</a>.</p>
<h2>Contact</h2>
<p>For questions, contact: <a href="mailto:bgalura@gmail.com">bgalura@gmail.com</a></p>
<p>For questions, contact: <a href="mailto:contact@dd0c.net">contact@dd0c.net</a></p>
</Base>

39
src/pages/services.astro Normal file
View File

@@ -0,0 +1,39 @@
---
import Base from '../layouts/Base.astro';
---
<Base title="Services">
<style>
ul { padding-left: 1.25rem; }
ul li { margin: 0.35rem 0; }
.contact { margin: 1rem 0; }
.contact a { color: #3294D2; }
</style>
<h1>Services</h1>
<p>Hourly and flat-cost projects.</p>
<p class="contact">Contact: <a href="mailto:contact@dd0c.net">contact@dd0c.net</a></p>
<h2>Successful projects include</h2>
<ul>
<li>Service deployments into and out of the cloud</li>
<li>Zip-code based retail store locator</li>
<li>Data-mining applications</li>
<li>Custom web traffic reports</li>
<li>Trouble ticket reporting</li>
<li>Custom IVR application</li>
<li>System automation with Puppet</li>
<li>Ruby and PHP development</li>
<li>SNMP network discovery</li>
<li>CloudStack/XenServer implementation</li>
</ul>
<h2>Skills</h2>
<ul>
<li>DNS configuration</li>
<li>File system sizing and creation</li>
<li>Startup and shutdown scripts</li>
<li>Kernel performance tuning</li>
<li>Disaster recovery process implementation</li>
<li>Installation and configuration of new hardware</li>
<li>Installation of third party software packages</li>
</ul>
</Base>

View File

@@ -1,7 +1,7 @@
---
import Base from '../layouts/Base.astro';
---
<Base title="Terms of Service — dd0c.net">
<Base title="Terms of Service">
<h1>Terms of Service</h1>
<p><strong>Effective Date:</strong> March 22, 2026</p>
@@ -24,5 +24,5 @@ import Base from '../layouts/Base.astro';
<p>These terms may be updated at any time. Continued use constitutes acceptance of the updated terms.</p>
<h2>Contact</h2>
<p>For questions, contact: <a href="mailto:bgalura@gmail.com">bgalura@gmail.com</a></p>
<p>For questions, contact: <a href="mailto:contact@dd0c.net">contact@dd0c.net</a></p>
</Base>