Какой рейтинг вас больше интересует?
|
Главная / Главные темы / Тэг «seecrypt»
Распаковка архивов .t3x для TYPO3 CMS 2010-01-12 01:43:03
Несколько лет назад я работал с TYPO3 CMS, сама система меня не впечатлила ни по скорости работы, ни ...
+ развернуть текст сохранённая копия
Несколько лет назад я работал с TYPO3 CMS, сама система меня не впечатлила ни по скорости работы, ни по коду. От комментариев насчет качества кода воздержусь, это не тема данного поста :)
Все расширения для данной CMS идут в архиве собственного формата .t3x - самописное подобие TAR-а + gzip сжатие. Руками распаковывать очень неудобно, поэтому родился следующий скрипт:
static $instance = null; protected static $instanceCalled = false; private $errors = array(); protected function addError() { $this->errors[] = func_get_args(); } protected function clearErrors() { $this->errors = array(); } public function getErrors($clear = true) { $out = $this->errors; if($clear) { $this->clearErrors(); } return $out; } public static function instance($classname = __CLASS__) { if(is_null(self::$instance)) { self::$instanceCalled = true; self::$instance = new $classname(); } return self::$instance; } public function hook($handler="exception", $errorTypes = null) { if(is_null($errorTypes)) { $errorTypes = E_ALL | E_STRICT; } $method = $handler.self::HANDLER_METHOD_SUFFIX; $class = get_class($this); if(!method_exists($this, $method)) { throw new Exception("Method $class::$method doesn't exist"); } set_error_handler(array($this, $method), $errorTypes); } public function unhook() { restore_error_handler(); }
public function exceptionHandler($errno, $errstr, $errfile, $errline) { $this->addError(func_get_args()); throw new Exception($errstr, $errno); } public function verboseHandler($errno, $errstr, $errfile, $errline) { $this->addError(func_get_args()); } }
class Dir { public static function create($path, $mode = 0777, $recursive = true) { $path = self::normalize($path); if(file_exists($path) && is_dir($path)) { return; } mkdir($path, 0777, true); } public static function normalize($path) { $path = trim($path); $path = rtrim($path, "."); $path = str_replace(array("/","\\"), DIRECTORY_SEPARATOR, $path); $path = rtrim($path, DIRECTORY_SEPARATOR); return $path; }
}
class Dumper { private $fileMode = "w"; public function setAppendMode($arg = true) { $this->fileMode = (bool) $arg ? "a" : "w"; }
public function varDump($data, $file) { ob_start(); var_dump($data); $out = ob_get_contents(); ob_end_clean(); $this->writeToFile($out, $file); } public function writeToFile($data, $f) { $f = fopen($f, $this->fileMode); if(!$f) { throw new Exception("Cannot write to $f"); } fwrite($f, $data); fclose($f); } }
class TypoExtension { const HEADER_SIZE = 44; private $isValid = false; private $fileObj = null; private $data = array();
public function __construct() { }
public function unpack($targetDir) { if(!isset($this->data['FILES'])) { return; } $targetDir = Dir::normalize($targetDir); foreach($this->data['FILES'] as $row) { $dir = $targetDir.DIRECTORY_SEPARATOR.dirname($row['name']); Dir::create($dir); $file = Dir::normalize($targetDir.DIRECTORY_SEPARATOR.$row['name']); file_put_contents($file, $row['content']); } } public function read($file) { if(!file_exists($file)) { throw new Exception("No such file: '{$file}'"); } if(!is_readable($file)) { throw new Exception("File is not readable: '{$file}'"); } $f = @fopen($file, "r"); if(false === $f) { throw new Exception("Cannot open file: '{$file}'"); } $size = $fileSize = filesize($file); if($fileSize < self::HEADER_SIZE) { throw new Exception("Size of file should be > ".self::HEADER_SIZE.": '{$file}'"); } $size -= self::HEADER_SIZE; $head = fread($f, self::HEADER_SIZE); /** * Parse params */ $params = explode(":", $head, 3); $gzencode = array_pop($params); $gzencode = array_pop($params); $fictiveCrc = array_pop($params); if($gzencode !== 'gzcompress') { throw new Exception("Invalid header found in file: '{$file}'"); } $data = @fread($f, $size); if(false === $data) { throw new Exception("Cannot read data from file: '{$file}'"); } $data = @gzuncompress ($data); if(false === $data) { throw new Exception("Invalid data (not gzcompressed) in file: '{$file}'"); } $this->data = @unserialize($data); if(unserialize(false) === $this->data) { throw new Exception("Invalid data (gzcompressed, but not serialized) in file: '{$file}'"); } return $this; } }
class __app { private static $singleton = null; private $argc; private $argv; public function instance() { if(is_null(self::$singleton)) { self::$singleton = new self(); } return self::$singleton; } public function setArgs($argv, $argc) { $this->argc = (int) $argc; $this->argv = (array) $argv; } public function checkArgs() { if(3 !== $this->argc) { throw new Exception("Arguments should be: <file> <target>"); } } public function getArgs() { $this->checkArgs(); return array($this->argv[1], $this->argv[2]); }
public function run($argv, $argc) { try { $this->setArgs($argv, $argc); list($file, $dir) = $this->getArgs(); $c = new TypoExtension(); $c->read($file)->unpack($dir); } catch (Exception $e) { printf("Error: %s\n", $e->getMessage()); exit(1); } print "OK\n"; exit(0); } }
if(empty($argv)) { print "Not running from command line\n"; exit(0); } __app::instance()->run($argv, $argc);
?>
Тэги: php, script
Удаление временных файлов всех пользователей. 2009-10-08 13:17:00
Если на компьютере ...
+ развернуть текст сохранённая копия
Если на компьютере куча пользователей, и все ходят в интеренет и активно работают - а такое бывает, например, на терминальном сервере, то очищение профиля от временных файлов - довольно трудоемкая задача. Обычные программы типа CCleaner отлично справляются, но удаляют ненужные файлы только в профиле пользователя, под которым были запущены.
Недавно вот тут нашел скрип, который чистит все профили, имеющиеся в системе. Удаляет временные файлы как IE, так и обычные, находящиеся в системной директории temp. В начале очистки профиля выдает сообщение.
Для скачивания проходим обычную бесплатную регистрацию на сайте и наслаждаемся.
Тэги: script, temp, window
Windows scripting: ведение журнала работы 2008-10-16 09:07:00
Продолжим изучение скриптов для автоматизации системного администрирования windows. В прошлый раз ...
+ развернуть текст сохранённая копия
Продолжим изучение скриптов для автоматизации системного администрирования windows. В прошлый раз мы рассмотрели отправку электронной почты из vbscript. Сейчас же займемся ведением журнала работы скрипта.
Известно, что в unix-системах для журналирования используется протокол syslog (описан в rfc 3164). Однако, как обычно это делается в компании microsoft, в windows сделали похожее, но своё решение — службу «Event Log». Ну да и бог с ними, хорошо что вообще что-то сделали.
Рассмотрим, как отправить сообщение в журнал событий из vbscript. Для этого необходимо использовать метод LogEvent объекта WScript.Shell. Полный синтаксис можете посмотреть по приведенной ссылке сами, а мы рассмотрим пример вызова:
SET shell = CreateObject("WScript.Shell")
shell.LogEvent 4, "Hello world"
Все очень просто. Теперь давайте сохраним эти строчки в файле C:\scripts\event_log.vbs и запустим скрипт, например с помощью двойного клика по нему в проводнике. Далее, для посмотра сообщений используется неудобная программа «Event Viewer»:
Для запуска выполним «Start > Run...» и введем команду «eventvwr.msc»:
В левой части открывшегося окна выберем ветку «Event Viewer (Local) > Application»:
В правой части окна появится список событий. Созданное нами событие будет иметь тип «Information» и источник «WSH» и скорее всего будет первым в списке. Выполним на нём двойной клик и увидим диалоговое окно «Event Properties» с полной информацией о событии:
Теперь о грустном. В жертву простоты вызова из vbscript были принесены почти все возможности службы журналирования, даже те, жертвовать которыми не надо было. Самый главный недостаток — невозможно указать источник сообщения, у всех скриптов он всегда будет одинаковым и абстракным значением «WSH». Такое ощущение, что разработчики Windows Script Host даже представить себе не могли, что может потребоваться запускать более одного скрипта на компьютере.
Немного исправить ситуацию можно если в тело сообщения всегда помещать имя запущенного скрипта. Это не сильно поможет при поиске событий, но хотя бы можно будет знать какой именно скрипт создал событие. Изменим наш пример:
SET shell = CreateObject("WScript.Shell")
shell.LogEvent 4, WScript.ScriptFullName & " script start"
Вот событие полученное в результате отработки скрипта:
Замечание. Судя по содержимому документа «How To Use the Event Logging Utility (Logevent.exe) to Create and Log Custom Events in Event Viewer in Windows 2000» якобы, в наборе утилит «Windows 2000 Resource Kit» должна быть утилита logevent.exe позволяющая более гибко создавать записи в журнале событий из командной строки (аналог linux-утилиты logger). Но во-первых, никакого «Windows 2000 Resource Kit» на сайте http://www.microsoft.com/downloads/ обнаружить не удалось. Во-вторых, в присутствующем там «Windows Server 2003 Resource Kit» есть куча всякого говна, но этой утилиты уже нет. Можете конечно поискать (и даже найти) эти утилиты в интернете, но у меня что-то нет доверия полученным не из официальных источников программам.
Итак, если отсылка электронной почты из скриптов сделана на твердую четверку, то работа с журналом событий тянет только на два с плюсом. Незачет.
Update
Как мне подсказывают в комментариях для создания записей в журнале событий можно использовать утилиту eventcreate.exe, которая по умолчанию включена в состав операционной системы. Ниже приведен пример процедуры eventCreate, которую можно копировать в свои сценарии:
Set shell = CreateObject("WScript.Shell")
eventCreate "information", "Hello world"
' eventType - одно из success, error, warning или information
Sub eventCreate(eventType, message)
logName = "application"
source = WScript.ScriptName
eventID = 999
Set re = New RegExp
re.Pattern = """"
re.Global = true
message = re.Replace(message, "\""")
command = "eventcreate " & _
"/l " & logName & " " & _
"/so " & source & " " & _
"/id " & eventID & " " & _
"/t " & eventType & " " & _
"/d """ & message & """"
resultBad = shell.Run(command, 0, true)
if resultBad Then
error = source & " :" & VbCrLf & _
"error execute command" & VbCrLf & _
command & VbCrLf & _
"return code " & resultBad
shell.LogEvent 1, error
End If
End Sub
Тэги: script, window
Windows scripting: отправка электронной почты 2008-08-19 04:47:00
К сожалению, в реальной жизни системному администратору приходится работать не только с unix- ...
+ развернуть текст сохранённая копия
К сожалению, в реальной жизни системному администратору приходится работать не только с unix-подобными системами. Иногда нужно решать задачи системного администрирования на плохо приспособленных и слабодокументированных операционных системах семейства windows. О таких хорошо зарекомендовавших себя инструментах как bash, perl или даже простой grep говорить не приходится. Что же мы имеем в наличии? Фактически имеется технология Windows Script Host с возможностью писать скрипты на языках JScript и VBScript. Мда, ну и выбор... и чтобы усугубить глубину собственного падения далее будем использовать язык VBScript.
Задача. Довольно часто встречается ситуация, когда скрипт должен уведомить администратора по электронной почте о наступлении какого-либо события или ситуации. Для примера напишем скрипт, посылающий уведомление о загрузке windows сервера.
Теория. Составной частью оперционных систем windows 2000/xp/2003 является динамическая библиотека сdosys.dll. Эта библиотека выдрана из почтового сервера MS Exchange и её функциональность сильно урезана. Тем не менее, с ее помощью можно сформировать сообщение электронной почты и отправить его внешнему почтовому серверу (MTA). Называется это счастье «CDO for Windows 2000», по ссылке доступна подробная документация из MSDN.
Решение. Исходный код скрипта email_notify.vbs:
Set email = CreateObject("CDO.Message")
With email.Configuration.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") _
= "mail.localnet"
.Update
End With
email.From = "robot@mycompany.ru"
email.To = "admins@mycompany.ru"
Set wshNetwork = WScript.CreateObject("WScript.Network")
email.Subject = wshNetwork.ComputerName & " включен"
email.Textbody = ""
email.TextBodyPart.charset = "koi8-r"
email.Send
Надеюсь, вам не составит труда пробится через синтаксис VBScript. Сам скрипт короткий и достаточно прозрачный для понимания. В основном используются методы объекта CDO.Message, они документированы по приведенной выше ссылке. Конечно, по сравнению с linux реализацией той же функциональности:
echo "" | mailx -s "`hostname` is up" admins@mycompany.ru
мы получили монстроподобного уродца, но тут уж ничего не поделаешь, такова участь несчастных администраторов windows.
На этом собственно задача отправки электронных писем из windows скриптов решена. По двойному клику на файле email_notify.vbs скрипт выполнится. Однако, нам еще осталось рассмотреть тонкий момент запуска скрипта при загрузке операционной системы. Ярлык на такой скрипт нельзя помещать в меню «Startup» («Автозагрузка»). Ведь такие ярлыки обрабатываются не при загрузке операционной системы, а при начале сеанса конкретного пользователя. По той же причине не подходят и прочие места автозапуска, которые в большом количестве могут быть обнаружены на просторах реестра windows. Некорректно такой скрипт запускать и как системную службу. Вот правильное решение:
Выполняем команду «Start > Run...» и вводим магическую команду «gpedit.msc»:
В открывшемся окне с заголовком «Group Policy Object Editor» выбираем ветку «Local Computer Policy > Computer Configuration > Windows Settings > Scripts (Startup/Shutdown)»:
Дважды кликаем на элемент «Startup» в правой части окна и появляется диалоговое окно «Startup Properties»:
Нажимаем кнопку «Add...». Во вновь отрывшемся диалоговом окне «Add a Script» задаем полный путь к нашему скрипту email_notify.vbs. Официально рекомендованный путь для размещения загрузочных скриптов — «C:\WINDOWS\system32\GroupPolicy\Machine\Scripts\Startup».
Нажимаем кнопку «OK», чтобы закрыть диалоговое окно «Add a Script». В списке скриптов диалогового окна «Startup Properties» появляется новый скрипт автозапуска.
Нажимаем кнопку «OK», чтобы закрыть диалоговое окно «Startup Properties». Закрываем программу «Group Policy Object Editor». Все, можно проверять запуск скрипта при загрузке.
Выводы. Не смотря на то, что вам придется писать уродливые скрипты на бейсике, а также не помешают навыки скоростного кликанья мышкой, операционная система windows худо-бедно поддается автоматизации системного администрирования.
Тэги: script, window
Страницы: ... 21 22 23 24 25 26 27 28 29
Главная / Главные темы / Тэг «seecrypt»
|
Взлеты Топ 5
Падения Топ 5
|