[supervision] remove obsolete perl gui

This commit is contained in:
Felix Ruess
2014-02-25 18:49:45 +01:00
parent c771902c61
commit 7e1074e1d0
3 changed files with 0 additions and 685 deletions
-358
View File
@@ -1,358 +0,0 @@
package Paparazzi::CpGui;
use Subject;
use Paparazzi::CpSessionMgr;
@ISA = qw(Paparazzi::CpSessionMgr);
use strict;
use Tk;
use Tk::MainWindow;
use Tk::NoteBook;
use Tk::HList;
use Tk::ItemStyle;
use Data::Dumper;
sub populate {
my ($self, $args) = @_;
$self->SUPER::populate($args);
$self->configspec(-logo_file => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, undef],
-variables => [S_SUPER, S_SUPER, S_SUPER, S_SUPER, S_SUPER, {}],
);
}
sub completeinit {
my ($self) = @_;
$self->SUPER::completeinit();
$self->build_gui();
}
sub onProgramSelected {
my ($self, $pgm_name) = @_;
$self->toggle_program($pgm_name);
}
sub onSessionSelected {
my ($self, $session_name) = @_;
$self->{'session_command_'.$session_name}->configure(-state => 'disabled');
$self->start_session($session_name);
$self->add_session_page($session_name);
}
sub onCloseSession {
my ($self, $session_name) = @_;
print "on close session\n";
$self->kill_session($session_name);
$self->{'session_command_'.$session_name}->configure(-state => 'active');
$self->remove_session_page($session_name);
}
use constant LIST_WIDTH => 80;
use constant LIST_HEIGHT => 20;
sub onCompile {
my ($self) = @_;
my $paparazzi_src = Paparazzi::Environment::paparazzi_src();
print `cd $paparazzi_src; make`;
}
sub build_gui {
my ($self) = @_;
my $mw = MainWindow->new();
$self->{mw} = $mw;
$mw->title ($self->{cp_name});
# menu bar
my $menubar =
$mw->Frame( -relief => 'ridge')->pack(-side => 'top', -fill => 'x');
my $session_menu = $menubar->Menubutton(-text => 'Sessions')->pack(-side => 'left');;
my $sessions = $self->get('-sessions');
foreach my $session_name (sort keys %{$sessions}) {
$self->{'session_command_'.$session_name} =
$session_menu->command( -label => $session_name,
-command => [\&onSessionSelected, $self, $session_name] );
}
my $program_menu = $menubar->Menubutton(-text => 'Programs')->pack(-side => 'left');;
my $programs = $self->get(-programs);
foreach my $pgm_name (keys %{$programs}) {
$program_menu->command( -label => $pgm_name,
-command => [\&onProgramSelected, $self, $pgm_name]
);
}
# session frame
my $session_frame = $mw->Frame( -relief => 'groove')->pack(-side => 'bottom', -fill => 'both', -expand => "yes",);
my $notebook = $session_frame->NoteBook( -ipadx => 6, -ipady => 6);
$self->{notebook} = $notebook;
$notebook->pack(-expand => "yes",
-fill => "both",
-padx => 5, -pady => 5,
-side => "top");
$self->build_logo_page($notebook);
# $self->build_compile_page($notebook);
# $self->build_list_page($notebook, "hosts", "Hosts", ["name", "ip", "status"], \&build_hosts_page);
# $self->build_list_page($notebook, "variables", "Variables", ["name", "value"], \&build_variables_page);
# $self->build_list_page($notebook, "programs", "Programs", ["name", "command", "args"], \&build_programs_page);
# $self->build_programs_page($notebook);
# $self->build_list_page($notebook, "sessions", "Sessions", ["name", "command", "args"], \&build_sessions_page);
# $self->build_programs_page($notebook);
# my $programs_page = $notebook->add("programs", -label => "Programs", -underline => 0);
# my $sessions_page = $notebook->add("sessions", -label => "Sessions", -underline => 0);
$self->{session_frame} = $session_frame;
check_paparazzi_home($mw);
}
sub check_paparazzi_home {
my ($mw) = @_;
if (Paparazzi::Environment::paparazzi_home() eq "/usr/share/paparazzi") {
my $button = $mw->messageBox(
-title => 'Welcome to Paparazzi',
-type => 'YesNo',
-message => "Paparazzi needs access to a writable directory to store your data and settings. Do you want Paparazzi to use a temporary system directory ?");
my $pph = "";
if ($button eq "Yes") {
$pph = `mktemp -d /tmp/paparazzi.XXXXXXXX`;
print "using dir $pph as paparazzi_home\n"
}
else {
$pph = $mw->chooseDirectory(-title => 'choose a directory',
-initialdir => '~/paparazzi'
);
# print "choosed $file_name\n";
if ($pph eq "") {
die("need a writable dir. Exiting");
}
}
my $pps = "/usr/share/paparazzi";
`cd $pps && make -f conf/Makefile.install DESTDIR=$pph install_skel\n`;
}
}
sub build_logo_page {
my ($self, $notebook) = @_;
my $logo_filename = $self->get('-logo_file');
return unless defined $logo_filename;
my $logo_page = $notebook->add("logo", -label => "Logo", -underline => 0);
my $image = $logo_page->Photo('logogif', -format => 'GIF',
-file => $logo_filename);
my $labelImage = $logo_page->Label('-image' => 'logogif')->pack();
return $logo_page;
}
sub build_compile_page {
my ($self, $notebook) = @_;
my $compile_page = $notebook->add("compile", -label => "Compile", -underline => 0);
my $paparazzi_src = Paparazzi::Environment::paparazzi_src();
my(@pl) = qw/-side top -expand yes -padx 10 -pady 10 -fill both/;
my $ground_frame = $compile_page->Frame(-label => 'Ground', -borderwidth => 2, - relief =>'groove')->pack(@pl);
# my $airborne_frame = $compile_page->Frame(-label => "Air", -borderwidth => 2, - relief =>'groove')->pack(@pl);
# my $ground_frame = $compile_page->Frame(-borderwidth => 2, - relief =>'groove')->pack(@pl);
my $airborne_frame = $compile_page->Frame(-borderwidth => 2, - relief =>'groove')->pack(@pl);
@pl = qw/-side top -expand yes -pady 2 -anchor w/;
my $mode_txt = 'Mode : '. (defined $paparazzi_src ? "Source tree" : "System install");
my $mode_label = $ground_frame->Label(-text => $mode_txt)->pack(@pl);
my $paparazzi_src_txt = 'location : '. (defined $paparazzi_src ? $paparazzi_src : "/usr/share/paparazzi");
my $paparazzi_src_label = $ground_frame->Label(-text => $paparazzi_src_txt)->pack(@pl);
my $make_button = $ground_frame->Button(
-text => "Compile",
-width => 10,
-command => [\&onCompile, $self],
);
$make_button->pack(qw/-side top -expand yes -pady 2/);
my @header = ("name", "airframe", "radio", "flight plan");
my $hlist = $airborne_frame->Scrolled ('HList',
# -selectmode => 'extended',
-header => 1,
# -columns => $#header + 1,
-width => LIST_WIDTH,
# -height => LIST_HEIGHT,
-itemtype => 'imagetext',
-indent => 35,
-separator => '/',
)->grid(-sticky => 'nsew');
Paparazzi::Environment::read_config();
}
sub build_hosts_page {
my ($self, $hlist, $e, $section_h, $item) = @_;
$hlist->itemCreate ($e, 0,
-itemtype => 'text',
-text => $item
);
my $ip = $section_h->{$item};
$hlist->itemCreate ($e, 1,
-itemtype => 'text',
-text => $ip?$ip:"unknown"
);
$hlist->itemCreate ($e, 2,
-itemtype => 'text',
-text => "unknown"
);
}
sub build_variables_page {
my ($self, $hlist, $e, $section_h, $item) = @_;
$hlist->itemCreate ($e, 0, -itemtype => 'text',
-text => $item
);
$hlist->itemCreate ($e, 1, -itemtype => 'text',
-text => $section_h->{$item},
);
}
#sub build_programs_page {
# my ($self, $hlist, $e, $section_h, $item) = @_;
# $hlist->itemCreate ($e, 0, -itemtype => 'text',
# -text => $item
# );
# $hlist->itemCreate ($e, 1, -itemtype => 'text',
# -text => $section_h->{$item}->{command},
# );
# $hlist->itemCreate ($e, 2, -itemtype => 'text',
# -text => $section_h->{$item}->{args},
# );
#}
sub build_sessions_page {
my ($self, $hlist, $e, $section_h, $item) = @_;
$hlist->itemCreate ($e, 0, -itemtype => 'text',
-text => $item
);
$hlist->itemCreate ($e, 1, -itemtype => 'text',
-text => $section_h->{$item}->{command},
);
$hlist->itemCreate ($e, 2, -itemtype => 'text',
-text => $section_h->{$item}->{args},
);
}
sub build_programs_page {
my ($self, $notebook) = @_;
my $page = $notebook->add("programs", -label => "Programs", -underline => 0);
my @header = ("name", "command", "args");
my $hlist = $page->Scrolled ('HList',
# -selectmode => 'extended',
-header => 1,
# -columns => $#header + 1,
-width => LIST_WIDTH,
-height => LIST_HEIGHT,
-itemtype => 'imagetext',
-indent => 35,
-separator => '/',
)->grid(-sticky => 'nsew');
# for my $i (0 .. $#header) {
# $hlist->header('create', $i, -text => $header[$i]);
# }
my $section_h = $self->get('-programs');
foreach my $program (keys %{$section_h}) {
# print Dumper($section_h->{$program})."\n";
$hlist->add($program, -text => $program );
$hlist->add($program."/command", -text => "command : ".$section_h->{$program}->{command});
$hlist->add($program."/args", -text => "args :");
my $args = $section_h->{$program}->{args};
foreach my $argh (@{$args}) {
$hlist->add($program."/args/".$argh->{flag}, -text => $argh->{flag}."\t". $argh->{type}."\t". $argh->{value});
}
}
return $page
}
sub build_list_page {
my ($self, $notebook, $section, $label, $header, $row_fun) = @_;
my $page = $notebook->add($section, -label => $label, -underline => 0);
my @header = @{$header};
my $hlist = $page->Scrolled ('HList',
-header => 1,
-columns => $#header + 1,
-width => LIST_WIDTH,
-height => LIST_HEIGHT,
)->grid(-sticky => 'nsew');
for my $i (0 .. $#header) {
# print("header $header[$i]\n");
$hlist->header('create', $i, -text => $header[$i]);
}
my $section_h = $self->get('-'.$section);
# print "CpGui variables ".Dumper($section_h) if ($section eq "variables");
foreach my $item (keys %{$section_h}) {
my $e = $hlist->addchild("");
&$row_fun($self, $hlist, $e, $section_h, $item);
# print("$hlist, $e, $section_h, $item\n");
}
return $page
}
sub add_session_page {
my ($self, $session_name) = @_;
my ($mw, $notebook) = ($self->{mw}, $self->{notebook});
my $page_id = "session_".$session_name;
my $session_page = $notebook->add($page_id, -label => "$session_name",
-underline => 0);
my $sessions = $self->get('-sessions');
my $session = $sessions->{$session_name};
my $hlist = $session_page->Scrolled ('HList',
-scrollbars => 'o',
-header => 1,
-columns => 3,
-width => LIST_WIDTH,
-height => LIST_HEIGHT,
-command => [\&on_session_pgm_clicked, $self, $session_name],
)->grid(-columnspan => 2);
$hlist->header('create', 0, -text => 'name');
$hlist->header('create', 1, -text => 'status');
$hlist->header('create', 2, -text => 'args');
foreach my $i (0..@{$session->{pgms}}-1) {
my $pgm = $session->{pgms}->[$i];
my $pgm_name = $pgm->{name};
print "i $i name : $pgm_name\n";
$hlist->add($i);
$hlist->itemCreate($i, 0, -text => $pgm_name );
$hlist->itemCreate($i, 1, -text => 'on' );
$hlist->itemCreate($i, 2, -text => 'blah' );
}
$self->{$session_name.'hlist'} = $hlist;
# $session_page->Button( -text => "killall")->grid(-column => 0, -row => 1);
$session_page->Button( -text => "close",
-command => [\&onCloseSession, $self, $session_name])->grid(-column => 1, -row => 1);
$notebook->raise($page_id);
}
sub remove_session_page {
my ($self, $session_name) = @_;
my $notebook = $self->{notebook};
my $page_id = "session_".$session_name;
$notebook->delete($page_id);
}
sub on_session_pgm_clicked {
print "in CpGui::on_session_pgm_clicked @_\n";
my ($self, $session_name, $pgm_idx) = @_;
$self->toggle_program_in_session($session_name, $pgm_idx);
my $text = $self->get_session_program_status($session_name, $pgm_idx) ? 'on' : 'off';
$self->{$session_name.'hlist'}->itemConfigure($pgm_idx, 1, -text => $text);
}
1;
-79
View File
@@ -1,79 +0,0 @@
package Paparazzi::CpPgmMgr;
use Subject;
@ISA = ("Subject");
use strict;
sub populate {
my ($self, $args) = @_;
$self->SUPER::populate($args);
$self->configspec(-children => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, {}],
);
}
sub completeinit {
my $self = shift;
$self->SUPER::completeinit;
}
sub start_program() {
my ($self, $pgm, @options, @args, $keep_stdin) = @_;
my %children = %{$self->get('-children')};
# print("in ChildrenSpawner::start_programm args [$pgm @args]\n");
my $pid = undef;
my $sleep_count = 0;
my $fh;
do {
$pid = fork();
$SIG{PIPE} = sub { die "whoops, $pgm pipe broke" };
unless (defined $pid) {
warn "cannot fork: $!";
die "bailing out" if $sleep_count++ > 6;
sleep 1;
}
} until defined $pid;
if (! $pid) { # child
$SIG{TERM} = 'IGNORE';
exec ($pgm, @options, @args);# or die "couldnt exec foo: $pgm @args";
# NOTREACHED
exit(1);
}
# parent
$children{$pid} = {cmd => $pgm, args => \@args};#, ktw => $fh};
$self->configure('-children', \%children);
# foreach my $key (keys %children) {
# print("in ChildrenSpawner::start_programm child: [$key $children{$key}]\n");
# }
return $pid;
}
sub stop_program() {
my ($self, $pid) = @_;
# print "in_stop_program $pid\n";
my %children = %{$self->get('-children')};
my $pgm = $children{$pid};
if (defined $pgm) {
# printf STDOUT "Killing Process %d [%s %s]\n", $pid, $pgm->{cmd}, $pgm->{args};
kill 9, $pid;
$children{$pid} = undef;
$self->configure('-children', \%children);
}
}
sub terminate_all() {
my ($self) = @_;
# print("in ChildrenSpawner::terminate_all\n");
my %pgms = %{$self->get('-children')};
foreach my $pid (keys %pgms) {
# print "killing $pid ($pgms{$pid})\n";
$self->stop_program($pid);
}
}
1;
-248
View File
@@ -1,248 +0,0 @@
package Paparazzi::CpSessionMgr;
use Data::Dumper;
use XML::DOM;
use Subject;
use Paparazzi::CpPgmMgr;
@ISA = qw(Paparazzi::CpPgmMgr);
use strict;
sub populate {
my ($self, $args) = @_;
$self->SUPER::populate($args);
$self->configspec(-config_file => [S_NEEDINIT, S_PASSIVE, S_RDONLY, S_OVRWRT, S_NOPRPG, undef],
-bin_base_dir => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, "/usr/bin"],
-log_dir => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, "/var/tmp"],
-variables => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, {}],
-hosts => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, {}],
-programs => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, {}],
-sessions => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, {}],
);
}
sub completeinit {
my ($self) = @_;
$self->SUPER::completeinit();
# my $cfg_file = $self->get('-config_file');
# my $variables = $self->get('-variables');
# $self->read_cfg($cfg_file);
$self->check_config();
}
sub prepare_args {
my ($self, $args, $session) = @_;
my (@options, @rargs);
my $variables = $self->get('-variables');
# print "CpSessionMgr : variables ".Dumper($variables);
foreach my $opt (@{$args}) {
my $type = $opt->{type};
my $flag = $opt->{flag};
my $value;
if ($type eq 'var') {
if (defined $session and exists $session->{vars}->{$opt->{value}}) {
$value = $session->{vars}->{$opt->{value}}
}
else {
$value = $variables->{$opt->{value}}
}
}
else {
$value = $opt->{value};
}
if ($flag) {
if ($flag =~ /\.*=/) { push @options, $flag.$value}
else {push @options, $flag, $value}
}
else { push @rargs, $value}
}
return (@options, @rargs);
}
sub find_binary {
my ($self, $program) = @_;
my $command;
if ($program->{command} =~ /^\/.*/) {
$command = $program->{command};
}
else {
$command = $self->get('-bin_base_dir')."/".$program->{command};
}
return $command;
}
sub toggle_program {
my ($self, $pgm_name) = @_;
print "processing program out session context\n";
my $program = $self->get('-programs')->{$pgm_name};
if (defined $program->{pid}) {
$self->SUPER::stop_program($program->{pid});
$program->{pid} = undef;
}
else {
my (@options, @args) = $self->prepare_args($program->{args});
my $command = $self->find_binary($program);
print "starting $program->{name} [$command @options @args]\n";
$program->{pid} = $self->SUPER::start_program($command, @options[0..$#options], @args[0..$#args]);
}
}
sub toggle_program_in_session {
my ($self, $session_name, $pgm_idx) = @_;
$self->check_config();
my $session = $self->get('-sessions')->{$session_name};
my $session_program = $session->{pgms}->[$pgm_idx];
# print "processing program in session context\n".Dumper($session);
if (defined $session_program->{pid}) {
print "killing program $session_program->{name} => $session_program->{pid}\n";
$self->SUPER::stop_program($session_program->{pid});
$session_program->{pid} = undef;
}
else {
print "launching program\n";
my $program_name = $session_program->{name};
my $program = $self->get('-programs')->{$program_name};
my (@pgm_options, @pgm_args) = $self->prepare_args($program->{args}, $session);
my (@session_options, @session_args) = $self->prepare_args($session_program->{args});
push @pgm_options, @session_options;
push @pgm_args, @session_args;
my $command = $self->find_binary($program);
print "starting $program->{name} [$command @pgm_options @pgm_args]\n";
$session_program->{pid} = $self->SUPER::start_program($command, @pgm_options[0..$#pgm_options], @pgm_args[0..$#pgm_args]);
# print "launched $program_name => pid $session_program->{pid}\n";
}
}
sub start_session {
my ($self, $session_name) = @_;
$self->check_config();
# print "starting session $session_name\n";
my $sessions = $self->get('-sessions');
my $session = $sessions->{$session_name};
my @progs = @{$session->{pgms}};
# print "progs ".Dumper(@progs);
foreach my $pgm_idx (0..@progs-1) {
$self->toggle_program_in_session($session_name, $pgm_idx);
}
}
sub kill_session {
my ($self, $session_name) = @_;
my $session = $self->get('-sessions')->{$session_name};
my @progs = @{$session->{pgms}};
foreach my $pgm_idx (0..@progs-1) {
$self->toggle_program_in_session($session_name, $pgm_idx) if ($self->get_session_program_status($session_name, $pgm_idx));
}
}
sub get_session_program_status {
my ($self, $session_name, $pgm_idx) = @_;
my $session = $self->get('-sessions')->{$session_name};
my $session_program = $session->{pgms}->[$pgm_idx];
return (defined $session_program->{pid});
}
#
# check if the config file has been modified since we parsed it and
# eventually reread it
#
sub check_config {
my ($self) = @_;
my $cfg_file = $self->get('-config_file');
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks)
= stat($cfg_file);
if (not exists $self->{last_cfg_read_time} or $mtime > $self->{last_cfg_read_time}) {
print("(re) reading config\n");
$self->read_cfg($cfg_file);
$self->{last_cfg_read_time} = $mtime;
}
}
sub xml_parse_args {
my ($args) = @_;
my @args_a;
foreach my $arg (@{$args}){
my $var = $arg->getAttribute('variable');
my $args_h = {
flag => $arg->getAttribute('flag'),
type => $var eq '' ? 'const' : 'var',
value => $var eq '' ? $arg->getAttribute('constant'): $var,
};
push @args_a, $args_h;
}
# print "@args_a\n";
return \@args_a;
}
sub xml_parse_section {
my ($self, $section) = @_;
my $section_name = $section->getAttribute('name');
my ($items_name) = ($section_name =~ /(.*)s$/);
# print "section $section_name items_name $items_name\n";
my $items = $section->getElementsByTagName($items_name);
my $h_name = '-'.$section_name;
# print "h_name $h_name\n";
my $tmp = $self->get($h_name);
foreach my $item (@{$items}){
if ($section_name eq "hosts") {
$tmp->{$item->getAttribute('name')} = $item->getAttribute('ip');
}
elsif ($section_name eq 'variables') {
$tmp->{$item->getAttribute('name')} = $item->getAttribute('value');
}
elsif ($section_name eq 'programs') {
my $pgm_name = $item->getAttribute('name');
my $args = $item->getElementsByTagName("arg");
my $args_h = xml_parse_args($args);
$tmp->{$pgm_name} =
{name => $pgm_name,
command => $item->getAttribute('command'),
args => $args_h,
};
}
elsif ($section_name eq 'sessions') {
my $session_name = $item->getAttribute('name');
my $xsessions_pgms = $item->getElementsByTagName("program");
my @sessions_pgms;
foreach my $session_pgm (@{$xsessions_pgms}){
my $pgm_name = $session_pgm->getAttribute('name');
my $session_args = $session_pgm->getElementsByTagName("arg");
my $args_h = xml_parse_args($session_args);
push @sessions_pgms, {
name => $pgm_name,
args => $args_h
};
}
my $session_vars = {};
my @xsession_vars = $item->getElementsByTagName("variable");
foreach my $session_var (@xsession_vars){
$session_vars->{$session_var->getAttribute('name')} = $session_var->getAttribute('value')
}
$tmp->{$session_name} = {
name => $session_name,
pgms => \@sessions_pgms,
vars => $session_vars,
};
}
}
$self->configure($h_name => $tmp);
}
sub read_cfg {
my ($self, $filename) = @_;
my $parser = XML::DOM::Parser->new();
my $doc = $parser->parsefile($filename);
my $cp = $doc->getElementsByTagName("control_panel")->[0];
$self->{cp_name} = $cp->getAttribute('name');
my $sections = $cp->getElementsByTagName("section");
foreach my $section (@{$sections}) {
$self->xml_parse_section($section);
}
}
1;