124 |
int action; |
int action; |
125 |
}; |
}; |
126 |
|
|
127 |
|
struct DeviceSet { |
128 |
|
int resource; |
129 |
|
int operator; |
130 |
|
long limit_absolute; |
131 |
|
int limit_percent; |
132 |
|
int action; |
133 |
|
}; |
134 |
|
|
135 |
/* yacc interface */ |
/* yacc interface */ |
136 |
void yyerror(const char *); |
void yyerror(const char *); |
137 |
|
|
149 |
static Process_T depend_list= NULL; |
static Process_T depend_list= NULL; |
150 |
static struct IHavePrecedence ihp= {FALSE, FALSE, FALSE}; |
static struct IHavePrecedence ihp= {FALSE, FALSE, FALSE}; |
151 |
static struct MailFilter mtf= {NULL, NULL, NULL, FALSE, FALSE, FALSE, |
static struct MailFilter mtf= {NULL, NULL, NULL, FALSE, FALSE, FALSE, |
152 |
FALSE, FALSE, FALSE}; |
FALSE, FALSE, FALSE}; |
153 |
static struct PortSet portset= {-1, NULL, 0, SOCK_STREAM, AF_INET, FALSE, |
static struct PortSet portset= {-1, NULL, 0, SOCK_STREAM, AF_INET, FALSE, |
154 |
SSL_VERSION_AUTO, NULL, NULL, NULL, NULL}; |
SSL_VERSION_AUTO, NULL, NULL, NULL, NULL}; |
155 |
static struct ResourceSet resourceset= {0, 0, OPERATOR_EQUAL, 1, |
static struct ResourceSet resourceset= {0, 0, OPERATOR_EQUAL, 1, |
156 |
ACTION_ALERT}; |
ACTION_ALERT}; |
157 |
static struct TimestampSet timestampset= {NULL, OPERATOR_EQUAL, 0, |
static struct TimestampSet timestampset= {NULL, OPERATOR_EQUAL, 0, |
158 |
ACTION_ALERT}; |
ACTION_ALERT}; |
159 |
|
static struct DeviceSet deviceset= {0, OPERATOR_EQUAL, -1, -1, ACTION_ALERT}; |
160 |
|
|
161 |
/* Private prototypes */ |
/* Private prototypes */ |
162 |
static void initialize(); |
static void initialize(); |
163 |
static void addprocess(Process_T); |
static void addprocess(Process_T); |
164 |
static void addmail(char *, struct MailFilter *); |
static void addmail(char *, struct MailFilter *); |
165 |
static void createprocess(char *, char *); |
static void createprocess(int, char *, char *); |
166 |
static void adddependant(char *); |
static void adddependant(char *); |
167 |
static void addchecksum(char *, char *); |
static void addchecksum(char *, char *); |
168 |
static void addport(struct PortSet *); |
static void addport(struct PortSet *); |
169 |
static void addresource(struct ResourceSet *); |
static void addresource(struct ResourceSet *); |
170 |
static void addtimestamp(struct TimestampSet *); |
static void addtimestamp(struct TimestampSet *); |
171 |
|
static void adddevice(struct DeviceSet *); |
172 |
static void *addprotocol(int); |
static void *addprotocol(int); |
173 |
static void addcommand(int); |
static void addcommand(int); |
174 |
static void addargument(char *); |
static void addargument(char *); |
184 |
static void reset_portset(); |
static void reset_portset(); |
185 |
static void reset_resourceset(); |
static void reset_resourceset(); |
186 |
static void reset_timestampset(); |
static void reset_timestampset(); |
187 |
|
static void reset_deviceset(); |
188 |
static void check_name(char *); |
static void check_name(char *); |
189 |
static void check_timeout(int, int); |
static void check_timeout(int, int); |
190 |
static void check_every (int); |
static void check_every(int); |
191 |
|
static int check_perm(int); |
192 |
static void check_hostname (char *); |
static void check_hostname (char *); |
193 |
static void createprocinfo(); |
static void createinfo(); |
194 |
static char *append_hostname(char *); |
static char *append_hostname(char *); |
195 |
static void cleanup_md5_string(char *); |
static void cleanup_md5_string(char *); |
196 |
static void check_depend(); |
static void check_depend(); |
207 |
|
|
208 |
%token SET LOGFILE DAEMON SYSLOG MAILSERVER HTTPD ALLOW ADDRESS INIT |
%token SET LOGFILE DAEMON SYSLOG MAILSERVER HTTPD ALLOW ADDRESS INIT |
209 |
%token PEMFILE ENABLE DISABLE HTTPDSSL CLIENTPEMFILE ALLOWSELFCERTIFICATION |
%token PEMFILE ENABLE DISABLE HTTPDSSL CLIENTPEMFILE ALLOWSELFCERTIFICATION |
210 |
%token CHECK PIDFILE START STOP |
%token CHECK PIDFILE START STOP PATHTOK |
211 |
%token HOST PORT TYPE UDP TCP TCPSSL PROTOCOL FACILITY |
%token HOST PORT TYPE UDP TCP TCPSSL PROTOCOL FACILITY |
212 |
%token ALERT MAILFORMAT UNIXSOCKET |
%token ALERT MAILFORMAT UNIXSOCKET |
213 |
%token TIMEOUT RESTART CHECKSUM EXPECT EVERY |
%token TIMEOUT RESTART CHECKSUM EXPECT EVERY |
223 |
%token UID GID ENVIRONMENT |
%token UID GID ENVIRONMENT |
224 |
%token TIMESTAMP SECOND MINUTE HOUR DAY |
%token TIMESTAMP SECOND MINUTE HOUR DAY |
225 |
%token SSLAUTO SSLV2 SSLV3 TLSV1 |
%token SSLAUTO SSLV2 SSLV3 TLSV1 |
226 |
|
%token PERCENT BYTE KILOBYTE MEGABYTE GIGABYTE |
227 |
|
%token DIRECTORY FILETOK DEVICE PROCESS |
228 |
|
%token INODE SPACE PERM |
229 |
|
|
230 |
%left GREATER LESS EQUAL NOTEQUAL |
%left GREATER LESS EQUAL NOTEQUAL |
231 |
|
|
245 |
| sethttpd |
| sethttpd |
246 |
| setpid |
| setpid |
247 |
| setinit |
| setinit |
248 |
| check optionlist |
| checkproc optproclist |
249 |
|
| checkfile optfilelist |
250 |
|
| checkdev optdevlist |
251 |
|
| checkdir optdirlist |
252 |
; |
; |
253 |
|
|
254 |
optionlist : /* EMPTY */ |
optproclist : /* EMPTY */ |
255 |
| optionlist optionstatement |
| optproclist optproc |
256 |
; |
; |
257 |
|
|
258 |
optionstatement : start |
optproc : start |
259 |
| stop |
| stop |
260 |
| host port type protocol { |
| host port type protocol { |
261 |
addport(&portset); |
addport(&portset); |
280 |
} |
} |
281 |
; |
; |
282 |
|
|
283 |
|
optfilelist : /* EMPTY */ |
284 |
|
| optfilelist optfile |
285 |
|
; |
286 |
|
|
287 |
|
optfile : start |
288 |
|
| stop |
289 |
|
| timestamp { |
290 |
|
addtimestamp(×tampset); |
291 |
|
} |
292 |
|
| timeout |
293 |
|
| every |
294 |
|
| alert |
295 |
|
| perm |
296 |
|
| checksum |
297 |
|
| autostart |
298 |
|
| mode |
299 |
|
| group |
300 |
|
| depend |
301 |
|
; |
302 |
|
|
303 |
|
optdevlist : /* EMPTY */ |
304 |
|
| optdevlist optdev |
305 |
|
; |
306 |
|
|
307 |
|
optdev : start |
308 |
|
| stop |
309 |
|
| timeout |
310 |
|
| every |
311 |
|
| alert |
312 |
|
| autostart |
313 |
|
| mode |
314 |
|
| group |
315 |
|
| depend |
316 |
|
| inode { |
317 |
|
adddevice(&deviceset); |
318 |
|
} |
319 |
|
| space { |
320 |
|
adddevice(&deviceset); |
321 |
|
} |
322 |
|
; |
323 |
|
|
324 |
|
optdirlist : /* EMPTY */ |
325 |
|
| optdirlist optdir |
326 |
|
; |
327 |
|
|
328 |
|
optdir : start |
329 |
|
| stop |
330 |
|
| timestamp { |
331 |
|
addtimestamp(×tampset); |
332 |
|
} |
333 |
|
| timeout |
334 |
|
| every |
335 |
|
| alert |
336 |
|
| perm |
337 |
|
| checksum |
338 |
|
| autostart |
339 |
|
| mode |
340 |
|
| group |
341 |
|
| depend |
342 |
|
; |
343 |
|
|
344 |
setdaemon : SET DAEMON NUMBER { |
setdaemon : SET DAEMON NUMBER { |
345 |
if(!Run.isdaemon || ihp.daemon) { |
if(!Run.isdaemon || ihp.daemon) { |
346 |
ihp.daemon= TRUE; |
ihp.daemon= TRUE; |
486 |
} |
} |
487 |
; |
; |
488 |
|
|
489 |
check : CHECK STRING PIDFILE PATH { |
checkproc : CHECK PROCESS STRING PIDFILE PATH { |
490 |
createprocess($2,$4); |
createprocess(TASK_PROCESS, $3,$5); |
491 |
check_name($2); |
check_name($3); |
492 |
|
} |
493 |
|
| CHECK PROCESS STRING PATHTOK PATH { |
494 |
|
createprocess(TASK_PROCESS, $3,$5); |
495 |
|
check_name($3); |
496 |
|
} |
497 |
|
; |
498 |
|
|
499 |
|
checkfile : CHECK FILETOK STRING PATHTOK PATH { |
500 |
|
createprocess(TASK_FILE, $3,$5); |
501 |
|
check_name($3); |
502 |
|
} |
503 |
|
; |
504 |
|
|
505 |
|
checkdev : CHECK DEVICE STRING PATHTOK PATH { |
506 |
|
createprocess(TASK_DEVICE, $3,$5); |
507 |
|
check_name($3); |
508 |
|
} |
509 |
|
; |
510 |
|
|
511 |
|
checkdir : CHECK DIRECTORY STRING PATHTOK PATH { |
512 |
|
createprocess(TASK_DIRECTORY, $3,$5); |
513 |
|
check_name($3); |
514 |
} |
} |
515 |
; |
; |
516 |
|
|
763 |
| STOP { $<number>$= ACTION_STOP; } |
| STOP { $<number>$= ACTION_STOP; } |
764 |
; |
; |
765 |
|
|
766 |
|
inode : INODE operator NUMBER action { |
767 |
|
deviceset.resource= RESOURCE_INODE; |
768 |
|
deviceset.operator= $<number>2; |
769 |
|
deviceset.limit_absolute= $3; |
770 |
|
deviceset.action= $<number>4; |
771 |
|
} |
772 |
|
| INODE operator NUMBER PERCENT action { |
773 |
|
deviceset.resource= RESOURCE_INODE; |
774 |
|
deviceset.operator= $<number>2; |
775 |
|
deviceset.limit_percent= $<number>3; |
776 |
|
deviceset.action= $<number>5; |
777 |
|
} |
778 |
|
; |
779 |
|
|
780 |
|
space : SPACE operator NUMBER unit action { |
781 |
|
|
782 |
|
DeviceInfo_T di= NEW(di); |
783 |
|
|
784 |
|
get_fsusage(current->path, di); |
785 |
|
|
786 |
|
deviceset.resource= RESOURCE_SPACE; |
787 |
|
deviceset.operator= $<number>2; |
788 |
|
deviceset.limit_absolute= (int)( (float)$3 / (float)di->f_bsize * (float)$<number>4 ); |
789 |
|
deviceset.action= $<number>5; |
790 |
|
|
791 |
|
free(di); |
792 |
|
|
793 |
|
} |
794 |
|
| SPACE operator NUMBER PERCENT action { |
795 |
|
deviceset.resource= RESOURCE_SPACE; |
796 |
|
deviceset.operator= $<number>2; |
797 |
|
deviceset.limit_percent= $<number>3; |
798 |
|
deviceset.action= $<number>5; |
799 |
|
} |
800 |
|
; |
801 |
|
|
802 |
|
unit : BYTE { $<number>$= UNIT_BYTE; } |
803 |
|
| KILOBYTE { $<number>$= UNIT_KILOBYTE; } |
804 |
|
| MEGABYTE { $<number>$= UNIT_MEGABYTE; } |
805 |
|
| GIGABYTE { $<number>$= UNIT_GIGABYTE; } |
806 |
|
; |
807 |
|
|
808 |
|
perm : PERM NUMBER { current->perm=check_perm($2); } |
809 |
|
; |
810 |
|
|
811 |
%% |
%% |
812 |
|
|
813 |
|
|
861 |
/* If defined - add the last process to the process list */ |
/* If defined - add the last process to the process list */ |
862 |
if(current) { |
if(current) { |
863 |
|
|
864 |
createprocinfo(); |
createinfo(); |
865 |
addprocess(current); |
addprocess(current); |
866 |
|
|
867 |
} |
} |
906 |
* Create a new process object and add any current objects to the |
* Create a new process object and add any current objects to the |
907 |
* process list. |
* process list. |
908 |
*/ |
*/ |
909 |
static void createprocess(char *name, char *pidfile) { |
static void createprocess(int task, char *name, char *path) { |
910 |
|
|
911 |
ASSERT(name); |
ASSERT(name); |
912 |
ASSERT(pidfile); |
ASSERT(path); |
913 |
|
|
914 |
if(current) { |
if(current) { |
915 |
|
|
916 |
createprocinfo(); |
createinfo(); |
917 |
addprocess(current); |
addprocess(current); |
918 |
|
|
919 |
} |
} |
930 |
current->do_validate= TRUE; |
current->do_validate= TRUE; |
931 |
current->mode= MODE_ACTIVE; |
current->mode= MODE_ACTIVE; |
932 |
|
|
933 |
|
current->task= task; |
934 |
current->name= name; |
current->name= name; |
935 |
current->pidfile= pidfile; |
current->path= path; |
936 |
current->group= NULL; |
current->group= NULL; |
937 |
current->dependantlist= NULL; |
current->dependantlist= NULL; |
938 |
|
current->perm= -1; |
939 |
|
|
940 |
pthread_mutex_init(¤t->mutex, NULL); |
pthread_mutex_init(¤t->mutex, NULL); |
941 |
|
|
951 |
|
|
952 |
ASSERT(p); |
ASSERT(p); |
953 |
|
|
|
/* if process is already running... set validate true */ |
|
|
if (is_process_running(p)) |
|
|
p->do_validate= TRUE; |
|
|
|
|
954 |
n= NEW(n); |
n= NEW(n); |
955 |
memcpy(n, p, sizeof(*p)); |
memcpy(n, p, sizeof(*p)); |
956 |
|
|
1205 |
|
|
1206 |
|
|
1207 |
/* |
/* |
1208 |
* Adds procfs check data to current process procinfo |
* Add a new device to the current tasks device list |
1209 |
|
*/ |
1210 |
|
static void adddevice(struct DeviceSet *ds) { |
1211 |
|
|
1212 |
|
Device_T d= NEW(d); |
1213 |
|
|
1214 |
|
ASSERT(ds); |
1215 |
|
|
1216 |
|
d->resource= ds->resource; |
1217 |
|
d->operator= ds->operator; |
1218 |
|
d->limit_absolute= ds->limit_absolute; |
1219 |
|
d->limit_percent= ds->limit_percent; |
1220 |
|
d->action= ds->action; |
1221 |
|
|
1222 |
|
d->next= current->devicelist; |
1223 |
|
current->devicelist= d; |
1224 |
|
|
1225 |
|
reset_deviceset(); |
1226 |
|
|
1227 |
|
} |
1228 |
|
|
1229 |
|
|
1230 |
|
/* |
1231 |
|
* Adds runtime info to current process |
1232 |
*/ |
*/ |
1233 |
static void createprocinfo() { |
static void createinfo() { |
1234 |
|
|
1235 |
|
DeviceInfo_T di= NEW(di); |
1236 |
ProcInfo_T pi= NEW(pi); |
ProcInfo_T pi= NEW(pi); |
1237 |
|
|
1238 |
|
current->devinfo=di; |
1239 |
current->procinfo=pi; |
current->procinfo=pi; |
1240 |
|
|
1241 |
} |
} |
1462 |
|
|
1463 |
|
|
1464 |
/* |
/* |
1465 |
* Reset the pidfil if changed |
* Reset the pidfile if changed |
1466 |
*/ |
*/ |
1467 |
static void setpidfile(char *pidfile) { |
static void setpidfile(char *pidfile) { |
1468 |
|
|
1639 |
} |
} |
1640 |
|
|
1641 |
|
|
1642 |
|
/* |
1643 |
|
* Reset the Device set to default values |
1644 |
|
*/ |
1645 |
|
static void reset_deviceset() { |
1646 |
|
|
1647 |
|
deviceset.resource= 0; |
1648 |
|
deviceset.operator= OPERATOR_EQUAL; |
1649 |
|
deviceset.limit_absolute= -1; |
1650 |
|
deviceset.limit_percent= -1; |
1651 |
|
deviceset.action= ACTION_ALERT; |
1652 |
|
|
1653 |
|
} |
1654 |
|
|
1655 |
|
|
1656 |
/* ---------------------------------------------------------------- Checkers */ |
/* ---------------------------------------------------------------- Checkers */ |
1657 |
|
|
1658 |
|
|
1674 |
|
|
1675 |
} |
} |
1676 |
|
|
1677 |
|
|
1678 |
|
/* |
1679 |
|
* Permission statement semantic check |
1680 |
|
*/ |
1681 |
|
static int check_perm(int perm) { |
1682 |
|
|
1683 |
|
long result; |
1684 |
|
char *status; |
1685 |
|
char buf[STRLEN]; |
1686 |
|
|
1687 |
|
snprintf(buf, STRLEN, "%d", perm); |
1688 |
|
|
1689 |
|
result= strtol(buf, &status, 8); |
1690 |
|
|
1691 |
|
if( *status != '\0' || result < 0 || result > 07777 ) { |
1692 |
|
|
1693 |
|
yyerror("An permission statement must have an octal value between 0 and 07777."); |
1694 |
|
|
1695 |
|
} |
1696 |
|
|
1697 |
|
return result; |
1698 |
|
|
1699 |
|
} |
1700 |
|
|
1701 |
|
|
1702 |
/* |
/* |
1703 |
* Timeout statement semantic check |
* Timeout statement semantic check |