Управление Xen/KVM с помощью ConVirt
Сергей Яремчук
$ sudo apt-cache show convirt | grep –i version
$ sudo apt-get install python yelp python-rpm python-vte python-paramiko python-gtk2 python-xen-3.3 python-glade2 xen-utils ssh vncviewer socat uml-utilities dnsmasq mysql-server build-essential libdbd-mysql-perl libdbi-perl libhtml-template-perl ssh libxen3 vncviewer bridge-utils
$ sudo apt-get install python-setuptools
$ mysql -u root -p
mysql> use mysql;
mysql> update user set password=PASSWORD("convirt") where User="root";
mysql> flush privileges;
mysql> quit
sqlalchemy.url=mysql://root:convirt@localhost:3306/convirt?charset=utf8
$ mkdir ~/.ssh/
$ wget --no-cache http://www.convirture.com/downloads/convirt/2.0/convirt-install-2.0.tar.gz
$ tar -xzf convirt-install-2.0.tar.gz
$ sudo ./convirt-install/install/cms/scripts/install_dependencies
$ sudo ./convirt-install/install/cms/scripts/install_convirt
$ wget -c http://www.convirture.com/downloads/convirture-tools/2.0/convirture-tools-2.0.tar.gz
$ tar xzvf convirture-tools-2.0.tar.gz
$ cd convirture-tools-2.0/install/managed_server/scripts
$ sudo ./convirt-tool --detect_only setup
$ ./convirt-tool setup
$ cd ~/convirt
$ sudo ./convirt-ctl start
-----------------------------------------------------------------------------------------------------------------
Эти загадочные роли FSMO
Никита Панов
@echo off
REM
REM Script to dump FSMO role owners on the server
designated by %1
REM
if ""=="%1" goto usage
Ntdsutil roles Connections "Connect to server %1" Quit
"select Operation Target" "List roles for connected server"
Quit Quit Quit
goto done
:usage
@echo Please provide the name of a domain controller
(i.e. dumpfsmos MYDC)
@echo.
:done
-----------------------------------------------------------------------------------------------------------------
LemonLDAP::NG. Единая аутентификация для веб-приложений
Сергей Яремчук
$ sudo apt-cache show lemonldap-ng | grep –i version
$ sudo apt-get build-dep lemonldap-ng
$ sudo apt-get install libconfig-inifiles-perl libnet-twitter-perl libnet-openid-consumer-perl libcrypt-openssl-x509-perl
$ sudo apt-get install libapache2-mod-perl2 libapache2-reload-perl libbsd-resource-perl
$ wget -c http://download.forge.objectweb.org/lemonldap/lemonldap-ng-1.0rc2.tar.gz
$ wget –c http://forge.objectweb.org/svnsnapshots/lemonldap-svn-latest.tar.gz
$ tar xzf lemonldap-ng-1.0rc2.tar.gz
$ cd lemonldap-ng-1.0rc2
$ make
$ sudo make configure
$ make test
$ sudo make install
$ sudo nano /etc/apache2/apache2.conf
…
include /usr/local/lemonldap-ng/etc/portal-apache2.conf
include /usr/local/lemonldap-ng/etc/handler-apache2.conf
include /usr/local/lemonldap-ng/etc/manager-apache2.conf
$ sudo a2enmod perl
$ sudo service apache2 restart
$ sudo ln-s /usr/local/lemonldap-ng/etc/lemonldap-ng.ini /etc/lemonldap-ng/
$ sed -i 's/example.com/ваш_домен/g' /etc/lemonldap-ng/apache2.conf /etc/lemonldap-ng/apps-list.xml /var/lib/lemonldap-ng/conf/lmConf-1 /etc/lemonldap-ng/apply.conf /var/lib/lemonldap-ng/test/index.p
$ grep -iR example.com /usr/local/lemonldap-ng/*
$ cd /usr/local/lemonldap-ng/
$ sed -i 's/example.com/ваш_домен/g' ./data/conf/lmConf-1 ./examples/portal/AuthLA/ressources/lemonsp-metadata.xml ./examples/portal/index_simple.pl ./handler/MyHandler.pm ./htdocs/manager/skins/default/manager.js
$ cat /usr/local/lemonldap-ng/etc/for_etc_hosts
$ sudo mv –v /usr/local/lemonldap-ng/etc/cron.d/lemonldap-ng /etc/cron.d/
ServerName application.com
PerlRequire MyFile
PerlHeaderParserHandler My::Package
ProxyPass / http://server.com/
ProxyPassReverse / http://server.com/
-----------------------------------------------------------------------------------------------------------------
FP_Netmapper. Создаем схемы локальной сети
Юрий Винник
TNetObj = record
dx, dy, id, Dev_ID: Integer;
addr: String;
fpid: Longint;
end;
TNetLink = record
xc, y1c, y2c, id1, id2: Integer;
fl_net: Byte;
end;
mysql -u root -p < ./fp_netmapper.sql
GRANT SELECT,INSERT,DELETE,UPDATE ON freepinger.* TO 'freepinger'@'%' IDENTIFIED BY 'freepinger';
-----------------------------------------------------------------------------------------------------------------
Систем ПОТ много – выберите свою. Screen как средство персональной организации
Игорь Штомпель
sudo apt-get install alpine abook calcurse elinks finch newsbeuter note
01 hardstatus alwayslastline "%{yb} %c %H %=[ %w ] "
02
03 screen -t alpine
04 exec /usr/bin/alpine
05
06 screen -t abook
07 exec /usr/bin/abook
08
09 screen -t calcurse
10 exec /usr/bin/calcurse
11
12 screen -t note
13 exec /usr/bin/note
14
15 screen -t newsbeuter
16 exec /usr/bin/newsbeuter
17
18 screen -t nano
19 exec /usr/bin/nano
20
21 screen -t elinks
22 exec /usr/bin/elinks
23
24 screen -t finch
25 exec /usr/bin/finch
26
27 screen -t wget
28
29 select 0
exec /usr/bin/alpine
Ivanov Ivan — Project A
/FirstA/
/FirstA/FirstB
/FirstA/
note1
cd FirstA
cd FirstB
$ newsbeuter -i feeds.xml
$ newsbeuter
browser elinks
http://lkml.org/rss.php kernel linux
www.samag.ru
resize -h -l 25
-----------------------------------------------------------------------------------------------------------------
Access Based Enumeration. Установка и управление
Иван Коробко
Листинг 1. Объявление API-функции в VB.NET
Public Class ABE
' Описание функции
Declare Unicode Function NetShareSetInfo Lib "netapi32.dll" (ByVal ServerName As String, ByVal NetName As String, ByVal Level As Integer, ByVal Buf As IntPtr, ByRef Parm_Err As Integer) As Integer
…
End Class
Листинг 2. Объявление структуры в VB.NET
Public Structure _SHARE_INFO_1005
Public val As Integer
End Structure
Листинг 3. Функция для определения размера объекта
Public Function VarPtr(ByVal e As Object) As Integer
Dim GC As GCHandle = GCHandle.Alloc(e, GCHandleType.Pinned)
Dim GC2 As Integer = GC.AddrOfPinnedObject.ToInt32
GC.Free()
Return GC2
End Function
Листинг 4. Функция для определения размера объекта
Public Class Form1
' Описание API-функции
Declare Unicode Function NetShareSetInfo Lib "netapi32.dll" (ByVal servername As String, ByVal netname As String, ByVal level As Integer, ByVal buf As IntPtr, ByRef parm_err As Integer) As Integer
' Описание структуры
Public Structure _SHARE_INFO_1005
Public val As Integer
End Structure
' Описание глобальных переменных
Public obj As _SHARE_INFO_1005
' Определение размера данных в структуре
Public Function VarPtr(ByVal e As Object) As Integer
Dim GC As GCHandle = GCHandle.Alloc(e, GCHandleType.Pinned)
Dim GC2 As Integer = GC.AddrOfPinnedObject.ToInt32
GC.Free()
Return GC2
End Function
' Управление ABE
Private Function ABE(ByVal Server As String, ByVal Share As String, ByVal Status As Boolean) As Integer
Select Case Status
Case True
obj.val = &H800 ' Включение ABE
Case False
obj.val = &H0' Выключение ABE
End Select
Dim Err_Code As Integer = NetShareSetInfo(ServerNamePrivate, ShareName, 1005, VarPtr(obj), err)
Return Err_Code
End Function
End Class
Листинг 5. Создание удаленного сеанса на PowerShell от имени заданного пользователя
# Настройка службы WinRM на рабочей станции
winrm quickconfig
# Назначение имени сервера
$server = Esmiralda
# Создание удаленного сеанса
Invoke-Command -ComputerName $server -Credential "" -ScriptBlock {***}
# *** — сценарий, который необходимо выполнить на удаленном компьютере
Листинг 6. Вызов VB.NET вставки из PowerShell
$provider = New-Object Microsoft.VisualBasic.VBCodeProvider
$params = New-Object System.CodeDom.Compiler.CompilerParameters
$params.GenerateInMemory = $True
$refs = "System.dll","Microsoft.VisualBasic.dll"
$params.ReferencedAssemblies.AddRange($refs)
$txtCode = @"
Imports Microsoft.VisualBasic.Interaction
Class ClassName
Sub mBox(a)
MsgBox (a)
End Sub
End Class
"@
$results = $provider.CompileAssemblyFromSource($params, ↵
$txtCode)
$mAssembly = $results.CompiledAssembly
$i = $mAssembly.CreateInstance("ClassName")
$r = $i.mBox("Текстовое сообщение")
Листинг 7. Сценарий, который включает или выключает ABE
# Настройка WinRM на локальной рабочей станции
winrm quickconfig
# Определение значений имени сервера, сетевой папки, статуса ABE
$server = "*****"
$share="*****"
$flag= 0 #True - Вкл ABE/False - Выкл ABE
# Создание удаленного сеанса
Invoke-Command -ComputerName $server -Credential "" -ScriptBlock {
# Определение настроек компилятора
$provider = New-Object Microsoft.VisualBasic. VBCodeProvider
$params = New-Object System.CodeDom.Compiler. CompilerParameters
$params.GenerateInMemory = $True
# Список подгружаемых DLL-библиотек
$refs = "System.dll","Microsoft.VisualBasic.dll", "mscorlib.dll"
$params.ReferencedAssemblies.AddRange($refs)
# Интерпретируемый программный код на VB.NET
$txtCode = @"
# Импорт пространств имен
imports system
imports System.Runtime.InteropServices
imports microsoft.visualbasic.interaction
# Описание класса
Class Share
# Объявление API-функции
Declare Unicode Function NetShareSetInfo Lib "netapi32.dll" (ByVal servername As String, ByVal netname As String, ByVal level As Integer, ByVal buf As IntPtr, ByRef parm_err As Integer) As Integer
# Объявление структуры
Public Structure _SHARE_INFO_1005
Public val As Integer
End Structure
# Объявление глобальных переменных
Public level As Integer = 1005
Public err As Integer
Public obj As _SHARE_INFO_1005
# Пользовательская функция, управляющая ABE
Function ABE(ByVal ServerNamePrivate As String, ByVal ShareName As String, ByVal Status As Boolean) As Integer
dim obj As _SHARE_INFO_1005
Select Case Status
case True
obj.val = &H800 ' Включение ABE
case False
obj.val = &H0' Выключение ABE
End Select
Dim c As Integer = NetShareSetInfo(ServerNamePrivate, ShareName, 1005, VarPtr(obj), err)
Return c
End Function
# Пользовательская функция для определения размера
# структуры
Function VarPtr(ByVal e As Object) As Integer
Dim GC As GCHandle = GCHandle.Alloc(e, GCHandleType.Pinned)
Dim GC2 As Integer = GC.AddrOfPinnedObject.ToInt32
GC.Free()
Return GC2
End Function
End Class
"@
$txtcode
# Компиляция и выполнение программного кода
$results = $provider.CompileAssemblyFromSource($params, $txtCode)
$mAssembly = $results.CompiledAssembly
# Получение доступа к классу VB.NET
$i = $mAssembly.CreateInstance("Share")
# Вызов функции ABE в VB.NET, передача ей параметров
$r = $i.ABE($server,$share,$flag)
# Чтение и обработка возвращенного
If (r –eq 0)
{Write-Host "Работа завершена успешно."}
Else
{Write-Host "Некорректно заданы параметры."}
}
-----------------------------------------------------------------------------------------------------------------
Атаки из сети Интернет и методы борьбы с ними
Юрий Денисов
no ip http server
no ip http secure-server
access-list 99 permit 10.0.0.0 0.0.0.255
line vty 0 4
access-class 99 in
login local
logging alarm informational
logging origin-id hostname
logging facility local1
logging source-interface GigabitEthernet0/2.1
logging 10.0.0.2
ip cef
ip route-cache flow
ip flow ingress
ip flow egress
ip flow-export source INTERFACE
ip flow-export version 5
ip flow-export destination X.X.X.X
Core_7206VXR#show ip cache flow
ip verify unicast reverse-path
ip access-list extended ACL_IN
deny ip X.X.X.X 0.0.0.255 any log
permit ip any X.X.X.X 0.0.0.255
interface INTERFACE
ip access-group ACL_IN in
access-list 2000 permit icmp any any
rate-limit output access-group 2000 64000 8000 8000 confirm-action transmit exceed-action drop
access-list 100 permit tcp any X.X.X.X 0.0.0.255
ip tcp intercept list 100
-----------------------------------------------------------------------------------------------------------------
Генерация отчетов по текстовым шаблонам
Алексей Вторников
// Генератор отчетов по шаблону из текста
// fplab@inbox.ru
import java.util.*;
public class ReportByTemplate {
private ArrayList lines = new ArrayList (); // Шаблон
private TreeMap parms = new TreeMap (); // Параметры
private String buffer = ""; // Буфер шаблона
private int pos = 0, // Позиция в строке
len = 0, // Длина строки
ch = 0; // Текущий символ
private int parCnt = 0, // Количество параметров
counter = 0; // Счетчик ПС
// Загрузить шаблон
public void loadTemplate (String str) {
StringBuffer sb = new StringBuffer ();
lines.clear ();
buffer = str;
pos = 0;
len = buffer.length ();
nextCh ();
while (ch != -1) {
switch (ch) {
// Сформированную строку -> в список
case '\n': lines.add (sb.toString ());
sb = new StringBuffer ();
break;
// Формировать дальше
default : sb.append ((char)ch);
break;
}
nextCh ();
}
}
// Загрузить коллекцию параметров
public void loadParameters (TreeMap p) {
parCnt = p.size ();
if (parCnt == 0) return;
parms.clear ();
for (int i = 0; i < parCnt; i++) {
parms.put (i, p.get (i));
}
}
// Сформировать отчет
public void createReport () {
int numOfLines = lines.size ();
// Инициализировать счетчик ПС
counter = 0;
// Шаблон пуст -> печатать нечего
if (numOfLines == 0) return;
// Перебор строк шаблона
for (int i = 0; i < numOfLines; i++) {
buffer = lines.get (i);
if (buffer.indexOf ('#') < 0) {
// Если в строке отсутствуют символы '#' -> напечатать эту строку
out (buffer);
} else {
// Если в строке имеются символы '#' -> обработатьэту строку
out (scanLine (buffer));
}
}
}
// Вернуть строку, заполненную символами '.'
private String fillByUndefined (int n) {
StringBuffer b = new StringBuffer ();
for (int i = 0; i < n; i++) {
b.append (".");
}
return b.toString ();
}
// Вернуть строку, заполненную символами ' '
private String fillBySpaces (int n) {
StringBuffer b = new StringBuffer ();
for (int i = 0; i < n; i++) {
b.append (" ");
}
return b.toString ();
}
// Сканирование строки шаблона и формирование строки отчета
private String scanLine (String str) {
int posStart = 0, // Начало ПС
posEnd = 0; // Конец ПС
String value = ""; // Подставляемое значение
StringBuffer sb = new StringBuffer (); // Буфер формирования строки
// Инициализировать
pos = 0;
len = str.length ();
ch = 0;
// Посимвольное сканирование строки шаблона
nextCh ();
while (ch != -1) {
posStart = posEnd = 0;
switch (ch) {
case '#': posStart = pos - 1;
while (ch == '#') {
sb.append ((char)ch);
nextCh ();
}
// Прочитан символ (за '#') -> вернуть его
// во входной поток
pos--;
posEnd = pos;
// Количество ПС превышает
// Количество параметров для подстановки
if (counter > parCnt - 1) {
value = fillByUndefined (posEnd - posStart);
sb = sb.replace (posStart, posEnd, value);
break;
}
// Заменить ПС значением
value = parms.get (counter);
if (value.length () > posEnd - posStart) {
value = value.substring (0, posEnd - posStart);
}
if (value.length () < posEnd - posStart) {
value = value +
fillBySpaces (posEnd - posStart - value.length ());
}
sb = sb.replace (posStart, posEnd, value);
counter++;
break;
default : sb.append ((char)ch);
break;
}
nextCh ();
}
return sb.toString ();
}
// Получить в переменную ch очередной символ из строки
private void nextCh () {if (pos < len) ch = buffer.charAt (pos++); else ch = -1;}
// Печать строки отчета
private void out (String line) {System.out.println (line);}
}
value = parms.get (counter),
import java.util.*;
public class Card {
private String template =
"******************************************************************************\n" +
"* Подразделение: ################################################ *\n" +
"* Должность: ########################################################## *\n" +
"* *\n" +
"* Фамилия: ####################################### *\n" +
"* Имя: ######################## *\n" +
"* Отчество: ################################ *\n" +
"* Дата рождения: ########## г. *\n" +
"* Место рождения: ########################################################## *\n" +
"* *\n" +
"* Стаж работы: с ########## г. Оклад: ######## руб. Бонус: ### % *\n" +
"* Телефон: #################### *\n" +
"* *\n" +
"* Дата составления анкеты: ########## г. *\n" +
"******************************************************************************\n";
public Card () {
ReportByTemplate rep = new ReportByTemplate ();
TreeMap par = new TreeMap ();
// Заполнить контейнер данными
par.put (0, "Союз Меча и Орала");
par.put (1, "Особа, приближенная к императору");
par.put (2, "Воробьянинов");
par.put (3, "Ипполит");
par.put (4, "Матвеевич");
par.put (5, "01.10.1875");
par.put (6, "г.Старгород");
par.put (7, "13.04.1926");
par.put (8, "14000.00");
par.put (9, "150");
par.put (10, "нет данных");
par.put (11, "30.09.2010");
rep.loadTemplate (template); // Загрузить шаблон
rep.loadParameters (par); // Загрузить данные
rep.createReport (); // Сгенерировать отчет
}
public static void main (String [] args) {new Card ();}
}
Connection conn = null;
...
// Выборка данных
public void setData () {
int key = 0;
SimpleDateFormat f = new SimpleDateFormat ("dd.MM.yyyy", Locale.US);
try {
Statement st = conn.createStatement ();
ResultSet rs = st.executeQuery («SELECT ... FROM table WHERE ...");
while (rs.next ()) {
key = 0;
par.put (key++, rs.getString (1).toString ());
par.put (key++, rs.getString (2).toString ());
par.put (key++, rs.getString (3).toString ());
par.put (key++, rs.getString (4).toString ());
par.put (key++, rs.getString (5).toString ());
par.put (key++, f.format (rs.getDate (6)).toString ());
par.put (key++, rs.getString (7).toString ());
par.put (key++, f.format (rs.getDate (8)).toString ());
par.put (key++, String.format ("%8.2f", rs.getDouble (9)));
par.put (key++, rs.getString (10).toString ());
par.put (key++, rs.getString (11));
par.put (key++, f.format (rs.getDate (12)).toString ());
rep.loadParameters (par);
rep.createReport ();
}
// Закрыть результирующее множество
if (rs != null) {
try {rs.close ();} catch (SQLException sqle) {}
finally {rs = null;}
}
st.close ();
}
catch (SQLException sqle) {}
}
-----------------------------------------------------------------------------------------------------------------
Painkiller для администратора. Аудит файловой системы своим руками
Андрей Понарев
int main(int argc, char *argv[])
C:\some.exe a b
Argv[0] = "C:\some.exe"
Argv[1] = "a"
Argv[2] = "b"
BOOL ReadDirectoryChangesW(HANDLE hDirectory, LPVOID lpBuffer, DWORD nBufferLength, BOOL bWatchSubtree, DWORD dwNotifyFilter, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
HANDLE hDir = CreateFile(argv[1], FILE_LIST_DIRECTORY, FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
#define dwBuffSize 0xf000
BYTE *lpBuffer;
DWORD dwReturnedBytes = 0;
lpBuffer = (BYTE *)malloc(dwBuffSize);
ReadDirectoryChangesW(hDir, lpBuffer, dwBuffSize, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_CREATION, &dwReturnedBytes, NULL, NULL);
struct _FILE_NOTIFY_INFORMATION {
DWORD NextEntryOffset;
DWORD Action;
DWORD FileNameLength;
WCHAR FileName[1];
}
DWORD dwSeek = 0;
while(dwSeek < dwBuffSize)
{
PFILE_NOTIFY_INFORMATION pNotify = PFILE_NOTIFY_INFORMATION(smgNotify->lpBuffer + dwSeek);
dwSeek += pNotify->NextEntryOffset;
char * sName = new char[pNotify->FileNameLength/2+1];
pNotify->FileName[pNotify->FileNameLength/2] = 0;
wtoc((WORD *)pNotify->FileName,sName);
FILE *f = fopen(smgNotify->sOut,"a");
switch (pNotify->Action)
{
case FILE_ACTION_ADDED:
fprintf(f,"'%s' was created\n",sName);
break;
case FILE_ACTION_REMOVED:
fprintf(f,"'%s' was deleted\n",sName);
break;
case FILE_ACTION_MODIFIED:
fprintf(f,"'%s' was modifed\n",sName);
break;
case FILE_ACTION_RENAMED_OLD_NAME:
fprintf(f,"'%s' renamed to ",sName);
break;
case FILE_ACTION_RENAMED_NEW_NAME:
fprintf(f,"'%s'\n",sName);
break;
}
delete [] sName;
fclose(f);
if(pNotify->NextEntryOffset == 0)
break;
}
void wtoc(WORD * w, char * c)//widechar to char
{
int i = 0;
while (*(w+i)!=0)
{
*(c+i)=*(w+i);
i++;
}
*(c+i)=0;
}
OVERLAPPED o = { };
o.hEvent = CreateEvent(0, FALSE, FALSE, 0);
DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
{
DWORD dwWaitStatus = WaitForSingleObject(o.hEvent, 1000);
… //любой код, какой хотим выполнять
}while(dwWaitStatus != WAIT_OBJECT_0)
…//обрабатываем lpBuffer
DWORD SomeFunction(LPVOID p)
{
}
HANDLE CreateThread(SEC_ATTRS SecurityAttributes, ULONG StackSize, SEC_THREAD_START StartFunction, PVOID ThreadParameter, ULONG CreationFlags, PULONG ThreadId);
BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);
struct SOMETHING
{
HANDLE hDir;
char *sOut;
BYTE *lpBuffer;
};
SOMETHING smgNotify;
DWORD dwThreadID;
HANDLE hThread CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&SomeFunction, (LPVOID)&smgNotify,0,&dwThreadID);
TerminateThread(hThread,0);
HANDLE hDir = CreateFile(…);
If(hDir == 0)
{
return 0;
}
BYTE *lpBuffer = …
If(lpBuffer == NULL)
{
CloseHandle(hDir);
return 0;
}
HANDLE hThread = CreateThread(…);
If(hThread == 0)
{
CloseHandle(hDir);
Free(lpBuffer);
Return 0;
}
class Buffer
{
private:
BYTE *lpBuffer;
public:
Buffer()
{
this->lpBuffer = NULL;
}
SetSize(DWORD size)
{
this->lpBuffer = new BYTE[size];
}
~Buffer()
{
delete[] this->lpBuffer;
}
operator BYTE*() const
{
return this->lpBuffer;
}
};
class HandleToFolder
{
private:
HANDLE hDir;
public:
HandleToFolder()
{
this->hDir=0;
}
~HandleToFolder()
{
CloseHandle(this->hDir);
}
HandleToFolder& operator=(HANDLE orig)
{
CloseHandle(this->hDir);
this->hDir = orig;
return *this;
}
operator HANDLE() const
{
return this->hDir;
}
};
Struct SOMETHING
{
HandleToFolder hDir;
char *sOut;
Buffer lpBuffer;
};
private:
SOMETHING smgNotify;
HANDLE hThread;
Notifer(char * in, char * out)
{
this->smgNotify.hDir = CreateFile(in, …);
if (this->smgNotify.hDir == 0)
throw 1;
this->smgNotify.sOut = out;
this->smgNotify.lpBuffer.SetSize(dwBuffSize);
if (this->smgNotify.lpBuffer == NULL)
throw 2;
DWORD dwThreadID;
this->hThread = CreateThread(…);
if (this->hThread == 0)
throw 3;
}
~Notifer()
{
TerminateThread(this->hThread,0);
CloseHandle(this->hThread);
}
try
{
Notifer a(argv[1],argv[2]);
}
catch(int error)
{
switch (error)
{
case 1:
MessageBox(0,"CreateFile","Error",MB_ICONERROR | MB_OK);
return 0;
case 2:
MessageBox(0,"Malloc","Error",MB_ICONERROR | MB_OK);
return 0;
case 3:
MessageBox(0,"CreateThread","Error",MB_ICONERROR | MB_OK);
return 0;
}
}
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif
-----------------------------------------------------------------------------------------------------------------
Шпаргалка для MySQL DBA. EXPLAIN – это просто
Андрей Товстик
select id from table;
mysql> SELECT count(*) FROM salaries WHERE salary > 150000;
mysql> SELECT count(*) FROM salaries WHERE salary > 150000 AND salary < 160000;
mysql> EXPLAIN SELECT count(*) FROM salaries WHERE salary > 150000 AND salary < 160000;
FOR EACH row r IN R DO
FOR EACH row s IN S DO
FOR EACH row t IN T DO
IF r AND s AND t SATISFY some join condition THEN OUTPUT row
SELECT * FROM salaries WHERE emp_no=10001 AND from_date='1986-06-26';
SELECT s.emp_no,e.first_name,e.last_name,s.salary,s.from_date,s.to_date FROM salaries as s LEFT JOIN employees as e ON s.emp_no=e.emp_no WHERE s.salary>155000;
mysql> SELECT count(*) FROM salaries WHERE salary > 150000 AND salary < 160000;
mysql> EXPLAIN SELECT count(*) FROM salaries WHERE salary > 150000 AND salary < 160000;
SELECT emp_no,from_date FROM salaries;
SELECT `db_1`.`sources`.id, `db_1`.`sources`.parent_id, db_2.`sources`.active FROM `db_1`.`sources` LEFT JOIN db_2.`sources` ON `db_1`.`sources`.name = db_2.`sources`.name WHERE db_1.`sources`.lng_id IN (1,9);
mysql> SELECT e.first_name,e.last_name,s.salary FROM employees e LEFT JOIN salaries s ON e.emp_no=s.emp_no ORDER by e.first_name;
mysql> EXPLAIN SELECT e.first_name,e.last_name,s.salary FROM employees e LEFT JOIN salaries s ON e.emp_no=s.emp_no ORDER by s.salary;
-----------------------------------------------------------------------------------------------------------------
Дискреционное разграничение прав в Linux. Часть 1. Основные теоретические сведения
Павел Закляков
# service httpd start
# ps aux|grep ^root|grep http
# lsof -n -i|grep "USER\|2209"
-----------------------------------------------------------------------------------------------------------------