#!/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 }