Files
podman/contrib/python/cmd/remote_client.py
baude 60427ab3d2 add podman remote client
podman client that is capable of:
 * images
 * ps
 * rm
 * rmi

this is only a mockup to frame out and prove python library and ssh
tunnelling usage.

Signed-off-by: baude <bbaude@redhat.com>

Closes: #986
Approved by: rhatdan
2018-06-27 04:52:22 +00:00

136 lines
4.5 KiB
Python

import os
import getpass
import argparse
import images
import ps, rm, rmi
import sys
from utils import write_err
import pytoml
default_conf_path = "/etc/containers/podman_client.conf"
class HelpByDefaultArgumentParser(argparse.ArgumentParser):
def error(self, message):
write_err('%s: %s' % (self.prog, message))
write_err("Try '%s --help' for more information." % self.prog)
sys.exit(2)
def print_usage(self, message="too few arguments"): # pylint: disable=arguments-differ
self.prog = " ".join(sys.argv)
self.error(message)
def create_parser(help_text):
parser = HelpByDefaultArgumentParser(description=help_text)
parser.add_argument('-v', '--version', action='version', version="0.0",
help=("show rpodman version and exit"))
parser.add_argument('--debug', default=False, action='store_true',
help=("show debug messages"))
parser.add_argument('--run_dir', dest="run_dir",
help=("directory to place socket bindings"))
parser.add_argument('--user', dest="user",
help=("remote user"))
parser.add_argument('--host', dest="host",
help=("remote host"))
parser.add_argument('--remote_socket_path', dest="remote_socket_path",
help=("remote socket path"))
parser.add_argument('--identity_file', dest="identity_file",
help=("path to identity file"))
subparser = parser.add_subparsers(help=("commands"))
images.cli(subparser)
ps.cli(subparser)
rm.cli(subparser)
rmi.cli(subparser)
return parser
def load_toml(path):
# Lets load the configuration file
with open(path) as stream:
return pytoml.load(stream)
if __name__ == '__main__':
host = None
remote_socket_path = None
user = None
run_dir = None
aparser = create_parser("podman remote tool")
args = aparser.parse_args()
if not os.path.exists(default_conf_path):
conf = {"default": {}}
else:
conf = load_toml("/etc/containers/podman_client.conf")
# run_dir
if "run_dir" in os.environ:
run_dir = os.environ["run_dir"]
elif "run_dir" in conf["default"] and conf["default"]["run_dir"] is not None:
run_dir = conf["default"]["run_dir"]
else:
xdg = os.environ["XDG_RUNTIME_DIR"]
run_dir = os.path.join(xdg, "podman")
# make the run_dir if it doesnt exist
if not os.path.exists(run_dir):
os.makedirs(run_dir)
local_socket_path = os.path.join(run_dir, "podman.socket")
# remote host
if "host" in os.environ:
host = os.environ["host"]
elif getattr(args, "host") is not None:
host = getattr(args, "host")
else:
host = conf["default"]["host"] if "host" in conf["default"] else None
# remote user
if "user" in os.environ:
user = os.environ["user"]
elif getattr(args, "user") is not None:
user = getattr(args, "user")
elif "user" in conf["default"] and conf["default"]["user"] is not None:
user = conf["default"]["user"]
else:
user = getpass.getuser()
# remote path
if "remote_socket_path" in os.environ:
remote_socket_path = os.environ["remote_socket_path"]
elif getattr(args, "remote_socket_path") is not None:
remote_socket_path = getattr(args, "remote_socket_path")
elif "remote_socket_path" in conf["default"] and conf["default"]["remote_socket_path"]:
remote_socket_path = conf["default"]["remote_socket_path"]
else:
remote_socket_path = None
# identity file
if "identity_file" in os.environ:
identity_file = os.environ["identity_file"]
elif getattr(args, "identity_file") is not None:
identity_file = getattr(args, "identity_file")
elif "identity_file" in conf["default"] and conf["default"]["identity_file"] is not None:
identity_file = conf["default"]["identity_file"]
else:
identity_file = None
if None in [host, local_socket_path, user, remote_socket_path]:
print("missing input for local_socket, user, host, or remote_socket_path")
sys.exit(1)
local_uri = "unix:{}".format(local_socket_path)
remote_uri = "ssh://{}@{}{}".format(user, host, remote_socket_path)
_class = args._class() # pylint: disable=protected-access
_class.set_args(args, local_uri, remote_uri, identity_file)
if "func" in args:
_func = getattr(_class, args.func)
sys.exit(_func())
else:
aparser.print_usage()
sys.exit(1)