matrix/matrix.py

73 lines
2.1 KiB
Python
Raw Permalink Normal View History

2018-06-23 11:01:08 +02:00
#!/usr/bin/env python3
# Copyright (c) 2018, Paul Lecuq
# All rights reserved.
# BSD Licensed
# Matrix is a small program that saves permissions on directory to a file and can restore it
# on another directory (or another machine)
import os
import argparse
mode = ""
backup_file = ""
rep = ""
parser = argparse.ArgumentParser(description='Parse arguments')
2020-04-25 22:57:20 +02:00
parser.add_argument('mode', metavar='mode', type=str, choices=['backup', 'restore'], help='Mode')
2018-06-23 11:01:08 +02:00
parser.add_argument('backup_file', metavar='backup_file', type=str, help='Backup file')
parser.add_argument('directory', metavar='directory', type=str, help='Directory')
args = parser.parse_args()
mode = args.mode
backup_file = args.backup_file
2020-04-25 22:57:20 +02:00
directory = args.directory
2018-06-23 11:01:08 +02:00
def backup():
2020-04-25 22:57:20 +02:00
i = 0
with open(backup_file, "w+") as file_desc:
result = []
for root_dir, dirs, files in os.walk(directory):
for d in dirs:
res = os.path.join(root_dir, d)
result.append(res)
for f in files:
res = os.path.join(root_dir, f)
result.append(res)
for f_name in result:
try:
i += 1
f_uid = os.stat(f_name).st_uid
f_gid = os.stat(f_name).st_gid
f_perm = str(oct(os.stat(f_name).st_mode))
line = "{}|{}|{}|{}\n".format(f_name, f_uid, f_gid, f_perm)
file_desc.write(line)
except OSError:
pass
print("Backup {} files permissions, storing to {}".format(i, backup_file))
2018-06-23 11:01:08 +02:00
def restore():
2020-04-25 22:57:20 +02:00
i = 0
with open(backup_file, "r+") as file_desc:
for f in file_desc:
line = f.strip("\n")
f_name = line.split('|')[0]
f_uid = line.split('|')[1]
f_gid = line.split('|')[2]
f_perm = line.split('|')[3]
try:
os.chmod(f_name, int(f_perm, 8))
os.chown(f_name, int(f_uid), int(f_gid))
except OSError:
pass
i += 1
print("Restored {} files permissions".format(i))
2018-06-23 11:01:08 +02:00
if mode == "backup":
backup()
elif mode == "restore":
restore()