Pull to refresh

Обновление файлов в сети филиалов (via SMB)

Reading time 3 min
Views 1.7K
У нас на работе сеть филиалов и периодически возникает задача обновить что-нибудь.
Хороший админ — ленивый админ, поэтому делать это постоянно самому как минимум противоречит религии профессии.

Исходные данные: связка CentOS 5 + samba в качестве контроллеров доменов и файловых серверов.
Все филиалы объединены в сеть с помощью openVPN.

Я приведу скрипт обновления файлов 2GIS (не сочтите за рекламу). Скрипт с легкостью может быть модифицирован для других целей.
Сразу отметаю вопросы про обновление на месте при помощи встроенной программы обновления — Windows Server у нас не используется, а давать полномочия для обновления сотрудникам офиса неправильно по причинам безопасноcти и их забывчивости.

Конечно, задачу обновлений можно выполнить и другими способами. Советую для прочтения в качестве профита.

Важное требование — везде должен быть заведен пользователь с правами записи в папку 2gis.
Пусть это будет adminuser с паролем samplepassword.
Еще одно замечание — во всех филиалах папка с 2GIS находится в шаре public.

Запускать скрипт нужно с компьютера, где есть обновленные файлы.

2gis_update.js:
var WshNetwork = WScript.CreateObject("WScript.Network");
FSO = new ActiveXObject("Scripting.FileSystemObject");
var WshShell = WScript.CreateObject("WScript.Shell");

// описываем IP контроллера домена, имя домена, файл данных карты и путь на сервере.
var filials = new Array();

filials.push(new Array("192.168.3.2","PERM","Data_Perm.dgdat","portable\\2gis\\3.0"));
filials.push(new Array("192.168.93.2","KRASNODAR","Data_Krasnodar.dgdat"));
filials.push(new Array("192.168.61.200","ROSTOV","Data_Rostov.dgdat","2gis"));
filials.push(new Array("192.168.72.2","TUMEN","Data_Tyumen.dgdat","portable\\2gis"));
filials.push(new Array("192.168.2.2","UFA","Data_Ufa.dgdat","portable\\2gis\\3.0"));
filials.push(new Array("192.168.1.200","SAMARA","Data_Samara.dgdat","info\\2gis"));

// отключаем диск, если он у нас есть
  try 
  {
    WshNetwork.RemoveNetworkDrive ("Q:",true,false); // force, dont update profile
  }
  catch(e)
  {
  }

// перебираем все филиалы
for (i in filials)
{

// монтируем диск через SMB
  try
  {
    WshNetwork.MapNetworkDrive ("Q:", "\\\\"+filials[i][0]+"\\public", false, filials[i][1]+"\\adminuser", "samplepassword");
  }
  catch(e)
  {
    WScript.Echo(filials[i][1]+" (map): ");
  }

  path2gis = "Q:\\"+filials[i][3]+"\\grym.exe";
  pathmap = "Q:\\"+filials[i][3]+"\\"+filials[i][2];

// удаляем сначала старые файлы
// используется такой странный способ, т.к. DeleteFile почему-то не работает
  try
  {
    WshShell.Run("cmd /C del /Q /F  "+path2gis,0,true);
    WshShell.Run("cmd /C del /Q /F  "+pathmap,0,true);
  }
  catch(e)
  {
  }
// отслеживаем факт удаления
  if (FSO.FileExists(pathmap) || FSO.FileExists(path2gis))
  {
    WScript.Echo(filials[i][1]+": can't delete");
  }

// копируем
  try
  {
    FSO.CopyFile("C:\\Program Files\\2gis\\3.0\\grym.exe", "Q:\\"+filials[i][3]+"\\",true);
    FSO.CopyFile("C:\\Program Files\\2gis\\3.0\\"+filials[i][2], "Q:\\"+filials[i][3]+"\\",true);
  }

// отслеживаем ошибки копирования
  catch(e)
  {
    WScript.Echo(filials[i][1] + " (copy): " + e);
  }
   
// отмонтируем диск
  WshNetwork.RemoveNetworkDrive ("Q:",true,false);
}


Напоследок, ссылка на документацию:
Windows Script Host
Tags:
Hubs:
-2
Comments 25
Comments Comments 25

Articles