| 44 |
44 |
#include <string.h>
|
| 45 |
45 |
#include <fcntl.h>
|
| 46 |
46 |
|
|
47 |
|
|
48 |
#define LINE_LENGTH 128
|
|
49 |
#define NUMHOSTS 128
|
|
50 |
|
| 47 |
51 |
/*
|
| 48 |
52 |
Resolves each host name in a given list at regular intervals, and runs
|
| 49 |
53 |
a command whenever any of them resolves to a different IP address than
|
| ... | ... | |
| 92 |
96 |
int interval;
|
| 93 |
97 |
char *file;
|
| 94 |
98 |
char *command;
|
| 95 |
|
properties list, props;
|
|
99 |
char line[LINE_LENGTH];
|
|
100 |
char *p;
|
| 96 |
101 |
struct in_addr *ips;
|
| 97 |
|
int fd;
|
| 98 |
102 |
FILE *pidfd;
|
|
103 |
FILE *fp;
|
| 99 |
104 |
|
| 100 |
105 |
if (argc > 5 || argc < 4)
|
| 101 |
106 |
usage();
|
| ... | ... | |
| 121 |
126 |
}
|
| 122 |
127 |
|
| 123 |
128 |
// Attempt to open configuration file which lists hosts
|
| 124 |
|
fd = open(file, O_RDONLY);
|
| 125 |
|
if (fd == -1) {
|
|
129 |
if ((fp=fopen(file, "r")) == NULL) {
|
| 126 |
130 |
syslog(LOG_ERR, "unable to open configuration file '%s'", file);
|
| 127 |
131 |
exit(1);
|
| 128 |
132 |
}
|
| 129 |
133 |
|
| 130 |
134 |
// Read hostnames in that are in the configuration file
|
| 131 |
|
props = properties_read(fd);
|
| 132 |
|
if (props == NULL) {
|
| 133 |
|
syslog(LOG_ERR, "error reading configuration file");
|
| 134 |
|
exit(1);
|
|
135 |
int count = 0;
|
|
136 |
char **hostlist = malloc(NUMHOSTS * sizeof(char *));
|
|
137 |
if (hostlist == NULL) {
|
|
138 |
fprintf(stderr, "malloc failed\n");
|
|
139 |
exit(2);
|
| 135 |
140 |
}
|
| 136 |
|
|
| 137 |
|
// Close open file handle for dnswatch configuration
|
| 138 |
|
close(fd);
|
| 139 |
|
|
| 140 |
|
int hosts = 1;
|
| 141 |
|
list = props;
|
| 142 |
|
while (list != NULL) {
|
| 143 |
|
list = list->next;
|
| 144 |
|
hosts++;
|
|
141 |
while(fgets(line, sizeof line, fp) != NULL) {
|
|
142 |
p = strchr(line, '\n');
|
|
143 |
if (p) {
|
|
144 |
*p = '\0';
|
|
145 |
}
|
|
146 |
hostlist[count] = malloc(strlen(line));
|
|
147 |
strcpy(hostlist[count], line);
|
|
148 |
count++;
|
| 145 |
149 |
}
|
| 146 |
150 |
|
|
151 |
// Close open file handle for dnswatch configuration
|
|
152 |
fclose(fp);
|
|
153 |
|
| 147 |
154 |
// Create a place to hold resolved ip addresses
|
| 148 |
|
ips = calloc(hosts, sizeof(struct in_addr));
|
|
155 |
ips = calloc(count, sizeof(struct in_addr));
|
| 149 |
156 |
if (ips == NULL) {
|
| 150 |
157 |
fprintf(stderr, "calloc failed\n");
|
| 151 |
158 |
exit(2);
|
| 152 |
159 |
}
|
| 153 |
160 |
|
|
161 |
|
| 154 |
162 |
// Loop forever checking to see if a hostname changes
|
| 155 |
163 |
while (1) {
|
| 156 |
164 |
int i = 0;
|
| 157 |
165 |
int changes = 0;
|
| 158 |
|
list = props;
|
| 159 |
|
while (list != NULL) {
|
| 160 |
|
changes += check_hostname(list->name, &ips[i]);
|
| 161 |
|
list = list->next;
|
| 162 |
|
i++;
|
|
166 |
for (i = 0; i<count; i++) {
|
|
167 |
syslog(LOG_ERR, "Checking hostname '%s'", hostlist[i]);
|
|
168 |
changes += check_hostname(hostlist[i], &ips[i]);
|
| 163 |
169 |
}
|
| 164 |
170 |
|
| 165 |
171 |
// If the hostname changed, run the specified command
|
| ... | ... | |
| 171 |
177 |
}
|
| 172 |
178 |
|
| 173 |
179 |
// Release memory before exiting
|
| 174 |
|
properties_free(props);
|
|
180 |
free(hostlist);
|
| 175 |
181 |
|
| 176 |
182 |
return 0;
|
| 177 |
183 |
}
|