Cyberoam login script in python (updated, now with notifications)

Published: by

  • Categories:

At our institute, we are forced to login into cyberoam and then only we can surf the web. The logging process is either through WEB INTERFACE or using their client provided by them.

I didnt like any of the provided methods and also "the session logs out after every 1 hr" which is very irritating. So, few months ago, I wrote a script that simulates web login by using urllib in python.

This script basically asks u for the username and password first time you run the script and then logs in automatically after the specified interval…

#!/usr/bin/python

#Author: Abhijeet Rastogi (http://www.google.com/profiles/abhijeet.1989)

cyberroamIP = "10.100.56.55" #The IP of the Cyberoam site.
cyberroamPort = "8090" #Set to "" if not using.
never_quit = True #Once started cyberthon will never, even when the cyberoam server cannot be connected.
reconnectAfter = 3500
use_notification = True


import sys
import getpass
from time import strftime
import cookielib
import urllib2
import re
import urllib, sgmllib,time,commands,os
import thread
import threading

try:
 import pynotify
 pynotify.init("Cyberoam Login Script")
except:
 print "You dont have pynotify installed, Notifications will not be shown :-( "
 use_notification = False

username = raw_input("Enter your ID: ")
username = username
passwd = getpass.getpass()

cyberroamAddress = cyberroamIP
if cyberroamPort != "":
 cyberroamAddress = cyberroamAddress+":"+cyberroamPort

#Parsing and logging in too.
import sgmllib

download_quota_remaining = 0

def netUsage():
 url = "http://"+cyberroamAddress+"/corporate/servlet/MyAccountManager"
 data = "mode=1&login_username=&secretkey=&js_autodetect_results=SMPREF_JS_OFF&just_logged_in=1&username="+username+"&password="+passwd+"&select=My+Account&soft_25.x=0&soft_25.y=0"
 cj = cookielib.CookieJar()
 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
 opener.addheaders = [('Referer','http://10.100.56.55:8090/myaccount.html')]
 usock = opener.open(url, data)
 the_page = usock.read()
 transfer_log = []
 for i in range(1,10):
	 start = the_page.find('')
	 the_page = the_page[start+53:]
	 end = the_page.find('     transfer_log.append(the_page[0:end])
 return transfer_log

def periodicNotification(threadname, show_again_after):
 while True:
  if use_notification == True:
   show_quota = pynotify.Notification("Cyberoam Script", "Remaining Download Quota: %s\nRemaining Upload Quota: %s" % (netUsage()[-1], netUsage()[-4]))
   show_quota.set_timeout(1)
   show_quota.show()
   print "Hello"
   time.sleep(show_again_after)

class MyCyberroamParser(sgmllib.SGMLParser):
 "A simple parser class."

 def parse(self, s):
  "Parse the given string 's'."
  self.feed(s)
  self.close()

 def __init__(self, verbose=0):
  "Initialise an object, passing 'verbose' to the superclass."
	 sgmllib.SGMLParser.__init__(self, verbose)
  self.required_entities = ['message','loginstatus','liverequesttime']
  self.frames_attr = []
  self.in_required_entity = False
  self.current_entity = ""
  self.entity_values = {}

 def do_frame(self, attributes):
  for name, value in attributes:
   if name == "src":
	self.frames_attr.append(value)

 def unknown_entityref(self,ref):
  self.current_entity = ref
  if ref in self.required_entities:
   self.in_required_entity=True

 def handle_data(self, data):
  "Try to get the value of entity &message. Used in 2nd pass of parsing."

  if self.in_required_entity:
   self.entity_values[self.current_entity] = data[1:] #To remove the preceeding =
   self.in_required_entity = False

 def get_src(self,index=-1):
  "Return the list of src targets."
  if index == -1:
   return self.frames_attr
  else:
   return self.frames_attr[index]

lastmsg = ""
msgChanged = True
sec2sleepOnError = 6
changeUser = True

try:
 while True: 
  try:
   # Logging in and fetching the Cyberroam login page.
   """
   if changeUser == True:
	line = cred_file.readline()
	cred = line.split(" ")
	cred[1] = cred[1][:-1]
	username = str(cred[0])+"@da-iict.org"
	passwd = str(cred[1])
	#passwd = getpass.getpass()"""
   print "Username in use: "+username 
   f = urllib.urlopen("http://"+cyberroamAddress+"/corporate/servlet/CyberoamHTTPClient","mode=191&isAccessDenied=null&url=null&message=&username="+username+"&password="+passwd+"&saveinfo=saveinfo&login=Login")
  except IOError, (errno, strerror):
   if not silent:
	print "Connection to Cyberoam server timed out. Error(%s): %s" % (errno, strerror)
	print "Retrying in %s seconds" % sec2sleepOnError
	time.sleep(sec2sleepOnError)
	continue
  s = f.read()
  # Try and process the page.
  # The class should have been defined first, remember.
  myparser = MyCyberroamParser()
  myparser.parse(s)

  # Get the the src targets. It contains the status message. And then parse it again for entity &message.
  qindex = myparser.get_src(1).index('?')
  srcstr = myparser.get_src(1)[:qindex+1]+'&'+myparser.get_src(1)[qindex+1:]

  myparser.parse(srcstr)

  message = myparser.entity_values['message']
  message = message.replace('+',' ')

  if message=="You have successfully logged in":
   try:
	thread.start_new_thread(periodicNotification,("Notification of Quota",900))
	changeUser = False
	download_quota_remaining = netUsage()[-1]
	transfer_log = netUsage()
	print "Total TRANSFER till now: "+str(transfer_log[2])
	print "Remaining Download QUOTA: "+str(transfer_log[-1])
	print "You have successfully logged in"
	if use_notification == True:
	 successful_login = pynotify.Notification("Cyberoam", "Login attempt successful \n Remaining Download QUOTA: %s" % download_quota_remaining)
	 successful_login.show()
	time.sleep(reconnectAfter)
   except KeyboardInterrupt:
	time.sleep(0.5)
	username=raw_input("Enter your ID: ")
	username = username+"@da-iict.org"
	passwd= getpass.getpass()

  if message == "The system could not log you on. Make sure your password is correct":
   print "Wrong password.. Enter again"
   passwd = getpass.getpass()
   changeUser = False

  if message == "DataTransfer limit has been exceeded":
   if use_notification == True:
	data_limit_exceeded = pynotify.Notification("Cyberoam", "DATA-TRANSFER limit for the day exceeded")
	data_limit_exceeded.show()
   print "Download Quota Exceeded"
   username=raw_input("Enter another ID: ")
   username = username+"@da-iict.org"
   passwd= getpass.getpass()
except KeyboardInterrupt:
 pass