webopener - plumber - Plumber – a modern approach to plumbing
 (HTM) git clone git://r-36.net/plumber
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       webopener (2552B)
       ---
            1 #!/usr/bin/env python3
            2 # coding=utf-8
            3 #
            4 # Copy me if you can.
            5 # by 20h
            6 #
            7 
            8 import sys
            9 import os
           10 import re
           11 import getopt
           12 from subprocess import Popen
           13 import requests
           14 
           15 # URI match, header match, match type, command '%s' % (uri)
           16 MATCH_HEADER        = 1<<0
           17 MATCH_URI        = 1<<1
           18 MATCH_ALL        = 0xFF
           19 
           20 webrules = [
           21         [".*", {"X-Future": ".*opher.*"}, MATCH_HEADER, os.environ.get('PLUMB_WEB') + " '%s'"],
           22         [".*", {}, MATCH_ALL, os.environ.get('PLUMB_WEB') + " '%s'"],
           23 ]
           24 
           25 def usage(app):
           26         app = os.path.basename(app)
           27         sys.stderr.write("usage: %s [-dhHp] URI\n" % (app))
           28         sys.exit(1)
           29 
           30 def runcmd(cmd, arg=None):
           31         fd = open("/dev/null")
           32         if os.fork() == 0:
           33                 if arg != None:
           34                         cmd = cmd % (arg)
           35                 p = Popen(cmd, shell=True, stdout=fd, stderr=fd)
           36                 p.wait()
           37 
           38 def main(args):
           39         try:
           40                 opts, largs = getopt.getopt(args[1:], 'hHdp')
           41         except getopt.GetoptError as err:
           42                 print(str(err))
           43                 usage(args[0])
           44 
           45         dodebug = False
           46         printheaders = False 
           47         dopretend = False
           48         for o, a in opts:
           49                 if o == "-h":
           50                         usage(args[0])
           51                 elif o == "-d":
           52                         dodebug = True
           53                 elif o == "-H":
           54                         printheaders = True
           55                 elif o == "-p":
           56                         dopretend = True
           57                 else:
           58                         assert False, "unhandled option"
           59         
           60         if len(largs) < 1:
           61                 runcmd(webrules[-1][3], "")
           62                 return 0
           63 
           64         uri = " ".join(largs)
           65         didprepend = False
           66         if "http" != uri[0:4]:
           67                 muri = "https://%s" % (uri)
           68                 didprepend = True
           69         else:
           70                 muri = uri
           71                 
           72         try:
           73                 req = requests.head(muri)
           74         except:
           75                 if didprepend == True:
           76                         muri = "http://%s" % (muri[8:])
           77                         try:
           78                                 req = requests.head(muri)
           79                         except:
           80                                 if dopretend == False:
           81                                         runcmd(webrules[-1][3], uri)
           82                                 return 0
           83                 else:
           84                         if dopretend == False:
           85                                 runcmd(webrules[-1][3], uri)
           86                         return 0
           87 
           88         if printheaders == True:
           89                 for h in req.headers:
           90                         print("%s: %s" % (h, req.headers[h]))
           91 
           92         if didprepend == True:
           93                 uri = muri
           94 
           95         if dodebug == True:
           96                 print("Using '%s'" % (uri))
           97 
           98         frule = None
           99         for rule in webrules:
          100                 if (rule[2] & MATCH_URI) > 0:
          101                         if re.search(rule[0], uri) == None:
          102                                 continue
          103 
          104                 if (rule[2] & MATCH_HEADER) > 0 and len(rule[1]) > 0:
          105                         didmatch = False
          106                         for header in rule[1]:
          107                                 for h in req.headers:
          108                                         if re.search(header, h) != None:
          109                                                 if re.search(rule[1][header],\
          110                                                                 req.headers[h])\
          111                                                                 != None:
          112                                                         didmatch = True
          113                                                 else:
          114                                                         didmatch = False
          115                         if didmatch == False:
          116                                 continue
          117 
          118                 frule = rule
          119                 break
          120 
          121         if frule == None:
          122                 print("No match found.")
          123 
          124         if dodebug:
          125                 print("found match: %s -> %s" % (frule[3], uri))
          126 
          127         if dopretend == False:
          128                 runcmd(frule[3], uri)
          129 
          130         return 0
          131 
          132 if __name__ == "__main__":
          133         sys.exit(main(sys.argv))
          134