2010-09-21 14:45:52 +04:00
#!/usr/bin/python
# Simple udev rules syntax checker
#
# (C) 2010 Canonical Ltd.
# Author: Martin Pitt <martin.pitt@ubuntu.com>
#
2013-08-15 00:55:40 +04:00
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
2010-09-21 14:45:52 +04:00
# (at your option) any later version.
2013-08-15 00:55:40 +04:00
# systemd is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
2010-09-21 14:45:52 +04:00
#
2013-08-15 00:55:40 +04:00
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
2010-09-21 14:45:52 +04:00
import re
import sys
if len ( sys . argv ) < 2 :
print >> sys . stderr , ' Usage: %s <rules file> [...] ' % sys . argv [ 0 ]
sys . exit ( 2 )
no_args_tests = re . compile ( ' (ACTION|DEVPATH|KERNELS?|NAME|SYMLINK|SUBSYSTEMS?|DRIVERS?|TAG|RESULT|TEST) \ s*(?:=|!)= \ s* " ([^ " ]*) " $ ' )
args_tests = re . compile ( ' (ATTRS?|ENV|TEST) { ([a-zA-Z0-9/_.* % -]+)} \ s*(?:=|!)= \ s* " ([^ " ]*) " $ ' )
2012-02-20 03:41:58 +04:00
no_args_assign = re . compile ( ' (NAME|SYMLINK|OWNER|GROUP|MODE|TAG|PROGRAM|RUN|LABEL|GOTO|WAIT_FOR|OPTIONS|IMPORT) \ s*(?: \ +=|:=|=) \ s* " ([^ " ]*) " $ ' )
2012-10-09 02:49:15 +04:00
args_assign = re . compile ( ' (ATTR|ENV|IMPORT|RUN) { ([a-zA-Z0-9/_.* % -]+)} \ s*(=| \ +=) \ s* " ([^ " ]*) " $ ' )
2010-09-21 14:45:52 +04:00
result = 0
buffer = ' '
for path in sys . argv [ 1 : ] :
lineno = 0
for line in open ( path ) :
lineno + = 1
# handle line continuation
if line . endswith ( ' \\ \n ' ) :
buffer + = line [ : - 2 ]
continue
else :
line = buffer + line
buffer = ' '
# filter out comments and empty lines
line = line . strip ( )
if not line or line . startswith ( ' # ' ) :
continue
for clause in line . split ( ' , ' ) :
clause = clause . strip ( )
if not ( no_args_tests . match ( clause ) or args_tests . match ( clause ) or
no_args_assign . match ( clause ) or args_assign . match ( clause ) ) :
2011-05-31 04:18:33 +04:00
print ( ' Invalid line %s : %i : %s ' % ( path , lineno , line ) )
print ( ' clause: ' , clause )
print ( )
2010-09-21 14:45:52 +04:00
result = 1
break
sys . exit ( result )