summaryrefslogtreecommitdiff
path: root/kvmd/helpers/otgmsd/remount/__init__.py
blob: 2eba6add2e125415caad4ac61338c6456f047abe (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
# ========================================================================== #
#                                                                            #
#    KVMD - The main Pi-KVM daemon.                                          #
#                                                                            #
#    Copyright (C) 2018  Maxim Devaev <[email protected]>                    #
#                                                                            #
#    This program is free software: you can redistribute it and/or modify    #
#    it under the terms of the GNU General Public License as published by    #
#    the Free Software Foundation, either version 3 of the License, or       #
#    (at your option) any later version.                                     #
#                                                                            #
#    This program is distributed in the hope that it will be useful,         #
#    but WITHOUT ANY WARRANTY; without even the implied warranty of          #
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           #
#    GNU General Public License for more details.                            #
#                                                                            #
#    You should have received a copy of the GNU General Public License       #
#    along with this program.  If not, see <https://www.gnu.org/licenses/>.  #
#                                                                            #
# ========================================================================== #


import sys
import subprocess


# ====
_MOUNT_PATH = "/bin/mount"
_FSTAB_PATH = "/etc/fstab"
_OPTION = "X-kvmd.otg-msd"


# =====
def _find_mountpoint() -> str:
    with open(_FSTAB_PATH) as fstab_file:
        for line in fstab_file.read().split("\n"):
            line = line.strip()
            if line and not line.startswith("#"):
                parts = line.split()
                if len(parts) == 6:
                    options = parts[3].split(",")
                    if _OPTION in options:
                        return parts[1]
    raise SystemExit(f"Can't find {_OPTION!r} mountpoint in {_FSTAB_PATH}")


def _remount(path: str, ro: bool) -> None:
    try:
        subprocess.check_call([
            _MOUNT_PATH,
            "--options",
            f"remount,{'ro' if ro else 'rw'}",
            path,
        ])
    except subprocess.CalledProcessError as err:
        raise SystemExit(str(err)) from None


# =====
def main() -> None:
    if len(sys.argv) != 2 or sys.argv[1] not in ["ro", "rw"]:
        raise SystemExit(f"This program will remount a first volume marked by {_OPTION!r} option in {_FSTAB_PATH}\n\n"
                         f"Usage: python -m kvmd.helpers.otgmsd.remount [-h|--help|ro|rw]")
    _remount(_find_mountpoint(), (sys.argv[1] == "ro"))