108 lines
4.4 KiB
Python
Executable File
108 lines
4.4 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
|
|
|
u"""Ce script est prévu pour être utilisé dans un script CGI.
|
|
|
|
Il permet de lister les paramètres du formulaire et d'y accéder depuis un script
|
|
bash. Le tableau QVARS est initialisé avec la liste des variables correspondant
|
|
aux paramètres pour lesquels une valeur est définie.
|
|
|
|
Les arguments de ce script doivent être de la forme NAME[=DEFAULT]. Si le
|
|
paramètres était fourni dans la requête, il est affiché, sous forme de scalaire
|
|
ou de tableau. S'il n'était pas fourni, la valeur par défaut est affichée.
|
|
"""
|
|
|
|
import re, cgi, urllib
|
|
|
|
RE_NAME_VALUE = re.compile(r'([a-zA-Z0-9_-]+)(?:=(.*))?$')
|
|
|
|
def quote(value, q=False):
|
|
if value or q:
|
|
value = "'%s'" % value.replace("'", "'\\''")
|
|
value = re.sub(r"(?<!\\)''", "", value)
|
|
return value
|
|
else: return ""
|
|
|
|
def print_scalar(name, value):
|
|
print "%s=%s" % (name, quote(value))
|
|
|
|
def print_array(name, values):
|
|
print "%s=(" % name,
|
|
for value in values:
|
|
print quote(value, True),
|
|
print ")"
|
|
|
|
RE_COMMA = re.compile(',')
|
|
def lfix(values):
|
|
if values is None: return None
|
|
fvalues = []
|
|
for parts in values:
|
|
parts = RE_COMMA.split(parts)
|
|
fvalues.extend(parts)
|
|
return fvalues
|
|
|
|
def build_query_string(form, includes=None, excludes=None, prefix=None):
|
|
includes = lfix(includes)
|
|
if includes is None: names = form.keys()
|
|
else: names = includes[:]
|
|
excludes = lfix(excludes)
|
|
if excludes is not None:
|
|
for name in excludes:
|
|
if name in names: names.remove(name)
|
|
params = []
|
|
for name in names:
|
|
values = form.getlist(name)
|
|
for value in values:
|
|
params.append((name, value))
|
|
query_string = urllib.urlencode(params)
|
|
if prefix:
|
|
if query_string != "": query_string = "%s&%s" % (prefix, query_string)
|
|
elif prefix != "": query_string = prefix
|
|
if query_string:
|
|
query_string = "?%s" % query_string
|
|
return query_string
|
|
|
|
def run_cgiparams():
|
|
from optparse import OptionParser
|
|
OP = OptionParser(usage=u"\n\t%prog [options] params...", description=__doc__)
|
|
OP.add_option('--qvars', dest="qvars", default="QVARS",
|
|
help=u"Spécifier le nom du tableau qui contiendra la liste des variables correspondant aux paramètres pour lesquels une valeur est définie. Par défaut, utiliser QVARS")
|
|
OP.add_option('-q', '--query-string', action='store_true', dest='print_qs',
|
|
help=u"Reconstruire et afficher la valeur de QUERY_STRING en fonction des paramètres fournis dans la requête. Les options -i et -x permettent de sélectionner les paramètres qui y sont inclus.")
|
|
OP.add_option('-i', '--include', dest='includes', action='append',
|
|
help=u"Spécifier un paramètre à inclure pour construire QUERY_STRING. Il est possible de spécifier plusieurs paramètres en les séparant par des virgules.")
|
|
OP.add_option('-x', '--exclude', dest='excludes', action='append',
|
|
help=u"Spécifier un paramètre à exclure pour construire QUERY_STRING. Il est possible de spécifier plusieurs paramètres en les séparant par des virgules.")
|
|
OP.add_option('-p', '--prefix', dest="prefix",
|
|
help=u"Ajouter les paramètres supplémentaires spécifiés à QUERY_STRING.")
|
|
o, args = OP.parse_args()
|
|
|
|
form = cgi.FieldStorage(keep_blank_values=True)
|
|
qvars = []
|
|
if args:
|
|
for nv in args:
|
|
mo = RE_NAME_VALUE.match(nv)
|
|
if mo is None: continue
|
|
fname, defvalue = mo.group(1), mo.group(2)
|
|
if defvalue is None: defvalue = ''
|
|
vname = fname.replace('-', '_')
|
|
if vname not in qvars: qvars.append(vname)
|
|
values = form.getlist(fname)
|
|
if len(values) == 0: print_scalar(vname, defvalue)
|
|
elif len(values) == 1: print_scalar(vname, values[0])
|
|
else: print_array(vname, values)
|
|
else:
|
|
for fname in form.keys():
|
|
vname = fname.replace('-', '_')
|
|
qvars.append(vname)
|
|
values = form.getlist(fname)
|
|
if len(values) == 1: print_scalar(vname, values[0])
|
|
else: print_array(vname, values)
|
|
print_array(o.qvars, qvars)
|
|
if o.print_qs:
|
|
qs = build_query_string(form, o.includes, o.excludes, o.prefix)
|
|
print_scalar('QUERY_STRING', qs)
|
|
|
|
if __name__ == '__main__':
|
|
run_cgiparams()
|