This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/env ruby | |
# Create CNAME records in Route 53 that refer to the running EC2 instance | |
# Unless specified by the first argument, a default TTL of 300 is assumed. | |
# Instance tags specify CNAMES to be set: | |
# 'set_cname:0' => 'name.example.com', 'set_cname:1' => 'name2.example.com', etc | |
# Uses IAM credentials found in the AWS CLI config file: | |
# ~/.aws/config (use `aws configure` to create) | |
# Depends on ec2-metadata command to retrieve the current instance ID |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/env ruby | |
### The Poor-Man's DNS Zone Transfer | |
# Copy specific records from a specific name service to Route 53, without using a conventional zone transfer mechanism. | |
# | |
# I realize this is unorthodox and might seem less-than-optimal for most use-cases. In my case, this is a means to | |
# help me continue to utilize Dreamhost's "Fully Hosted Domain" features even after migrating the authority of my zones | |
# as well as my name service to Route 53. The correct functioning of my web hosting and my email services depend on | |
# the ability of dreamhost to freely manage a known subset of the records in my zone. I chose to solve this by | |
# periodically copying that set of records from Dreamhost's name server for my domain into its actual authoritative |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Author: Erik Elmore <[email protected]> | |
# License: Public Domain | |
# A lazy-loaded collection with built-in lookup indexing. | |
# Good for using lots of memory. | |
class IndexedCollection | |
include Enumerable | |
DEFAULT_DATA = Array[].freeze | |
DEFAULT_LOADER = ->(){ DEFAULT_DATA }.freeze |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Author: Erik Elmore <[email protected]> | |
# License: Public Domain | |
# Enable "diffing" and two-way transformations between collection objects | |
module Diffable | |
# Calculates the changes required to transform self to the given collection. | |
# @param b [Enumerable] The other collection object | |
# @return [Array] The Diff: A two-element change set representing items to exclude and items to include | |
def diff( b ) | |
a, b = to_a, b.to_a |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Author: Erik Elmore <[email protected]> | |
# License: Public Domain | |
require 'securerandom' | |
require 'aws' | |
# Test the feasability of using temporary queues and topics as a means of receiving | |
# notifications from remote systems via SQS and SNS. TestClient creates either only a | |
# queue or both a queue and a topic before sending a request to the server. When the | |
# client wishes to receive its response directly in a temporary queue, the request | |
# body is the URL to its temporary queue. When the client wishes to be notified via a |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Author: Erik Elmore <[email protected]> | |
# License: Public Domain | |
require 'uri' | |
require 'aws-sdk' | |
# Facilitates polling and handling queue messages. | |
class SQSMessageDispatch | |
# Configure a new SQSMessageDispatch for the given queue URL. | |
# @param queue_url [String] URL of the SQS message queue | |
# @param sqs_opts [Hash] parameters passed to Aws::SQS::Client.new (except :region) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Author: Erik Elmore <[email protected]> | |
# License: Public Domain | |
# Convenience in logging | |
module LogMethods | |
def error( *args, &blk ) | |
log :error, *args, &blk | |
end | |
private :error | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# @author Erik Elmore <[email protected]> | |
# This is getting a little out of hand... :dizzy_face: | |
# For printing trace output for demonstration | |
module Status | |
def status( method_name, args = [], extra = nil ) | |
extra = ' => %s' % extra if extra | |
puts '%s#%s(%s)%s' % [self.class, method_name, args.join(', '), extra] | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module NormalizeHeredoc | |
module_function | |
# Normalize indents, like for heredoc strings | |
def NormalizeIndent( msg ) | |
msg = String(msg) | |
depth = msg.scan(/^\s*/).flatten.map(&:size).min | |
msg.gsub(/^\s{#{depth}}/, '') | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Enforces upper bound on the frequency of arbitrary actions. | |
# Thread-safe, but not terribly efficient. | |
class RateLimit | |
# Blocks passed to #enforce are executed with a frequency not exceeding the average of +limit+ calls per +period+ over | |
# +burst+ consecutive periods. Thread safe, but be advised there are no guarantees about the order or timeliness in | |
# which the given blocks are executed. | |
# @param limit [Numeric] Target average number of events per period | |
# @param period [Numeric] Duration of period in seconds (or equivalent, like ActiveSupport::Duration) | |
# @param burst [Numeric] Number of periods over which to average | |
def initialize( limit, period = 1, burst = 3 ) |
OlderNewer