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

Пишу скрипт на 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
16.11.2007, 10:49
    #34944021
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с pg_dump
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
16.11.2007, 11:10
    #34944108
DmGr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с pg_dump
Я сделал так
Код: 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
30.11.2007, 15:36
    #34978519
DmGr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с pg_dump
Отпишусь, может кому пригодится.
Вариант с 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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проблема с pg_dump / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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