Mini Shell
"""bakmgr uninstaller"""
import os
import sys
import shutil
from argparse import ArgumentParser
from pathlib import Path
from subprocess import call, check_call, CalledProcessError
def main():
"""Entry point for /opt/bakmgr/bin/bakmgr-uninstall"""
if os.getuid() != 0:
sys.exit('This tool must run as root')
parser = ArgumentParser(description='bakmgr uninstall tool')
parser.add_argument(
'-y', '--yes', action='store_true', help='auto-confirm uninstallation'
)
args = parser.parse_args()
msg = 'This will completely remove bakmgr from the system. Confirm? [y/N] '
if not args.yes and input(msg).strip().lower() not in ('y', 'yes'):
sys.exit('Canceled on user input')
# These are left behind:
# * /etc/bakmgr/auth.json (bakauth registration)
# * /etc/bakmgr/bakmgr.yaml (custom user configuration)
# * /usr/bin/restic (just in case)
remove = [
'/etc/bakmgr/example.yaml',
'/opt/bakmgr',
'/etc/cron.d/bakmgr',
'/etc/logrotate.d/bakmgr',
'/usr/bin/bakmgr',
'/etc/bash_completion.d/bakmgr',
]
for path in remove:
print('Removing', path, '...')
path = Path(path)
if path.is_file():
try:
path.unlink()
except Exception as exc:
print(exc, file=sys.stderr)
elif path.is_dir():
shutil.rmtree(path, onerror=_rmtree_err)
elif path.exists():
print('Unknown Error', file=sys.stderr)
print('Restarting crond ...')
try:
check_call(['killall', '-HUP', '-r', '^crond?$'])
except (FileNotFoundError, CalledProcessError):
print('Failed to restart crond', file=sys.stderr)
service_remove()
def service_remove():
init = Path('/sbin/init').resolve().name
if init == 'systemd' and Path('/usr/lib/systemd/system').is_dir():
print("Removing systemd service")
try:
call(['systemctl', 'stop', 'bakmgr.service'])
call(['systemctl', 'disable', 'bakmgr.service'])
except OSError:
pass
try:
os.remove('/usr/lib/systemd/system/bakmgr.service')
except OSError:
pass
try:
call(['systemctl', 'daemon-reload'])
except OSError:
pass
elif init == 'upstart' and Path('/etc/init').is_dir():
print("Removing upstart servce")
try:
call(['stop', 'bakmgr'])
except OSError:
pass
try:
os.remove('/etc/init/bakmgr.conf')
except OSError:
pass
elif Path('/etc/init.d').is_dir():
print("Removing sysv service")
try:
call(['chkconfig', '--del', 'bakmgr'])
except OSError:
pass
try:
call(['service', 'bakmgr', 'stop'])
except OSError:
pass
try:
os.remove('/etc/init.d/bakmgr')
except OSError:
pass
def _rmtree_err(_func, _path, excinfo):
print(excinfo[1], file=sys.stderr)
if __name__ == '__main__':
main()
Zerion Mini Shell 1.0