Инветоризация компьютеров в домене с помощью GLPI (0.80.2) + FusionInventory

Ну вы знаете как это бывает – прибегают из ада бухгалтерии с распечатками за 2006 и спрашивают нет ли у вас более актуальной статистике по парку пк, а то, видите ли, за 5 лет она утратила актуальность. А вы, такие, делаете жест “не беспокойтесь, юзеры, я тут, чтобы решить ваши проблемы”, заходите на http://localhost/glpi и скармливаете им красивенький отчетик в pdf или csv.

Делается это (в моем случае) так – берется сервер на debian с apache2, php5 и mysql5.1, качаются GLPI (0.80.2):

wget -c https://forge.indepnet.net/attachments/download/943/glpi-0.80.2.tar.gz

и FusionInventory (2.4.0 RC2 для GLPI 0.80.X):

wget -c http://forge.fusioninventory.org/attachments/download/417/fusioninventory-for-glpi-metapackage_2.4.0-RC2.tar.gz

устанавливаем glpi и FusionInventory:

tar -zxvf glpi-0.80.2.tar.gz && mv glpi /var/www/glpi/
tar -zxvf fusioninventory-for-glpi-metapackage_2.4.0-RC2.tar.gz && rm -f fusion*.gz && mv fusi* /var/www/glpi/plugins/

Исправляем права:

chown -R www-data:www-data /var/www/glpi/

Затем подключаемся к mysql серверу, создаем базу, и даем пользователю glpi полные права:

root@monsrvr:/var/www# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.
mysql> create database glpi;
Query OK, 1 row affected (0.02 sec)
mysql> grant all privileges on glpi.* to 'glpi'@'localhost' identified by 'glpi';
Query OK, 0 rows affected (0.14 sec)
mysql> exit
Bye

Открываем браузер, заходим по адресу http://tehserver/glpi, указываем все, что требуется и попадаем на страницу аутентификации (username: glpi, password: glpi).

Плагин FusionInventory можно активировать перейдя в пункт меню “Настройки” > “Дополнения”. Вот в принципе и все для серверной части.

Функционал этой связки значительно шире чем просто инвенторизация компьютеров, однако я напишу только о том, как подключить обычный Windows клиент и распространить его через Active Directory.

Качается агент и выкладывается на шару (у меня samba-шара с read-only доступом для всех на этом же сервере):

wget -c http://prebuilt.fusioninventory.org/stable/windows-i386/fusioninventory-agent_windows-i386_2.1.9-3.exe

а в Active Directory для вашего OU с компьютерами подлежащими инвенторизации создается следующий logon script:

Option Explicit
Dim versionverification, fusionarguments, uninstallocsagent, fusionsetupURL
''''' USER SETTINGS '''''
versionverification = "2.1.9-3"
fusionarguments = "/S /server=http://server1/glpi/plugins/fusioninventory/ /rpc-trust-localhost /runnow"
' Depending on your needs, you can use either HTTP or Windows share
fusionsetupURL = "\\server1\data\fusioninventory-agent_windows-i386_" & versionverification & ".exe"
'fusionsetupURL = "http://prebuilt.fusioninventory.org/stable/windows-i386/fusioninventory-agent_windows-i386_" & versionverification & ".exe"
uninstallocsagent = "yes"
''''' DO NOT EDIT BELOW '''''
Function baseName (strng)
Dim regEx, ret
Set regEx = New RegExp
regEx.Global = true
regEx.IgnoreCase = True
regEx.Pattern = ".*[/\\]([^/\\]+)$"
baseName = regEx.Replace(strng,"$1")
End Function

Function isHttp (strng)
Dim regEx, matches
Set regEx = New RegExp
regEx.Global = true
regEx.IgnoreCase = True
regEx.Pattern = "^(http(s?)).*"
If regEx.Execute(strng).count > 0 Then
isHttp = True
Else
isHttp = False
End If
Exit Function
End Function

' http://www.ericphelps.com/scripting/samples/wget/index.html
Function SaveWebBinary(strUrl) 'As Boolean
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Const ForWriting = 2
Dim web, varByteArray, strData, strBuffer, lngCounter, ado
' On Error Resume Next
'Download the file with any available object
Err.Clear
Set web = Nothing
Set web = CreateObject("WinHttp.WinHttpRequest.5.1")
If web Is Nothing Then Set web = CreateObject("WinHttp.WinHttpRequest")
If web Is Nothing Then Set web = CreateObject("MSXML2.ServerXMLHTTP")
If web Is Nothing Then Set web = CreateObject("Microsoft.XMLHTTP")
web.Open "GET", strURL, False
web.Send
If Err.Number <> 0 Then
SaveWebBinary = False
Set web = Nothing
Exit Function
End If
If web.Status <> "200" Then
SaveWebBinary = False
Set web = Nothing
Exit Function
End If
varByteArray = web.ResponseBody
Set web = Nothing
'Now save the file with any available method
On Error Resume Next
Set ado = Nothing
Set ado = CreateObject("ADODB.Stream")
If ado Is Nothing Then
Set fs = CreateObject("Scripting.FileSystemObject")
Set ts = fs.OpenTextFile(baseName(strUrl), ForWriting, True)
strData = ""
strBuffer = ""
For lngCounter = 0 to UBound(varByteArray)
ts.Write Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1)))
Next
ts.Close
Else
ado.Type = adTypeBinary
ado.Open
ado.Write varByteArray
ado.SaveToFile CreateObject("WScript.Shell").ExpandEnvironmentStrings("%Temp%") & "\fusioninventory.exe", adSaveCreateOverWrite
ado.Close
End If
SaveWebBinary = True
End Function

Function removeOCS()
On error resume next

Dim OCS
' Uninstall agent ocs if is installed
' Verification on OS 32 Bits
On error resume next
OCS = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OCS Inventory Agent\UninstallString")
If err.number = 0 then
WshShell.Run "CMD.EXE /C net stop ""OCS INVENTORY SERVICE""",0,True
WshShell.Run "CMD.EXE /C """ & OCS & """ /S /NOSPLASH",0,True
WshShell.Run "CMD.EXE /C rmdir ""%ProgramFiles%\OCS Inventory Agent"" /S /Q",0,True
WshShell.Run "CMD.EXE /C rmdir ""%SystemDrive%\ocs-ng"" /S /Q",0,True
End If

' Verification on OS 64 Bits
On error resume next
OCS = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\OCS Inventory Agent\UninstallString")
If err.number = 0 then
WshShell.Run "CMD.EXE /C net stop ""OCS INVENTORY SERVICE""",0,True
WshShell.Run "CMD.EXE /C """ & OCS & """ /S /NOSPLASH",0,True
WshShell.Run "CMD.EXE /C rmdir ""%ProgramFiles(x86)%\OCS Inventory Agent"" /S /Q",0,True
WshShell.Run "CMD.EXE /C rmdir ""%SystemDrive%\ocs-ng"" /S /Q",0,True
End If

End Function

Function needFusionInstall ()
Dim Fusion
' install fusion if version is different or if not installed
needFusionInstall = False
On error resume next
Fusion = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\FusionInventory Agent\DisplayVersion")
If err.number = 0 Then
' Verification on OS 32 Bits
If Fusion <> versionverification Then
needFusionInstall = True
Else
needFusionInstall = False
Return
End If
Else
' Verification on OS 64 Bits
On error resume next
Fusion = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\FusionInventory Agent\DisplayVersion")
If err.number = 0 Then
If Fusion <> versionverification Then
needFusionInstall = True
End if
Else
needFusionInstall = True
End If
End If
End Function

''' MAIN
Dim WshShell
Set WshShell = Wscript.CreateObject("Wscript.shell")

If uninstallocsagent = "yes" Then
removeOCS()
End If

If needFusionInstall() Then
If (isHttp(fusionsetupURL)) Then
SaveWebBinary(fusionsetupURL)
WshShell.Run "CMD.EXE /C %TEMP%\fusioninventory.exe " & fusionarguments,0,True
Else
WshShell.Run "CMD.EXE /C """ & fusionsetupURL & """ " & fusionarguments,0,True
End If
End If

не забываем указать в fusionargument, fusionsetupURL актуальные для вас данные, радостные потираем потные ладошки и с чувством выполненного долга отправляемся к ближайшей стойке за холодным жидким хлебом.

glpi + fusion inventory

PS. Как исправить не кошерную кодировку в отчетах для GLPI + FusionInventory.

  • Сергей

    Привет. Спасибо за статью))
    Все прошло на ура, но вот с скриптом проблемы… изменения внес какие нужно, но скрипт не выполняется (даже в темповую папку не грузится файлик по запросу с сервера), хотя в логах апача имеется запрос на скачку…. 
    При ручной установке и настройке агента, компутер добавляется.
    В чем может быть трабл относительно скрипта, можно ли как-то отследить выполнение по-этапно? Спасибо

  • Anonymous

    В логе ошибок венды что-нибудь есть? На шару зайти можете?

  • Сергей

    Да хоть с шары, хоть локально с компа, без разницы

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