Use `foreach_principal'. Add long, short, and terse (equivalent to
`list') output formats. Short is the default. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@4503 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		
							
								
								
									
										166
									
								
								kadmin/get.c
									
									
									
									
									
								
							
							
						
						
									
										166
									
								
								kadmin/get.c
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * Copyright (c) 1997 Kungliga Tekniska H<>gskolan |  * Copyright (c) 1997, 1998 Kungliga Tekniska H<>gskolan | ||||||
|  * (Royal Institute of Technology, Stockholm, Sweden).  |  * (Royal Institute of Technology, Stockholm, Sweden).  | ||||||
|  * All rights reserved.  |  * All rights reserved.  | ||||||
|  * |  * | ||||||
| @@ -41,20 +41,86 @@ | |||||||
|  |  | ||||||
| RCSID("$Id$"); | RCSID("$Id$"); | ||||||
|  |  | ||||||
|  | struct get_entry_data { | ||||||
|  |     void (*header)(void); | ||||||
|  |     void (*format)(kadm5_principal_ent_t); | ||||||
|  | }; | ||||||
|  |  | ||||||
| static void | static void | ||||||
| print_entry(kadm5_principal_ent_t princ) | print_entry_terse(kadm5_principal_ent_t princ) | ||||||
|  | { | ||||||
|  |     char *p; | ||||||
|  |     krb5_unparse_name(context, princ->principal, &p); | ||||||
|  |     printf("  %s\n", p); | ||||||
|  |     free(p); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | print_header_short(void) | ||||||
|  | { | ||||||
|  |     printf("%-20s ", "Principal"); | ||||||
|  |      | ||||||
|  |     printf("%-10s ", "Expires"); | ||||||
|  | 	     | ||||||
|  |     printf("%-10s ", "PW-exp"); | ||||||
|  | 	     | ||||||
|  |     printf("%-10s ", "PW-change"); | ||||||
|  | 	 | ||||||
|  |     printf("%-9s ", "Max life"); | ||||||
|  |  | ||||||
|  |     printf("%-9s ", "Max renew"); | ||||||
|  |      | ||||||
|  |     printf("\n"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | print_entry_short(kadm5_principal_ent_t princ) | ||||||
|  | { | ||||||
|  |     char buf[1024]; | ||||||
|  |      | ||||||
|  |     krb5_unparse_name_fixed_short(context, princ->principal, buf, sizeof(buf)); | ||||||
|  |     printf("%-20s ", buf); | ||||||
|  |      | ||||||
|  |     timeval2str(princ->princ_expire_time, buf, sizeof(buf), 0); | ||||||
|  |     printf("%-10s ", buf); | ||||||
|  | 	     | ||||||
|  |     timeval2str(princ->pw_expiration, buf, sizeof(buf), 0); | ||||||
|  |     printf("%-10s ", buf); | ||||||
|  | 	     | ||||||
|  |     timeval2str(princ->last_pwd_change, buf, sizeof(buf), 0); | ||||||
|  |     printf("%-10s ", buf); | ||||||
|  | 	 | ||||||
|  |     deltat2str(princ->max_life, buf, sizeof(buf)); | ||||||
|  |     printf("%-9s ", buf); | ||||||
|  |  | ||||||
|  |     deltat2str(princ->max_renewable_life, buf, sizeof(buf)); | ||||||
|  |     printf("%-9s ", buf); | ||||||
|  |  | ||||||
|  | #if 0 | ||||||
|  |     timeval2str(princ->mod_date, buf, sizeof(buf), 0); | ||||||
|  |     printf("%-10s ", buf); | ||||||
|  |  | ||||||
|  |     krb5_unparse_name_fixed(context, princ->mod_name, buf, sizeof(buf)); | ||||||
|  |     printf("%-24s", buf); | ||||||
|  | #endif | ||||||
|  |      | ||||||
|  |     printf("\n"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | print_entry_long(kadm5_principal_ent_t princ) | ||||||
| { | { | ||||||
|     char buf[1024]; |     char buf[1024]; | ||||||
|      |      | ||||||
|     krb5_unparse_name_fixed(context, princ->principal, buf, sizeof(buf)); |     krb5_unparse_name_fixed(context, princ->principal, buf, sizeof(buf)); | ||||||
|     printf("%24s: %s\n", "Principal", buf); |     printf("%24s: %s\n", "Principal", buf); | ||||||
|     timeval2str(princ->princ_expire_time, buf, sizeof(buf)); |     timeval2str(princ->princ_expire_time, buf, sizeof(buf), 1); | ||||||
|     printf("%24s: %s\n", "Principal expires", buf); |     printf("%24s: %s\n", "Principal expires", buf); | ||||||
| 	     | 	     | ||||||
|     timeval2str(princ->pw_expiration, buf, sizeof(buf)); |     timeval2str(princ->pw_expiration, buf, sizeof(buf), 1); | ||||||
|     printf("%24s: %s\n", "Password expires", buf); |     printf("%24s: %s\n", "Password expires", buf); | ||||||
| 	     | 	     | ||||||
|     timeval2str(princ->last_pwd_change, buf, sizeof(buf)); |     timeval2str(princ->last_pwd_change, buf, sizeof(buf), 1); | ||||||
|     printf("%24s: %s\n", "Last password change", buf); |     printf("%24s: %s\n", "Last password change", buf); | ||||||
| 	 | 	 | ||||||
|     deltat2str(princ->max_life, buf, sizeof(buf)); |     deltat2str(princ->max_life, buf, sizeof(buf)); | ||||||
| @@ -65,12 +131,12 @@ print_entry(kadm5_principal_ent_t princ) | |||||||
|     printf("%24s: %d\n", "Kvno", princ->kvno); |     printf("%24s: %d\n", "Kvno", princ->kvno); | ||||||
|     printf("%24s: %d\n", "Mkvno", princ->mkvno); |     printf("%24s: %d\n", "Mkvno", princ->mkvno); | ||||||
|     printf("%24s: %s\n", "Policy", princ->policy ? princ->policy : "none"); |     printf("%24s: %s\n", "Policy", princ->policy ? princ->policy : "none"); | ||||||
|     timeval2str(princ->last_success, buf, sizeof(buf)); |     timeval2str(princ->last_success, buf, sizeof(buf), 1); | ||||||
|     printf("%24s: %s\n", "Last successful login", buf); |     printf("%24s: %s\n", "Last successful login", buf); | ||||||
|     timeval2str(princ->last_failed, buf, sizeof(buf)); |     timeval2str(princ->last_failed, buf, sizeof(buf), 1); | ||||||
|     printf("%24s: %s\n", "Last failed login", buf); |     printf("%24s: %s\n", "Last failed login", buf); | ||||||
|     printf("%24s: %d\n", "Failed login count", princ->fail_auth_count); |     printf("%24s: %d\n", "Failed login count", princ->fail_auth_count); | ||||||
|     timeval2str(princ->mod_date, buf, sizeof(buf)); |     timeval2str(princ->mod_date, buf, sizeof(buf), 1); | ||||||
|     printf("%24s: %s\n", "Last modified", buf); |     printf("%24s: %s\n", "Last modified", buf); | ||||||
|     krb5_unparse_name_fixed(context, princ->mod_name, buf, sizeof(buf)); |     krb5_unparse_name_fixed(context, princ->mod_name, buf, sizeof(buf)); | ||||||
|     printf("%24s: %s\n", "Modifier", buf); |     printf("%24s: %s\n", "Modifier", buf); | ||||||
| @@ -79,31 +145,85 @@ print_entry(kadm5_principal_ent_t princ) | |||||||
|     printf("\n"); |     printf("\n"); | ||||||
| } | } | ||||||
|  |  | ||||||
| int |  | ||||||
| get_entry(int argc, char **argv) | static int | ||||||
|  | do_get_entry(krb5_principal principal, void *data) | ||||||
| { | { | ||||||
|     kadm5_principal_ent_rec princ; |     kadm5_principal_ent_rec princ; | ||||||
|     krb5_error_code ret; |     krb5_error_code ret; | ||||||
|     krb5_principal princ_ent; |     struct get_entry_data *e = data; | ||||||
|     int i; |  | ||||||
|      |      | ||||||
|     for(i = 1; i < argc; i++){ |  | ||||||
|     memset(&princ, 0, sizeof(princ)); |     memset(&princ, 0, sizeof(princ)); | ||||||
| 	ret = krb5_parse_name(context, argv[i], &princ_ent); |     ret = kadm5_get_principal(kadm_handle, principal,  | ||||||
| 	if(ret){ |  | ||||||
| 	    krb5_warn(context, ret, "krb5_parse_name(%s)", argv[i]); |  | ||||||
| 	    continue; |  | ||||||
| 	} |  | ||||||
| 	ret = kadm5_get_principal(kadm_handle, princ_ent,  |  | ||||||
| 			      &princ, KADM5_PRINCIPAL_NORMAL_MASK); | 			      &princ, KADM5_PRINCIPAL_NORMAL_MASK); | ||||||
| 	krb5_free_principal(context, princ_ent); |  | ||||||
|     if(ret) |     if(ret) | ||||||
| 	    krb5_warn(context, ret, "%s", argv[i]); | 	return ret; | ||||||
|     else { |     else { | ||||||
| 	    print_entry(&princ); | 	if(e->header) { | ||||||
| 	    kadm5_free_principal_ent(kadm_handle, &princ); | 	    (*e->header)(); | ||||||
|  | 	    e->header = NULL; /* XXX only once */ | ||||||
| 	} | 	} | ||||||
|  | 	(e->format)(&princ); | ||||||
|  | 	kadm5_free_principal_ent(kadm_handle, &princ); | ||||||
|     } |     } | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int | ||||||
|  | get_entry(int argc, char **argv) | ||||||
|  | { | ||||||
|  |     int i; | ||||||
|  |     krb5_error_code ret; | ||||||
|  |     struct get_entry_data data; | ||||||
|  |     struct getargs args[] = { | ||||||
|  | 	{ "long",	'l',	arg_flag,	NULL, "long format" }, | ||||||
|  | 	{ "terse",	't',	arg_flag,	NULL, "terse format" }, | ||||||
|  |     }; | ||||||
|  |     int num_args = sizeof(args) / sizeof(args[0]); | ||||||
|  |     int optind = 0; | ||||||
|  |     int long_flag = 0; | ||||||
|  |     int terse_flag = 0; | ||||||
|  |      | ||||||
|  |     args[0].value = &long_flag; | ||||||
|  |     args[1].value = &terse_flag; | ||||||
|  |     if(getarg(args, num_args, argc, argv, &optind)) | ||||||
|  | 	goto usage; | ||||||
|  |     if(optind == argc) | ||||||
|  | 	goto usage; | ||||||
|  |  | ||||||
|  |     if(long_flag) { | ||||||
|  | 	data.format = print_entry_long; | ||||||
|  | 	data.header = NULL; | ||||||
|  |     } else if(terse_flag) { | ||||||
|  | 	data.format = print_entry_terse; | ||||||
|  | 	data.header = NULL; | ||||||
|  |     } else { | ||||||
|  | 	data.format = print_entry_short; | ||||||
|  | 	data.header = print_header_short; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     argc -= optind; | ||||||
|  |     argv += optind; | ||||||
|  |  | ||||||
|  |     for(i = 0; i < argc; i++) | ||||||
|  | 	ret = foreach_principal(argv[i], do_get_entry, &data); | ||||||
|  |     return 0; | ||||||
|  | usage: | ||||||
|  |     arg_printusage (args, num_args, "principal..."); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int | ||||||
|  | list_princs(int argc, char **argv) | ||||||
|  | { | ||||||
|  |     int i; | ||||||
|  |     krb5_error_code ret; | ||||||
|  |     struct get_entry_data data; | ||||||
|  |  | ||||||
|  |     data.format = print_entry_terse; | ||||||
|  |     data.header = NULL; | ||||||
|  |      | ||||||
|  |     for(i = 1; i < argc; i++) | ||||||
|  | 	ret = foreach_principal(argv[i], do_get_entry, &data); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Johan Danielsson
					Johan Danielsson