Показаны сообщения с ярлыком системное администрирование. Показать все сообщения
Показаны сообщения с ярлыком системное администрирование. Показать все сообщения

среда, 8 июля 2020 г.

Build OpenVPN with XOR-patch (Scramble)

Task: It is necessary to compile the current version of OpenVPN for 32 bits with the XOR patch.

Solution: 
1. Download and install cygwin https://cygwin.com/install.html
During installation, you need to install the following packages -
autoconf, automake, diffutils, git, libtool, m4, make, mingw64-i686-binutils, mingw64-i686-gcc-core, mingw64-i686-headers, mingw64-i686-pthreads, mingw64-i686-runtime, mingw64-x86_64-binutils, mingw64-x86_64-gcc-core, mingw64-x86_64-headers, mingw64-x86_64-pthreads, mingw64-x86_64-runtime, patch, patchutils, perl, unzip, wget

2. After run cygwin -
cp `which true` /usr/bin/man2html                                           

3. Download OpenVPN Builds https://github.com/OpenVPN/openvpn-build
wget https://github.com/OpenVPN/openvpn-build/archive/master.zip
unpack
unzip master.zip
Go to the directory
cd openvpn-build-master/generic

4. Build (for the first time will get WITHOUT a patch)
IMAGEROOT=`pwd`/image-win32 CHOST=i686-w64-mingw32 CBUILD=i686-pc-cygwin ./build

5. After the build of the version is completed, without a patch, we go to the source directory - there will be downloaded archives with the OpenVPN source codes and the necessary libraries.

6. We need to unpack the source OpenVPN
tar xvfz openvpn-2.4.9.tar.gz
rm openvpn-2.4.9.tar.gz
cd openvpn-2.4.9

7. Download and apply xor patch - https://github.com/clayface/openvpn_xorpatch
wget https://raw.githubusercontent.com/clayface/openvpn_xorpatch/master/openvpn_xor.patch
git apply openvpn_xor.patch
tar -czvf openvpn-2.4.9.tar.gz openvpn-2.4.9

And go back to the generic folder
cd ..

8. Starting the project build again -
IMAGEROOT=`pwd`/image-win32 CHOST=i686-w64-mingw32 CBUILD=i686-pc-cygwin ./build

9. After finishing, you can goto the path  C:\cygwin\home\%YOURUSERNAME%\openvpn-build-master\generic\image-win32\openvpn\bin and test your own OpenVPN build

вторник, 16 апреля 2019 г.

Доступ к IP KVM Avocent DSR 1021

Вводная: Имеется IP KVM Avocent DSR 1021. С настроенным IP-адресом и модулями. Необходимо зайти на него со свежо установленной Windows 10

Решение:
1. Скачиваем последнюю версию JRE https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html и устанавливаем 

2. В браузере прописываем, что открывать в режиме совместимости. 

3. Редактируем файл java.security по адресу C:\Program Files\Java\jre1.8.****\lib\security\ 

4. Убираем MD5 в строке 
jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024 

5. Убираем DH keySize < 768 
jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 768 

6. Открываем "Панель управления"-"Программы"-"Java" 
Security tab -> Edit Site List -> Добавляем IP адрес KVM "http://X.X.X.X" (+https)

7. Пробуем подключиться

понедельник, 4 марта 2019 г.

Перехват пароля к FTP серверу с помощью роутера Mikrotik

Вводная: Есть программа с "захардкорженным" в коде паролем с доступом к FTP. Необходимо узнать пароль.

Решение: Так как в качестве роутера у нас Mikrotik RB951Ui-2HnD, то будем использовать его. Заходим в winbox. В меню выбираем Tools - Packet Sniffer. Если стоит галочка "Only Headers" снимаем её.

На вкладке Filter выставляем Port - 21.


Далее нажимаем "Start". Пробуем получить обновления через программу. Если пакеты пошли хорошо, есть нет, то вариант чуть сложнее - убираем порт и смотрим все пакеты от данного компьютера - вероятно (если мы уверены, что используется FTP) используется не стандартный порт.
Узнать порт также можно простым запросом у техподдержки вашей программы - объяснив, что "системный администратор не открывает доступ по всем портам, а только по списку".
Далее нажимаем "Packets" и смотрим все пакеты подряд (Нас интересует вкладка "Packet") - в каком-нибудь из них, будет строка "PASS" и далее пароль который нам нужен.


Как вариант можем сделать сохранение в файл - на вкладке General. И сделать поиск по подстроке "PASS"



вторник, 19 февраля 2019 г.

Сброс настроек и пароля в IP камере Dahua 1220SP

Вводная: Дана камера Dahua IPC-HFW1220SP. В веб-интерфейс не входит, telnet-ssh не доступны. IP по DHCP не получает (порт при этом поднимается, линк загорается). ИК-подсветка реагирует на смену света.

Решение: Решили для начала сбросить настройки, но вот тут то и ждала засада - официальная документация https://dahuawiki.com/images/1/1e/ResetIPCamera.pdf про эту модель молчит. Продавец говорит - отправляйте нам на замену. Но это долго.

Начали смотреть, в отличии от младшей модели 1020SP, на этой нет кнопки Reset (да, на младшей всё просто - нажали на кнопочку при включении - выждали 10 секунд и сбросилось).

Не буду вас утомлять - для сброса данной карты нужно снять крышку, снять ИК подсветку (но не отключать провод! Это важно). И замкнуть чем-нибудь тонким две площадки указанные на фото, на выключенной камере - затем подать питание, выждать 15 секунд и убрать замыкание. По сути это кнопка сброса, но не распаянная.


После сброса всё заработало штатно.

Ключевые слова:  Dahua, HFW1220SP, factory settings, reset, default 

PS: Эксперимент делался на свой страх и риск - было бы очень весело если бы это было питание для чего-либо :) И замкнули + и -. Так что будьте осторожнее делая это на других ревизиях или моделях - проверьте вначале мультиметром, что там не будет ничего.

пятница, 3 августа 2018 г.

Битрикс - добавление в почтовый шаблон номера телефона

Вводная: Необходимо добавить номер телефона и адрес клиента в письмо от интернет-магазина битрикса (о новом заказе).

Решение:
1) Добавляем в /bitrix/php_interface/init.php код

<?
 AddEventHandler("sale", "OnOrderNewSendEmail", "ModifySaleMails");
 
 function ModifySaleMails($orderID, &$eventName, &$arFields)
 {
    $arOrder = CSaleOrder::GetByID($orderID);  
 
    $order_props = CSaleOrderPropsValue::GetOrderProps($orderID);  
 
    $phone = ""; 
    $address = "";
 
    while ($arProps = $order_props->Fetch()){    
      if ($arProps["CODE"] == "PHONE"){
          $phone = htmlspecialchars($arProps["VALUE"]);}
 
      if ($arProps["CODE"] == "ADDRESS"){
         $address = htmlspecialchars($arProps["VALUE"]);}
    }
 
  if (!empty($arOrder["USER_DESCRIPTION"])){
      $arFields["DESCRIPTION"] = $arOrder["USER_DESCRIPTION"];}
 
    //-- добавляем новые поля в массив результатов
    $arFields["PHONE"] =  $phone;
    $arFields["ADDRESS"] = $address;
 }
?>

2) Добавляем в почтовый шаблон ИМЯСАЙТА/bitrix/admin/message_admin.php
(я добавлял в шаблон "[SALE_NEW_ORDER] Новый заказ")

Доставка по адресу: #ADDRESS#<br />
Ваш контактный телефон: #PHONE#<br />

Должно получится как-то так



3) Результат

среда, 17 января 2018 г.

Принтер HP P1102W не печатает через RDP

Вводная: Есть терминальный сервер - Windows 2008 R2 64 bit, стандартная редакция. И клиент - Windows 7 Pro, 32 бита. На клиенте установлен принтер HP P1102W. При подключении через RDP, принтер отказывается работать. Пробрасывается, но не печатает. На самом клиенте проблем с печатью нет.

Решение:

  1. Закрыть сеанс (именно выход из системы) и открыть заново - не помогло
  2. Перезагрузить клиент и сервер - не помогло
  3. Проверил корректность драйверов и ОДИНАКОВОСТЬ версии на клиенте и на сервере. Самое простое - и там, и там удаляем и ставим заново. Для сервера ставим и 32 битную версию, и 64 - не помогло
  4. Устанавливаем политику - запускаем gpedit.msc и по пути Computer Configuration -> Administrative templates -Windows Components -> Remote Desktop Services > Remote Desktop Session Host -> Printer Redirection отключаем опцию "Use Terminal Services Easy Print Driver First" - не помогло (но было странно, ОПЦИЯ НЕ ДЕЙСТВОВАЛА - в свойствах принтера всё равно оставался Easy Print Driver)
  5. Добавил ключ реестра UseUniversalPrinterDriverFirst по пути HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services тип REG_DWORD, создал его и установил в значение "4" ("3" - включен) - помогло и всё заработало.


PS: Ещё в интернетах встречал совет поменять драйвера на XPS, но на них очень сильно начинала тормозить клиентская 1С в RDP сеансе. Но вам может быть поможет.

PS2: После каждого шага перезагружался.

вторник, 16 января 2018 г.

Ежедневная смена пароля на роутере Mikrotik на пароль построенный по дате

Вводная: "Иван, у меня есть тривиальная задача для микротик. Мне нужно ежедневно в 12 часов ночи менять пароль на вай-фае на текущую дату без точек (16012017 например вот так). Я так думаю, что можно решить скриптом, но не знаю, честно говоря, с какой стороны к этой проблеме подойти"

Решение: Идею взял на http://kvas.livejournal.com/679174.html

:local wifiProfile wifiMyProfile

:local dateNow [/system clock get date];
:local dateNowDay [:pick $dateNow 4 6]
:local dateNowMonth [:pick $dateNow 0 3]
:local dateNowYear [:pick $dateNow 7 11]

:local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
:set dateNowMonth ([:find $months $dateNowMonth -1 ] + 1)

:if ( $dateNowMonth < 10 ) do={
:set $dateNowMonth ("0"."$dateNowMonth");
};

:log info message="==== NOW DATE: day: $dateNowDay month: $dateNowMonth year: $dateNowYear"

:local newPassword ("$dateNowDay" . "$dateNowMonth" . "$dateNowYear");
:log info message="==== NEW PASSWORD: $newPassword"

/interface wireless security-profiles set [find name=$wifiProfile] wpa2-pre-shared-key=$newPassword


Всё это добавляется в System-Script и вызывается в 0:05 через шедулер.

понедельник, 15 января 2018 г.

Удаление папок по времени

Вводная: Делаю для себя небольшую систему резервного копирования. Задача - удалять старые папки-даты при добавлении новых. По алгоритму - оставляем только 15 последних папок, остальные удаляем.

Решение: На вход подаётся List класса BackupDirectoryInfo. Просто DirectoryInfo не используется, так как в качестве хранилища бэкапа используются и файловые ресурсы, и облачные хранилища. Если требуется использовать только папки на физическом диске, то можно обойтись одним DirectoryInfo.

public abstract class BackupDirectoryInfo
{
     public string Name;
     public string Path;
     public DateTime CreatedTime;

     public abstract void Delete();
}
private void DeleteOldFolder(List<BackupDirectoryInfo> dirs )
{
    var orderedList = dirs.OrderByDescending(x => x.CreatedTime)
                      .Take(15);

    var dirToDelete = dirs.Except(orderedList).ToList();
            
    dirToDelete.ForEach(x => x.Delete() );
}

суббота, 30 декабря 2017 г.

Заполнить базу в MS SQL тестовыми данными

Вводная: сабж.

Решение:
USE [testBackup]
GO

DECLARE @count INT 
SET @count = 1

WHILE @count <= 100000
BEGIN
INSERT INTO [dbo].[Table_1]
    SELECT 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) [Test]
    SET @count += 1
END
GO

Ну и удаление
USE [testBackup];
GO
DELETE FROM [dbo].[Table_1];
GO

суббота, 14 января 2017 г.

"Колхозное" крепление Mikrotik SXT

Иногда нужно срочно устанавливать точку доступа Mikrotik SXT, причём не на мачту, а на стену. Но нормального крепления ( https://routerboard.com/QM ) нет. Да и вообще никаких креплений, кроме стандартного, нет. А магазины где можно купить что-либо для микротика далеко.

В таком случае может помочь использование такой штуки как "ответная часть петли". Стоит рублей 50. Отверстия для крепления есть. Нагрузку в виде антенны точно выдержит :) Продаётся в разных хозяйственных и строительных магазинах.


пятница, 28 октября 2016 г.

Функционал tool snmp-[get|walk] в новых версиях Mikrotik

В последнем релиз кандидате 6.38rc19 появилась интересная функция -
snmp - added basic get and walk functionality "/tool snmp-[get|walk]";

Теперь можно получить информацию о другом устройстве через snmp. Что открывает некоторые интересные возможности (можно сделать небольшой мониторинг на основе микротика).

Для примера узнать занятую память на другом микротике (с адресом 192.168.0.1 и включенным SNMP без авторизации), можно простым запросом -
tool snmp-get address=192.168.0.1 oid=.1.3.6.1.2.1.25.2.3.1.6.65536

С помощью запроса
tool snmp-walk 192.168.0.1
Мы можем получить все значения всех OID которые есть в устройстве (лучше так не делать, а выводить только нужные ИМХО)

Какие плюсы -

  • мы не ограничены ПРОИЗВОДИТЕЛЕМ, можем получать информацию и от систем Windows, Linux, Cisco и всех прочих гд реализовано SNMP.


Какие минусы -

  • я пока не понял, как положить значение в какую-нибудь переменную. Операторы put, get, set, find и прочие не работают (или я не понял как из завести, если кто знает поправьте - добавлю в описание). Как костыль записывать вывод в файл и его парсить
  • Нет реализации snmp-set, как я надеюсь пока. Потому что лично у меня есть оборудование которое его использует. 

четверг, 6 октября 2016 г.

Mikrotik: как посмотреть кто из пользователей забивает канал и как ограничить ему скорость?

Увидел вопрос-ответ на http://spw.ru/support/voprosotvet/podklyuchenie/vopros5/
"Mikrotik 1100AH как посмотреть кто из пользователей забивает канал и как ограничить ему скорость?" и решил поделится немного другим способом.

На мой взгляд, приведённый в ответе способ через Tools-Torch не очень наглядно показывает скорость, так как там идёт разбивка по IP адресам.


Так что иногда может помочь определение "качальщика" через Simple Queue.
Создаём для пользователей нашей сети следующие правила -
/queue simple
add max-limit=1G/1G name=X220 target=192.168.0.100/32
add max-limit=1G/1G name=MainComp target=192.168.0.200/32

Далее создаём правило ограничивающее скорость для всех кто не указан в перечислении выше:
/queue simple
add max-limit=2M/2M name="All Other" target=192.168.0.0/24

Теперь чтобы увидеть кто и с какой скоростью качает можно просто смотреть в окно Queue. Причём в достаточно человекопонятном виде.


Также из плюсов можно отметить, что можно смотреть (и ограничивать) скорость не только по IP адресам, но и по подсетям (а там можно разбить к примеру по кабинетам, подразделениям или как вам удобно).

И можно сразу же, ограничить пользователя который увлёкся :)

PS: Не забывайте, что Queue даёт нагрузку на процессор. Так что проверяйте можно или нет это использовать в вашем случае.

понедельник, 19 сентября 2016 г.

Как на mikrotik cделать фильтрацию трафика с 22:00 до 10:00

Вопрос: Как на mikrotik одним правилом сделать фильтрацию трафика с 22:00 до 10:00? На cisco без проблем. Здесь же говорит "couldn"t add new firewall rule - start time bigger than end time". Если ставить 20:00:00 и 1d 10:00:00 то говорит "Error interval". Mikrotik так не умеет или я что-то делаю не так?

Ответ: Одним правилом сделать это нельзя - mikrotik не воспринимает такие диапозоны, но есть варианты

(далее блокируется пинг до Google DNS 8.8.8.8, не забудьте удалить после тестов)

0) Стандартный способ - использовать два правила с временными промежутками 22:00:00-23:59:59 и 00:00:00-10:00:00

1) Использовать через запрет - Где-то в конце есть правило, которое запрещает, а конкретным правилом разрешать.

/ip firewall filter
add chain=forward dst-address=8.8.8.8 protocol=icmp src-address=192.168.0.0/16 time=10h-22h,sun,mon,tue,wed,thu,fri,sat

add action=reject chain=forward protocol=icmp src-address=192.168.0.0/16

2) Использовать шедулер -
также создаём правило в файрволе, но не указываем конкретное время -

/ip firewall filter
add action=reject chain=forward dst-address=8.8.8.8 protocol=icmp src-address=192.168.0.0/16

Далее получаем номер правила с помощью
ip firewall filter print

И теперь создаём два правила шедулера -

/system scheduler
add interval=1d name=schedule1 on-event="ip firewall filter disable 1\r\
    \n" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=sep/19/2016 start-time=10:00:00
add interval=1d name=schedule2 on-event="ip firewall filter enable 1\r\
    \n" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=sep/19/2016 start-time=22:00:00

Это даёт нам несколько преимуществ -

  1. Мы не привязаны только к правилам файрвола и можем работать с чем угодно - интерфейсы, пользователи и може делать всё что нам захочется.
  2. Если правил для фильтрации много, то в случае изменения временного промежутка нам надо поменять в ОДНОМ месте, иначе пришлось бы менять во всех где используется временной фильтр.
  3. В случае если надо выключить (или включить) фильтрацию, то можно запустить один скрипт который это всё сделает, а не менять время на интерфейсах (или на самом роутере)
  4. Более гибкая работа со временем. Можно сделать несколько разных фильтраций с разными правилами и фильтрациями.


3) Немного "костыльный" способ - через изменение текущего часового пояса - то есть если у нас Московкий часовой пояс +3, то выбираем -7, и теперь надо указывать промежуток - от 12:00:00, до 23:59:59

PS: Надо не забывать обязательно настраивать синхронизацию по времени в случае работы с учётом времени.

пятница, 12 августа 2016 г.

Небольшой хинт который поможет сберечь время и нервы.

Вводная: Есть роутер Mikrotik и хороший-стабильный провайдер. Проблема оказалось в том, что долгое время интернет не пропадал от слова вообще. И мы просто забыли телефон технической поддержки! И когда случилась проблема время реакции сильно больше запланированных. Пришлось вначале звонить в справочную, узнавать номер провайдера, где дали общий номер телефона, на котором уже дали телефон техподдержки. Чтобы уменьшить влияние такой проблемы можно сделать следующий "хинт"



PS: Также можно указать на кого зарегистрированно, номер договора, адрес и другие данные, которые могут уточнить

PS2: Это не отменяет, что желательно иметь номер техподдержки записанным в телефоне.

понедельник, 18 апреля 2016 г.

Mikrotik и проблема с первым портом


Вводная: Новый роутер mikrotik 951Ui-2HnD. Интернет по PPPoE - приезжаем ставить к заказчику. Не работает. При прямом подключении к ноутбуку всё спокойно. Сбрасываем конфигурацию, пробуем настроить с нуля - не работает. На другом объекте никаких проблем с этим роутером нет, также в офисе все проверки проходит и везде подключается.

Решение: Изначально считали, что "глюк" провайдера, но РТК кивал на то, что
а) с ноутбука всё работает
б) если подключаешь простейший D-Link то тоже всё работает.
Ради интереса решили переткнуть в другой порт на роутере (на ether5), заработало без проблем и плясок с бубном.

Далее провели небольшое исследование и выяснили, что если переобжать кабель от провайдера по четырёхпроводной схеме (1, 2, 3 и 6 пин), то проблема уходит. При этом мультиметром на "лишних" парах никакого напряжения нет. Видимо шум, помехи или что-то ещё.

Учитывая, что первый порт это PassivePoE-In, то видимо он пытался получить питание, или конфликтовал с питанием от БП, или срабатывали какие-либо фильтры. Или ещё какие-нибудь возможные проблемы - если есть предположения - пишите в комментарии.

PS: Также подсказывают, что иногда в таких случаях, помогает замена блока питания на более мощный.

PS2: Такие же глюки (из-за БП) могут быть на оборудовании подключённом через PoE-Out порт. Если блок питания корявый или малой мощности - жди глюков.

среда, 10 февраля 2016 г.

Пару моментов про резервное копирование

Последнее время начал ВСЕМ клиентам у которых используется 1С (или ещё какая учётная система) ставить cobianBackup и настраивать резервное копирование. Абсолютно всем - даже если просто попросили что-то добавить и бэкап не нужен

Пару нюансов -
1. Спрашивайте когда обед и запускайте в это время
2. Если есть два компа и они по сети, то лучше что-бы было два бэкапа - локально и на вторую машину
(если два харда, то тоже самое - но только одна копия на рабочем, другая на втором)
3. Используйте теневое копирование (в Cobian по умолчанию используется - главное не выключать)
4. Используйте архивацию (можно даже без сжатия или с минимальным) и переименовывайте расширение архива в какие-нибудь левые символы - может помочь спастись от вирусов-крипторов и если файлов дохера (типа читаинформ) то будет существенно быстрее копироваться-разворачиваться из бэкапа
5. Если есть свободное место, то лучше не связываться с диф.копиями, а фигачить полные.
6. Если говорят, что бэкап не нужен и платить за него не будут - я ставлю шифрование архивов и в случае чего возьму денег за пароль  :lol: (да я знаю, что его можно вытащить из конфига - но это уже сделает более менее умный технарь, а не сами бухи. Ну а помочь "собрату по профессии" дело хорошее.

PS: Если есть интернет, то как вариант дополнительно можно в какой-нибудь dropbox бд кинуть. Но это нагрузка на канал + не все хотят-готовы ложить БД в облако.

среда, 20 января 2016 г.

Программная отчистка корзины Яндекс.Диск

Вводная: Когда-то давно случился у Яндекс.Диска небольшой конфуз http://habrahabr.ru/post/204580/ после которого пользователям выдали 200 Гб места. Что сделало его очень удобным для удалённого бэкапа небольших баз. Но как всегда есть одно - НО. И но это заключается в методе удаления файлов с яндекс.диска. https://yandex.ru/support/disk/desktop/faq.xml#delete Грубо говоря, при удалении файлов, они не удаляются, а переносятся в корзину, где и хранятся 30 дней. Но если у вас бэкап занимает около 10 гигабайт и вы храните 10 предыдущих копий, то уже через дней 20 весь яндекс.диск будет у вас заполнен и после чего просто ПРЕКРАТИТ СИНХРОНИЗИРОВАТЬ. При этом выкидывая попап, что место на яндекс диске закончилось - но если это сервер, то на него могут месяцами не заходить и узнать об отсутствии бэкапов слишком поздно. Так что надо корзину чистить, но стандартными средствами есть два выбора - либо через сайт, либо через правую кнопку мыши на папке яндекс.корзины. И оба способа для сервера не очень подходят.

Решение: Создаём консольный проект. У меня имя проекта - clearYandexDiskTrash

Устанавливаем через NuGet библиотеку yandexdisk.client.
Или скачиваем с сайта https://github.com/raidenyn/yandexdisk.client и устанавливаем вручную.
Библиотека требует .NetFramework версии 4.6, так что нужно чтобы в свойствах проекта была именно она.

Заодно, также в свойствах проекта, перейдём на вкладку Settings и добавим настройку с именем yandexDiskToken.

Далее код -

using System;
using System.Threading;
using clearYandexDiskTrash.Properties;

using YandexDisk.Client;
using YandexDisk.Client.Http;

namespace clearYandexDiskTrash
{
  class Program
  {
    static void Main()
    {
      try
      {
        //You should have oauth token from Yandex Passport.
        //See https://tech.yandex.ru/oauth/
        string oauthToken = Settings.Default.yandexDiskToken;

        // Create a client instance
        using (IDiskApi diskApi = new DiskHttpApi(oauthToken))
        {
           var x = diskApi.Commands.EmptyTrashAsync("", CancellationToken.None);
        }
      }
      catch(Exception ex)
      {
         Console.WriteLine("Application clearYandexDiskTrash error." + " Message: " + ex.Message);
      }
    }
  }
}

Теперь запускаем и переходим в папку с скомпилированной программой. Там должен появится файл - clearYandexDiskTrash.exe.config. Открываем его блокнотом и изменяем параметр yandexDiskToken на наш. Который мы можем получить на сайте яндекса - https://tech.yandex.ru/oauth/ (но для быстроты и если нужно написать "для себя", то проще и быстрее получить токен на https://tech.yandex.ru/disk/poligon/ )

Далее не забываем поменять настройки бэкапов, чтобы программа запускалась перед выполнением бэкапа. И проверить выполнение. И ещё раз проверить через несколько дней.

понедельник, 21 декабря 2015 г.

Использование ВК для логгирования через C#

Вводная: Поделился я в твиттере, что у меня критичные логи помимо емейла падают ещё и во вконтакт, и в личке попросили скинуть способ. Подумал, что мало ли ещё кому будет интересно. Программа по минимум использует собственные велосипеды и по максимуму готовые библиотеки.

Решение: Для начала нужна зарегистрированная страница в VK. Переходим по ссылке https://vk.com/apps?act=manage и нажимаем "Создать приложение". Название пусть будет "vkLogSend", тип "Standalone-приложение".

Придёт смс с кодом, который нужно указать. Далее переходим во вкладку "Настройки" и сохраняем куда-нибудь "ID приложения", в нашем случае 1111111.



На этом работа с сайтом закончена и можем переходить непосредственно к программированию.

Открываем Visual Studio и создаём консольный проект vkLogSend. Далее сразу можно перейти в NuGet и установить два пакета - VkNet (реализация ВКонтакте API для .NET) и NLog (библиотека логгирования для C#).

Далее создаём класс с именем "vkTarget.cs" и содержанием -

using System;

using NLog;
using NLog.Targets;

using VkNet;
using VkNet.Enums.Filters;

namespace vkLogSend
{
    [Target("vk")]
    public sealed class VKTarget : TargetWithLayout
    {
        public VKTarget() { }

        protected override void Write(LogEventInfo logEvent)
        {
            var logMessage = this.Layout.Render(logEvent);

            SendTheMessageToRemoteHost(logMessage);
        }

        [STAThread]
        private void SendTheMessageToRemoteHost(string message)
        {
            var appId = 111111; // указываем id приложения
            var email = "user@mail.com"; // email для авторизации
            var password = "Pa$$w00rd"; // пароль
            var settings = Settings.Messages; // уровень доступа к данным

            var api = new VkApi();

            api.Authorize(appId, email, password, settings); // авторизуемся

            api.Messages.Send(1111111, false, message); // посылаем сообщение пользователю
        }
    }
}

Теперь нужно создать правила для NLog, это делается через создание файла NLog.config, в нашем примере пусть будет два правила: вывод на консоль и отправка в ВК -

<?xml version="1.0" encoding="utf-8" ?>

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <extensions>
    <add assembly="vkLogSend"/>
  </extensions>

  <targets>
    <target name="console" xsi:type="Console" layout="${date:format=HH\:mm\:ss} | ${level} | ${message}" />
    <target name="vk" type="vk" layout="${date:format=HH\:mm\:ss} | ${level} | ${message}"/>
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="console" />
    <logger name="*" minlevel="Trace" writeTo="vk" />
  </rules>

</nlog>

По сути стандартный файл NLog с добавленной секцией <extensions> и прописывание правила для таргета "vk"

И напоследок использование -


using System;
using NLog;

namespace vkLogSend
{
    class Program
    {
        static Logger logger = LogManager.GetCurrentClassLogger();

        static void Main()
        {
            logger.Trace("vkLogSend test message. Error on machine: " + Environment.MachineName);
            Console.WriteLine("Press any key..."); Console.ReadKey();
        }
    }
}

И у нас ничего не работает :) В библиотеке VkNet, при установке через NuGet есть ошибка - устанавливаются библиотеки Newtonsoft.Json и HtmlAgilityPack неверных версий. Решение простое - через NuGet обновляем их до последних и всё должно заработать.

После обновления библиотек можем тестировать и отправлять себе логи через Вконтакт.

\



PS: Есть нюанс при работе - если у вас настроено подтверждение входа (через смс или другим способом), то данный код работать не будет. Имейте это в виду.

среда, 9 декабря 2015 г.

Особенность статических записей в роутерах Mikrotik (IP-DNS-Static)

Вводная: Ранее стоял сервер DNS, с настроенными статическими записями вида - server, 1c, mail, router которые вели на разные адреса локальной сети. После того как убрали отдельный сервер и его роль перенесли на микротик, то однословные статические записи перестали работать (IP-DNS-Static). Но если добавлялась запись вида router.local, то всё пинговалось.

Решение: Это проблема не микротика, а винды (и даже не проблема, а особенность). Если вы будете пинговать в никсах, то вполне может быть что запингуется (но опять же зависит от конкретной реализации). Но всё таки если вам надо, чтобы пинговалось по именам из одного слова то есть два выхода -

1) Немного изменить настройки на роутере - добавить в DHCP сервер параметр "Domain", пусть будет local. Тогда добавляете в DNS-Static запись router.local = 192.168.0.1 и после реконекта (чтобы ваш сетевой адаптер принял новый параметры сети) будет работать.


2) Если вы не используете DHCP, то статическая запись так и остаётся - router.local, но далее уже не надо изменять DHCP, а изменить настройку в настройках сетевого адаптера windows

(правая кнопка мыши на нужном адаптере - свойства - Протокол интернета версии 4 - кнопка "Свойства" - вкладка "Общие" - кнопка "Дополнительно" - вкладка "DNS" - Дописывать следующие DNS-суффиксы - кнопка "Добавить" и добавляем - "local", далее везде OK).

среда, 23 сентября 2015 г.

Получение внешнего IP-адреса на C#

Вводная: В одной программе было необходимо получить внешний адрес компьютера. Для решения предварительно погуглил и выяснил, что достаточно известная функция и реализуется просто. Если что искать по запросу в гугл - "C# get public ip external". Первые же ссылки ведут на http://www.codeproject.com/Tips/452024/Getting-the-External-IP-Address и http://stackoverflow.com/questions/3253701/get-public-external-ip-address где и показывается как это можно сделать. В данных примерах получение адреса делается через сервисы checkip.dyndns.org и whatismyip.com. Первоначально с ними и начал работать, но возникло куча осложнений - порой дикие задержки и проблемы с соединением. Постоянная ошибка "System.Net.WebException: Время ожидания операции истекло   в System.Net.HttpWebRequest.GetResponse()"

Решил сделать тоже самое, но с оглядкой на Российскую действительность. Первоначально рассматривал https://2ip.ru но там достаточно тяжелая страница и в итоге выбор пал на Яндекс, а конкретно - http://yandex.ru/internet

Решение:
public class PublicIP
{
  public string Get()
  {
    try
    {
      using (var client = new WebClient())
      {
        var uri = new Uri("http://yandex.ru/internet/");
 
        client.Encoding = Encoding.UTF8;
        client.Proxy = null;
 
        var downloadString = client.DownloadString(uri);
        var first = downloadString.IndexOf("<strong>IP-адрес</strong>: ", StringComparison.Ordinal) + 27;
        var last = downloadString.IndexOf("<strong>Регион по IP-адресу</strong>", StringComparison.Ordinal);
 
        downloadString = downloadString.Substring(first, last - first);
 
        return downloadString;
      }
    }
    catch (Exception msg)
    {
      Console.WriteLine(msg);
      return "";
    }
  }
}

PS: Используется простой разбор строк не потому, что я не знаю о парсерах HTML (Html Agility Pack, Fizzler и тп), а просто потому, что

  • а) в данном случае они избыточны 
  • б) удлиняют выполнение функции примерно на 1-2 секунды
  • в) Ради одного единственного места в программе тащить ещё мегабайт библиотекой ИМХО не корректно
  • г) в итоге кода получается больше :)


PS2: Замеры по сравнению с точно такой же функцией, только которая обращается к CheckIP.dyndns.org

Stopwatch stopWatch = new Stopwatch();
 
stopWatch.Start();
 
var gip = new PublicIP();
Console.WriteLine(gip.Get());
 
stopWatch.Stop();
 
Console.WriteLine("Checkip:  " + stopWatch2.Elapsed);

Методика тестирования - запускается программа. Значение записывается отдельно и так по 5 раз для каждого варианта (CheckIP и Yandex)
checkIP
00:00:01.9662763
00:00:02.1180682
00:00:03.0694474
00:00:02.0939421
00:00:02.1191459
Yandex
00:00:00.3286215
00:00:00.3752536
00:00:00.3639731
00:00:00.3458052
00:00:00.3535228

Комментарии излишни.

PS3: Если вам требуется получать в пределах одного города или провайдера, то проще поднять у себя web-сервер и отдавать от себя. Скорость может быть ещё выше.