2021-01-30 15:52:48 +00:00
|
|
|
import os
|
|
|
|
|
2024-01-25 20:40:15 +00:00
|
|
|
from ansiblelater.rule import RuleBase
|
2021-01-30 15:52:48 +00:00
|
|
|
|
|
|
|
|
2024-01-25 20:40:15 +00:00
|
|
|
class CheckCommandInsteadOfModule(RuleBase):
|
2024-01-27 17:32:29 +00:00
|
|
|
rid = "ANS108"
|
2021-01-30 15:52:48 +00:00
|
|
|
description = "Commands should not be used in place of modules"
|
|
|
|
helptext = "{exec} command used in place of {module} module"
|
|
|
|
types = ["playbook", "task", "handler"]
|
|
|
|
|
|
|
|
def check(self, candidate, settings):
|
|
|
|
tasks, errors = self.get_normalized_tasks(candidate, settings)
|
|
|
|
commands = ["command", "shell", "raw"]
|
|
|
|
modules = {
|
|
|
|
"git": "git",
|
|
|
|
"hg": "hg",
|
|
|
|
"curl": "get_url or uri",
|
|
|
|
"wget": "get_url or uri",
|
|
|
|
"svn": "subversion",
|
|
|
|
"service": "service",
|
|
|
|
"mount": "mount",
|
|
|
|
"rpm": "yum or rpm_key",
|
|
|
|
"yum": "yum",
|
|
|
|
"apt-get": "apt-get",
|
|
|
|
"unzip": "unarchive",
|
|
|
|
"tar": "unarchive",
|
|
|
|
"chkconfig": "service",
|
|
|
|
"rsync": "synchronize",
|
|
|
|
"supervisorctl": "supervisorctl",
|
|
|
|
"systemctl": "systemd",
|
2023-11-10 13:50:48 +00:00
|
|
|
"sed": "template or lineinfile",
|
2021-01-30 15:52:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if not errors:
|
|
|
|
for task in tasks:
|
|
|
|
if task["action"]["__ansible_module__"] in commands:
|
|
|
|
first_cmd_arg = self.get_first_cmd_arg(task)
|
|
|
|
executable = os.path.basename(first_cmd_arg)
|
2023-04-20 06:23:12 +00:00
|
|
|
cmd = cmd = self.get_safe_cmd(task)
|
|
|
|
|
2021-01-30 15:52:48 +00:00
|
|
|
if (
|
2023-11-10 13:50:48 +00:00
|
|
|
first_cmd_arg
|
|
|
|
and executable in modules
|
|
|
|
and task["action"].get("warn", True)
|
|
|
|
and "register" not in task
|
2023-04-20 06:23:12 +00:00
|
|
|
and not any(ch in cmd for ch in self.SHELL_PIPE_CHARS)
|
2021-01-30 15:52:48 +00:00
|
|
|
):
|
|
|
|
errors.append(
|
|
|
|
self.Error(
|
|
|
|
task["__line__"],
|
2023-11-10 13:50:48 +00:00
|
|
|
self.helptext.format(exec=executable, module=modules[executable]),
|
2021-01-30 15:52:48 +00:00
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
return self.Result(candidate.path, errors)
|