preload
Apr 14

Let the fun begin….

Microsoft has released the first official version of its Ruby integration with .NET called IronRuby 1.0. If you look closely to the release notes, you will see me on the list of bug reporters :) As I get more familiar with it, and feel I have something worth while to post, I’ll be blogging about it too.

You can download it from the IronRuby Download page.

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
Tagged with:
Apr 13

This is a follow-on to my Python Connectivity Check Script that I posted a while back. It functions the same way…its just written in Perl. I use both program as part of a System Connectivity Check program I wrote in Ruby to connect to many hosts, upload one of these connectivity check programs, run it and place the results into an Excel spreadsheet with a simple red/green status. When you are installing systems with hundreds of nodes that all need to talk to 30-odd other nodes, its a huge time saver!

Here’s the code: Continue reading »

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
Tagged with:
Apr 07

Every once and a while I get too fancy for my own good. :) A customer of mine has lots and lots (well…hundreds really) of Unix hosts that need updates of config files and such. There are lots of tools out there that can do what I need to do, but they all require an install on the nodes themselves. My customer does not want any extra software on these nodes, so to do any kind of automation requires me to upload the program, run it remotely, then remove it. I have a large number of tools to do all that several different ways.

Recently though, I needed to download a large file from each node while running another program on the node at the same time. Normally I would use SCP for the download part, but for reasons that would take too long to explain, that option was not open to me. So for some reason, I was struck with the ideal to just use a custom XMLRPC client/server to do the job. Turns out the code is pretty simple. My customer only has Python on these nodes, so my XMLRPC client is written in Python:

#
# xmlxfer.py
#
import xmlrpclib
import sys
import platform

port = 80    # Some port that passes through your firewall:  80, 21, 23, 25, etc.

farfname = sys.argv[1]
localfilename = sys.argv[2]
server = sys.argv[3]
#host = platform.uname()[1]
host = platform.node()
farname = host + "-" + farfname

ff = open(localfilename, "r").read()

svr = "http://" + server + ":" + port + "/RPC2"
xmlprxy = xmlrpclib.ServerProxy(svr)

print xmlprxy.xfer(farname, ff)

Continue reading »

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
Tagged with:
Apr 06

While there are plenty of places on the web that talk about Ruby Arrays and Ruby Classes, I never have found one that just explained how to use a Class as an Array. So I thought I would post one for those who might want something simple to reference :)

First, the sample code:

class Test
  @dd = Array.new
  def initialize
    @dd = loadArray()
  end

  def [](a)
    @dd[a]
  end

  def []=(a, b)
    @dd[a] = b
  end

  def list
    @dd.each do |i|
      puts i
    end
  end

  def sort
    aa = Array.new
    aa = @dd.sort
    @dd = aa
  end

  private

  def loadArray
    rr = Array.new
    rr << "one"
    rr << "two"
    rr << "three"
    rr << "four"
    return rr
  end  

end

Continue reading »

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
Tagged with:
Mar 21

In my line of work I end up trying to move a large amount of text from web pages into things like Word and Excel. Getting the Text from the Web Browser is easy…Putting the text with formatting into an Office app could be a lot of work trying to parse through all the HTML and send the equivalent formatting commands with the text. Fortunately, Word and Excel had the ability to paste from the clipboard HTML and render it with the correct formatting! …Only problem is that for some reason, no one added HTML support in the Win32::Clipboard gem?!? (At least not in the 1.8.x version of Ruby, which I use.) So I spent a few hours looking over the existing clipboard.rb file, found a VBA example of an HTML Copy, and came up with the following code: Continue reading »

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
Tagged with:
Mar 16

If you try to “compile” a Ruby script that has the Watir gem in it with OCRA, you will find that running the compiled .exe file on a computer without the Watir gem previously being installed may result in this error:

c:/ruby/lib/ruby/gems/1.8/gems/watir-1.6.2/lib/watir/ie.rb:113:in `initialize': unknown OLE server: `AutoItX3.Control' (WIN32OLERuntimeError)
    HRESULT error code:0x800401f3
      Invalid class string      from c:/ruby/lib/ruby/gems/1.8/gems/watir-1.6.2/lib/watir/ie.rb:113:in `new'
        from c:/ruby/lib/ruby/gems/1.8/gems/watir-1.6.2/lib/watir/ie.rb:113:in `autoit'
        from c:/ruby/lib/ruby/gems/1.8/gems/watir-1.6.2/lib/watir/ie-class.rb:425:in `autoit'
        from c:/ruby/lib/ruby/gems/1.8/gems/watir-1.6.2/lib/watir/ie-class.rb:422:in `set_window_state'
        from c:/ruby/lib/ruby/gems/1.8/gems/watir-1.6.2/lib/watir/ie-class.rb:398:in `maximize'
        ...

Huh? Why am I getting a WIN32OLE error? This all runs fine on my computer when I tested it! … Well, it seems that Watir uses its own version of a win32ole gem, and not the one that you already have installed. In fact, when you compile a Ruby script that has both win32ole and watir gems, you will need to comment out the “require ‘win32ole’” line in order for it to work. Anyway… as part of the win32ole gem install, it seems that it registers the AutoItX3.dll file into the registry. OCRA will, however, *NOT* copy this file over and register it for you, so you may see the error above.

So…the trick is add the AutoItX3.dll file to your OCRA compile, and to temporarily register the DLL before calling watir or win32ole commands. I simply copied the DLL from the win32ole gem directory to my Ruby script’s working directory, and then added it to my OCRA compile command:

C:\Server4\Dev\MyProg>ocra --console --icon c:/Server4/Dev/icons/exonets.ico myprog.rb AutoItX3.dll

OCRA will add the DLL to the EXE and when run will place it in the current temporary directory. After that you need to run the DLL register command to make it an OLE server, then when done, be sure to unregister it before your program completes.
Here a sample of code that I use to accomplish all this: Continue reading »

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
Tagged with:
Mar 09

My friendly oil change person taught me the trick to resetting my oil change light on my 2007 Saturn VUE:

  • 1. Turn the ignition on
  • 2. Press the gas pedal all the way down three times
  • 3. The Oil Change light and the Airbag light will alternately blink for about 15-20 seconds, then go out.
  • 4. Turn the car off.
  • When you turn the car back on, the Oil Change light will stop coming on.

    SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
    Tagged with:
    Mar 07

    While doing a quick search for Ruby code that could catch and print out the Beacon packet that Tivo machines send out on the local network, I was shocked to not find anything….tons of stuff in Perl….but nothing Ruby! Unbelievable! So I went and figured out what the code would be in Ruby. Here’s what I got:

    require 'socket'
    require 'exo/xdump'
    
    trap("INT") do
       puts "---[Ctrl-C: Exiting]---\n\n"
       Kernel.exit(0)
    end
    
    BasicSocket.do_not_reverse_lookup = true
    s = UDPSocket.new
    s.bind("0.0.0.0", 2190)
    
    loop do
       flg = IO.select([s], nil, nil, 5)
       if flg
          text, sender = s.recvfrom_nonblock(1024)
          puts "[#{Time.now}] #{sender[3]} sent beacon packet:"
          puts "[#{Time.now}]\n#{text.hexdump}"
       end
    end
    

    Nothing too fancy. The beacon is sent out as a UDP packet to port 2190. The code looks for data on the socket, then retrieves the the data and prints it out in a hex dump format like so:

    [Sun Mar 07 20:37:53 -0800 2010] 10.11.12.52 sent beacon packet:
    [Sun Mar 07 20:37:53 -0800 2010]
    000000: 7469 766f 636f 6e6e   6563 743d 310a 7377 |tivoconnect=1.sw|
    000010: 7665 7273 696f 6e3d   392e 332e 3262 2d30 |version=9.3.2b-0|
    000020: 312d 322d 3134 300a   6d65 7468 6f64 3d62 |1-2-140.method=b|
    000030: 726f 6164 6361 7374   0a69 6465 6e74 6974 |roadcast.identit|
    000040: 793d 3234 3030 3030   30Xx XxXx XxXx XxXx |y=2400000XXXXXXX|
    000050: Xx0a 6d61 6368 696e   653d XxXx XxXx XxXx |X.machine=XXXXXX|
    000060: 0a70 6c61 7466 6f72   6d3d 7463 642f 5365 |.platform=tcd/Se|
    000070: 7269 6573 320a 7365   7276 6963 6573 3d54 |ries2.services=T|
    000080: 6956 6f4d 6564 6961   5365 7276 6572 3a38 |iVoMediaServer:8|
    000090: 302f 6874 7470 0000   0000 0000 0000 0000 |0/http.         |
    

    The identity and the machine values have been changed just to be safe :)

    A big issue that a lot of folks have with UDP sockets in Ruby is trying to get a non-blocking read working correctly. The use of the IO.select above seems to be the best answer that I’ve seen…but its still not perfect. Some folks have been trying out eventmachine (See the “Non-Blocking UDP” thread over on Ruby Forum), but for this simple test, the IO.select should work just fine.

    I covered the hexdump function in a previous post.

    SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
    Tagged with:
    Mar 04

    Ever wanted to have a spell check function in your Ruby Program? As long as you have MS Word installed, you can use the Spellcheck function from your program. Here’s the code:

    require 'exo/iswindows'
    
    if not RUBY_PLATFORM.isWindows?
       puts "This program only runs under Windows!"
       exit
    end
    
    require 'win32ole'
    
    def spellcheck(scstring)
       word = WIN32OLE.new('Word.Application')
       doc = word.Documents.Add     ## Blank document
    
       word.Selection.Text = scstring
       word.Dialogs(828).Show
    
       ### return the corrected text
       if not scstring[/ /]      ## only one word with no spaces in the string
         # highlight the word first,
         word.Selection.MoveLeft( 'Unit'=>2,
                'Count'=> 1,
                'Extend'=>2)
       end
       ## multiple words end up already selected after the spell check
       # then retrieve.
       correct = word.Selection.Text
       doc.close(0)
       word.Quit
       return correct
    end
    
    if __FILE__ == $0
       puts "Corrected => #{spellcheck(ARGV[0])}"
    end
    

    The program opens a new document, pastes the text to check into the document, and then brings up the spellcheck dialog box with any words it can’t find in the dictionary and prompts you to correct the mistakes. Here’s an sample output:

    C:\Server6\Dev\Ruby>ruby spellcheck.rb "this is a test srting to seee how the slpell check is working"
    Corrected => This is a test string to see how the spell check is working
    
    C:\Server6\Dev\Ruby>ruby spellcheck.rb  antidisestablishmenttarianism
    Corrected => antidisestablishmentarianism
    

    For some reason, if you check multiple words, the dialog auto-closes after the last ‘fix’ …but if its just one word, it stays open until you click the close button. Conversely, multiple words stay selected in the Word doc after the dialog closes, but with only one word, it does not stay selected, and you have to select it back in order to read it off the page of the document.

    SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
    Tagged with:
    Feb 16

    First off, let me say that there is not an original thought in any of this code, since it has all been taken from a number of different articles out on the Internet. The Daemonizing code was taken from the Active State Code Recipes area.

    One of my customers has a number of database servers that we would like to monitor and see what the state of the clusters are. The problem is that the clustat command — that used to be run-able by everyone in a lesser version of RHEL — is now only usable by root in RHEL v5.3!. Not wanting to give out root access to everyone, we decided that a quick little custom server that provided the output of the clustat command in XML format would do the trick. Then I just wrote a Ruby program to query all the Clustat XML servers and display the results in a readable format. If there is enough interest, I can post a public version of that program.

    Here’s the code: Continue reading »

    SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
    Tagged with: