«Переговорки»: панихида
Проект «Переговорки» — внутренний
Используется он теми, кто не может установить себе Outlook — ребятами с «Маками» и разнообразными «Линуксами» (а таких очень много). Кроме того, что от Exchange мы будем постепенно уходить, а интерфейс бронирования останется без изменений.
Никогда я ещё так не выкладывался, так не радовался, не расстраивался, не оставался с таким упорством допоздна в офисе. Звучит просто — вытаскивать время от времени данные из Exchange и отсылать обратно новую бронь. К сожалению, MS Exchange, который использовался тогда в компании, не умел общаться с внешним миром никак иначе, кроме протокола MAPI — бинарному исчадию ада, причём не просто через MAPI, а через так называемый MAPI через RPC — диалект
Помню, первое, что пришло на ум использовать — impacket, модуль для Python, который позволял работать с «сырыми» пакетами, но к нему не было документации, а примеров в сети нашлось всего ничего — несколько эксплоитов и только. Впрочем, разобраться
Из бесплатных библиотек уровнем повыше нашлась
Это и положило начало проекта «Переговорки».
Процедура компиляции оказалась весьма нетривиальной, собиралась только версия из транка, и та только с моими правками. Ещё сложнее оказалось разобраться с утилитами, которые требовалось запустить после исталляции, но и эту проблему удалось победить, собрав скудные крохи по форумам и написав несколько писем разработчикам. Позднее Сергей Белов сумел установить появившийся свежий
Через несколько дней после того как я в первый раз скомпилировал libmapi, тестовые утилиты на Си благополучно подключились к Exchange и уже умели отпределять дают им правильные данные для авторизации или нет. Эти несколько дней ушли на то, чтобы разобраться как создавать профиль, как настраивать библиотеку и Samba4 для работы и так далее. Оставалось
1275 строк основного модуля, 647 строк файла описаний структур MAPI, 4046 констант, 457 строк для описания
Ничего, пара дней корпения над бинарной распечаткой с последующими уточнениями в противоречивой документацией от Microsoft и я написал класс, который такие встречи умеет разбирать. Впрочем, это было уже позднее, а сначала надо было догадаться что делать после логина. Из документации у libmapi — только перечень функций и исходники на Си. Пришлось внимательно просматривать первое и читать второе. Тут нельзя не упомянуть Сергея Андрюхина, несколько очень ценных его идей и исследований вошли в тот код. Кстати, местами исходники на Си написаны так плохо, что приходилось упрощать код — не всё, что можно позволить себе в Си, можно позволить себе в менее шустром «Пайтоне».
Разобраться с порядком вызова этого великолепия было непросто, плюс ещё множество более мелких проблем, вроде странного формата хранения времени (Exchange хранит число минут с 1 января 1601 года). Плюс утечки libmapi, которые пришлось изолировать, решать проблему с передачей данных в родительский процесс, мучаться с Python 2.4, который, как оказалось, никогда не освобождает память, выделением памяти на куче «про запас» через Python API (спасибо ctypes), определением по косвенным признакам, что память закончилась, пора отдать данные в родительский и умереть, и так далее.
Сначала мы научились читать freebusy информацию — просто даты и время, когда переговорка
Класс пережил четыре рефакторинга, например, я обернул некоторые структуры классами с деструктором, чтобы было проще следить за памятью (так как ctypes работает с бинарным кодом за памятью приходилось следить самостоятельно), что, правда, всё равно не спасло от всех проблем — структуры, в некоторых случаях, нужно было уничтожать в строго определённом порядке.
Спасибо Саше Покатилову, который правил мой код, пока я был в отпуске и занимался
Наверняка я не помню ещё массу сложностей, которые мы решали, например, я совсем не рассказал как мы отправляли бронь встречи по протоколу SMTP, как долго я готовил разные версии письма
Думаю, если попробовать вспомнить всё, хватит на небольшую книгу… Я рад, что эту невероятную задачу удалось решить. С моей стороны, как мне кажется, это 100% моей «мощности» как программиста. Будущее покажет, но пока все задачи я буду оценивать по этой.
К счастью, в новом Exchange, который появился у нас в компании, появилась поддержка SOAP и «Переговорки» переделали с использованием этого протокола. Есть предварительное согласие на выкладывание модуля, который у меня тогда получился в интернет. Пожалуй, сейчас он бесполезен (хотя, может авторы libmapi запрограммируют на его примере чтение повторяющихся встреч, попробую им его кинуть), но пусть он всё равно полежит у меня, как памятник полугоду моей жизни.
Комментарии 31
А была возможность отказаться от него?
Обычный
Триллер года, однозначно ;)
Я, наверное, не совсем корректно выразился. У нас КАЖДАЯ переговорка в каждом офисе по всему миру имеет собственный контакт в аутлуке. Соответственно в аутлуке в любой момент можно посмотреть бронирование любой переговорки по всему миру, и кто ее забронировал.
Я поофтоплю.
Надо выбрать дни рождения пользователей с сегодня и в течении недели.
В базе ( mysql 5 ) хранится дата рождения пользователя (с годом).
Я делаю выборку по номер дня в году дня рождения больше сегодняшней даты и меньше сегодняшней даты + неделя.
Проблема возникает когда получается пограничное состояние: 28 декабря — 4 января.
То есть 363 день меньше чем 4.
Я сделал запрос который выбирает как бы дни рождений, но он жуток: http://paste.ubuntu.com/348139/
А есть ли
DATEFORMAT( ADDDATE(CURDATE()), '%c%e'), INTERVAL 2 DAY)
мускул это должен заоптимизировать и вычислить один раз. Хороший вариант, спасибо (завтра перепишу за пару минут наверное), но интересно мне как бы это можно было сделать красиво.
У нас так же.
Ты уж, Женя, прости, но у нас — далеко не супер айти компании — проблем таких никогда не было — переговорки бронируются через Эксчендж без всяких проблем, задержек во времени нет. Как? Хз :) Спросить у админов надо.
Переговорок — по
У меня ощущение что вы сами придумали проблему :)
Кроме того, от Exchange потихоньку будем избавляться. Он уйдёт, а интерфейс бронирования останется.
Дописал второй абзац для тех, кто ленится сходить по первой ссылке.
Странно, через owa можно бронировать что угодно и откуда угодно — мак, линукс. Тот же
По ссылке сходил, не осознал необходимости делать отдельный интерфейс. Ну честно.
Это не ты мне звонил 15 минут назад? Для Мака ничего не было, когда мы летом этот проект запускали. OWA нормально работает только в IE (или работал в Exchange 2004, который мы использовали), да и я уже написал — есть потребность вообще отказаться от Exchange.
Да вы не злитесь, Болк! Возьмите ка отпуск на 2 дня!
я, я звонил :)
шумно у вас, корпоративка :)
Так я и не злюсь, вон allbefine мне звонил, подтвердит.
Да, да, не злишься :)
Особенно смешно было запустить яндекс и написать запрос «яндекс офис телефон» :)
А чего
Но имхо можно было уже после 5 недель секса с Exchange задуматься, может есть альтернативные решения — купить, например, новый exchange. Чисто экономически это было не выгодно для компании:
1. Затрата на программиста — зп + налоги * 6 месяцев будет явно выше чем новая версия exchange.
2. Было затрачено много времени и сил на Технологию Прошлого. Весь experience с MAPI и старым exchange'ом можно уже забыть как страшный сон.
Это, кстати, класcика ошибки management'a, которая должна была быть исправлена уже в середине цикла. Я бы выпорол руководителя проекта за это… А вот твоя заслуга тут бесспорно огромна и выложился ты действительно на все 100%. Снимаем шляпы, господа комментаторы!