File: cmdutils.py

package info (click to toggle)
lava 2026.01-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 30,796 kB
  • sloc: python: 82,790; javascript: 16,658; sh: 1,364; makefile: 335
file content (94 lines) | stat: -rw-r--r-- 2,872 bytes parent folder | download | duplicates (3)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# Copyright (C) 2017-2019 Linaro Limited
#
# Author: Neil Williams <neil.williams@linaro.org>
#         Remi Duraffort <remi.duraffort@linaro.org>
#
# SPDX-License-Identifier: GPL-2.0-or-later

import grp
import logging
import logging.handlers
import os
import pwd

from django.core.management.base import BaseCommand


class LAVADaemonCommand(BaseCommand):
    def add_arguments(self, parser):
        log = parser.add_argument_group("logging")
        log.add_argument(
            "-l",
            "--level",
            choices=["ERROR", "WARN", "INFO", "DEBUG"],
            default="DEBUG",
            help="Logging level (ERROR, WARN, INFO, DEBUG) " "Default: DEBUG",
        )

        log.add_argument(
            "-o", "--log-file", default=self.default_logfile, help="Logging file path"
        )

        priv = parser.add_argument_group("privileges")
        priv.add_argument(
            "-u",
            "--user",
            default="lavaserver",
            help="Run the process under this user. It should "
            "be the same user as the gunicorn process.",
        )

        priv.add_argument(
            "-g",
            "--group",
            default="lavaserver",
            help="Run the process under this group. It should "
            "be the same group as the gunicorn process.",
        )

    def drop_privileges(self, user, group):
        try:
            user_id = pwd.getpwnam(user)[2]
            group_id = grp.getgrnam(group)[2]
        except KeyError:
            self.logger.error("[INIT] Unable to lookup the user or the group")
            return False
        self.logger.debug(
            "[INIT] Switching to (%s(%d), %s(%d))", user, user_id, group, group_id
        )

        try:
            os.setgid(group_id)
            os.setuid(user_id)
        except OSError:
            self.logger.error(
                "[INIT] Unable to the set (user, group)=(%s, %s)", user, group
            )
            return False

        # Set a restrictive umask (rwxr-xr-x)
        os.umask(0o022)

        return True

    def setup_logging(self, logger_name, level, log_file, log_format):
        del logging.root.handlers[:]
        del logging.root.filters[:]
        # Create the logger
        self.logger = logging.getLogger(logger_name)
        if log_file == "-":
            handler = logging.StreamHandler()
        else:
            handler = logging.handlers.WatchedFileHandler(log_file)
        handler.setFormatter(logging.Formatter(log_format))
        self.logger.addHandler(handler)

        # Set log level
        if level == "ERROR":
            self.logger.setLevel(logging.ERROR)
        elif level == "WARN":
            self.logger.setLevel(logging.WARN)
        elif level == "INFO":
            self.logger.setLevel(logging.INFO)
        else:
            self.logger.setLevel(logging.DEBUG)