Wednesday, February 12, 2014

Node.js spawn command line in Linux

This is just a wrapper of the Node.js spawn in Linux containing Bash. A trick is to use /bin/bash for the child process and just pipe the command there.
run = (cmd, arg1, arg2) ->
  throw new Error 'The last argument needs to be a fn.' \
      if arg2? and typeof arg2 isnt 'function' or \
      !arg2? and typeof arg1 isnt 'function'

  options =
    'quiet': false

  if typeof arg1 is 'object'
    options[k] = v for k, v of arg1

  terminal = require('child_process').spawn('bash');

  stdout = ''
  terminal.stdout.on 'data', (data) ->
    stdout += data.toString()
    process.stdout.write data.toString() unless options['quiet']

  stderr = ''
  terminal.stderr.on 'data', (data) ->
    stderr += data.toString()
    process.stderr.write data.toString() unless options['quiet']

  terminal.on 'close', (code) ->
    stdout = stdout.replace(/^\s+|\s+$/g, '')
    stdout = if stdout.length > 0 then stdout.split '\n' else []
    stderr = stderr.replace(/^\s+|\s+$/g, '')
    stderr = if stderr.length > 0 then stderr.split '\n' else []

    callback = if typeof arg1 is 'function' then arg1 else arg2
    if code == 0
      callback null, stdout, stderr
    else
      callback new Error("#{cmd} exited with code #{code}."), stdout, stderr

  console.log "+ #{cmd} (#{new Date()})" unless options['quiet']
  terminal.stdin.write cmd
  terminal.stdin.end()

run 'ls -al *.coffee', (err, stdout, stderr) ->
  console.log err
  console.log stdout
  console.log stderr

Thursday, January 30, 2014

awk sub, system, and getline to variable example

This is an example of having awk with system and getline calls... This is similar what debsums -c is doing but you can actually supply a custom md5sum list...
while read line; do echo $line | awk '{ x=$1; $1=""; sub("^ ", "/", $0); z=$0; sub("^", "\"", $0); sub("$", "\"", $0); if (system("[ -f " $0 " ]") == 0) { cmd="md5sum " $0 " | cut -d\  -f1"; cmd | getline y; close(cmd); if (y != x) printf "%-73s FAILED\n", z; } else printf "%-71s NOTFOUND\n", z;}'; done < /var/lib/dpkg/info/libc-bin.md5sums

Tuesday, December 03, 2013

How to make Python raw_input ignores Ctrl-D

The way to do this is to have a while loop around raw_input, and not print the question again in the next iteration. However, because of this Python bug http://bugs.python.org/issue12833, raw_input() or raw_input('') will erase the previous printed question in stdout output with a backspace. A workaround will be needed. Then, there's also a problem with Ctrl-D after you input something... Here's the code to handle Ctrl-D and quit at Ctrl-C without the stacktrace:
import readline
import sys

sys.stdout.write("question? ")
while True:
    try:
        print raw_input(" \b")
        break
    except EOFError:
        pass
    except KeyboardInterrupt:
        break
"import readline" will handle the Ctrl-D when you got something input at the question.

Monday, July 22, 2013

Syntax error near unexpected token LIBHTPMINVERSION PKG_CHECK_MODULES in Ubuntu

When compiling suricata 1.4.1 fresh in Ubuntu, after apt-get install all the necessary dependencies, you may see this:
syntax error near unexpected token `LIBHTPMINVERSION,'
`        PKG_CHECK_MODULES(LIBHTPMINVERSION,
Well, if you google it, it's more like you need to install pkg-config. However, I have it installed. There was another post saying, maybe my pkg-config is not updated... Turns out the workaround is to modify the ACLOCAL_FLAGS described here. By default, it's
export ACLOCAL_FLAGS="-I /usr/share/aclocal"

Thursday, July 11, 2013

Monkey patch (mock) the built-in raw_input function

For testing without mock (thirdparty or 3.x), I wrote a mock context manager function for raw_input. If you do not provide enough response in the mock_raw_input argument list, the raw_input is back to normal.
import __builtin__
import sys
from contextlib import contextmanager

@contextmanager
def mock_raw_input(*input_list):
    """Monkey patch the raw_input()"""
    _raw_input = __builtin__.raw_input
    def _stub(prompt='', input_iter=iter(input_list), orig=_raw_input):
        try:
            _input = next(input_iter)
            sys.stdout.write(prompt)
            return _input
        except StopIteration:
            __builtin__.raw_input = _raw_input
            return raw_input(prompt)
    __builtin__.raw_input = _stub
    try:
        yield
    finally:
        __builtin__.raw_input = _raw_input

def main():
    with mock_raw_input('abc','cde'):
        print raw_input('abc?\n')
        print raw_input()
        print raw_input('no more expected value? ')
    raw_input('raw_input should be back to default here, right? ')

if __name__ == "__main__":
    main()

Friday, March 22, 2013

Socket.IO 0.9.x client disconnect failed when using namespace

socket.disconnect() used to be working with my server. Then I changed my server to be using namespace, and the client side disconnect no longer works. Luckily I can find this from Google.
 socket.socket.disconnect()  

Thursday, March 21, 2013

Click a button to print an embedded PDF file without the printing dialog in Internet Explorer (silent print)

I recently helped a friend implementing a button to click, and it sends a hosted pdf to the defaulted printer without the printing dialog in IE8. I googled this about a few dozen pages and finally came across http://stackoverflow.com/questions/975652/silent-print-a-embedded-pdf. So here is the test.html. And due to the ActiveX used, you have to make this page to be trusted or in intranet.
 <html>  
 <head>  
 <title>Test</title>  
 <script>  
 function printpdf(pdf_path) {  
  // remove the previous pdf <object> if existed  
  var elem = document.getElementById("pdf");  
  if (elem) {  
   elem.parentNode.removeChild(elem);  
  }  
  document.body.insertAdjacentHTML('beforeEnd', '<object id="pdf" classid="clsid:CA8A9780-280D-11CF-A24D-444553540000" width="0" height="0"><param name="src" value="' + pdf_path + '"/></object>');  
  pdf.printAll();  
  return false;  
 }  
 </script>  
 </head>  
 <body>  
 <!-- http://stackoverflow.com/questions/975652/silent-print-a-embedded-pdf -->  
 <button onclick="printpdf('sample.pdf');">Print PDF</button>  
 </body>  
 </html>  
I put it in my dropbox as well: https://dl.dropbox.com/u/48348/pdf/pdf.html (put dropbox domain into trusted sites) EDIT: Adobe Reader 8 was reported to leave a blank Adobe Reader application running whenever you click, then version 11 doesn't have this problem.

Wednesday, February 20, 2013

Python datetime timestamp conversion between timezones

Recently, I needed to deal with some datetime/timestamp conversion between timezones in Python.
from datetime import datetime, timedelta
from dateutil import tz

utc = tz.tzutc()
local = tz.tzlocal()

# http://stackoverflow.com/questions/8777753/converting-datetime-date-to-utc-timestamp-in-python/8778548#8778548
def to_timestamp(dt_in_utc, epoch=datetime(1970, 1, 1, tzinfo=utc)):
    td = dt_in_utc - epoch
    return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 1e6

# datetime to utc, if the datetime has no tzinfo, treat it as local
def to_utc(dt):
    if dt.tzinfo is None:
        dt = dt.replace(tzinfo=local)
    return dt.astimezone(utc)
    
# utc timestamp to datetime
def to_datetime(timestamp, tz=local):
    return datetime.utcfromtimestamp(timestamp).replace(tzinfo=utc).astimezone(tz)

Wednesday, December 19, 2012

Solaris x86 VM nanosecond hangs fix

For backup purpose, these two settings for vmware were found, that fixes some JUnit tests with locks. monitor_control.disable_tsc_offsetting = "TRUE" monitor_control.disable_rdtscopt_bt = "TRUE"

Thursday, August 02, 2012

Ubuntu Chrome Flash fast forward in Youtube

I found a workaround in http://ubuntuforums.org/showthread.php?t=2020021. Basically you just need to disable one of the flash plugins. To me, I found 11.2 r202 is working better for me. Remember to click Details to show these two entries: