CSC/ECE 517 Summer 2008/wiki1 5 bk: Difference between revisions

From Expertiza_Wiki
Jump to navigation Jump to search
Line 13: Line 13:




<code>module Kernel</code>
<source>module Kernel
   <code>alias_method :original_system, :system</code>
   alias_method :original_system, :system
   <code>def system(*args)</code>
   def system(*args)
     puts "Your program executed the \"#{args.join(', ')}\" command."  
     puts "Your program executed the \"#{args.join(', ')}\" command."  
     puts "It was executed at: " + `date`
     puts "It was executed at: " + `date`
Line 23: Line 23:
end
end
system("ls -al")
system("ls -al")
</source>


Your program executed the "ls -al" command.
Your program executed the "ls -al" command.

Revision as of 16:37, 3 June 2008

Understanding Hooks

The hooking mechanism in Ruby allows certain functional events inside a running program to be identified while providing an action that will occur upon detection of the specified event. In this way, hooks serve as a detector of actions within the code, when event x is encountered, peform y. Examples of where such a technique would prove useful include:

  • Recording when or how many times a method is called.
  • Recording when an object is created.
  • Debugging problematic code.

Example of Hooking System Calls (citation)

The following is an example of a hook being inserted to perform a certain action when the program makes a system call. In order for this to occur, an alias must be created so that the original functionality can still be accessed. In this case, original_system is aliased to the unaltered system. Once this is done, we can freely modify the definition of system to perform just about any operation. This is similar to the way in which a nefarious hook would work by still performing the intended operation, but also appending something extra...

alias_method :original_system, :system

The following code will then proceed to print the command executed ("ls -al" in this case), the timestamp, and then finally the output of the command to standard output.


module Kernel
  alias_method :original_system, :system
  def system(*args)
    puts "Your program executed the \"#{args.join(', ')}\" command." 
    puts "It was executed at: " + `date`
    puts "The command output the following: "
    original_system(*args)
  end
end
system("ls -al")

Your program executed the "ls -al" command. It was executed at: Mon Jun 2 21:19:27 EDT 2008 The command output the following: total 20 drwxr-xr-x 2 brking brking 4096 2008-06-02 21:19 . drwxr-xr-x 18 brking brking 4096 2008-06-02 21:19 .. -rw-r--r-- 1 brking brking 134 2008-06-01 22:01 fib.rb -rw-r--r-- 1 brking brking 235 2008-06-02 20:29 hooking.rb -rw-r--r-- 1 brking brking 287 2008-06-02 21:19 moreHooking.rb

Example of a Hook 2

Understanding Aspect Oriented Programming