npbackup/npbackup/__main__.py

215 lines
5.7 KiB
Python
Raw Normal View History

2023-01-26 08:13:07 +08:00
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
# This file is part of npbackup
2023-12-11 07:37:34 +08:00
__intname__ = "npbackup.cli_interface"
2023-01-26 08:13:07 +08:00
import os
import sys
from argparse import ArgumentParser
import ofunctions.logger_utils
from ofunctions.platform import python_arch
2023-12-11 07:37:34 +08:00
from npbackup.path_helper import CURRENT_DIR
from npbackup.configuration import IS_PRIV_BUILD
2023-01-27 18:42:05 +08:00
from npbackup.customization import (
LICENSE_TEXT,
LICENSE_FILE,
)
2023-12-11 07:37:34 +08:00
from npbackup.interface_entrypoint import entrypoint
from npbackup.__version__ import __intname__ as intname, __version__, __build__, __copyright__, __description__
2023-01-26 08:13:07 +08:00
_DEBUG = False
_VERBOSE = False
LOG_FILE = os.path.join(CURRENT_DIR, "{}.log".format(__intname__))
logger = ofunctions.logger_utils.logger_get_logger(LOG_FILE)
2023-12-11 07:37:34 +08:00
def cli_interface():
2023-01-26 08:13:07 +08:00
global _DEBUG
global _VERBOSE
global CONFIG_FILE
parser = ArgumentParser(
2023-12-11 07:37:34 +08:00
prog=f"{__description__}",
2023-01-26 08:13:07 +08:00
description="""Portable Network Backup Client\n
This program is distributed under the GNU General Public License and comes with ABSOLUTELY NO WARRANTY.\n
This is free software, and you are welcome to redistribute it under certain conditions; Please type --license for more info.""",
)
parser.add_argument(
"--check", action="store_true", help="Check if a recent backup exists"
)
parser.add_argument("-b", "--backup", action="store_true", help="Run a backup")
parser.add_argument(
"--force",
action="store_true",
default=False,
help="Force running a backup regardless of existing backups",
)
parser.add_argument(
"-c",
"--config-file",
dest="config_file",
type=str,
default=None,
required=False,
help="Path to alternative configuration file",
)
2023-12-11 07:37:34 +08:00
parser.add_argument(
"--repo-name",
dest="repo_name",
type=str,
default="default",
required=False,
help="Name of the repository to work with. Defaults to 'default'"
)
2023-09-01 01:38:50 +08:00
2023-01-26 08:13:07 +08:00
parser.add_argument(
"-l", "--list", action="store_true", help="Show current snapshots"
)
parser.add_argument(
"--ls",
type=str,
default=None,
required=False,
2023-01-26 08:26:08 +08:00
help='Show content given snapshot. Use "latest" for most recent snapshot.',
2023-01-26 08:13:07 +08:00
)
parser.add_argument(
"-f",
"--find",
type=str,
default=None,
required=False,
help="Find full path of given file / directory",
)
parser.add_argument(
"-r",
"--restore",
type=str,
default=None,
required=False,
help="Restore to path given by --restore",
)
parser.add_argument(
"--restore-include",
type=str,
default=None,
required=False,
help="Restore only paths within include path",
)
parser.add_argument(
"--restore-from-snapshot",
type=str,
default="latest",
required=False,
help="Choose which snapshot to restore from. Defaults to latest",
)
parser.add_argument(
"--forget", type=str, default=None, required=False, help="Forget snapshot"
)
parser.add_argument(
"--raw", type=str, default=None, required=False, help="Raw commands"
)
parser.add_argument(
"-v", "--verbose", action="store_true", help="Show verbose output"
)
parser.add_argument("-d", "--debug", action="store_true", help="Run with debugging")
parser.add_argument(
"-V", "--version", action="store_true", help="Show program version"
)
parser.add_argument(
2023-01-26 08:26:08 +08:00
"--dry-run",
action="store_true",
help="Run operations in test mode (no actual modifications",
2023-01-26 08:13:07 +08:00
)
parser.add_argument(
2023-01-26 08:26:08 +08:00
"--create-scheduled-task",
type=str,
default=None,
required=False,
2023-04-02 22:00:39 +08:00
help="Create task that runs every n minutes on Windows",
2023-01-26 08:13:07 +08:00
)
parser.add_argument("--license", action="store_true", help="Show license")
2023-02-01 08:51:15 +08:00
parser.add_argument(
2023-02-02 02:06:52 +08:00
"--auto-upgrade", action="store_true", help="Auto upgrade NPBackup"
)
parser.add_argument(
2023-02-02 02:06:52 +08:00
"--upgrade-conf",
action="store_true",
help="Add new configuration elements after upgrade",
)
2023-09-01 01:38:50 +08:00
2023-01-26 08:13:07 +08:00
args = parser.parse_args()
2023-09-01 04:02:36 +08:00
version_string = "{} v{}{}{}-{} {} - {}".format(
2023-12-11 07:37:34 +08:00
intname,
2023-03-21 22:52:43 +08:00
__version__,
2023-12-11 07:37:34 +08:00
"-PRIV" if IS_PRIV_BUILD else "",
2023-03-28 00:23:54 +08:00
"-P{}".format(sys.version_info[1]),
python_arch(),
2023-03-21 22:52:43 +08:00
__build__,
2023-03-28 00:24:38 +08:00
__copyright__,
2023-03-21 22:52:43 +08:00
)
2023-01-26 08:13:07 +08:00
if args.version:
print(version_string)
2023-01-26 08:13:07 +08:00
sys.exit(0)
logger.info(version_string)
2023-01-26 08:13:07 +08:00
if args.license:
try:
2023-03-14 02:36:11 +08:00
with open(LICENSE_FILE, "r", encoding="utf-8") as file_handle:
2023-01-26 08:13:07 +08:00
print(file_handle.read())
except OSError:
print(LICENSE_TEXT)
sys.exit(0)
2023-01-26 08:26:08 +08:00
if args.debug or os.environ.get("_DEBUG", "False").capitalize() == "True":
2023-01-26 08:13:07 +08:00
_DEBUG = True
logger.setLevel(ofunctions.logger_utils.logging.DEBUG)
if args.verbose:
_VERBOSE = True
if args.config_file:
if not os.path.isfile(args.config_file):
logger.critical("Given file {} cannot be read.".format(args.config_file))
CONFIG_FILE = args.config_file
# Program entry
2023-12-11 07:37:34 +08:00
entrypoint()
2023-01-26 08:13:07 +08:00
def main():
2023-01-26 08:13:07 +08:00
try:
2023-12-11 07:37:34 +08:00
cli_interface()
2023-01-26 08:13:07 +08:00
except KeyboardInterrupt as exc:
logger.error("Program interrupted by keyboard. {}".format(exc))
logger.info("Trace:", exc_info=True)
# EXIT_CODE 200 = keyboard interrupt
sys.exit(200)
except Exception as exc:
logger.error("Program interrupted by error. {}".format(exc))
logger.info("Trace:", exc_info=True)
# EXIT_CODE 201 = Non handled exception
sys.exit(201)
if __name__ == "__main__":
main()