From a0695946f8bb0a284c1cc76518af0cf9bed9ec4d Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Wed, 31 May 2017 20:25:51 +0200 Subject: [PATCH] Colorized rpmlog() output --- rpmio/rpmlog.c | 148 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 115 insertions(+), 33 deletions(-) diff --git a/rpmio/rpmlog.c b/rpmio/rpmlog.c index 43ae36f3ab..3b6b581c91 100644 --- a/rpmio/rpmlog.c +++ b/rpmio/rpmlog.c @@ -172,38 +172,6 @@ rpmlogCallback rpmlogSetCallback(rpmlogCallback cb, rpmlogCallbackData data) return ocb; } -static int rpmlogDefault(FILE *stdlog, rpmlogRec rec) -{ - FILE *msgout = (stdlog ? stdlog : stderr); - - switch (rec->pri) { - case RPMLOG_INFO: - case RPMLOG_NOTICE: - msgout = (stdlog ? stdlog : stdout); - break; - case RPMLOG_EMERG: - case RPMLOG_ALERT: - case RPMLOG_CRIT: - case RPMLOG_ERR: - case RPMLOG_WARNING: - case RPMLOG_DEBUG: - default: - break; - } - - if (fputs(rpmlogLevelPrefix(rec->pri), msgout) == EOF && errno != EPIPE) - perror("Error occurred during writing of a log message"); - - if (fputs(rec->message, msgout) == EOF && errno != EPIPE) - perror("Error occurred during writing of a log message"); - - if (fflush(msgout) == EOF && errno != EPIPE) - perror("Error occurred during writing of a log message"); - - return (rec->pri <= RPMLOG_CRIT ? RPMLOG_EXIT : 0); -} - - FILE * rpmlogSetFile(FILE * fp) { rpmlogCtx ctx = rpmlogCtxAcquire(1); @@ -229,6 +197,38 @@ static const char * const rpmlogMsgPrefix[] = { "D: ", /*!< RPMLOG_DEBUG */ }; +#define ANSI_COLOR_BLACK "\x1b[30m" +#define ANSI_COLOR_RED "\x1b[31m" +#define ANSI_COLOR_GREEN "\x1b[32m" +#define ANSI_COLOR_YELLOW "\x1b[33m" +#define ANSI_COLOR_BLUE "\x1b[34m" +#define ANSI_COLOR_MAGENTA "\x1b[35m" +#define ANSI_COLOR_CYAN "\x1b[36m" +#define ANSI_COLOR_WHITE "\x1b[37m" + +#define ANSI_BRIGHT_BLACK "\x1b[30;1m" +#define ANSI_BRIGHT_RED "\x1b[31;1m" +#define ANSI_BRIGHT_GREEN "\x1b[32;1m" +#define ANSI_BRIGHT_YELLOW "\x1b[33;1m" +#define ANSI_BRIGHT_BLUE "\x1b[34;1m" +#define ANSI_BRIGHT_MAGENTA "\x1b[35;1m" +#define ANSI_BRIGHT_CYAN "\x1b[36;1m" +#define ANSI_BRIGHT_WHITE "\x1b[37;1m" + +#define ANSI_COLOR_BOLD "\x1b[1m" +#define ANSI_COLOR_RESET "\x1b[0m" + +static const char *rpmlogMsgPrefixColor[] = { + ANSI_BRIGHT_RED, /*!< RPMLOG_EMERG */ + ANSI_BRIGHT_RED, /*!< RPMLOG_ALERT */ + ANSI_BRIGHT_RED, /*!< RPMLOG_CRIT */ + ANSI_BRIGHT_RED, /*!< RPMLOG_ERR */ + ANSI_BRIGHT_MAGENTA,/*!< RPMLOG_WARNING */ + "", /*!< RPMLOG_NOTICE */ + "", /*!< RPMLOG_INFO */ + ANSI_BRIGHT_BLUE, /*!< RPMLOG_DEBUG */ +}; + const char * rpmlogLevelPrefix(rpmlogLvl pri) { const char * prefix = ""; @@ -237,6 +237,89 @@ const char * rpmlogLevelPrefix(rpmlogLvl pri) return prefix; } +static const char * rpmlogLevelColor(rpmlogLvl pri) +{ + return rpmlogMsgPrefixColor[pri&0x7]; +} + +static int rpmlogDefault(FILE *stdlog, rpmlogRec rec) +{ + static const char fubar[] = + "Error occurred during writing of a log message"; + FILE *msgout = (stdlog ? stdlog : stderr); + const char * colorOn = isatty(fileno(msgout)) + ? rpmlogLevelColor(rec->pri) + : NULL ; + + switch (rec->pri) { + case RPMLOG_INFO: + case RPMLOG_NOTICE: + msgout = (stdlog ? stdlog : stdout); + break; + case RPMLOG_EMERG: + case RPMLOG_ALERT: + case RPMLOG_CRIT: + case RPMLOG_ERR: + case RPMLOG_WARNING: + case RPMLOG_DEBUG: + if (colorOn && *colorOn) + if (fputs(rpmlogLevelColor(rec->pri), msgout) == EOF + && errno != EPIPE) + perror(fubar); + break; + default: + break; + } + + if (fputs(rpmlogLevelPrefix(rec->pri), msgout) == EOF && errno != EPIPE) + perror(fubar); + + switch (rec->pri) { + case RPMLOG_INFO: + case RPMLOG_NOTICE: + break; + case RPMLOG_EMERG: + case RPMLOG_ALERT: + case RPMLOG_CRIT: + case RPMLOG_ERR: + case RPMLOG_WARNING: + if (colorOn && *colorOn) { + if (fputs(ANSI_COLOR_RESET, msgout) == EOF && errno != EPIPE) + perror(fubar); + if (fputs(ANSI_COLOR_BOLD, msgout) == EOF && errno != EPIPE) + perror(fubar); + } + case RPMLOG_DEBUG: + default: + break; + } + + if (rec->message) + (void) fputs(rec->message, msgout); + + switch (rec->pri) { + case RPMLOG_INFO: + case RPMLOG_NOTICE: + break; + case RPMLOG_EMERG: + case RPMLOG_ALERT: + case RPMLOG_CRIT: + case RPMLOG_ERR: + case RPMLOG_WARNING: + case RPMLOG_DEBUG: + if (colorOn && *colorOn) + if (fputs(ANSI_COLOR_RESET, msgout) == EPIPE && errno != EPIPE) + perror(fubar); + break; + default: + break; + } + + (void) fflush(msgout); + + return (rec->pri <= RPMLOG_CRIT ? RPMLOG_EXIT : 0); +} + /* FIX: rpmlogMsgPrefix[] dependent, not unqualified */ /* FIX: rpmlogMsgPrefix[] may be NULL */ static void dolog(struct rpmlogRec_s *rec, int saverec) @@ -322,4 +405,3 @@ void rpmlog (int code, const char *fmt, ...) free(msg); } } -