UTMTray альтернатива

Технические вопросы по UTM 5.0
Ответить
Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

UTMTray альтернатива

Сообщение Kayfolom »

Повозившись с родной утилитой и поняв что из нее ничего не выжать полезного, решил написать альтернативу.
Выбрал Delphi - лучше знаю и писать не напряжно.
Так как URFA-клиент мне не по карману, в качестве инструмента доступа к ядру билинга выбрал веб-морду утм.
Что сделано:
Написан класс для работы с веб-мордой. Для экономия времени на парсинг, снижения нагрузки на апач и экономию трафика переработаны basic.xslt и *.xml до состояния при котором ответы апача выглядят примерно так:

Код: Выделить всё

<TD>M_ID</TD>
<TD>1</TD>
</TR><TR>
<TD>M_LOGIN</TD>
<TD>kayfolom</TD>
</TR><TR>
<TD>M_BASIC_ACCOUNT</TD>
<TD>1</TD>
</TR><TR>
<TD>M_BASIC_ACCOUNT_BALANCE</TD>
<TD>-7343.42</TD>
</TR><TR>
<TD>M_BASIC_ACCOUNT_CREDIT</TD>
<TD>10000.00</TD>
</TR>
Т.е. убраны все html и прочие тэги.
Клас умеет все то что умеет веб-интерфейс билинга. Секция public выглядит вот так:

Код: Выделить всё

  public
    &#123; Public declarations &#125;
    Login &#58; String;
    Password &#58; String;
    ConnectError &#58; String;
    WebSessionTimeout &#58; Integer; 
    HTTPURL &#58; String;
    HTTPPort &#58; Integer;
    RefreshPeriod &#58; Integer;
    Busy &#58; Boolean;
    LogFile &#58; String;
    LogRotate &#58; Boolean;
    DebugLevel &#58; Integer;
    Constructor Create;
    Destructor Destroy;
    Function Connect &#58; Boolean;
    Function Ping&#40;Reconnect &#58; Boolean&#41; &#58; Integer;
    Function CheckOnline &#58; Boolean;

    Function GetUser_Reports &#58; String;
    Function GetUserReportsInfo &#58;  TUserReport;
    Function GetInternetStatus &#58; Boolean;
    Function SetIntetnetInvert &#58; Boolean;

    Function GetBalanceByAccountsCount &#58; Integer;
    Function GetBalanceByAccounts&#40;Index &#58; Integer&#41; &#58; TBalanceByAccounts;

    Function GetServicesCount &#58; Integer;
    Function GetService&#40;Index &#58; Integer&#41; &#58; TService;

    Function GetServiceLink&#40;Index &#58; Integer&#41; &#58; String;
    Function GetServiceInfo&#40;Link &#58; String&#41; &#58; String;

    Function GetServiceInfoDownloadedCount &#58; Integer;
    Function GetServiceInfoDownloaded&#40;Index &#58; Integer&#41; &#58; TServiceInfoDownloaded;

    Function GetServicesInfoIPCount &#58; Integer;
    Function GetServiceInfoIP&#40;Index &#58; Integer&#41; &#58; String;
    Function GetServicesInfoBorderCount &#58; Integer;
    Function GetServiceInfoBorder&#40;Index &#58; Integer&#41; &#58; TBorderTraficClass;
    Function GetServicesInfoPrepaidCount &#58; Integer;
    Function GetServiceInfoPrepaid&#40;Index &#58; Integer&#41; &#58; TTraficClassCount;

    Function GetPayments&#40;DateStart, DateEnd &#58; TDateTime&#41; &#58; Integer;
    Function GetPayment&#40;Index &#58; Integer&#41; &#58;  TPayments;

    Function GetMessages&#40;DateStart, DateEnd &#58; TDateTime&#41; &#58; Integer;
    Function GetMessage&#40;Index &#58; Integer&#41; &#58;  TMessage;

    Function GetTrafficReportCount&#40;DateStart, DateEnd &#58; TDateTime&#41; &#58; Integer;
    Function GetTrafficReport&#40;Index &#58; Integer&#41; &#58;  TTrafficReport;

    Function PaymentCard&#40;Account, Card_Number, Card_PIN &#58; String&#41; &#58; TPaymentResult;
    Function SentMessage&#40;Subject,MessageText &#58; String&#41; &#58; Boolean;

    Function ChangePassword&#40;NewPassword,OldPassword &#58; String&#41; &#58; Boolean;
    Procedure Log&#40;Msg &#58; String&#41;;
  end;
На базе класса написана утилита UTMTray. Идея организации интерфейса с благодарностью слизана у уважаемого Магнума (отдельное спасибо - ибо с интерфейсами у меня пожизненный напряг )

Логика работы утилиты следующая:
При запуске утилита читает свои настройки из рееста (логин и пароль если есть, MainURL (пишеться в реестр при инсталяции)).
В месте куда указывает MainURL (в моем случае это https://10.0.0.100/utmtray/) утилита ищет RemoteINI в следующей последовательности:
IPадрес_компа.ini (перебирает все имеющиеся у компа IP)
логин.ini
default.ini
Разные INI сделаны для того чтоб можно было конкретному компьютеру(или компьютерам аккаунта) подсунуть персональный ini - с разным уровнем отладки, разными серверами (для балансировки нагрузки к примеру)
Удаленный INI имеет вид:

Код: Выделить всё

&#91;Options&#93;
HTTPNativeURL=https&#58;//10.0.0.100/cgi-bin/auto/
HTTPAlterNativeURL=https&#58;//10.0.0.100/auto/
HTTPNativePort=443
HTTPAlterNativePort=443
WebSessionTimeout=500
WebSessionTimeoutMin=100
WebSessionTimeoutMin=60000
RefreshTime=120000

&#91;Debug&#93;
LogFile=utmtray.log
LogRotate=True
DebugLevel=2
SMTPServer=10.0.0.9
SMTPPort=25

&#91;EchoRequest&#93;
Enable=true
Port=12345
AllowIP=10.0.0.25;10.0.0.51

&#91;EchoRequestSecure&#93;
Enable=true
Port=1234
AllowIP=10.0.0.100

&#91;Application&#93;
AppName=UTMTray ООО "Ухта-Информ" Default Config

&#91;HttpResource&#93;
BillingPortal=https&#58;//10.0.0.100/cgi-bin/utm5/aaa5
MainPortal=http&#58;//www.flint.net
NewsPortal=http&#58;//www.flint.net/index.php?option=com_content&task=blogcategory&id=0&Itemid=8
GamesPortnal01=http&#58;//games.flint.net
GamesPortnal02=http&#58;//wow.flint.net

&#91;HttpResourceDescription&#93;
BillingPortal=Личный кабинет
MainPortal=Главный сайт сети
NewsPortal=Новости
GamesPortnal01=Игровые сервисы сети
GamesPortnal02=Сервер World of Warcraft
Как видно из конфига, утилите подсовываются все нужные параметры вплоть до заголовка программы (перечень передаваемых параметров в стадии добавления - придумываю по ходу дела). На пользователя ложиться только обязанность по вбиванию логина и пароля.
При первом запуске пользователью стразу всплывает диалог ввода логина и пароля, тоже самое происходит при отключенной опции "Сохранять пароль" - это по просьбам клиентов с детьми-любителями посмотреть порнуху в инете пока папа на работе, чтоб папе потом не приходилось лезть в менюшки, вбивать пароль и наблюдать ошибку сохранения как в родной утилите.

В данный момент дописываю интерфейс...
Столкнулся с диллемой новостной вкладки - или брать с сервера подготовленную html c новостями (что для меня проще) или пользовать RSS (что честно говоря меня ломает). Написал оба варианта, но в RSS еще не сделал тэговую обертку для красивого отображения.
Следующим этапом будет прикручивание к утилите умения ставить кредиты и перекидывать деньги с клиента на клиента - но для этого нужен код на php для работы с консольной админкой и utm5_payment_tool. Здесь загвоздка - php я читаю, но писать не могу ;) Вернее могу, но на уровне студента 3 курса. А так как код должен отвечать повышенным требованиям безопастности и надежности, то плодить уродство я не хочу, попрошу специалиста, если найду такового.

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Еще добавлю...
Класс пока умеет делать не все отчеты из веб интерфеса (убрал не нужное мне лично). Но по желанию могу добавить (там 5 строк когда на базе готового парсера).

В утилите предуспотрел возможность 2-х UDP-автоответчиков:
1. "Ты жив?" - "Да, я жив."
2. "Ты действительно Вася?" - "Да, это Вася" (в ответном пакете необратимый хеш логина-пароля)

Уровней логирования 3 штуки
1. Нет логов
2. Ошибки и необходимый уровень
3. Все что получаю с сервера и отсылаю на сервер, ошибки, коннекты.
Предусмотрена отсылка (по нажатию кнопки пользователем) логов на SMTP для (еще не реализовано)
Также будет вестись отдельный лог динамики Баланса и Трафика с контрольными суммами в каждой строке (чтоб пользователь не мог их править) - для аргументации в спорных ситуациях.

Также думаю в удаленный конфиг включить видимость элементов интерфейса утилиты - чтоб не нужные вкладки и контроллы отключать.

После облизывания и тестирования готов предоставить продукт для всеобщего пользования. Если конечно он кому то понадобиться.
Могу выложить на тестирование текущий вариант.
Хотелось бы услышать мнения. Я двигаюсь в правильном направлении или впал в маразм? ;)

Pulse
Сообщения: 945
Зарегистрирован: Вт окт 03, 2006 12:58

Сообщение Pulse »

мы думали про такую штуку, но времени не хватает на такую разработку... насколько она привязана к вебу? насколько будет сложно её переписать под урфуклиент?

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Pulse писал(а):мы думали про такую штуку, но времени не хватает на такую разработку... насколько она привязана к вебу? насколько будет сложно её переписать под урфуклиент?
К вебу она привязана только методами класса TUTMTray = class(TObject), к примеру:
Function GetServicesCount : Integer;
Function GetService(Index : Integer) : TService;
Где TService:
TService=Record
Id : Integer;
ServiceType : String;
ServiceName : String;
TarifName : String;
AccountingPeriodStart : TDateTime;
AccountingPeriodEnd : TDateTime;
PeriodicCost : Currency;
PeriodicCostPayed : Currency;
end;

Источник получения инфы может быть в принципе любой.

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Вот скрины текущего варианта. Много чего еще не успел накидать на формы, но родную утилитку уже перекрывает полностью

Изображение

Изображение

Изображение

Pulse
Сообщения: 945
Зарегистрирован: Вт окт 03, 2006 12:58

Сообщение Pulse »

могу чонить накодить на php... только через пару недель :) отпуск...

Аватара пользователя
Ata-man
Сообщения: 427
Зарегистрирован: Пт янв 21, 2005 10:04
Откуда: Екатеринбург

Сообщение Ata-man »

Отличная новость! :D

У нас в сети Нетаповский wintray не работает, т.к. заблокирован доступ к портам 12758 и 11758 (из соображений безопасности). А такой вариант устроил бы всех - и администраторов и клиентов :)

Единственное "НО" - как для всех костылей, придется после выхода новой версии UTM проверять ее на совместимость с утилитой :)

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Ata-man писал(а):Отличная новость! :D

У нас в сети Нетаповский wintray не работает, т.к. заблокирован доступ к портам 12758 и 11758 (из соображений безопасности). А такой вариант устроил бы всех - и администраторов и клиентов :)

Единственное "НО" - как для всех костылей, придется после выхода новой версии UTM проверять ее на совместимость с утилитой :)
Ну с совместимостью думаю проблем не будет. Она же работает через aaa5 и user5. Конечно если только в 006 веб-интерфейс будет совместим с ядром. ;)

Аватара пользователя
Chris
Сообщения: 2323
Зарегистрирован: Чт июн 02, 2005 14:08
Откуда: 33 76 77 71 86 37 98

Сообщение Chris »

МОЛОДЦЫ РЕБЯТА!!!! Давайте!

Аватара пользователя
XoRe
Сообщения: 458
Зарегистрирован: Ср янв 10, 2007 16:04

Сообщение XoRe »

Кстати можно на сервере держать 2 папки с веб интерфейсом.
Один для юзеров, другой (переделанный) для программы.
Можно даже сделать у второй веб морды авторизацию средствами веб сервера.
Чтоб только программа имела туда доступ.
Чтобы оградить не в меру любознательных юзеров от лазания в измененной веб морде.
Конечно от шарящих людей не спасет, но 99,99% отбреет)

AndrewE
Сообщения: 230
Зарегистрирован: Пн июл 17, 2006 07:38

Сообщение AndrewE »

В OpenSource проект будете выкладывать?

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

XoRe писал(а):Кстати можно на сервере держать 2 папки с веб интерфейсом.
Один для юзеров, другой (переделанный) для программы.
Можно даже сделать у второй веб морды авторизацию средствами веб сервера.
Чтоб только программа имела туда доступ.
Чтобы оградить не в меру любознательных юзеров от лазания в измененной веб морде.
Конечно от шарящих людей не спасет, но 99,99% отбреет)
Так и сделано.
В удаленном конфиге
[Options]
HTTPNativeURL=https://10.0.0.100/cgi-bin/auto/ //веб для программы
[HttpResource]
BillingPortal=https://10.0.0.100/cgi-bin/utm5/aaa5 //веб для человека

Через веб программы залогиниться невозможно - там просто нет формы ввода логина и пароля.
К томуже через удаленный конфиг можно менять урл и порт - чтоб было загадочней ;)

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

AndrewE писал(а):В OpenSource проект будете выкладывать?
Посмотрим. ;) Большой соблазн продавать по $1500, причем за 1 копию, да еще без техподдержки и документации. Думаю уже все привыкли к таким условиям ;)
Конечно шучу. Если не стыдно будет за итоговый код,то постараюсь выложить.

Аватара пользователя
ds
Сообщения: 380
Зарегистрирован: Пн сен 18, 2006 14:06

Сообщение ds »

А вот мой вариант трея:

Изображение
Изображение
Изображение

Изображение


Работает напрямую с биллингом. Пока реализовал только вкладки со скрином, нет времени пока заниматься. Последний скрин вылазит при запуске, если пароль не сохраняется.

Время появится, займусь доработкой, в принципе можно реализовать любую функцию из urfa.

PS Написана на builder6 + indy9

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

2ds:
Тоже пользую Indy, может посоветуешь хороший VCL для винтеря с поддержкой baloon? А то я уже лет 10 не писал интерфейсы, отстал от жизни...
И вопрос: Напрямую с билинго через как? Расшифрованные функции URFA или URFA-клиент?

Ответить