package POEDaemon::WheelRun::SysctlGet; use strict; use warnings FATAL => 'all'; no warnings 'redefine'; use POE; use POEDaemon; sub states { return $_[0], [qw( sysctlget_start sysctlget_stop sysctlget_childexit sysctlget sysctlget_stdout_line )]; } sub sysctlget_start { my $kernel = $_[KERNEL]; $kernel->yield(wheelrun_exec => { prog => [ 'util/sysctl.pl', 'get' ], name => 'sysctlget', stdout_event => 'sysctlget_stdout_line', }); } sub sysctlget_stop { my $kernel = $_[KERNEL]; $kernel->yield(wheelrun_kill => { wheel_name => 'sysctlget' }); } sub sysctlget_childexit { my ($kernel, $heap) = @_[KERNEL, HEAP]; unless ($heap->{shutdown}) { $kernel->yield(shutdown => 'sysctlget child abnormally terminated'); } } sub sysctlget { my ($heap, $args) = @_[HEAP, ARG0]; $heap->{sysctlget}->{$args->{sysctl}}->{source_wheel_id} = $args->{source_tcpclient_wheel_id} || $args->{source_tcpclient_readwrite_wheel_id} || $args->{source_wheel_id}; $heap->{sysctlget}->{$args->{sysctl}}->{source_type} = $args->{source_type}; my $wheel = $heap->{wheel_run}->{children_by_name}->{sysctlget}->{wheel}; return unless $wheel; #log_enabled && logline "put '%s'", $args->{sysctl}; $wheel->put($args->{sysctl}); } sub sysctlget_stdout_line { my ($kernel, $session, $heap, $line) = @_[KERNEL, SESSION, HEAP, ARG0]; #log_enabled && logline "line = '%s'", $line; if ($line =~ /^\s*(.+)=(.+)\s*$/) { my $name = $1; my $value = $2; $heap->{sysctlget}->{$name}->{value} = $value; my $wheel_id = delete $heap->{sysctlget}->{$name}->{source_wheel_id}; my $type = delete $heap->{sysctlget}->{$name}->{source_type}; $type = '' unless defined $type; #if ($wheel_id) if (1) { #my $output = $value; my ($output, $output_per_target); if ($name eq 'vm.loadavg') { #if ($type && $type eq 'poeclient') if ($type eq 'poeclient') { #$output = sprintf "%s loadavg %s", # POECLIENT_CMD_PREFIX, # $output; $output_per_target->{tcpclient} = sprintf "%s loadavg %s", POECLIENT_CMD_PREFIX, $value; } else { $output = sprintf "LOAD %.2f %.2f %.2f", split(/\s+/, $value); #$output_per_target->{tcpserver} = sprintf "LOADAVG %.2f %.2f %.2f", split(/\s+/, $value); } } elsif ($name =~ /^dev\.ti_adc\.0\.ain\.([0-7])\.input$/) { my $adc_num = $1; #if ($type && $type eq 'poeclient') if ($type eq 'poeclient') { #$output = sprintf "%s adc %s=raw:%s,mv:%.6f", # POECLIENT_CMD_PREFIX, # $adc_num, # $value, # $value / (2 ** 12 - 1) * 1800; $output_per_target->{tcpclient} = sprintf "%s adc %s=raw:%s,mv:%.6f", POECLIENT_CMD_PREFIX, $adc_num, $value, $value / (2 ** 12 - 1) * 1800; } else { $output = sprintf "ADC %s=(raw)%s,(mV)%.6f", $adc_num, $value, $value / (2 ** 12 - 1) * 1800; #$output_per_target->{tcpserver} = sprintf "ADC %s=(raw)%s,(mV)%.6f", # $adc_num, # $value, # $value / (2 ** 12 - 1) * 1800; } } elsif ($name eq 'kern.boottime') { #if ($type && $type eq 'poeclient') if ($type eq 'poeclient') { #$output = sprintf "%s sysuptime %.6f", # POECLIENT_CMD_PREFIX, # (time_hires - sprintf "%.6f", $output); $output_per_target->{tcpclient} = sprintf "%s sysuptime %.6f", POECLIENT_CMD_PREFIX, (time_hires - sprintf "%.6f", $value); } else { #$output_per_target->{tcpserver} = sprintf "SYSUPTIME %s", $value; } } elsif ($name eq 'kern.version') { #if ($type && $type eq 'poeclient') if ($type eq 'poeclient') { #$output =~ s/\x00//g; #$output =~ s/^\s+//; #$output =~ s/\s+$//; my $new_value = $value; $new_value =~ s/\x00//g; $new_value =~ s/^\s+//; $new_value =~ s/\s+$//; #$output = sprintf "%s sysversion %s", # POECLIENT_CMD_PREFIX, # $output; $output_per_target->{tcpclient} = sprintf "%s sysversion %s", POECLIENT_CMD_PREFIX, $new_value; } else { #$output_per_target->{tcpserver} = sprintf "SYSUPTIME %s", $value; } } else { log_enabled && logline "invalid sysctl name '%s'", $name; return; } if ($wheel_id && $output) { if ($type && $type eq 'poeclient') { $kernel->yield(tcpclient_output => { wheel_id => $wheel_id, output => $output, }); } else { if ($heap->{tcpserver}->{connections}->{$wheel_id}->{wheel}) { $kernel->yield(tcpserver_output => { wheel_id => $wheel_id, output => $output, }); } } } if ($output_per_target) { $kernel->call($session => wheelrun_send_network_reply => { output_per_target => $output_per_target, }); } } } } 1;