Handle hostnames with upper-case letters
[webmin.git] / proc / trace.cgi
1 #!/usr/local/bin/perl
2 # Display syscalls made by this process in real time
3
4 require './proc-lib.pl';
5 &ReadParse();
6 if ($config{'trace_java'}) {
7         &ui_print_header(undef, $text{'trace_title'}, "", "trace");
8         }
9 else {
10         &ui_print_unbuffered_header(undef, $text{'trace_title'}, "", "trace");
11         }
12 %pinfo = &process_info($in{'pid'});
13 &can_edit_process($pinfo{'user'}) || &error($text{'edit_ecannot'});
14 if (!%pinfo) {
15         print "<b>$text{'edit_gone'}</b> <p>\n";
16         &ui_print_footer("", $text{'index_return'});
17         exit;
18         }
19
20 $syscalls = &ui_form_start("trace.cgi", "post")."\n".
21             &ui_hidden("pid", $in{'pid'})."\n".
22             "<b>$text{'trace_syscalls'}</b>\n".
23             &ui_radio("all", defined($in{'all'}) ? $in{'all'} : 1,
24                       [ [ 1, $text{'trace_all'} ],
25                         [ 0, $text{'trace_sel'} ] ])."\n".
26             &ui_textbox("syscalls", $in{'syscalls'}, 40)."\n".
27             &ui_submit($text{'trace_change'})."\n".
28             &ui_form_end()."\n";
29
30 if ($config{'trace_java'}) {
31         # Output Java applet to show trace
32         print "<b>",&text('trace_doing', "<tt>$pinfo{'args'}</tt>"),"</b><br>\n";
33         print $syscalls;
34         print "<applet code=Tracer width=800 height=300>\n";
35         &seed_random();
36         $id = int(rand()*1000000000);
37         print "<param name=url value='tail.cgi?pid=$in{'pid'}&id=$id&syscalls=",
38               $in{'all'} ? "" : &urlize($in{'syscalls'}),"'>\n";
39         print "<param name=killurl value='killtail.cgi?id=$id'>\n";
40         if ($main::session_id) {
41                 print "<param name=session value=\"sid=$main::session_id\">\n";
42                 }
43         print "$text{'trace_sorry'}<p>\n";
44         print "</applet>\n";
45         }
46 else {
47         # Just display here as text
48         @syscalls = $in{'all'} ? ( ) : split(/\s+/, $in{'syscalls'});
49         $trace = &open_process_trace($in{'pid'},
50                                      \@syscalls);
51         $fmt = "%-8.8s %-11.11s %-80.80s %-10.10s";
52         print "<b>",&text('trace_start', "<tt>$pinfo{'args'}</tt>"),"</b><br>\n";
53         print $syscalls;
54         print "<pre>";
55         printf "$fmt\n", "Time", "System Call", "Parameters", "Return";
56         printf "$fmt\n", ("-"x8), ("-"x11), ("-"x80), ("-"x10);
57         while($action = &read_process_trace($trace)) {
58                 local $tm = strftime("%H:%M:%S", localtime($action->{'time'}));
59                 printf "$fmt\n", $tm, $action->{'call'},
60                                  join(", ", @{$action->{'args'}}),
61                                  $action->{'rv'};
62                 }
63         print "</pre>";
64         &close_process_trace($trace);
65         if (!kill(0, $in{'pid'})) {
66                 print "<b>$text{'trace_done'}</b><br>\n";
67                 }
68         else {
69                 print "<b>$text{'trace_failed'}</b><br>\n";
70                 }
71         }
72
73 &ui_print_footer("edit_proc.cgi?$in{'pid'}", $text{'edit_return'},
74                  "", $text{'index_return'});
75