#!/usr/bin/env python2

# Spider Trap

import sys
import base64
import random
import BaseHTTPServer

class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
  # Can change LPP as needed.  LPP should contain two numbers that indicate 
  # the range of how many links are on each page
  LPP = (5,10)  # Links Per Page ie. number of randomly generated links to put in each page
  FILE = ''
  webpages = None

  def __init__(self, *args):
    try:
      f = open(self.FILE)
      self.webpages = f.readlines()
    except IOError:
      self.webpages = None
      
    BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, *args)
  
  # generate a webpage with links to random webpages
  def generate_page(self, seed):
    html = '<html>\n<body>\n'
    
    random.seed(seed)
    # number of links to put on a page
    num_pages = random.randint(self.LPP[0], self.LPP[1])
    
    # check if a file was provided
    if self.webpages is None:
      # generate some random links
      for i in range(num_pages):
        address = str(random.randint(1, 1e9))
        address = base64.b64encode(address)
        html += '<a href="' + address + '">' + address + '</a><br>\n'
    else:
      # try getting the links from the file contents
      try:
        for i in range(num_pages):
          address = random.choice(self.webpages)
          html += '<a href="' + address + '">' + address + '</a><br>\n'
      except IndexError:
      # if the file was empty, default to randomly generated links
        print 'The file provided was empty, using randomly generated links.'
        self.webpages = None
        return self.generate_page(seed)
      
    html += '</body>\n</html>'
    
    return html
    
  # respond to any webpage request with a page generated by the generate_page function
  def do_GET(self):
    self.send_response(200)
    self.send_header('Content-type', 'text/html')
    self.end_headers()
    self.wfile.write(self.generate_page(self.path))
  

def print_usage():
  print 'Usage: ' + sys.argv[0] + ' [FILE]\n'
  print 'Must be run as root since it binds to port 80.'
  print 'FILE is file containing a list of webpages to serve, one per line.'

    
def main():
  if '-h' in sys.argv or '--help' in sys.argv:
    print_usage()
    exit()
    
  # Use a dictionary file, if provided on command line
  if len(sys.argv) == 2:
    Handler.FILE = sys.argv[1]
    
  try:
    print 'starting server...'
    server = BaseHTTPServer.HTTPServer(('', 80), Handler)
    print 'server started'
    server.serve_forever()
  except KeyboardInterrupt:
    print 'stopping server...'
    server.socket.close()
    print 'server stopped'
  except:
    print 'Error starting http server on port 80.'
    print 'Make sure you are root and port 80 is open.'
  
  
if __name__ == '__main__':
  main()