adamwiggins / rush

Ruby replacement for bash+ssh

This URL has Read+Write access

rush /
name age message
file .gitignore Thu Nov 20 18:16:26 -0800 2008 update rdoc for new readme [adamwiggins]
file README.rdoc Sat Feb 07 14:14:20 -0800 2009 credits update [adamwiggins]
file Rakefile Mon Aug 17 16:45:45 -0700 2009 remove mongrel dependency [adamwiggins]
file VERSION Tue Nov 10 17:36:54 -0800 2009 v0.6.4 [adamwiggins]
directory bin/ Thu Mar 27 15:09:15 -0700 2008 run rush with arguments to execute them instead... [adamwiggins]
directory lib/ Tue Nov 10 14:15:04 -0800 2009 fix bug with non-string env vars - convert to_s... [pedro]
file rush.gemspec Tue Nov 10 17:36:54 -0800 2009 v0.6.4 [adamwiggins]
directory spec/ Tue Nov 10 14:15:04 -0800 2009 fix bug with non-string env vars - convert to_s... [pedro]
README.rdoc

rush — manage your unix systems with pure Ruby

rush is a unix integration library and an interactive shell which uses pure Ruby syntax. Walk directory trees; create, copy, search, and destroy files; find and kill processes - everything you’d normally do with shell commands, now in the strict and elegant world of Ruby.

Usage

Count the number of classes in your project using bash:

  find myproj -name \*.rb | xargs grep '^\s*class' | wc -l

In rush, this is:

  myproj['**/*.rb'].search(/^\s*class/).lines.size

Pesky stray mongrels? In bash:

  kill `ps aux | grep mongrel_rails | grep -v grep | cut -c 10-20`

In rush:

  processes.filter(:cmdline => /mongrel_rails/).kill

As a library

  require 'rubygems'
  require 'rush'

  file = Rush['/tmp/myfile']
  file.write "hello"
  puts file.contents
  file.destroy

  puts Rush.my_process.pid
  puts Rush.processes.size
  puts Rush.bash("echo SHELL COMMAND | tr A-Z a-z")
  puts Rush.launch_dir['*.rb'].search(/Rush/).entries.inspect

Invoking the shell

Run the "rush" binary to enter the interactive shell.

Remote access and clustering

rush can control any number of remote machines from a single location. Copy files or directories between servers as seamlessly as if it was all local.

Example of remote access:

  local = Rush::Box.new('localhost')
  remote = Rush::Box.new('my.remote.server.com')
  local_dir = local['/Users/adam/myproj/']
  remote_dir = remote['/home/myproj/app/']

  local_dir.copy_to remote_dir
  remote_dir['**/.svn/'].each { |d| d.destroy }

Clustering:

  local_dir = Rush::Box.new('localhost')['/Users/adam/server_logs/'].create
  servers = %w(www1 www2 www3).map { |n| Rush::Box.new(n) }
  servers.each { |s| s['/var/log/nginx/access.log'].copy_to local_dir["#{s.host}_access.log"] }

Reference

For more details on syntax and commands, see:

  • Rush
  • Rush::Entry
  • Rush::File
  • Rush::Dir
  • Rush::Commands
  • Rush::Box
  • Rush::Process

Meta

Created by Adam Wiggins

Patches contributed by Chihiro Ito, Gabriel Ware, Michael Schutte, Ricardo Chimal Jr., and Nicholas Schlueter, Pedro Belo, and Martin Kuehl

Logo by James Lindenbaum

Released under the MIT License: www.opensource.org/licenses/mit-license.php

rush.heroku.com

groups.google.com/group/ruby-shell