2015-12-24 15:31:55 +04:00
#!/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.
2016-02-07 23:03:38 +04:00
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 .
2015-12-24 15:31:55 +04:00
"""
2016-02-07 23:03:38 +04:00
import re , cgi , urllib
2015-12-24 15:31:55 +04:00
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 ) :
2016-02-07 23:03:38 +04:00
print " %s =( " % name ,
2015-12-24 15:31:55 +04:00
for value in values :
2016-02-07 23:03:38 +04:00
print quote ( value , True ) ,
2015-12-24 15:31:55 +04:00
print " ) "
2016-02-07 23:03:38 +04:00
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
2015-12-24 15:31:55 +04:00
def run_cgiparams ( ) :
from optparse import OptionParser
OP = OptionParser ( usage = u " \n \t % prog [options] params... " , description = __doc__ )
2016-02-07 23:03:38 +04:00
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. " )
2015-12-24 15:31:55 +04:00
o , args = OP . parse_args ( )
form = cgi . FieldStorage ( keep_blank_values = True )
2016-02-07 23:03:38 +04:00
qvars = [ ]
2015-12-24 15:31:55 +04:00
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 ( ' - ' , ' _ ' )
2016-02-07 23:03:38 +04:00
if vname not in qvars : qvars . append ( vname )
2015-12-24 15:31:55 +04:00
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 ( ' - ' , ' _ ' )
2016-02-07 23:03:38 +04:00
qvars . append ( vname )
2015-12-24 15:31:55 +04:00
values = form . getlist ( fname )
if len ( values ) == 1 : print_scalar ( vname , values [ 0 ] )
else : print_array ( vname , values )
2016-02-07 23:03:38 +04:00
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 )
2015-12-24 15:31:55 +04:00
if __name__ == ' __main__ ' :
run_cgiparams ( )