Перейти к содержимому

Как собрать информацию из 1с кластера и записатть в таблицу 1с

Скрипт для запуска в шедулер .

$Server = $env:computername
$Start = Get-Date
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("cp866")
$emailFrom = "monitoring@tech.adminbd.ru"
$smtpServer = "adminbd.ru"
$email1 = "konstantin@adminbd.ru"
$debug=0
$force=1
 
 
$SubjRPHost = "$Server : RPHost не запущен."
$SubjRASExist = "$Server : Служба RAS не существовала. Устанавлена."
$SubjRASNotRun = "$Server : Служба RAS была не запущена. Запущена."
$SubjRASVersion = "$Server : Версия RAS не совподает с версией запущенного RPHost. Служба переустанавена."
  
function SendEmail ($subj=$null, $mailbody=" " ) {
    Send-MailMessage -SmtpServer $smtpServer -To $email1 -From $emailFrom -Subject $subj -body $mailbody  -Encoding UTF8
}
  
$RPHostPath = Get-Process -Name rphost | select ID, FileVersion, Path, WorkingSet64 | sort WorkingSet64 | select -expand path -first 1
if(!$RPHostPath)
{
    if(test-path C:\Scripts\1c_sessions_error)
    {}
    else
    {
        SendEmail -subj $SubjRPHost
        "1" | Out-File C:\Scripts\1c_sessions_error
        "$($start.ToString("yyyy.MM.dd HH:mm:ss"))`t`t$SubjRPHost" | Out-File C:\Scripts\1c_sessions_error_log.txt -Append
    }
    exit
}
if(test-path C:\Scripts\1c_sessions_error)
{Remove-Item C:\Scripts\1c_sessions_error}
  
$Actual1CFolder = Split-Path $RPHostPath
Set-Location $Actual1CFolder
  
$RAS = Get-WmiObject win32_service | ?{$_.Name -like 'ras'}
if (!$RAS)
{
    SendEmail -subj $SubjRASExist -mailbody "Установлена из папки $Actual1CFolder"
    "$($start.ToString("yyyy.MM.dd HH:mm:ss"))`t`t$SubjRASExist" | Out-File C:\Scripts\1c_sessions_error_log.txt -Append
  
    if($force -eq 0){exit}
    else
    {
        New-Service ras -binaryPathName "$Actual1CFolder\ras.exe cluster --service" -displayName "1C:Enterprise 8.3 RAS" -StartupType Automatic
        Set-Service ras -Status running
    }
}
if (!$RAS.Started -OR $RAS.Status -ne "OK" -OR $RAS.State -ne "Running")
{
    SendEmail -subj $SubjRASNotRun
    "$($start.ToString("yyyy.MM.dd HH:mm:ss"))`t`t$SubjRASNotRun" | Out-File C:\Scripts\1c_sessions_error_log.txt -Append
    if($force -eq 0){exit}
    else
    {
        Set-Service ras -Status stopped
        Set-Service ras -Status running
    }
}
$RASPath = $RAS | select -expand PathName
$RASFolder = split-path $RASPath
if ($RASFolder -ne $Actual1CFolder)
{
    SendEmail -subj $SubjRASVersion -mailbody "Установлена из папки $Actual1CFolder"
    "$($start.ToString("yyyy.MM.dd HH:mm:ss"))`t`t$SubjRASVersion" | Out-File C:\Scripts\1c_sessions_error_log.txt -Append
    if($force -eq 0){exit}
    else
    {
        Set-Service ras -Status stopped
        $(Get-WmiObject win32_service | ?{$_.Name -like 'ras'}).delete()
        New-Service ras -binaryPathName "$Actual1CFolder\ras.exe cluster --service" -displayName "1C:Enterprise 8.3 RAS" -StartupType Automatic
        Set-Service ras -Status running
    }
}
  
$cluster = .\rac.exe cluster list | % {if ($_ -match 'cluster'){$_ -replace "^.*?: "}}
#$cluster
$racInfobases = .\rac.exe infobase --cluster=$cluster summary list
#.\rac.exe session
#.\rac.exe session --cluster=$cluster info --session=28e5603b-cb9c-449d-bcde-a2c843bd2d68
  
$sessionBase = @()
$infoBaseBase = @()
  
  
foreach ($racInfobase in $racInfobases)
{
    if ($racInfobase -match "infobase")
    {
        $infoBase = New-Object -TypeName PSObject
        $infoBase | Add-Member -Type NoteProperty -Name infobase -Value ([string]($racInfobase -replace "^.*?: "))
    }
    if ($racInfobase -match "name")
    {
        $infoBase | Add-Member -Type NoteProperty -Name name -Value ([string]($racInfobase -replace "^.*?: "))
        $infoBaseBase += $infoBase
    }
}
if ($debug -eq 1)
{
    $infoBaseBase | sort name | ft * -AutoSize
}
  
$racSessions = .\rac.exe session --cluster=$cluster list
Foreach($racSession in $racSessions)
{
    if ($racSession -match "session ")
    {
        if ($debug -eq 1)
        {
            $racSession -replace "^.*?: "
        }
        $Session = New-Object -TypeName PSObject
        $Session | Add-Member -Type NoteProperty -Name uid -Value ([string]($racSession-replace "^.*?: "))
    }
    elseif ($racSession -match "infobase")
    {
        $infoBaseUid = $racSession -replace "^.*?: "
        #$infoBaseUid
        $infoBaseName = $infoBaseBase | ? {$_.infobase -match "$infobaseUid"} | select -expand name
        #$infoBaseName
        $Session | Add-Member -Type NoteProperty -Name base -Value ([string]($infoBaseName))
    }
    elseif ($racSession -match "user.name")
    {
        $session | Add-Member -Type NoteProperty -Name user -Value ([string]($racSession-replace "^.*?: "))
    }
    elseif ($racSession -match "app-id")
    {
        $session | Add-Member -Type NoteProperty -Name type -Value ([string]($racSession-replace "^.*?: "))
    }
    elseif ($racSession -match "started.at")
    {
        $started = $racSession -replace "^.*?: "
        $session | Add-Member -Type NoteProperty -Name Started -Value ([string]($([datetime]$started).ToString("yyyy-MM-dd HH:mm:ss")))
    }
    elseif ($racSession -match "last.active.at")
    {
        $last = $racSession -replace "^.*?: "
        $session | Add-Member -Type NoteProperty -Name Last -Value ([string]($([datetime]$last).ToString("yyyy-MM-dd HH:mm:ss")))
    }
    elseif ($racsession -match "hibernate ")
    {
        if ($racsession -match "yes")
        {$Sleep = 1}
        elseif ($racsession -match "no")
        {$Sleep = 0}
        $session | Add-Member -Type NoteProperty -Name sleep -Value ([int]$Sleep)
    }
    elseif ($racSession -match "duration.current ")
    {
        $session | Add-Member -Type NoteProperty -Name dur_current -Value ([long]($racSession-replace "^.*?: "))
    }
    elseif ($racSession -match "duration.current-dbms")
    {
        $session | Add-Member -Type NoteProperty -Name dur_db_cur -Value ([long]($racSession-replace "^.*?: "))
    }
    elseif ($racSession -match "memory.current")
    {
        $session | Add-Member -Type NoteProperty -Name m_current -Value ([long]($racSession-replace "^.*?: "))
    }
    elseif ($racSession -match "memory.last")
    {
        $session | Add-Member -Type NoteProperty -Name m_5min -Value ([long]($racSession-replace "^.*?: "))
    }
    elseif ($racSession -match "memory.total")
    {
        if ($debug -eq 1)
        {
            $racSession
        }
        $session | Add-Member -Type NoteProperty -Name m_total -Value ([long]($racSession-replace "^.*?: "))
        $sessionBase += $session
    }
}
$sessionBase | sort M_Current | ft * -AutoSize
<#
$end = Get-Date
$dT = $end - $Start
"`nD:HH:MM:Seconds"
"{0:G}” -f $dT
#>
 
$dataSource = “db1.adminbd.ru”
$database = “monitoring”
$User="1c"
$Password="pass"
$connectionString = “Provider=sqloledb; ” +
“Data Source=$dataSource; ” +
“Initial Catalog=$database; ” +
“User ID=$User; ” +
“Password=$Password; “
 
$connection = New-Object System.Data.OleDb.OleDbConnection $connectionString
$command = New-Object System.Data.OleDb.OleDbCommand $sql,$connection
$connection.Open()
 
foreach ($sOut in $sessionBase)
{
    if ($sOut){
    $values = "'$server','"+$sOut.uid+"','"+$sOut.base+"','"+$sOut.user+"','"+$sOut.type+"','"+$sOut.started+"','"+$sOut.last+"','"+$sOut.sleep+"','"+$sOut.dur_current+"','"+$sOut.dur_db_cur+"','"+$sOut.m_current+"','"+$sOut.m_5min+"','"+$sOut.m_total+"'"
    $values
     
    $command.CommandText = "INSERT INTO [monitoring].[dbo].[sessions] ([server],[uuid],[base],[user],[type],[started],[last],[sleep],[duration_cur],[duration_db_cur],[Current],[5min],[Total]) VALUES ($values);"
      $command.ExecuteNonQuery()                                                  
        }
}
#$Reader.Close()
 
$command = New-Object data.OleDb.OleDbCommand $sql
$command.connection = $connection
 
$Connection.Close()

Создаем в mssql базу monitoring в ней таблицу

create table sessions(
    [id serial] INT IDENTITY (1,1) PRIMARY KEY,
    [server] varchar(255) NOT NULL,
    [clock]  DATETIME NOT NULL DEFAULT (GETDATE()),
    [uuid] varchar(255) NOT NULL,
    [base] varchar(255),
    [user] varchar(255) ,
    [type] varchar(255) NOT NULL,
    [started] datetime,
    [last] datetime,
    [sleep] varchar(255),
    [current] bigint,
    [5min] bigint,
    [total] bigint,
    [duration_cur] bigint,
    [duration_db_cur] bigint
);

Как собрать информацию из 1с кластера и записатть в таблицу 1с

Similar Posts:

Метки:

Добавить комментарий

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