HylaFAX The world's
most advanced open source fax server
|
|
[
Date Prev][
Date Next][
Thread Prev][
Thread Next]
[
Date Index]
[
Thread Index]
Re: [hylafax-users] multiport modem and user based grouping
Omer Faruk Sen wrote:
Is it possible to configure hylafax to use spesific modem to send fax and
base this on username of the sender?
For example I have 8 modems attached with muliport pci card and I want
user X to send fax through fax#1 and user Y to send fax through fax#2 and
etc..
I want to set this up using email interface of hylafax (faxmail).
Attached is a patch that will give you this feature. It should apply to
most recent versions of HylaFAX. If you desire it in a tarball it is in
4.2.5.1 which can be found at:
http://hylafax.sourceforge.net/news/4.2.5.1.php
The feature basically adds an "owner" option to DestControls.
Documentation can be seen in 'man destctrls' and here:
http://hylafax.sourceforge.net/man/destctrls.php
But, basically by adding an "owner" field to the DestControls entry you
will restrict the application of that entry to apply only to jobs
submitted by that owner (hfaxd login username). So, for example
DestControls entries of:
.* owner=omer modem=ttyS0
.* owner=lee modem=ttyS1
This would make all jobs submitted by "omer" be sent through modem ttyS0
and all jobs submitted by "lee" be sent through modem ttyS1.
By the way which MultiPort PCI card do you advice me to use with FreeBSD 6.0?
The multiport PCI card options generally are Comtrol RocketModem II,
Digi Acceleport RAS, MultiTech ISI, and MainPine RockForce... however, I
think most of those probably won't have drivers for FreeBSD, so that
leaves MainPine RockForce (it uses standard PCI serial drivers that I
expect are in FreeBSD by default)... but don't take my word on it.
Lee.
diff -Nru hylafax.orig/faxd/DestControl.c++ hylafax/faxd/DestControl.c++
--- hylafax.orig/faxd/DestControl.c++ 2006-01-11 10:24:48.552198392 -0800
+++ hylafax/faxd/DestControl.c++ 2006-01-11 16:47:34.415856432 -0800
@@ -44,8 +44,8 @@
const DestControlInfo DestControlInfo::defControlInfo;
-DestControlInfo::DestControlInfo() : pattern("") { defined = 0; }
-DestControlInfo::DestControlInfo(const char* re) : pattern(re) { defined = 0; }
+DestControlInfo::DestControlInfo() : pattern("") { defined = 0; owner = ""; }
+DestControlInfo::DestControlInfo(const char* re) : pattern(re) { defined = 0; owner = ""; }
DestControlInfo::DestControlInfo(const DestControlInfo& other)
: pattern(other.pattern)
, rejectNotice(other.rejectNotice)
@@ -53,6 +53,7 @@
, tod(other.tod)
, args(other.args)
{
+ owner = other.owner;
defined = other.defined;
maxConcurrentCalls = other.maxConcurrentCalls;
maxSendPages = other.maxSendPages;
@@ -75,6 +76,8 @@
rejectNotice = value;
} else if (streq(tag, "modem")) {
modem = value;
+ } else if (streq(tag, "owner")) {
+ owner = value;
} else if (streq(tag, "maxconcurrentjobs")) { // backwards compatibility
maxConcurrentCalls = getNumber(value);
setDefined(DCI_MAXCONCURRENTCALLS);
@@ -190,6 +193,7 @@
DestControl::DestControl()
{
lastModTime = 0;
+ user = "";
}
DestControl::~DestControl() {}
@@ -202,6 +206,12 @@
}
}
+void
+DestControl::setUser(fxStr s)
+{
+ user = s;
+}
+
const DestControlInfo&
DestControl::operator[](const fxStr& canon)
{
@@ -213,6 +223,7 @@
}
for (u_int i = 0, n = info.length(); i < n; i++) {
DestControlInfo& dci = info[i];
+ if (dci.owner != "" && !streq(dci.owner, user)) continue; // pattern is specific to another user
if (dci.pattern.Find(canon))
return (dci);
}
diff -Nru hylafax.orig/faxd/DestControl.h hylafax/faxd/DestControl.h
--- hylafax.orig/faxd/DestControl.h 2006-01-11 10:24:48.500206296 -0800
+++ hylafax/faxd/DestControl.h 2006-01-11 16:16:48.781435512 -0800
@@ -40,7 +40,7 @@
*/
class DestControlInfo {
private:
- RE pattern; // destination pattern
+ RE pattern; // destination pattern
u_long defined; // parameters that were defined
u_int maxConcurrentCalls; // max number of parallel calls
u_int maxSendPages; // max pages in a send job
@@ -48,6 +48,7 @@
u_int maxTries; // max transmit attempts
fxStr rejectNotice; // if set, reject w/ this notice
fxStr modem; // if set, try with it
+ fxStr owner; // if set, rule only applies to owner
TimeOfDay tod; // time of day restrictions
int usexvres; // use extended resolution
u_int vres; // use extended resolution
@@ -87,6 +88,7 @@
class DestControl {
private:
fxStr filename; // database filename
+ fxStr user; // control username
time_t lastModTime; // last modification timestamp
u_int lineno; // line number while parsing
DestControlInfoArray info; // control information
@@ -101,6 +103,7 @@
virtual ~DestControl();
void setFilename(const char* filename);
+ void setUser(fxStr);
const DestControlInfo& operator[](const fxStr&);
};
diff -Nru hylafax.orig/faxd/faxQueueApp.c++ hylafax/faxd/faxQueueApp.c++
--- hylafax.orig/faxd/faxQueueApp.c++ 2006-01-11 10:24:48.499206448 -0800
+++ hylafax/faxd/faxQueueApp.c++ 2006-01-11 16:25:49.310262640 -0800
@@ -442,9 +442,13 @@
setDead(job);
}
}
- if (processnext) processJob(*targetjob, targetjob->breq, destJobs[targetjob->dest], destCtrls[targetjob->dest]);
- else if (startsendjob) sendJobStart(*targetjob->bfirst(), targetjob->bfirst()->breq, destCtrls[targetjob->dest]);
- else {
+ if (processnext) {
+ destCtrls.setUser(targetjob->breq->owner);
+ processJob(*targetjob, targetjob->breq, destJobs[targetjob->dest], destCtrls[targetjob->dest]);
+ } else if (startsendjob) {
+ destCtrls.setUser(targetjob->bfirst()->breq->owner);
+ sendJobStart(*targetjob->bfirst(), targetjob->bfirst()->breq, destCtrls[targetjob->dest]);
+ } else {
/*
* This destination was marked as called, but all jobs to this
* destination failed preparation, so we must undo the call marking.
@@ -2193,17 +2197,19 @@
* ready for processing.
*/
Job* jb;
- const DestControlInfo& dci = destCtrls[job.dest];
u_int n = 1;
- while (isOKToCall(di, dci, n) && (jb = di.nextBlocked())) {
- setReadyToRun(*jb);
- if (!di.supportsBatching()) n++;
+ while (jb = di.nextBlocked()) {
FaxRequest* req = readRequest(*jb);
- if (req) {
+ if (!req) continue;
+ destCtrls.setUser(req->owner);
+ const DestControlInfo& dci = destCtrls[job.dest];
+ if (isOKToCall(di, dci, n)) {
+ setReadyToRun(*jb);
+ if (!di.supportsBatching()) n++;
req->notice = "";
updateRequest(*req, *jb);
- delete req;
}
+ delete req;
}
}
@@ -2295,6 +2301,7 @@
/*
* Do per-destination processing and checking.
*/
+ destCtrls.setUser(req->owner);
DestInfo& di = destJobs[job.dest];
const DestControlInfo& dci = destCtrls[job.dest];
/*
diff -Nru hylafax.orig/man/destctrls.4f hylafax/man/destctrls.4f
--- hylafax.orig/man/destctrls.4f 2006-01-11 10:24:48.480209336 -0800
+++ hylafax/man/destctrls.4f 2006-01-11 16:57:43.970190088 -0800
@@ -70,9 +70,10 @@
When a parameter value is needed
.I faxq
sequentially scans the file until it finds a record that matches
-the canonical form of the destination phone number.
-If the requested parameter is defined in this record, then the
-value is returned, otherwise a default value is used from the
+the canonical form of the destination phone number. If ``owner'' is
+included in the entry, then the owner of the job-in-process must also
+match. If a matching entry is found, then the
+values given in the entry are used, otherwise values are used from the
.I faxq
configuration file.
.PP
@@ -81,8 +82,10 @@
.IR hylafax-config (${MANNUM4_5})
for a description of each parameter
(except
+.B Owner
+and
.B RejectNotice
-which is described below).
+which are described below).
.sp .5
.nf
.ta \w'MaxConcurrentCalls 'u +\w'integer 'u +\w'\fIunlimited\fP 'u
@@ -92,6 +95,7 @@
MaxSendPages integer \s-1\fIunlimited\fP\s+1 max pages to permit in a send
MaxTries integer \s-13\s+1 max attempts to transmit a job
Modem string \s-1Any\s+1 ModemGroup to use for destination
+Owner string \s-1\s+1 Restrict to jobs owned by this user
RejectNotice string \- rejection notice for transmit job
TimeOfDay string \s-1Any\s+1 default time-of-day restrictions
VRes integer \- Vertical resolution
@@ -120,6 +124,13 @@
is overridden by the inclusive set of modems found in both.
.PP
The
+.B Owner
+parameter constrains the usage of the entry to when the job
+owner matches this user. Entries containing an
+.B Owner
+setting will be skipped when jobs from other users are processed.
+.PP
+The
.B RejectNotice
parameter controls whether or not to reject
jobs to the destination.
diff -Nru hylafax.orig/man/hylafax-config.4f hylafax/man/hylafax-config.4f
--- hylafax.orig/man/hylafax-config.4f 2006-01-11 10:24:48.458212680 -0800
+++ hylafax/man/hylafax-config.4f 2006-01-11 16:49:55.663383544 -0800
@@ -661,7 +661,7 @@
.TP
.B DestControls\(S1
An optional file containing rules for controlling
-parameters on a per-destination basis; see
+parameters on a per-destination and optionally also a per-job-owner basis; see
.IR destctrls (${MANNUM4_5})
The following parameters may be controlled with this mechanism:
.BR MaxConcurrentCalls ,