#!/usr/bin/env python
#
# Usage: getdhcp.py <password>
# 
# Example: getdhcp.py password
#
# You need to: pip install selenium

import sys
import os
import string
import logging
from time import sleep
from pyvirtualdisplay import Display
from selenium import webdriver
from selenium.webdriver.support.ui import Select, WebDriverWait
from subprocess import call

routerURL="http://192.168.10.1"

phonelist=["jka","helena"]
watchlist=["de:ad:be:ef:00:01","de:ad:be:ef:00:02"]
lastfoundlist=[0,0]
FORMAT='%(asctime)-15s  %(message)s'
logger = logging.getLogger('extension')
hdlr = logging.FileHandler('/var/log/asterisk/extension.log')
formatter = logging.Formatter(FORMAT)
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)

def updateDevice() :
  i=0
  homeusers="SIP/hem"
  for user in phonelist:
    if lastfoundlist[i]==1:
      homeusers=homeusers+"&SIP/"+user
    i=i+1
  arg="dialplan add extension s,2,Dial("+homeusers+",60,r) into incoming replace"
  logger.info(arg)
  call(["asterisk","-rx",arg])

if len(sys.argv) != 2:
  sys.exit("Syntax: getdhcp.py <password>")

logger.info("starting up")

display = Display(visible=0, size=(800, 600))
display.start()

profile = webdriver.FirefoxProfile()
profile.set_preference('webdriver_enable_native_events',False)
browser = webdriver.Firefox(profile)

#browser = webdriver.Firefox()

while True:

  # Login
  browser.get(routerURL)
  browser.find_element_by_id("old_password").send_keys(sys.argv[1])
  browser.find_element_by_class_name("button_submit_padleft").click()
  sleep(1)

  browser.get(routerURL+"/Status/Device_Info.shtml")
  sleep(1)
  elem = WebDriverWait(browser, timeout=10).until(
    lambda br: br.find_element_by_id("lan_computers_container"))
  children = elem.find_elements_by_xpath('./*')
  for child in children:
    resulttext=child.text
  arr=string.split(resulttext,'\n')
  hwfound=[]
  for row in arr[1:]:
    data=string.split(row,' ')
    hwdevice=data[len(data)-1] 
    hwfound.append(hwdevice)
  i=0;
  for wdev in watchlist:
    if wdev in hwfound:
      if lastfoundlist[i]==0:
        lastfoundlist[i]=1
        updateDevice()
    else:
      if lastfoundlist[i]==1:
        lastfoundlist[i]=0
        updateDevice()  
    i=i+1   
  sleep(60)
