#!/usr/bin/env python
"""
Created on 26-Oct-2012

author:: Anil Kumar ( anilkumar.s@paxterrasolutions.com )


    TestON is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    ( at your option ) any later version.

    TestON is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with TestON.  If not, see <http://www.gnu.org/licenses/>.


MininetCliDriver is the basic driver which will handle the Mininet functions
"""
import traceback
import pexpect
import re
import sys
sys.path.append( "../" )
from drivers.common.cli.emulatordriver import Emulator


class RemoteMininetDriver( Emulator ):

    """
    RemoteMininetCliDriver is the basic driver which will handle the Mininet
    functions. The main different between this and the MininetCliDriver is that
    this one does not build the mininet. It assumes that there is already a
    mininet running on the target.
    """
    def __init__( self ):
        super( Emulator, self ).__init__()
        self.handle = self
        self.wrapped = sys.modules[ __name__ ]
        self.flag = 0

    def connect( self, **connectargs ):
        """,userName, ipAddress, pwd,options ):
         Here the main is the TestON instance after creating all the log
         handles."""
        for key in connectargs:
            vars( self )[ key ] = connectargs[ key ]

        self.name = self.options[ 'name' ]
        self.handle = super(
            RemoteMininetDriver,
            self ).connect(
            userName=self.userName,
            ipAddress=self.ipAddress,
            port=None,
            pwd=self.pwd )

        self.sshHandle = self.handle

        # Copying the readme file to process the
        if self.handle:
            return main.TRUE

        else:
            main.log.error(
                "Connection failed to the host " +
                self.userName +
                "@" +
                self.ipAddress )
            main.log.error( "Failed to connect to the Mininet" )
            return main.FALSE

    def checkForLoss( self, pingList ):
        """
        Returns main.FALSE for 0% packet loss and
        Returns main.ERROR if "found multiple mininet" is found and
        Returns main.TRUE else
        """
        self.handle.sendline( "" )
        self.handle.expect( "\$" )
        self.handle.sendline( "" )
        self.handle.expect( "\$" )
        self.handle.sendline( "cat " + pingList )
        self.handle.expect( pingList )
        self.handle.expect( "\$" )
        outputs = self.handle.before + self.handle.after
        if re.search( " 0% packet loss", outputs ):
            return main.FALSE
        elif re.search( "found multiple mininet", outputs ):
            return main.ERROR
        else:
            main.log.error( "Error, unexpected output in the ping file" )
            main.log.warn( outputs )
            return main.TRUE

    def pingLong( self, **pingParams ):
        """
        Starts a continuous ping on the mininet host outputing
        to a file in the /tmp dir.
        """
        self.handle.sendline( "" )
        self.handle.expect( "\$" )
        args = utilities.parse_args(
            [ "SRC", "TARGET", "PINGTIME" ], **pingParams )
        precmd = "sudo rm /tmp/ping." + args[ "SRC" ]
        self.execute( cmd=precmd, prompt="(.*)", timeout=10 )
        command = "sudo mininet/util/m " + args[ "SRC" ] + " ping " +\
                args[ "TARGET" ] + " -i .2 -w " + str( args[ 'PINGTIME' ] ) +\
                " -D > /tmp/ping." + args[ "SRC" ] + " &"
        main.log.info( command )
        self.execute( cmd=command, prompt="(.*)", timeout=10 )
        self.handle.sendline( "" )
        self.handle.expect( "\$" )
        return main.TRUE

    def pingstatus( self, **pingParams ):
        """
        Tails the respective ping output file and check that
        there is a moving "64 bytes"
        """
        self.handle.sendline( "" )
        self.handle.expect( "\$" )
        args = utilities.parse_args( [ "SRC" ], **pingParams )
        self.handle.sendline( "tail /tmp/ping." + args[ "SRC" ] )
        self.handle.expect( "tail" )
        self.handle.expect( "\$" )
        result = self.handle.before + self.handle.after
        self.handle.sendline( "" )
        self.handle.expect( "\$" )
        if re.search( 'Unreachable', result ):
            main.log.info( "Unreachable found in ping logs..." )
            return main.FALSE
        elif re.search( '64\sbytes', result ):
            main.log.info( "Pings look good" )
            return main.TRUE
        else:
            main.log.info( "No, or faulty ping data..." )
            return main.FALSE

    def pingKill( self, testONUser, testONIP ):
        """
        Kills all continuous ping processes.
        Then copies all the ping files to the TestStation.
        """
        self.handle.sendline( "" )
        self.handle.expect( "\$" )
        command = "sudo kill -SIGINT `pgrep ping`"
        main.log.info( command )
        self.execute( cmd=command, prompt="(.*)", timeout=10 )

        main.log.info( "Transferring ping files to TestStation" )
        command = "scp /tmp/ping.* " + \
            str( testONUser ) + "@" + str( testONIP ) + ":/tmp/"
        self.execute( cmd=command, prompt="100%", timeout=20 )
        # Make sure the output is cleared
        self.handle.sendline( "" )
        self.handle.expect( "\$" )
        self.handle.sendline( "" )
        self.handle.expect( "\$" )
        self.handle.sendline( "" )
        i = self.handle.expect( [ "password", "\$" ] )
        if i == 0:
            main.log.error( "Error, sudo asking for password" )
            main.log.error( self.handle.before )
            return main.FALSE
        else:
            return main.TRUE

    def pingLongKill( self ):
        self.handle.sendline( "" )
        self.handle.expect( "\$" )
        command = "sudo kill -SIGING `pgrep ping`"
        main.log.info( command )
        self.execute( cmd=command, prompt="(.*)", timeout=10 )
        self.handle.sendline( "" )
        self.handle.expect( "\$" )
        return main.TRUE

    def pingHostOptical( self, **pingParams ):
        """
        This function is only for Packey Optical related ping
        Use the next pingHost() function for all normal scenarios )
        Ping from one mininet host to another
        Currently the only supported Params: SRC and TARGET
        """
        args = utilities.parse_args( [ "SRC", "TARGET" ], **pingParams )
        command = args[ "SRC" ] + " ping " + \
            args[ "TARGET" ] + " -c 1 -i 1 -W 8"
        try:
            main.log.warn( "Sending: " + command )
            self.handle.sendline( command )
            i = self.handle.expect( [ command, pexpect.TIMEOUT ] )
            if i == 1:
                main.log.error(
                    self.name +
                    ": timeout when waiting for response from mininet" )
                main.log.error( "response: " + str( self.handle.before ) )
            i = self.handle.expect( [ "mininet>", pexpect.TIMEOUT ] )
            if i == 1:
                main.log.error(
                    self.name +
                    ": timeout when waiting for response from mininet" )
                main.log.error( "response: " + str( self.handle.before ) )
            response = self.handle.before
        except pexpect.EOF:
            main.log.error( self.name + ": EOF exception found" )
            main.log.error( self.name + ":     " + self.handle.before )
            main.cleanup()
            main.exit()
        main.log.info( self.name + ": Ping Response: " + response )
        if re.search( ',\s0\%\spacket\sloss', response ):
            main.log.info( self.name + ": no packets lost, host is reachable" )
            main.lastResult = main.TRUE
            return main.TRUE
        else:
            main.log.error(
                self.name +
                ": PACKET LOST, HOST IS NOT REACHABLE" )
            main.lastResult = main.FALSE
            return main.FALSE

    def pingHost( self, **pingParams ):
        """
        Pings between two hosts on remote mininet
        """
        self.handle.sendline( "" )
        self.handle.expect( "\$" )
        args = utilities.parse_args( [ "SRC", "TARGET" ], **pingParams )
        command = "mininet/util/m " + \
            args[ "SRC" ] + " ping " + args[ "TARGET" ] + " -c 4 -W 1 -i .2"
        main.log.info( command )
        response = self.execute( cmd=command, prompt="rtt", timeout=10 )
        if utilities.assert_matches(
                expect=',\s0\%\spacket\sloss',
                actual=response,
                onpass="No Packet loss",
                onfail="Host is not reachable" ):
            main.log.info( "NO PACKET LOSS, HOST IS REACHABLE" )
            main.lastResult = main.TRUE
            return main.TRUE
        else:
            main.log.error( "PACKET LOST, HOST IS NOT REACHABLE" )
            main.lastResult = main.FALSE
            return main.FALSE

    def checknum( self, num ):
        """
        Verifies the correct number of switches are running
        """
        if self.handle:
            self.handle.sendline( "" )
            self.handle.expect( "\$" )
            self.handle.sendline( 'ifconfig -a | grep "sw.. " | wc -l' )
            self.handle.expect( "wc" )
            self.handle.expect( "\$" )
            response = self.handle.before
            self.handle.sendline(
                'ps -ef | grep "bash -ms mininet:sw" | grep -v color | wc -l' )
            self.handle.expect( "color" )
            self.handle.expect( "\$" )
            response2 = self.handle.before

            if re.search( num, response ):
                if re.search( num, response2 ):
                    return main.TRUE
                else:
                    return main.FALSE
            else:
                return main.FALSE
        else:
            main.log.error( "Connection failed to the host" )

    def startTcpdump(
            self,
            filename,
            intf="eth0",
            port="port 6633",
            user="admin" ):
        """
        Runs tpdump on an intferface and saves the file
        intf can be specified, or the default eth0 is used
        """
        try:
            self.handle.sendline( "" )
            self.handle.sendline(
                "sudo tcpdump -n -i " +
                intf +
                " " +
                port +
                " -w " +
                filename.strip() +
                " -Z " +
                user +
                "  &" )
            self.handle.sendline( "" )
            self.handle.sendline( "" )
            i = self.handle.expect( [ 'No\ssuch\device', 'listening\son',
                                    pexpect.TIMEOUT, "\$" ], timeout=10 )
            main.log.warn( self.handle.before + self.handle.after )
            if i == 0:
                main.log.error( self.name + ": tcpdump - No such device exists.\
                        tcpdump attempted on: " + intf )
                return main.FALSE
            elif i == 1:
                main.log.info( self.name + ": tcpdump started on " + intf )
                return main.TRUE
            elif i == 2:
                main.log.error( self.name + ": tcpdump command timed out!\
                        Check interface name, given interface was: " + intf )
                return main.FALSE
            elif i == 3:
                main.log.info( self.name + ": " + self.handle.before )
                return main.TRUE
            else:
                main.log.error( self.name + ": tcpdump - unexpected response" )
            return main.FALSE
        except pexpect.EOF:
            main.log.error( self.name + ": EOF exception found" )
            main.log.error( self.name + ":     " + self.handle.before )
            main.cleanup()
            main.exit()
        except:
            main.log.info(
                    self.name + ":" * 60 )
            main.log.error( traceback.printExc() )
            main.log.info( ":" * 80 )
            main.cleanup()
            main.exit()

    def stopTcpdump( self ):
        "pkills tcpdump"
        try:
            self.handle.sendline( "sudo pkill tcpdump" )
            self.handle.sendline( "" )
            self.handle.sendline( "" )
            self.handle.expect( "\$" )
        except pexpect.EOF:
            main.log.error( self.name + ": EOF exception found" )
            main.log.error( self.name + ":     " + self.handle.before )
            main.cleanup()
            main.exit()
        except:
            main.log.info(
                    self.name + ":" * 60 )
            main.log.error( traceback.printExc() )
            main.log.info( ":" * 80 )
            main.cleanup()
            main.exit()

    def runOpticalMnScript( self ):
        """
            This function is only meant for Packet Optical.
            It runs the python script "optical.py" to create the
            packet layer( mn )  topology
        """
        try:
            self.handle.sendline( "" )
            self.handle.expect( "\$" )
            self.handle.sendline( "cd ~" )
            self.handle.expect( "\$" )
            self.handle.sendline( "sudo python optical.py" )
            self.handle.expect( ">" )
            return main.TRUE
        except pexpect.EOF:
            main.log.error( self.name + ": EOF exception found" )
            main.log.error( self.name + ":     " + self.handle.before )
            return main.FALSE

    def disconnect( self ):
        """
        Called at the end of the test to disconnect the handle.
        """
        response = ''
        # print "Disconnecting Mininet"
        if self.handle:
            self.handle.sendline( "exit" )
            self.handle.expect( "exit" )
            self.handle.expect( "(.*)" )
            response = self.handle.before

        else:
            main.log.error( "Connection failed to the host" )
            response = main.FALSE
        return response

    def getFlowTable( self, protoVersion, sw ):
        """
         TODO document usage
         TODO add option to look at cookies. ignoreing them for now

         print "get_flowTable(" + str( protoVersion ) +" " + str( sw ) +")"
         NOTE: Use format to force consistent flow table output across
         versions"""
        self.handle.sendline( "cd" )
        self.handle.expect( [ "\$", pexpect.EOF, pexpect.TIMEOUT ] )
        if protoVersion == 1.0:
            command = "sudo ovs-ofctl dump-flows " + sw + \
                " -F OpenFlow10-table_id | awk '{OFS=\",\" ; print $1  $3  $6 \
                $7  $8}' | cut -d ',' -f 2- | sort -n -k1 -r"
            self.handle.sendline( command )
            self.handle.expect( [ "k1 -r", pexpect.EOF, pexpect.TIMEOUT ] )
            self.handle.expect(
                [ "OFPST_FLOW", pexpect.EOF, pexpect.TIMEOUT ] )
            response = self.handle.before
            # print "response=", response
            return response
        elif protoVersion == 1.3:
            command = "sudo ovs-ofctl dump-flows " + sw + \
                " -O OpenFlow13  | awk '{OFS=\",\" ; print $1  $3  $6  $7}'\
                | cut -d ',' -f 2- | sort -n -k1 -r"
            self.handle.sendline( command )
            self.handle.expect( [ "k1 -r", pexpect.EOF, pexpect.TIMEOUT ] )
            self.handle.expect(
                [ "OFPST_FLOW", pexpect.EOF, pexpect.TIMEOUT ] )
            response = self.handle.before
            # print "response=", response
            return response
        else:
            main.log.error(
                "Unknown  protoVersion in get_flowTable(). given: (" +
                str(
                    type( protoVersion ) ) +
                ") '" +
                str( protoVersion ) +
                "'" )

    def flowComp( self, flow1, flow2 ):
        if flow1 == flow2:
            return main.TRUE
        else:
            main.log.info( "Flow tables do not match, printing tables:" )
            main.log.info( "Flow Table 1:" )
            main.log.info( flow1 )
            main.log.info( "Flow Table 2:" )
            main.log.info( flow2 )
            return main.FALSE

    def setIpTablesOUTPUT( self, dstIp, dstPort, action='add',
                           packetType='tcp', rule='DROP' ):
        """
        Description:
            add or remove iptables rule to DROP ( default )
            packets from specific IP and PORT
        Usage:
        * specify action ( 'add' or 'remove' )
          when removing, pass in the same argument as you would add. It will
          delete that specific rule.
        * specify the destination ip to block with dstIp
        * specify destination port to block to dstPort
        * optional packet type to block ( default tcp )
        * optional iptables rule ( default DROP )
        WARNING:
        * This function uses root privilege iptables command which may result
        in unwanted network errors. USE WITH CAUTION
        """
        import re
        import time

        # NOTE*********
        #   The strict checking methods of this driver function is intentional
        #   to discourage any misuse or error of iptables, which can cause
        #   severe network errors
        # *************

        # NOTE: Sleep needed to give some time
        # for rule to be added and registered
        #      to the instance
        time.sleep( 5 )

        actionType = action.lower()
        if actionType != 'add' and actionType != 'remove':
            main.log.error(
                "Invalid action type. 'add' or 'remove' table rule" )
            if rule != 'DROP' and rule != 'ACCEPT' and rule != 'LOG':
                # NOTE: Currently only supports rules DROP, ACCEPT, and LOG
                main.log.error(
                    "Invalid rule. 'DROP' or 'ACCEPT' or 'LOG' only." )
                return
            return
        else:

            # If there is no existing rule in the iptables, we will see an
            # 'iptables:'... message. We expect to see this message.
            # Otherwise, if there IS an existing rule, we will get the prompt
            # back, hence why we expect $ for remove type. We want to remove
            # an already existing rule

            if actionType == 'add':
                # NOTE: "iptables:" expect is a result of
                # return from the command
                # iptables -C ...
                # Any changes by the iptables command return string
                # will result in failure of the function. ( deemed unlikely
                # at the time of writing this function )
                # Check for existing rules on current input
                self.handle.sendline( "" )
                self.handle.expect( "\$" )
                self.handle.sendline(
                    "sudo iptables -C OUTPUT -p " +
                    str( packetType ) +
                    " -d " +
                    str( dstIp ) +
                    " --dport " +
                    str( dstPort ) +
                    " -j " +
                    str( rule ) )
                i = self.handle.expect( [ "iptables:", "\$" ] )
                print i
                print self.handle.before
                print "after: "
                print self.handle.after

            elif actionType == 'remove':
                # Check for existing rules on current input
                self.handle.sendline( "" )
                self.handle.expect( "\$" )
                self.handle.sendline(
                    "sudo iptables -C OUTPUT -p " +
                    str( packetType ) +
                    " -d " +
                    str( dstIp ) +
                    " --dport " +
                    str( dstPort ) +
                    " -j " +
                    str( rule ) )
                self.handle.expect( "\$" )
            print "before: "
            print self.handle.before
            actualString = self.handle.after
            expectString = "iptables:"
            print "Actual String:"
            print actualString

            if re.search( expectString, actualString ):
                matchResult = main.TRUE
            else:
                matchResult = main.FALSE
            # If matchResult is main.TRUE, it means there is no matching rule.

            # If tables does not exist and expected prompt is returned,
            # go ahead and add iptables rule
            if matchResult == main.TRUE:
                # Ensure action type is add
                if actionType == 'add':
                    # -A is the 'append' action of iptables
                    actionAdd = '-A'
                    try:
                        self.handle.sendline( "" )
                        self.handle.sendline(
                            "sudo iptables " +
                            actionAdd +
                            " OUTPUT -p " +
                            str( packetType ) +
                            " -d " +
                            str( dstIp ) +
                            " --dport " +
                            str( dstPort ) +
                            " -j " +
                            str( rule ) )

                        infoString = "Rules added to " + str( self.name )
                        infoString += "iptable rule added to block IP: " + \
                            str( dstIp )
                        infoString += "Port: " + \
                            str( dstPort ) + " Rule: " + str( rule )

                        main.log.info( infoString )

                        self.handle.expect(
                            [ "\$", pexpect.EOF, pexpect.TIMEOUT ] )
                    except pexpect.TIMEOUT:
                        main.log.error(
                            self.name +
                            ": Timeout exception in setIpTables function" )
                    except:
                        main.log.error( traceback.printExc() )
                        main.cleanup()
                        main.exit()
                else:
                    main.log.error(
                        "Given rule already exists, but attempted to add it" )
            # If matchResult is 0, it means there IS a matching rule provided
            elif matchResult == main.FALSE:
                # Ensure action type is remove
                if actionType == 'remove':
                    # -D is the 'delete' rule of iptables
                    actionRemove = '-D'
                    try:
                        self.handle.sendline( "" )
                        # Delete a specific rule specified into the function
                        self.handle.sendline(
                            "sudo iptables " +
                            actionRemove +
                            " OUTPUT -p " +
                            str( packetType ) +
                            " -d " +
                            str( dstIp ) +
                            " --dport " +
                            str( dstPort ) +
                            " -j " +
                            str( rule ) )

                        infoString = "Rules removed from " + str( self.name )
                        infoString += " iptables rule removed \
                                      from blocking IP: " + \
                                      str( dstIp )
                        infoString += " Port: " + \
                            str( dstPort ) + " Rule: " + str( rule )

                        main.log.info( infoString )

                        self.handle.expect(
                            [ "\$", pexpect.EOF, pexpect.TIMEOUT ] )
                    except pexpect.TIMEOUT:
                        main.log.error(
                            self.name +
                            ": Timeout exception in setIpTables function" )
                    except:
                        main.log.error( traceback.printExc() )
                        main.cleanup()
                        main.exit()
                else:
                    main.log.error(
                        "Given rule does not exist,\
                                but attempted to remove it" )
            else:
                # NOTE: If a bad usage of this function occurs, exit the entire
                # test
                main.log.error( "Bad rule given for iptables. Exiting..." )
                main.cleanup()
                main.exit()


if __name__ != "__main__":
    import sys
    sys.modules[ __name__ ] = RemoteMininetDriver()
