92 lines
2.7 KiB
Python
92 lines
2.7 KiB
Python
#!/usr/bin/python3
|
|
|
|
import sys
|
|
import pathlib
|
|
import os
|
|
import argparse
|
|
|
|
def set_idmap_in_config(config_location, base_map, dry_run=False):
|
|
config_data = ""
|
|
|
|
found_user = False
|
|
found_group = False
|
|
with open(config_location, "r") as File:
|
|
for row in File:
|
|
if row.startswith("lxc.idmap"):
|
|
data = row.split("=")
|
|
conf_mapping = data[1].split(" ")
|
|
if conf_mapping[0] == "u":
|
|
config_data += "lxc.idmap = u 0 {} 65536\n".format(base_map)
|
|
found_user = True
|
|
elif conf_mapping[1] == "g":
|
|
config_data += "lxc.idmap = g 0 {} 65536\n".format(base_map)
|
|
found_group = True
|
|
else:
|
|
config_data += row
|
|
|
|
if not found_user:
|
|
config_data += "lxc.idmap = u 0 {} 65536\n".format(base_map)
|
|
if not found_group:
|
|
config_data += "lxc.idmap = g 0 {} 65536\n".format(base_map)
|
|
|
|
if not dry_run:
|
|
with open(config_location, "w") as File:
|
|
File.write(config_data)
|
|
else:
|
|
print("New Config")
|
|
print(config_data)
|
|
|
|
def map_user_ids(name, base_map, uid_map, dry_run=False):
|
|
start_path = pathlib.Path("/var/lib/lxc", name, "rootfs")
|
|
path_list = list(start_path.rglob("*"))
|
|
path_list.append(start_path)
|
|
path_list.append(pathlib.Path("/var/lib/lxc", name))
|
|
|
|
new_base_map = base_map + uid_map
|
|
for i in path_list:
|
|
stat = i.lstat()
|
|
local_uid = stat.st_uid
|
|
local_gid = stat.st_gid
|
|
|
|
if local_uid >= new_base_map * 2:
|
|
local_uid = local_uid % 65536
|
|
local_gid = local_gid % 65536
|
|
|
|
if not dry_run:
|
|
os.lchown(i, local_uid + new_base_map, local_gid + new_base_map)
|
|
else:
|
|
print("chowning {} from {} to {}".format(i, local_uid, local_uid + new_base_map))
|
|
|
|
set_idmap_in_config(pathlib.Path("/var/lib/lxc", name, "config"), new_base_map, dry_run)
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
prog="User ID mapping",
|
|
description="maps base uids to a higher number")
|
|
|
|
parser.add_argument("server_name")
|
|
parser.add_argument("mapping")
|
|
parser.add_argument("-b", "--base-map")
|
|
parser.add_argument("-m", "--multiplier")
|
|
parser.add_argument("-d", "--dry-run", action=argparse.BooleanOptionalAction)
|
|
|
|
args = parser.parse_args()
|
|
|
|
base_map = 900000000
|
|
if args.base_map:
|
|
base_map = int(args.base_map)
|
|
|
|
multiplier = 100000
|
|
if args.multiplier:
|
|
multiplier = int(args.multiplier)
|
|
|
|
server_name = args.server_name
|
|
mapping = int(args.mapping)
|
|
|
|
print(args.dry_run)
|
|
|
|
map_user_ids(server_name, base_map, multiplier * mapping, args.dry_run)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|