A framework for creating a hosting console
Ruby
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
bin
lib
test
.document
.gitignore
Gemfile
Gemfile.lock
LICENSE
README.rdoc
Rakefile
VERSION
install.rb
silk.gemspec

README.rdoc

silk

Silk is a a flexible framework for building web hosting consoles. It's based around a rake task runner that has a HTTP/JSON interface. It allows you to build rake tasks to do things like add users, create email addresses etc. Then you simply wrap the response in a JSON envelope, and you can then build your own custom web hosting console.

This gem is just the runner, that need to be installed on all client servers.

Installation

(Requires Gemcutter)

gem install silk

Create /etc/silk and drop *.rake files in /etc/silk (or $HOME/.silk/) and they will automatically be read in.

Usage

The gem should install an executable called silk run

silk -h

for full argument descriptions.

The system automatically converts the rest URL (only GETs at the moment) into a rake task name - if the name doesn't exist, you'll get a 404. Any query params get passed into the task

So http://localhost:8888/users/get?login=myles (Returns Plain text)
So http://localhost:8888/users/get.json?login=myles (Returns JSON)
So http://localhost:8888/users/get.xml?login=myles (Returns XML)

would run the users:get task. do something like this in the rake task:

require 'json'

namespace :users do
  task :get do |t, args|
    # args[:login] will be populated with myles
    if args[:login]
      respond_to do |format|
        format.text { "Success" }
        format.xml { "<body>Success</body>" }
        format.json { "Success".to_json }
      end
    else
      error_respond_to do |format|
        format.text { "Fail" }
        format.xml { "<error>Fail</error>" }
        format.json { "Fail".to_json }
      end
      exit(-1)
    end
  end
end

NOTE: The idea is you write your own rake task to do stuff, and then interface them how you want. The project doesn't care what data you transfer and represent, although it would be possible to share rakefiles and interfaces for common tasks.

By default it runs on port 8888 and will probably need to be run as root to make sure you can do all the stuff you need to do.

Eventually it'll support SSL certificates etc, but until then, I suggest you either use SSH tunnels, and/or (at the very least) lock down via a firewall.

Racking it up

You can run Silk as a Rack app, which will allow you to run Silk in Passenger, or other Rack-compatible servers.

First, create a Gemfile

gem 'silk', :version => '>= 0.6'

then run

bundle install

At the moment, you have to create an empty Rakefile

touch Rakefile

Here is a sample config.ru file

require 'rubygems'
require 'bundler'
Bundler.require

Silk.options = { :recipe_paths => [ File.join(File.dirname(__FILE__), 'recipes') ] }
run Silk::Application

Then to test you can run rackup

rackup ./config.ru

Put your .rake files in the recipes directory, and you can hit the rackup test server on port 9292

Testing your recipes

There are two ways to test your recipes - you can chose to just run them on the command line, using the -t switch

silk -t --param user=joe --param email=joe@blogs.com --format json

or via unit tests.

require 'silk'

class TestDSL < Test::Unit::TestCase
  results = Runner.execute('task:name', { 'user' => 'joe', 'email' => 'joe@blogs.com' })
end

the results hash will have three elements: stdout, stderr and a process result object

results[:stdout]
results[:stderr]
results[:status]

To get the exit status of the task:

status = results[:status].exitstatus

Testing Silk

There is a test suite. It uses shoulda + mocha + test::rack

If you are going to submit patches, please try to make sure the tests pass, and that you have created a test covering the changes you have made

Note on Patches/Pull Requests

  • Fork the project.

  • Make your feature addition or bug fix.

  • Add tests for it. This is important so I don't break it in a future version unintentionally.

  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but

    bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.

Copyright

Copyright © 2010,2011 Myles Eftos. See LICENSE for details.