2

I'm trying to make a little pinging tool with Scapy and PyQt4. The code is fairly simple and all it does now is pinging an address the user can type in.

from PyQt4 import QtGui
import sys
from scapy.all import *
from scapy.sendrecv import sr, send

def q2s(qstr): return "%s" %qstr

class Application(QtGui.QMainWindow):

    def __init__(self):
        super(Application, self).__init__()
        self.resize(1000,500)
        self.centre()

        self.initGui()
        self.show()

    def initGui(self):

        self.ipAddress = QtGui.QLineEdit("1.1.1.1",self)

        self.label = QtGui.QLabel("...")
        self.label.move(50,100)
        pingBtn = QtGui.QPushButton("Ping!", self)
        pingBtn.move(50,50)

        pingBtn.clicked.connect(self.ping)

    def ping(self):
        ip = q2s(self.ipAddress.text())

        ans, unans = sr(IP(dst=ip)/ICMP(), timeout=1, verbose=0)
        if ans:
            self.label.setText("Host is up")
        else:
            self.label.setText("Host is down")

    def centre(self):
        screen = QtGui.QDesktopWidget().screenGeometry()
        sizeNow = self.geometry()
        self.move((screen.width() - sizeNow.width()) / 2, 
                  (screen.height() - sizeNow.height()) / 2)

def run():
    app = QtGui.QApplication(sys.argv)
    GUI = Application()
    sys.exit(app.exec_())

run()

However, when trying to ping an IP address an error is printed to the console.

Traceback (most recent call last):
  File "Application.py", line 71, in ping
    ans, unans = sr(IP(dst=ip)/ICMP(), timeout=1, verbose=0)
  File "/usr/lib/python2.7/dist-packages/scapy/sendrecv.py", line 317, in sr
    a,b=sndrcv(s,x,*args,**kargs)
  File "/usr/lib/python2.7/dist-packages/scapy/sendrecv.py", line 129, in sndrcv
    inp, out, err = select(inmask,[],[], remaintime)
select.error: (4, 'Unterbrechung w\xc3\xa4hrend des Betriebssystemaufrufs')

The last line means something like "Interruption during call of operating system".

I can not see what might be wrong about the program.

Using the send function instead of the sr function works somehow. So I think the problem might be that the application is waiting for a response. But I still don't know how to fix the error.

vicco
  • 1,049
  • 2
  • 14
  • 33

1 Answers1

1

It's a bug in Scapy: an exception we want to catch when calling select() is different when in multi-thread environment.

A pull-request (#417) is currently examined (I'll update this answer when it has been merged), so you can check if the patch fixes this issue for you (I hope so!).

Pierre
  • 6,047
  • 1
  • 30
  • 49