From fbe79d4523c8c205a50c63afea950869714eb7d9 Mon Sep 17 00:00:00 2001 From: Jarvis Prime Date: Sun, 22 Mar 2026 20:13:49 +0000 Subject: [PATCH] Port full site: all pages, blog posts, nav/footer, assets --- dist/about/index.html | 5 ++ dist/favicon.ico | Bin 0 -> 3638 bytes dist/images/grid.png | Bin 0 -> 206 bytes dist/images/smalllogo.png | Bin 0 -> 3594 bytes dist/index.html | 10 ++- dist/posts/cloudstack-devops/index.html | 8 ++ dist/posts/foreman-hooks-aws-vpc/index.html | 25 ++++++ dist/privacy/index.html | 9 +- dist/services/index.html | 6 ++ dist/terms/index.html | 9 +- node_modules/.cache/wrangler/pages.json | 4 + public/favicon.ico | Bin 0 -> 3638 bytes public/images/grid.png | Bin 0 -> 206 bytes public/images/smalllogo.png | Bin 0 -> 3594 bytes src/layouts/Base.astro | 93 +++++++++++++++++--- src/layouts/PostLayout.astro | 19 ++++ src/pages/about.astro | 8 ++ src/pages/index.astro | 31 +++++-- src/pages/posts/cloudstack-devops.md | 11 +++ src/pages/posts/foreman-hooks-aws-vpc.md | 34 +++++++ src/pages/privacy.astro | 4 +- src/pages/services.astro | 39 ++++++++ src/pages/terms.astro | 4 +- 23 files changed, 285 insertions(+), 34 deletions(-) create mode 100644 dist/about/index.html create mode 100644 dist/favicon.ico create mode 100644 dist/images/grid.png create mode 100644 dist/images/smalllogo.png create mode 100644 dist/posts/cloudstack-devops/index.html create mode 100644 dist/posts/foreman-hooks-aws-vpc/index.html create mode 100644 dist/services/index.html create mode 100644 node_modules/.cache/wrangler/pages.json create mode 100644 public/favicon.ico create mode 100644 public/images/grid.png create mode 100644 public/images/smalllogo.png create mode 100644 src/layouts/PostLayout.astro create mode 100644 src/pages/about.astro create mode 100644 src/pages/posts/cloudstack-devops.md create mode 100644 src/pages/posts/foreman-hooks-aws-vpc.md create mode 100644 src/pages/services.astro diff --git a/dist/about/index.html b/dist/about/index.html new file mode 100644 index 0000000..1e8265a --- /dev/null +++ b/dist/about/index.html @@ -0,0 +1,5 @@ + About — dd0c.net

About

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.

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.

\ No newline at end of file diff --git a/dist/favicon.ico b/dist/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3016f98ed2bdf3e01a41e7a86a141b434d906e41 GIT binary patch literal 3638 zcmeHKXH-=FyI>&}VoO4ricyn@111__kqE)dHUh;icUuv^{EKmM|+|YnGebM^A!VjZZF%OXr-4TAM4N6jOAkL*fs&WGH}RYO4@&v?Y{92`G$pMr}nVqEB^)SQU;Z zmyA)Ceg`EC4vgK8d7i+Wj-&ks)Rd;uh8yx99|A*w z*iZ{qX)=_>@rb`L4AliujCl+auW)^-FG>ZEFeu%X4To|`(HW!e3MPv?c2A_6NJ&9 zwBcB?B|Um}`;p_pQ`dAHKYqoWk!ye1r?$7}yN}=cdBcXK6W0&7P}{Tq#zxm}-MWvy z>^u7d^?0G7*236X>h-NBEEx9f?lvQOjcM_|!OC&?!EENcOMWtGx#YvW#)j>BH~F3* z^l#tlXv2)6#aY`|zCtCN24_1FXYEjt<&PA1a|G@HYRaDylP)6T z{z~bbKR&{>6+y_4IDs^8OVq1MdG@1;u{IKhCS99|Sm)jls}pE54?OzBI2|NjHYeT; zMyiJe@l8bxlM{n-k?b~&>nc!1Y)-gnjHh=OBhzm^a)Ndt@6jRRpNoVAaW4IcDXv^w zgEX%N681$MZ!h6uX|g-9z6}avPD+>+yc>A5AIMa!L0xsBgmYrKKPobP8BZ25rw$Rv zH27MX9YSm`BmRv<_QP#xsH>7NDE3Sr#GM;Rj2?n4|4ocB4wcz~#J9=B*1Pn3CK9ii zGoD%e?rEgoks&wOj@b7QQBEC^c-54+JB66(N!>!?<}v2>0D^X^v9CeG(8hWd!hRzr zA5`OMB{3fo7ezRFHZ~&kIYu|A zIjXJ(gnNlM8fvRiPhN_2XiGjTMO{^a#1qj@`VwzOIdvvaWs|GBqK15>=7t#OUJ`d! z=7e%@N1-w&n0xSmd7Fgtr*b5@PG%i=Bgt(#lCRGorh8CsBGq#?>(2s3373#|Yd(r% z&!I5-6j%}xM~aQ2#3!QIC~=C0mutb&Wp3*bY7g+bAn|P2@2mw%L#+~z4zRDQ#v|ri z&9UK(O>C%;_(*+Mh@hyss9sgZ`XEoLN+`t=e@8mDW$Zf4ZxN+{lE;14N3>HX=9~P? zJ4*DauI#%(#r&%IOwD64rwv&GcdgJRn(W_E>nz?r}$r{>GopG|vYcbPs9uU%gI0 zsF{9i`%bIBbne2Iz4<-W*SU*?=KAt0GHl;WG`tIWbXq z;lJMQXM#{Bd!T6wUHNU<-H+Bc(cfVH%iVl+719cYuCH7sb9hPruO89gE9CryToG_2 zF=Ii{OM2nj{;dhyOjnq0ONa}-rS`D-{%Cw|`h20^?c8);`#VeE)vvGPgx+S4YQXEe;0wns~aoxd-f>_BZv` ze^nQ!$N!{z*IVXgU|`@S^Y-zbbY#Yup&#!k?ND)DbAIgqn4FTCHL_sHkaL|sOMMa- z${Wa|vpTERG`)9dU3=d9sg eP4V2UQ%-S&{p}&=QrQ17rI+m7`@@2)eA7N<!3HEX<>xE|QY^(zo*^7SP{WbZ0pxQQctjR6 zFmQbUVMeDlCNqG7G9|7NCBgY=CFO}lsSJ)O`AMk?Zka`?<@rU~#R|^B#xt(DF$2|k zc)B=-cyuP$eEj#lzKxOL5tEL~%H%~Gtu@#d^DPnSv6>KM@XEpK;0k6FVdQ&MBb@06Zo?vj6}9 literal 0 HcmV?d00001 diff --git a/dist/images/smalllogo.png b/dist/images/smalllogo.png new file mode 100644 index 0000000000000000000000000000000000000000..bfd1796f7dbb7cd0d13e87ca8c80c307a0600450 GIT binary patch literal 3594 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 dd0c Tools
dd0c Tools

dd0c Tools

dd0c Tools — Personal productivity tools for Google Workspace.

\ No newline at end of file + dd0c.net — dd0c.net

dd0c.net

Infrastructure, cloud, and systems engineering by Brian Galura.

Posts

\ No newline at end of file diff --git a/dist/posts/cloudstack-devops/index.html b/dist/posts/cloudstack-devops/index.html new file mode 100644 index 0000000..5daeef7 --- /dev/null +++ b/dist/posts/cloudstack-devops/index.html @@ -0,0 +1,8 @@ + CloudStack Collab 2013: Lessons Learned at Citrix OSD — dd0c.net
← All posts

CloudStack Collab 2013: Lessons Learned at Citrix OSD

Open@Citrix

+

Slides

+
\ No newline at end of file diff --git a/dist/posts/foreman-hooks-aws-vpc/index.html b/dist/posts/foreman-hooks-aws-vpc/index.html new file mode 100644 index 0000000..c9319d3 --- /dev/null +++ b/dist/posts/foreman-hooks-aws-vpc/index.html @@ -0,0 +1,25 @@ + AWS VPC Buildout With Foreman Hooks for RDNS Creation — dd0c.net
← All posts

AWS VPC Buildout With Foreman Hooks for RDNS Creation

Originally posted on Digital Ducttape

+

Foreman 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 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 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. 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

+ +

source for utils.sh
+source for 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.

\ No newline at end of file diff --git a/dist/privacy/index.html b/dist/privacy/index.html index a629e65..55ad712 100644 --- a/dist/privacy/index.html +++ b/dist/privacy/index.html @@ -1,4 +1,5 @@ - Privacy Policy — dd0c.net

Privacy Policy

Effective Date: March 22, 2026

This application ("App") is a personal-use tool operated by Brian Galura ("Operator"). It is not offered as a commercial service.

Data Collection

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.

Data Use

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.

Data Storage

OAuth tokens are stored securely on the Operator's private infrastructure. Cached data (e.g., downloaded attachments) is stored temporarily and deleted after processing.

Data Retention

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.

Third-Party Services

The App uses Google APIs subject to the Google API Services User Data Policy.

Your Rights

You may revoke the App's access at any time via Google Account Permissions.

Contact

For questions, contact: bgalura@gmail.com

\ No newline at end of file + Privacy Policy — dd0c.net

Privacy Policy

Effective Date: March 22, 2026

This application ("App") is a personal-use tool operated by Brian Galura ("Operator"). It is not offered as a commercial service.

Data Collection

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.

Data Use

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.

Data Storage

OAuth tokens are stored securely on the Operator's private infrastructure. Cached data (e.g., downloaded attachments) is stored temporarily and deleted after processing.

Data Retention

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.

Third-Party Services

The App uses Google APIs subject to the Google API Services User Data Policy.

Your Rights

You may revoke the App's access at any time via Google Account Permissions.

Contact

For questions, contact: contact@dd0c.net

\ No newline at end of file diff --git a/dist/services/index.html b/dist/services/index.html new file mode 100644 index 0000000..06373eb --- /dev/null +++ b/dist/services/index.html @@ -0,0 +1,6 @@ + Services — dd0c.net

Services

Hourly and flat-cost projects.

Contact: contact@dd0c.net

Successful projects include

  • Service deployments into and out of the cloud
  • Zip-code based retail store locator
  • Data-mining applications
  • Custom web traffic reports
  • Trouble ticket reporting
  • Custom IVR application
  • System automation with Puppet
  • Ruby and PHP development
  • SNMP network discovery
  • CloudStack/XenServer implementation

Skills

  • DNS configuration
  • File system sizing and creation
  • Startup and shutdown scripts
  • Kernel performance tuning
  • Disaster recovery process implementation
  • Installation and configuration of new hardware
  • Installation of third party software packages
\ No newline at end of file diff --git a/dist/terms/index.html b/dist/terms/index.html index 29ec4e2..cb18a5c 100644 --- a/dist/terms/index.html +++ b/dist/terms/index.html @@ -1,4 +1,5 @@ - Terms of Service — dd0c.net

Terms of Service

Effective Date: March 22, 2026

Acceptance

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.

Description

The App provides automated access to Google Workspace services (Gmail, Calendar, Drive, Sheets, Photos) for the authenticated account holder's personal use.

Eligibility

Use of this App is limited to the account holder and authorized users explicitly granted access by the Operator.

Acceptable Use

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.

Disclaimer

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.

Modifications

These terms may be updated at any time. Continued use constitutes acceptance of the updated terms.

Contact

For questions, contact: bgalura@gmail.com

\ No newline at end of file + Terms of Service — dd0c.net

Terms of Service

Effective Date: March 22, 2026

Acceptance

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.

Description

The App provides automated access to Google Workspace services (Gmail, Calendar, Drive, Sheets, Photos) for the authenticated account holder's personal use.

Eligibility

Use of this App is limited to the account holder and authorized users explicitly granted access by the Operator.

Acceptable Use

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.

Disclaimer

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.

Modifications

These terms may be updated at any time. Continued use constitutes acceptance of the updated terms.

Contact

For questions, contact: contact@dd0c.net

\ No newline at end of file diff --git a/node_modules/.cache/wrangler/pages.json b/node_modules/.cache/wrangler/pages.json new file mode 100644 index 0000000..5e1d51d --- /dev/null +++ b/node_modules/.cache/wrangler/pages.json @@ -0,0 +1,4 @@ +{ + "account_id": "3fac2810084531aeee0ac157b792ef98", + "project_name": "dd0c-site" +} \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3016f98ed2bdf3e01a41e7a86a141b434d906e41 GIT binary patch literal 3638 zcmeHKXH-=FyI>&}VoO4ricyn@111__kqE)dHUh;icUuv^{EKmM|+|YnGebM^A!VjZZF%OXr-4TAM4N6jOAkL*fs&WGH}RYO4@&v?Y{92`G$pMr}nVqEB^)SQU;Z zmyA)Ceg`EC4vgK8d7i+Wj-&ks)Rd;uh8yx99|A*w z*iZ{qX)=_>@rb`L4AliujCl+auW)^-FG>ZEFeu%X4To|`(HW!e3MPv?c2A_6NJ&9 zwBcB?B|Um}`;p_pQ`dAHKYqoWk!ye1r?$7}yN}=cdBcXK6W0&7P}{Tq#zxm}-MWvy z>^u7d^?0G7*236X>h-NBEEx9f?lvQOjcM_|!OC&?!EENcOMWtGx#YvW#)j>BH~F3* z^l#tlXv2)6#aY`|zCtCN24_1FXYEjt<&PA1a|G@HYRaDylP)6T z{z~bbKR&{>6+y_4IDs^8OVq1MdG@1;u{IKhCS99|Sm)jls}pE54?OzBI2|NjHYeT; zMyiJe@l8bxlM{n-k?b~&>nc!1Y)-gnjHh=OBhzm^a)Ndt@6jRRpNoVAaW4IcDXv^w zgEX%N681$MZ!h6uX|g-9z6}avPD+>+yc>A5AIMa!L0xsBgmYrKKPobP8BZ25rw$Rv zH27MX9YSm`BmRv<_QP#xsH>7NDE3Sr#GM;Rj2?n4|4ocB4wcz~#J9=B*1Pn3CK9ii zGoD%e?rEgoks&wOj@b7QQBEC^c-54+JB66(N!>!?<}v2>0D^X^v9CeG(8hWd!hRzr zA5`OMB{3fo7ezRFHZ~&kIYu|A zIjXJ(gnNlM8fvRiPhN_2XiGjTMO{^a#1qj@`VwzOIdvvaWs|GBqK15>=7t#OUJ`d! z=7e%@N1-w&n0xSmd7Fgtr*b5@PG%i=Bgt(#lCRGorh8CsBGq#?>(2s3373#|Yd(r% z&!I5-6j%}xM~aQ2#3!QIC~=C0mutb&Wp3*bY7g+bAn|P2@2mw%L#+~z4zRDQ#v|ri z&9UK(O>C%;_(*+Mh@hyss9sgZ`XEoLN+`t=e@8mDW$Zf4ZxN+{lE;14N3>HX=9~P? zJ4*DauI#%(#r&%IOwD64rwv&GcdgJRn(W_E>nz?r}$r{>GopG|vYcbPs9uU%gI0 zsF{9i`%bIBbne2Iz4<-W*SU*?=KAt0GHl;WG`tIWbXq z;lJMQXM#{Bd!T6wUHNU<-H+Bc(cfVH%iVl+719cYuCH7sb9hPruO89gE9CryToG_2 zF=Ii{OM2nj{;dhyOjnq0ONa}-rS`D-{%Cw|`h20^?c8);`#VeE)vvGPgx+S4YQXEe;0wns~aoxd-f>_BZv` ze^nQ!$N!{z*IVXgU|`@S^Y-zbbY#Yup&#!k?ND)DbAIgqn4FTCHL_sHkaL|sOMMa- z${Wa|vpTERG`)9dU3=d9sg eP4V2UQ%-S&{p}&=QrQ17rI+m7`@@2)eA7N<!3HEX<>xE|QY^(zo*^7SP{WbZ0pxQQctjR6 zFmQbUVMeDlCNqG7G9|7NCBgY=CFO}lsSJ)O`AMk?Zka`?<@rU~#R|^B#xt(DF$2|k zc)B=-cyuP$eEj#lzKxOL5tEL~%H%~Gtu@#d^DPnSv6>KM@XEpK;0k6FVdQ&MBb@06Zo?vj6}9 literal 0 HcmV?d00001 diff --git a/public/images/smalllogo.png b/public/images/smalllogo.png new file mode 100644 index 0000000000000000000000000000000000000000..bfd1796f7dbb7cd0d13e87ca8c80c307a0600450 GIT binary patch literal 3594 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 - {title} + {title ? `${title} — dd0c.net` : 'dd0c.net'} + - + +
+ +
diff --git a/src/layouts/PostLayout.astro b/src/layouts/PostLayout.astro new file mode 100644 index 0000000..5daf29d --- /dev/null +++ b/src/layouts/PostLayout.astro @@ -0,0 +1,19 @@ +--- +import Base from './Base.astro'; +const { frontmatter } = Astro.props; +--- + + + ← All posts +

{frontmatter.title}

+ +
+ +
+ diff --git a/src/pages/about.astro b/src/pages/about.astro new file mode 100644 index 0000000..fb5f2cc --- /dev/null +++ b/src/pages/about.astro @@ -0,0 +1,8 @@ +--- +import Base from '../layouts/Base.astro'; +--- + +

About

+

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.

+

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.

+ diff --git a/src/pages/index.astro b/src/pages/index.astro index 264602a..fffdde8 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -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' }, +]; --- - -
- dd0c Tools -

dd0c Tools

-

dd0c Tools — Personal productivity tools for Google Workspace.

-
+ + +

dd0c.net

+

Infrastructure, cloud, and systems engineering by Brian Galura.

+

Posts

+
    + {posts.map(p => ( +
  • + {p.title} + +
  • + ))} +
diff --git a/src/pages/posts/cloudstack-devops.md b/src/pages/posts/cloudstack-devops.md new file mode 100644 index 0000000..62f2434 --- /dev/null +++ b/src/pages/posts/cloudstack-devops.md @@ -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) + + diff --git a/src/pages/posts/foreman-hooks-aws-vpc.md b/src/pages/posts/foreman-hooks-aws-vpc.md new file mode 100644 index 0000000..9f801a7 --- /dev/null +++ b/src/pages/posts/foreman-hooks-aws-vpc.md @@ -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) + + +[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. diff --git a/src/pages/privacy.astro b/src/pages/privacy.astro index 0ee209e..10c1ce8 100644 --- a/src/pages/privacy.astro +++ b/src/pages/privacy.astro @@ -1,7 +1,7 @@ --- import Base from '../layouts/Base.astro'; --- - +

Privacy Policy

Effective Date: March 22, 2026

This application ("App") is a personal-use tool operated by Brian Galura ("Operator"). It is not offered as a commercial service.

@@ -25,5 +25,5 @@ import Base from '../layouts/Base.astro';

You may revoke the App's access at any time via Google Account Permissions.

Contact

-

For questions, contact: bgalura@gmail.com

+

For questions, contact: contact@dd0c.net

diff --git a/src/pages/services.astro b/src/pages/services.astro new file mode 100644 index 0000000..89c8d2d --- /dev/null +++ b/src/pages/services.astro @@ -0,0 +1,39 @@ +--- +import Base from '../layouts/Base.astro'; +--- + + +

Services

+

Hourly and flat-cost projects.

+

Contact: contact@dd0c.net

+ +

Successful projects include

+
    +
  • Service deployments into and out of the cloud
  • +
  • Zip-code based retail store locator
  • +
  • Data-mining applications
  • +
  • Custom web traffic reports
  • +
  • Trouble ticket reporting
  • +
  • Custom IVR application
  • +
  • System automation with Puppet
  • +
  • Ruby and PHP development
  • +
  • SNMP network discovery
  • +
  • CloudStack/XenServer implementation
  • +
+ +

Skills

+
    +
  • DNS configuration
  • +
  • File system sizing and creation
  • +
  • Startup and shutdown scripts
  • +
  • Kernel performance tuning
  • +
  • Disaster recovery process implementation
  • +
  • Installation and configuration of new hardware
  • +
  • Installation of third party software packages
  • +
+ diff --git a/src/pages/terms.astro b/src/pages/terms.astro index 5fd4e8b..799449c 100644 --- a/src/pages/terms.astro +++ b/src/pages/terms.astro @@ -1,7 +1,7 @@ --- import Base from '../layouts/Base.astro'; --- - +

Terms of Service

Effective Date: March 22, 2026

@@ -24,5 +24,5 @@ import Base from '../layouts/Base.astro';

These terms may be updated at any time. Continued use constitutes acceptance of the updated terms.

Contact

-

For questions, contact: bgalura@gmail.com

+

For questions, contact: contact@dd0c.net