# custom-lib.pl # Functions for storing custom commands BEGIN { push(@INC, ".."); }; use WebminCore; &init_config(); %access = &get_module_acl(); # list_commands() # Returns a list of all custom commands sub list_commands { local (@rv, $f); local $mcd = $module_info{'usermin'} ? $config{'webmin_config'} : $module_config_directory; opendir(DIR, $mcd); while($f = readdir(DIR)) { local %cmd; if ($f =~ /^(\d+)\.cmd$/) { # Read custom-command file $cmd{'file'} = "$mcd/$f"; $cmd{'id'} = $1; open(FILE, "<".$cmd{'file'}); chop($cmd{'cmd'} = <FILE>); chop($cmd{'desc'} = <FILE>); local @o = split(/\s+/, <FILE>); $cmd{'user'} = $o[0]; $cmd{'raw'} = int($o[1]); $cmd{'su'} = int($o[2]); $cmd{'order'} = int($o[3]); $cmd{'noshow'} = int($o[4]); $cmd{'usermin'} = int($o[5]); $cmd{'timeout'} = int($o[6]); $cmd{'clear'} = int($o[7]); $cmd{'format'} = $o[8] eq '-' ? undef : $o[8]; } elsif ($f =~ /^(\d+)\.edit$/) { # Read file-editor file $cmd{'file'} = "$mcd/$f"; $cmd{'id'} = $1; open(FILE, "<".$cmd{'file'}); chop($cmd{'edit'} = <FILE>); chop($cmd{'desc'} = <FILE>); chop($cmd{'user'} = <FILE>); chop($cmd{'group'} = <FILE>); chop($cmd{'perms'} = <FILE>); chop($cmd{'before'} = <FILE>); chop($cmd{'after'} = <FILE>); chop($cmd{'order'} = <FILE>); $cmd{'order'} = int($cmd{'order'}); chop($cmd{'usermin'} = <FILE>); chop($cmd{'envs'} = <FILE>); chop($cmd{'beforeedit'} = <FILE>); } elsif ($f =~ /^(\d+)\.sql$/) { # Read SQL file $cmd{'file'} = "$mcd/$f"; $cmd{'id'} = $1; open(FILE, "<".$cmd{'file'}); chop($cmd{'desc'} = <FILE>); chop($cmd{'type'} = <FILE>); chop($cmd{'db'} = <FILE>); chop($cmd{'user'} = <FILE>); chop($cmd{'pass'} = <FILE>); chop($cmd{'host'} = <FILE>); chop($cmd{'sql'} = <FILE>); $cmd{'sql'} =~ s/\t/\n/g; chop($cmd{'order'} = <FILE>); } if (%cmd) { # Read common stuff while(<FILE>) { s/\r|\n//g; local @a = split(/:/, $_, 5); local ($quote, $must) = split(/,/, $a[3]); push(@{$cmd{'args'}}, { 'name' => $a[0], 'type' => $a[1], 'opts' => $a[2], 'quote' => int($quote), 'must' => int($must), 'desc' => $a[4] }); } close(FILE); $cmd{'index'} = scalar(@rv); open(HTML, "<$mcd/$cmd{'id'}.html"); while(<HTML>) { $cmd{'html'} .= $_; } close(HTML); # Read cluster hosts file open(CLUSTER, "<$mcd/$cmd{'id'}.hosts"); while(<CLUSTER>) { s/\r|\n//g; push(@{$cmd{'hosts'}}, $_); } close(CLUSTER); push(@rv, \%cmd); } } closedir(DIR); return @rv; } # sort_commands(&command, ...) # Sorts a list of custom commands by the user-defined order sub sort_commands { local @cust = @_; if ($config{'sort'}) { @cust = sort { lc($a->{$config{'sort'}}) cmp lc($b->{$config{'sort'}}) } @cust; } else { @cust = sort { local $o = $b->{'order'} <=> $a->{'order'}; $o ? $o : $a->{'id'} <=> $b->{'id'} } @cust; } return @cust; } # get_command(id) # Returns the command with some ID sub get_command { local ($id, $idx) = @_; local @cmds = &list_commands(); local $cmd; if ($id) { ($cmd) = grep { $_->{'id'} eq $id } &list_commands(); } else { $cmd = $cmds[$idx]; } return $cmd; } # save_command(&command) sub save_command { local $c = $_[0]; if ($c->{'edit'}) { # Save a file editor &open_lock_tempfile(FILE, ">$module_config_directory/$c->{'id'}.edit"); &print_tempfile(FILE, $c->{'edit'},"\n"); &print_tempfile(FILE, $c->{'desc'},"\n"); &print_tempfile(FILE, $c->{'user'},"\n"); &print_tempfile(FILE, $c->{'group'},"\n"); &print_tempfile(FILE, $c->{'perms'},"\n"); &print_tempfile(FILE, $c->{'before'},"\n"); &print_tempfile(FILE, $c->{'after'},"\n"); &print_tempfile(FILE, $c->{'order'},"\n"); &print_tempfile(FILE, $c->{'usermin'},"\n"); &print_tempfile(FILE, $c->{'envs'},"\n"); &print_tempfile(FILE, $c->{'beforeedit'},"\n"); } elsif ($c->{'sql'}) { # Save an SQL command &open_lock_tempfile(FILE, ">$module_config_directory/$c->{'id'}.sql"); &print_tempfile(FILE, $c->{'desc'},"\n"); &print_tempfile(FILE, $c->{'type'},"\n"); &print_tempfile(FILE, $c->{'db'},"\n"); &print_tempfile(FILE, $c->{'user'},"\n"); &print_tempfile(FILE, $c->{'pass'},"\n"); &print_tempfile(FILE, $c->{'host'},"\n"); local $sql = $c->{'sql'}; $sql =~ s/\n/\t/g; &print_tempfile(FILE, $sql,"\n"); &print_tempfile(FILE, $c->{'order'},"\n"); } else { # Save a custom command &open_lock_tempfile(FILE, ">$module_config_directory/$c->{'id'}.cmd"); &print_tempfile(FILE, $c->{'cmd'},"\n"); &print_tempfile(FILE, $c->{'desc'},"\n"); &print_tempfile(FILE, $c->{'user'}," ",int($c->{'raw'})," ",int($c->{'su'})," ", int($c->{'order'})," ",int($c->{'noshow'})," ", int($c->{'usermin'})," ",int($c->{'timeout'})," ", int($c->{'clear'})," ",($c->{'format'} || "-"),"\n"); } # Save parameters foreach $a (@{$c->{'args'}}) { &print_tempfile(FILE, $a->{'name'},":",$a->{'type'},":", $a->{'opts'},":",int($a->{'quote'}),",",int($a->{'must'}),":", $a->{'desc'},"\n"); } &close_tempfile(FILE); # Save HTML description file &lock_file("$module_config_directory/$c->{'id'}.html"); if ($cmd->{'html'}) { &open_tempfile(HTML, ">$module_config_directory/$c->{'id'}.html"); &print_tempfile(HTML, $cmd->{'html'}); &close_tempfile(HTML); } else { unlink("$module_config_directory/$c->{'id'}.html"); } &unlock_file("$module_config_directory/$c->{'id'}.html"); # Save cluster hosts &lock_file("$module_config_directory/$c->{'id'}.hosts"); if (@{$cmd->{'hosts'}}) { &open_tempfile(CLUSTER, ">$module_config_directory/$c->{'id'}.hosts"); foreach my $h (@{$cmd->{'hosts'}}) { &print_tempfile(CLUSTER, "$h\n"); } &close_tempfile(CLUSTER); } else { unlink("$module_config_directory/$c->{'id'}.hosts"); } &unlock_file("$module_config_directory/$c->{'id'}.hosts"); } # delete_command(&command) sub delete_command { local $f = "$module_config_directory/$_[0]->{'id'}". ($_[0]->{'edit'} ? ".edit" : $_[0]->{'sql'} ? ".sql" : ".cmd"); &lock_file($f); unlink($f); &unlock_file($f); # Delete HTML file local $hf = "$module_config_directory/$_[0]->{'id'}.html"; if (-r $hf) { &lock_file($hf); unlink($hf); &unlock_file($hf); } # Delete cluster file local $cf = "$module_config_directory/$_[0]->{'id'}.hosts"; if (-r $cf) { &lock_file($cf); unlink($cf); &unlock_file($cf); } } sub can_run_command { if ($module_info{'usermin'}) { # Only modules marked as for Usermin are considered return 0 if (!$_[0]->{'usermin'}); # Check detailed access control list (if any) return 1 if (!$config{'access'}); local @uinfo = @remote_user_info; @uinfo = getpwnam($remote_user) if (!@uinfo); local $l; foreach $l (split(/\t/, $config{'access'})) { if ($l =~ /^(\S+):\s*(.*)$/) { local ($user, $ids) = ($1, $2); local $applies; if ($user =~ /^\@(.*)$/) { # Check if user is in group local @ginfo = getgrnam($1); $applies++ if (@ginfo && ($ginfo[2] == $uinfo[3] || &indexof($remote_user, split(/\s+/, $ginfo[3])) >= 0)); } elsif ($user eq $remote_user || $user eq "*") { $applies++; } if ($applies) { # Rule is for this user - check list local @ids = split(/\s+/, $ids); local $d; foreach $d (@ids) { return 1 if ($d eq '*' || $_[0]->{'id'} eq $d); return 0 if ("!".$_[0]->{'id'} eq $d); } return 0; } } } return 0; } else { # Just use Webmin user's list of databases local $c; local $found; return 1 if ($access{'cmds'} eq '*'); local @cmds = split(/\s+/, $access{'cmds'}); foreach $c (@cmds) { $found++ if ($c eq $_[0]->{'id'}); } return $cmds[0] eq '!' ? !$found : $found; } } # read_opts_file(file) # Read the file containing possible menu options for a command sub read_opts_file { local @rv; local $file = $_[0]; if ($file !~ /^\// && $file !~ /\|\s*$/) { local @uinfo = getpwnam($remote_user); if (@uinfo) { $file = "$uinfo[7]/$file"; } } my $h; $h = "<" if ($file =~ /^\// && $file !~ /\|\s*$/); open(FILE, "$h".$file); while(<FILE>) { s/\r|\n//g; next if (/^#/); if (/^"([^"]*)"\s+"([^"]*)"$/) { push(@rv, [ $1, $2 ]); } elsif (/^"([^"]*)"$/) { push(@rv, [ $1, $1 ]); } elsif (/^(\S+)\s+(\S.*)/) { push(@rv, [ $1, $2 ]); } else { push(@rv, [ $_, $_ ]); } } close(FILE); return @rv; } # show_params_inputs(&command, no-quote, editor-mode) sub show_params_inputs { local ($cmd, $noquote, $editor) = @_; local $ptable = &ui_columns_start([ $text{'edit_name'}, $text{'edit_desc'}, $text{'edit_type'}, $noquote ? ( ) : ( $text{'edit_quote'} ), $text{'edit_must'}, ], 100, 0, undef, undef); local @a = (@{$cmd->{'args'}}, { }); for(my $i=0; $i<@a; $i++) { local @cols; push(@cols, &ui_textbox("name_$i", $a[$i]->{'name'}, 10)); push(@cols, &ui_textbox("desc_$i", $a[$i]->{'desc'}, 40)); local @opts; for(my $j=0; $text{"edit_type$j"}; $j++) { next if ($editor && ($j == 7 || $j == 8 || $j == 10 || $j == 11)); push(@opts, [ $j, $text{"edit_type$j"} ]); } push(@cols, &ui_select("type_$i", $a[$i]->{'type'}, \@opts)." ". &ui_textbox("opts_$i", $a[$i]->{'opts'}, 40)); if (!$noquote) { push(@cols, &ui_yesno_radio("quote_$i", int($a[$i]->{'quote'}))); } push(@cols, &ui_yesno_radio("must_$i", int($a[$i]->{'must'}))); $ptable .= &ui_columns_row(\@cols); } $ptable .= &ui_columns_end(); print $ptable; } # parse_params_inputs(&command) sub parse_params_inputs { local ($cmd) = @_; $cmd->{'args'} = [ ]; my ($i, $name); for($i=0; defined($name = $in{"name_$i"}); $i++) { if ($name) { if ($in{"type_$i"} == 9 || $in{"type_$i"} == 12 || $in{"type_$i"} == 13 || $in{"type_$i"} == 14) { $in{"opts_$i"} =~ /\|$/ || -r $in{"opts_$i"} || &error(&text('save_eopts', $i+1)); } $in{"opts_$i"} =~ /:/ && &error(&text('save_eopts2', $i+1)); push(@{$cmd->{'args'}}, { 'name' => $name, 'desc' => $in{"desc_$i"}, 'type' => $in{"type_$i"}, 'quote' => int($in{"quote_$i"}), 'must' => int($in{"must_$i"}), 'opts' => $in{"opts_$i"} }); } } } # set_parameter_envs(&command, command-str, &uinfo, [set-in], [skip-menu-check]) # Sets $ENV variables based on parameter inputs, and returns the list of # environment variable commands, the export commands, the command string, # and the command string to display. sub set_parameter_envs { local ($cmd, $str, $uinfo, $setin, $skipfound) = @_; $setin ||= \%in; local $displaystr = $str; local ($env, $export, @vals); foreach my $a (@{$cmd->{'args'}}) { my $n = $a->{'name'}; my $rv; if ($a->{'type'} == 0 || $a->{'type'} == 5 || $a->{'type'} == 6 || $a->{'type'} == 8) { $rv = $setin->{$n}; } elsif ($a->{'type'} == 11) { $rv = $setin->{$n}; $rv =~ s/\r//g; $rv =~ s/\n/ /g; } elsif ($a->{'type'} == 1 || $a->{'type'} == 2) { (@u = getpwnam($setin->{$n})) || &error($text{'run_euser'}); $rv = $a->{'type'} == 1 ? $setin->{$n} : $u[2]; } elsif ($a->{'type'} == 3 || $a->{'type'} == 4) { (@g = getgrnam($setin->{$n})) || &error($text{'run_egroup'}); $rv = $a->{'type'} == 3 ? $setin->{$n} : $g[2]; } elsif ($a->{'type'} == 7) { $rv = $setin->{$n} ? $a->{'opts'} : ""; } elsif ($a->{'type'} == 9) { local $found; foreach my $l (&read_opts_file($a->{'opts'})) { $found++ if ($l->[0] eq $setin->{$n}); } $found || $skipfound || &error($text{'run_eopt'}); $rv = $setin->{$n}; } elsif ($a->{'type'} == 10) { if ($setin->{$n}) { if ($setin->{$n."_filename"} =~ /([^\/\\]+$)/ && $1) { $rv = &transname("$1"); } else { $rv = &transname(); } &open_tempfile(TEMP, ">$rv"); &print_tempfile(TEMP, $setin->{$n}); &close_tempfile(TEMP); chown($uinfo->[2], $uinfo->[3], $rv); push(@unlink, $rv); } else { $a->{'must'} && &error($text{'run_eupload'}); $rv = undef; } } elsif ($a->{'type'} == 12 || $a->{'type'} == 13 || $a->{'type'} == 14) { local @vals; if ($a->{'type'} == 14) { @vals = split(/\r?\n/, $setin->{$n}); } else { @vals = split(/\0/, $setin->{$n}); } local @opts = &read_opts_file($a->{'opts'}); foreach my $v (@vals) { local $found; foreach my $l (@opts) { $found++ if ($l->[0] eq $v); } $found || $skipfound || &error($text{'run_eopt'}); } $rv = join(" ", @vals); } elsif ($a->{'type'} == 15) { $rv = $setin->{$n."_year"}."-". $setin->{$n."_month"}."-". $setin->{$n."_day"}; } elsif ($a->{'type'} == 16) { $rv = $setin->{$n} ? 1 : 0; } if ($rv eq '' && $a->{'must'} && $a->{'type'} != 7) { &error(&text('run_emust', $a->{'desc'})); } $ENV{$n} = $rv; $env .= "$n='$rv'\n"; $export .= " $n"; if ($a->{'quote'}) { $str =~ s/\$$n/"\$$n"/g; $displaystr =~ s/\$$n/"$rv"/g; } else { $displaystr =~ s/\$$n/$rv/g; } push(@vals, $rv); } return ($env, $export, $str, $displaystr, \@vals); } # list_dbi_drivers() # Returns a list of DBI driver details, which are actually installed sub list_dbi_drivers { local @rv = ( { 'name' => 'MySQL', 'driver' => 'mysql', 'dbparam' => 'database' }, { 'name' => 'PostgreSQL', 'driver' => 'Pg', 'dbparam' => 'dbname' }, ); @rv = grep { eval "use DBD::$_->{'driver'}"; !$@ } @rv; return @rv; } # list_servers() # Returns a list of servers that a command can run on sub list_servers { if (&foreign_installed("servers")) { &foreign_require("servers", "servers-lib.pl"); @servers = grep { $_->{'user'} } &servers::list_servers(); if (@servers) { return ( { 'id' => 0, 'desc' => $text{'edit_this'} }, @servers); } } return ( { 'id' => 0, 'desc' => $text{'edit_this'} } ); } # execute_custom_command(&command, environment, exports, string, print-output) # Runs some command, and returns the bytes, output and timeout flag sub execute_custom_command { local ($cmd, $env, $export, $str, $print) = @_; &foreign_require("proc", "proc-lib.pl"); &clean_environment() if ($cmd->{'clear'}); local $got; local $outtemp = &transname(); open(OUTTEMP, ">$outtemp"); local $fh = $print ? STDOUT : *OUTTEMP; if ($cmd->{'su'}) { local $temp = &transname(); &open_tempfile(TEMP, ">$temp"); &print_tempfile(TEMP, "#!/bin/sh\n"); &print_tempfile(TEMP, $env); &print_tempfile(TEMP, "export $export\n") if ($export); &print_tempfile(TEMP, "$str\n"); &close_tempfile(TEMP); chmod(0755, $temp); $got = &proc::safe_process_exec( &command_as_user($user, 1, $temp), 0, 0, $fh, undef, !$cmd->{'raw'} && !$cmd->{'format'}, 0, $cmd->{'timeout'}); unlink($temp); } else { $got = &proc::safe_process_exec( $str, $user_info[2], undef, $fh, undef, !$cmd->{'raw'} && !$cmd->{'format'}, 0, $cmd->{'timeout'}); } local $ex = $?; &reset_environment() if ($cmd->{'clear'}); close(OUTTEMP); local $rv = &read_file_contents($outtemp); unlink($outtemp); return ($got, $rv, $proc::safe_process_exec_timeout ? 1 : 0, $ex); } # show_parameter_input(&arg, formno) # Returns HTML for a parameter input sub show_parameter_input { local ($a, $form) = @_; local $n = $a->{'name'}; local $v = $a->{'opts'}; if ($a->{'type'} != 9 && $a->{'type'} != 12 && $a->{'type'} != 13 && $a->{'type'} != 14) { if ($v =~ /^"(.*)"$/ || $v =~ /^'(.*)'$/) { # Quoted default $v = $1; } elsif ($v =~ /^(.*)\s*\|$/ && $config{'params_cmd'}) { # Command to run $v = &backquote_command("$1 2>/dev/null </dev/null"); if ($a->{'type'} != 11) { $v =~ s/[\r\n]+$//; } } elsif ($v =~ /^\// && $config{'params_file'}) { # File to read $v = &read_file_contents($v); if ($a->{'type'} != 11) { $v =~ s/[\r\n]+$//; } } } if ($a->{'type'} == 0) { return &ui_textbox($n, $v, 30); } elsif ($a->{'type'} == 1 || $a->{'type'} == 2) { return &ui_user_textbox($n, $v, $form); } elsif ($a->{'type'} == 3 || $a->{'type'} == 4) { return &ui_group_textbox($n, $v, $form); } elsif ($a->{'type'} == 5 || $a->{'type'} == 6) { return &ui_textbox($n, $v, 30)." ". &file_chooser_button($n, $a->{'type'}-5, $form); } elsif ($a->{'type'} == 7) { return &ui_yesno_radio($n, $v =~ /true|yes|1/ ? 1 : 0); } elsif ($a->{'type'} == 8) { return &ui_password($n, $v, 30); } elsif ($a->{'type'} == 9) { return &ui_select($n, undef, [ &read_opts_file($a->{'opts'}) ]); } elsif ($a->{'type'} == 10) { return &ui_upload($n, 30); } elsif ($a->{'type'} == 11) { return &ui_textarea($n, $v, 4, 30); } elsif ($a->{'type'} == 12) { return &ui_select($n, undef, [ &read_opts_file($a->{'opts'}) ], 5, 1); } elsif ($a->{'type'} == 13) { my @opts = &read_opts_file($a->{'opts'}); return &ui_select($n, undef, \@opts, scalar(@opts), 1); } elsif ($a->{'type'} == 14) { my @opts = &read_opts_file($a->{'opts'}); return &ui_multi_select($n, [ ], \@opts, 5); } elsif ($a->{'type'} == 15) { my ($year, $month, $day) = split(/\-/, $v); return &ui_date_input($day, $month, $year, $n."_day", $n."_month", $n."_year")." ". &date_chooser_button($n."_day", $n."_month", $n."_year"); } elsif ($a->{'type'} == 16) { return &ui_submit($v || $a->{'name'}, $a->{'name'}); } else { return "Unknown parameter type $a->{'type'}"; } } 1;
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
help | Folder | 0755 |
|
|
images | Folder | 0755 |
|
|
lang | Folder | 0755 |
|
|
CHANGELOG | File | 2.9 KB | 0644 |
|
acl_security.pl | File | 1.03 KB | 0755 |
|
backup_config.pl | File | 683 B | 0755 |
|
cgi_args.pl | File | 1.14 KB | 0755 |
|
config | File | 42 B | 0644 |
|
config-ALL-linux | File | 42 B | 0644 |
|
config.info | File | 490 B | 0644 |
|
config.info.ca | File | 500 B | 0644 |
|
config.info.cs | File | 326 B | 0644 |
|
config.info.de | File | 575 B | 0644 |
|
config.info.es | File | 338 B | 0644 |
|
config.info.fr | File | 669 B | 0644 |
|
config.info.hr | File | 0 B | 0644 |
|
config.info.it | File | 448 B | 0644 |
|
config.info.ko | File | 266 B | 0644 |
|
config.info.ms | File | 534 B | 0644 |
|
config.info.nl | File | 580 B | 0644 |
|
config.info.no | File | 548 B | 0644 |
|
config.info.pl | File | 612 B | 0644 |
|
config.info.ru | File | 158 B | 0644 |
|
config.info.sk | File | 0 B | 0644 |
|
config.info.tr | File | 269 B | 0644 |
|
config.info.uk | File | 165 B | 0644 |
|
custom-lib.pl | File | 16.71 KB | 0755 |
|
defaultacl | File | 25 B | 0644 |
|
edit_cmd.cgi | File | 3.69 KB | 0755 |
|
edit_file.cgi | File | 2.67 KB | 0755 |
|
edit_sql.cgi | File | 2.64 KB | 0755 |
|
feedback_files.pl | File | 208 B | 0755 |
|
form.cgi | File | 1.29 KB | 0755 |
|
index.cgi | File | 4.14 KB | 0755 |
|
log_parser.pl | File | 553 B | 0755 |
|
module.info | File | 165 B | 0644 |
|
module.info.af | File | 0 B | 0644 |
|
module.info.af.auto | File | 145 B | 0644 |
|
module.info.ar | File | 0 B | 0644 |
|
module.info.ar.auto | File | 200 B | 0644 |
|
module.info.be | File | 0 B | 0644 |
|
module.info.be.auto | File | 277 B | 0644 |
|
module.info.bg | File | 0 B | 0644 |
|
module.info.bg.auto | File | 297 B | 0644 |
|
module.info.ca | File | 130 B | 0644 |
|
module.info.ca.auto | File | 22 B | 0644 |
|
module.info.cs | File | 33 B | 0644 |
|
module.info.cs.auto | File | 145 B | 0644 |
|
module.info.da | File | 0 B | 0644 |
|
module.info.da.auto | File | 158 B | 0644 |
|
module.info.de | File | 149 B | 0644 |
|
module.info.de.auto | File | 26 B | 0644 |
|
module.info.el | File | 0 B | 0644 |
|
module.info.el.auto | File | 299 B | 0644 |
|
module.info.es | File | 32 B | 0644 |
|
module.info.es.auto | File | 116 B | 0644 |
|
module.info.eu | File | 0 B | 0644 |
|
module.info.eu.auto | File | 147 B | 0644 |
|
module.info.fa | File | 0 B | 0644 |
|
module.info.fa.auto | File | 223 B | 0644 |
|
module.info.fi | File | 0 B | 0644 |
|
module.info.fi.auto | File | 170 B | 0644 |
|
module.info.fr | File | 34 B | 0644 |
|
module.info.fr.auto | File | 142 B | 0644 |
|
module.info.he | File | 0 B | 0644 |
|
module.info.he.auto | File | 196 B | 0644 |
|
module.info.hr | File | 0 B | 0644 |
|
module.info.hr.auto | File | 169 B | 0644 |
|
module.info.hu | File | 26 B | 0644 |
|
module.info.hu.auto | File | 151 B | 0644 |
|
module.info.it | File | 31 B | 0644 |
|
module.info.it.auto | File | 112 B | 0644 |
|
module.info.ja | File | 34 B | 0644 |
|
module.info.ja.auto | File | 163 B | 0644 |
|
module.info.ko | File | 32 B | 0644 |
|
module.info.ko.auto | File | 154 B | 0644 |
|
module.info.lt | File | 0 B | 0644 |
|
module.info.lt.auto | File | 164 B | 0644 |
|
module.info.lv | File | 0 B | 0644 |
|
module.info.lv.auto | File | 153 B | 0644 |
|
module.info.ms | File | 136 B | 0644 |
|
module.info.ms.auto | File | 15 B | 0644 |
|
module.info.mt | File | 0 B | 0644 |
|
module.info.mt.auto | File | 148 B | 0644 |
|
module.info.nl | File | 25 B | 0644 |
|
module.info.nl.auto | File | 123 B | 0644 |
|
module.info.no | File | 33 B | 0644 |
|
module.info.no.auto | File | 120 B | 0644 |
|
module.info.pl | File | 139 B | 0644 |
|
module.info.pl.auto | File | 16 B | 0644 |
|
module.info.pt | File | 32 B | 0644 |
|
module.info.pt.auto | File | 129 B | 0644 |
|
module.info.pt_BR | File | 0 B | 0644 |
|
module.info.pt_BR.auto | File | 170 B | 0644 |
|
module.info.ro | File | 0 B | 0644 |
|
module.info.ro.auto | File | 168 B | 0644 |
|
module.info.ru | File | 48 B | 0644 |
|
module.info.ru.auto | File | 253 B | 0644 |
|
module.info.sk | File | 33 B | 0644 |
|
module.info.sk.auto | File | 136 B | 0644 |
|
module.info.sl | File | 0 B | 0644 |
|
module.info.sl.auto | File | 146 B | 0644 |
|
module.info.sv | File | 23 B | 0644 |
|
module.info.sv.auto | File | 119 B | 0644 |
|
module.info.th | File | 0 B | 0644 |
|
module.info.th.auto | File | 295 B | 0644 |
|
module.info.tr | File | 23 B | 0644 |
|
module.info.tr.auto | File | 140 B | 0644 |
|
module.info.uk | File | 0 B | 0644 |
|
module.info.uk.auto | File | 285 B | 0644 |
|
module.info.ur | File | 0 B | 0644 |
|
module.info.ur.auto | File | 271 B | 0644 |
|
module.info.vi | File | 0 B | 0644 |
|
module.info.vi.auto | File | 195 B | 0644 |
|
module.info.zh | File | 30 B | 0644 |
|
module.info.zh.auto | File | 91 B | 0644 |
|
module.info.zh_TW | File | 27 B | 0644 |
|
module.info.zh_TW.auto | File | 97 B | 0644 |
|
prefs.info | File | 26 B | 0644 |
|
run.cgi | File | 3.89 KB | 0755 |
|
save.cgi | File | 1.5 KB | 0755 |
|
save_cmd.cgi | File | 2.44 KB | 0755 |
|
save_file.cgi | File | 1.79 KB | 0755 |
|
save_sql.cgi | File | 1.53 KB | 0755 |
|
sql.cgi | File | 1.5 KB | 0755 |
|
sqlform.cgi | File | 962 B | 0755 |
|
view.cgi | File | 1.43 KB | 0755 |
|