cli config file
This commit is contained in:
parent
0482dcc3ac
commit
11a82da4a0
|
@ -67,8 +67,8 @@ as private or upload images. You may want to run this before starting the server
|
||||||
That's it - you've set up Photolib! Next steps from here would be to the other command line tools to import media.
|
That's it - you've set up Photolib! Next steps from here would be to the other command line tools to import media.
|
||||||
|
|
||||||
Besides browsing, most interaction with Photolib will be done using its CLI tool, `photocli`. Note that server address,
|
Besides browsing, most interaction with Photolib will be done using its CLI tool, `photocli`. Note that server address,
|
||||||
username, and password details need to be provided via flags not shown here to in a config file. See `photocli --help`
|
username, and password details need to be provided to the cli via a url flag not shown here. See `photocli --help` for
|
||||||
for more information.
|
more information.
|
||||||
|
|
||||||
|
|
||||||
Commands
|
Commands
|
||||||
|
|
|
@ -7,8 +7,44 @@ from photoapp.utils import get_extension
|
||||||
from photoapp.types import known_extensions, PhotoStatus
|
from photoapp.types import known_extensions, PhotoStatus
|
||||||
from photoapp.common import pwhash
|
from photoapp.common import pwhash
|
||||||
from photoapp.ingest import get_photosets
|
from photoapp.ingest import get_photosets
|
||||||
|
from urllib.parse import urlparse
|
||||||
from tabulate import tabulate
|
from tabulate import tabulate
|
||||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||||
|
import appdirs
|
||||||
|
|
||||||
|
|
||||||
|
APPNAME = "photocli"
|
||||||
|
DEFAULT_CONFIG = {"uri": None,
|
||||||
|
"lastbatch": None}
|
||||||
|
|
||||||
|
|
||||||
|
class CliConfig(dict):
|
||||||
|
def __init__(self, appname, default):
|
||||||
|
self.confdir = appdirs.user_config_dir(appname)
|
||||||
|
self.confpath = os.path.join(self.confdir, "cli.json")
|
||||||
|
super().__init__(**default)
|
||||||
|
self.init_config()
|
||||||
|
|
||||||
|
def init_config(self):
|
||||||
|
os.makedirs(self.confdir, exist_ok=True)
|
||||||
|
if os.path.exists(self.confpath):
|
||||||
|
self.load()
|
||||||
|
else:
|
||||||
|
self.write()
|
||||||
|
|
||||||
|
def load(self):
|
||||||
|
with open(self.confpath) as f:
|
||||||
|
self.update(**json.load(f))
|
||||||
|
|
||||||
|
def write(self):
|
||||||
|
with open(self.confpath, "w") as f:
|
||||||
|
json.dump(self, f, indent=4)
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
if key not in self:
|
||||||
|
raise KeyError(key)
|
||||||
|
super().__setitem__(key, value)
|
||||||
|
self.write()
|
||||||
|
|
||||||
|
|
||||||
class PhotoApiClient(object):
|
class PhotoApiClient(object):
|
||||||
|
@ -86,9 +122,7 @@ def confirm(message, options=None, accept=None, confirm_msg="Are you sure?"):
|
||||||
def get_args():
|
def get_args():
|
||||||
parser = argparse.ArgumentParser(description="photo library cli")
|
parser = argparse.ArgumentParser(description="photo library cli")
|
||||||
# TODO nicer uri parser
|
# TODO nicer uri parser
|
||||||
parser.add_argument("--host", required=True, help="photo library server address")
|
parser.add_argument("--host", default=os.environ.get("PHOTOLIB_URI", None), help="photo api server address")
|
||||||
parser.add_argument("--user", required=True)
|
|
||||||
parser.add_argument("--password", required=True)
|
|
||||||
parser.add_argument("-y", "--yes", action="store_true", help="assume yes for all prompts")
|
parser.add_argument("-y", "--yes", action="store_true", help="assume yes for all prompts")
|
||||||
|
|
||||||
sp_action = parser.add_subparsers(dest="action", help="action to take")
|
sp_action = parser.add_subparsers(dest="action", help="action to take")
|
||||||
|
@ -122,13 +156,22 @@ def get_args():
|
||||||
p_delete = p_useraction.add_parser('delete', help='delete users')
|
p_delete = p_useraction.add_parser('delete', help='delete users')
|
||||||
p_delete.add_argument("-u", "--username", help="username", required=True)
|
p_delete.add_argument("-u", "--username", help="username", required=True)
|
||||||
|
|
||||||
return parser.parse_args()
|
return parser.parse_args(), parser
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
args = get_args()
|
config = CliConfig(APPNAME, DEFAULT_CONFIG)
|
||||||
|
args, parser = get_args()
|
||||||
|
|
||||||
client = PhotoApiClient(args.host, (args.user, args.password, ))
|
uri = urlparse(args.host or config["uri"])
|
||||||
|
|
||||||
|
if not uri.netloc:
|
||||||
|
parser.error("need --host, $PHOTOLIB_URI, or config file")
|
||||||
|
|
||||||
|
config["uri"] = uri.geturl()
|
||||||
|
|
||||||
|
port = f":{uri.port}" if uri.port else ""
|
||||||
|
client = PhotoApiClient(f"{uri.scheme}://{uri.hostname}{port}", (uri.username, uri.password, ))
|
||||||
|
|
||||||
if args.action == "checkdupes":
|
if args.action == "checkdupes":
|
||||||
hashes = {}
|
hashes = {}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
appdirs==1.4.3
|
||||||
backports.functools-lru-cache==1.5
|
backports.functools-lru-cache==1.5
|
||||||
boto3==1.9.183
|
boto3==1.9.183
|
||||||
botocore==1.12.183
|
botocore==1.12.183
|
||||||
|
|
Loading…
Reference in New Issue