2000-01-19 12:30:19 +00:00
/*
* BIRD Internet Routing Daemon - - CLI Commands Which Don ' t Fit Anywhere Else
*
* ( c ) 2000 Martin Mares < mj @ ucw . cz >
*
* Can be freely distributed and used under the terms of the GNU GPL .
*/
# include "nest/bird.h"
2014-03-20 13:07:12 +00:00
# include "nest/protocol.h"
2012-03-16 11:47:12 +00:00
# include "nest/route.h"
2000-01-19 12:30:19 +00:00
# include "nest/cli.h"
# include "conf/conf.h"
# include "nest/cmds.h"
# include "lib/string.h"
2010-06-02 20:20:40 +00:00
# include "lib/resource.h"
2013-07-25 11:15:32 +00:00
# include "filter/filter.h"
2023-11-23 07:52:51 +00:00
# include "nest/cbor_shortcuts.c"
2000-01-19 12:30:19 +00:00
2012-12-26 11:40:48 +00:00
extern int shutting_down ;
extern int configuring ;
2000-01-19 12:30:19 +00:00
void
cmd_show_status ( void )
{
2000-03-12 22:44:54 +00:00
byte tim [ TM_DATETIME_BUFFER_SIZE ] ;
cli_msg ( - 1000 , " BIRD " BIRD_VERSION ) ;
2017-06-06 14:47:30 +00:00
tm_format_time ( tim , & config - > tf_base , current_time ( ) ) ;
2023-11-23 07:52:51 +00:00
cli_msg ( - 1011 , " Router ID is %R %i %x " , config - > router_id , config - > router_id , config - > router_id ) ;
2021-02-10 15:53:57 +00:00
cli_msg ( - 1011 , " Hostname is %s " , config - > hostname ) ;
2000-03-12 22:44:54 +00:00
cli_msg ( - 1011 , " Current server time is %s " , tim ) ;
2017-06-06 14:47:30 +00:00
tm_format_time ( tim , & config - > tf_base , boot_time ) ;
2000-03-12 22:44:54 +00:00
cli_msg ( - 1011 , " Last reboot on %s " , tim ) ;
2017-06-06 14:47:30 +00:00
tm_format_time ( tim , & config - > tf_base , config - > load_time ) ;
2000-03-12 22:44:54 +00:00
cli_msg ( - 1011 , " Last reconfiguration on %s " , tim ) ;
2012-12-26 11:40:48 +00:00
2014-03-20 13:07:12 +00:00
graceful_restart_show_status ( ) ;
2000-03-12 22:44:54 +00:00
if ( shutting_down )
cli_msg ( 13 , " Shutdown in progress " ) ;
2012-12-26 11:40:48 +00:00
else if ( configuring )
2000-03-12 22:44:54 +00:00
cli_msg ( 13 , " Reconfiguration in progress " ) ;
else
cli_msg ( 13 , " Daemon is up and running " ) ;
2023-11-23 07:52:51 +00:00
byte time [ TM_DATETIME_BUFFER_SIZE ] ;
tm_format_time ( time , & config - > tf_base , current_time ( ) ) ;
struct cbor_writer * w = cbor_init ( lp_new ( proto_pool ) , 1000 ) ;
cbor_open_block_with_length ( w , 3 ) ;
cbor_string_string ( w , " BIRD " , BIRD_VERSION ) ;
cbor_add_string ( w , " body " ) ;
cbor_open_block ( w ) ;
cbor_add_string ( w , " router_id " ) ;
cbor_add_int ( w , config - > router_id ) ;
cbor_string_string ( w , " hostname " , config - > hostname ) ;
cbor_string_string ( w , " server_time " , time ) ;
tm_format_time ( time , & config - > tf_base , boot_time ) ;
cbor_string_string ( w , " last_reboot " , time ) ;
tm_format_time ( time , & config - > tf_base , config - > load_time ) ;
cbor_string_string ( w , " last_reconfiguration " , time ) ;
// TODO graceful restart
cbor_close_block_or_list ( w ) ;
cbor_add_string ( w , " state " ) ;
if ( shutting_down )
cbor_add_string ( w , " Shutdown in progress " ) ;
else if ( configuring )
cbor_add_string ( w , " Reconfiguration in progress " ) ;
else
cbor_add_string ( w , " Daemon is up and running " ) ;
cbor_write_to_file ( w , " test.cbor " ) ;
2000-01-19 12:30:19 +00:00
}
void
2012-03-16 11:47:12 +00:00
cmd_show_symbols ( struct sym_show_data * sd )
2000-01-19 12:30:19 +00:00
{
2017-05-25 21:30:39 +00:00
if ( sd - > sym )
cli_msg ( 1010 , " %-8s \t %s " , sd - > sym - > name , cf_symbol_class_name ( sd - > sym ) ) ;
2000-01-19 12:30:19 +00:00
else
2017-05-25 21:30:39 +00:00
{
2022-05-02 18:29:03 +00:00
for ( const struct sym_scope * scope = config - > root_scope ; scope ; scope = scope - > next )
HASH_WALK ( scope - > hash , next , sym )
{
if ( ! sym - > scope - > active )
continue ;
if ( sd - > type & & ( sym - > class ! = sd - > type ) )
continue ;
cli_msg ( - 1010 , " %-8s \t %s " , sym - > name , cf_symbol_class_name ( sym ) ) ;
}
HASH_WALK_END ;
2017-05-25 21:30:39 +00:00
cli_msg ( 0 , " " ) ;
}
2000-01-19 12:30:19 +00:00
}
2010-06-02 20:20:40 +00:00
2021-11-26 23:21:12 +00:00
# define SIZE_SUFFIX " kMGT"
# define SIZE_FORMAT "% 4u.%1u % 1cB"
# define SIZE_ARGS(a) (a).val, (a).decimal, SIZE_SUFFIX[(a).magnitude]
struct size_args {
u64 val : 48 ;
u64 decimal : 8 ;
u64 magnitude : 8 ;
} ;
static struct size_args
get_size_args ( u64 val )
2010-06-02 20:20:40 +00:00
{
2021-11-26 23:21:12 +00:00
# define VALDEC 10 /* One decimal place */
val * = VALDEC ;
uint i = 0 ;
while ( ( val > = 10000 * VALDEC ) & & ( i < 4 ) )
2010-06-02 20:20:40 +00:00
{
val = ( val + 512 ) / 1024 ;
i + + ;
}
2021-11-26 23:21:12 +00:00
return ( struct size_args ) {
. val = ( val / VALDEC ) ,
. decimal = ( val % VALDEC ) ,
. magnitude = i ,
} ;
}
static void
print_size ( char * dsc , struct resmem vals )
{
struct size_args effective = get_size_args ( vals . effective ) ;
struct size_args overhead = get_size_args ( vals . overhead ) ;
cli_msg ( - 1018 , " %-17s " SIZE_FORMAT " " SIZE_FORMAT , dsc , SIZE_ARGS ( effective ) , SIZE_ARGS ( overhead ) ) ;
2010-06-02 20:20:40 +00:00
}
extern pool * rt_table_pool ;
extern pool * rta_pool ;
2022-03-09 08:10:44 +00:00
extern uint * pages_kept ;
2010-06-02 20:20:40 +00:00
void
cmd_show_memory ( void )
{
cli_msg ( - 1018 , " BIRD memory usage " ) ;
2021-11-26 23:21:12 +00:00
cli_msg ( - 1018 , " %-17s Effective Overhead " , " " ) ;
2010-06-02 20:20:40 +00:00
print_size ( " Routing tables: " , rmemsize ( rt_table_pool ) ) ;
print_size ( " Route attributes: " , rmemsize ( rta_pool ) ) ;
print_size ( " Protocols: " , rmemsize ( proto_pool ) ) ;
2022-11-01 07:56:26 +00:00
print_size ( " Current config: " , rmemsize ( config_pool ) ) ;
2021-11-26 23:21:12 +00:00
struct resmem total = rmemsize ( & root_pool ) ;
2021-11-24 16:30:13 +00:00
# ifdef HAVE_MMAP
2022-03-09 08:10:44 +00:00
print_size ( " Standby memory: " , ( struct resmem ) { . overhead = page_size * * pages_kept } ) ;
total . overhead + = page_size * * pages_kept ;
2021-11-24 16:30:13 +00:00
# endif
print_size ( " Total: " , total ) ;
2010-06-02 20:20:40 +00:00
cli_msg ( 0 , " " ) ;
2023-11-23 07:52:51 +00:00
struct cbor_writer * w = cbor_init ( lp_new ( proto_pool ) , 1000 ) ;
2023-11-23 08:51:48 +00:00
cbor_open_block_with_length ( w , 1 ) ;
cbor_add_string ( w , " show_memory:message " ) ;
2023-11-23 07:52:51 +00:00
cbor_open_block_with_length ( w , 2 ) ;
2023-11-23 08:51:48 +00:00
cbor_string_string ( w , " header " , " BIRD memory usage " ) ;
2023-11-23 07:52:51 +00:00
cbor_add_string ( w , " body " ) ;
cbor_open_block ( w ) ;
struct resmem memory = rmemsize ( rt_table_pool ) ;
cbor_named_block_two_ints ( w , " routing_tables " , " effective " , memory . effective , " overhead " , memory . overhead ) ;
memory = rmemsize ( rta_pool ) ;
cbor_named_block_two_ints ( w , " route_attributes " , " effective " , memory . effective , " overhead " , memory . overhead ) ;
memory = rmemsize ( proto_pool ) ;
cbor_named_block_two_ints ( w , " protocols " , " effective " , memory . effective , " overhead " , memory . overhead ) ;
memory = rmemsize ( config_pool ) ;
cbor_named_block_two_ints ( w , " current_config " , " effective " , memory . effective , " overhead " , memory . overhead ) ;
memory = rmemsize ( & root_pool ) ;
# ifdef HAVE_MMAP
2023-11-23 08:51:48 +00:00
cbor_named_block_two_ints ( w , " standby_memory " , " effective " , 0 , " overhead " , page_size * * pages_kept ) ;
2023-11-23 07:52:51 +00:00
# endif
memory . overhead + = page_size * * pages_kept ;
cbor_named_block_two_ints ( w , " total " , " effective " , memory . effective , " overhead " , memory . overhead ) ;
2023-11-23 08:51:48 +00:00
cbor_close_block_or_list ( w ) ; // we do not know for sure, that standby memory will be printed, so we do not know number of block items. If we know that, we open the block for 6 (or 5) items and we do not close anything
2023-11-23 07:52:51 +00:00
2023-11-23 08:57:36 +00:00
cbor_write_to_file ( w , " bird/yang/show_memory.cbor " ) ;
2023-11-23 07:52:51 +00:00
2010-06-02 20:20:40 +00:00
}
2013-07-25 11:15:32 +00:00
void
2018-12-27 13:26:11 +00:00
cmd_eval ( const struct f_line * expr )
2013-07-25 11:15:32 +00:00
{
2019-02-11 16:12:48 +00:00
buffer buf ;
LOG_BUFFER_INIT ( buf ) ;
if ( f_eval_buf ( expr , this_cli - > parser_pool , & buf ) > F_RETURN )
2013-07-25 11:15:32 +00:00
{
cli_msg ( 8008 , " runtime error " ) ;
return ;
}
2013-10-05 18:12:28 +00:00
cli_msg ( 23 , " %s " , buf . start ) ;
2013-07-25 11:15:32 +00:00
}