mirror of https://github.com/Icinga/icinga2.git
parent
db3abacde0
commit
425dbba35b
|
@ -164,7 +164,6 @@ add_subdirectory(doc)
|
|||
add_subdirectory(test)
|
||||
add_subdirectory(pki)
|
||||
add_subdirectory(agent)
|
||||
add_subdirectory(python)
|
||||
|
||||
set(CPACK_PACKAGE_NAME "Icinga2")
|
||||
set(CPACK_PACKAGE_VENDOR "Icinga Development Team")
|
||||
|
|
|
@ -25,7 +25,6 @@ parentheses):
|
|||
* Boost library and header files (boost-devel on RHEL, libboost-all-dev on Debian)
|
||||
* GNU bison (bison)
|
||||
* GNU flex (flex) >= 2.5.35
|
||||
* Python (python-devel on RHEL, python-dev on Debian)
|
||||
* recommended: libexecinfo on FreeBSD
|
||||
* optional: MySQL (mysql-devel on RHEL, libmysqlclient-dev on Debian)
|
||||
* optional: PostgreSQL (postgresql-devel on RHEL, libpq-dev on Debian)
|
||||
|
|
|
@ -20,9 +20,7 @@ Build-Depends: bison,
|
|||
libpq-dev,
|
||||
libssl-dev,
|
||||
make (>= 3.81),
|
||||
po-debconf,
|
||||
python-setuptools,
|
||||
python-all
|
||||
po-debconf
|
||||
Standards-Version: 3.9.5
|
||||
Homepage: http://www.icinga.org
|
||||
|
||||
|
@ -54,7 +52,7 @@ Description: host and network monitoring system
|
|||
|
||||
Package: icinga2-common
|
||||
Architecture: all
|
||||
Depends: python-icinga2 (= ${source:Version}), adduser, lsb-release, ${misc:Depends}
|
||||
Depends: adduser, lsb-release, ${misc:Depends}
|
||||
Description: host and network monitoring system - common files
|
||||
Icinga 2 is a general-purpose monitoring application and the next generation
|
||||
after Icinga 1.x - which was a Nagios fork. It should fit the needs of a small
|
||||
|
@ -241,27 +239,3 @@ Description: host and network monitoring system - debug symbols
|
|||
.
|
||||
This package provides debug symbols for Icinga 2.
|
||||
|
||||
Package: python-icinga2
|
||||
Architecture: all
|
||||
Section: python
|
||||
Priority: extra
|
||||
Depends: python-pkg-resources, ${misc:Depends}, ${python:Depends}
|
||||
Description: host and network monitoring system - Python module
|
||||
Icinga 2 is a general-purpose monitoring application and the next generation
|
||||
after Icinga 1.x - which was a Nagios fork. It should fit the needs of a small
|
||||
environment as well as big installations.
|
||||
.
|
||||
Rewritten from scratch in C++, with multi-threading and cluster support.
|
||||
.
|
||||
Features:
|
||||
* All common features of Icinga and Nagios
|
||||
* Much faster and more scalable than Icinga 1 and Nagios
|
||||
* New configuration format, more intuitive and template based
|
||||
* Monitoring several services by executing checks (see nagios-plugins*)
|
||||
for example ICMP/ping, SMTP, POP3, HTTP, NNTP, or other TCP port
|
||||
* Any small script can be used as a check plugin, when following the Nagios
|
||||
plugin API
|
||||
* Notifications about alerts with any custom script, or shipped examples
|
||||
* Native support for Livestatus and Graphite
|
||||
.
|
||||
This package provides the Python module for Icinga 2.
|
||||
|
|
|
@ -5,7 +5,6 @@ debian/tmp/etc/bash_completion.d
|
|||
tools/syntax/* usr/share/icinga2-common/syntax
|
||||
usr/bin/icinga2-build*
|
||||
usr/bin/icinga2-sign-key
|
||||
usr/sbin/icinga2-list-objects
|
||||
usr/sbin/icinga2-*-agent
|
||||
usr/sbin/icinga2-list-agents
|
||||
usr/share/icinga2
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
usr/lib/python*/
|
|
@ -3,7 +3,7 @@
|
|||
#export DH_VERBOSE=1
|
||||
|
||||
%:
|
||||
dh $@ --with python2
|
||||
dh $@
|
||||
|
||||
override_dh_auto_clean:
|
||||
ifeq ($(shell test -d .git && echo "git"),git) # verify we are in a GIT repo
|
||||
|
|
21
icinga2.spec
21
icinga2.spec
|
@ -49,10 +49,6 @@
|
|||
%endif
|
||||
%endif
|
||||
|
||||
%{!?__python2: %global __python2 /usr/bin/python2}
|
||||
%{!?python2_sitelib: %global python2_sitelib %(%{__python2} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")}
|
||||
%{!?python2_sitearch: %global python2_sitearch %(%{__python2} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
|
||||
|
||||
%define icinga_user icinga
|
||||
%define icinga_group icinga
|
||||
%define icingacmd_group icingacmd
|
||||
|
@ -81,7 +77,6 @@ Meta package for Icinga 2 Core, DB IDO and Web.
|
|||
Summary: Icinga 2 binaries and libraries
|
||||
Group: Applications/System
|
||||
|
||||
Requires: python-%{name} = %{version}-%{release}
|
||||
%if "%{_vendor}" == "suse"
|
||||
PreReq: permissions
|
||||
Provides: monitoring_daemon
|
||||
|
@ -180,17 +175,6 @@ Icinga 1.x Classic UI Standalone configuration with locations
|
|||
for Icinga 2.
|
||||
|
||||
|
||||
%package -n python-icinga2
|
||||
Summary: Python module for Icinga 2
|
||||
Group: Application/System
|
||||
BuildRequires: python
|
||||
BuildRequires: python-devel
|
||||
BuildRequires: python-setuptools
|
||||
Requires: python-setuptools
|
||||
|
||||
%description -n python-icinga2
|
||||
Provides a Python module for Icinga 2.
|
||||
|
||||
%prep
|
||||
%setup -q -n %{name}-%{version}
|
||||
|
||||
|
@ -534,9 +518,4 @@ exit 0
|
|||
%config(noreplace) %{apacheconfdir}/icinga.conf
|
||||
%config(noreplace) %attr(0640,root,%{apachegroup}) %{icingaclassicconfdir}/passwd
|
||||
|
||||
%files -n python-icinga2
|
||||
%defattr(-,root,root,-)
|
||||
%{python2_sitelib}/icinga2*
|
||||
|
||||
|
||||
%changelog
|
||||
|
|
|
@ -1,45 +0,0 @@
|
|||
# Icinga 2
|
||||
# Copyright (C) 2012-2014 Icinga Development Team (http://www.icinga.org)
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
if(NOT WIN32)
|
||||
find_package(PythonInterp REQUIRED)
|
||||
|
||||
add_subdirectory(icinga2)
|
||||
|
||||
configure_file(setup.py.cmake ${CMAKE_CURRENT_BINARY_DIR}/setup.py @ONLY)
|
||||
|
||||
install(CODE "
|
||||
execute_process(
|
||||
COMMAND \"${CMAKE_COMMAND}\"
|
||||
\"-DSETUP_PY=${CMAKE_CURRENT_BINARY_DIR}/setup.py\"
|
||||
\"-DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}\"
|
||||
\"-DPREFIX=${CMAKE_INSTALL_PREFIX}\"
|
||||
\"-DWDIR=${CMAKE_CURRENT_BINARY_DIR}\"
|
||||
-P \"${PROJECT_SOURCE_DIR}/third-party/cmake/PythonSetup.cmake\"
|
||||
)
|
||||
|
||||
configure_file(
|
||||
\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_BINDIR}/icinga2-list-objects
|
||||
\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_SBINDIR}/icinga2-list-objects COPYONLY}
|
||||
)
|
||||
|
||||
file(
|
||||
REMOVE
|
||||
\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_BINDIR}/icinga2-list-objects
|
||||
)"
|
||||
)
|
||||
endif()
|
|
@ -1,23 +0,0 @@
|
|||
# Icinga 2
|
||||
# Copyright (C) 2012-2014 Icinga Development Team (http://www.icinga.org)
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
add_subdirectory(commands)
|
||||
add_subdirectory(utils)
|
||||
|
||||
configure_file(config.py.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.py @ONLY)
|
||||
configure_file(__init__.py ${CMAKE_CURRENT_BINARY_DIR}/__init__.py COPYONLY)
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
# Icinga 2
|
||||
# Copyright (C) 2012-2014 Icinga Development Team (http://www.icinga.org)
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
configure_file(__init__.py ${CMAKE_CURRENT_BINARY_DIR}/__init__.py COPYONLY)
|
||||
configure_file(list_objects.py ${CMAKE_CURRENT_BINARY_DIR}/list_objects.py COPYONLY)
|
||||
|
|
@ -1,74 +0,0 @@
|
|||
# Icinga 2
|
||||
# Copyright (C) 2012-2014 Icinga Development Team (http://www.icinga.org)
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
import os, sys, getopt, codecs
|
||||
from icinga2.utils.debug import ObjectsFileReader
|
||||
from icinga2.config import LocalStateDir
|
||||
from signal import signal, SIGPIPE, SIG_DFL
|
||||
|
||||
def main():
|
||||
signal(SIGPIPE, SIG_DFL)
|
||||
|
||||
color_mode = 'auto'
|
||||
|
||||
try:
|
||||
opts, args = getopt.getopt(sys.argv[1:], "h", ["help", "color"])
|
||||
except getopt.GetoptError:
|
||||
t, err = sys.exc_info()[:2]
|
||||
# print help information and exit:
|
||||
print str(err) # will print something like "option -a not recognized"
|
||||
usage()
|
||||
sys.exit(2)
|
||||
output = None
|
||||
verbose = False
|
||||
for o, a in opts:
|
||||
if o in ("-h", "--help"):
|
||||
usage()
|
||||
sys.exit()
|
||||
elif o == "--color":
|
||||
color_mode = 'always'
|
||||
else:
|
||||
assert False, "unhandled option"
|
||||
|
||||
if len(args) > 0:
|
||||
fname = args[0]
|
||||
else:
|
||||
fname = LocalStateDir + "/cache/icinga2/icinga2.debug"
|
||||
|
||||
if color_mode == 'always':
|
||||
use_colors = True
|
||||
elif color_mode == 'never':
|
||||
use_colors = False
|
||||
else:
|
||||
use_colors = os.isatty(1)
|
||||
|
||||
fp = open(fname)
|
||||
ofr = ObjectsFileReader(fp)
|
||||
for obj in ofr:
|
||||
print codecs.encode(obj.format(use_colors), 'utf8')
|
||||
|
||||
def usage():
|
||||
print "Syntax: %s [--help|-h] [--color] [file]" % (sys.argv[0])
|
||||
print "Displays a list of objects from the specified Icinga 2 objects file."
|
||||
print ""
|
||||
print "Arguments:"
|
||||
print " --help or -h Displays this help message."
|
||||
print " --color Enables using color codes even if standard output"
|
||||
print " is not a terminal."
|
||||
print ""
|
||||
print "You can specify an alternative path for the Icinga 2 objects file. By"
|
||||
print "default '" + LocalStateDir + "/cache/icinga2/icinga2.debug' is used."
|
|
@ -1,24 +0,0 @@
|
|||
# Icinga 2
|
||||
# Copyright (C) 2012-2014 Icinga Development Team (http://www.icinga.org)
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
Prefix = '@CMAKE_INSTALL_PREFIX@'
|
||||
SysconfDir = '@CMAKE_INSTALL_FULL_SYSCONFDIR@'
|
||||
RunDir = '@ICINGA2_RUNDIR@'
|
||||
LocalStateDir = '@CMAKE_INSTALL_FULL_LOCALSTATEDIR@'
|
||||
PkgDataDir = '@CMAKE_INSTALL_FULL_DATADIR@/icinga2'
|
||||
IncludeConfDir = '@CMAKE_INSTALL_FULL_DATADIR@/icinga2/include'
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
# Icinga 2
|
||||
# Copyright (C) 2012-2014 Icinga Development Team (http://www.icinga.org)
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
configure_file(__init__.py ${CMAKE_CURRENT_BINARY_DIR}/__init__.py COPYONLY)
|
||||
configure_file(debug.py ${CMAKE_CURRENT_BINARY_DIR}/debug.py COPYONLY)
|
||||
configure_file(netstring.py ${CMAKE_CURRENT_BINARY_DIR}/netstring.py COPYONLY)
|
||||
|
|
@ -1,136 +0,0 @@
|
|||
# Icinga 2
|
||||
# Copyright (C) 2012-2014 Icinga Development Team (http://www.icinga.org)
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
from icinga2.utils import netstring
|
||||
import subprocess
|
||||
import codecs
|
||||
|
||||
try:
|
||||
import json
|
||||
except ImportError:
|
||||
import simplejson as json
|
||||
|
||||
def trydecode(inc_string):
|
||||
try:
|
||||
return codecs.decode(inc_string, 'utf8')
|
||||
except UnicodeDecodeError:
|
||||
try:
|
||||
return inc_string.decode('Windows-1252')
|
||||
except UnicodeDecodeError:
|
||||
return inc_string.decode('ISO 8859-1')
|
||||
|
||||
class ConsoleColors(object):
|
||||
@staticmethod
|
||||
def _exec(args):
|
||||
return subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0]
|
||||
|
||||
def __init__(self):
|
||||
self.RESET = ConsoleColors._exec(['tput', 'sgr0'])
|
||||
self.GREEN = ConsoleColors._exec(['tput', 'setaf', '2'])
|
||||
self.CYAN = ConsoleColors._exec(['tput', 'setaf', '6'])
|
||||
|
||||
_colors = ConsoleColors()
|
||||
|
||||
class DebugObject(object):
|
||||
def __init__(self, obj):
|
||||
self._obj = obj
|
||||
|
||||
def format(self, use_colors=False):
|
||||
if self._obj["abstract"]:
|
||||
result = u"Template '"
|
||||
else:
|
||||
result = u"Object '"
|
||||
result += self._obj["properties"]["__name"] + u"' of type '" + self._obj["type"] + u"':\n"
|
||||
result += self.format_properties(use_colors, 2)
|
||||
return result
|
||||
|
||||
@staticmethod
|
||||
def format_value(value):
|
||||
if isinstance(value, list):
|
||||
result = u""
|
||||
for avalue in value:
|
||||
if result != u"":
|
||||
result += u", "
|
||||
result += DebugObject.format_value(avalue)
|
||||
return u"[%s]" % result
|
||||
elif isinstance(value, basestring):
|
||||
return u"'%s'" % value
|
||||
else:
|
||||
return str(value)
|
||||
|
||||
def format_properties(self, use_colors=False, indent=0, path=[]):
|
||||
props = self._obj["properties"]
|
||||
for component in path:
|
||||
props = props[component]
|
||||
|
||||
if use_colors:
|
||||
color_begin = _colors.GREEN
|
||||
color_end = _colors.RESET
|
||||
else:
|
||||
color_begin = u''
|
||||
color_end = u''
|
||||
|
||||
result = u""
|
||||
for key, value in props.items():
|
||||
path.append(key)
|
||||
result += u' ' * indent + u"* %s%s%s" % (color_begin, key, color_end)
|
||||
hints = self.format_hints(use_colors, indent + 2, path)
|
||||
if isinstance(value, dict):
|
||||
result += u"\n" + hints
|
||||
result += self.format_properties(use_colors, indent + 2, path)
|
||||
else:
|
||||
result += u" = %s\n" % (DebugObject.format_value(value))
|
||||
result += hints
|
||||
path.pop()
|
||||
return result
|
||||
|
||||
def format_hints(self, use_colors, indent=0, path=[]):
|
||||
dhints = self._obj["debug_hints"]
|
||||
try:
|
||||
for component in path:
|
||||
dhints = dhints["properties"][component]
|
||||
except KeyError:
|
||||
return u""
|
||||
|
||||
if use_colors:
|
||||
color_begin = _colors.CYAN
|
||||
color_end = _colors.RESET
|
||||
else:
|
||||
color_begin = u''
|
||||
color_end = u''
|
||||
|
||||
result = u""
|
||||
for message in dhints["messages"]:
|
||||
result += u' ' * indent + u"%% %smodified in %s, lines %s:%s-%s:%s%s\n" % (color_begin,
|
||||
message[1], message[2], message[3], message[4], message[5], color_end)
|
||||
return result
|
||||
|
||||
class ObjectsFileReader(object):
|
||||
def __init__(self, file):
|
||||
self._file = file
|
||||
|
||||
def __iter__(self):
|
||||
fr = netstring.FileReader(self._file)
|
||||
|
||||
while True:
|
||||
try:
|
||||
json_data = trydecode((fr.readskip()))
|
||||
except EOFError:
|
||||
break
|
||||
if json_data == u"":
|
||||
break
|
||||
yield DebugObject(json.loads(json_data))
|
|
@ -1,305 +0,0 @@
|
|||
#!/usr/bin/python
|
||||
# netstring.py - Netstring encoding/decoding routines.
|
||||
# Version 1.1 - July 2003
|
||||
# http://www.dlitz.net/software/python-netstring/
|
||||
#
|
||||
# Copyright (c) 2003 Dwayne C. Litzenberger <dlitz@dlitz.net>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
# HISTORY:
|
||||
#
|
||||
# Changes between 1.0 and 1.1:
|
||||
# - Renamed Reader to BaseReader. Use FileReader and StringReader instead.
|
||||
# - Added BaseReader.readskip()
|
||||
# - Switched to saner stream reading semantics. Now the stream is not read
|
||||
# until information is requested which requires it to be read.
|
||||
# - Added split()
|
||||
#
|
||||
|
||||
from __future__ import generators
|
||||
import StringIO
|
||||
|
||||
"""Conversions to/from netstring format.
|
||||
|
||||
The netstring format is defined in http://cr.yp.to/proto/netstrings.txt
|
||||
(or http://www.dlitz.net/proto/netstrings-abnf.txt if you prefer ABNF)
|
||||
|
||||
Classes:
|
||||
|
||||
BaseReader (not to be used directly)
|
||||
FileReader
|
||||
StringReader
|
||||
|
||||
Functions:
|
||||
|
||||
dump
|
||||
dumps
|
||||
load
|
||||
loads
|
||||
split
|
||||
|
||||
Misc variables:
|
||||
|
||||
maxintlen - Maximum number of digits when reading integers
|
||||
|
||||
"""
|
||||
|
||||
__all__ = ['BaseReader', 'FileReader', 'StringReader',
|
||||
'dump', 'dumps', 'load', 'loads', 'split']
|
||||
|
||||
maxintlen = 999 # Maximum number of digits when reading integers
|
||||
# This allows numbers up to 10**1000 - 1, which should
|
||||
# be large enough for most applications. :-)
|
||||
|
||||
|
||||
def dump(s, file):
|
||||
"""dump(s, file) -> None
|
||||
|
||||
Writes the string s as a netstring to file.
|
||||
"""
|
||||
file.write(dumps(s))
|
||||
|
||||
|
||||
def dumps(s):
|
||||
"""dumps(s) -> string
|
||||
|
||||
Encodes the string s as a netstring, and returns the result.
|
||||
"""
|
||||
return str(len(s)) + ":" + s + ","
|
||||
|
||||
|
||||
def load(file, maxlen=None):
|
||||
"""load(file, maxlen=None) -> string
|
||||
|
||||
Read a netstring from a file, and return the extracted netstring.
|
||||
|
||||
If the parsed string would be longer than maxlen, OverflowError is raised.
|
||||
"""
|
||||
n = _readlen(file)
|
||||
if maxlen is not None and n > maxlen:
|
||||
raise OverflowError
|
||||
retval = file.read(n)
|
||||
#assert(len(retval) == n)
|
||||
ch = file.read(1)
|
||||
if ch == "":
|
||||
raise EOFError
|
||||
elif ch != ",":
|
||||
raise ValueError
|
||||
return retval
|
||||
|
||||
|
||||
def loads(s, maxlen=None, returnUnparsed=False):
|
||||
"""loads(s, maxlen=None, returnUnparsed=False) -> string or (string,
|
||||
string)
|
||||
|
||||
Extract a netstring from a string. If returnUnparsed is false, return the
|
||||
decoded netstring, otherwise return a tuple (parsed, unparsed) containing both
|
||||
the parsed string and the remaining unparsed part of s.
|
||||
|
||||
If the parsed string would be longer than maxlen, OverflowError is raised.
|
||||
"""
|
||||
f = StringIO.StringIO(s)
|
||||
parsed = load(f, maxlen=maxlen)
|
||||
if not returnUnparsed:
|
||||
return parsed
|
||||
unparsed = f.read()
|
||||
return parsed, unparsed
|
||||
|
||||
|
||||
def _readlen(file):
|
||||
"""_readlen(file) -> integer
|
||||
|
||||
Read the initial "[length]:" of a netstring from file, and return the length.
|
||||
"""
|
||||
i = 0
|
||||
n = ""
|
||||
ch = file.read(1)
|
||||
while ch != ":":
|
||||
if ch == "":
|
||||
raise EOFError
|
||||
elif not ch in "0123456789":
|
||||
raise ValueError
|
||||
n += ch
|
||||
i += 1
|
||||
if i > maxintlen:
|
||||
raise OverflowError
|
||||
ch = file.read(1)
|
||||
#assert(ch == ":")
|
||||
return long(n)
|
||||
|
||||
|
||||
def split(s):
|
||||
"""split(s) -> list of strings
|
||||
|
||||
Return a list of the decoded netstrings in s.
|
||||
"""
|
||||
if s == "":
|
||||
raise EOFError
|
||||
retval = []
|
||||
unparsed = s
|
||||
while unparsed != "":
|
||||
parsed, unparsed = loads(unparsed, returnUnparsed=True)
|
||||
retval.append(parsed)
|
||||
return retval
|
||||
|
||||
|
||||
class BaseReader:
|
||||
"""BaseReader(file, maxlen=None, blocksize=1024) -> BaseReader object
|
||||
|
||||
Return a new BaseReader object. BaseReader allows reading a
|
||||
netstring in blocks, instead of reading an netstring into memory at once.
|
||||
|
||||
If BaseReader encounters a netstring which is larger than maxlen, it will return
|
||||
OverflowError. BaseReader will also return ValueError if it encounters bad
|
||||
formatting, or EOFError if an unexpected attempt is made to read beyond the
|
||||
end of file.
|
||||
|
||||
The state of BaseReader is undefined once any exception other than StopIteration
|
||||
is raised.
|
||||
|
||||
blocksize is the size of blocks to use when iterating over the BaseReader class.
|
||||
You should not use BaseReader except when subclassing. Use FileReader or one
|
||||
of the other *Reader classes instead.
|
||||
"""
|
||||
|
||||
def __init__(self, file, maxlen=None, blocksize=1024):
|
||||
self._file = file
|
||||
self._length = None
|
||||
self._bytesleft = 0L
|
||||
self._maxlen = maxlen
|
||||
self._blocksize = blocksize
|
||||
|
||||
def _readlen(self):
|
||||
if self._length is None:
|
||||
self._length = _readlen(self._file)
|
||||
self._bytesleft = self._length
|
||||
if self._maxlen is not None and self._length > self._maxlen:
|
||||
raise OverflowError
|
||||
# Handle the 0-byte case
|
||||
if self._length == 0:
|
||||
ch = self._file.read(1)
|
||||
if ch == "":
|
||||
raise EOFError
|
||||
elif ch != ",":
|
||||
raise ValueError
|
||||
|
||||
def read(self, size=None):
|
||||
"""x.read([size]) -> string
|
||||
|
||||
Works like <fileobject>.read.
|
||||
"""
|
||||
self._readlen()
|
||||
if size is None or size > self._bytesleft:
|
||||
size = self._bytesleft
|
||||
if size == 0:
|
||||
return ""
|
||||
retval = self._file.read(size)
|
||||
self._bytesleft -= len(retval)
|
||||
if self._bytesleft == 0:
|
||||
ch = self._file.read(1)
|
||||
if ch == "":
|
||||
raise EOFError
|
||||
elif ch != ",":
|
||||
raise ValueError
|
||||
return retval
|
||||
|
||||
def length(self):
|
||||
"""x.length() -> long
|
||||
|
||||
Return the total length of the decoded string.
|
||||
"""
|
||||
self._readlen()
|
||||
return self._length
|
||||
|
||||
def bytesremaining(self):
|
||||
"""x.bytesremaining() -> long
|
||||
|
||||
Return the number of decoded string bytes remaining to be read from the file.
|
||||
"""
|
||||
self._readlen()
|
||||
return self._bytesleft
|
||||
|
||||
def skip(self):
|
||||
"""x.skip() -> None
|
||||
|
||||
Skip to the next netstring.
|
||||
"""
|
||||
self._readlen()
|
||||
if self._bytesleft:
|
||||
self._file.seek(self._bytesleft, 1)
|
||||
ch = self._file.read(1)
|
||||
if ch == "":
|
||||
raise EOFError
|
||||
elif ch != ",":
|
||||
raise ValueError
|
||||
self._bytesleft = 0L
|
||||
self._length = None
|
||||
|
||||
def readskip(self, size=None):
|
||||
"""x.readskip([size]) -> string
|
||||
|
||||
Equivalent to x.read([size]); x.skip(). Returns whatever is returned by
|
||||
x.read().
|
||||
"""
|
||||
retval = self.read(size)
|
||||
self.skip()
|
||||
return retval
|
||||
|
||||
def __iter__(self):
|
||||
"""x.__iter__() -> iterator
|
||||
|
||||
Return a block of the decoded netstring.
|
||||
"""
|
||||
block = self.read(self._blocksize)
|
||||
while block != "":
|
||||
yield block
|
||||
block = self.read(self._blocksize)
|
||||
|
||||
def __len__(self):
|
||||
"""x.__len__() -> integer
|
||||
|
||||
Return the total length of the decoded string.
|
||||
|
||||
Note that this is limited to the maximum integer value. Use x.length()
|
||||
wherever possible.
|
||||
"""
|
||||
return int(self.length())
|
||||
|
||||
|
||||
class FileReader(BaseReader):
|
||||
"""FileReader(file, ...) -> FileReader object
|
||||
|
||||
Takes a file as input. See BaseReader.__doc__ for more information.
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
class StringReader(BaseReader):
|
||||
"""StringReader(s, ...) -> StringReader object
|
||||
|
||||
Takes a string as input. See BaseReader.__doc__ for more information.
|
||||
"""
|
||||
def __init__(self, s, *args, **kwargs):
|
||||
file = StringIO.StringIO(s)
|
||||
return BaseReader.__init__(self, file, *args, **kwargs)
|
||||
|
||||
|
||||
# vim:set tw=78 sw=4 ts=4 expandtab:
|
|
@ -1,21 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
import os, re
|
||||
from setuptools import setup, find_packages
|
||||
|
||||
def get_icinga2_version():
|
||||
spec = open(os.path.join('@PROJECT_SOURCE_DIR@', 'icinga2.spec')).read()
|
||||
m = re.search('^Version: (.*)$', spec, re.MULTILINE)
|
||||
if not m:
|
||||
return None
|
||||
return m.group(1)
|
||||
|
||||
setup(
|
||||
name = 'icinga2',
|
||||
version = get_icinga2_version(),
|
||||
packages = find_packages(),
|
||||
entry_points = {
|
||||
'console_scripts': [ 'icinga2-list-objects=icinga2.commands.list_objects:main' ]
|
||||
},
|
||||
use_2to3 = True
|
||||
)
|
||||
|
|
@ -1,215 +0,0 @@
|
|||
# Copyright: 2004 Martin F. Krafft <madduck@debian.org>
|
||||
# 2008 Martin Schreiber <schreiberx@gmail.com>
|
||||
# 2012-2013 Sebastian Ramacher <sramacher@debian.org>
|
||||
# License: Artistic-2.0
|
||||
#
|
||||
# License: Artistic-2.0
|
||||
# Copyright (c) 2000-2006, The Perl Foundation.
|
||||
# http://www.perlfoundation.org/artistic_license_2_0
|
||||
# .
|
||||
# Everyone is permitted to copy and distribute verbatim copies of this
|
||||
# license document, but changing it is not allowed.
|
||||
# .
|
||||
# Preamble
|
||||
# .
|
||||
# This license establishes the terms under which a given free software
|
||||
# Package may be copied, modified, distributed, and/or redistributed.
|
||||
# The intent is that the Copyright Holder maintains some artistic
|
||||
# control over the development of that Package while still keeping the
|
||||
# Package available as open source and free software.
|
||||
# .
|
||||
# You are always permitted to make arrangements wholly outside of this
|
||||
# license directly with the Copyright Holder of a given Package. If the
|
||||
# terms of this license do not permit the full use that you propose to
|
||||
# make of the Package, you should contact the Copyright Holder and seek
|
||||
# a different licensing arrangement.
|
||||
# .
|
||||
# Definitions
|
||||
# .
|
||||
# "Copyright Holder" means the individual(s) or organization(s) named in
|
||||
# the copyright notice for the entire Package.
|
||||
# .
|
||||
# "Contributor" means any party that has contributed code or other
|
||||
# material to the Package, in accordance with the Copyright Holder's
|
||||
# procedures.
|
||||
# .
|
||||
# "You" and "your" means any person who would like to copy, distribute,
|
||||
# or modify the Package.
|
||||
# .
|
||||
# "Package" means the collection of files distributed by the Copyright
|
||||
# Holder, and derivatives of that collection and/or of those files. A
|
||||
# given Package may consist of either the Standard Version, or a
|
||||
# Modified Version.
|
||||
# .
|
||||
# "Distribute" means providing a copy of the Package or making it
|
||||
# accessible to anyone else, or in the case of a company or
|
||||
# organization, to others outside of your company or organization.
|
||||
# .
|
||||
# "Distributor Fee" means any fee that you charge for Distributing this
|
||||
# Package or providing support for this Package to another party. It
|
||||
# does not mean licensing fees.
|
||||
# .
|
||||
# "Standard Version" refers to the Package if it has not been modified,
|
||||
# or has been modified only in ways explicitly requested by the
|
||||
# Copyright Holder.
|
||||
# .
|
||||
# "Modified Version" means the Package, if it has been changed, and such
|
||||
# changes were not explicitly requested by the Copyright Holder.
|
||||
# .
|
||||
# "Original License" means this Artistic License as Distributed with the
|
||||
# Standard Version of the Package, in its current version or as it may
|
||||
# be modified by The Perl Foundation in the future.
|
||||
# .
|
||||
# "Source" form means the source code, documentation source, and
|
||||
# configuration files for the Package.
|
||||
# .
|
||||
# "Compiled" form means the compiled bytecode, object code, binary, or
|
||||
# any other form resulting from mechanical transformation or translation
|
||||
# of the Source form.
|
||||
# .
|
||||
# Permission for Use and Modification Without Distribution
|
||||
# .
|
||||
# (1) You are permitted to use the Standard Version and create and use
|
||||
# Modified Versions for any purpose without restriction, provided that
|
||||
# you do not Distribute the Modified Version.
|
||||
# .
|
||||
# Permissions for Redistribution of the Standard Version
|
||||
# .
|
||||
# (2) You may Distribute verbatim copies of the Source form of the
|
||||
# Standard Version of this Package in any medium without restriction,
|
||||
# either gratis or for a Distributor Fee, provided that you duplicate
|
||||
# all of the original copyright notices and associated disclaimers. At
|
||||
# your discretion, such verbatim copies may or may not include a
|
||||
# Compiled form of the Package.
|
||||
# .
|
||||
# (3) You may apply any bug fixes, portability changes, and other
|
||||
# modifications made available from the Copyright Holder. The resulting
|
||||
# Package will still be considered the Standard Version, and as such
|
||||
# will be subject to the Original License.
|
||||
# .
|
||||
# Distribution of Modified Versions of the Package as Source
|
||||
# .
|
||||
# (4) You may Distribute your Modified Version as Source (either gratis
|
||||
# or for a Distributor Fee, and with or without a Compiled form of the
|
||||
# Modified Version) provided that you clearly document how it differs
|
||||
# from the Standard Version, including, but not limited to, documenting
|
||||
# any non-standard features, executables, or modules, and provided that
|
||||
# you do at least ONE of the following:
|
||||
# .
|
||||
# (a) make the Modified Version available to the Copyright Holder of the
|
||||
# Standard Version, under the Original License, so that the Copyright
|
||||
# Holder may include your modifications in the Standard Version. (b)
|
||||
# ensure that installation of your Modified Version does not prevent the
|
||||
# user installing or running the Standard Version. In addition, the
|
||||
# Modified Version must bear a name that is different from the name of
|
||||
# the Standard Version. (c) allow anyone who receives a copy of the
|
||||
# Modified Version to make the Source form of the Modified Version
|
||||
# available to others under (i) the Original License or (ii) a license
|
||||
# that permits the licensee to freely copy, modify and redistribute the
|
||||
# Modified Version using the same licensing terms that apply to the copy
|
||||
# that the licensee received, and requires that the Source form of the
|
||||
# Modified Version, and of any works derived from it, be made freely
|
||||
# available in that license fees are prohibited but Distributor Fees are
|
||||
# allowed.
|
||||
# .
|
||||
# Distribution of Compiled Forms of the Standard Version or Modified
|
||||
# Versions without the Source
|
||||
# .
|
||||
# (5) You may Distribute Compiled forms of the Standard Version without
|
||||
# the Source, provided that you include complete instructions on how to
|
||||
# get the Source of the Standard Version. Such instructions must be
|
||||
# valid at the time of your distribution. If these instructions, at any
|
||||
# time while you are carrying out such distribution, become invalid, you
|
||||
# must provide new instructions on demand or cease further distribution.
|
||||
# If you provide valid instructions or cease distribution within thirty
|
||||
# days after you become aware that the instructions are invalid, then
|
||||
# you do not forfeit any of your rights under this license.
|
||||
# .
|
||||
# (6) You may Distribute a Modified Version in Compiled form without the
|
||||
# Source, provided that you comply with Section 4 with respect to the
|
||||
# Source of the Modified Version.
|
||||
# .
|
||||
# Aggregating or Linking the Package
|
||||
# .
|
||||
# (7) You may aggregate the Package (either the Standard Version or
|
||||
# Modified Version) with other packages and Distribute the resulting
|
||||
# aggregation provided that you do not charge a licensing fee for the
|
||||
# Package. Distributor Fees are permitted, and licensing fees for other
|
||||
# components in the aggregation are permitted. The terms of this license
|
||||
# apply to the use and Distribution of the Standard or Modified Versions
|
||||
# as included in the aggregation.
|
||||
# .
|
||||
# (8) You are permitted to link Modified and Standard Versions with
|
||||
# other works, to embed the Package in a larger work of your own, or to
|
||||
# build stand-alone binary or bytecode versions of applications that
|
||||
# include the Package, and Distribute the result without restriction,
|
||||
# provided the result does not expose a direct interface to the Package.
|
||||
# .
|
||||
# Items That are Not Considered Part of a Modified Version
|
||||
# .
|
||||
# (9) Works (including, but not limited to, modules and scripts) that
|
||||
# merely extend or make use of the Package, do not, by themselves, cause
|
||||
# the Package to be a Modified Version. In addition, such works are not
|
||||
# considered parts of the Package itself, and are not subject to the
|
||||
# terms of this license.
|
||||
# .
|
||||
# General Provisions
|
||||
# .
|
||||
# (10) Any use, modification, and distribution of the Standard or
|
||||
# Modified Versions is governed by this Artistic License. By using,
|
||||
# modifying or distributing the Package, you accept this license. Do not
|
||||
# use, modify, or distribute the Package, if you do not accept this
|
||||
# license.
|
||||
# .
|
||||
# (11) If your Modified Version has been derived from a Modified Version
|
||||
# made by someone other than you, you are nevertheless required to
|
||||
# ensure that your Modified Version complies with the requirements of
|
||||
# this license.
|
||||
# .
|
||||
# (12) This license does not grant you the right to use any trademark,
|
||||
# service mark, tradename, or logo of the Copyright Holder.
|
||||
# .
|
||||
# (13) This license includes the non-exclusive, worldwide,
|
||||
# free-of-charge patent license to make, have made, use, offer to sell,
|
||||
# sell, import and otherwise transfer the Package with respect to any
|
||||
# patent claims licensable by the Copyright Holder that are necessarily
|
||||
# infringed by the Package. If you institute patent litigation
|
||||
# (including a cross-claim or counterclaim) against any party alleging
|
||||
# that the Package constitutes direct or contributory patent
|
||||
# infringement, then this Artistic License to you shall terminate on the
|
||||
# date that such litigation is filed.
|
||||
# .
|
||||
# (14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT
|
||||
# HOLDER AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED
|
||||
# WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
# PARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT
|
||||
# PERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT
|
||||
# HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# This is a ugly workaround to be able to pass DESTDIR as --root to setup.py.
|
||||
# cmake expands any occurence of $ENV{foo} with the value of foo while runing
|
||||
# cmake and not while running make afterwards.
|
||||
|
||||
SET(PYTHON_EXECUTABLE "" CACHE FORCE "Python executable")
|
||||
SET(PREFIX ${CMAKE_INSTALL_PREFIX} CACHE FORCE "cmake install prefix")
|
||||
SET(WDIR "" CACHE FORCE "working directory")
|
||||
SET(SETUP_PY "" CACHE FORCE "setup.py path")
|
||||
SET(EXTRA_ARGS $ENV{SETUP_PY_EXTRA_ARGS} CACHE FORCE "extra arguments for setup.py")
|
||||
|
||||
SET(INSTALL_ROOT $ENV{DESTDIR})
|
||||
IF(INSTALL_ROOT)
|
||||
SET(INSTALL_ROOT_ARGS "--root=$ENV{DESTDIR}")
|
||||
ELSE(INSTALL_ROOT)
|
||||
SET(INSTALL_ROOT_ARGS "")
|
||||
ENDIF(INSTALL_ROOT)
|
||||
|
||||
EXECUTE_PROCESS(
|
||||
COMMAND "${PYTHON_EXECUTABLE}"
|
||||
"${SETUP_PY}"
|
||||
install
|
||||
--prefix=${PREFIX}
|
||||
${INSTALL_ROOT_ARGS}
|
||||
${EXTRA_ARGS}
|
||||
WORKING_DIRECTORY "${WDIR}")
|
Loading…
Reference in New Issue