forked from openSUSE/rpmlint-checks
-
Notifications
You must be signed in to change notification settings - Fork 0
/
BashismsCheck.py
47 lines (41 loc) · 1.74 KB
/
BashismsCheck.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#############################################################################
# File : BashismsCheck.py
# Package : rpmlint
# Author : Guido Berhoerster
# Purpose : check /bin/sh shell scripts for bashisms
#############################################################################
import re
import AbstractCheck
import Config
import Pkg
from Filter import *
class BashismsCheck(AbstractCheck.AbstractFilesCheck):
RE_BIN_SH = re.compile('#!\s*(/usr)?/bin/sh(\s+|$)')
def __init__(self):
AbstractCheck.AbstractFilesCheck.__init__(self, "BashismsCheck", ".*")
def check_file(self, pkg, filename):
try:
f = open(filename)
except:
return
try:
first_line = f.read(256).split("\n")[0]
if self.RE_BIN_SH.match(first_line):
status, output = Pkg.getstatusoutput(["dash", "-n", filename])
if status == 2:
printWarning(pkg, "bin-sh-syntax-error", filename)
try:
status, output = Pkg.getstatusoutput(["checkbashisms", filename])
if status == 1:
printInfo(pkg, "potential-bashisms", filename)
except Exception as x:
printError(pkg, 'rpmlint-exception', "%(file)s raised an exception: %(x)s" % {'file':filename, 'x':x})
finally:
f.close()
check = BashismsCheck()
if Config.info:
addDetails('bin-sh-syntax-error',
'''A /bin/sh shell script contains a syntax error.''',
'potential-bashisms',
'''checkbashisms reported potential bashisms in a /bin/sh shell
script, you might want to manually check this script for bashisms.''')