Handle hostnames with upper-case letters
[webmin.git] / proc / edit_proc.cgi
1 #!/usr/local/bin/perl
2 # edit_proc.cgi
3 # Display information about a process
4
5 require './proc-lib.pl';
6 &ui_print_header(undef, $text{'edit_title'}, "", "edit_proc");
7 %pinfo = &process_info($ARGV[0]);
8 &can_edit_process($pinfo{'user'}) || &error($text{'edit_ecannot'});
9
10 # Check if the process is still running
11 if (!%pinfo) {
12         print "<b>$text{'edit_gone'}</b> <p>\n";
13         &ui_print_footer("", $text{'index_return'});
14         exit;
15         }
16
17 print &ui_table_start($text{'edit_title'}, "width=100%", 4,
18                       [ "width=20%", "width=30%", "width=20%", "width=30%" ]);
19
20 # Full command
21 print &ui_table_row($text{'command'},
22         "<tt>".&html_escape($pinfo{args})."</tt>", 3);
23
24 # Process ID
25 print &ui_table_row($text{'pid'}, $pinfo{pid});
26
27 # Parent process
28 if ($pinfo{ppid}) {
29         local %ppinfo = &process_info($pinfo{ppid});
30         print &ui_table_row($text{'parent'},
31                 "<a href=\"edit_proc.cgi?$ppinfo{pid}\">".
32                 &cut_string($ppinfo{'args'}, 30)."</a>");
33         }
34 else {
35         print &ui_table_row($text{'parent'}, $text{'edit_none'});
36         }
37
38 # Unix user
39 print &ui_table_row($text{'owner'}, $pinfo{'user'});
40
41 # CPU use
42 print &ui_table_row($text{'cpu'}, $pinfo{'cpu'});
43
44 # Memory size
45 print &ui_table_row($text{'size'}, $pinfo{'size'});
46
47 # Run time
48 print &ui_table_row($text{'runtime'}, $pinfo{'time'});
49
50 # Nice level
51 print &ui_form_start("renice_proc.cgi");
52 print &ui_hidden("pid", $ARGV[0]);
53 print &ui_table_row(&hlink($text{'nice'},"nice"),
54         &indexof($pinfo{nice}, @nice_range) < 0 ? $pinfo{nice} :
55                 &nice_selector("nice", $pinfo{nice}).
56                 &ui_submit($text{'edit_change'}), 3);
57
58 # IO scheduling class, if support
59 if (defined(&os_list_scheduling_classes) &&
60     (@classes = &os_list_scheduling_classes())) {
61         ($class, $prio) = &os_get_scheduling_class($pinfo{'pid'});
62         ($got) = grep { $_->[0] == $class } @classes;
63         if (!$got) {
64                 # Some unknown class, probably 'none'
65                 unshift(@classes, [ $class, $text{'default'} ]);
66                 }
67         print &ui_table_row(&hlink($text{'sclass'},"sclass"),
68                 &ui_select("sclass", $class, \@classes));
69         print &ui_table_row(&hlink($text{'sprio'},"sprio"),
70                 &ui_select("sprio", $prio,
71                            [ &os_list_scheduling_priorities() ], 1, 0, 1));
72         }
73
74 print &ui_form_end();
75
76 # Extra OS-specific info
77 foreach $k (keys %pinfo) {
78         if ($k =~ /^_/) {
79                 print &ui_table_row($info_arg_map{$k}, $pinfo{$k});
80                 }
81         }
82 print &ui_table_end();
83
84 print "<table width=100%><tr>\n";
85 if ($access{'simple'}) {
86         # Just display buttons for common signals
87         print &ui_form_start("kill_proc.cgi");
88         print &ui_hidden("pid", $pinfo{pid});
89         print "<td nowrap>\n";
90         foreach $s ('KILL', 'TERM', 'HUP', 'STOP', 'CONT') {
91                 print &ui_submit($text{"kill_".lc($s)}, $s);
92                 }
93         print "</td>\n";
94         print &ui_form_end();
95         }
96 else {
97         # Allow the sending of any signal
98         print &ui_form_start("kill_proc.cgi");
99         print &ui_hidden("pid", $pinfo{pid});
100         print "<td nowrap>\n";
101         print &ui_submit($text{'edit_kill'});
102         print &ui_select("signal", "HUP", [ &supported_signals() ]);
103
104         print "&nbsp;" x 4;
105         print &ui_submit($text{'edit_sigterm'}, 'TERM');
106         print &ui_submit($text{'edit_sigkill'}, 'KILL');
107         print "&nbsp;" x 4;
108         print &ui_submit($text{'edit_sigstop'}, 'STOP');
109         print &ui_submit($text{'edit_sigcont'}, 'CONT');
110         print "</td>\n";
111         print &ui_form_end();
112         }
113
114 if ($has_trace_command) {
115         # Show button to trace syscalls
116         print &ui_form_start("trace.cgi");
117         print &ui_hidden("pid", $pinfo{pid});
118         print "<td align=right width=10>",
119               &ui_submit($text{'edit_trace'}),"</td>\n";
120         print &ui_form_end();
121         }
122
123 if ($has_lsof_command) {
124         # Show button to display currently open files
125         print &ui_form_start("open_files.cgi");
126         print &ui_hidden("pid", $pinfo{pid});
127         print "<td align=right width=10>",
128               &ui_submit($text{'edit_open'}),"</td></form>\n";
129         print &ui_form_end();
130         }
131 print "</tr></table><p>\n";
132
133 # Sub-processes table
134 @sub = grep { $_->{'ppid'} == $pinfo{pid} } &list_processes();
135 if (@sub) {
136         print &ui_columns_start([ $text{'edit_subid'},
137                                   $text{'edit_subcmd'} ], 100);
138         @sub = sort { $a->{'pid'} <=> $b->{'pid'} } @sub;
139         foreach $s (@sub) {
140                 local $p = $s->{'pid'};
141                 print &ui_columns_row([
142                         "<a href=\"edit_proc.cgi?$p\">$p</a>",
143                         &cut_string($s->{args}, 80),
144                         ]);
145                 }
146         print &ui_columns_end();
147         }
148
149 &ui_print_footer("", $text{'index_return'});
150