Репозитории ALT
S: | 1.2.1-alt1 |
5.1: | 1.1.35-alt2 |
4.1: | 1.1.35-alt1 |
4.0: | 1.1.31-alt1.1 |
3.0: | 1.1.31-alt1 |
Группа :: Коммуникации
Пакет: mgetty
Главная Изменения Спек Патчи Sources Загрузить Gear Bugs and FR Repocop
Патч: mgetty-1.1.25-cid.patch
Скачать
Скачать
diff -ruN mgetty-1.1.25.orig/README.CID mgetty-1.1.25/README.CID
--- mgetty-1.1.25.orig/README.CID Thu Jan 1 03:00:00 1970
+++ mgetty-1.1.25/README.CID Fri Feb 2 22:17:06 2001
@@ -0,0 +1,142 @@
+===============================================================================
+ Патч для mgetty v.1.1.25 для работы с временными промежутками
+ и поддержки АОН'а в USR Courier V.Evr с ID SDL >= 3.03
+===============================================================================
+
+ Поддержка временных промежутков для ответа на звонки
+
+Данный патч позволяет задавать время для ответа на звонки не только с помощью
+файла /etc/nologin[.device], но и непосредственно в конфигурационном файле
+mgetty. Это позволяет сделать работу mgetty практически не зависящей от работы
+cron'а, с помощью которого, как правило, создается и удаляется файл /etc/nolog-
+in[.device].
+
+После установки данного патча в конфигурационном файле можно задавать параметр
+"answer-time <time>", где <time> - временные промежутки, в которые mgetty будет
+отвечать на звонки. Формат <time> позаимствован из документации к программе
+T-Mail by Endy Elkin.
+
+ Краткое описание формата <time>
+
+Можно задавать часы, промежутки часов, часы с днями и промежутки с днями.
+
+Рассмотрим это подробней:
+
+"answer-time 23"
+ отвечать только в течении 23-го часа.
+
+"answer-time 23,0,1,2"
+ отвечать в 23, 0, 1 и 2 часа.
+
+"answer-time 23-2" или "answer-time 23:00-2:00"
+ отвечать в промежуток с 23 до 2 часов.
+
+"answer-time 1.23"
+ отвечать в 23 часа только в понедельник.
+
+"answer-time 7.23"
+ отвечать в 23 часа только в воскресенье.
+
+"answer-time 2.23-2.2" или "answer-time 2.23:00-2.2:00"
+ отвечать с 23 до 2 часов только во вторник.
+
+"answer-time 2.23-5.2" или "answer-time 2.23:00-5.2:00"
+ отвечать с 23 до 2 часов во вторник, среду, четверг и пятницу.
+
+Временные промежутки можно комбинировать в любом порядке, так, например, чтобы
+задать время ответа с 23 до 7 часов в будни и круглосуточно в выходные, нужно
+указать:
+
+"answer-time 23-7,6.0-7.24" или "answer-time 1.23:00-5.7:00,6.0:00-7.24:00"
+
+Промежутки разделяются запятыми, количество их не ограничено (в разумных пре-
+делах ;).
+
+Реакция на наличие файла /etc/nologin[.device] не изменилась, т.е. если
+текущее время попадает на рабочий промежуток, но присутствует файл /etc/nolog-
+in[.device] - mgetty отвечать на звонок НЕ будет, файл /etc/nologin[.device]
+имеет более высокий приоритет.
+
+Если параметр answer-time в файле конфигурации mgetty.config отсутствует -
+mgetty работает по старому алгоритму, т.е. отвечает на звонки согласно нали-
+чию/отсутствию файла /etc/nologin[.device].
+
+ Поддержка временных промежутков в конфигурационном файле
+
+Если перед параметром в конфигурационном файле указать скобки {}, а в них вре-
+менной промежуток <time>, то этот параметр будет прочитан из конфигурационного
+файла только если текущее время (т.е. время [и день] в которое читается конфи-
+гурационный файл) попадает в этот промежуток. Формат <time> описан выше.
+
+Первый пример:
+==========================
+{22:00-8:00} rings 1
+{8:00-22:00} rings 5
+==========================
+
+С 22 до 8 часов mgetty будет отвечать на звонки с первого звонка, а с 8 до 22
+только с пятого.
+
+Второй пример:
+==================================
+{1.22:00-5.8:00} rings 1
+{6.00:00-7.24:00} rings 2
+{1.8:00-5.22:00} rings 5
+==================================
+
+По будням отвечать с 22 до 8 часов с первого звонка, по выходным круглосуточно
+со второго, все остальное время с пятого.
+
+Третий пример:
+==============================
+{8:00-22:00} rings 5
+{8:00-22:00} fax-only y
+{22:00-8:00} rings 1
+{22:00-8:00} data-only y
+==============================
+
+Днем работать только как факс, отвечая с пятого звонка, а ночью как модем отве-
+чая с первого.
+
+Хинты:
+ 1. Не забывайте перезапускать mgetty при наступлении очередного промежутка
+ через killall или kill из cron'а. Для первого примера файл cron'а будет
+ выглядеть так: (для систем с одним модемом)
+ ====================================
+ 0 22 * * * killall -q mgetty
+ 0 8 * * * killall -q mgetty
+ ====================================
+ 2. /etc/nologin[.device] и answer-time имеет бОльший приоритет над rings.
+
+ Поддержка ID SDL ver >= 3.03
+
+Для корректной поддержки ID SDL необходимо добавить в конфигурационный файл
+пару строк:
+
+--------------------------------------------
+get-cnd-chat "" AT+S62=3+S64=1+S65=0+SR1 OK
+deny-chat "" ATH0 OK
+--------------------------------------------
+
+Смысл заключается в том, чтобы после получения RING поднять трубку, определить
+номер и перейти в командный режим. Затем mgetty произведет поиск полученного
+номера по файлу dialin.config и если номер занесен в "черный список" пошлет в
+модем строку из deny-chat (в данном случае: положит трубку и перейдет в режим
+ожидания). Параметр deny-chat вводится этим патчем.
+
+Соответственно, полученное значение caller-id будет занесено в переменную окру-
+жения CALLER_ID (см. документацию к mgetty).
+
+Хинты:
+ 1. В файл dialin.config нужно вносить не только сам номер, но и категорию
+ абонента (точнее все, что определяется по АОН'у). Например, номер опре-
+ делившийся как 2356545:2 нужно заносить как 2356545:2, а не 2356545.
+
+===============================================================================
+Взять этот патч и патченную mgetty можно на http://scorpus.cjb.net
+ или http://www.my.creations.da.ru
+или по запросу через FidoNet или E-Mail (примерно 15кб в UUE).
+
+ Автор патча Алексей Гречанинов (Alexey U Gretchaninov)
+ 2:5010/81, scorpus@iname.com, ICQ 3272821
+===============================================================================
\ No newline at end of file
diff -ruN mgetty-1.1.25.orig/conf_mg.c mgetty-1.1.25/conf_mg.c
--- mgetty-1.1.25.orig/conf_mg.c Fri Feb 2 22:08:30 2001
+++ mgetty-1.1.25/conf_mg.c Fri Feb 2 22:15:18 2001
@@ -88,7 +88,9 @@
{ "rings", {1}, CT_INT, C_PRESET },
{ "msn-list", {(p_int) NULL}, CT_CHAT, C_EMPTY },
{ "get-cnd-chat", {0}, CT_CHAT, C_EMPTY },
- { "cnd-program", {(p_int) NULL}, CT_STRING, C_EMPTY },
+ { "deny-chat", {0}, CT_CHAT, C_EMPTY },
+ { "cnd-program", {(p_int) NULL}, CT_STRING, C_EMPTY },
+ { "answer-time", {(p_int) NULL}, CT_STRING, C_EMPTY },
{ "answer-chat", {0}, CT_CHAT, C_EMPTY },
{ "answer-chat-timeout", {80}, CT_INT, C_PRESET },
{ "autobauding", {FALSE}, CT_BOOL, C_PRESET },
diff -ruN mgetty-1.1.25.orig/conf_mg.h mgetty-1.1.25/conf_mg.h
--- mgetty-1.1.25.orig/conf_mg.h Sat Jan 6 20:46:34 2001
+++ mgetty-1.1.25/conf_mg.h Fri Feb 2 22:15:19 2001
@@ -33,7 +33,9 @@
rings_wanted, /* number of RINGs */
msn_list, /* ISDN MSNs (dist.ring) */
getcnd_chat, /* get caller ID (for ELINK)*/
+ deny_chat, /* hangup modem chat */
cnd_program, /* accept caller? */
+ answer_time, /* Answer time */
answer_chat, /* ATA...CONNECT...""...\n */
answer_chat_timeout, /* longer as S7! */
autobauding,
diff -ruN mgetty-1.1.25.orig/config.c mgetty-1.1.25/config.c
--- mgetty-1.1.25.orig/config.c Sun Feb 28 22:17:55 1999
+++ mgetty-1.1.25/config.c Fri Feb 2 22:15:19 2001
@@ -12,6 +12,7 @@
#include "syslibs.h"
#include <ctype.h>
#include <string.h>
+#include <time.h>
#ifndef ENOENT
#include <errno.h>
#endif
@@ -19,6 +20,8 @@
#include "mgetty.h"
#include "config.h"
+int is_time_now(char *);
+
/* read a line from FILE * fp, terminated by "\n"
* the line can be of any length (buffer will dynamically grow)
* - trailing "\n" is chopped off
@@ -323,6 +326,13 @@
{
norm_line( &line, &key );
if ( key[0] == 0 ) continue; /* empty line */
+
+ if( key[0] == '{')
+ {
+ if( strchr(key, '}') ) *strchr( key, '}' ) = 0;
+ if( !is_time_now( key + 1 ) ) continue;
+ norm_line( &line, &key );
+ }
lprintf( L_NOISE, "conf lib: read: '%s %s'", key, line );
@@ -442,4 +452,214 @@
sprintf( p, "%s/%s", path, file );
return p;
+}
+
+int is_time_now(char *timeRanges)
+{
+int firstDay, secondDay, firstHour, firstMinute, secondHour, secondMinute,
+ firstMark, secondMark, currentMark, Day, Hour, Min;
+char *p, *s, *f, *rs, *r;
+time_t Time;
+struct tm *localTime;
+
+if(!strlen(timeRanges))
+ {
+ lprintf( L_ERROR, "empty timerange(s) string!");
+ return 0;
+ }
+
+if(!(rs = strdup(timeRanges))) return 0;
+
+lprintf( L_NOISE, "work timerange(s): \"%s\"", rs);
+
+for(r = strtok(rs, ","); r; r = strtok(NULL, ","))
+ {
+ if(!strcasecmp(r, "CM")) { free(rs); return 1;}
+ if(!strlen(r)) continue;
+
+ firstDay = -1;
+ secondDay = -1;
+ firstHour = -1;
+ firstMinute = -1;
+ secondHour = -1;
+ secondMinute = -1;
+
+ lprintf( L_NOISE, "timerange: \"%s\"", r);
+
+ if((p = strchr(r, '-')))
+ {
+ if((s = strchr(r, '.')))
+ {
+ firstDay = atoi(s - 1);
+ firstHour = atoi(s + 1);
+ if((f = strchr(s + 1, ':')) && f < p) firstMinute = atoi(f + 1);
+
+ if((s = strchr(p + 1, '.')))
+ {
+ secondDay = atoi(s - 1);
+ secondHour = atoi(s + 1);
+ if((f = strchr(s + 1, ':'))) secondMinute = atoi(f + 1);
+ }
+ else
+ {
+ lprintf( L_ERROR, "can't parse timerange: \"%s\"", r);
+ free(rs);
+ return 0;
+ }
+ }
+ else
+ {
+ firstHour = atoi(r);
+ if((f = strchr(r, ':')) && f < p) firstMinute = atoi(f + 1);
+ secondHour = atoi(p + 1);
+ if((f = strchr(p + 1, ':'))) secondMinute = atoi(f + 1);
+ }
+ }
+ else
+ {
+ if((s = strchr(r, '.')))
+ {
+ firstDay = atoi(s - 1);
+ firstHour = atoi(s + 1);
+ if((p = strchr(s + 1,':'))) firstMinute = atoi(p + 1);
+ }
+ else
+ {
+ firstHour = atoi(r);
+ if((p = strchr(r,':'))) firstMinute = atoi(p + 1);
+ }
+ }
+
+ if( firstDay < -1 || firstDay > 7 || firstDay == 0 || firstHour < -1 ||
+ firstHour > 23 || firstMinute< -1 || firstMinute > 59 || secondDay < -1
+ || secondDay > 7 || secondDay == 0 || secondHour < -1 ||
+ secondHour > 24 || secondMinute < -1 || secondMinute > 59 ||
+ firstHour == -1 || (secondDay != -1 && secondHour == -1))
+ {
+ lprintf( L_ERROR, "can't parse timerange: \"%s\"", r);
+ free(rs);
+ return 0;
+ }
+
+ lprintf( L_NOISE, "parsed timerange: %i.%i:%i - %i.%i:%i", firstDay,
+ firstHour, firstMinute, secondDay, secondHour, secondMinute);
+
+ Time = time(NULL);
+ localTime = localtime(&Time);
+
+ Day = localTime->tm_wday;
+ if(!Day) Day = 7;
+ Hour = localTime->tm_hour;
+ Min = localTime->tm_min;
+
+ lprintf( L_NOISE, "current time: day %u, hour %u, min %u", Day, Hour, Min);
+
+ firstMark = firstHour * 60;
+ if(firstMinute != -1) firstMark += firstMinute;
+
+ secondMark = secondHour * 60;
+ if(secondMinute != -1) secondMark += secondMinute;
+
+ currentMark = Hour * 60 + Min;
+
+ lprintf( L_NOISE, "firstmark: %i, secondmark: %i, currentmark: %i",
+ firstMark, secondMark, currentMark);
+
+ if(secondDay != -1)
+ {
+ if(firstDay < secondDay)
+ {
+ if(Day >= firstDay && Day <= secondDay)
+ {
+ if(firstMark < secondMark)
+ {
+ if(currentMark >= firstMark && currentMark < secondMark)
+ { free(rs); return 1; }
+ }
+ else
+ {
+ if(currentMark >= firstMark || currentMark < secondMark)
+ { free(rs); return 1; }
+ }
+ }
+ }
+ else
+ {
+ if(firstDay == secondDay)
+ {
+ if(Day == firstDay)
+ {
+ if(firstMark < secondMark)
+ {
+ if(currentMark >= firstMark && currentMark < secondMark)
+ { free(rs); return 1;}
+ }
+ else
+ {
+ if(currentMark >= firstMark || currentMark < secondMark)
+ { free(rs); return 1;}
+ }
+ }
+ }
+ else
+ {
+ if(Day >= firstDay || Day <= secondDay)
+ {
+ if(firstMark < secondMark)
+ {
+ if(currentMark >= firstMark && currentMark < secondMark)
+ { free(rs); return 1;}
+ }
+ else
+ {
+ if(currentMark >= firstMark || currentMark < secondMark)
+ { free(rs); return 1;}
+ }
+ }
+ }
+ }
+ }
+ else if(secondHour != -1)
+ {
+ if(firstMark < secondMark)
+ {
+ if(currentMark >= firstMark && currentMark < secondMark)
+ { free(rs); return 1;}
+ }
+ else
+ {
+ if(currentMark >= firstMark || currentMark < secondMark)
+ { free(rs); return 1;}
+ }
+ }
+ else if(firstDay != -1)
+ {
+ if(firstMinute != -1)
+ {
+ if(Day == firstDay && Hour == firstHour && Min == firstMinute)
+ { free(rs); return 1;}
+ }
+ else
+ {
+ if(Day == firstDay && Hour == firstHour)
+ { free(rs); return 1;}
+ }
+ }
+ else
+ {
+ if(firstMinute != -1)
+ {
+ if(Hour == firstHour && Min == firstMinute)
+ { free(rs); return 1;}
+ }
+ else
+ {
+ if(Hour == firstHour)
+ { free(rs); return 1;}
+ }
+ }
+ }
+
+free(rs);
+return 0;
}
diff -ruN mgetty-1.1.25.orig/mgetty.c mgetty-1.1.25/mgetty.c
--- mgetty-1.1.25.orig/mgetty.c Sat Jan 6 20:46:34 2001
+++ mgetty-1.1.25/mgetty.c Fri Feb 2 22:15:19 2001
@@ -35,6 +35,7 @@
# define DIST_RING
# endif
#endif
+int is_time_now(char *);
/* how much time may pass between two RINGs until mgetty goes into */
/* "waiting" state again */
@@ -605,6 +606,14 @@
break;
}
#endif
+
+ if(c_string(answer_time) && !is_time_now(c_string(answer_time)))
+ {
+ lprintf( L_MESG, "out of answer time - do not accept call!");
+ mgetty_state = St_nologin;
+ break;
+ }
+
mgetty_state = St_wait_for_RINGs;
break;
@@ -649,8 +658,24 @@
&what_action, &dist_ring ) == SUCCESS )
{
rings++;
- if ( access( buf, F_OK ) != 0 || /* removed? */
- virtual_ring == TRUE ) /* SIGUSR1? */
+ if ( access( buf, F_OK ) != 0 ) /* removed? */
+ {
+ if( c_string( answer_time ))
+ {
+ if( is_time_now( c_string(answer_time)))
+ {
+ mgetty_state = St_wait_for_RINGs; /* -> accept */
+ break;
+ }
+ }
+ else
+ {
+ mgetty_state = St_wait_for_RINGs; /* -> accept */
+ break;
+ }
+ }
+
+ if ( virtual_ring == TRUE ) /* SIGUSR1? */
{
mgetty_state = St_wait_for_RINGs; /* -> accept */
break;
@@ -805,6 +830,9 @@
( c_isset(cnd_program) &&
cnd_call( c_string(cnd_program), Device, dist_ring ) == 1))
{
+ if ( c_isset(deny_chat) )
+ do_chat( STDIN, c_chat(deny_chat), NULL, NULL, 10, TRUE );
+
lprintf( L_AUDIT, "denied caller dev=%s, pid=%d, caller='%s'",
Device, getpid(), CallerId);
clean_line( STDIN, 80 ); /* wait for ringing to stop */
@@ -812,6 +840,9 @@
mgetty_state = St_go_to_jail;
break;
}
+
+ if(strcmp(CallerId, "none"))
+ lprintf( L_MESG, "caller-id: '%s'", CallerId);
/* from here, there's no way back. Either the call will succeed
and mgetty will exec() something else, or it will fail and