Notes about IT

Позднее Ctrl + ↑

Отправка бекапа настроек Mikrotik на e-mail

Задумался о бекапах Mikrotika. Нужно их не просто создавать, но и куда-то складывать.
Есть несколько вариантов:
1 — забирать по ftp с девайса
2 — забирать по ssh
3 — забирать со своего мыла

Были найдены статьи:
Резервирование настроек по E-mail и Automated_Backups

Из которых я соорудил рабочий вариант с костылем.
Костыль такой: с микротика отсылаем на служебный ящик бекап, а уже с него рассылаем куда надо. Плюс такого решения — у нас всегда есть, как минимум, два хранилища (служебная и личная почта).

2013   mikrotik   network

Уменьшение размера базы данных tempdb в SQL Server

В данной статье приведены три способа, которые можно использовать для уменьшения размера базы данных tempdb до значения, которое будет меньше последнего заданного размера.
Первый способ предоставляет полный контроль над размером файлов базы данных tempdb, но требует перезапуска сервера SQL Server.
Второй способ позволяет уменьшить размер базы данных tempdb в целом с некоторыми ограничениями, которые могут потребовать перезапуска сервера SQL Server.
Третий способ позволяет уменьшить размер отдельных файлов базы данных tempdb.
Последние два способа требуют, чтобы в процессе операции уменьшения размера с базой данных tempdb не производилось никаких действий.

2013   sql   windows

Устранение ошибок при сборке Zabbix

При сборке Zabbix из сорсов, возникают ошибки с зависимостями.

Решение для устранения зависимостей под Debian:
Flag:

--with-mysql

Error:

configure: error: MySQL library not found

Fix:

sudo apt-get install libmysqlclient-dev

Flag:

--with-jabber

Error:

checking for IKSEMEL... configure: error: Jabber library not found

Fix:

sudo apt-get install libiksemel-dev

Flag:

--with-libcurl

Error:

configure: error: Curl library not found

Fix:

sudo apt-get install libcurl4-openssl-dev

Flag:

--with-net-snmp

Error:

configure: error: Not found NET-SNMP library

Fix:

sudo apt-get install libsnmp-dev

Flag:

--with-openipmi

Error:

configure: error: Invalid OPENIPMI directory - unable to find ipmiif.h

Fix:

sudo apt-get install libopenipmi-dev

Flag:

--with-libxml2

Error:

configure: error: LIBXML2 library not found

Fix:

sudo apt-get install libxml2-dev
2013   nix

Invalid object name ’tempdb.dbo.ASPStateTempApplications’

Если вы используете IIS совместно с базой ASPState и в одно прекрасное утро видите в браузере ошибку Invalid object name ’tempdb.dbo.ASPStateTempApplications’, то на SQL сервере нужно выполнить следующий скрипт:

USE [ASPState]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[CreateTempTables]
SELECT 'Return Value' = @return_value
GO
2013   iis   windows

PowerShell: Синхронизация с помощью robocopy

Про замечательную утилу robocopy я уже писал в заметке Перенос MDaemon на другой сервер, но тогда я использовал консоль, сейчас же мне потребовалось использовать PoerShell. Что бы не изобретать велосипед я полез искать, т. к. решения просто обязаны быть.
Был найден скрипт за авторством NIKLAS JUMLIN. Скрипт запускает robocopy с параметрами и ведет логи.

## This Script Mirrors a directory tree from source to destination with the Windows builtin command robocopy.
## Exit codes from robocopy are logged to Windows Eventlog.
## Author: NIKLAS JUMLIN

## Usage: Run with administrative rights in Windows Task Scheduler or Administrator:PowerShell
## If not executed with administrative privileges the script will not write to eventlog.

## Change these parameters
## ================================================================

## Name of the job, name of source in Windows Event Log and name of robocopy Logfile.
$JOB = "DB Backup"

## Source directory
$SOURCE = "C:\Base"

## Destination directory. Files in this directory will mirror the source directory. Extra files will be deleted!
$DESTINATION = "E:\Backup"

## Path to robocopy logfile
$LOGFILE = "E:\Backup\LOGS\$JOB"

## Log events from the script to this location
$SCRIPTLOG = "E:\Backup\LOGS\$JOB.log"

## Mirror a direcotory tree
$WHAT = @("/MIR")
## /COPY:DATS: Copy Data, Attributes, Timestamps, Security
## /SECFIX : FIX file SECurity on all files, even skipped files.

## Retry open files 3 times wait 30 seconds between tries. 
$OPTIONS = @("/R:3","/W:30","/NDL","/NFL")
## /NFL : No File List - don't log file names.
## /NDL : No Directory List - don't log directory names.
## /L   : List only - don't copy, timestamp or delete any files.

## This will create a timestamp like yyyy-mm-yy
$TIMESTAMP = get-date -uformat "%Y-%m%-%d"

## This will get the time like HH:MM:SS
$TIME = get-date -uformat "%T"

## Append to robocopy logfile with timestamp
$ROBOCOPYLOG = "/LOG+:$LOGFILE`-$TIMESTAMP.log"

## Wrap all above arguments
$cmdArgs = @("$SOURCE","$DESTINATION",$WHAT,$ROBOCOPYLOG,$OPTIONS)

## ================================================================

## Start the robocopy with above parameters and log errors in Windows Eventlog.
& C:\Windows\System32\Robocopy.exe @cmdArgs

## Get LastExitCode and store in variable
$ExitCode = $LastExitCode

$MSGType=@{
"16"="Errror"
"8"="Error"
"4"="Warning"
"2"="Information"
"1"="Information"
"0"="Information"
}

## Message descriptions for each ExitCode.
$MSG=@{
"16"="Serious error. robocopy did not copy any files.`n
Examine the output log: $LOGFILE`-Robocopy`-$TIMESTAMP.log"
"8"="Some files or directories could not be copied (copy errors occurred and the retry limit was exceeded).`n
Check these errors further: $LOGFILE`-Robocopy`-$TIMESTAMP.log"
"4"="Some Mismatched files or directories were detected.`n
Examine the output log: $LOGFILE`-Robocopy`-$TIMESTAMP.log.`
Housekeeping is probably necessary."
"2"="Some Extra files or directories were detected and removed in $DESTINATION.`n
Check the output log for details: $LOGFILE`-Robocopy`-$TIMESTAMP.log"
"1"="New files from $SOURCE copied to $DESTINATION.`n
Check the output log for details: $LOGFILE`-Robocopy`-$TIMESTAMP.log"
"0"="$SOURCE and $DESTINATION in sync. No files copied.`n
Check the output log for details: $LOGFILE`-Robocopy`-$TIMESTAMP.log"
}

## Function to see if running with administrator privileges
function Test-Administrator  
{  
    $user = [Security.Principal.WindowsIdentity]::GetCurrent();
    (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)  
}

## If running with administrator privileges
If (Test-Administrator -eq $True) {
	"Has administrator privileges"

	## Create EventLog Source if not already exists
	if ([System.Diagnostics.EventLog]::SourceExists("$JOB") -eq $false) {
	"Creating EventLog Source `"$JOB`""
    [System.Diagnostics.EventLog]::CreateEventSource("$JOB", "Application")
	}

	## Write known ExitCodes to EventLog
	if ($MSG."$ExitCode" -gt $null) {
		Write-EventLog -LogName Application -Source $JOB -EventID $ExitCode -EntryType $MSGType."$ExitCode" -Message $MSG."$ExitCode"
	}
	## Write unknown ExitCodes to EventLog
	else {
		Write-EventLog -LogName Application -Source $JOB -EventID $ExitCode -EntryType Warning -Message "Unknown ExitCode. EventID equals ExitCode"
	}
}
## If not running with administrator privileges
else {
	## Write to screen and logfile
	Add-content $SCRIPTLOG "$TIMESTAMP $TIME No administrator privileges" -PassThru
	Add-content $SCRIPTLOG "$TIMESTAMP $TIME Cannot write to EventLog" -PassThru

	## Write known ExitCodes to screen and logfile
	if ($MSG."$ExitCode" -gt $null) {
		Add-content $SCRIPTLOG "$TIMESTAMP $TIME Printing message to logfile:" -PassThru
		Add-content $SCRIPTLOG ($TIMESTAMP + ' ' + $TIME + ' ' + $MSG."$ExitCode") -PassThru
		Add-content $SCRIPTLOG "$TIMESTAMP $TIME ExitCode`=$ExitCode" -PassThru
	}
	## Write unknown ExitCodes to screen and logfile
	else {
		Add-content $SCRIPTLOG "$TIMESTAMP $TIME ExitCode`=$ExitCode (UNKNOWN)" -PassThru
	}
	Add-content $SCRIPTLOG ""
	Return
}
2013   windows
2013   windows
2013   windows

Рекурсивно удаляем файлы старше 14 дней

Еще один способ рекурсивного удаления файлов старше 14 дней:

$now = Get-Date
#----- задаем количество дней старше которых файлы будут удаляться ----#
$Days = "14"
#----- задаем папку которая будет чиститься ----#
$TargetFolder = "C:\Applications\Logs"

$date = $now.AddDays(-$Days)
$files = Get-ChildItem -Path $TargetFolder -recurse | Where {$_.LastWriteTime -le "$date"}
foreach ($file in $files) {
Remove-Item $file -whatif
}
2013   windows

Удалить файлы старше 14 дней

Сразу проверяем, разрешено ли у нас запускать скрипты:

Get-ExecutionPolicy

Скорее всего нет — т. е. вернет что-то типа Restricted. Посему юзаем команду, меняющую “политику партии”:

Set-ExecutionPolicy RemoteSigned

Теперь создаем где-нибудь текстовый файл с расширением .ps1 и пишем в него:

#----- получаем текущую дату и пихаем в переменную ----#
$Now = Get-Date
#----- задаем количество дней старше которых файлы будут удаляться ----#
$Days = "14"
#----- задаем папку которая будет чиститься ----#
$TargetFolder = "C:\Applications\Logs"
#----- вот тут самое прикольное - задаем маску, то ли это просто расширение ----#
#----- то ли это будут файлы какогото спец формата, например такие PROG_Date.log где Date - дата ----#
$Extension = "PROG*.log"
#----- здесь делаем дату за которой будут удаляться файлы ---#
$LastWrite = $Now.AddDays(-$Days)
#----- получаем список файлов. Если не надо рекурсии то убираем соотв. параметр ---#
#----- если надо удалить тупо все файлы старше 10 дней то убираем -Include $Extension ---#
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where{$_.LastWriteTime -le "$LastWrite"}
#----- в цикле вербозно удаляем все полученные файлы ---#
foreach ($File in $Files)
{
 if ($File -ne $NULL)
 {
  write-host "Deleting File $File" -ForegroundColor "DarkRed"
  Remove-Item $File.FullName | out-null
 }
 else
 {
  Write-Host "No more files to delete!" -foregroundcolor "Green"
 }
}
2013   windows

Заставляем работать xp_cmdshell в T-SQL

Для того, что бы в MS SQL 2012 заставить работать xp_cmdshell нужно:

Единожды выполнить:

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO

Для проверки нужно в Job запихнуть или просто выполнить единожды:

exec xp_cmdshell 'del C:\file.txt';
GO

Код удаляет файл file.txt с диска C

2013   sql   windows
Ранее Ctrl + ↓