вторник, 12 апреля 2011 г.

ManageEngine ServiceDesk. Расширяем функционал.

Прошло некоторое время после моего поста "Error 2004: Can't create TCP/IP socket (10106)" - решение небольшой проблемы с которой я столкнулся во время изучения возможности расширения функциональности программного продукта ServiceDesk Plus от компании ManageEngine. SDP является коробочной версией, поэтому вносить изменения в исходный код не представляется возможным. 
Нигде на форумах я не встретил ответа на мой вопрос - пришлось разбираться самому. Через конфигурационные файлы, которые доступны для редактирования, добился чтобы выполнялись CGI-скрипты через скриптовый язык python.
Ну дальше дело техники - чтение документации: по модулям cgi в Python, jQueryUI для создания красивых web-интерфейсов наших страничек, mysql для закрепления знаний по базам данных.
Хорошо, для работы с пользователем, получаем его сессию из cookie. Проверяем полученную сессию на открытость и принадлежность к пользователю - во избежания работы с нашей страницей без SDP авторизации.
mas = re.search( 'JSESSIONIDSSO=([0-9a-f]{32})', os.environ[ 'HTTP_COOKIE' ], re.I )
cur.execute( "select s.* from aaaaccsession s, aaaacchttpsession h where h.sso_id = '%s' and h.SESSION_ID = s.session_id" % mas.group( 1 ) )
( session_id, account_id, user_host, application_host, opentime, closetime, status ) = cur.fetchone( )
cur.execute( "select u.first_name, l.name, l.login_id, u.user_id from aaaaccount a, aaalogin l, aaauser u where a.account_id = %s and a.login_id = l.login_id and u.user_id = l.user_id", account_id )
( first_name, login_name, login_id, user_id ) = cur.fetchone( )
Ну а дальше можно делать и автоматизацию некоторых рутинных действий, так например, специалисты нашего отдела обязаны регистрировать все телефонные обращения. Выполнялось это через специальный шаблон, который нужно было заполнять во время ответа на звонок и закрывать по окончанию. С помощью нашего расширения мы создаем и закрываем заявки по одному нажатию кнопки мыши.

Создание заявки:
$.post( "/WorkOrder.do", {
"FORMNAME": "WorkOrderForm",
"FROM": "INLINE",
"MOD_IND": "WorkOrder",
"UDF_CHAR1": "",
"UDF_CHAR2": "",
"UDF_CHAR4": "",
"UDF_CHAR5": "",
"addWO": "addWO",
"category": "",
"contactNumber": "",
"description": "",
"group": "",
"impact": "",
"jobTitle": "",
"level": "",
"location": "",
"reqID": "",
"reqName": "",
"reqTemplate": "",
"requestServiceId": "",
"requestType": "",
"resolution": "",
"resourceModified": "false",
"resourcesInfo": "",
"siteID": "0",
"status": "1",
"subCategory": "",
"technician": "",
"templateSite": "null",
"title": "",
"workstationID": "0"
} );
 Закрытие заявки:
$.post( "/AddResolution.do", {
"FORMNAME": "addResolutionForm",
"MOD_IND": "WorkOrder",
"addResolutionButton": "Сохранить",
"cost": "0.0",
"costperhour": "0.0",
"description": "",
"executedTime": "",
"requestID": "",
"resolution": "",
"technicianID": "",
"timeSpent": "true",
"woStatus": "4",
"workHours": "",
"workMinutes": ""
} );
Описание полей не выкладываю и так понятно по названию...
Второе действие, которое можно автоматизировать - сброс пароля для учетной записи active direcory с созданием заявки через другой специальный шаблон, предназначенный для контроля такого типа операций.


Количество задач, которые можно выполнять таким образом бесконечно большое, поэтому автоматизируя рутинные операции мы упрощаем жизнь и себе, и своим коллегам.

2 комментария:

  1. А чем не устроил штатный api?

    ОтветитьУдалить
  2. Штатный АПИ очень скудный по функционалу, и необходимо либо генерировать ключ для работы с ним, либо постоянно передавать логин/пароль для выполнения операций. Данной заметкой я хотел продемонстрировать возможность расширить и подогнать СДП под свои определенные задачи.

    ОтветитьУдалить