Перейти к содержимому
Калькуляторы

delta_billing

Пользователи
  • Публикации

    29
  • Зарегистрирован

  • Посещение

Все публикации пользователя delta_billing


  1. почему вы так думаете и в чём именно заключается проблема? Каждый свое дело делает сам ессно. Но при таком количестве клиентов можно уже заключить договор на эксклюзивную поддержку любого программного продукта, биллинга или еще чего-то, написанием которого занимается группа программистов в пределах договора и выполняет определенные работы в определенные сроки. А не сидит сисадмин и ковыряя в носу пишет на барсике какую-то поделку. Это спецы другого класса, софт другого класса. Если ваш сисадмин говорит что он крутой програмер и одновременно крутой сетевик, цискарь и т.д. и т.п. - отправьте его разговаривать с зеркалом. Крутой кто-то даже крутым геймером быть параллельно не может. Потому что настоящий профессионал 100% рабочего и, возможно, часть нерабочего времени занимается своей областью и только ей. Спец в 2-х областях должен тратить 200% своего времени. И т.д. Это не я придумал, это жизнь такая. Каждая из затрагиваемых при поддержании провайдерской сети задач очень объемна и "текуча". В пределах нескольких тысяч пользователей это еще терпимо, но дальше требуется профессиональное знание по оптимизации сырцекода, работы с бд и т.д. Как и знание рутеров, будь то циска или фря. Иначе вы получите кластер из 4-х ядерных суперсерверов с загрузкой 100%. Ну как-то так. Были у нас тут такие програмисты... Очень важные и крутые ;-) Я ржу до сих пор, когда им объяснял -- сначала на словах, потом на пальцах что такое транкгруппы и с чем их едят. А так да, воистину, "спецы другого класса", не ровня нам колхозникам ;-))) Сисадмина, который ковыряет в носу надо гнать с работы. Впрочем, любого, кто не отбивает бабло, на него затраченное. Видимо, в России это простое правило не работает. Остальные перлы -- бред. Включая про цискаря. Если вам сие не дано -- не надо по себе мерить других ;-)))
  2. Да. Именно так и создавалась наша программа -- с учетом реально больших нагрузок. Что было ДО -- больше годилось как красивая демонстрашка, не более того. Тестовый. Жалко что-ли?
  3. [ Если на файловой системе правильно раздать права, никто пропатчить ваш скрипт не сможет в принципе, если конечно web-сервер не от root запущен. Причем относится это не только к php, но и к tcl/tk и любым другим языкам используемым в подобных условиях. Еще раз, безопасность должна быть на всех уровнях! ] Так было сделано изначально. Заодно, переписали сервер статистики -- убрали пароль юзера из url, переделали логику движка и т.д. http://billingdelta.ru/lite/faq.html#37 Там же еще парочка тестовых логинов. Можно потестить.
  4. Читать надо уметь ;-) Если влом читать и разбираться с кодом -- просто запустить и посмотреть результат.
  5. Это очень легко убрать, пока никто особо не жаловался. К тому-же, как я уже говорил, это проблема пользователей а не комании. Нефиг свои пароли раздавать всем подряд ;-)
  6. Я взял ваши get`ы и скормил серверу. И что произошло, кроме того, что выдало ошибку в некоторых случаях? А что еще должно быть выдать? Все входящие переменые проверяет функция, которая прежде всего, защищает сервер баз данных от возможности пихануть в него левый SQL запрос. Удаляются опасные символы: кавычки, скобки, точка с запятой и пр. а также, любые инструкции SQL. Главное -- защита БД! А то, что пользователь получит ошибку если зафигачит кривой get -- так то его проблемы. В нормальном случае (если не хакерить) этого обычно не происходит. Второй барьер защиты -- все скрипты работают с БД под опеределнным пользоватем с `хитрыми` правами. В любом случае, нанести сильный вред от имени этого пользователя не получится. Пароль `sa` хранится только в моей голове и при нормальной работе системы эта учетная запись вообще не используется. По поводу автоматического управления станцией. Да, поддерживается. Включение/выключение устройств, управление набором услуг ДВО для телефонии (опеределитель, межгород, переадресация и т.д.) Достаточно просто выписать и выполнить наряд и устройство получит/отключит доп. услугу. Циски управляются по SNMP для терминирования активных сессий диалапа, PPPoe и IP телефонии. Для статиков (выделенщики кредитники со статическим внешним IP-ом) управление осуществляется с помощью эмуляции скриптом telnet сессии для конфигурации циски. При отключении за неуплату / при оплате управление состоянием устройства выполняется автоматически (у нас мало персонала, некому руками включать/выключать). Сейчас готовится раздел в `Вопросах и Ответах` где подробно описано как это делается. Пока постараюсь в двух словах. Есть в базе интерфейсная таблица (очередь), куда пишутся задания роботам (например `включить номер`) . Роботы сканируют таблицу и выполняют требуемые операции с оборудованием. Робот, также, анализирует ошибки обработки и пишет в таблицу в запись о задании результат его обработки, что позволяет станционным инженерам отслеживать ошибки.
  7. Согласен. Однако у них в договоре прописано, что всю ответсвенность они несут сами. В крайнем случае, мы найдем, кто стырил пароль т.к. MAC тоже пишется radius log. Есть еще защита такая: мы авторизуем еще и по сочетанию МАКушника абонента и вилана который под его сегмент сети. (это включается по требованию абонента) посему под ним никто не зайдет ;-)
  8. А накой оно нужно? Если интерфейс админа переписать на php - можно в логи писать кто куда заходил и что делал, а заодно избавиться от акцеса, как от пороховой бочки, которая рано или поздно все завалит. И от винды с сервером sql. U Интерфейс не должен вообще никуда ничего писать, и уж тем более, отвечать за безопасность! Такими мерьезными вещами должна заниматься только СУБД. Хотя-бы потому, что скрипт на php (php сам по себе весь дырявый в плане безопасности о чем можно судить по количеству взломанных сайтов) может каким-то образом пропатчить злоумышленник и тогда уж точно ничего никуда писаться не будет. Альтернатива php -- tcl/tk 8.4 Да, весь личный кабинет -- это всего навсего 1 файлик размером около 32 кбайт и 1 гиф с баннером вверху. Верите-нет, пока не взрывается. Причем у нас часть юзеров сидит под Access 2k а часть под A97. Тоже касается MS SQL. Уж чего с ним тут только не было -- и диски дохли, и инвертора горели а он живой назло всему ;-)
  9. [ http://pgfoundry.org/projects/tablelog/ - модуль к постгресу. Правда, использует триггер. ] Сначала не заметил, затем прочитал -- оборжался ;-) Модуль да еще и треггер надо... И диктора Центрального телевидения за кадром ;-))) Вот с помощью этой простой весчи сделан аудит на требуемые таблицы БД. ============================= Cut ======================================================== CREATE PROCEDURE sp_create_audit_trigger @tabname nvarchar (50), @mode int AS /* АСР "ДЕЛЬТА" Процедура создает триггер аудита на заданную таблицу базы данных. Данные выводятся в таблицу audit текущей БД. После выполнения процедуры триггер начинает работать немедленно. Обязательное условие: первое поле в аудируемой таблице должно быть ключевым! Таблица audit также должна быть доступна в базе данных и на нее на INSERT должны быть открыты права _всем_ пользователям. Параметры: @tabname Имя таблицы, на которую надо установить аудит. @mode Режим: 1 - Создать (обновить) триггер. 3 - Удалить триггер. */ DECLARE @action_type int, @obj_id bigint, @obj_name varchar(32), @hostname varchar(32), @a nvarchar (512), @id bigint, @col nvarchar (32), @xtype int, @stype nvarchar (32), @ltype int, @p int, @strSQL nvarchar (512), @debug_sql int, /* тело триггера и переменные */ @open_trigger_sql nvarchar (4000), @close_trigger_sql nvarchar (4000), @close_trigger_sql1 nvarchar (4000), @close_trigger_sql2 nvarchar (4000), @ins_variable_sql nvarchar (4000), @del_variable_sql nvarchar (4000), @variable1_sql nvarchar (4000), @variable2_sql nvarchar (4000), @first_column_sql nvarchar (32), /* UPDATE */ @insert1_sql nvarchar (4000), @insert2_sql nvarchar (4000), @insert3_sql nvarchar (4000), @insert4_sql nvarchar (4000), /* INSERT */ @insert5_sql nvarchar (4000), @insert6_sql nvarchar (4000), @insert7_sql nvarchar (4000), @insert8_sql nvarchar (4000), /* DELETE */ @insert9_sql nvarchar (4000), @insert10_sql nvarchar (4000), @insert11_sql nvarchar (4000), @insert12_sql nvarchar (4000) /* 1- вывести SQL скрипт на экран 0 - выполнить скрипт */ SET @debug_sql = 0 /* cчетчик столбцов таблицы */ SET @p = 0 SET @ins_variable_sql = '' SET @del_variable_sql = '' SET @variable1_sql = '' SET @variable2_sql = '' SET @insert1_sql = '' SET @insert2_sql = '' SET @insert3_sql = '' SET @insert4_sql = '' SET @insert5_sql = '' SET @insert6_sql = '' SET @insert7_sql = '' SET @insert8_sql = '' SET @insert9_sql = '' SET @insert10_sql = '' SET @insert11_sql = '' SET @insert12_sql = '' /* получение ID объекта базы данных */ SET @strSQL = NULL SELECT @id = id, @strSQL = name FROM sysobjects WHERE name = @tabname IF @strSQL = NULL BEGIN RAISERROR ( ' Не найдена исходная таблица в базе данных MAIN! ', 16, 1) RETURN END DECLARE CurFt CURSOR FOR SELECT name, xtype, length FROM syscolumns WHERE id = @id order by colid OPEN CurFt WHILE 1 = 1 BEGIN FETCH FROM CurFt INTO @col, @xtype, @ltype IF @@fetch_status=-1 BREAK; IF @@fetch_status=-2 CONTINUE; IF @p > 0 BEGIN SET @ins_variable_sql = @ins_variable_sql + ', ' SET @del_variable_sql = @del_variable_sql + ', ' SET @variable1_sql = @variable1_sql + ', ' SET @variable2_sql = @variable2_sql + ', ' END ELSE SET @first_column_sql = @col /* первое поле таблицы должно быть ключевое поле! */ /* получение типа данных поля исходной таблицы */ SELECT @stype = CASE name WHEN 'sysname' THEN 'nvarchar (' + LTRIM(RTRIM(STR(@ltype))) + ')' WHEN 'varchar' THEN 'nvarchar (' + LTRIM(RTRIM(STR(@ltype))) + ')' WHEN 'char' THEN 'nvarchar (' + LTRIM(RTRIM(STR(@ltype))) + ')' ELSE name END FROM systypes WHERE xtype = @xtype /* формирование SQL для переменных */ SET @ins_variable_sql = @ins_variable_sql + '@fi' + LTRIM(RTRIM(STR(@p))) + ' ' + @stype SET @del_variable_sql = @del_variable_sql + '@fd' + LTRIM(RTRIM(STR(@p))) + ' ' + @stype SET @variable1_sql = @variable1_sql + '@fd' + LTRIM(RTRIM(STR(@p))) SET @variable2_sql = @variable2_sql + '@fi' + LTRIM(RTRIM(STR(@p))) /* формирование SQL для записи в таблицу аудит - UPDATE */ IF @p BETWEEN 0 AND 10 SET @insert1_sql = @insert1_sql + 'IF (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' != @fd' + LTRIM(RTRIM(STR(@p))) + ') INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fi0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' IF @p BETWEEN 11 AND 22 SET @insert2_sql = @insert2_sql + 'IF (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' != @fd' + LTRIM(RTRIM(STR(@p))) + ') INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fi0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' IF @p BETWEEN 23 AND 33 SET @insert3_sql = @insert3_sql + 'IF (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' != @fd' + LTRIM(RTRIM(STR(@p))) + ') INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fi0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' IF @p BETWEEN 34 AND 48 SET @insert4_sql = @insert4_sql + ' IF (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' != @fd' + LTRIM(RTRIM(STR(@p))) + ') INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fi0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' /* формирование SQL для записи в таблицу аудит - INSERT */ IF @p BETWEEN 0 AND 10 SET @insert5_sql = @insert5_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, NULL, @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' IF @p BETWEEN 11 AND 22 SET @insert6_sql = @insert6_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, NULL, @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' IF @p BETWEEN 23 AND 33 SET @insert7_sql = @insert7_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, NULL, @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' IF @p BETWEEN 37 AND 48 SET @insert8_sql = @insert8_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, NULL, @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' /* формирование SQL для записи в таблицу аудит - DELETE */ IF @p BETWEEN 0 AND 10 SET @insert9_sql = @insert9_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', NULL ) ' IF @p BETWEEN 11 AND 24 SET @insert10_sql = @insert10_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', NULL ) ' IF @p BETWEEN 25 AND 36 SET @insert11_sql = @insert11_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', NULL ) ' IF @p BETWEEN 37 AND 48 SET @insert12_sql = @insert12_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', NULL ) ' SET @p = @p + 1 END DEALLOCATE CurFt /* SQL скрипт триггера */ SET @open_trigger_sql = ' CREATE TRIGGER audit_' + LTRIM(RTRIM(@tabname)) + ' ON ' + LTRIM(RTRIM(@tabname)) + ' FOR INSERT, UPDATE, DELETE AS BEGIN SET NOCOUNT ON DECLARE @action_type int, @tran_id bigint DECLARE ' + @ins_variable_sql + ', ' + @del_variable_sql + ' SELECT TOP 1 @tran_id = req_transactionID FROM master..syslockinfo (nolock) WHERE req_spid = @@spid and req_transactionID <> 0 IF EXISTS(SELECT * FROM INSERTED) BEGIN IF EXISTS(SELECT * FROM DELETED) SET @action_type = 2 /* UPDATE */ ELSE SET @action_type = 1 /* INSERT */ END ELSE SET @action_type = 3 /* DELETE */ IF @action_type = 2 BEGIN DECLARE CurUpd_' + @tabname + ' CURSOR FOR SELECT * FROM deleted D, inserted I WHERE D.' + LTRIM(RTRIM(@first_column_sql)) + ' = I.' + LTRIM(RTRIM(@first_column_sql)) + ' OPEN CurUpd_' + @tabname + ' WHILE 1 = 1 BEGIN FETCH FROM CurUpd_' + @tabname + ' INTO ' + @variable1_sql + ', ' + @variable2_sql + ' IF @@fetch_status=-1 BREAK; IF @@fetch_status=-2 CONTINUE; ' SET @close_trigger_sql = ' END CLOSE CurUpd_' + @tabname + ' DEALLOCATE CurUpd_' + @tabname + ' END IF @action_type = 1 BEGIN DECLARE CurIns_' + @tabname + ' CURSOR FOR SELECT * FROM inserted OPEN CurIns_' + @tabname + ' WHILE 1 = 1 BEGIN FETCH FROM CurIns_' + @tabname + ' INTO ' + @variable2_sql + ' IF @@fetch_status=-1 BREAK; IF @@fetch_status=-2 CONTINUE; ' SET @close_trigger_sql1 = ' END CLOSE CurIns_' + @tabname + ' DEALLOCATE CurIns_' + @tabname + ' END IF @action_type = 3 BEGIN DECLARE CurDel_' + @tabname + ' CURSOR FOR SELECT * FROM deleted OPEN CurDel_' + @tabname + ' WHILE 1 = 1 BEGIN FETCH FROM CurDel_' + @tabname + ' INTO ' + @variable1_sql + ' IF @@fetch_status=-1 BREAK; IF @@fetch_status=-2 CONTINUE; ' SET @close_trigger_sql2 = ' END CLOSE CurDel_' + @tabname + ' DEALLOCATE CurDel_' + @tabname + ' END END ' /* Удаление тариггера */ SET @obj_name = NULL SELECT @obj_name = name FROM sysobjects WHERE name = 'audit_'+ @tabname IF @obj_name != NULL BEGIN SET @strSQL = 'DROP TRIGGER audit_' + @tabname EXEC (@strSQL) END /* Создание тариггера */ IF @mode IN (1, 2) AND @debug_sql = 0 EXEC (@open_trigger_sql + @insert1_sql + @insert2_sql + @insert3_sql + @insert4_sql + @close_trigger_sql + @insert5_sql + @insert6_sql + @insert7_sql + @insert8_sql + @close_trigger_sql1 + @insert9_sql + @insert10_sql + @insert11_sql + @insert12_sql + @close_trigger_sql2) IF @debug_sql != 0 BEGIN PRINT @open_trigger_sql PRINT @insert1_sql PRINT @insert2_sql PRINT @insert3_sql PRINT @insert4_sql PRINT @close_trigger_sql PRINT @insert5_sql PRINT @insert6_sql PRINT @insert7_sql PRINT @insert8_sql PRINT @close_trigger_sql1 PRINT @insert9_sql PRINT @insert10_sql PRINT @insert11_sql PRINT @insert12_sql PRINT @close_trigger_sql2 END GO == eof == А тут результат работы: http://billingdelta.ru/lite/faq.html#19
  10. Кто Вам сказал, что я про мускль отзываюсь не как о поделке? http://archives.postgresql.org/pgsql-novic...06/msg00001.php оно? А вот тут на TCL: http://www.alberton.info/postgresql_table_audit.html В качестве укрепления позиции единственных Дартанянов среди пи**расов Вам помогло бы. http://pgfoundry.org/projects/tablelog/ - модуль к постгресу. Правда, использует триггер. Мало? В гугле забанили, а livesearch на запрос postgresql стабильно отправляет на сайт одной-известной-корпорации? И Вы так и не ответили на вопрос про оракел. Эх, блин. Был у нас тут постгресс. с 2003 по 2006 год. До сих пор мучаемся когда пытаемся оттуда вытащить старые звоночки за те периоды. Большего г*^& в жизни видеть не приходилось. Причина: МЕДЛЕННЫЙ. Все остальное насчет него мало интересно. Персонально вам: Милейший, вы флеймите. Я говорил не про возможности СУБД а биллинга, представленного на рынок. Исходный вопрос остается в силе. По поводу оракла отвечаю. Дорого. Все тоже самое (более удобно, через GUI) можно делать в MsSQL. Кроме того, T-SQL гораздо более читабельный и логичный по сравнению с PL. На sql.ru эта шняга многократно обсуждалась многоми, лень жевать это еще раз.
  11. Какая очередь в абонетском отделе за расшифровкой? У вас вообще интерфейс клиента есть в биллинге? Чтобы он дома смотрел свои детализации, сколько ему влезет? На скриншотах что-то ни одного нет окошка кабинета клиента. Или ему тоже предлагается взгромоздить Access (denied), odbc и прочие "классные функциональные штуки"? Раз уж пошла такая пьянка ;-) http://stat.astelecom.ru Логин: alexandr Пароль: 20051981 это `личный кабинет`. Такой кабинет может быть по любому разделу предоставляемых услуг в т.ч. по обычной телефонии. Заходите, смотрите. Советую посмотреть скорость, с которой программа показывает трафик и историю соединений аккаунта. Выборка данных осуществляется из динамического массива: один день -- одна таблица. Объем записей за сутки превышает 1 млн для агрегированного net flow и 150000 для accounting. Про наш трафик и количество абонентов я писал уже, повторяться не буду. Про нагрузку тоже писал.
  12. Про лан, еще раз повторяю, они отказались в свое время нам писать потому что у них не было тогда и половины того, что нам нужно. О чем они честно признались (и на том спасибо). Про заявленные нами объемы трафика я вообще молчу, умрет этот лан при таких объемах. На нашем сайте что-то не открылось или Вы не смогли что-то прочитать? Может быть не смогли понять? Это уже другая история ;-))) Оптимизировано под стандартное разрешение 1024*768. Есть возможность работать 800*600 (глобальная настройка клиентской части) однако по причине значительного объема отображаемых данных это не очень удобно. 16:9 не надо.
  13. Полное непонимание вопроса. В документации разжевано как раздавать права юзерам на базу. Это я захожу как `sa`, а могу этого не делать, зайти под своей учеткой. Учетная запись пользователя в системе всегда соответсвует логину на sql сервере. Все операции пользователя с данными всегда выполняются от имени этого пользователя что обеспечивает максимальную защиту нанных т.к. она реализована средствами SQL сервера и позволяет вести полный аудит всех интересных нам транзакций чтобы в последствии точно знать, кто из пользователей накосячил и дать по башке. Безопасность тут: http://billingdelta.ru/lite/faq.html#18 Аудит тут: http://billingdelta.ru/lite/faq.html#19 После осмысления материала просьба показать пальцем на биллинг где есть что-то подобное - хотя-бы на зачаточном уровне. Заодно расскажите, как как второе можно сделать на MySQL ;-)
  14. Какая очередь в абонетском отделе за расшифровкой? У вас вообще интерфейс клиента есть в биллинге? Чтобы он дома смотрел свои детализации, сколько ему влезет? На скриншотах что-то ни одного нет окошка кабинета клиента. Или ему тоже предлагается взгромоздить Access (denied), odbc и прочие "классные функциональные штуки"? За услуги МТР абоненты требуют расшифровку. Мы ее обязаны предоставлять по закону на бумажном носителе по первому требованию абонента. Дома абонент и так все видит через web сервер статистики - начисления, оплаты, баланс, расшифровки трафика (телефония, интернет) и т.д. Проблема в том, что бабушки и дедушки из сел (50% наших абонентов) не знают что такое интернет и им надо печатать счета на бумаге! В разделе "о программе" разжевано что может программа и как это делается. Про абонентские web сервисы там уж точно написано.
  15. [ Opera,Mozilla Firefox,Сафари - прекрасные клиенты биллинга, любого ] У нас тоже такое есть -- web интерфейс для дилеров, которые принимают оплаты в ручном режиме и заключают новые договора.
  16. Мозг человека способен обрабатывать большой поток инфорации, поэтому что плохого выдавать за раз как можно больше данных? За несколько первых часов работы с программой оператор привыкает к этому. В любом случае, это лучше, чем для получения каждой новой порции данных открывать новое окно или еще хуже, новую программу. Вот на это и был сделан упор при проектировании интерфеса. По поводу массивов сказано в особенностях, а в вопросах и ответах -- полное их описание и кусок живого кода на T-SQL для работы с ними. Все жалающие могут поставить опыт и убедиться что это работает!
  17. Огромную скорость выполнения расчётов вы ставите как жизненно необходимый аспект работы с абонентом, вы действительно думаете, что это так и есть? Если в абонентском отделе скопится очередь и руководство узнает, что это из-за тормозов биллинга при формировании расшифровки МТР нас просто порвут. Так что производительность системы для нас жизненно важна. Если Вам нравится ожидать нескоько минут пока сформируется детализация я очень рад! Кстати, до Дельты у нас так и было, что постоянно приводило к жалобам абонентов. Учитывая, что используемый тогда биллинг не вытягивал нагрузку нас не трогали т.к. знали, что мы работаем, чтобы навсегда покончить с этом злом в будущем.
  18. C:\BACKUP>dir *.dat Volume in drive C has no label. Volume Serial Number is A4CC-379B Directory of C:\BACKUP 20.08.2009 05:23 20 731 436 544 calls_db.dat -- телефония. сырой трафик станций, протарифицированный МГ/МН и АПУС. 20.08.2009 05:35 19 594 818 048 inet_db.dat -- свернутый трафик выделенщиков, логи radius. 20.08.2009 05:10 950 234 624 main_db.dat -- MAIN 20.08.2009 05:11 395 226 624 money_db.dat -- расчетные срезы периодов, архивы картотеки абонентов, картотеки устройств. Это текущие полные бэкапы с 01.01.2009 до настоящего времени. Сами базы, ясный пень, еще больше т.к. там еще логи. Вот такой у нас трафик. Днем активно около 1000 PPPoe сессий, в ЧНН подскакивает до 2000 и более. На цисе aaa accounting update periodic 1 и цыс таких 4 штуки для обслуживания PPPoe-шных шушпанчиков. Жалающие могут подсчитать количество апдейтов аккаунтинга в секунду. Когда мы в 2007 году подискивали себе биллинг (до того как начали писать Дельту) моим первым вопросом было "как у вас храниться трафик?" (к сожалению, на сайтах разработчиков эта информация отсутствует). Если следовал ответ "грузится в 1 таблицу, которую надо периодически архивировать" я просто вешал трубку т.к. говорить было, собственно, больше не о чем. В итоге, пришлось писать всё самим.
  19. Причем тут вообще что есть, а чего нет в ланбиллинге? Речь-то шла о том, что клиентов не надо прикрывать костыляйдерность проекта фразами "все кругом идиоты, поставить наше творение сможем только мы сами". Это приводит к тому, что только вы сами и будете им пользоваться, регулярно раздувая щеки в зеркале. Ошибаетесь, опять ошибаетесь. Именно свой собственный курсовик уж не помню года мне и напомнило ваше творение! Ностальджи, так сказать. Стандартные табличечки, слепленные в кучу, все такое. Правда, работало оно с базой postgresql, а морда была склепана за пару дней на C-Builder и как раз прокатило как курсовик. :) По поводу дизайна сайта - тоже зря обижаетесь. Сами гляньте - перекошенный монитор, выломанные клавиши падают и трубка телефонная без провода валяется - явно не символ стройной системы :) Да вы никак не поймете, о чем я говорю. Если оператор более-менее серьезный - по услугам и количеству абонентов, не существует такого биллинга который можно тупо взять, поставить и все будет сразу работать. Так или иначе, придется что-то дописывать под конкретные нужды. Допустим, такая программа все-же есть (будет), но в любом случае, придется писать отдельную программу для миграции данных из существующего биллинга. И такую программу, лучше разработчиков, все равно никто не напишет в принципе. Таблички, слепленные к кучу позволяют оператору абонетского отдела ОДНИМ ВЗГЛЯДОМ все увидеть по данному абоненту и избаляют от необходимости что-то еще открывать, куда-то нажимать и т.д. Упор был сделан именно на то, чтобы каждый АРМ выдавал за раз как можно больше информации и избалял пользователя от лишних телодвижений. Насчет дизайна сайта -- среди нас, к сожалению, нет дизайнеров и художников. А воровать графику с других сайтов воспитание не позволяет, поэтому просто нарисовали свое.
  20. Обалдеть. Вот я у себя внедрял ланбиллинг - взял доку и внедрил. Никаких проблем. Что написано то и делал и получил рабочую систему. А заявления типа "у заказчиков мозгов не хватит" - тут скорее скрывается комплекс в виде ацкого набора костылей, к которому несомненно нужен специальный костыляйдер, чтобы в нужном месте скрепить скотчем, ежели потечет. Вот скриншоты интерфейсов сразу создали впечатление курсовика. Оплата в онлайне это несомненно супер. Трудно даже вспомнить где ее нет. Когда в 2007 году этой конторе (ланбиллинг) я послал наше ТЗ, выяснилось, что большую часть наших пожеланий они выполнить не в состоянии, особенно по телефонии дект. Также, в системе отсутствует документооборот (сейчас, может быть написали) -- у нас все на нарядах завязано. До сих пор нет поддержки станции c&c08, не поддерживается также Iteltel Linea UT дект-провод. По поводу курсового. Уважаемый, у вас нет и этого ;-)
  21. Я кого-то так назвал? Я сказал, что знаний не хватит чтобы внедрить своими силами. При всей простоте нашей системы (в базе чуть больше 100 статических таблиц и около 140 хранимых процедур) используются достаточно сложные алгоритмы обработки данных, надо очень хорошо знать T-SQL. Обработчики написаны на tcl/tk 8.4. его тоже надо знать, чтобы адаптировать декодер cdr к используемой станции, возможно придется подогнать обработчики radius под используемое оборудование. Покажите биллинг, где данная технология используется? Пишут трафик в одну таблицу а когда она становится очень большой думают что с ней делать. Точнее думают не разработчики (они свое бабло уже получили) а думают сотрудники, поддерживающие биллинг. В Дельте, все потенциально большие таблицы преобразоны к динамически массивам, поэтому необходимость что-то делать с базой, по мере ее заполнения данними отпадает т.е. объем данных совершенно не влияет на быстродействие системы. Вопрос только в доступном месте на диске на сервере. Не въехал, при чем тут perl? Речь идет о технологии хранения больших объемов данных в БД. Или перловый скрипт можно скармливать SQL серверу ;-)
  22. Так у вас самих на сайте написано, что программа ваша такая мегахитрая, что никто кроме вас в нее не врубится ни за что, а если попробует САМ внедрить - то типа сам себе злобный буратино: ==== 3. Сколько стоит программа? Сама по себе программа и база данных будет совершенно бесполезна для большинства заинтересованных лиц. Для того чтобы внедрить программу, нужно очень хорошо знать, как «Дельта» устроена и как работает. Кроме разработчиков этого не знает никто. Специалисты, осуществляющие внедрение, должны в совершенстве владеть несколькими языками программирования и детально знать предметную область. Вы часто таких людей встречали? Вы смогли бы своими силами внедрить программу? Мы предлагаем вариант готового решения автоматизации процессов Вашего бизнеса с помощью нашей программы. Соответственно, стоимость всего проекта будет определяться сложностью поставленной задачи и объемами работ. Безусловно, если Вы хотите все работы по внедрению выполнить самостоятельно, возможен и такой вариант сотрудничества ==== А вот другие пишут, что их биллинг легко внедряется, имеет открытый формат баз, открытый API, открыты все исходники абонентского интерфейса (php) - хоть сам вноси фичи, хоть точи под себя. А уж выражения типа "MS SQL, Access" - ничего кроме "боже упаси" не вызывают. Да у нас ОТКРЫТОЕ всё! Все в исходниках, в базе в таблицах описание каждого поля, есть документация (пишется потихоньку). При внедрении, у заказчиков элементарно мозгов не хватит все правильно сделать, поэтому наша помощь потребуется в любом случае. К тому-же, люди там на зарплатах сидят, никто лишний раз впрягаться не будет что-то делать за ту-же зарплату. Нашу систему легко внедрить потому, что у нас база сделана грамотно -- ничего лишнего + хорошо продуманная схема. Мы внедряли у себя вообще частями - несколько месяцев работало одновременно два биллинга ;-)
  23. Называется слышу звон, не знаю где он ;-) Вы хоть схемку гляньте - на сайте в разделе "О программе". База у нас ОДНА (но можно создать кластер при желании). На линуксе работает: radius, коллектор NetFlow, декодеры cdr, http и https сервер статистики и интерфейс для работы платежных систем, скрипты управления услугами устройств, обработчики accounting пакетов, скрипты формирования похостовых детализаций, скрипты для голоса и логики IP телефонии и т.д. Никакой БД там нет в помине ;-) Для извращенцев, Debian можно можно заменить на FreBSD или хотя на что угодно -- все в исходниках, собирай под чем хочешь. По: 1. Денег нет и нет желания кому-то платить за т.н. "дизайн". В таком специализированном сайте важен не дизайн а информация. Ее там достаточно. 2. Как только появится альтернатива аксу, имеющая хотя-бы половину его возможностей и удобства разработки обязательно перепишем. 3. По 3 уже писал, читайте внимательно или хотя-бы гляньте схему. 4. Лучше потому, что за весь период работы системы в полном объеме (пока пол года) не было замечено ни одного косяка в расчетах по вине прграммы. Также, отсутствуют жалобы пользователей на тормоза благодаря широкому использованию динамических массивов в базе данных. Удобный и продуманный интерфейс АРМов (смотрите скриншоты) упростил работу сотрудников компании. Ну и наконец, система полностью реалтаймовая - предоплатные тарифные планы для всех разделов услуг, оплаты в онлайне и т.д.
  24. Уверен. Хотя-бы потому, что благодаря использованию динамических технологий, программа очень быстро обрабатывает реально большие объемы данных. При этом, нагрузка radius сервера в ЧНН доходит 50-80 апдейтов в секунду + 50 юзеров работает с базой + NetFlow, декодирование cdr и прочее. Все крутится, ничего не тормозит. Также, функциональные возможности нашей программы позволяют использовать ее любым оператором связи. Все есть, все отлажено. Если Вы так написали, что никому не понятно (кроме Вас) -- примите мои поздравления! По крайней мере, это гарантирует Вашу занятость по данному месту работы, но не более того. Мы, изначально, ставили несколько другие задачи, поэтому написали так, что будет понятно всем.
  25. Акс ничего не считает и обработкой данных не занимается. Только показывает формочки для пользоватльского интерфейса и печатет отчеты. Прошу Вас, предложите средство, укладывающееся в цену аксцесса и имеющего хотя-бы половину его возможностей -- мы возьмемся переписать клиентскую часть. Только не забудьте, что у пользователей, "Дельта" работает под бесплатным рунтаймом аксцесса. Средства разработки установлены только на машине администратора. Это тоже учите при расчете стоимости.