среда, 22 июня 2011 г.

MYSQL

Примеры использования CREATE DATABASE

Следущий пример создает базу данных "my_db":
CREATE DATABASE `my_db`
или

CREATE DATABASE `my_db` CHARACTER SET utf8 COLLATE utf8_general_ci;
Для того, чтобы посмотреть настройки уже существующей базы данных необходимо выполнить оператор SHOW CREATE DATABASE
mysql> SHOW CREATE DATABASE `test`;
 
Просмотр параметров базы 
mysql> use monpo
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SHOW VARIABLES LIKE "coll%";
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | cp1251_general_ci |
| collation_server     | utf8_general_ci   |
+----------------------+-------------------+
3 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE "character%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | cp1251                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec) 

PHP и Unicode

Соображения по программированию
Как уже упоминалось, PHP-работу с Unicode можно выполнить несколькими способами, включая расширения PHP, различные кодировки, и т.д. Но пока вы не стали экспертом в данной области, я не рекомендую пробовать принимать решение выбирать из этих многочисленных возможностей. Вы почти определенно достигнете наилучших результатов, если сконцентрируетесь на следующем:
  • Явно используйте кодировку UTF-8, маркированную:
    • "mb_language('uni'); mb_internal_encoding('UTF-8');" в верхней части ваших сценариев.
    • Content-type: text/html; charset=utf-8 в HTTP-заголовке для .htaccess, header() или конфигурации Web-сервера.
    • <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> и <orm accept-charset = "utf-8"> в HTML-коде.
    • CREATE DATABASE ... DEFAULT CHARACTER SET utf8 COLLATE utf8 ... ENGINE ... CHARSET=utf8 COLLATE=utf8_unicode_ci - обычная последовательность для экземпляра MySQL, а для других баз данных имеются похожие выражения.
    • SET NAMES 'utf8' COLLATE 'utf8_unicode_ci' - это полезная директива для PHP, которая передается в MySQL сразу после подключения.
    • В php.ini назначьте default_charset = UTF-8.
  • Заменяйте строковые функции, такие как strlen и strtlower, на mb_strlen и mb_convert_case.
  • Заменяйте mail и colleagues на mb_send_mail и др.; хотя понимающие Unicode сообщения электронной почты являются продвинутой темой, выходящей за рамки данной статьи, использование mb_send_mail является хорошей отправной точкой.
  • Используйте функции многобайтных регулярных выражений (multibyte regular expressions) (см. раздел "Ресурсы").

вторник, 21 июня 2011 г.

Конвертация файлов из одной кодировки в другую.

Перекодировать файл

iconv -t CP1251 -f UTF8 -o index.php.2 index.php

Перекодировать все файлы в текущем каталоге

find . -type f -exec recode CP1251..UTF8 {} \;

команда не только меняет кодировку, но и убирает <CR><NL> ('\r\n' заменяет на '\n')




пятница, 17 июня 2011 г.

Теневое копирование в Windows 2

Для целей резервного копирования гораздо интереснее утилиты командной строки, входящие в пакет Volume Shadow Copy Service SDK, который можно скачать здесь.
Из всего пакета нас в первую очередь интересует утилита vshadow.exe. Она позволяет
- создавать и удалять снимок тома
- просматривать списки созданных снимков
- монтировать снимок
- экспортировать, импортировать снимки и восстанавливать состояние тома
Существует две версии vshadow с различным функционалом.
Для Windows 2003, Windows 2008 и Vista необходимо использовать эту версию:
«C:\Program Files\Microsoft\VSSSDK72\TestApps\vshadow\bin\release-server\vshadow.exe»
Для XP используется
«C:\Program Files\Microsoft\VSSSDK72\TestApps\vshadow\bin\release-xp\vshadow.exe»
Версия для XP, в первую очередь, отличается от «серверной» тем, что не может создавать «хранимые» (persistent) snapshot’ы, то есть по окончанию процесса резервирования snapshot удаляется. Это ограничение накладывает реализация VSS в XP.
Утилиту можно копировать на серверы, не устанавливая SDK.
В комплект SDK входит целый набор скриптов, выполняющих различные действия. Но они достаточно сложны для понимания, поэтому предлагаю рассмотреть максимально простой скрипт, который сделает резервную копию открытых файлов через VSS.
vshadow.exe –p –script=vars.cmd d:
call vars.cmd
xcopy x:\some_locked_file.pst c:\backup\
vshadow –ds=%SHADOW_ID_1%
По шагам:
1. Создаем хранимый snapshot тома
vshadow.exe –p –script=vars.cmd d:
-p хранимый snapshot
-script=vars.cmd командный файл, в который vshadow сохранит название снапшота
vshadow записывает в файл, указанный в параметре -script следующее:
@echo.
@echo [This script is generated by VSHADOW.EXE for the shadow set
@echo {6b228a73-f8bf-4254-90e7-0d58219bc554}]
@echo.
SET SHADOW_SET_ID={6b228a73-f8bf-4254-90e7-0d58219bc554}
SET SHADOW_ID_1={8d14c5fe-87c1-4dac-8459-9a46b2874ef1}
SET SHADOW_DEVICE_1=\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy16
D: том, для которого создается snapshot
2. Подключаем snapshot как диск
call vars.cmd
vshadow.exe -el=%SHADOW_ID_1%,X:
call vars.cmd – загружаем переменные окружения с именем снапшота
vshadow.exe -el=%SHADOW_ID_1%, X: – подключаем созданный snapshot как логический диск X:
3. Копируем файлы
xcopy x:\some_locked_file.pst c:\backup\
4. Удаляем snapshot
vshadow –ds=%SHADOW_ID_1%
Это все, господа. :-) Ранее блокированый файл успешно скопировался.
Что почитать:
1) Volume Shadow Copy Service SDK. 7.2 Download http://www.microsoft.com/downloads/details.aspx?familyid=0b4f56e4-0ccc-4626-826a-ed2c4c95c871
2) http://blogs.msdn.com/adioltean/archive/2004/12/30/344476.aspx
http://blogs.msdn.com/adioltean/archive/2005/01/05/346793.aspx
http://blogs.msdn.com/adioltean/archive/2005/01/20/357836.aspx
http://blogs.msdn.com/adioltean/archive/2006/09/18/761515.aspx

Теневое копирование в Windows

Теневое копирование в Windows,  (Volume Shadow Copy Service, VSS)
команды

vssadmin /?
vssadmin list shadowstorage
vssadmin resize shadowstorage /For=C: /On=C: /Maxsize=90GB  

Volume Shadow Copy Service SDK 7.2Volume Shadow Copy Service SDK 7.2 )
vshadow.exe (documentation) 

Basically, it is a neat little wrapper around these four vshadow commands:
vshadow.exe -q                - List all shadow copies in the system
vshadow.exe -p {volume list}  - Manages persistent shadow copies
vshadow.exe -el={SnapID},dir  - Expose the shadow copy as a mount point
vshadow.exe -ds={SnapID}      - Deletes this shadow copy
Here is its help screen:
VSS Snapshot Create/Mount Tool

Usage:
cscript /nologo VssSnapshot.vbs /target:path { /volume:X | /unmount } [/debug]

/volume  - drive letter of the volume to snapshot
/target  - the path (absolute or relative) to mount the snapshot to
/debug   - swich on debug output

Examples:
cscript /nologo VssSnapshot.vbs /target:C:\Backup\DriveD /volume:D
cscript /nologo VssSnapshot.vbs /target:C:\Backup\DriveD /unmount

Hint: No need to unmount before taking a new snapshot.
 
Here some sample output:
C:\VssSnapshot>cscript /nologo VssSnapshot.vbs /target:MountPoints\E /volume:E 
05/03/2010 17:13:04 preparing VSS mount point... 
05/03/2010 17:13:04 mount point prepared at: C:\VssSnapshot\MountPoints\E 
05/03/2010 17:13:04 creating VSS snapshot for volume: E 
05/03/2010 17:13:08 snapshot created with ID: {4ed3a907-c66f-4b20-bda0-9dcda3b667ec} 
05/03/2010 17:13:08 VSS snapshot mounted sucessfully 
05/03/2010 17:13:08 finished 
C:\VssSnapshot>cscript /nologo VssSnapshot.vbs /target:MountPoints\E /unmount 
05/03/2010 17:13:35 preparing VSS mount point... 
05/03/2010 17:13:36 nothing else to do 
05/03/2010 17:13:36 finished
 
 
 
''# VssSnapshot.vbs
''# http://serverfault.com/questions/119120/how-to-use-a-volume-shadow-copy-to-make-backups/119592#119592
Option Explicit

Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")

''# -- MAIN SCRIPT -------------------------------------------
Dim args, snapshotId, targetPath, success
Set args = WScript.Arguments.Named
CheckEnvironment

Log "preparing VSS mount point..."
targetPath = PrepareVssMountPoint(args("target"))

If args.Exists("unmount") Then
  Log "nothing else to do"
ElseIf targetPath <> vbEmpty Then
  Log "mount point prepared at: " & targetPath
  Log "creating VSS snapshot for volume: " & args("volume")
  snapshotId = CreateVssSnapshot(args("volume"))

  If snapshotId <> vbEmpty Then
    Log "snapshot created with ID: " & snapshotId
    success = MountVssSnapshot(snapshotId, targetPath)
    If success Then
      Log "VSS snapshot mounted sucessfully"
    Else
      Die "failed to mount snapshot"
    End If
  Else
    Die "failed to create snapshot"
  End If
Else
  Die "failed to prepare mount point"
End If

Log "finished"

''# -- FUNCTIONS ---------------------------------------------
Function PrepareVssMountPoint(target) ''# As String
  Dim cmd, result, outArray
  Dim path, snapshot, snapshotId
  Dim re, matches, match

  PrepareVssMountPoint = VbEmpty
  target = fso.GetAbsolutePathName(target)

  If Not fso.FolderExists(fso.GetParentFolderName(target)) Then 
    Die "Invalid mount point: " & target
  End If

  ''# create or unmount (=delete existing snapshot) mountpoint
  If Not fso.FolderExists(target) Then
    If Not args.Exists("unmount") Then fso.CreateFolder target
  Else
    Set re = New RegExp
    re.MultiLine = False
    re.Pattern = "- Exposed locally as: ([^\r\n]*)"

    cmd = "vshadow -q"
    result = RunCommand(cmd, false)
    outarray = Split(result, "*")

    For Each snapshot In outArray
      snapshotId = ParseSnapshotId(snapshot)
      If snapshotId <> vbEmpty Then
        Set matches = re.Execute(snapshot)
        If matches.Count = 1 Then
          path = Trim(matches(0).SubMatches(0))
          If fso.GetAbsolutePathName(path) = target Then
            cmd = "vshadow -ds=" & snapshotId
            RunCommand cmd, true
            Exit For
          End If
        End If
      End If
    Next

    If args.Exists("unmount") Then fso.DeleteFolder target
  End If

  PrepareVssMountPoint = target
End Function

Function CreateVssSnapshot(volume) ''# As String
  Dim cmd, result

  If Not fso.DriveExists(volume) Then
    Die "Drive " & volume & " does not exist."
  End If

  cmd = "vshadow -p " & Replace(UCase(volume), ":", "") & ":"
  result = RunCommand(cmd, false)
  CreateVssSnapshot = ParseSnapshotId(result)
End Function

Function MountVssSnapshot(snapshotId, target) ''# As Boolean
  Dim cmd, result

  If fso.FolderExists(targetPath) Then
    cmd = "vshadow -el=" & snapshotId & "," & targetPath
    result = RunCommand(cmd, true)
  Else
    Die "Mountpoint does not exist: " & target
  End If

  MountVssSnapshot = (result = "0")
End Function

Function ParseSnapshotId(output) ''# As String
  Dim re, matches, match

  Set re = New RegExp
  re.Pattern = "SNAPSHOT ID = (\{[^}]{36}\})"
  Set matches = re.Execute(output)

  If matches.Count = 1 Then
    ParseSnapshotId = matches(0).SubMatches(0)
  Else
    ParseSnapshotId = vbEmpty
  End If
End Function

Function RunCommand(cmd, exitCodeOnly) ''# As String
  Dim shell, process, output

  Dbg "Running: " & cmd

  Set shell = CreateObject("WScript.Shell")

  On Error Resume Next
  Set process = Shell.Exec(cmd)
  If Err.Number <> 0 Then
    Die Hex(Err.Number) & " - " & Err.Description
  End If
  On Error GoTo 0

  Do While process.Status = 0
    WScript.Sleep 100
  Loop
  output = Process.StdOut.ReadAll

  If process.ExitCode = 0 Then 
    Dbg "OK"
    Dbg output
  Else
    Dbg "Failed with ERRORLEVEL " & process.ExitCode
    Dbg output
    If Not process.StdErr.AtEndOfStream Then 
      Dbg process.StdErr.ReadAll
    End If
  End If  

  If exitCodeOnly Then
    Runcommand = process.ExitCode
  Else
    RunCommand = output
  End If
End Function

Sub CheckEnvironment
  Dim argsOk

  If LCase(fso.GetFileName(WScript.FullName)) <> "cscript.exe" Then
    Say "Please execute me on the command line via cscript.exe!"
    Die ""
  End If

  argsOk = args.Exists("target")
  argsOk = argsOk And (args.Exists("volume") Or args.Exists("unmount"))

  If Not argsOk Then
    Say "VSS Snapshot Create/Mount Tool" & vbNewLine & _
        vbNewLine & _
        "Usage: " & vbNewLine & _
        "cscript /nologo " & fso.GetFileName(WScript.ScriptFullName) & _
          " /target:path { /volume:X | /unmount } [/debug]" & _
        vbNewLine & vbNewLine & _
        "/volume  - drive letter of the volume to snapshot" & _
        vbNewLine & _
        "/target  - the path (absolute or relative) to mount the snapshot to" & _
        vbNewLine & _
        "/debug   - swich on debug output" & _
        vbNewLine & vbNewLine & _
        "Examples: " & vbNewLine & _
        "cscript /nologo " & fso.GetFileName(WScript.ScriptFullName) & _
          " /target:C:\Backup\DriveD /volume:D" &  vbNewLine & _
        "cscript /nologo " & fso.GetFileName(WScript.ScriptFullName) & _
          " /target:C:\Backup\DriveD /unmount" & _
        vbNewLine & vbNewLine & _
        "Hint: No need to unmount before taking a new snapshot." & vbNewLine

    Die ""
  End If
End Sub

Sub Say(message)
  If message <> "" Then WScript.Echo message
End Sub

Sub Log(message)
  Say FormatDateTime(Now()) & " " & message
End Sub

Sub Dbg(message)
  If args.Exists("debug") Then 
    Say String(75, "-")
    Say "DEBUG: " & message
  End If
End Sub

Sub Die(message)
  If message <> "" Then Say "FATAL ERROR: " & message
  WScript.Quit 1
End Sub 
 
----------------------------------------------------------------------------------------
you can mount a shadowcopy fairly easily from the command shell using linkd from the resource kit tools for 2003, or using the built in mklink in Vista/2008/7
vssadmin list shadows to list the shadow copies
and then
linkd c:\backupimage \?\GLOBALROOT\Device\HarddiskVolumeShadowCopyn
or
mklink /D c:\backupimage \?\GLOBALROOT\Device\HarddiskVolumeShadowCopyn
where n is the shadow copy number.
This will mount the whole shadowcopy under the folder c:\backupimages which you can then backup
 
I like this answer but it didn't quite work for me when mounting the 
\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy_n_
Instead I used the referenced file and snapshot time from the root share (C$ for instance)  
mklink /D D:\TempMount \\localhost\C$\@GMT-2011.01.01-06.00.08 
- unfortunately this is likely to be a manual process but for emergencies, it works.
----------------------------------------------------------------------------------------
Hope this is what you want:
diskshadow -s vssbackup.cfg
vssbackup.cfg:
set context persistent
set metadata E:\backup\result.cab
set verbose on
begin backup
     add volume C: alias ConfigVolume
     create
     EXPOSE %ConfigVolume% Y:
     # Y is your VSS drive
     # run your backup script here
     delete shadows exposed Y:
end backup

пятница, 10 июня 2011 г.

Инвентаризация ПО предприятия с помощью антивируса Касперского

Инвентаризация ПО предприятия с помощью антивируса Касперского

 

Смотри здесь.

Запросы к базе сервера администрирования касперского. (В моем случае mySQL, в качестве оболочки удобно использовать heidisql.exe)
"Имя программы, число установок"

select b.wstrdisplayname as name, count(*) as num
from hst_inventory_hstprds a, hst_inventory_products b
where a.nproduct=b.nid
group by wstrdisplayname
order by num desc;
---------------------------------------------------------------------------------

"Имя ПК с программой"

select c.strwinhostname as host, b.wstrdisplayname as name
from hst_inventory_hstprds a, hst_inventory_products b, Hosts c
where a.nproduct=b.nid
and b.wstrdisplayname like '%Windows XP Service Pack 3%'
and c.nid=a.nhostid;


select c.strwinhostname as host, b.wstrdisplayname as name, a.tmInstallDate as idate
from hst_inventory_hstprds a, hst_inventory_products b, Hosts c
where a.nproduct=b.nid
and b.wstrdisplayname like '%Microsoft Office%'
and b.wstrdisplayname not like '%iewer%'
and c.nid=a.nhostid;

---------------------------------------------------------------------------------

"Имя ПК с программой с датой установки"

select c.strwinhostname as host, b.wstrdisplayname as name, a.tmInstallDate as idate
from hst_inventory_hstprds a, hst_inventory_products b, Hosts c
where a.nproduct=b.nid
and b.wstrdisplayname like '%Windows XP Service Pack 3%'
and c.nid=a.nhostid;
---------------------------------------------------------------------------------

"Имя ПК с программой с датой установки"  поиск по имени ПК

select c.strwinhostname as host, b.wstrdisplayname as name, a.tmInstallDate as idate
from hst_inventory_hstprds a, hst_inventory_products b, Hosts c
where a.nproduct=b.nid
and c.strwinhostname like '%n3088%'
and c.nid=a.nhostid;

"обновления"
select c.strwinhostname as host, b.wstrdisplayname as name, a.tmInstallDate as idate
from hst_inventory_hstprds a, hst_inventory_patches b, Hosts c
where a.nproduct=b.nid
and c.strwinhostname like '%n3088%'
and c.nid=a.nhostid;

---------------------------------------------------------------------------------

"Имя патча, число установок"

select b.wstrdisplayname as name, count(*) as num
from hst_inventory_hstprds a, hst_inventory_patches b
where a.nproduct=b.nid
group by wstrdisplayname
order by num desc;
---------------------------------------------------------------------------------

"Имя ПК имя патча"

select c.strwinhostname as host, b.wstrdisplayname as name
from hst_inventory_hstprds a, hst_inventory_patches b, Hosts c
where a.nproduct=b.nid
and b.wstrdisplayname like '%KB2570791%'
and c.nid=a.nhostid;

KB2570791
Обновление безопасности для Windows XP (KB2124261)
---------------------------------------------------------------------------------

"Имя ПК имя патча и дата"  - дата установки патча не хранится

select c.strwinhostname as host, b.wstrdisplayname as name, a.tmInstallDate as date
from hst_inventory_hstprds a, hst_inventory_patches b, Hosts c
where a.nproduct=b.nid
and b.wstrdisplayname like '%KB963707%'
and c.nid=a.nhostid;

KB2570791
Обновление безопасности для Windows XP (KB2124261)
---------------------------------------------------------------------------------
найти nProduct
select * from hst_inventory_patches a where a.wstrDisplayName like '%2570791%';


-------------------------

select c.strwinhostname as host
from Hosts c
where c.strwinhostname like 'N3088'
and c.nid=a.nhostid;





-------------------------

Microsoft Office Visio 


Microsoft Office



---------------------------------
Hosts
 nId
 strWinHostName
 strDisplayName
 strDnsName
 nIpAddress


host_ext_attr
 nId
 wstrComment

----------------------------------
Запрос компьютер имя коммент адрес-агента

select a.strDisplayName as DisplayName, a.strWinHostName as WinHostName, b.wstrComment as Comment, 
a.strDnsName as DnsName, a.strAddress as AgentIP
from Hosts a, host_ext_attr b
where a.nId=b.nId;

Смотрим где стоит MSO

select c.strwinhostname as host, b.wstrdisplayname as name, a.tmInstallDate as idate
from hst_inventory_hstprds a, hst_inventory_products b, Hosts c
where a.nproduct=b.nid
and b.wstrdisplayname like '%Microsoft Office%'
and b.wstrdisplayname not like '%iewer%'
and c.nid=a.nhostid;
----------------------------------------------------------------------------------------------------
select c.strwinhostname as host, b.wstrdisplayname as name
from hst_inventory_hstprds a, hst_inventory_products b, Hosts c
where a.nproduct=b.nid
and b.wstrdisplayname like '%${n}%'
and c.nid=a.nhostid;

select c.strwinhostname as host, b.wstrdisplayname as name
from hst_inventory_hstprds a, hst_inventory_products b, Hosts c
where a.nproduct=b.nid
and b.wstrdisplayname like '%Adobe Photoshop%'
and c.nid=a.nhostid;


Kaspersky Administration Kit 8.0 & mySQL


Посмотреть параметры mysqld
 net use mysql;
 show variables like '%size%';
mysql> show variables like '%size%';
+---------------------------------+------------+
| Variable_name                   | Value      |
+---------------------------------+------------+
| bdb_cache_size                  | 8384512    |
| bdb_log_buffer_size             | 262144     |
| binlog_cache_size               | 32768      |
 .  .  .
| transaction_alloc_block_size    | 8192       |
| transaction_prealloc_size       | 4096       |
+---------------------------------+------------+
34 rows in set (0.00 sec)


Информация из статьи применима к программе Kaspersky Administration Kit 8.0 

Если в качестве сервера базы данных для Kaspersky Administration Kit используется MySQL-сервер, то необходимо включить поддержку хранилищ InnoDB и MEMORY.
Настройки запуска MySQL храняться в конфигурационном файле my.ini (путь по умолчанию %Program Files%\MySQL\MySQL Server 5.0\my.ini). Данный файл следует создать на основе шаблона из файла: %Program Files%\MySQL\MySQL Server 5.0\my-innodb-heavy-4G.ini, а затем внести изменения описанные ниже.
Пути для Linux-систем:
    • /usr/share/mysql/my-innodb-heavy-4G.cnf
    • /etc/my.cnf
ВниманиеСоздавать файл my.ini необходимо перед установкой Kaspersky Administration Kit.  После создания файла необходимо перезапустить службу MySQL.
Рекомендуемые настройки параметров файла my.ini:
    • binlog_cache_size = 10M
    • sort_buffer_size = 10M
    • join_buffer_size = 20M
    • thread_concurrency = 20
    • tmp_table_size = 100M
    • max_heap_table_size = 100M
    • key_buffer_size = 200M
    • innodb_buffer_pool_size - Фактическое значение параметра должно быть не менее 80% от ожидаемого размера базы данных KAV
    • innodb_thread_concurrency = 0
    • innodb_flush_log_at_trx_commit = 0 (В большинстве случаев сервер использует мелкие транзакции)
    • innodb_log_buffer_size = 50M (Этот параметр должен быть указан до того, как создастся база данных KAV)
    • innodb_log_file_size = 500M (Этот параметр должен быть указан до того, как создастся база данных KAV)
    • innodb_lock_wait_timeout = 300
Общий объем оперативной памяти, используемый MySQL-сервером, может быть рассчитан по формуле:
innodb_buffer_pool_size + key_buffer_size + max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) + max_connections*2MB
Одновременно Kaspersky Administration Kit может устанавливать до 22-х соединений с MySQL-сервером, то есть значение параметра max_connections может достигать 22, но, обычно, одновременно создаётся не более 13-ти соединений.