User:GreenC/awb/cygwin/demon-lin

#!/usr/local/bin/awk -f

# Demon to pass data back and forth between Windows host and Linux guest OS under VirtualBox
# See also demon-win.awk for the version running on the Windows host.
# Purposes is to run AWB on windows, and unix scripts on Linux. 

@load "filefuncs"
@load "readfile"

BEGIN {

 # Begin configuration

  rm = "/bin/rm"                     # Path to rm 
  sleep = "/bin/sleep"               # Path to sleep

  script = "/home/script/script.bsh" # The unix script. It takes as argv[1] the title of a Wikipedia article, process it and 
                                     # deposits the updated wikisource as "article.txt" in the directory defined in next line. 
  dir = "/mnt/ramdisk/"              # Shared directory with Windows (include a trailing "/"). RAM disk recommended.
  fname = dir "name.txt"             # File containing name passed *from* AWB to unix script
  farticle = dir "article.txt"       # File containing article passed *to* AWB from unix script
  fabort = dir "abort.txt"           # File flagging abort 

 # End configuration

  removefile(farticle)               # Clear out old files 
  removefile(fabort)

  print("demon-lin.awk: Waiting for " fname " ...")

  while(1) {
    sleep(2)
    if( exists(fname) ) {
      name = strip( readfile(fname) )
      print("demon-lin.awk: New job request: " name "\n")
      removefile(fname)
      removefile(farticle)
      if(length(name) > 0) {            
        com = script " \"" name "\""                  # eg. /usr/home/script.bsh "Charles Dickens"
        print sys2var(com)                            # Run script and print any debug output
        close(com)                                    # Flush script's disk writes 
      } else {
        abort("demon-lin.awk: error retrieving name") # Pass control back to AWB with no article.txt generated
      }  
    }
  }
}

#
# Create abort.txt
#
function abort(msg,  filen) {
  if( length(msg) > 0 )
    print(msg)
  printf "0" > fabort
  close(fabort)
}            


# Delete a file
function removefile(str) {

      if( exists(str) )
        sys2var(rm " -- " str)
      if( exists(str) ) {
        print("demon-lin.awk: Unable to delete " str ", aborting.")
        exit
      }
      system("") # Flush 
}

#
# Check for file existence. Return 1 if exists, 0 otherwise.
#  Requires GNU Awk 4.1:
#     @load "filefuncs"
#
function exists(name    ,fd) {
    if ( stat(name, fd) == -1)
      return 0
    else
      return 1
}

#
# Run a system command and store result in a variable
#   eg. googlepage = sys2var("wget -q -O- http://google.com")
# Supports pipes inside command string. Stderr is sent to null.
# If command fails (errno) return null
#
function sys2var(command        ,fish, scale, ship) {

         command = command " 2>/dev/null"
         while ( (command | getline fish) > 0 ) {
             if ( ++scale == 1 )
                 ship = fish
             else
                 ship = ship "\n" fish
         }
         close(command)
         return ship
}

#
# Sleep
#
function sleep(seconds)
{
  sys2var(sleep " " seconds)
}

#
# Strip leading/trailing whitespace
#
function strip(str){
        gsub(/^[[:space:]]+|[[:space:]]+$/,"",str)
        return str
}