#!/usr/bin/env python

import sys
import os
import re
import stat
import time
import subprocess
import logging, logging.handlers
import platform
import ConfigParser
import dbus

sys.path.insert(0,"/usr/share/synce-core")
import synceconnector
from synceconnector import signal_dccm_connect, signal_dccm_disconnect, process_config, get_logger, serial_stop_device, serial_start_device, serial_get_address, serial_get_devnum

#
# main()
#
if __name__ == '__main__':

    logger = get_logger("udev-synce-serial")

    process_config()

    device_path = False

    if os.environ.has_key("ACTION"):
        action = os.environ["ACTION"]

        if os.environ.has_key("DEVPATH"):
            device_path = os.environ["DEVPATH"]
        else:
            logger.critical("Udev environment not set: DEVPATH missing")
            sys.exit(1)

        if os.environ.has_key("SUBSYSTEM"):
            subsystem = os.environ["SUBSYSTEM"]
        else:
            logger.critical("Udev environment not set: SUBSYSTEM missing")
            sys.exit(1)

        # get serial device file
        if platform.system() == "FreeBSD":
            logger.critical("do we support udev/devicekit on FreeBSD ???")
            sys.exit(1)
        else:
            try:
                device_file = os.environ["DEVNAME"]
            except Exception,e:
                logger.critical("Udev environment not set: DEVNAME missing")
                sys.exit(1)

    else:
        logger.critical("Environment not set, action is missing")
        sys.exit(1)

    devnum = serial_get_devnum(device_file)
    if devnum < 0:
        sys.exit(1)

    # see the "linkname" option in the man page for pppd
    linkname = "synce-device"+devnum

    if action == "add":
        logger.debug("running as addon for device "+device_file)

        try:
            if stat.S_ISCHR(os.stat(device_file).st_mode) == 0:
                logger.critical("unable to find a character device named "+device_file)
                sys.exit(1)
        except Exception,e:
            logger.critical("Error stat'ing device file %s: %s" % (device_file, e))
            sys.exit(1)

        local_ip, remote_ip = serial_get_address(devnum)

        if serial_start_device(device_file, local_ip, remote_ip, linkname) == False:
            logger.critical("failed to establish serial connection, aborting...")
            sys.exit(1)

        logger.debug("successfully configured interface")

        if signal_dccm_connect(device_path, remote_ip, local_ip, False) == False:
            logger.error("aborting ...")
            sys.exit(1)

    if action == "remove":
        logger.debug("running for removal of device "+device_file)
        signal_dccm_disconnect(device_path)
        if serial_stop_device(linkname) == False:
            logger.critical("failed to take down serial connection, aborting...")
            sys.exit(1)

    sys.exit(0)
