Permalink
Fetching contributors…
Cannot retrieve contributors at this time
268 lines (246 sloc) 9.44 KB
#
# ndmtk - Network Discovery and Management Toolkit
# Copyright (C) 2016 Paul Greenberg @greenpau
# See LICENSE.txt for licensing details
#
# File: setup.py
#
from __future__ import print_function;
try:
from setuptools import setup;
except ImportError:
from ez_setup import use_setuptools;
use_setuptools();
from setuptools.command.install import install;
from setuptools.command.sdist import sdist;
from setuptools.command.test import test;
from setuptools.command.develop import develop;
from setuptools import setup;
from codecs import open;
import traceback;
import unittest;
import os;
import sys;
import re;
import stat;
import unittest;
pkg_name = 'ndmtk';
pkg_ver = '0.2.0';
cmdclass = {};
def _load_test_suite():
test_loader = unittest.TestLoader();
test_suite = test_loader.discover(os.path.join(pkg_dir, pkg_name, 'tests'), pattern='test_*.py');
return test_suite;
def remove_ansible_files(ansible_dirs):
for ansible_dir in ansible_dirs:
for suffix in ['.py', '.pyc']:
for plugin_type in ['plugins/action', 'plugins/callback']:
plugin_file = os.path.join(ansible_dir, plugin_type , pkg_name + suffix);
if os.path.isfile(plugin_file) or os.path.islink(plugin_file):
print("[INFO] found '%s'" % plugin_file);
try:
if os.path.islink(plugin_file):
os.unlink(plugin_file);
else:
os.remove(plugin_file);
print("[INFO] removed '%s'" % plugin_file);
except:
exc_type, exc_value, exc_traceback = sys.exc_info();
print("[ERROR] failed to remove %s %s" % (plugin_file, ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))));
return
def pre_build_toolkit():
for ts in _load_test_suite():
tsr=unittest.TextTestRunner();
tr = tsr.run(ts);
if len(tr.failures) > 0:
for tf in tr.failures:
print('[ERROR] ' + str(tf[1]));
return [];
print("[INFO] checking whether 'ansible' python package is installed ...");
ansible_dirs = _find_py_package('ansible');
if len(ansible_dirs) == 0:
print("[ERROR] 'ansible' python package was not found");
return [];
print("[INFO] the path to 'ansible' python package is: " + str(ansible_dirs));
remove_ansible_files(ansible_dirs);
return ansible_dirs;
def _find_utility(name):
x = any(os.access(os.path.join(path, name), os.X_OK) for path in os.environ["PATH"].split(os.pathsep));
return x;
def _find_py_package(name):
pkg_dirs = [];
for path in sys.path:
if not re.search('site-packages$', path):
continue;
if not os.path.exists(path):
continue;
if not os.path.isdir(path):
continue
target = os.path.join(path, name);
if not os.path.exists(target):
continue;
if not os.path.isdir(target):
continue;
if target not in pkg_dirs:
pkg_dirs.append(target);
return pkg_dirs;
def _post_build_toolkit(ansible_dirs, plugin_dir=None):
if plugin_dir is None:
plugin_dirs = _find_py_package(pkg_name);
if len(plugin_dirs) > 0:
print("[INFO] the path to '" + pkg_name + "' python package is: " + str(plugin_dirs));
for d in plugin_dirs:
if re.search('bdist', d) or re.search('build', d):
continue;
plugin_dir = d;
break;
if plugin_dir is None:
print("[ERROR] failed to find '" + pkg_name + "' python package, aborting!");
return;
if re.search('bdist', plugin_dir) or re.search('build', plugin_dir):
return;
if re.search('site-packages.?$', plugin_dir):
plugin_dir += pkg_name;
print("[INFO] the path to '" + pkg_name + "' python package is: " + str(plugin_dir));
'''
Create a symlink, i.e. `ln -s TARGET LINK_NAME`
'''
_egg_files = [];
for ansible_dir in ansible_dirs:
for i in ['action', 'callback']:
symlink_target = os.path.join(plugin_dir, 'plugins/' + i + '/ndmtk.py');
symlink_name = os.path.join(ansible_dir, 'plugins/' + i + '/ndmtk.py');
try:
os.symlink(symlink_target, symlink_name);
os.chmod(symlink_name, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH);
_egg_files.append(symlink_name);
_egg_files.append(symlink_name + 'c');
print("[INFO] created symlink '" + symlink_name + "' to plugin '" + symlink_target + "'");
except:
exc_type, exc_value, exc_traceback = sys.exc_info();
print('[ERROR] an attempt to create a symlink ' + symlink_name + ' to plugin ' + symlink_target + ' failed, aborting!');
print(traceback.format_exception(exc_type, exc_value, exc_traceback));
return;
class install_(install):
def run(self):
ansible_dirs = pre_build_toolkit();
if len(ansible_dirs) == 0:
return 1;
install.run(self);
if len(ansible_dirs) > 0:
self.execute(_post_build_toolkit, (ansible_dirs, self.install_lib, ), msg="running post_install_scripts");
cmdclass['install'] = install_;
cmdclass['bdist_wheel'] = install_;
class uninstall_(develop):
def run(self):
plugin_dirs = [];
for dp in sys.path:
if not re.search('site-packages$', dp):
continue;
ds = [name for name in os.listdir(dp) if os.path.isdir(os.path.join(dp, name))];
if ds:
for d in ds:
if not re.match(pkg_name, d):
continue;
if os.path.join(dp, d) not in plugin_dirs:
plugin_dirs.append(os.path.join(dp, d));
if plugin_dirs:
for dp in plugin_dirs:
try:
for root, dirs, files in os.walk(dp, topdown=False):
for name in files:
if os.path.islink(os.path.join(root, name)):
os.unlink(os.path.join(root, name));
else:
os.remove(os.path.join(root, name));
for name in dirs:
os.rmdir(os.path.join(root, name));
os.rmdir(dp);
print("[INFO] deleted '" + dp + "'");
except:
print("[INFO] failed to delete '" + dp + "'");
exc_type, exc_value, exc_traceback = sys.exc_info();
print(traceback.format_exception(exc_type, exc_value, exc_traceback));
else:
print("[INFO] no relevant files for the uninstall found, all clean");
ansible_dirs = _find_py_package('ansible');
if len(ansible_dirs) == 0:
print("[ERROR] 'ansible' python package was not found");
return;
remove_ansible_files(ansible_dirs);
return;
cmdclass['uninstall'] = uninstall_;
pkg_dir = os.path.abspath(os.path.dirname(__file__));
pkg_license='OSI Approved :: GNU General Public License v3 or later (GPLv3+)';
pkg_description = 'Network Discovery and Management Toolkit packaged as Ansible Plugin';
pkg_url = 'https://github.com/greenpau/' + pkg_name;
#pkg_download_url = 'http://pypi.python.org/packages/source/' + pkg_name[0] + '/' + pkg_name + '/' + pkg_name + '-' + pkg_ver + '.tar.gz';
pkg_download_url = 'https://github.com/greenpau/ndmtk/archive/master.zip';
pkg_author = 'Paul Greenberg';
pkg_author_email = 'greenpau@outlook.com';
pkg_packages = [pkg_name.lower()];
pkg_requires = ['ansible>=2.0'];
pkg_data=[
'*.yml',
'*.j2',
'tests/*.py',
'plugins/callback/*.py',
'plugins/action/*.py',
'plugins/action/*.j2',
'plugins/action/*.yml',
'plugins/action/files/cli/os/*.yml',
'plugins/action/files/cli/core/*.yml',
'README.rst',
'LICENSE.txt',
];
pkg_platforms='any';
pkg_classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: Console',
'Intended Audience :: Information Technology',
'Intended Audience :: System Administrators',
'Intended Audience :: Telecommunications Industry',
'License :: ' + pkg_license,
'Programming Language :: Python',
'Operating System :: POSIX :: Linux',
'Topic :: Utilities',
'Topic :: System :: Networking',
'Topic :: System :: Networking :: Monitoring',
'Topic :: System :: Systems Administration',
];
pkg_keywords=[
'ansible',
'ansible plugin',
'network',
'ssh',
'telnet',
'console',
'automation',
'network automation',
'network discovery',
];
pkg_test_suite='setup._load_test_suite';
pkg_long_description=pkg_description;
with open(os.path.join(pkg_dir, pkg_name, 'README.rst'), encoding='utf-8') as f:
pkg_long_description = f.read();
setup(
name=pkg_name,
version=pkg_ver,
description=pkg_description,
long_description=pkg_long_description,
url=pkg_url,
download_url=pkg_download_url,
author=pkg_author,
author_email=pkg_author_email,
license=pkg_license,
platforms=pkg_platforms,
classifiers=pkg_classifiers,
packages=pkg_packages,
package_data= {
pkg_name.lower() : pkg_data,
},
keywords=pkg_keywords,
install_requires=pkg_requires,
test_suite=pkg_test_suite,
cmdclass=cmdclass
);