Sunday, November 19, 2017

Простые уведомления в Telegram из Bareos

             

Bareos настроен, есть несколько хостов которые бэкапятся по расписанию, вроде все хорошо. Но через пару месяцев, когда потребовался определенный бэкап, выясняется что уже неделю как копирование не осуществляется. Ясно что необходимо не только снимать копии, а еще и мониторить все это дело. Кроме того, сняв копию нужно убедиться что она полностью рабочая. Но для начала неплохо было бы просто получать алерты от систем резервного копирования с информацией о статусе копирования или о сбоях.
С Bareos устанавливается плагин bsmtp, он подходит в случае если есть корпоративный почтовый сервер, принимающий без smtp auth письма от хоста bareos.  Gmail.com, yandex.ru, все эти сервисы требуют сейчас авторизации для отправки писем. Поскольку своего сервера под рукой нет, а поднимать рилэй не хочется, пытался решить проблему с использованием ssmtp. Пока не получилось, однако с Telegram подружить оказалось намного проще.
Достаточно просто ввести в конфигурацию Bareos строчку с CURL запросом.

curl --header 'Content-Type: application/json' --request 'POST' --data '{"chat_id":"_здесь_id_чата_","text":"_здесь_сообщение_"}' "https://api.telegram.org/bot_здесь_токен_бота_/sendMessage"

На случай если бота еще нет, его легко создать, займет меньше времени чем регистрация нового о почтового ящика в Яндексе. В сети полно информации о том как это сделать, если коротко, то:

  • В телеграме ищем @BotFather
  • Создаем с помощью команды /newbot нового бота
  • BotFather выдает уникальный token бота, это информация по идее секретная, ей лучше не раскидываться. Можно сразу зайти по ссылке https://api.telegram.org/bot_здесь_токен_бота_/sendMessage и посмотреть результат. Должно быть "Bad Request: message text is empty".
  • Дальше нужно вступить в контакт с ботом, написать ему что-либо. Это такая защита от спама, чтобы боты не лезли к людям сами.
  • Для того чтобы бот нам мог отправить сообщение, нужно знать наш id (в принципе можно использовать имя пользователя). Для этого идем к боту @MyTelegramID_bot и узнаем заветные цифры.
Все необходимое у нас есть, можно проверить используя вышеприведенный запрос curl. Бот должен прислать сообщение.


Теперь можно вставить строчку в конфиг. У меня это
/etc/bareos/bareos-dir.d/messages/Standard.conf
Хотя наверное лучше standard не трогать и создать свой.

Messages {
  Name = Standard
  Description = "Reasonable message delivery -- send most everything to email address and to the console."
  operatorcommand = "/usr/bin/bsmtp -h localhost -f \"\(Bareos\) \<%r\>\" -s \"Bareos: Intervention needed for %j\" %r"
  mailcommand = "curl --header 'Content-Type: application\/json' --request 'POST' --data '\{\"chat_id\":\"_здесь_id_чата_\",\"text\":\"Bareos: %t %e of %c %l\"\}' \"https:\/\/api.telegram.org\/bot_здесь_токен_бота_\/sendMessage\"
  operator = root@localhost = mount                                 # (#03)
  mail = root@localhost = all, !skipped, !saved, !audit             # (#02)
  console = all, !skipped, !saved, !audit
  append = "/var/log/bareos/bareos.log" = all, !skipped, !saved, !audit
  catalog = all, !skipped, !saved, !audit

}

Перезапускаем сервис bareos-dir
service bareos-dir restart
Все должно работать.



Sunday, October 29, 2017

перенос nativeboot vhd (vhdx) диска.

Использование VHD/VHDX дисков для установки ОС в режиме nativeboot в теории весьма удобно, но, как оказалось, на практике возникли сложности. Основная сложность - "что вообще с этим делать?" Потребовалось переконфигурировать RAID массив (перетащить данные в другое место, перестроить, вернуть все на место). Все это можно сделать с использованием обычных загрузочных дисков (Win server 2016 iso в моем случае), там есть режим восстановления с командной строкой и он видит мой контроллер без установки дополнительных драйверов.

После создания нового рейд массива (в bios или другими способами) нужно полученный диск инициализировать, создать раздел UEFI (100mb) и раздел для размещения VHDX файла. После копирования VHDX файла нужно примонтировать его и создать в UEFI разделе указатель для загрузки с примонтированного VHDX. Для этого потребуется использовать Diskpart и bcdboot. Речь идет про UEFI, для BIOS похоже, но чуть по другому.

Выдержка из документации Microsoft.

diskpart
list disk

Выбираем из списка нужный нам диск (свежесобранный массив).

select disk 0
clean
convert gpt
rem == 1. создаем системный раздел  и назначаем ему букву S==========
create partition efi size=100
format quick fs=fat32 label="System"
assign letter="S"
rem == 2. Microsoft Reserved (MSR) partition =======
create partition msr size=128
rem == 3. ну и диск для данных  с буквой M===========================
create partition primary
format quick fs=ntfs label="Main"
assign letter="M"

Неплохо бы еще глянуть на разделы

list volume
exit


Есть разбитый на разделы диск, копируем диск VHDX  чем и как угодно. Например
xcopy f:\windows.vhdx m:\

А теперь самое интересное

diskpart
select vdisk file=M:\windows.vhdx
attach vdisk

неплохо бы опять

list volume

Видим что VHDX подключился и на нем есть разделы, выясняем раздел с установленной ОС, пусть будет V:\ к примеру.

V:\
cd v:\windows\system32
bcdboot v:\windows /s S: /f UEFI

Перезагружаемся, все должно работать. За исключением Hyper-v. Для работы гипервизора оказывается надо еще
bcdedit /set hypervisorlaunchtype auto
Потом погасить сервер и включить обратно. Именно погасить, выключить, а не просто перезагрузить. Иначе возникает ошибка "Произошла ошибка при попытке запуска выбранных виртуальных машин Не удалось запустить виртуальную машину поскольку низкоуровневая оболочка не запущена"

Tuesday, August 29, 2017

Сменить динамический ip-адрес на статический в SCVMM на работающей VM


Задать тип IP адреса (динамика или статика) можно при создании VM. Но если потребовалось изменить этот тип уже после создания, то можно сделать это через powershell. Здесь мы меняем тип для первого сетевого интерфейса. (Google помог по запросу scvmm change to static ip powershell )

$vm = Get-ScvirtualMachine -Name "имя нашей VM"
$staticIPPool = Get-SCStaticIPAddressPool -Name "имя нашего пула статических адресов"

Grant-SCIPAddress -GrantToObjectType "VirtualNetworkAdapter" -GrantToObjectID $vm.VirtualNetworkAdapters[0].ID -StaticIPAddressPool $staticIPPool

Set-SCVirtualNetworkAdapter -VirtualNetworkAdapter $vm.VirtualNetworkAdapters[0] -IPv4AddressType static

Испробовал - работает. Если машина включена и управляется агентом, то и адрес меняет в VM. Пробовал на Win, на Lin VM так делал, но IP внутри VM менял руками. 

Tuesday, August 1, 2017

Уcтановка сервера терминалов совместно с контроллером домена 2008 R2

Конфигурация в которой Domain Controller установлен совместно с Terminal Server является официально не поддерживаемой и не рекомендуемой. В 2008 R2 выводится лишь предупреждение об этом, а начиная с 2012 wizard просто откажется совмещать роли.
В большинстве случаев сейчас можно использовать виртуализацию для разнесения ролей по разным ОС если не хватает физических серверов. Возникает правда вопрос - "яйцо или курица?". То есть что сделать хостом, а что виртуалкой, но в целом проблема решается. При условии что лицензия Windows Server Standard уже давно дает возможность запуска двух виртуалок, это решение логично.
Но иногда, если нельзя, но очень хочется, то можно. Например в одной организации физический сервер стар и дохл, и явно не потянет две ОС.

Одна из проблем возникающих при совмещении ролей AD DC и TS это проблема с печатью при помощи easy print.

Принтеры пробрасываются с помощью easy print, видны как перенаправленные, но не печатают. Точнее задания на печать уходят в никуда. Можно всем пользователям раздать права администраторов домена ), но это плохой вариант. Куда лучше прописать права командами.

Запускаем командную строку с правами администратора, переходим в папку Windows\System32\Spool и запускаем:

Cacls.exe PRINTERS /e /g users:C
либо
Cacls.exe PRINTERS /e /g пользователи:C

решение было найдено здесь - http://searchvirtualdesktop.techtarget.com/tip/Five-reasons-printer-redirection-causes-Windows-printing-problems-in-RDS

Saturday, December 3, 2016

Типовые проблемы при разворачивании службы удаленных рабочих столов на 2012 R2


При разворачивании минимальной конфигурации RDS на скорую руку, в очередной раз сталкиваюсь с проблемами и в очередной раз забываю как их решать. Первое что нужно сделать перед развертыванием это конечно прочитать best practices, а потом составить план. Выписать все что необходимо заранее, подготовить, запросить. 

Например сертификат SSL и доменное имя типа remote.mycompany.ru (DNS запись A).  Даже развертывая очень маленький терминальный сервер для очень маленькой компании имеет смысл прикупить SSL если планируется доступ из сети интернет. Сегодня удаленный доступ нужен только с одного ноутбука, а завтра потребуется еще на десятке смартфонов. Замучаешься устанавливать везде свой локальный сертификат в корневые. Тем более что SSL сертификат сейчас стоит копейки. Я последнее время беру на https://www.ssls.com/ , с кодом 3.88DEAL  вообще копейки. И оплатить можно даже биткойнами. Проще всего запрос сертификата сделать установив на сервер роль IIS, тем более что он все равно потребуется для развертывания шлюза. В IIS есть раздел SSL, там визарды для создания запроса сертификата и для его установки (есть смысл запрашивать сертификат минимум 2048 bit ).
Часто сервер физически один, а службы удаленного доступа хотят иметь в своем составе шлюз, сервер лицензирования, сам терминальный сервер. Да и домен в ряде случаев не поднят. Технически возможна установка RDS на сервер в рабочей группе, но если есть возможность, можно сразу поднять контроллер домена. Если был куплен Windows Server Standard и выше, то его можно установить в двух экземплярах в виде виртуалок на одном физическом хосте. Если есть возможность - почему не использовать? Например DC аппаратный хост, а RDS на нем в Hyper-v. Или наоборот. Да DC в одном экземпляре, да еще и виртуальном, но ведь у нас нет 100500 ПК в этом домене. Всего один сервер и нужно просто иметь логины и пароли локальных админов.
В случае развертывания RDS в малом бизнесе очень часто IP адрес внешний один и нет возможности или желания докупать еще. В итоге создается конкуренция между внутренними сервисами за порты на этом IP. HTTP и HTTPS часто заняты другими ресурсами, и это создает массу проблем при развертывании RDS Gateway. Приходится переносить на другие порты, ручками местами прописывать потом эти порты.
Например, вместо 80 ставим 81, а вместо 443 - 442. Теряется красота ссылок на ресурсы, вместо https://remote.mycompany.ru/rdweb получаем https://remote.mycompany.ru:442/rdweb . Кроме того, наживаем кучу проблем с прописыванием этих самых 442 в разных местах. Есть пара решений, нашел на Windowsitpro.com. В оснастке диспетчера служб удаленных рабочих столов можно указать порты. Кроме того, для RemoteApp нужно тоже прописать порт, иначе приложения будут ссылаться на стандартный 443. Можно отредактировать реестр, указав порт:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\CentralPublishedResources\PublishedFarms\<farm>\DeploymentSettings, в нем ищем DeploymentRDPSettings и добавляем к gatewayhostname:s:remote.mycompany.ru:442 номер порта. Сделать это нужно до того как опубликовали приложения RemoteApp, в противном случае приложения придется распубликовать и опубликовать повторно. Можно не реестром, а через PowerShell:
Set-RDSessionCollectionConfiguration –CollectionName "Your Collection" -CustomRdpProperty "gatewayhostname:s:<GATEWAY.FQDN>:<442>" -ConnectionBroker <Your Connection Broker> 
Но у меня на эти часть команд PS ругался, считал что RDS не установлены на сервере.Часто возникает проблема с SSL и hostname. SSL мы получили вида remote.mycompany.ru, а сервер у нас что-то вроде rdsserver.mycompany.local . Поэтому при первых же подключениях можно получить как минимум предупреждение "Имя сервера отличается от имени указанного в сертификате". Это если мы конечно прописали сертификат везде где надо:

  • Привязки в IIS к порту 442 (можно и к 443)
  • В диспетчере серверов (Настройка развертывания служб удаленных рабочих столов)
  • В диспетчере шлюза удаленных рабочих столов ( у меня не прописался сам, пришлось ручками).



В некоторых случаях предупреждение можно просто игнорировать. На некоторых платформах игнорировать нельзя. 

Решить проблему можно либо командой:
Set-RDSessionCollectionConfiguration –CollectionName QuickSessionCollection -CustomRdpProperty “use redirection server name:i:1 `n alternate full address:s:remote.mycompany.ru”либо скриптом.
.\Set-RDPublishedName.ps1 "remote.mycompany.ru:442"
Скрипт у меня сразу не запустился, нашел ряд решений, например -
powershell.exe -noprofile -executionpolicy bypass -file .\Set-RDPublishedName.ps1
Я зачем-то еще настроил на DC DNS зону mycompany.ru, и в ней создал DNS запись A "remote.mycompany.ru", указывающую на внутренний адрес RDS сервера, но это скорее по привычке.
Все бы ничего, но как только мы решили проблему с несоответствием имени указанном в SSL сертификате и имени сервера к которому подключаемся, появляется другая проблема.
event 301:
Пользователь "mycompany\user" на клиентском компьютере "8.8.8.8" не соответствует требованиям политики авторизации ресурсов и не авторизован для подключения к ресурсу "remote.mycompany.ru". Произошла следующая ошибка: "23002".
Дело в том что по умолчанию создаются политики удаленного доступа для штатной ситуации. А мы уже подправили скриптом, реестром, имя сервера к которому ведется подключение. И в политиках ничего не написано про remote.mycompany.ru. Открываем диспетчер шлюза удаленных рабочих столов и правим политику - добавляем туда наш адрес remote.mycompany.ru.




Tuesday, September 6, 2016

CPU mining with CPUMiner-Multi on CentOS 7

All necessary steps for CPU mining with CPUMiner-Multi by Wolf and Lucas Jones miner on CentOS 7

It is really easy to do cryptonight (Bytecoin [BCN], Monero) after CentOS installed and has network access to internet.

SSH to your CentOS and run following commands:

yum install git automake gcc make curl-devel
cd ..
cd srv
git clone https://github.com/wolf9466/cpuminer-multi
cd cpuminer-multi
./autogen.sh
CFLAGS="-march=native" ./configure
make

Now you can start miner with:

./minerd -a cryptonight -o <stratum url> -u <username> -p <pasword>

Monday, March 14, 2016

python-telegram-bot и Google App Engine


Захотелось поднять бота Telegram, но сразу в среде не требующей много внимания и не на рабочих серверах. Поднимать для него отдельные виртуальные машины, или искать дополнительный хостинг тоже не очень хотелось. Решил остановиться на облачных ресурсах Heroku, Google App Engine, Amazon и т.д. Программист из меня никакой, поэтому настройка окружения заняла много времени. Остановился на GAE, поскольку на нем хоть что то запустилось сразу. 

В GAE сразу запустился простой бот - спасибо Yukuku за подробную инструкцию. Но сразу же захотелось использовать клавиатурные подсказки, еще какие то фичи, наиболее логичным было использовать https://github.com/python-telegram-bot/python-telegram-bot для разработки бота. И вот тут начались проблемы, поскольку для этого решения требуется множество различных библиотек, которые цепочкой завязаны друг на друга. Мне не помогло решение от S. Hwang - либо описание несколько устарело (там ссылка на видео инструкцию) либо у меня руки не оттуда растут. Собственно у меня получилось запустить простого эхо-бота скопировав все недостающие библиотеки в корень проекта.

Поскольку потратил много времени на решение задачи, опишу здесь примерно процедуру, вдруг еще какому нубу потребуется. Я решил эту задачу неграмотно, но это единственный способ как я смог это сделать.
1. Создание бота
2. Создание и настройка тестового проекта
3. Установка (копирование) всех недостающих библиотек
3.1. Вариант для ленивых
3.2. Полный вариант

1. Создание бота

Процесс создания бота неоднократно описан. Можно пройти до 17-го шага в этом описании или по моему переводу:
  • Обратитесь к боту @botfather https://telegram.me/botfather  с командой /newbot Убедитесь что говорите именно с нужным botfather, а не с пользователем с похожим ником.
  • @botfather ответит Alright, a new bot. How are we going to call it? Please choose a name for your bot.
  • Введите имя которое придумали (yournamebot)
  • @botfather ответит Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.
  • Введите любое уникальное имя бота. В конце должно присутствовать "bot". (YourNameBot)
  • Done! Congratulations on your new bot. You will find it at telegram.me/YourNameBot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands.  Use this token to access the HTTP API: 201682768:AAE9p_yr7I7Hx_alotofsybols  For a description of the Bot API, see this page: https://core.telegram.org/bots/api
  • Выпишите себе тот API key что получили.

2. Создание и настройка тестового проекта 

  • Желательно чтобы project name и project id совпадали (меньше путаницы)
  • Сразу можно скачать и установить Google App Engine SDK , а можно и не скачивать. Можно скачать PyCharm версию про (для начала триальную).  Одно другому не мешает. Для простоты поднятия тестового бота Вы можете просто скачать все библиотеки в этом архиве

3.1.  Установка из моего архива.

Если Вы решили просто скопировать файлы из архива (предупреждаю - библиотеки часто обновляются, версии в архиве скорее всего устарели, ну и там много лишнего):
  • распакуйте архив.
  • Измените файл app.yaml - application: yourbotname - укажите имя своего проекта в GAE.
  • Измените файл main.py - PasteYourTokenHere и PasteYourGAEProjectNameHere, укажите token полученный от  @botfather и имя проекта в GAE.
  • Запустите Google App Engine SDK
  • Add Existing Application
  • Проект появится в списке проектов
  • Запустите Deploy
  • потребуется авторизация на GAE, и проект должен будет запуститься
  • Заходим по ссылке https://PasteYourGAEProjectNameHere.appspot.com/set_webhook
  • должны получить webhook setup ok.
Можно посмотреть логи чтобы понять что не так (если что то не так) 

Там должно быть понятно по тексту если чего то не хватает для запуска.
Если все ок и тестовый бот заработал, то можно писать дальше своего бота, поздравляю.

3.2. Самостоятельная установка.

Вариант которым пришлось воспользоваться мне - чуть более длинный. По идее должен был заработать virtualenv из видеоинструкции, но у меня не заработал.
  • Запускаем Google App Engine SDK
  • Создаем в нем новый проект  New Application с наименованием нашего проекта в GAE. 
В app.yaml нужно дописать в конец:
- name: ssl
  version: "2.7"
Или другую актуальную версию библиотеки с https://cloud.google.com/appengine/docs/python/tools/libraries27

В main.py записать основной код, например:
#!/usr/bin/env python
import sys
import os
sys.path.append(os.path.join(os.path.abspath('.'), 'venv/Lib/site-packages'))
import telegram
from flask import Flask, request
app = Flask(__name__)
global bot
bot = telegram.Bot(token='PasteYourTokenHere')
@app.route('/HOOK', methods=['POST'])
def webhook_handler():
    if request.method == "POST":
        # retrieve the message in JSON and then transform it to Telegram object
        update = telegram.Update.de_json(request.get_json(force=True))
        chat_id = update.message.chat.id
        # Telegram understands UTF-8, so encode text for unicode compatibility
        text = update.message.text.encode('utf-8')
        # repeat the same message back (echo)
        bot.sendMessage(chat_id=chat_id, text=text)
    return 'ok'
@app.route('/set_webhook', methods=['GET', 'POST'])
def set_webhook():
    s = bot.setWebhook('https://PasteYourGAEProjectNameHere.appspot.com/HOOK')
    if s:
        return "webhook setup ok"
    else:
        return "webhook setup failed"
@app.route('/')
def index():
    return '.'

Подправив PasteYourGAEProjectNameHere и PasteYourTokenHere
создать текстовый файл requirements.txt   со следующим содержимым:
Flask>=0.10.1
python-telegram-bot>=2.5
Дальше в терминале перейти в папку с проектом, и установить библиотеки командой
pip install -t lib -r requirements.txt
Вот тут я уверен что я не прав, но ничего поделать не могу. Команда создаст папку lib и установит туда кучу библиотек. 
Если сейчас сделать Deploy в Google App Engine SDK, то в логах запущенного instance мы увидим ImportError: No module named telegram
Я смог с этим справиться только копируя все необходимые библиотеки в корень папки проекта (
А именно папки:
  • werkzeug
  • telegram
  • markupsafe
  • jinja2
  • future
  • flask
  • и файл itsdangerous.py
Теперь после Deploy можно зайти на https://PasteYourGAEProjectNameHere.appspot.com/set_webhook и мы должны увидеть webhook setup ok

Бот должен заработать.