#!/usr/bin/python3

from __future__ import print_function

import optparse
import os
import signal
import socket
import sys

ATHINFO_FALLBACK_PORT = 49155

def alarm(signum, frame):
    print('athinfo: timed out', file = sys.stderr)
    sys.exit(1)

def main():
    parser = optparse.OptionParser(
        usage='%prog [options] host query'
        )
    parser.add_option(
        '-t', '--timeout',
        type='int',
        dest='timeout',
        help='timeout after SECONDS',
        metavar='SECONDS',
        )

    (options, args) = parser.parse_args()
    if len(args) != 2:
        parser.print_usage()
        return 1
    host = args[0]
    query = args[1]

    try:
        port = socket.getservbyname('athinfo', 'tcp')
    except socket.error:
        port = ATHINFO_FALLBACK_PORT

    try:
        host_addr = socket.gethostbyname(host)
    except socket.error:
        print('athinfo: host {0} not found'.format(host), file = sys.stderr)
        return 1

    try:
        s = socket.socket()

        if options.timeout:
            signal.signal(signal.SIGALRM, alarm)
            signal.alarm(options.timeout)

        s.connect((host_addr, port))
        s.sendall(('%s\n' % query).encode())
        sys.stdout.writelines(s.makefile())
    except socket.error as e:
        print('athinfo: {0}'.format(e.args[-1]), file = sys.stderr)
        return 1
    except IOError as e:
        print('athinfo: {0}'.format(e.args[-1]), file = sys.stderr)
        return 1
    except KeyboardInterrupt:
        return 1


if __name__ == '__main__':
    sys.exit(main())
