1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
#!/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)
|