check_function_exists(nice HAVE_NICE)
check_library_exists(dl dladdr "dlfcn.h" HAVE_DLADDR)
check_library_exists(execinfo backtrace_symbols "" HAVE_LIBEXECINFO)
+check_library_exists(readline readline "" HAVE_LIBREADLINE)
check_include_file_cxx(cxxabi.h HAVE_CXXABI_H)
if(HAVE_LIBEXECINFO)
#cmakedefine HAVE_LIBEXECINFO
#cmakedefine HAVE_CXXABI_H
#cmakedefine HAVE_NICE
+#cmakedefine HAVE_LIBREADLINE
#cmakedefine ICINGA2_UNITY_BUILD
libpq-dev,
libssl-dev,
libyajl-dev,
+ libreadline-dev,
make (>= 3.81),
po-debconf
Standards-Version: 3.9.5
BuildRequires: bison
BuildRequires: make
+%if "%{_vendor}" == "suse"
+BuildRequires: libreadline-devel
+%else
+BuildRequires: readline-devel
+%endif
+
%if "%{_vendor}" == "redhat" && (0%{?el5} || 0%{?rhel} == 5 || "%{?dist}" == ".el5")
# el5 requires packages.icinga.org
BuildRequires: boost153-devel
static ConsoleType l_ConsoleType = Console_Dumb;
ConsoleColorTag::ConsoleColorTag(int color)
- : m_Color(color)
+ : m_Color(color), m_ConsoleType(-1)
+{ }
+
+ConsoleColorTag::ConsoleColorTag(int color, ConsoleType consoleType)
+ : m_Color(color), m_ConsoleType(consoleType)
{ }
std::ostream& icinga::operator<<(std::ostream& fp, const ConsoleColorTag& cct)
{
#ifndef _WIN32
- if (Console::GetType(fp) == Console_VT100)
+ if (cct.m_ConsoleType == Console_VT100 || Console::GetType(fp) == Console_VT100)
Console::PrintVT100ColorCode(fp, cct.m_Color);
#else /* _WIN32 */
if (Console::GetType(fp) == Console_Windows) {
{
public:
ConsoleColorTag(int color);
+ ConsoleColorTag(int color, ConsoleType consoleType);
friend I2_BASE_API std::ostream& operator<<(std::ostream& fp, const ConsoleColorTag& cct);
private:
int m_Color;
+ int m_ConsoleType;
};
I2_BASE_API std::ostream& operator<<(std::ostream& fp, const ConsoleColorTag& cct);
add_library(cli SHARED ${cli_SOURCES})
-target_link_libraries(cli ${Boost_LIBRARIES} base config remote)
+target_link_libraries(cli ${Boost_LIBRARIES} readline base config remote)
set_target_properties (
cli PROPERTIES
#include "base/application.hpp"
#include <iostream>
+#ifdef HAVE_LIBREADLINE
+extern "C" {
+#include <readline/readline.h>
+#include <readline/history.h>
+}
+#endif /* HAVE_LIBREADLINE */
+
using namespace icinga;
namespace po = boost::program_options;
String fileName = "<" + Convert::ToString(next_line) + ">";
next_line++;
+#ifdef HAVE_LIBREADLINE
+ ConsoleType type = Console::GetType(std::cout);
+
+ std::stringstream prompt_sbuf;
+
+ prompt_sbuf << RL_PROMPT_START_IGNORE << ConsoleColorTag(Console_ForegroundCyan, type)
+ << RL_PROMPT_END_IGNORE << fileName
+ << RL_PROMPT_START_IGNORE << ConsoleColorTag(Console_ForegroundRed, type)
+ << RL_PROMPT_END_IGNORE << " => "
+ << RL_PROMPT_START_IGNORE << ConsoleColorTag(Console_Normal, type);
+#else /* HAVE_LIBREADLINE */
std::cout << ConsoleColorTag(Console_ForegroundCyan)
- << fileName << ConsoleColorTag(Console_ForegroundRed) << " => "
+ << fileName
+ << ConsoleColorTag(Console_ForegroundRed)
+ << " => "
<< ConsoleColorTag(Console_Normal);
+#endif /* HAVE_LIBREADLINE */
+
+#ifdef HAVE_LIBREADLINE
+ String prompt = prompt_sbuf.str();
+
+ char *rline = readline(prompt.CStr());
+
+ if (!rline)
+ break;
+
+ if (*rline)
+ add_history(rline);
+ String line = rline;
+ free(rline);
+#else /* HAVE_LIBREADLINE */
std::string line;
std::getline(std::cin, line);
+#endif /* HAVE_LIBREADLINE */
Expression *expr;