[OpenWrt-Devel] logread: add option to filter for facilities
diff mbox series

Message ID 20190725154315.7777-1-zefir.kurtisi@neratec.com
State New
Headers show
Series
  • [OpenWrt-Devel] logread: add option to filter for facilities
Related show

Commit Message

Zefir Kurtisi July 25, 2019, 3:43 p.m. UTC
This adds filtering options for facilities as follows:
    -z	<facility>	handle only messages with given facility (0-23), repeatable
    -Z	<facility>	ignore messages with given facility (0-23), repeatable

With that
* 'logread -z 2 -z 16' will display all MAIL and LOCAL0 messages, while
* 'logread -Z 2 -Z 16' will display all but MAIL and LOCAL0 messages

Signed-off-by: Zefir Kurtisi <zefir.kurtisi@neratec.com>
---
 log/logread.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

Comments

John Crispin July 25, 2019, 3:58 p.m. UTC | #1
On 25/07/2019 17:43, Zefir Kurtisi wrote:
> This adds filtering options for facilities as follows:
>      -z	<facility>	handle only messages with given facility (0-23), repeatable
>      -Z	<facility>	ignore messages with given facility (0-23), repeatable
>
> With that
> * 'logread -z 2 -z 16' will display all MAIL and LOCAL0 messages, while
> * 'logread -Z 2 -Z 16' will display all but MAIL and LOCAL0 messages
>
> Signed-off-by: Zefir Kurtisi <zefir.kurtisi@neratec.com>
> ---
>   log/logread.c | 29 +++++++++++++++++++++++++++--
>   1 file changed, 27 insertions(+), 2 deletions(-)
>
> diff --git a/log/logread.c b/log/logread.c
> index e47541a..a764742 100644
> --- a/log/logread.c
> +++ b/log/logread.c
> @@ -66,6 +66,18 @@ static int log_type = LOG_STDOUT;
>   static int log_size, log_udp, log_follow, log_trailer_null = 0;
>   static int log_timestamp;
>   static int logd_conn_tries = LOGD_CONNECT_RETRY;
> +static int facility_include;
> +static int facility_exclude;
> +
> +/* check for facility filter; return 0 if message shall be dropped */
> +static int check_facility_filter(int f)
> +{
> +	if (facility_include)
> +		return !!(facility_include & (1 << f));
> +	if (facility_exclude)
> +		return !(facility_exclude & (1 << f));
> +	return 1;
> +}

correct me if I am wrong but by default all facilities will be included 
so the -z is a noop unless we add a

if (facility_include)

     retrun 0

at the end of this function ?!

     John


>   
>   static const char* getcodetext(int value, CODE *codetable) {
>   	CODE *i;
> @@ -133,6 +145,10 @@ static int log_notify(struct blob_attr *msg)
>   			exit(-1);
>   		}
>   	}
> +	p = blobmsg_get_u32(tb[LOG_PRIO]);
> +
> +	if (!check_facility_filter(LOG_FAC(p)))
> +			return 0;
>   
>   	m = blobmsg_get_string(tb[LOG_MSG]);
>   	if (regexp_pattern &&
> @@ -145,7 +161,6 @@ static int log_notify(struct blob_attr *msg)
>   				(unsigned long)t, t_ms);
>   	}
>   	c = ctime(&t);
> -	p = blobmsg_get_u32(tb[LOG_PRIO]);
>   	c[strlen(c) - 1] = '\0';
>   
>   	if (log_type == LOG_NET) {
> @@ -212,6 +227,8 @@ static int usage(const char *prog)
>   		"    -p	<file>		PID file\n"
>   		"    -h	<hostname>	Add hostname to the message\n"
>   		"    -P	<prefix>	Prefix custom text to streamed messages\n"
> +		"    -z	<facility>	handle only messages with given facility (0-23), repeatable\n"
> +		"    -Z	<facility>	ignore messages with given facility (0-23), repeatable\n"
>   		"    -f			Follow log messages\n"
>   		"    -u			Use UDP as the protocol\n"
>   		"    -t			Add an extra timestamp\n"
> @@ -290,7 +307,7 @@ int main(int argc, char **argv)
>   
>   	signal(SIGPIPE, SIG_IGN);
>   
> -	while ((ch = getopt(argc, argv, "u0fcs:l:r:F:p:S:P:h:e:t")) != -1) {
> +	while ((ch = getopt(argc, argv, "u0fcs:l:z:Z:r:F:p:S:P:h:e:t")) != -1) {
>   		switch (ch) {
>   		case 'u':
>   			log_udp = 1;
> @@ -320,6 +337,14 @@ int main(int argc, char **argv)
>   		case 'l':
>   			lines = atoi(optarg);
>   			break;
> +		case 'z':
> +			id = strtoul(optarg, NULL, 0) & 0x1f;
> +			facility_include |= (1 << id);
> +			break;
> +		case 'Z':
> +			id = strtoul(optarg, NULL, 0) & 0x1f;
> +			facility_exclude |= (1 << id);
> +			break;
>   		case 'S':
>   			log_size = atoi(optarg);
>   			if (log_size < 1)
Zefir Kurtisi July 26, 2019, 7:57 a.m. UTC | #2
On 7/25/19 5:58 PM, John Crispin wrote:
> 
> On 25/07/2019 17:43, Zefir Kurtisi wrote:
>> This adds filtering options for facilities as follows:
>>      -z    <facility>    handle only messages with given facility (0-23),
>> repeatable
>>      -Z    <facility>    ignore messages with given facility (0-23), repeatable
>>
>> With that
>> * 'logread -z 2 -z 16' will display all MAIL and LOCAL0 messages, while
>> * 'logread -Z 2 -Z 16' will display all but MAIL and LOCAL0 messages
>>
>> Signed-off-by: Zefir Kurtisi <zefir.kurtisi@neratec.com>
>> ---
>>   log/logread.c | 29 +++++++++++++++++++++++++++--
>>   1 file changed, 27 insertions(+), 2 deletions(-)
>>
>> diff --git a/log/logread.c b/log/logread.c
>> index e47541a..a764742 100644
>> --- a/log/logread.c
>> +++ b/log/logread.c
>> @@ -66,6 +66,18 @@ static int log_type = LOG_STDOUT;
>>   static int log_size, log_udp, log_follow, log_trailer_null = 0;
>>   static int log_timestamp;
>>   static int logd_conn_tries = LOGD_CONNECT_RETRY;
>> +static int facility_include;
>> +static int facility_exclude;
>> +
>> +/* check for facility filter; return 0 if message shall be dropped */
>> +static int check_facility_filter(int f)
>> +{
>> +    if (facility_include)
>> +        return !!(facility_include & (1 << f));
>> +    if (facility_exclude)
>> +        return !(facility_exclude & (1 << f));
>> +    return 1;
>> +}
> 
> correct me if I am wrong but by default all facilities will be included so the -z
> is a noop unless we add a
> 
> if (facility_include)
> 
>     retrun 0
> 
> at the end of this function ?!
> 
>     John
> 
> 

Hi John,

if you pick at least one facility to include, you get into the topmost
'if (facility_include)' branch of the function and return immediately. You get to
the end of the function only if both (include and exclude) are 0.

This implies that including facilities has precedence over excluding them, which
is irrelevant since it does not make sense to use include and exclude at the same
time.

Cheers,
Zefir
John Crispin July 26, 2019, 8:32 a.m. UTC | #3
On 26/07/2019 09:57, Zefir Kurtisi wrote:
> On 7/25/19 5:58 PM, John Crispin wrote:
>> On 25/07/2019 17:43, Zefir Kurtisi wrote:
>>> This adds filtering options for facilities as follows:
>>>       -z    <facility>    handle only messages with given facility (0-23),
>>> repeatable
>>>       -Z    <facility>    ignore messages with given facility (0-23), repeatable
>>>
>>> With that
>>> * 'logread -z 2 -z 16' will display all MAIL and LOCAL0 messages, while
>>> * 'logread -Z 2 -Z 16' will display all but MAIL and LOCAL0 messages
>>>
>>> Signed-off-by: Zefir Kurtisi <zefir.kurtisi@neratec.com>
>>> ---
>>>    log/logread.c | 29 +++++++++++++++++++++++++++--
>>>    1 file changed, 27 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/log/logread.c b/log/logread.c
>>> index e47541a..a764742 100644
>>> --- a/log/logread.c
>>> +++ b/log/logread.c
>>> @@ -66,6 +66,18 @@ static int log_type = LOG_STDOUT;
>>>    static int log_size, log_udp, log_follow, log_trailer_null = 0;
>>>    static int log_timestamp;
>>>    static int logd_conn_tries = LOGD_CONNECT_RETRY;
>>> +static int facility_include;
>>> +static int facility_exclude;
>>> +
>>> +/* check for facility filter; return 0 if message shall be dropped */
>>> +static int check_facility_filter(int f)
>>> +{
>>> +    if (facility_include)
>>> +        return !!(facility_include & (1 << f));
>>> +    if (facility_exclude)
>>> +        return !(facility_exclude & (1 << f));
>>> +    return 1;
>>> +}
>> correct me if I am wrong but by default all facilities will be included so the -z
>> is a noop unless we add a
>>
>> if (facility_include)
>>
>>      retrun 0
>>
>> at the end of this function ?!
>>
>>      John
>>
>>
> Hi John,
>
> if you pick at least one facility to include, you get into the topmost
> 'if (facility_include)' branch of the function and return immediately. You get to
> the end of the function only if both (include and exclude) are 0.
>
> This implies that including facilities has precedence over excluding them, which
> is irrelevant since it does not make sense to use include and exclude at the same
> time.
>
> Cheers,
> Zefir

apparently I was blind

     John

Patch
diff mbox series

diff --git a/log/logread.c b/log/logread.c
index e47541a..a764742 100644
--- a/log/logread.c
+++ b/log/logread.c
@@ -66,6 +66,18 @@  static int log_type = LOG_STDOUT;
 static int log_size, log_udp, log_follow, log_trailer_null = 0;
 static int log_timestamp;
 static int logd_conn_tries = LOGD_CONNECT_RETRY;
+static int facility_include;
+static int facility_exclude;
+
+/* check for facility filter; return 0 if message shall be dropped */
+static int check_facility_filter(int f)
+{
+	if (facility_include)
+		return !!(facility_include & (1 << f));
+	if (facility_exclude)
+		return !(facility_exclude & (1 << f));
+	return 1;
+}
 
 static const char* getcodetext(int value, CODE *codetable) {
 	CODE *i;
@@ -133,6 +145,10 @@  static int log_notify(struct blob_attr *msg)
 			exit(-1);
 		}
 	}
+	p = blobmsg_get_u32(tb[LOG_PRIO]);
+
+	if (!check_facility_filter(LOG_FAC(p)))
+			return 0;
 
 	m = blobmsg_get_string(tb[LOG_MSG]);
 	if (regexp_pattern &&
@@ -145,7 +161,6 @@  static int log_notify(struct blob_attr *msg)
 				(unsigned long)t, t_ms);
 	}
 	c = ctime(&t);
-	p = blobmsg_get_u32(tb[LOG_PRIO]);
 	c[strlen(c) - 1] = '\0';
 
 	if (log_type == LOG_NET) {
@@ -212,6 +227,8 @@  static int usage(const char *prog)
 		"    -p	<file>		PID file\n"
 		"    -h	<hostname>	Add hostname to the message\n"
 		"    -P	<prefix>	Prefix custom text to streamed messages\n"
+		"    -z	<facility>	handle only messages with given facility (0-23), repeatable\n"
+		"    -Z	<facility>	ignore messages with given facility (0-23), repeatable\n"
 		"    -f			Follow log messages\n"
 		"    -u			Use UDP as the protocol\n"
 		"    -t			Add an extra timestamp\n"
@@ -290,7 +307,7 @@  int main(int argc, char **argv)
 
 	signal(SIGPIPE, SIG_IGN);
 
-	while ((ch = getopt(argc, argv, "u0fcs:l:r:F:p:S:P:h:e:t")) != -1) {
+	while ((ch = getopt(argc, argv, "u0fcs:l:z:Z:r:F:p:S:P:h:e:t")) != -1) {
 		switch (ch) {
 		case 'u':
 			log_udp = 1;
@@ -320,6 +337,14 @@  int main(int argc, char **argv)
 		case 'l':
 			lines = atoi(optarg);
 			break;
+		case 'z':
+			id = strtoul(optarg, NULL, 0) & 0x1f;
+			facility_include |= (1 << id);
+			break;
+		case 'Z':
+			id = strtoul(optarg, NULL, 0) & 0x1f;
+			facility_exclude |= (1 << id);
+			break;
 		case 'S':
 			log_size = atoi(optarg);
 			if (log_size < 1)