Squid url redirector

Hex Artifact Content
anonymous

Hex Artifact Content

Artifact b468bd500fb60d17ceeb1e46ae73ff71705ba77eb1bb32f1bcf97df91fe2741b:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70  #!/usr/bin/env p
0010: 79 74 68 6f 6e 2d 73 68 61 72 65 64 0a 0a 69 6d  ython-shared..im
0020: 70 6f 72 74 20 63 50 69 63 6b 6c 65 2c 70 73 79  port cPickle,psy
0030: 63 6f 70 67 32 2c 72 65 2c 73 79 73 2c 74 68 72  copg2,re,sys,thr
0040: 65 61 64 0a 0a 63 6c 61 73 73 20 4c 6f 67 67 65  ead..class Logge
0050: 72 28 6f 62 6a 65 63 74 29 3a 0a 09 5f 5f 73 6c  r(object):..__sl
0060: 6f 74 73 5f 5f 3d 66 72 6f 7a 65 6e 73 65 74 28  ots__=frozenset(
0070: 5b 27 5f 73 69 6c 65 6e 74 27 2c 27 5f 73 79 73  ['_silent','_sys
0080: 6c 6f 67 27 5d 29 0a 09 64 65 66 20 5f 5f 69 6e  log'])..def __in
0090: 69 74 5f 5f 28 74 68 69 73 2c 73 69 6c 65 6e 74  it__(this,silent
00a0: 3d 54 72 75 65 29 3a 0a 09 09 69 66 20 73 69 6c  =True):...if sil
00b0: 65 6e 74 3a 0a 09 09 09 74 68 69 73 2e 5f 73 69  ent:....this._si
00c0: 6c 65 6e 74 3d 54 72 75 65 0a 09 09 65 6c 73 65  lent=True...else
00d0: 3a 0a 09 09 09 69 6d 70 6f 72 74 20 73 79 73 6c  :....import sysl
00e0: 6f 67 0a 09 09 09 74 68 69 73 2e 5f 73 79 73 6c  og....this._sysl
00f0: 6f 67 3d 73 79 73 6c 6f 67 0a 09 09 09 74 68 69  og=syslog....thi
0100: 73 2e 5f 73 79 73 6c 6f 67 2e 6f 70 65 6e 6c 6f  s._syslog.openlo
0110: 67 28 27 73 71 75 69 64 54 61 67 27 29 0a 09 09  g('squidTag')...
0120: 09 74 68 69 73 2e 5f 73 69 6c 65 6e 74 3d 46 61  .this._silent=Fa
0130: 6c 73 65 0a 09 64 65 66 20 69 6e 66 6f 28 74 68  lse..def info(th
0140: 69 73 2c 6d 65 73 73 61 67 65 29 3a 0a 09 09 69  is,message):...i
0150: 66 20 6e 6f 74 20 74 68 69 73 2e 5f 73 69 6c 65  f not this._sile
0160: 6e 74 3a 0a 09 09 09 74 68 69 73 2e 5f 73 79 73  nt:....this._sys
0170: 6c 6f 67 2e 73 79 73 6c 6f 67 28 74 68 69 73 2e  log.syslog(this.
0180: 5f 73 79 73 6c 6f 67 2e 4c 4f 47 5f 49 4e 46 4f  _syslog.LOG_INFO
0190: 2c 6d 65 73 73 61 67 65 29 0a 09 64 65 66 20 6e  ,message)..def n
01a0: 6f 74 69 63 65 28 74 68 69 73 2c 6d 65 73 73 61  otice(this,messa
01b0: 67 65 29 3a 0a 09 09 69 66 20 6e 6f 74 20 74 68  ge):...if not th
01c0: 69 73 2e 5f 73 69 6c 65 6e 74 3a 0a 09 09 09 74  is._silent:....t
01d0: 68 69 73 2e 5f 73 79 73 6c 6f 67 2e 73 79 73 6c  his._syslog.sysl
01e0: 6f 67 28 74 68 69 73 2e 5f 73 79 73 6c 6f 67 2e  og(this._syslog.
01f0: 4c 4f 47 5f 4e 4f 54 49 43 45 2c 6d 65 73 73 61  LOG_NOTICE,messa
0200: 67 65 29 0a 0a 63 6c 61 73 73 20 74 61 67 44 42  ge)..class tagDB
0210: 28 6f 62 6a 65 63 74 29 3a 0a 09 5f 5f 73 6c 6f  (object):..__slo
0220: 74 73 5f 5f 3d 66 72 6f 7a 65 6e 73 65 74 28 5b  ts__=frozenset([
0230: 27 5f 70 72 65 70 61 72 65 64 27 2c 27 5f 63 75  '_prepared','_cu
0240: 72 73 6f 72 27 5d 29 0a 09 64 65 66 20 5f 5f 69  rsor'])..def __i
0250: 6e 69 74 5f 5f 28 74 68 69 73 29 3a 0a 09 09 74  nit__(this):...t
0260: 68 69 73 2e 5f 70 72 65 70 61 72 65 64 3d 73 65  his._prepared=se
0270: 74 28 29 0a 09 09 74 68 69 73 2e 5f 63 75 72 73  t()...this._curs
0280: 6f 72 3d 46 61 6c 73 65 0a 09 64 65 66 20 5f 63  or=False..def _c
0290: 75 72 73 28 74 68 69 73 29 3a 0a 09 09 69 66 20  urs(this):...if 
02a0: 6e 6f 74 20 74 68 69 73 2e 5f 63 75 72 73 6f 72  not this._cursor
02b0: 3a 0a 09 09 09 74 68 69 73 2e 5f 63 75 72 73 6f  :....this._curso
02c0: 72 3d 70 73 79 63 6f 70 67 32 2e 63 6f 6e 6e 65  r=psycopg2.conne
02d0: 63 74 28 27 68 6f 73 74 3d 25 73 20 64 62 6e 61  ct('host=%s dbna
02e0: 6d 65 3d 25 73 20 75 73 65 72 3d 25 73 20 70 61  me=%s user=%s pa
02f0: 73 73 77 6f 72 64 3d 25 73 27 25 28 27 70 6b 75  ssword=%s'%('pku
0300: 6e 6b 27 2c 27 73 71 75 69 64 54 61 67 27 2c 27  nk','squidTag','
0310: 73 71 75 69 64 54 61 67 27 2c 27 4e 61 63 68 4a  squidTag','NachJ
0320: 61 73 25 27 29 29 2e 63 75 72 73 6f 72 28 29 0a  as%')).cursor().
0330: 09 09 72 65 74 75 72 6e 20 74 68 69 73 2e 5f 63  ..return this._c
0340: 75 72 73 6f 72 0a 09 64 65 66 20 63 68 65 63 6b  ursor..def check
0350: 28 74 68 69 73 2c 69 70 5f 61 64 64 72 65 73 73  (this,ip_address
0360: 2c 73 69 74 65 29 3a 0a 09 09 72 65 74 75 72 6e  ,site):...return
0370: 20 74 68 69 73 2e 5f 63 75 72 73 28 29 2e 65 78   this._curs().ex
0380: 65 63 75 74 65 28 22 73 65 6c 65 63 74 20 72 65  ecute("select re
0390: 64 69 72 65 63 74 5f 75 72 6c 20 66 72 6f 6d 20  direct_url from 
03a0: 73 69 74 65 5f 72 75 6c 65 73 20 77 68 65 72 65  site_rules where
03b0: 20 73 69 74 65 20 3c 40 20 74 72 69 70 64 6f 6d   site <@ tripdom
03c0: 61 69 6e 28 25 73 29 20 61 6e 64 20 6e 65 74 6d  ain(%s) and netm
03d0: 61 73 6b 20 3e 3e 20 25 73 20 6c 69 6d 69 74 20  ask >> %s limit 
03e0: 31 22 2c 28 73 69 74 65 2c 69 70 5f 61 64 64 72  1",(site,ip_addr
03f0: 65 73 73 2c 29 29 0a 09 64 65 66 20 73 74 61 74  ess,))..def stat
0400: 75 73 6d 65 73 73 61 67 65 28 74 68 69 73 29 3a  usmessage(this):
0410: 0a 09 09 72 65 74 75 72 6e 20 74 68 69 73 2e 5f  ...return this._
0420: 63 75 72 73 28 29 2e 73 74 61 74 75 73 6d 65 73  curs().statusmes
0430: 73 61 67 65 0a 09 64 65 66 20 66 65 74 63 68 6f  sage..def fetcho
0440: 6e 65 28 74 68 69 73 29 3a 0a 09 09 72 65 74 75  ne(this):...retu
0450: 72 6e 20 74 68 69 73 2e 5f 63 75 72 73 28 29 2e  rn this._curs().
0460: 66 65 74 63 68 6f 6e 65 28 29 0a 0a 63 6c 61 73  fetchone()..clas
0470: 73 20 43 68 65 63 6b 65 72 54 68 72 65 61 64 28  s CheckerThread(
0480: 6f 62 6a 65 63 74 29 3a 0a 09 5f 5f 73 6c 6f 74  object):..__slot
0490: 73 5f 5f 3d 66 72 6f 7a 65 6e 73 65 74 28 5b 27  s__=frozenset(['
04a0: 5f 64 62 27 2c 27 5f 6c 6f 63 6b 27 2c 27 5f 6c  _db','_lock','_l
04b0: 6f 63 6b 5f 71 75 65 75 65 27 2c 27 5f 6c 6f 67  ock_queue','_log
04c0: 27 2c 27 5f 71 75 65 75 65 27 5d 29 0a 09 64 65  ','_queue'])..de
04d0: 66 20 5f 5f 69 6e 69 74 5f 5f 28 74 68 69 73 2c  f __init__(this,
04e0: 64 62 2c 6c 6f 67 29 3a 0a 09 09 74 68 69 73 2e  db,log):...this.
04f0: 5f 64 62 3d 64 62 0a 09 09 74 68 69 73 2e 5f 6c  _db=db...this._l
0500: 6f 67 3d 6c 6f 67 0a 09 09 74 68 69 73 2e 5f 6c  og=log...this._l
0510: 6f 63 6b 3d 74 68 72 65 61 64 2e 61 6c 6c 6f 63  ock=thread.alloc
0520: 61 74 65 5f 6c 6f 63 6b 28 29 0a 09 09 74 68 69  ate_lock()...thi
0530: 73 2e 5f 6c 6f 63 6b 5f 71 75 65 75 65 3d 74 68  s._lock_queue=th
0540: 72 65 61 64 2e 61 6c 6c 6f 63 61 74 65 5f 6c 6f  read.allocate_lo
0550: 63 6b 28 29 0a 09 09 74 68 69 73 2e 5f 6c 6f 63  ck()...this._loc
0560: 6b 2e 61 63 71 75 69 72 65 28 29 0a 09 09 74 68  k.acquire()...th
0570: 69 73 2e 5f 71 75 65 75 65 3d 5b 5d 0a 09 09 74  is._queue=[]...t
0580: 68 72 65 61 64 2e 73 74 61 72 74 5f 6e 65 77 5f  hread.start_new_
0590: 74 68 72 65 61 64 28 74 68 69 73 2e 5f 73 74 61  thread(this._sta
05a0: 72 74 2c 28 29 29 0a 09 64 65 66 20 5f 73 74 61  rt,())..def _sta
05b0: 72 74 28 74 68 69 73 29 3a 0a 09 09 77 68 69 6c  rt(this):...whil
05c0: 65 20 54 72 75 65 3a 0a 09 09 09 74 68 69 73 2e  e True:....this.
05d0: 5f 6c 6f 63 6b 2e 61 63 71 75 69 72 65 28 29 0a  _lock.acquire().
05e0: 09 09 09 74 68 69 73 2e 5f 6c 6f 63 6b 5f 71 75  ...this._lock_qu
05f0: 65 75 65 2e 61 63 71 75 69 72 65 28 29 0a 09 09  eue.acquire()...
0600: 09 69 66 20 6c 65 6e 28 74 68 69 73 2e 5f 71 75  .if len(this._qu
0610: 65 75 65 29 3e 31 20 61 6e 64 20 74 68 69 73 2e  eue)>1 and this.
0620: 5f 6c 6f 63 6b 2e 6c 6f 63 6b 65 64 28 29 3a 0a  _lock.locked():.
0630: 09 09 09 09 74 68 69 73 2e 5f 6c 6f 63 6b 2e 72  ....this._lock.r
0640: 65 6c 65 61 73 65 28 29 0a 09 09 09 72 65 71 3d  elease()....req=
0650: 74 68 69 73 2e 5f 71 75 65 75 65 2e 70 6f 70 28  this._queue.pop(
0660: 30 29 0a 09 09 09 74 68 69 73 2e 5f 6c 6f 63 6b  0)....this._lock
0670: 5f 71 75 65 75 65 2e 72 65 6c 65 61 73 65 28 29  _queue.release()
0680: 0a 09 09 09 74 68 69 73 2e 5f 6c 6f 67 2e 69 6e  ....this._log.in
0690: 66 6f 28 27 74 72 79 69 6e 67 20 25 73 5c 6e 27  fo('trying %s\n'
06a0: 25 72 65 71 5b 31 5d 29 0a 09 09 09 74 68 69 73  %req[1])....this
06b0: 2e 5f 64 62 2e 63 68 65 63 6b 28 72 65 71 5b 32  ._db.check(req[2
06c0: 5d 2c 72 65 71 5b 31 5d 29 0a 09 09 09 74 68 69  ],req[1])....thi
06d0: 73 2e 5f 6c 6f 67 2e 69 6e 66 6f 28 22 47 6f 74  s._log.info("Got
06e0: 20 27 25 73 27 20 66 72 6f 6d 20 64 61 74 61 62   '%s' from datab
06f0: 61 73 65 2e 5c 6e 22 25 74 68 69 73 2e 5f 64 62  ase.\n"%this._db
0700: 2e 73 74 61 74 75 73 6d 65 73 73 61 67 65 28 29  .statusmessage()
0710: 29 0a 09 09 09 72 6f 77 3d 74 68 69 73 2e 5f 64  )....row=this._d
0720: 62 2e 66 65 74 63 68 6f 6e 65 28 29 0a 09 09 09  b.fetchone()....
0730: 69 66 20 72 6f 77 20 21 3d 20 4e 6f 6e 65 20 61  if row != None a
0740: 6e 64 20 72 6f 77 5b 30 5d 20 21 3d 20 4e 6f 6e  nd row[0] != Non
0750: 65 3a 0a 09 09 09 09 77 72 69 74 65 6c 69 6e 65  e:.....writeline
0760: 28 27 25 73 20 33 30 32 3a 25 73 5c 6e 27 25 28  ('%s 302:%s\n'%(
0770: 72 65 71 5b 30 5d 2c 72 6f 77 5b 30 5d 29 29 0a  req[0],row[0])).
0780: 09 09 09 65 6c 73 65 3a 0a 09 09 09 09 77 72 69  ...else:.....wri
0790: 74 65 6c 69 6e 65 28 27 25 73 20 2d 5c 6e 27 25  teline('%s -\n'%
07a0: 72 65 71 5b 30 5d 29 0a 09 64 65 66 20 63 68 65  req[0])..def che
07b0: 63 6b 28 74 68 69 73 2c 6c 69 6e 65 29 3a 0a 09  ck(this,line):..
07c0: 09 72 65 71 75 65 73 74 3d 72 65 2e 63 6f 6d 70  .request=re.comp
07d0: 69 6c 65 28 27 5e 28 5b 30 2d 39 5d 2b 29 5c 20  ile('^([0-9]+)\ 
07e0: 28 68 74 74 70 7c 66 74 70 29 3a 5c 2f 5c 2f 28  (http|ftp):\/\/(
07f0: 5b 2d 5c 77 2e 3a 5d 2b 29 5c 2f 28 5b 5e 20 5d  [-\w.:]+)\/([^ ]
0800: 2a 29 5c 20 28 5b 30 2d 39 2e 5d 2b 29 5c 2f 28  *)\ ([0-9.]+)\/(
0810: 2d 7c 5b 5c 77 5c 2e 5d 2b 29 5c 20 28 2d 7c 5c  -|[\w\.]+)\ (-|\
0820: 77 2b 29 5c 20 28 2d 7c 47 45 54 7c 48 45 41 44  w+)\ (-|GET|HEAD
0830: 7c 50 4f 53 54 29 2e 2a 24 27 29 2e 6d 61 74 63  |POST).*$').matc
0840: 68 28 6c 69 6e 65 29 0a 09 09 69 66 20 72 65 71  h(line)...if req
0850: 75 65 73 74 3a 0a 09 09 09 73 69 74 65 3d 72 65  uest:....site=re
0860: 71 75 65 73 74 2e 67 72 6f 75 70 28 33 29 0a 09  quest.group(3)..
0870: 09 09 69 70 5f 61 64 64 72 65 73 73 3d 72 65 71  ..ip_address=req
0880: 75 65 73 74 2e 67 72 6f 75 70 28 35 29 0a 09 09  uest.group(5)...
0890: 09 69 64 3d 72 65 71 75 65 73 74 2e 67 72 6f 75  .id=request.grou
08a0: 70 28 31 29 0a 09 09 09 74 68 69 73 2e 5f 6c 6f  p(1)....this._lo
08b0: 63 6b 5f 71 75 65 75 65 2e 61 63 71 75 69 72 65  ck_queue.acquire
08c0: 28 29 0a 09 09 09 74 68 69 73 2e 5f 71 75 65 75  ()....this._queu
08d0: 65 2e 61 70 70 65 6e 64 28 28 69 64 2c 73 69 74  e.append((id,sit
08e0: 65 2c 69 70 5f 61 64 64 72 65 73 73 29 29 0a 09  e,ip_address))..
08f0: 09 09 69 66 20 74 68 69 73 2e 5f 6c 6f 63 6b 2e  ..if this._lock.
0900: 6c 6f 63 6b 65 64 28 29 3a 0a 09 09 09 09 74 68  locked():.....th
0910: 69 73 2e 5f 6c 6f 63 6b 2e 72 65 6c 65 61 73 65  is._lock.release
0920: 28 29 0a 09 09 09 74 68 69 73 2e 5f 6c 6f 63 6b  ()....this._lock
0930: 5f 71 75 65 75 65 2e 72 65 6c 65 61 73 65 28 29  _queue.release()
0940: 0a 09 09 09 74 68 69 73 2e 5f 6c 6f 67 2e 69 6e  ....this._log.in
0950: 66 6f 28 27 72 65 71 75 65 73 74 20 25 73 20 71  fo('request %s q
0960: 75 65 75 65 64 20 28 25 73 29 5c 6e 27 25 28 69  ueued (%s)\n'%(i
0970: 64 2c 6c 69 6e 65 29 29 0a 09 09 65 6c 73 65 3a  d,line))...else:
0980: 0a 09 09 09 74 68 69 73 2e 5f 6c 6f 67 2e 69 6e  ....this._log.in
0990: 66 6f 28 27 62 61 64 20 72 65 71 75 65 73 74 5c  fo('bad request\
09a0: 6e 27 29 0a 09 09 09 77 72 69 74 65 6c 69 6e 65  n')....writeline
09b0: 28 6c 69 6e 65 29 0a 0a 64 65 66 20 77 72 69 74  (line)..def writ
09c0: 65 6c 69 6e 65 28 73 74 72 69 6e 67 29 3a 0a 09  eline(string):..
09d0: 6c 6f 67 2e 69 6e 66 6f 28 27 73 65 6e 64 69 6e  log.info('sendin
09e0: 67 3a 20 25 73 27 25 73 74 72 69 6e 67 29 0a 09  g: %s'%string)..
09f0: 73 79 73 2e 73 74 64 6f 75 74 2e 77 72 69 74 65  sys.stdout.write
0a00: 28 73 74 72 69 6e 67 29 0a 09 73 79 73 2e 73 74  (string)..sys.st
0a10: 64 6f 75 74 2e 66 6c 75 73 68 28 29 0a 0a 6c 6f  dout.flush()..lo
0a20: 67 3d 4c 6f 67 67 65 72 28 46 61 6c 73 65 29 0a  g=Logger(False).
0a30: 64 62 3d 74 61 67 44 42 28 29 0a 63 68 65 63 6b  db=tagDB().check
0a40: 65 72 3d 43 68 65 63 6b 65 72 54 68 72 65 61 64  er=CheckerThread
0a50: 28 64 62 2c 6c 6f 67 29 0a 0a 77 68 69 6c 65 20  (db,log)..while 
0a60: 54 72 75 65 3a 0a 09 6c 69 6e 65 3d 73 79 73 2e  True:..line=sys.
0a70: 73 74 64 69 6e 2e 72 65 61 64 6c 69 6e 65 28 29  stdin.readline()
0a80: 0a 09 69 66 20 6c 65 6e 28 6c 69 6e 65 29 3d 3d  ..if len(line)==
0a90: 30 3a 0a 09 09 62 72 65 61 6b 0a 09 63 68 65 63  0:...break..chec
0aa0: 6b 65 72 2e 63 68 65 63 6b 28 6c 69 6e 65 29 0a  ker.check(line).