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).