### Copyright 1999-2014. Parallels IP Holdings GmbH. All Rights Reserved.
""" wp-cli utility wrapper to execute it under specified system user. """
import os
import pwd, grp
import sys
import subprocess
from optparse import OptionParser

CLIENT_PHP_BIN = "/opt/psa/bin/php-cli"

import plesk_log; plesk_log.setDefaultLevel('warning')
log = plesk_log.getLogger(__name__)

def drop_privileges(user_name, group_name):
    uid = pwd.getpwnam(user_name).pw_uid
    gid = grp.getgrnam(group_name).gr_gid

    os.setgroups([])
    os.setgid(gid)
    os.setuid(uid)

def chdir_ignore_failure(path):
    try:
        os.chdir(path)
        return True
    except OSError as ex:
        log.info("Failed to chdir to '%s': %s", path, ex)
        return False

def doMain(argv):
    parser = OptionParser(usage="Usage: %prog --user <username> [--php <php_interpreter>] -- <wp-cli args>")
    parser.add_option("-u", "--user", help="system user")
    parser.add_option("-p", "--php", help="path to php interpreter")
    (options, args) = parser.parse_args()

    drop_privileges(options.user, "psacln")
    chdir_ignore_failure('/tmp') or chdir_ignore_failure('/')

    os.environ['WP_CLI_PHP'] = options.php if options.php else CLIENT_PHP_BIN
    php_args = [
        "-d safe_mode=off",
        "-d display_errors=off",
        "-d opcache.enable_cli=off",
        "-d open_basedir=",
    ]
    os.environ['WP_CLI_PHP_ARGS'] = " ".join(php_args)
    os.environ['WP_CLI_CONFIG_PATH'] = "/usr/share/plesk-wp-cli/wp-cli.yml"
    sys.exit(subprocess.call(["/usr/share/plesk-wp-cli/bin/wp"] + args))

def main():
    try:
        doMain(sys.argv)
    except SystemExit:
        raise
    except Exception as ex:
        log.error('%s', ex)
        log.debug('This exception happened at:', exc_info=sys.exc_info())
        sys.exit(1)

if __name__ == '__main__':
	main()

# vim: ts=4 sts=4 sw=4 et :
