import os import re from checkpackagelib.base import _CheckFunction from checkpackagelib.lib import ConsecutiveEmptyLines # noqa: F401 from checkpackagelib.lib import EmptyLastLine # noqa: F401 from checkpackagelib.lib import NewlineAtEof # noqa: F401 from checkpackagelib.lib import TrailingSpace # noqa: F401 import checkpackagelib.tool from checkpackagelib.tool import Shellcheck # noqa: F401 class Indent(_CheckFunction): INDENTED_WITH_SPACES = re.compile(r"^[\t]* ") def check_line(self, lineno, text): if self.INDENTED_WITH_SPACES.search(text.rstrip()): return ["{}:{}: should be indented with tabs ({}#adding-packages-start-script)" .format(self.filename, lineno, self.url_to_manual), text] class NotExecutable(checkpackagelib.tool.NotExecutable): def ignore(self): return 'etc/init.d/' in self.filename def hint(self): return ", just make sure you use '$(INSTALL) -D -m 0755' in the .mk file" class Variables(_CheckFunction): DAEMON_VAR = re.compile(r"^DAEMON=[\"']{0,1}([^\"']*)[\"']{0,1}") PIDFILE_PATTERN = re.compile(r"/var/run/(\$DAEMON|\$\{DAEMON\}).pid") PIDFILE_VAR = re.compile(r"^PIDFILE=[\"']{0,1}([^\"']*)[\"']{0,1}") def before(self): self.name = None def check_line(self, lineno, text): name_found = self.DAEMON_VAR.search(text.rstrip()) if name_found: if self.name: return ["{}:{}: DAEMON variable redefined ({}#adding-packages-start-script)" .format(self.filename, lineno, self.url_to_manual), text] self.name = name_found.group(1) if '/' in self.name: self.name = os.path.basename(self.name) # to be used in after() to check the expected filename return ["{}:{}: Do not include path in DAEMON ({}#adding-packages-start-script)" .format(self.filename, lineno, self.url_to_manual), text, 'DAEMON="{}"'.format(self.name)] return pidfile_found = self.PIDFILE_VAR.search(text.rstrip()) if pidfile_found: pidfile = pidfile_found.group(1) if not self.PIDFILE_PATTERN.match(pidfile): return ["{}:{}: Incorrect PIDFILE value ({}#adding-packages-start-script)" .format(self.filename, lineno, self.url_to_manual), text, 'PIDFILE="/var/run/$DAEMON.pid"'] def after(self): if self.name is None: return ["{}:0: DAEMON variable not defined ({}#adding-packages-start-script)" .format(self.filename, self.url_to_manual)] expected_filename = re.compile(r"S\d\d{}$".format(self.name)) if not expected_filename.match(os.path.basename(self.filename)): return ["{}:0: filename should be S ({}#adding-packages-start-script)" .format(self.filename, self.url_to_manual), "expecting S{}".format(self.name)]