52 |
use config; |
use config; |
53 |
use client; |
use client; |
54 |
use log; |
use log; |
55 |
|
use x11; |
56 |
|
use amt; |
57 |
|
|
58 |
sub static { |
sub static { |
59 |
my ($client,$path) = @_; |
my ($client,$path) = @_; |
108 |
use boolean; |
use boolean; |
109 |
|
|
110 |
use kvm; |
use kvm; |
|
use qemu; $pids->{qemu} = 'stopped'; |
|
111 |
|
|
112 |
$SIG{CHLD} = 'IGNORE'; |
$SIG{CHLD} = 'IGNORE'; |
113 |
|
|
137 |
if ( $daemon =~ m{dhcpd|tftpd|dnsd} ) { |
if ( $daemon =~ m{dhcpd|tftpd|dnsd} ) { |
138 |
my $exec = "perl -I$server::base_dir/lib -I$server::base_dir/lib/PXElator -M$daemon -e ${daemon}::${invoke}"; |
my $exec = "perl -I$server::base_dir/lib -I$server::base_dir/lib/PXElator -M$daemon -e ${daemon}::${invoke}"; |
139 |
warn "exec $exec"; |
warn "exec $exec"; |
140 |
exec "xterm -T $daemon -n $daemon -e $exec"; |
x11::xterm( $daemon => $exec ); |
141 |
} else { |
} else { |
142 |
my $eval = $daemon . '::' . $invoke . '(' . ( @_ ? dump(@_) : '' ) . ')'; |
my $eval = $daemon . '::' . $invoke . '(' . ( @_ ? dump(@_) : '' ) . ')'; |
143 |
warn "eval $eval"; |
warn "eval $eval"; |
175 |
foreach my $name ( sort keys %$pids ) { |
foreach my $name ( sort keys %$pids ) { |
176 |
my $pid = $pids->{$name} || next; |
my $pid = $pids->{$name} || next; |
177 |
|
|
178 |
my $html = qq|<a href=/start_stop/$name>$pid</a>|; |
my $html; |
179 |
|
|
180 |
my $proc = "/proc/$pid/status"; |
my $proc = "/proc/$pid/status"; |
181 |
|
|
182 |
if ( -e $proc ) { |
if ( -e $proc ) { |
183 |
|
$html .= qq|<a href=/start_stop/$name>$pid</a>|; |
184 |
if ( $debug ) { |
if ( $debug ) { |
185 |
$html .= qq| <a name=$pid href=#proc-$pid>?</a>|; |
$html .= qq| <a name=$pid href=#proc-$pid>?</a>|; |
186 |
|
|
198 |
if ( $name->can('actions') ) { |
if ( $name->can('actions') ) { |
199 |
$html .= qq| <a href=/action/kvm/$_>$_</a>| foreach $name->actions; |
$html .= qq| <a href=/action/kvm/$_>$_</a>| foreach $name->actions; |
200 |
} |
} |
201 |
|
} else { |
202 |
|
$html .= qq|<a href=/start_stop/$name>restart</a> $pid exited|; |
203 |
} |
} |
204 |
|
|
205 |
push @rows, ( $name => $html ); |
push @rows, ( $name => $html ); |
249 |
, config::for_ip( $ip ) |
, config::for_ip( $ip ) |
250 |
, qq|</pre>| |
, qq|</pre>| |
251 |
; |
; |
252 |
|
|
253 |
|
if ( my $amt = client::conf( $ip, 'amt' ) ) { |
254 |
|
print $client amt::info( $amt ); |
255 |
|
} |
256 |
} else { |
} else { |
257 |
print $client $ok |
print $client $ok |
258 |
, qq|<h2>Clients on $server::ip</h2>| |
, qq|<h2>Clients on $server::ip</h2>| |
259 |
, qq|<ul>| |
, html::table( -4, |
260 |
, join("\n", |
'ip', 'mac', 'hostname', 'deploy', |
261 |
map { |
map { |
262 |
my $ip = $_; |
my $ip = $_; |
263 |
$ip =~ s{^.+/ip/}{}; |
$ip =~ s{^.+/ip/}{}; |
264 |
qq|<li><a href=/client/$ip>$ip</a> |, client::mac($ip), ' ', client::conf( $ip, 'hostname' ), qq|</li>|; |
( qq|<a href=/client/$ip>$ip</a>|, client::mac($ip), client::conf( $ip, 'hostname' ), client::conf( $ip, 'deploy' ) ); |
265 |
} |
} |
266 |
glob("$server::conf/ip/*") |
glob("$server::conf/ip/*") |
267 |
) |
) |
|
, qq|</ul>| |
|
268 |
; |
; |
269 |
} |
} |
270 |
} elsif ( $path =~ m{^/our/(\w+)/(\S+)} ) { |
} elsif ( $path =~ m{^/our/(\w+)/(\S+)} ) { |
307 |
start_stop 'dhcpd'; |
start_stop 'dhcpd'; |
308 |
start_stop 'tftpd'; |
start_stop 'tftpd'; |
309 |
start_stop 'dnsd'; |
start_stop 'dnsd'; |
310 |
start_stop 'kvm'; |
start_stop 'kvm' unless $ENV{DEV}; # skip kvm statup when running on real device |
311 |
|
|
312 |
while (1) { |
while (1) { |
313 |
my $client = $server->accept() || next; # ALARM trickle us |
my $client = $server->accept() || next; # ALARM trickle us |