powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проблема с pg_dump
4 сообщений из 4, страница 1 из 1
Проблема с pg_dump
    #34943852
DmGr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Пишу скрипт на jscript для резервного копирования базы (под Win)

Есть такой код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
while (true)
{
     if (!oExec.StdOut.AtEndOfStream)
     {
          input += oExec.StdOut.Read( 1 );
          if (input.indexOf("Пароль:") != - 1 )
               break;
     }
     WScript.Sleep( 100 );
}
oExec.StdIn.Write("Мой пароль\n");
Так вот pg_dump почему то упорно запрос пароля выводит на экран cmd
И соответственно скрипт не может перехватить строку с запросом пароля
И вывести в StdIn пароль тоже не может.
Приходится делать так
WSHShell.SendKeys("Мой пароль\n");

Это фича такая, или я что то неправильно делаю?
...
Рейтинг: 0 / 0
Проблема с pg_dump
    #34944021
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmGrДобрый день!

Пишу скрипт на jscript для резервного копирования базы (под Win)

Есть такой код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
while (true)
{
     if (!oExec.StdOut.AtEndOfStream)
     {
          input += oExec.StdOut.Read( 1 );
          if (input.indexOf("Пароль:") != - 1 )
               break;
     }
     WScript.Sleep( 100 );
}
oExec.StdIn.Write("Мой пароль\n");
Так вот pg_dump почему то упорно запрос пароля выводит на экран cmd
И соответственно скрипт не может перехватить строку с запросом пароля
И вывести в StdIn пароль тоже не может.
Приходится делать так
WSHShell.SendKeys("Мой пароль\n");

Это фича такая, или я что то неправильно делаю?
Фича. Я знаю следующие способы борьбы с этим:
1. Или делать trust юзеру.
2. Или делать файл паролей, а потом его чистить.
3. Альтернативные способы аффторизации (сам не делал никогда).
...
Рейтинг: 0 / 0
Проблема с pg_dump
    #34944108
DmGr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я сделал так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
var oExec = WSHShell.Exec(CommandString);
WScript.sleep( 5000 ); // вот тут приходится ждать  5  сек иначе можно пролететь с посылкой пароля
WSHShell.SendKeys(ServerPassword + "\r");

// Ждем когда закончится
while (oExec.Status ==  0 ){
  WScript.sleep( 100 );
};

Просто я думал, что можно сделать культурно без sleep-а
...
Рейтинг: 0 / 0
Проблема с pg_dump
    #34978519
DmGr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отпишусь, может кому пригодится.
Вариант с SendKey не прокатил - пришлось измудряться.

Вот что получилось

Соответственно можно под себя поправить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
/*
Скрипт предназначен для автоматической архивации данных с сервера PostgreSQL
базы схемы
*/
//-------------- Основные параметры для работы скрипта -------------- 
var ArchiveFolder = "r:\\BackUp\\PostgreSQL";
var PGBinFolder = "c:\\Program Files\\PostgreSQL\\8.2\\bin";
var ServerAddress = "192.168.1.252";
var LoginName = "postgres";
var BaseName = "MyBase";
var ArchiveLength =  5 ;
var ServerPassword = "123";
var SchemaName = "Schema1";
//-------------------------------------------------------------------

var oFSO = new ActiveXObject("Scripting.FileSystemObject");
var lcFilesList, CommandString;
var WSHShell = WScript.CreateObject("WScript.Shell");

var Today = new Date();

//Получаем дату раньше которой архивы будут удалены
var DeleteDate = new Date();
DeleteDate.setDate(DeleteDate.getDate()-ArchiveLength);

// Командная строка для создания дампа базы
CommandString = "\"" + PGBinFolder + "\\pg_dump.exe\"" +
  " -i" +
  " -h " + ServerAddress + " -p 5432" +
  " -U " + LoginName +
  " -F p -a -D" +
  " -f \"" + ArchiveFolder + "\\" + SchemaName + "_data-" + formatDate(Today,"yyyy-MM-dd hh-mm") + ".sql\"" +
  " -n " + SchemaName + 
  " " + BaseName


// Удаляем все файлы архивов созданные раньше даты указанный в DeleteDate 
oArchiveFolder = oFSO.GetFolder(ArchiveFolder);
var FilesEnumerator = new Enumerator(oArchiveFolder.Files);
for(; !FilesEnumerator.atEnd(); FilesEnumerator.moveNext())
{
  if(FilesEnumerator.item().Name.substring( 0 , SchemaName.length) == SchemaName && FilesEnumerator.item().DateLastModified < DeleteDate)
  {
    // Удаляем старые файлы
    oFSO.DeleteFile(FilesEnumerator.item().Path);
  }
}

// Создаем процесс и запускаем его
// Можно так, только окно процесса должно быть активно
//  инача пароль попадет в активное окно, а не в наше
// Соотетственно при заблокированной консоли не работает :(
//            var oExec = WSHShell.Exec(CommandString);
//            WScript.sleep( 5000 );
//            WSHShell.SendKeys(ServerPassword + "\r");


// Создаем процесс и запускаем его через одно место, потому как через другое не работает
var oExec = WSHShell.Exec("cmd /C SET PGPASSWORD=" + ServerPassword + "&&" + CommandString);
// Ждем когда закончится
while (oExec.Status ==  0 ){
  WScript.sleep( 500 );
};

if(oExec.ExitCode !=  0 ){
  var TextStream = oFSO.OpenTextFile(ArchiveFolder + "\\" + SchemaName + ".log", 8 ,true, 0 );

  TextStream.WriteLine("=======================" + formatDate(Today,"yyyy-MM-dd hh-mm") + "=======================");
  TextStream.WriteLine("Ошибка создании дампа базы данных!");
  TextStream.WriteLine("-----------------------CmdLine----------------------");
  TextStream.WriteLine(CommandString);
  TextStream.WriteLine("-----------------------StdOut-----------------------");
  TextStream.WriteLine(oExec.StdOut.ReadAll());
  TextStream.WriteLine("-----------------------ErrOut-----------------------");
  TextStream.WriteLine(oExec.StdErr.ReadAll());
  TextStream.WriteLine("-----------------------ExitCode---------------------");
  TextStream.WriteLine(oExec.ExitCode);
  TextStream.Close();
}
//------------------------------------------------------------------------------
function addZero(vNumber){ 
  return ((vNumber <  10 ) ? "0" : "") + vNumber 
} 
//------------------------------------------------------------------------------
function formatDate(vDate, vFormat){ 
  var vDay              = addZero(vDate.getDate()); 
  var vMonth            = addZero(vDate.getMonth()+ 1 ); 
  var vYearLong         = addZero(vDate.getFullYear()); 
  var vYearShort        = addZero(vDate.getFullYear().toString().substring( 3 , 4 )); 
  var vYear             = (vFormat.indexOf("yyyy")>- 1 ?vYearLong:vYearShort) 
  var vHour             = addZero(vDate.getHours()); 
  var vMinute           = addZero(vDate.getMinutes()); 
  var vSecond           = addZero(vDate.getSeconds()); 
  var vDateString       = vFormat.replace(/dd/g, vDay).replace(/MM/g, vMonth).replace(/y{ 1 , 4 }/g, vYear) 

  vDateString           = vDateString.replace(/hh/g, vHour).replace(/mm/g, vMinute).replace(/ss/g, vSecond) 
  return vDateString 
} 
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проблема с pg_dump
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]