2 * Copyright 2009 The Board of Trustees of the University
3 * of Illinois. See the LICENSE file for detailed license information.
5 * Portions, specifically log_usage_stats(), ssh_usage_stats_init(),
6 * ssh_usage_stats_close(), ssh_usage_ent_s, ssh_usage_tag_e and
7 * TAG #defines were based on those from Usage Metrics portions of:
8 * gridftp/server/source/globus_i_gfs_log.c
10 * Copyright 1999-2006 University of Chicago
12 * Licensed under the Apache License, Version 2.0 (the "License");
13 * you may not use this file except in compliance with the License.
14 * You may obtain a copy of the License at
16 * http://www.apache.org/licenses/LICENSE-2.0
18 * Unless required by applicable law or agreed to in writing, software
19 * distributed under the License is distributed on an "AS IS" BASIS,
20 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 * See the License for the specific language governing permissions and
22 * limitations under the License.
28 #include "ssh-globus-usage.h"
30 #ifdef HAVE_GLOBUS_USAGE
32 static globus_list_t *usage_handle_list = NULL;
34 #define SSH_GLOBUS_USAGE_ID 12
35 #define SSH_GLOBUS_USAGE_VER 0
37 #define SSH_GLOBUS_DEFAULT_TAGLIST "VvMm"
38 #define SSH_GLOBUS_ALL_TAGLIST "VvMmIuU"
39 #define SSH_GLOBUS_TAGCOUNT 25
41 typedef enum ssh_usage_tag_e
43 SSH_GLOBUS_USAGE_SSH_VER = 'V',
44 SSH_GLOBUS_USAGE_SSL_VER = 'v',
45 SSH_GLOBUS_USAGE_METHOD = 'M',
46 SSH_GLOBUS_USAGE_MECHANISM = 'm',
47 SSH_GLOBUS_USAGE_CLIENTIP = 'I',
48 SSH_GLOBUS_USAGE_USERNAME = 'u',
49 SSH_GLOBUS_USAGE_USERDN = 'U'
50 /* !! ADD to ALL_TAGLIST above and to globus_usage_stats_send()
51 invocation below when adding here */
54 typedef struct ssh_usage_ent_s
56 globus_usage_stats_handle_t handle;
63 ssh_usage_stats_init(int disable_usage_stats, char *usage_stats_targets)
65 globus_result_t result;
66 char * target_str = NULL;
70 globus_list_t * list = NULL;
71 ssh_usage_ent_t * usage_ent = NULL;
73 if (disable_usage_stats)
74 return GLOBUS_SUCCESS;
76 result = globus_module_activate(GLOBUS_USAGE_MODULE);
77 if (result != GLOBUS_SUCCESS)
79 error("ERROR: couldn't activate USAGE module");
83 if (!usage_stats_targets ||
84 !strcasecmp(usage_stats_targets, "default"))
85 target_str = strdup(CILOGON_COLLECTOR);
87 target_str = strdup(usage_stats_targets);
89 if (target_str == NULL)
91 error("ERROR: strdup failure for target_str");
94 debug("Processing usage_stats_target (%s)\n", target_str);
96 if(target_str && strchr(target_str, '!'))
101 usage_ent = (ssh_usage_ent_t *) malloc(sizeof(ssh_usage_ent_t));
102 if (usage_ent == NULL)
104 error("ERROR: couldn't allocate for ssh_usage_ent_t");
108 if ((ptr = strchr(target, ',')) != NULL)
111 entry = strdup(target);
114 error("ERROR: strdup failure for target");
123 if((ptr = strchr(entry, '!')) != NULL)
126 usage_ent->taglist = strdup(ptr + 1);
127 if (usage_ent->taglist == NULL)
129 error("ERROR: strdup failure for taglist");
132 if(strlen(usage_ent->taglist) > SSH_GLOBUS_TAGCOUNT)
134 usage_ent->taglist[SSH_GLOBUS_TAGCOUNT + 1] = '\0';
139 usage_ent->taglist = strdup(SSH_GLOBUS_DEFAULT_TAGLIST);
140 if (usage_ent->taglist == NULL)
142 error("ERROR: couldn't allocate for taglist");
147 if(strcasecmp(usage_ent->taglist, "default") == 0)
149 free(usage_ent->taglist);
150 usage_ent->taglist = strdup(SSH_GLOBUS_DEFAULT_TAGLIST);
151 if (usage_ent->taglist == NULL)
153 error("ERROR: couldn't allocate for taglist");
157 else if(strcasecmp(usage_ent->taglist, "all") == 0)
159 free(usage_ent->taglist);
160 usage_ent->taglist = strdup(SSH_GLOBUS_ALL_TAGLIST);
161 if (usage_ent->taglist == NULL)
163 error("ERROR: couldn't allocate for taglist");
168 usage_ent->target = entry;
170 globus_list_insert(&usage_handle_list, usage_ent);
172 while(target != NULL);
178 usage_ent = (ssh_usage_ent_t *) malloc(sizeof(ssh_usage_ent_t));
179 if (usage_ent == NULL)
181 error("ERROR: couldn't allocate for usage_ent");
185 usage_ent->target = target_str;
186 usage_ent->taglist = strdup(SSH_GLOBUS_DEFAULT_TAGLIST);
187 if (usage_ent->taglist == NULL)
189 error("ERROR: couldn't allocate for taglist");
193 globus_list_insert(&usage_handle_list, usage_ent);
197 for(list = usage_handle_list;
198 !globus_list_empty(list);
199 list = globus_list_rest(list))
201 usage_ent = (ssh_usage_ent_t *) globus_list_first(list);
203 usage_ent->handle = NULL;
204 debug("USAGE: Initializing (%s) (%s)", usage_ent->target?:"NULL",
205 usage_ent->taglist?:"NULL");
206 result = globus_usage_stats_handle_init(
209 SSH_GLOBUS_USAGE_VER,
226 return GLOBUS_FAILURE;
230 ssh_usage_stats_close(int disable_usage_stats)
234 if (disable_usage_stats)
237 list = usage_handle_list;
239 while(!globus_list_empty(list))
241 ssh_usage_ent_t *usage_ent;
243 usage_ent = (ssh_usage_ent_t *)
244 globus_list_remove(&list, list);
248 if(usage_ent->handle)
250 globus_usage_stats_handle_destroy(usage_ent->handle);
252 if(usage_ent->target)
254 free(usage_ent->target);
256 if(usage_ent->taglist)
258 free(usage_ent->taglist);
263 usage_handle_list = NULL;
267 log_usage_stats(char *ssh_release, const char *ssl_release,
268 char *method, char *mechanism, const char *clientip,
269 char *username, char *userdn)
271 globus_result_t result;
272 globus_list_t * list;
273 ssh_usage_ent_t * usage_ent;
274 char * keys[SSH_GLOBUS_TAGCOUNT];
275 char * values[SSH_GLOBUS_TAGCOUNT];
280 char * save_taglist = NULL;
282 for(list = usage_handle_list;
283 !globus_list_empty(list);
284 list = globus_list_rest(list))
286 usage_ent = (ssh_usage_ent_t *) globus_list_first(list);
288 if(!usage_ent || usage_ent->handle == NULL)
291 if(save_taglist == NULL ||
292 strcmp(save_taglist, usage_ent->taglist) != 0)
294 save_taglist = usage_ent->taglist;
296 ptr = usage_ent->taglist;
302 case SSH_GLOBUS_USAGE_SSH_VER:
307 case SSH_GLOBUS_USAGE_SSL_VER:
309 value = (char *) ssl_release;
312 case SSH_GLOBUS_USAGE_METHOD:
317 case SSH_GLOBUS_USAGE_MECHANISM:
319 value = mechanism?:"";
322 case SSH_GLOBUS_USAGE_CLIENTIP:
324 value = (char *) clientip?:"";
327 case SSH_GLOBUS_USAGE_USERNAME:
329 value = username?:"";
332 case SSH_GLOBUS_USAGE_USERDN:
343 if(key != NULL && value != NULL)
354 #ifdef HAVE_GLOBUS_USAGE_SEND_ARRAY
355 result = globus_usage_stats_send_array(
356 usage_ent->handle, i, keys, values);
359 result = globus_usage_stats_send(
360 usage_ent->handle, i,
361 i>0?keys[0]:NULL, i>0?values[0]:NULL,
362 i>1?keys[1]:NULL, i>1?values[1]:NULL,
363 i>2?keys[2]:NULL, i>2?values[2]:NULL,
364 i>3?keys[3]:NULL, i>3?values[3]:NULL,
365 i>4?keys[4]:NULL, i>4?values[4]:NULL,
366 i>5?keys[5]:NULL, i>5?values[5]:NULL,
367 i>6?keys[6]:NULL, i>6?values[6]:NULL);
368 #endif /* HAVE_GLOBUS_USAGE_SEND_ARRAY */
373 #endif /* HAVE_GLOBUS_USAGE */
376 ssh_globus_send_usage_metrics(char *ssh_release, const char *ssl_release,
377 char *method, char *mechanism, const char *client_ip,
378 char *username, char *userdn)
380 #ifdef HAVE_GLOBUS_USAGE
382 log_usage_stats(ssh_release, ssl_release, method, mechanism,
383 client_ip, username, userdn);
385 #endif /* HAVE_GLOBUS_USAGE */