) =~ s/\r|\n//g;
close(PID);
$pid || return &text('stop_epidfile', "$config{'pid_file'} ");
&kill_logged('TERM', $pid) ||
return &text('stop_ekill', "$pid ", "$! ");
}
return undef;
}
# setup_postgresql()
# Performs initial postgreSQL configuration. Returns an error message on failure
# or undef on success.
sub setup_postgresql
{
local $temp = &transname();
local $rv = &system_logged("($config{'setup_cmd'}) >$temp 2>&1");
local $out = `cat $temp`;
unlink($temp);
if ($rv) {
return "$out ";
}
return undef;
}
1;
postgresql/view_table.cgi 0100755 0005671 0000012 00000032035 10255255767 015573 0 ustar jcameron wheel #!/usr/local/bin/perl
# view_table.cgi
# Display all data in some table
require './postgresql-lib.pl';
if ($config{'charset'}) {
$force_charset = $config{'charset'};
}
if ($ENV{'CONTENT_TYPE'} !~ /boundary=/) {
&ReadParse();
}
else {
&ReadParseMime();
}
&can_edit_db($in{'db'}) || &error($text{'dbase_ecannot'});
@str = &table_structure($in{'db'}, $in{'table'});
$qt = "e_table($in{'table'});
if ($in{'field'}) {
$in{'field'} =~ s/\0.*$//;
$search = "where "."estr($in{'field'})." ".
&make_like($in{'match'}, $in{'for'}, $in{'field'});
$searchargs = "&field=".&urlize($in{'field'}).
"&for=".&urlize($in{'for'}).
"&match=".&urlize($in{'match'});
$searchhids = &ui_hidden("field", $in{'field'})."\n".
&ui_hidden("for", $in{'for'})."\n".
&ui_hidden("match", $in{'match'})."\n";
}
elsif ($in{'advanced'}) {
# An advanced search
for($i=0; defined($in{"field_$i"}); $i++) {
if ($in{"field_$i"}) {
push(@adv, "estr($in{"field_$i"})." ".
&make_like($in{"match_$i"}, $in{"for_$i"},
$in{"field_$i"}));
$searchargs .= "&field_$i=".&urlize($in{"field_$i"}).
"&for_$i=".&urlize($in{"for_$i"}).
"&match_$i=".&urlize($in{"match_$i"});
$searchhids .= &ui_hidden("field_$i", $in{"field_$i"})."\n".
&ui_hidden("for_$i", $in{"for_$i"})."\n".
&ui_hidden("match_$i", $in{"match_$i"})."\n";
}
}
if (@adv) {
$search = "where (".join($in{'and'} ? " and " : " or ",
@adv).")";
$searchhids .= &ui_hidden("and", $in{'and'})."\n".
&ui_hidden("advanced", 1)."\n";
$searchargs .= "&and=".$in{'and'}.
"&advanced=1";
}
}
if ($in{'delete'}) {
# Deleting selected rows
$count = 0;
foreach $r (split(/\0/, $in{'row'})) {
&execute_sql_logged($in{'db'},
"delete from $qt where oid = ?", $r);
$count++;
}
&webmin_log("delete", "data", $count, \%in);
&redirect("view_table.cgi?db=$in{'db'}&".
"table=$in{'table'}&start=$in{'start'}&field=$in{'field'}".
$searchargs);
}
elsif ($in{'save'}) {
# Update edited rows
$count = 0;
foreach $r (split(/\0/, $in{'row'})) {
local @set;
local @params;
foreach $t (@str) {
local $ij = $in{"${r}_$t->{'field'}"};
local $ijdef = $in{"${r}_$t->{'field'}_def"};
next if ($ijdef || !defined($ij));
if (!$config{'blob_mode'} || !&is_blob($str[$i])) {
$ij =~ s/\r//g;
}
push(@set, "$t->{'field'} = ?");
push(@params, $ij eq "" ? undef : $ij);
}
&execute_sql_logged($in{'db'}, "update $qt set ".
join(" , ", @set)." where oid = ?",
@params, $r);
$count++;
}
&webmin_log("modify", "data", $count, \%in);
&redirect("view_table.cgi?db=$in{'db'}&".
"table=$in{'table'}&start=$in{'start'}&field=$in{'field'}".
$searchargs);
}
elsif ($in{'savenew'}) {
# Adding a new row
for($j=0; defined($in{$j}); $j++) {
if (!$config{'blob_mode'} || !&is_blob($str[$i])) {
$in{$j} =~ s/\r//g;
}
push(@set, $in{$j} eq "" ? undef : $in{$j});
}
&execute_sql_logged($in{'db'}, "insert into $qt values (".
join(" , ", map { "?" } @set).")", @set);
&redirect("view_table.cgi?db=$in{'db'}&".
"table=$in{'table'}&start=$in{'start'}&field=$in{'field'}".
$searchargs);
&webmin_log("create", "data", undef, \%in);
}
elsif ($in{'cancel'} || $in{'new'}) {
undef($in{'row'});
}
$desc = &text('table_header', "$in{'table'} ", "$in{'db'} ");
&ui_print_header($desc, $text{'view_title'}, "", "view_table");
foreach $t (@str) {
$has_blob++ if (&is_blob($t));
}
if (!$driver_handle && $config{'blob_mode'} && $has_blob) {
print "",&text('view_warn', "DBI ",
"DBD::Pg ")," \n";
}
$d = &execute_sql_safe($in{'db'}, "select count(*) from $qt $search");
$total = $d->{'data'}->[0]->[0];
if ($in{'jump'} > 0) {
$in{'start'} = int($in{'jump'} / $config{'perpage'}) *
$config{'perpage'};
if ($in{'start'} >= $total) {
$in{'start'} = $total - $config{'perpage'};
$in{'start'} = int(($in{'start'} / $config{'perpage'}) + 1) *
$config{'perpage'};
}
}
else {
$in{'start'} = int($in{'start'});
}
if ($in{'new'} && $total > $config{'perpage'}) {
# go to the last screen for adding a row
$in{'start'} = $total - $config{'perpage'};
$in{'start'} = int(($in{'start'} / $config{'perpage'}) + 1) *
$config{'perpage'};
}
if ($in{'start'} || $total > $config{'perpage'}) {
print "
\n";
if ($in{'start'}) {
printf "".
" \n",
$in{'db'}, $in{'table'},
$in{'start'} - $config{'perpage'},
$searchargs;
}
print "",&text('view_pos', $in{'start'}+1,
$in{'start'}+$config{'perpage'} > $total ? $total :
$in{'start'}+$config{'perpage'}, $total)," \n";
if ($in{'start'}+$config{'perpage'} < $total) {
printf "".
" \n",
$in{'db'}, $in{'table'},
$in{'start'} + $config{'perpage'},
$searchargs;
}
print " \n";
}
if ($in{'field'}) {
# Show details of simple search
print "\n";
}
elsif ($in{'advanced'}) {
# Show details of advanced search
print "\n";
}
if ($config{'blob_mode'}) {
print "\n";
if (!$in{'field'} && $total > $config{'perpage'} || 1) {
print " \n";
print "\n";
print "\n";
print " \n";
print &ui_hidden("db", $in{'db'});
print &ui_hidden("table", $in{'table'});
$sel = &ui_select("field", undef,
[ map { [ $_->{'field'}, $_->{'field'} ] } @str ]);
$match = &ui_select("match", 0,
[ map { [ $_, $text{'view_match'.$_} ] } (0.. 3) ]);
print "",&text('view_search2', " ", $sel,
$match);
print " ",
" \n";
print " \n";
print "\n";
print &ui_hidden("db", $in{'db'});
print &ui_hidden("table", $in{'table'});
print " ";
print " \n";
print " \n";
print "\n";
print &ui_hidden("db", $in{'db'});
print &ui_hidden("table", $in{'table'});
print " \n";
print " \n";
print "
\n";
}
&ui_print_footer("edit_table.cgi?db=$in{'db'}&table=$in{'table'}",$text{'table_return'},
"edit_dbase.cgi?db=$in{'db'}", $text{'dbase_return'},
"", $text{'index_return'});
# make_like(mode, for, field)
sub make_like
{
local ($match, $for, $field) = @_;
local ($finfo) = grep { $_->{'field'} eq $field } @str;
return $finfo->{'type'} eq 'bool' && $match <= 1 ? "= $for" :
$finfo->{'type'} eq 'bool' && $match > 1 ? "!= $for" :
$match == 0 ? "like '%$for%'" :
$match == 1 ? "like '$for'" :
$match == 2 ? "not like '%$for%'" :
$match == 3 ? "not like '$for'" : " = ''";
}
postgresql/newdb_form.cgi 0100755 0005671 0000012 00000003053 10262357161 015557 0 ustar jcameron wheel #!/usr/local/bin/perl
# newdb_form.cgi
# Display a form for creating a new database
require './postgresql-lib.pl';
$access{'create'} || &error($text{'newdb_ecannot'});
&ui_print_header(undef, $text{'newdb_title'}, "", "newdb_form");
print "\n";
print "\n";
print " $text{'newdb_header'} \n";
print " \n";
# Database name
print " $text{'newdb_db'} \n";
print " \n";
if (&get_postgresql_version() >= 7) {
# Owner option
print " $text{'newdb_user'} \n";
print " $text{'default'}\n";
print " \n";
print "\n";
$u = &execute_sql($config{'basedb'}, "select usename from pg_shadow");
@users = map { $_->[0] } @{$u->{'data'}};
foreach $u (@users) {
print "$u\n";
}
print " \n";
}
if (&get_postgresql_version() >= 8) {
# Encoding option
print " $text{'newdb_encoding'} \n";
print "",&ui_opt_textbox("encoding", undef, 20, $text{'default'}),
" \n";
}
# Path to database file
print " $text{'newdb_path'} \n";
print "",&ui_opt_textbox("path", undef, 30, $text{'default'}),
" \n";
print " \n";
print "
\n";
&ui_print_footer("", $text{'index_return'});
postgresql/edit_user.cgi 0100775 0005671 0000012 00000005136 10255255252 015426 0 ustar jcameron wheel #!/usr/local/bin/perl
# edit_user.cgi
# Display a form for editing or creating a user
require './postgresql-lib.pl';
&ReadParse();
$access{'users'} || &error($text{'user_ecannot'});
if ($in{'new'}) {
&ui_print_header(undef, $text{'user_create'}, "");
}
else {
&ui_print_header(undef, $text{'user_edit'}, "");
$s = &execute_sql_safe($config{'basedb'}, "select * from pg_shadow ".
"where usename = '$in{'user'}'");
@user = @{$s->{'data'}->[0]};
}
print "\n";
print " \n";
print " \n";
print "\n";
print " $text{'user_header'} \n";
print " \n";
print " $text{'user_name'} \n";
if ($in{'new'} || &get_postgresql_version() >= 7.4) {
print " \n";
}
else {
print "$user[0] \n";
}
print "$text{'user_passwd'} \n";
printf " %s\n",
$user[6] ? '' : 'checked', $in{'new'} ? $text{'user_none'}
: $text{'user_nochange'};
printf " %s\n",
$user[6] ? 'checked' : '', $text{'user_setto'};
print " \n";
print " $text{'user_db'} \n";
printf " $text{'yes'}\n",
$user[2] =~ /t|1/ ? 'checked' : '';
printf " $text{'no'} \n",
$user[2] =~ /t|1/ ? '' : 'checked';
print "$text{'user_other'} \n";
printf " $text{'yes'}\n",
$user[4] =~ /t|1/ ? 'checked' : '';
printf " $text{'no'} \n",
$user[4] =~ /t|1/ ? '' : 'checked';
print " $text{'user_until'} \n";
if (!$user[7]) {
printf " %s\n",
$user[7] ? '' : 'checked', $text{'user_forever'};
printf " \n",
$user[7] ? 'checked' : '';
}
print " \n";
print "
\n";
print "\n";
&ui_print_footer("list_users.cgi", $text{'user_return'});
postgresql/edit_dbase.cgi 0100755 0005671 0000012 00000006624 10262673442 015532 0 ustar jcameron wheel #!/usr/local/bin/perl
# edit_dbase.cgi
# Show database tables
require './postgresql-lib.pl';
&ReadParse();
&can_edit_db($in{'db'}) || &error($text{'dbase_ecannot'});
@titles = grep { &can_edit_db($_) } &list_databases();
$desc = "$in{'db'} ";
if (@titles == 1 && $module_info{'usermin'}) {
# Single-database mode
&ui_print_header($desc, $text{'dbase_title'}, "", "edit_dbase", 1, 1);
$single = 1;
}
else {
&ui_print_header($desc, $text{'dbase_title'}, "", "edit_dbase");
}
# Is this database accepting connections?
if (!&accepting_connections($in{'db'})) {
print "$text{'dbase_noconn'}\n";
&ui_print_footer("", $text{'index_return'});
exit;
}
@titles = &list_tables($in{'db'});
if (@titles) {
@icons = map { "images/table.gif" } @titles;
@links = map { "edit_table.cgi?db=$in{'db'}&table=".&urlize($_) }
@titles;
#&show_buttons();
print &ui_form_start("drop_tables.cgi");
print &ui_hidden("db", $in{'db'});
print &select_all_link("d", $form),"\n";
print &select_invert_link("d", $form)," \n";
@checks = map { &ui_checkbox("d", $_) } @titles;
if ($config{'style'}) {
foreach $t (@titles) {
local $c = &execute_sql($in{'db'},
"select count(*) from ".quote_table($t));
push(@rows, $c->{'data'}->[0]->[0]);
local @str = &table_structure($in{'db'}, $t);
push(@fields, scalar(@str));
}
@titles = map { &html_escape($_) } @titles;
&split_table([ "", $text{'dbase_table'}, $text{'dbase_rows'},
$text{'dbase_cols'} ],
\@checks, \@links, \@titles,
\@rows, \@fields) if (@titles);
}
else {
@titles = map { &html_escape($_) } @titles;
&icons_table(\@links, \@titles, \@icons, 5, undef, undef, undef,
\@checks);
}
print &select_all_link("d", $form),"\n";
print &select_invert_link("d", $form)," \n";
print &ui_form_end([ [ "delete", $text{'dbase_delete'} ] ]);
}
else {
print "$text{'dbase_none'}
\n";
}
&show_buttons();
if ($single) {
&ui_print_footer("/", $text{'index'});
}
else {
&ui_print_footer("", $text{'index_return'});
}
sub show_buttons
{
print "
\n";
}
postgresql/stop.cgi 0100755 0005671 0000012 00000000434 10265066512 014422 0 ustar jcameron wheel #!/usr/local/bin/perl
# stop.cgi
# Stop the PostgreSQL database server
require './postgresql-lib.pl';
&error_setup($text{'stop_err'});
$access{'stop'} || &error($text{'stop_ecannot'});
$err = &stop_postgresql();
&error($err) if ($err);
sleep(2);
&webmin_log("stop");
&redirect("");
postgresql/edit_field.cgi 0100755 0005671 0000012 00000005322 10211214032 015505 0 ustar jcameron wheel #!/usr/local/bin/perl
# edit_field.cgi
# Display a form for editing an existing field or creating a new one
require './postgresql-lib.pl';
&ReadParse();
&can_edit_db($in{'db'}) || &error($text{'dbase_ecannot'});
$desc = &text('field_in', "$in{'table'} ", "$in{'db'} ");
if ($in{'type'}) {
# Creating a new field
&ui_print_header($desc, $text{'field_title1'}, "", "create_field");
$type = $in{'type'};
}
else {
# Editing an existing field
&ui_print_header($desc, $text{'field_title2'}, "", "edit_field");
@desc = &table_structure($in{'db'}, $in{'table'});
$f = $desc[$in{'idx'}];
$type = $f->{'type'};
}
print "\n";
print " \n";
print " \n";
print " \n";
print "\n";
print " $text{'field_header'} \n";
print "
\n";
if ($in{'type'}) {
print " \n";
}
else {
print " \n";
if (&can_drop_fields() && @desc > 1) {
print " \n";
}
}
print " \n";
&ui_print_footer("edit_table.cgi?db=$in{'db'}&table=$in{'table'}",$text{'table_return'},
"edit_dbase.cgi?db=$in{'db'}", $text{'dbase_return'},
"", $text{'index_return'});
postgresql/list_grants.cgi 0100775 0005671 0000012 00000005054 10266641566 016004 0 ustar jcameron wheel #!/usr/local/bin/perl
# list_grants.cgi
# Display all granted privileges
require './postgresql-lib.pl';
$access{'users'} || &error($text{'grant_ecannot'});
&ui_print_header(undef, $text{'grant_title'}, "", "list_grants");
# Check for down databases
@str = &table_structure($config{'basedb'}, "pg_catalog.pg_database");
foreach $f (@str) {
$hasconn++ if ($f->{'field'} eq 'datallowconn');
}
if ($hasconn) {
$rv = &execute_sql_safe($config{'basedb'}, "select datname,datallowconn from pg_database");
foreach $r (@{$rv->{'data'}}) {
$dbup{$r->[0]} = ($r->[1] =~ /^(t|1)/i);
}
}
@dblist = &list_databases();
foreach $d (@dblist) {
next if (!$dbup{$d} && $hasconn);
$t = &execute_sql_safe($d, "select relname,reltype,relkind,relhasrules from pg_class");
map { $type{$_->[0]} = $_->[2] eq 'r' && $_->[3] eq 't' ? 'v' : $_->[2] } @{$t->{'data'}};
if (&supports_schemas($d)) {
$s = &execute_sql_safe($d, 'select relname, relacl, pg_namespace.nspname from pg_class, pg_namespace where relnamespace = pg_namespace.oid and (relkind = \'r\' OR relkind = \'S\') and relname !~ \'^pg_\' order by relname');
}
else {
$s = &execute_sql_safe($d, 'select relname, relacl, \'public\' from pg_class where (relkind = \'r\' OR relkind = \'S\') and relname !~ \'^pg_\' order by relname');
}
foreach $g (@{$s->{'data'}}) {
$type = $type{$g->[0]};
$tname = $g->[2] eq "public" ? $g->[0] : $g->[2].".".$g->[0];
if (!$doneheader++) {
print "\n";
print " $text{'grant_tvi'} ",
"$text{'grant_type'} ",
"$text{'grant_db'} ",
"$text{'grant_users'} \n";
}
print "\n";
print "",&html_escape($tname),
" \n";
print "",$text{"grant_$type"}." \n";
print "",&html_escape($d)," \n";
print "\n";
$g->[1] =~ s/^\{//; $g->[1] =~ s/\}$//;
@gr = grep { /=\S/ } map { /^"(.*)"$/ ? $1 : $_ } split(/,/, $g->[1]);
foreach $gr (@gr) {
print " | " if ($gr ne $gr[0]);
if ($gr =~ /^=(\S+)/) {
print $text{'grant_public'};
}
elsif ($gr =~ /^group\s+(\S+)=(\S+)/) {
print &text('grant_group',
"".&html_escape($1)." ");
}
elsif ($gr =~ /^(\S+)=(\S+)$/) {
print "".&html_escape($1)." ";
}
}
print " \n";
}
}
if ($doneheader) {
print "
\n";
}
else {
print "$text{'grant_none'}
\n";
}
&ui_print_footer("", $text{'index_return'});
postgresql/save_user.cgi 0100775 0005671 0000012 00000002763 10211214032 015421 0 ustar jcameron wheel #!/usr/local/bin/perl
# save_user.cgi
# Create, update or delete a postgres user
require './postgresql-lib.pl';
&ReadParse();
$access{'users'} || &error($text{'user_ecannot'});
&error_setup($text{'user_err'});
if ($in{'delete'}) {
# just delete the user
&execute_sql_logged($config{'basedb'}, "drop user \"$in{'user'}\"");
&webmin_log("delete", "user", $in{'user'});
}
else {
# parse inputs
$version = &get_postgresql_version();
if (!$in{'pass_def'}) {
$in{'pass'} =~ /^\S+$/ || &error($text{'user_epass'});
$sql .= $version >= 7 ? " with password '$in{'pass'}'"
: " with password $in{'pass'}";
}
elsif ($in{'new'}) {
$sql .= " with password ''";
}
if ($in{'db'}) {
$sql .= " createdb";
}
else {
$sql .= " nocreatedb";
}
if ($in{'other'}) {
$sql .= " createuser";
}
else {
$sql .= " nocreateuser";
}
if (!$in{'until_def'}) {
$sql .= " valid until '$in{'until'}'";
}
if ($in{'new'}) {
$in{'name'} =~ /^\S+$/ || &error($text{'user_ename'});
&execute_sql_logged($config{'basedb'},
"create user \"$in{'name'}\" $sql");
&webmin_log("create", "user", $in{'name'});
}
else {
&execute_sql_logged($config{'basedb'},
"alter user \"$in{'user'}\" $sql");
if (&get_postgresql_version() >= 7.4 &&
$in{'name'} ne $in{'user'}) {
# Rename too
&execute_sql_logged($config{'basedb'},
"alter user \"$in{'user'}\" ".
"rename to \"$in{'name'}\"");
}
&webmin_log("modify", "user", $in{'user'});
}
}
&redirect("list_users.cgi");
postgresql/edit_table.cgi 0100755 0005671 0000012 00000005332 10211214032 015512 0 ustar jcameron wheel #!/usr/local/bin/perl
# edit_table.cgi
# Display the structure of some table
require './postgresql-lib.pl';
&ReadParse();
&can_edit_db($in{'db'}) || &error($text{'dbase_ecannot'});
$desc = &text('table_header', "$in{'table'} ", "$in{'db'} ");
&ui_print_header($desc, $text{'table_title'}, "", "edit_table");
@desc = &table_structure($in{'db'}, $in{'table'});
print "
\n";
print " \n";
print " \n";
$mid = int((@desc / 2)+0.5);
print " \n";
&type_table(0, $mid);
print " \n";
&type_table($mid, scalar(@desc)) if (@desc > 1);
print "
\n";
print "\n";
&ui_print_footer("edit_dbase.cgi?db=$in{'db'}", $text{'dbase_return'},
"", $text{'index_return'});
sub type_table
{
print "\n";
print " $text{'table_field'} ",
"$text{'table_type'} ",
"$text{'table_arr'} ",
"$text{'table_null'} \n";
local $i;
for($i=$_[0]; $i<$_[1]; $i++) {
local $r = $desc[$i];
print "\n";
print "",&html_escape($r->{'field'})," \n";
print "",&html_escape($r->{'type'})," \n";
print "",$r->{'arr'} eq 'YES' ? $text{'yes'}
: $text{'no'}," \n";
print "",$r->{'null'} eq 'YES' ? $text{'yes'}
: $text{'no'}," \n";
print " \n";
}
print "
\n";
}
postgresql/defaultacl 0100664 0005671 0000012 00000000072 07605704332 015000 0 ustar jcameron wheel dbs=*
create=1
delete=1
stop=1
users=1
backup=1
restore=1
postgresql/images/ 0040775 0005671 0000012 00000000000 07635467611 014233 5 ustar jcameron wheel postgresql/images/db.gif 0100644 0005671 0000012 00000000716 07243602425 015273 0 ustar jcameron wheel GIF89a0 0 `d` !Made with GIMP !
, 0 0 x0@8k*`(d)t Cp{F@X۱<(]G9Arvqx*
kא
9gU٣άrh)u|OQPUes)0kl4G
_\ZfcbolGB7tE{xB~6``JMFwzͯṋיgsph`hmjǐm -lWO`-dXCt6R>Tod@m YHO弐i:daĖ:-*QeF~WiĠ*ΆB
TjVDOi)qViZQp]5.۹oz+ڟvˉPUKHX̸ ; postgresql/images/grants.gif 0100644 0005671 0000012 00000003515 07243602404 016201 0 ustar jcameron wheel GIF89a0 0 ´~tҢΚ|~tΞƊƼʒڶ֪Ҧzt|fdҪʒƎʖ̺rlvljdڲƼ֮ʎ̶ƼƆ|ʚvlԚ|Ҟ캶ʼ䖖zztrnl~~t||ԾVVTrrlμƴƼʼ´ܺ¾䦢!Made with GIMP !
, 0 0 H*\Ȱ? "F|HQċ+6 G;IɒTqK \(`/se
".`$@A.ԹJ0XȠB"rp@ a!DPUi$J0Q
rW@$2HjhD
p`6SJIH`1 D1pf1$He A<@է4j<9tkz#)b>~ a"DUzCj!c7Jk#=̹4 ]т%=,WN D:^o߈8;*q8!pKBD9DN= QHAD