Главная » Хабрахабр » [Из песочницы] Auto provisioning для софтфона MicroSIP

[Из песочницы] Auto provisioning для софтфона MicroSIP

Знакомство с MicroSIP началось у меня несколько лет назад. Именно простота и нетребовательность к ресурсам на фоне конкурентов заставили обратить на него внимание. И вот сейчас, когда в нем появился весь необходимый для работы функционал, я решил внедрить его для работы внутри компании.

В MicroSIP нет такого механизма, но есть простой конфигурационный файл с которым мы собственно и будем работать. Auto provisioning или механизм автоматического распространения конфигурации используется в большинстве аппаратных телефонов. Суть процесса сводится к следующему: при входе пользователя в систему запускается скрипт, который вытягивает актуальную версию дистрибутива и настройки и применяет их на локальной машине для вошедшего пользователя. А наличие portable версии программы сыграет нам на руку при решении вопроса распространения дистрибутива и обновлений.
Для разработки скрипта распространения конфигурации и обновлений использовался JScript. При применении настроек изменяются только настройки, указанные в конфигурационном файле на сервере, остальные настройки пользователя остаются без изменений.

В js файле находится сам скрипт, в котором (при сохранении структуры, описанной в этой статье) необходимо изменить значение переменной srvConfPath на путь к папке хранения конфигурации и дистрибутива. Создаем на Windows сервере общую папку с правами доступа на чтение для всех пользователей домена и размещаем в ней 2 файла: microsip_autoconf.js и MicroSIP.ini. В ini файле размещаем общую для всех конфигурацию. Далее через групповые политики создаем задание на выполнение этого скрипта при входе пользователя в систему.

Содержимое файла microsip_autoconf.js

// ============================================================================
// Скрипт автонастройки программы-софтфона MicroSIP
// ============================================================================ var WSN = WScript.CreateObject("WScript.Network");
var FSO = WScript.CreateObject("Scripting.FileSystemObject");
var WSS = WScript.CreateObject('WScript.Shell'); var confFileName = 'MicroSIP.ini';
var confFolderName = 'MicroSIP';
var distFolderName = 'Dist';
var usersFolderName = 'Users';
var srvConfPath = '\\\\<server_name>\\microsip$'; var userName = WSN.UserName;
var srvDistPath = srvConfPath + '\\' + distFolderName;
var usrConfPath = WSS.ExpandEnvironmentStrings('%APPDATA%') + '\\' + confFolderName;
var genConfFileOnSrv = srvConfPath + '\\' + confFileName;
var usrConfFileOnSrv = srvConfPath + '\\' + usersFolderName + '\\' + userName + '.ini';
var usrConfFileOnLoc = usrConfPath + '\\' + confFileName; var genSrvINI = ;
var usrSrvINI = {};
var usrLocINI = {}; // Проверяем наличие конфигурации на сервере для текущего пользователя
if ( !(FSO.FileExists(usrConfFileOnSrv) && FSO.GetFile(usrConfFileOnSrv).Size > 0) ) { // Нет конфигурации для текущего пользователя, выходим WScript.Quit();
} // Проверяем наличие дистрибутива программы и обновляем его
if (FSO.FolderExists(srvDistPath)) { FSO.CopyFolder(srvDistPath, usrConfPath); // Создаем ярлык на рабочем столе strDesktop = WSS.SpecialFolders("Desktop"); oMyShortcut = WSS.CreateShortcut(strDesktop + "\\MicroSIP.lnk"); oMyShortcut.WindowStyle = 4; oMyShortcut.IconLocation = usrConfPath + '\\microsip.exe, 0'; oMyShortcut.TargetPath = usrConfPath + '\\microsip.exe'; oMyShortcut.WorkingDirectory = usrConfPath; oMyShortcut.Save();
} // Читаем основной конфиг файл на сервере
ReadINIFile(genSrvINI, genConfFileOnSrv);
// Читаем пользовательский конфиг файл на сервере
ReadINIFile(usrSrvINI, usrConfFileOnSrv);
// Читаем пользовательский конфиг файл на текущем компьютере
ReadINIFile(usrLocINI, usrConfFileOnLoc); // Мерджим данные в текущий локальный конфиг пользователя
// Сначала добавляем данные из глобального конфига на сервере
// Затем добавляем данные из пользовательского конфига на сервере
MergeINIObj(usrLocINI,genSrvINI);
MergeINIObj(usrLocINI,usrSrvINI); // Сохраняем полученный конфиг
SaveINIFile(usrLocINI,usrConfPath,usrConfFileOnLoc); // Функция для чтения всех параметров ini файла в объект
function ReadINIFile(INIObj, filename) { if ((FSO.FileExists(filename)) && (FSO.GetFile(filename).Size > 0)) { var fileh = FSO.OpenTextFile(filename, 1); while (!fileh.AtEndOfStream) { var line = fileh.ReadLine(); if (/^\[(\w+)\]/.test(line)){ var section = RegExp.$1.toLowerCase(); INIObj[section] = {}; } if (/^([^;#][^=]*?)\s*=\s*([^\r\n]*?)\s*$/.test(line)){ var param = RegExp.$1.toLowerCase(); var value = RegExp.$2; INIObj[section][param] = value; } } fileh.Close(); }
} // Функция сохранения объекта INI в ini-файл
function SaveINIFile(INIObj, confPath, filename){ function WriteArray(arr){ for (var i in arr){ var value = arr[i]; if (typeof(value)=='object') { if (value) { file.Write('[' + i + ']\r\n'); WriteArray(value); } }else{ if (value) { file.Write(i + '=' + value + '\r\n'); } } } } var FSO = WScript.CreateObject("Scripting.FileSystemObject"); if (!FSO.FolderExists(confPath)){ FSO.CreateFolder(confPath); } var file = FSO.OpenTextFile(filename, 2, true); WriteArray(INIObj); file.Close();
} // Функция объединения INI объектов в один (первый) INI объект
function MergeINIObj(firstINIObj, secondINIObj){ for (var section in secondINIObj){ if (!firstINIObj[section]) { firstINIObj[section] = {}; } for (var param in secondINIObj[section]){ if (!firstINIObj[section][param] || firstINIObj[section][param] != secondINIObj[section][param]){ firstINIObj[section][param] = secondINIObj[section][param]; } } }
}

Содержимое файла MicroSIP.ini

[Settings] disableLocalAccount=1
EnableLog=0
updatesInterval=never
CheckUpdatesTime=1466489328
denyIncoming=
usersDirectory=http://phonebook.local
SingleMode=1
LocalDTMF=1
autoanswer=button
denyIncoming=button
micAmplification=1
swLevelAdjustment=1
audioCodecs=PCMA/8000/1 PCMU/8000/1
accountId=1
[Account1] Server=voip.local
Domain=voip.local
Proxy=
PublicAddr=
ListenPort=
SRTP=
Transport=udp
Publish=0
STUN=
ICE=0
allowRewrite=1
voicemailNumber=
disableSessionTimer=0

Далее нам потребуется создать еще 2 директории: Dist — для хранения актуального дистрибутива программы и Users — для персональных конфигурационных файлов пользователей. В Dist распаковываем portable версию MicroSIP и добавляем языковой файл (при необходимости). Для Users настраиваем разрешение на чтение всем пользователям домена и отключаем наследование разрешений. Разрешение будем выдавать отдельно для каждого конфигурационного файла в этом каталоге только тому пользователю, настройки которого содержатся в этом файле.

Теперь мы можем создать конфигурационные файлы для пользователей в директории Users формата sAMAccountName.ini Приоритет этого файла выше, что позволяет переопределять глобальные настройки заданные в MicroSIP.ini и при необходимости делать настройки персонализировано для каждого пользователя.

Содержимое файла sAMAccountName.ini

[Account1] label=number
AuthID=number
Username=number
DisplayName=sAMAccountName
Password=password

Собственно, вот и все. Теперь при входе в систему у сотрудников, конфигурационные файлы которых имеются в директории Users, в папку профиля будет скопирован дистрибутив из Dist, сформирован файл конфигурации и создан ярлык для запуска MicroSIP.lnk на рабочем столе. Таким нехитрым способом нам удалось решить поставленные задачи по распространению и управлению программными телефонами на рабочих станциях.


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

«Тут всегда придётся развиваться»: интервью с Евгением Кувшиновым (ManyChat) о разработке в стартапе

А что происходит, если размеры компании стремительно меняются, и число сотрудников за пару лет увеличивается в десять раз? Все мы примерно представляем, как выглядит разработка в крупной компании и чем от неё может отличаться разработка в небольшой. Когда стартап бурно ...

[Из песочницы] Реалистичные тени для roguelike

Доброго времени, Хабр-сообщество. Тогда меня озадачила возможность создать интересные элементы для геймплея в roguelike (2). Много лет назад, натолкнулся на пост (1). Но более мне по душе ситуация, когда мы, путешествуя по коридорам подземелья, раскрываем особенности расположения объектов постепенно на ...