Thread: db dump from php

db dump from php

From
jody
Date:
Hi
I have a problem when creating a db dump from a php script in a html page.
This used to work in previous PostgreSQL versions, but now (v, 9.1.5)
it fails, and i have no idea why.

It is not a matter of write-access, since  the directory has mode 777,
and in the same php-file i successfully create a file there.

Here's a minimal version which shows the behavior:

<html>
<head></head>
<body>
<?php
    putenv('PG_USER=magnus');
    putenv('PG_PASSWORD=mypass');
    putenv('PG_DB=magnus2');
    putenv('PG_HOST=localhost');
    putenv('PGPASSFILE=/home/jody/.pgpass');

    $sPath="/home/jody/progs/magnus2/dumps/dumpidump.sql";
    $sDBName="magnus2";
    $sQuery1="/usr/bin/pg_dump -w -U magnus  -c -f $sPath $sDBName";

    exec($sQuery1, $output, $iRet);

    print("Q:" . $sQuery1 . "<br/>");
    print("ret:" . $iRet . "<br/>");
    foreach($output as $ss) {
        print("out:" . $ss . "<br/>");
    }

    print("<hr/>\n");

    $sQuery2="echo gnagna > " . $sPath . ".test";
    exec($sQuery2,  $output, $iRet);
    print("Q:" . $sQuery2 . "<br/>");
    print("ret:" . $iRet . "<br/>");
    foreach($output as $ss) {
        print("out:" . $ss . "<br/>");
    }
?>
The call to pg_dump fails with a return code of 1, and $output is empty.
The second call succeeds with return code 0, and a file is indeed written.

When i replace $sQuery1 by "/usr/bin/pg_dump --version" the cal
succeeds with return code 0,
and $output contains the string "pg_dump (PostgreSQL) 9.1.5"

When i copy-paste the command contained in $sQuery to the command line,
it succeeds.

In my home directory /home/jody i have .pgpass file, with the correct
username and password.

Is there a way to specify a password on the command line?
Can somebody give me a hint how i can get this to work?

Thank You
  Jody


Re: db dump from php

From
Tom Lane
Date:
jody <jody.xha@gmail.com> writes:
> I have a problem when creating a db dump from a php script in a html page.
> This used to work in previous PostgreSQL versions, but now (v, 9.1.5)
> it fails, and i have no idea why.

It might help to look in the postgres server's log to see if there are
any related messages.  Based on the described symptoms I'm guessing a
user authentication failure, possibly related to the fact that the
dump is running as whatever-user-owns-the-webserver-process rather than
yourself.  If it worked before, that probably means you had the older
server configured differently for authentication --- see pg_hba.conf
and related files.

Note in particular that "peer" and "ident" auth modes don't care about
password files, and instead directly check which OS user the client
program is running as ...

            regards, tom lane


Re: db dump from php

From
Christian Hammers
Date:
Hello

Instead of exec(), try

    $output = `$sQuery1 2>&1`;

You don't get the return code then but the stdout/stderr output which might
help you more.

bye,

-christian-


On Sun, 6 Jan 2013 14:50:50 +0100
jody <jody.xha@gmail.com> wrote:

> Hi
> I have a problem when creating a db dump from a php script in a html page.
> This used to work in previous PostgreSQL versions, but now (v, 9.1.5)
> it fails, and i have no idea why.
>
> It is not a matter of write-access, since  the directory has mode 777,
> and in the same php-file i successfully create a file there.
>
> Here's a minimal version which shows the behavior:
>
> <html>
> <head></head>
> <body>
> <?php
>     putenv('PG_USER=magnus');
>     putenv('PG_PASSWORD=mypass');
>     putenv('PG_DB=magnus2');
>     putenv('PG_HOST=localhost');
>     putenv('PGPASSFILE=/home/jody/.pgpass');
>
>     $sPath="/home/jody/progs/magnus2/dumps/dumpidump.sql";
>     $sDBName="magnus2";
>     $sQuery1="/usr/bin/pg_dump -w -U magnus  -c -f $sPath $sDBName";
>
>     exec($sQuery1, $output, $iRet);
>
>     print("Q:" . $sQuery1 . "<br/>");
>     print("ret:" . $iRet . "<br/>");
>     foreach($output as $ss) {
>         print("out:" . $ss . "<br/>");
>     }
>
>     print("<hr/>\n");
>
>     $sQuery2="echo gnagna > " . $sPath . ".test";
>     exec($sQuery2,  $output, $iRet);
>     print("Q:" . $sQuery2 . "<br/>");
>     print("ret:" . $iRet . "<br/>");
>     foreach($output as $ss) {
>         print("out:" . $ss . "<br/>");
>     }
> ?>
> The call to pg_dump fails with a return code of 1, and $output is empty.
> The second call succeeds with return code 0, and a file is indeed written.
>
> When i replace $sQuery1 by "/usr/bin/pg_dump --version" the cal
> succeeds with return code 0,
> and $output contains the string "pg_dump (PostgreSQL) 9.1.5"
>
> When i copy-paste the command contained in $sQuery to the command line,
> it succeeds.
>
> In my home directory /home/jody i have .pgpass file, with the correct
> username and password.
>
> Is there a way to specify a password on the command line?
> Can somebody give me a hint how i can get this to work?
>
> Thank You
>   Jody
>
>


--
Network Engineering & Design; Content Delivery Platform & IP

NETCOLOGNE Gesellschaft für Telekommunikation mbH
Am Coloneum 9 | 50829 Köln
Tel: 0221 2222-8711 | Fax: 0221 2222-78711
www.netcologne.de

Geschäftsführer:
Dr. Hans Konle (Sprecher)
Dipl.-Ing. Karl-Heinz Zankel
HRB 25580, AG Köln



Diese Nachricht (inklusive aller Anhänge) ist vertraulich. Sollten Sie diese
Nachricht versehentlich erhalten haben, bitten wir, den Absender (durch
Antwort-E-Mail) hiervon unverzüglich zu informieren und die Nachricht zu
löschen. Die E-Mail darf in diesem Fall weder vervielfältigt noch in anderer
Weise verwendet werden.


Re: db dump from php

From
jody
Date:
Hi
I have now changed all entries in pg_hba.conf to 'trust'

I have modified the call as suggested by Christian.

When i call the php script from the command line, the dump i made.

When i call it from apache, i get the output

 pg_dump: [archiver (db)] connection to database "magnus2" failed:
could not connect to server: Permission denied Is the server running
locally and accepting connections on Unix domain socket
"/run/postgresql/.s.PGSQL.5432"?

But the server is running, because my phpPgAdmin can display the db
data, and because the dump worked when executed from the commandline.

From the file generated by the "echo" command, i know that the user
executing the php script is apache.
This seems not to be a problem with the password, because then it
would already have contacted the server.

So for some reason the user apache can't connect to the server.
(and "apache" seems to be a "virtual" user: even as root you cannot do
'su appache': This account is currently not available.)
 Any ideas?

 Thank You
  jody

On Mon, Jan 7, 2013 at 10:37 AM, Christian Hammers <ch@lathspell.de> wrote:
> Hello
>
> Instead of exec(), try
>
>         $output = `$sQuery1 2>&1`;
>
> You don't get the return code then but the stdout/stderr output which might
> help you more.
>
> bye,
>
> -christian-
>
>
> On Sun, 6 Jan 2013 14:50:50 +0100
> jody <jody.xha@gmail.com> wrote:
>
>> Hi
>> I have a problem when creating a db dump from a php script in a html page.
>> This used to work in previous PostgreSQL versions, but now (v, 9.1.5)
>> it fails, and i have no idea why.
>>
>> It is not a matter of write-access, since  the directory has mode 777,
>> and in the same php-file i successfully create a file there.
>>
>> Here's a minimal version which shows the behavior:
>>
>> <html>
>> <head></head>
>> <body>
>> <?php
>>     putenv('PG_USER=magnus');
>>     putenv('PG_PASSWORD=mypass');
>>     putenv('PG_DB=magnus2');
>>     putenv('PG_HOST=localhost');
>>     putenv('PGPASSFILE=/home/jody/.pgpass');
>>
>>     $sPath="/home/jody/progs/magnus2/dumps/dumpidump.sql";
>>     $sDBName="magnus2";
>>     $sQuery1="/usr/bin/pg_dump -w -U magnus  -c -f $sPath $sDBName";
>>
>>     exec($sQuery1, $output, $iRet);
>>
>>     print("Q:" . $sQuery1 . "<br/>");
>>     print("ret:" . $iRet . "<br/>");
>>     foreach($output as $ss) {
>>         print("out:" . $ss . "<br/>");
>>     }
>>
>>     print("<hr/>\n");
>>
>>     $sQuery2="echo gnagna > " . $sPath . ".test";
>>     exec($sQuery2,  $output, $iRet);
>>     print("Q:" . $sQuery2 . "<br/>");
>>     print("ret:" . $iRet . "<br/>");
>>     foreach($output as $ss) {
>>         print("out:" . $ss . "<br/>");
>>     }
>> ?>
>> The call to pg_dump fails with a return code of 1, and $output is empty.
>> The second call succeeds with return code 0, and a file is indeed written.
>>
>> When i replace $sQuery1 by "/usr/bin/pg_dump --version" the cal
>> succeeds with return code 0,
>> and $output contains the string "pg_dump (PostgreSQL) 9.1.5"
>>
>> When i copy-paste the command contained in $sQuery to the command line,
>> it succeeds.
>>
>> In my home directory /home/jody i have .pgpass file, with the correct
>> username and password.
>>
>> Is there a way to specify a password on the command line?
>> Can somebody give me a hint how i can get this to work?
>>
>> Thank You
>>   Jody
>>
>>
>
>
> --
> Network Engineering & Design; Content Delivery Platform & IP
>
> NETCOLOGNE Gesellschaft für Telekommunikation mbH
> Am Coloneum 9 | 50829 Köln
> Tel: 0221 2222-8711 | Fax: 0221 2222-78711
> www.netcologne.de
>
> Geschäftsführer:
> Dr. Hans Konle (Sprecher)
> Dipl.-Ing. Karl-Heinz Zankel
> HRB 25580, AG Köln
>
>
>
> Diese Nachricht (inklusive aller Anhänge) ist vertraulich. Sollten Sie diese
> Nachricht versehentlich erhalten haben, bitten wir, den Absender (durch
> Antwort-E-Mail) hiervon unverzüglich zu informieren und die Nachricht zu
> löschen. Die E-Mail darf in diesem Fall weder vervielfältigt noch in anderer
> Weise verwendet werden.


Re: db dump from php

From
Andreas Kretschmer
Date:
jody <jody.xha@gmail.com> wrote:

> Hi
> I have now changed all entries in pg_hba.conf to 'trust'
>
> I have modified the call as suggested by Christian.
>
> When i call the php script from the command line, the dump i made.
>
> When i call it from apache, i get the output
>
>  pg_dump: [archiver (db)] connection to database "magnus2" failed:
> could not connect to server: Permission denied Is the server running
> locally and accepting connections on Unix domain socket
> "/run/postgresql/.s.PGSQL.5432"?

check if the file (socket) exists. Try to connect via tcp/ip using
parameter -h <hostname or ip>


Andreas
--
Really, I'm not out to destroy Microsoft. That will just be a completely
unintentional side effect.                              (Linus Torvalds)
"If I was god, I would recompile penguin with --enable-fly."   (unknown)
Kaufbach, Saxony, Germany, Europe.              N 51.05082°, E 13.56889°


Re: db dump from php

From
Tom Lane
Date:
jody <jody.xha@gmail.com> writes:
> When i call the php script from the command line, the dump i made.

> When i call it from apache, i get the output

>  pg_dump: [archiver (db)] connection to database "magnus2" failed:
> could not connect to server: Permission denied Is the server running
> locally and accepting connections on Unix domain socket
> "/run/postgresql/.s.PGSQL.5432"?

Does the apache user have permissions to access that socket file?  What
about the directories containing it?

            regards, tom lane


Re: db dump from php

From
jody
Date:
Hi
 thanks to your suggestions i was able to solve the problem:

the socket existed, and it has global permissions:

>  jody@raven ~/progs/magnus2 $ ls -l /run/postgresql/.s.PGSQL.5432
>  srwxrwxrwx 1 postgres postgres 0 Jan  7 20:35 /run/postgresql/.s.PGSQL.5432

but the directory upstairs only allows postgres:

> jody@raven ~/progs/magnus2 $ ls -ld /run/postgresql
> drwxrwx--- 2 postgres postgres 80 Jan  7 20:35 /run/postgresql

i now added the user 'apache' to the group 'postgres' and got one step further:
the connection can be made, but now there is a password problem:

> pg_dump: [archiver (db)] connection to database "magnus2" failed: fe_sendauth: no password supplied

I checked again - i have for some reason used a wrong environment
variable for the password:
it should be PGPASSWORD and not PG_PASSWORD

I changed this and now the dump is correctly done and saved.

Thanks again
  Jody


On Mon, Jan 7, 2013 at 8:19 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> jody <jody.xha@gmail.com> writes:
>> When i call the php script from the command line, the dump i made.
>
>> When i call it from apache, i get the output
>
>>  pg_dump: [archiver (db)] connection to database "magnus2" failed:
>> could not connect to server: Permission denied Is the server running
>> locally and accepting connections on Unix domain socket
>> "/run/postgresql/.s.PGSQL.5432"?
>
> Does the apache user have permissions to access that socket file?  What
> about the directories containing it?
>
>                         regards, tom lane