"""
Driver for blank dataplane VMs. Created for SDNIP test.
"""
import time
import pexpect
import struct
import fcntl
import os
import sys
import signal
import sys
import re
import json
sys.path.append( "../" )
from drivers.common.clidriver import CLI


class DPCliDriver( CLI ):

    def __init__( self ):
        super( CLI, self ).__init__()

    def connect( self, **connectargs ):
        for key in connectargs:
            vars( self )[ key ] = connectargs[ key ]

        self.name = self.options[ 'name' ]
        self.handle = super( DPCliDriver, self ).connect( user_name=self.user_name,
         		ip_address=self.ip_address,
         		port=self.port,
         		pwd=self.pwd )

        if self.handle:
            return self.handle
        else:
            main.log.info( "NO HANDLE" )
            return main.FALSE

    def create_interfaces( self, net, number, start ):
        """
        Creates a number,specified by 'number,' of subinterfaces on eth0. Ip addresses start at 'net'.'start'.1.1 with a 24 bit netmask. Addresses increment sequentially in the third quad,
        therefore all interfaces are in different subnets on the same machine. When the third quad reaches 255, it is reset to 1 and the second quad is incremented.
        Every single ip address is placed in a file in /tmp titled 'ip_table{net}.txt'
        The file is used by 'pingall_interfaces()' as a fping argument
        This method returns true if all interfaces are created without a hitch, and false if a single interface has issues
        """
        self.handle.sendline( "" )
        self.handle.expect( "\$" )

        self.handle.sendline( "rm /tmp/local_ip.txt" )
        self.handle.expect( "\$" )
        self.handle.sendline( "touch /tmp/local_ip.txt" )
        self.handle.expect( "\$" )

        main.log.info( "Creating interfaces" )
        k = 0
        intf = 0
        while number != 0:
            k = k + 1
            if k == 256:
                k = 1
                start = start + 1
            number = number - 1
            intf = intf + 1
            ip = net + "." + str( start ) + "." + str( k ) + ".1"
            self.handle.sendline(
                "sudo ifconfig eth0:" + str(
                    intf ) + " " + ip + " netmask 255.255.255.0" )

            i = self.handle.expect( [
				    "\$",
                                    "password",
                                    pexpect.TIMEOUT,
                                    pexpect.EOF ],
                		    timeout=120 )

            if i == 0:
                self.handle.sendline(
                    "echo " + str( ip ) + " >> /tmp/local_ip.txt" )
                self.handle.expect( "\$" )
            elif i == 1:
                main.log.info( "Sending sudo password" )
                self.handle.sendline( self.pwd )
                self.handle.expect( "\$" )
            else:
                main.log.error( "INTERFACES NOT CREATED" )
                return main.FALSE

    def pingall_interfaces( self, netsrc, netstrt, netdst, destlogin, destip ):
        """
        Copies the /tmp/ip_table{ net }.txt file from the machine you wish to ping, then runs fping with a source address of { netsrc }.{ netstrt }.1.1 on the copied file.
        Check every single response for reachable or unreachable. If all are reachable, function returns true. If a SINGLE host is unreachable, then the function stops and returns false
        If fping is not installed, this function will install fping then run the same command
        """
        self.handle.sendline( "" )
        self.handle.expect( "\$" )

        self.handle.sendline( "scp " + str( destlogin ) + "@" + 
			      str( destip ) + ":/tmp/local_ip.txt /tmp/ip_table" +
			      str( net ) + ".txt" )
        
	i = self.handle.expect( [
				"100%",
                                "password",
                                pexpect.TIMEOUT ],
		                timeout=30 )

        if i == 0:
            main.log.info( "Copied ping file successfully" )
        elif i == 1:
            self.handle.sendline( self.pwd )
            self.handle.expect( "100%" )
            main.log.info( "Copied ping file successfully" )
        elif i == 2:
            main.log.error( "COULD NOT COPY PING FILE FROM " + str( destip ) )
            result = main.FALSE
            return result

        self.handle.sendline( "" )
        self.handle.expect( "\$" )

        main.log.info( "Pinging interfaces on the " + str( netdst ) +
		       " network from " + str( netsrc ) + "." + 
		       str( netstrt ) + ".1.1" )
        self.handle.sendline( "sudo fping -S " + str( netsrc ) + "." +
			      str( netstrt ) + ".1.1 -f /tmp/ip_table" + 
			      str( netdst ) + ".txt" )
        while 1:
            i = self.handle.expect( [
				    "reachable",
                                    "unreachable",
                                    "\$",
                                    "password",
                                    pexpect.TIMEOUT,
                                    "not installed" ],
				    timeout=45 )
            if i == 0:
                result = main.TRUE
            elif i == 1:
                main.log.error( "An interface was unreachable" )
                result = main.FALSE
                return result
            elif i == 2:
                main.log.info( "All interfaces reachable" )
                return result
            elif i == 3:
                self.handle.sendline( self.pwd )
            elif i == 4:
                main.log.error( "Unable to fping" )
                result = main.FALSE
                return result
            elif i == 5:
                main.log.info( "fping not installed, installing fping" )
                self.handle.sendline( "sudo apt-get install fping" )
                i = self.handle.expect(
                    [ "password",
                                      "\$",
                                      pexpect.TIMEOUT ],
                    timeout=60 )
                if i == 0:
                    self.handle.sendline( self.pwd )
                    self.handle.expect( "\$", timeout=30 )
                    main.log.info( "fping installed, now pinging interfaces" )
                    self.handle.sendline(
                        "sudo fping -S " + str(
                            netsrc ) + "." + str(
                                netstrt ) + ".1.1 -f /tmp/ip_table" + str(
                                    netdst ) + ".txt" )
                elif i == 1:
                    main.log.info( "fping installed, now pinging interfaces" )
                    self.handle.sendline(
                        "sudo fping -S " + str(
                            netsrc ) + "." + str(
                                netstrt ) + ".1.1 -f /tmp/ip_table" + str(
                                    netdst ) + ".txt" )
                elif i == 2:
                    main.log.error( "Could not install fping" )
                    result = main.FALSE
                    return result

    def disconnect( self ):
        response = ''
        try:
            self.handle.sendline( "exit" )
            self.handle.expect( "closed" )
        except:
            main.log.error( "Connection failed to the host" )
            response = main.FALSE
        return response

