summaryrefslogtreecommitdiff
path: root/rpmlint-checks-master/BashismsCheck.py
blob: c851ee115a68a28b8414a02bed3ca3ea87668f56 (plain)
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, 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.''')