aboutsummaryrefslogtreecommitdiff
path: root/rhodecode/lib/system_command.py
blob: 04d5d69c66e040e406cd27d39a4443096d5b7143 (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
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
import logging
import os
import subprocess


log = logging.getLogger(__name__)


class SystemCommand():

    @classmethod
    def execute(cls, cmd_args, with_sudo=True):
        """Runs the command passed."""
        if not isinstance(cmd_args, list):
            cmd_args = list(cmd_args)
        if with_sudo:
            cmd_args.insert(0, "sudo")

        with open(os.devnull, 'w') as tempf:
            process = subprocess.Popen(cmd_args, stdout=subprocess.PIPE,
                                       stderr=subprocess.PIPE)
            (stdout, stderr) = process.communicate()

        if process.returncode != 0:
            log.warn("Error executing command: '%s'. Reason: %s." %
                        (" ".join(cmd_args), stderr))
        else:
            log.debug("Sucess executing command %s. Output: %s" % (cmd_args,
                                                                      stdout))

        return stdout

    @classmethod
    def add_group(cls, groupname):
        cmd_args = ["groupadd", groupname]
        cls.execute(cmd_args)

    @classmethod
    def rename_group(cls, groupname, newgroupname):
        cmd_args = ["groupmod", "-n", newgroupname, groupname]
        cls.execute(cmd_args)

    @classmethod
    def delete_group(cls, groupname):
        cmd_args = ["groupdel", groupname]
        cls.execute(cmd_args)

    @classmethod
    def add_user(cls, username):
        cmd_args = ["adduser", "--disabled-password", "--force-badname",
                    "--quiet", "--gecos", "''", username]
        cls.execute(cmd_args)

    @classmethod
    def add_user_to_group(cls, groupname, username):
        cmd_args = ["gpasswd", "-a", username, groupname]
        cls.execute(cmd_args)

    @classmethod
    def remove_user_from_group(cls, groupname, username):
        cmd_args = ["gpasswd", "-d", username, groupname]
        cls.execute(cmd_args)

    @classmethod
    def get_group_members(cls, groupname):
        cmd_args = ["members", "--all", groupname]
        try:
            output = cls.execute(cmd_args)
            users = set(output.split())
            return users
        except:
            return {}

    @classmethod
    def change_ownership(cls, path, group):
        cmd_args = ["change-repo-ownership", path, group]
        cls.execute(cmd_args)

    @classmethod
    def get_system_groups(cls):
        cmd_args = ["getent", "group"]
        try:
            output = cls.execute(cmd_args)
            lines = output.split()
            groups = [line.split(":")[0] for line in lines]
            return groups
        except:
            return []