Skip to content

madpilot/silk

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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 © 2010,2011 Myles Eftos. See LICENSE for details.

About

A framework for creating a hosting console

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages