os-xenapi/os_xenapi/utils/xapi_plugin.py

84 lines
2.8 KiB
Python

#!/usr/bin/env python
# Copyright 2017 Citrix Systems
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""XAPI plugin utils
It contains the utilities relative to XAPI plugins."""
import os
import shutil
import sys
import tempfile
from os_xenapi.utils import common_function as fun
from os_xenapi.utils.sshclient import SSHClient
DOM0_PLUGIN_PATH = '/etc/xapi.d/plugins'
PKG_PLUGIN_PATH = 'os_xenapi/dom0/etc/xapi.d/plugins'
OS_XENAPI_PKG = 'os-xenapi'
def get_os_xenapi_dir(version=None):
# Get os-xenapi's directory.
# return (is_tmp_dir, os_xenapi_dir), where is_tmp_dir indicates
# if the os_xenapi_dir is a temporary directory.
is_tmp_dir = False
os_xenapi_dir = None
if version:
# If version is specified, then download the specified package.
# And unpack the package.
temp_dir = tempfile.mkdtemp()
fun.execute('pip', 'download', '--no-deps', '-d', temp_dir,
'%s==%s' % (OS_XENAPI_PKG, version))
fun.execute('unzip', '-d', temp_dir, '%s/*.whl' % temp_dir)
is_tmp_dir = True
os_xenapi_dir = temp_dir
else:
# Check current installed os-xenapi package's location
LOCATION_KEY = 'Location: '
pkg_info = fun.execute('pip', 'show', OS_XENAPI_PKG).split('\n')
for line in pkg_info:
if line.startswith(LOCATION_KEY):
os_xenapi_dir = line[len(LOCATION_KEY):]
break
return (is_tmp_dir, os_xenapi_dir)
def install_plugins_to_dom0(ssh_client, version=None):
is_tmp_dir, dir = get_os_xenapi_dir(version)
plugin_location = '%s/%s' % (dir, PKG_PLUGIN_PATH)
try:
for file in os.listdir(plugin_location):
src_file = '%s/%s' % (plugin_location, file)
dst_file = '%s/%s' % (DOM0_PLUGIN_PATH, file)
ssh_client.scp(src_file, dst_file)
ssh_client.ssh('chmod +x %s' % dst_file)
finally:
if is_tmp_dir:
# delete the temp directory.
shutil.rmtree(dir)
if __name__ == '__main__':
# argv[1]: dom0's IP address
# argv[2]: user name
# argv[3]: user passwd
# argv[4]: os-xenapi version (default None)
ssh_client = SSHClient(sys.argv[1], sys.argv[2], sys.argv[3])
version = None
if len(sys.argv) > 4:
version = sys.argv[4]
install_plugins_to_dom0(ssh_client, version)