/[apt-spy]/main.c
ViewVC logotype

Contents of /main.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (hide annotations) (download) (vendor branch)
Thu Jun 19 21:10:02 2003 UTC (9 years, 11 months ago) by bagpuss
Branch: MAIN, bagpuss
CVS Tags: initial, HEAD
Changes since 1.1: +0 -0 lines
File MIME type: text/plain
initial import
1 bagpuss 1.1 /* apt-spy (c) Steven Holmes, 2003. This software is licensed as detailed in the LICENSE file. */
2    
3     void usage(void);
4     void version(void);
5    
6     #include <stdio.h>
7     #include <stdlib.h>
8     #include <unistd.h>
9     #include <string.h>
10     #include <limits.h>
11    
12     #include "include/update.h"
13     #include "include/file.h"
14     #include "include/parse.h"
15     #include "include/benchmark.h"
16    
17     const char apt_spy_v[] = "v3.0-2"; /* Version */
18    
19     /* Defaults */
20    
21     char d_area[] = "All";
22     char d_out[] = "/etc/apt/sources.list"; /* Default outfile */
23     char d_config[] = "/etc/apt-spy.conf"; /* Default configuration file */
24     char d_mirror[] = "/usr/share/apt-spy/README.mirrors.txt"; /* Default mirror list */
25     char d_file[] = "ls-lR"; /* Default file to grab when benchmarking */
26     char d_update_url[] = "http://http.us.debian.org/debian/README.mirrors.txt";
27    
28     int main(int argc, char *argv[])
29     {
30     int c;
31     char *cur_entry; /* Current entry we are benchmarking */
32    
33     char *distrib = NULL; /* distrubtion to use. */
34     char *mirror_list = NULL; /* mirror list file */
35     char *config_file = NULL; /* configuraion file */
36     char *proxy = NULL; /* Proxy server to use */
37     char *infile = NULL; /* optional infile */
38     char *outfile = NULL; /* outfile name */
39     char *area = NULL; /* Area to test */
40     char *grab_file = NULL; /* File to grab */
41     char *update_url = NULL; /* URL to use for updating */
42     FILE *infile_p, *outfile_p; /* input/output file pointers */
43     FILE *config_p; /* config file pointer */
44     FILE *mirror_p; /* mirror list pointer */
45     int timeout = 15; /* time to benchmark each server */
46     int toplist = 0; /* Whether to write a list of 5 top servers */
47    
48     unsigned int test_number = UINT_MAX; /* Number of servers to test */
49    
50     server_t current, best[BESTNUMBER]; /* information structures */
51    
52     /* Parse options... */
53     while((c = getopt(argc, argv, "a:c:d:e:f:i:m:o:p:t:u:w:vh")) != -1)
54     switch(c) {
55     case 'a':
56     area = optarg; /* Area to benchmark */
57     break;
58     case 'd':
59     distrib = optarg; /* Distribution to use */
60     break;
61     case 'c':
62     config_file = optarg; /* Config. file */
63     break;
64     case 'e':
65     test_number = atoi(optarg); /* Number of servers to test */
66     break;
67     case 'f':
68     grab_file = optarg; /* File relative to debian base to grab */
69     break;
70     case 'i':
71     infile = optarg; /* User-specified list of server to benchmark */
72     break;
73     case 'm':
74     mirror_list = optarg; /* Read list of servers from here */
75     break;
76     case 'o':
77     outfile = optarg; /* Where we output our wisdom */
78     break;
79     case 'p':
80     proxy = optarg; /* Proxy server to use */
81     break;
82     case 't':
83     timeout = atoi(optarg); /* Time to benchmark each server */
84     break;
85     case 'u':
86     update_url = optarg;
87     break;
88     case 'w':
89     toplist = 1;
90     outfile = optarg;
91     break;
92     case 'v':
93     version();
94     case 'h':
95     default:
96     usage(); /* display help */
97     /* shouldn't reach here */
98     }
99    
100     argc -= optind;
101     argv += optind;
102    
103     /* We require an area and distribution argument if we are not updating */
104     if ((argc == 0) && (distrib == NULL))
105     usage();
106    
107     /* Setup default area argument */
108     if (area == NULL)
109     area = d_area;
110    
111     /* Setup default file argument if none given */
112     if (grab_file == NULL)
113     grab_file = d_file;
114    
115     /* Open mirror file. We pass argc so it can tell if we're updating or not */
116     mirror_p = select_mirror(mirror_list, argc);
117     if (mirror_p == NULL) {
118     perror("fopen");
119     fprintf(stderr, "Error opening mirror file. Exiting.\n");
120     exit(1);
121     }
122    
123     /* the only possible argument now is "update", for updating the mirrors list */
124     if (argc == 1) {
125     if (strcmp(argv[0], "update") != 0) /* We only deal with one text argument */
126     usage();
127    
128     /* If necessary, set update_url to default */
129     if (update_url == NULL)
130     update_url = d_update_url;
131    
132     if (update(mirror_p, update_url, proxy) != 0) {
133     fprintf(stderr, "Update failed. Exiting.\n");
134     exit(1);
135     }
136     printf("Update complete. Exiting.\n");
137     exit(0);
138     }
139    
140     /* argc should be 0. If not, there's something wrong. */
141     if (argc != 0)
142     usage();
143    
144    
145     /* We open the infile. Either a temporary file, or a user-specified one. */
146     infile_p = select_infile(infile);
147     if (infile_p == NULL) {
148     perror("tmpfile");
149     fprintf(stderr, "Failed to open infile. Exiting.\n");
150     exit(1);
151     }
152    
153     /* Set up default if user hasn't specified an outfile */
154     if (outfile == NULL)
155     outfile = d_out;
156    
157     /* Check output file for accessibility */
158     if (check_write_access(outfile) == 1) {
159     fprintf(stderr, "Could not open outfile. Exiting.\n");
160     exit(1);
161     }
162    
163     /* Open config file */
164     config_p = select_config(config_file);
165     if (config_p == NULL) {
166     perror("fopen");
167     fprintf(stderr, "Error opening config file. Exiting.\n");
168     exit(1);
169     }
170    
171     /* Fill temporary file with useful stuff if it's not user-specified. */
172     if (infile == NULL)
173     if (build_area_file(config_p, infile_p, mirror_p, area) != 0) {
174     fprintf(stderr, "Error building area file. Exiting.\n");
175     exit(1);
176     }
177    
178     /* Make sure we're at the beginning... */
179     rewind(infile_p);
180    
181     /* Zero the "best" structure */
182     for (c = 0; c < BESTNUMBER; c++)
183     memset(&best[c], 0, sizeof(server_t));
184    
185     /* This is the main loop. It'll exit when we've exhausted the URL list or test_number is 0 */
186    
187     while (((cur_entry = next_entry(infile_p)) != NULL) && test_number != 0) {
188     if (ferror(infile_p) != 0) {
189     fprintf(stderr, "Error while reading input file\n");
190     exit(1);
191     }
192     tokenise(&current, cur_entry); /* Turn entry into a pretty structure */
193    
194     /* Do the benchmark */
195     if (benchmark(&current, proxy, timeout, grab_file) != 0) {
196     fprintf(stderr, "Error while performing benchmark. Exiting.\n");
197     exit(1);
198     }
199    
200     decide_best(&current, best);
201     free(cur_entry);
202     --test_number;
203     }
204    
205     /* Open the output file... */
206     outfile_p = select_outfile(outfile);
207     if (outfile_p == NULL) {
208     perror("fopen");
209     fprintf(stderr, "Error opening output file. Exiting.\n");
210     exit(1);
211     }
212    
213     /* If infile is NULL (not user specified), we just write the sources list ;) */
214     if (toplist == 0) {
215     if (write_list(outfile_p, best, distrib) != 0) {
216     fprintf(stderr, "Error writing output file. Exiting.");
217     exit(1);
218     }
219     }
220     /* Else we write out the top 5 servers to a file */
221     else {
222     if (write_top(infile_p, outfile_p, best) != 0) {
223     fprintf(stderr, "Error writing top servers list. Exiting.");
224     exit(1);
225     }
226     }
227     /* We're all done */
228     exit(0);
229     }
230    
231     void usage()
232     {
233     printf("Usage: apt-spy [options]\n"
234     "options:\n"
235     "-d distribution\tDebian distribution (ie, stable). Required unless updating.\n"
236     "-a area\t\tArea to benchmark. (eg, Europe).\n"
237     "-c config\tConfiguration file to use.\n"
238     "-e number\tNumber of servers to benchmark before exiting.\n");
239     printf("-f file\t\tFile to grab when benchmarking. (relative to Debian base).\n"
240     "-i file\t\tSpecify input file. For use with the -w option.\n"
241     "-m mirror-list\tMirror list to use, or mirror-list to update when updating.\n"
242     "-o output-file\tWhere to put output.\n"
243     "-p proxy\tProxy server to use. In format <server>:[port]\n"
244     "-t time\t\tTime to benchmark each server for. An approximate value only.\n"
245     "-u update-URL\tURL to grab mirror-list from when updating.\n");
246     printf("-w file\t\tOutput top 5 servers to file for use with -i.\n"
247     "-v\t\tOutput a version number.\n"
248     "-h\t\tDisplay this message.\n"
249     "update\t\tUpdate the mirror list.\n");
250     exit(0);
251     }
252    
253     void version()
254     {
255     printf("apt-spy %s\n", apt_spy_v);
256     exit(0);
257     }

  ViewVC Help
Powered by ViewVC 1.1.5