1*ebfedea0SLionel Sambuc /* $NetBSD: iprop-log.c,v 1.1.1.1 2011/04/13 18:15:29 elric Exp $ */ 2*ebfedea0SLionel Sambuc 3*ebfedea0SLionel Sambuc /* 4*ebfedea0SLionel Sambuc * Copyright (c) 1997 - 2005 Kungliga Tekniska Högskolan 5*ebfedea0SLionel Sambuc * (Royal Institute of Technology, Stockholm, Sweden). 6*ebfedea0SLionel Sambuc * All rights reserved. 7*ebfedea0SLionel Sambuc * 8*ebfedea0SLionel Sambuc * Redistribution and use in source and binary forms, with or without 9*ebfedea0SLionel Sambuc * modification, are permitted provided that the following conditions 10*ebfedea0SLionel Sambuc * are met: 11*ebfedea0SLionel Sambuc * 12*ebfedea0SLionel Sambuc * 1. Redistributions of source code must retain the above copyright 13*ebfedea0SLionel Sambuc * notice, this list of conditions and the following disclaimer. 14*ebfedea0SLionel Sambuc * 15*ebfedea0SLionel Sambuc * 2. Redistributions in binary form must reproduce the above copyright 16*ebfedea0SLionel Sambuc * notice, this list of conditions and the following disclaimer in the 17*ebfedea0SLionel Sambuc * documentation and/or other materials provided with the distribution. 18*ebfedea0SLionel Sambuc * 19*ebfedea0SLionel Sambuc * 3. Neither the name of the Institute nor the names of its contributors 20*ebfedea0SLionel Sambuc * may be used to endorse or promote products derived from this software 21*ebfedea0SLionel Sambuc * without specific prior written permission. 22*ebfedea0SLionel Sambuc * 23*ebfedea0SLionel Sambuc * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 24*ebfedea0SLionel Sambuc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25*ebfedea0SLionel Sambuc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26*ebfedea0SLionel Sambuc * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 27*ebfedea0SLionel Sambuc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28*ebfedea0SLionel Sambuc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29*ebfedea0SLionel Sambuc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30*ebfedea0SLionel Sambuc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31*ebfedea0SLionel Sambuc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32*ebfedea0SLionel Sambuc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33*ebfedea0SLionel Sambuc * SUCH DAMAGE. 34*ebfedea0SLionel Sambuc */ 35*ebfedea0SLionel Sambuc 36*ebfedea0SLionel Sambuc #include "iprop.h" 37*ebfedea0SLionel Sambuc #include <krb5/sl.h> 38*ebfedea0SLionel Sambuc #include <krb5/parse_time.h> 39*ebfedea0SLionel Sambuc #include "iprop-commands.h" 40*ebfedea0SLionel Sambuc 41*ebfedea0SLionel Sambuc __RCSID("$NetBSD: iprop-log.c,v 1.1.1.1 2011/04/13 18:15:29 elric Exp $"); 42*ebfedea0SLionel Sambuc 43*ebfedea0SLionel Sambuc static krb5_context context; 44*ebfedea0SLionel Sambuc 45*ebfedea0SLionel Sambuc static kadm5_server_context * 46*ebfedea0SLionel Sambuc get_kadmin_context(const char *config_file, char *realm) 47*ebfedea0SLionel Sambuc { 48*ebfedea0SLionel Sambuc kadm5_config_params conf; 49*ebfedea0SLionel Sambuc krb5_error_code ret; 50*ebfedea0SLionel Sambuc void *kadm_handle; 51*ebfedea0SLionel Sambuc char **files; 52*ebfedea0SLionel Sambuc 53*ebfedea0SLionel Sambuc if (config_file == NULL) { 54*ebfedea0SLionel Sambuc char *file; 55*ebfedea0SLionel Sambuc asprintf(&file, "%s/kdc.conf", hdb_db_dir(context)); 56*ebfedea0SLionel Sambuc if (file == NULL) 57*ebfedea0SLionel Sambuc errx(1, "out of memory"); 58*ebfedea0SLionel Sambuc config_file = file; 59*ebfedea0SLionel Sambuc } 60*ebfedea0SLionel Sambuc 61*ebfedea0SLionel Sambuc ret = krb5_prepend_config_files_default(config_file, &files); 62*ebfedea0SLionel Sambuc if (ret) 63*ebfedea0SLionel Sambuc krb5_err(context, 1, ret, "getting configuration files"); 64*ebfedea0SLionel Sambuc 65*ebfedea0SLionel Sambuc ret = krb5_set_config_files(context, files); 66*ebfedea0SLionel Sambuc krb5_free_config_files(files); 67*ebfedea0SLionel Sambuc if (ret) 68*ebfedea0SLionel Sambuc krb5_err(context, 1, ret, "reading configuration files"); 69*ebfedea0SLionel Sambuc 70*ebfedea0SLionel Sambuc memset(&conf, 0, sizeof(conf)); 71*ebfedea0SLionel Sambuc if(realm) { 72*ebfedea0SLionel Sambuc conf.mask |= KADM5_CONFIG_REALM; 73*ebfedea0SLionel Sambuc conf.realm = realm; 74*ebfedea0SLionel Sambuc } 75*ebfedea0SLionel Sambuc 76*ebfedea0SLionel Sambuc ret = kadm5_init_with_password_ctx (context, 77*ebfedea0SLionel Sambuc KADM5_ADMIN_SERVICE, 78*ebfedea0SLionel Sambuc NULL, 79*ebfedea0SLionel Sambuc KADM5_ADMIN_SERVICE, 80*ebfedea0SLionel Sambuc &conf, 0, 0, 81*ebfedea0SLionel Sambuc &kadm_handle); 82*ebfedea0SLionel Sambuc if (ret) 83*ebfedea0SLionel Sambuc krb5_err (context, 1, ret, "kadm5_init_with_password_ctx"); 84*ebfedea0SLionel Sambuc 85*ebfedea0SLionel Sambuc return (kadm5_server_context *)kadm_handle; 86*ebfedea0SLionel Sambuc } 87*ebfedea0SLionel Sambuc 88*ebfedea0SLionel Sambuc /* 89*ebfedea0SLionel Sambuc * dump log 90*ebfedea0SLionel Sambuc */ 91*ebfedea0SLionel Sambuc 92*ebfedea0SLionel Sambuc static const char *op_names[] = { 93*ebfedea0SLionel Sambuc "get", 94*ebfedea0SLionel Sambuc "delete", 95*ebfedea0SLionel Sambuc "create", 96*ebfedea0SLionel Sambuc "rename", 97*ebfedea0SLionel Sambuc "chpass", 98*ebfedea0SLionel Sambuc "modify", 99*ebfedea0SLionel Sambuc "randkey", 100*ebfedea0SLionel Sambuc "get_privs", 101*ebfedea0SLionel Sambuc "get_princs", 102*ebfedea0SLionel Sambuc "chpass_with_key", 103*ebfedea0SLionel Sambuc "nop" 104*ebfedea0SLionel Sambuc }; 105*ebfedea0SLionel Sambuc 106*ebfedea0SLionel Sambuc static void 107*ebfedea0SLionel Sambuc print_entry(kadm5_server_context *server_context, 108*ebfedea0SLionel Sambuc uint32_t ver, 109*ebfedea0SLionel Sambuc time_t timestamp, 110*ebfedea0SLionel Sambuc enum kadm_ops op, 111*ebfedea0SLionel Sambuc uint32_t len, 112*ebfedea0SLionel Sambuc krb5_storage *sp, 113*ebfedea0SLionel Sambuc void *ctx) 114*ebfedea0SLionel Sambuc { 115*ebfedea0SLionel Sambuc char t[256]; 116*ebfedea0SLionel Sambuc int32_t mask; 117*ebfedea0SLionel Sambuc hdb_entry ent; 118*ebfedea0SLionel Sambuc krb5_principal source; 119*ebfedea0SLionel Sambuc char *name1, *name2; 120*ebfedea0SLionel Sambuc krb5_data data; 121*ebfedea0SLionel Sambuc krb5_context scontext = server_context->context; 122*ebfedea0SLionel Sambuc 123*ebfedea0SLionel Sambuc off_t end = krb5_storage_seek(sp, 0, SEEK_CUR) + len; 124*ebfedea0SLionel Sambuc 125*ebfedea0SLionel Sambuc krb5_error_code ret; 126*ebfedea0SLionel Sambuc 127*ebfedea0SLionel Sambuc strftime(t, sizeof(t), "%Y-%m-%d %H:%M:%S", localtime(×tamp)); 128*ebfedea0SLionel Sambuc 129*ebfedea0SLionel Sambuc if(op < kadm_get || op > kadm_nop) { 130*ebfedea0SLionel Sambuc printf("unknown op: %d\n", op); 131*ebfedea0SLionel Sambuc krb5_storage_seek(sp, end, SEEK_SET); 132*ebfedea0SLionel Sambuc return; 133*ebfedea0SLionel Sambuc } 134*ebfedea0SLionel Sambuc 135*ebfedea0SLionel Sambuc printf ("%s: ver = %u, timestamp = %s, len = %u\n", 136*ebfedea0SLionel Sambuc op_names[op], ver, t, len); 137*ebfedea0SLionel Sambuc switch(op) { 138*ebfedea0SLionel Sambuc case kadm_delete: 139*ebfedea0SLionel Sambuc krb5_ret_principal(sp, &source); 140*ebfedea0SLionel Sambuc krb5_unparse_name(scontext, source, &name1); 141*ebfedea0SLionel Sambuc printf(" %s\n", name1); 142*ebfedea0SLionel Sambuc free(name1); 143*ebfedea0SLionel Sambuc krb5_free_principal(scontext, source); 144*ebfedea0SLionel Sambuc break; 145*ebfedea0SLionel Sambuc case kadm_rename: 146*ebfedea0SLionel Sambuc ret = krb5_data_alloc(&data, len); 147*ebfedea0SLionel Sambuc if (ret) 148*ebfedea0SLionel Sambuc krb5_err (scontext, 1, ret, "kadm_rename: data alloc: %d", len); 149*ebfedea0SLionel Sambuc krb5_ret_principal(sp, &source); 150*ebfedea0SLionel Sambuc krb5_storage_read(sp, data.data, data.length); 151*ebfedea0SLionel Sambuc hdb_value2entry(scontext, &data, &ent); 152*ebfedea0SLionel Sambuc krb5_unparse_name(scontext, source, &name1); 153*ebfedea0SLionel Sambuc krb5_unparse_name(scontext, ent.principal, &name2); 154*ebfedea0SLionel Sambuc printf(" %s -> %s\n", name1, name2); 155*ebfedea0SLionel Sambuc free(name1); 156*ebfedea0SLionel Sambuc free(name2); 157*ebfedea0SLionel Sambuc krb5_free_principal(scontext, source); 158*ebfedea0SLionel Sambuc free_hdb_entry(&ent); 159*ebfedea0SLionel Sambuc break; 160*ebfedea0SLionel Sambuc case kadm_create: 161*ebfedea0SLionel Sambuc ret = krb5_data_alloc(&data, len); 162*ebfedea0SLionel Sambuc if (ret) 163*ebfedea0SLionel Sambuc krb5_err (scontext, 1, ret, "kadm_create: data alloc: %d", len); 164*ebfedea0SLionel Sambuc krb5_storage_read(sp, data.data, data.length); 165*ebfedea0SLionel Sambuc ret = hdb_value2entry(scontext, &data, &ent); 166*ebfedea0SLionel Sambuc if(ret) 167*ebfedea0SLionel Sambuc abort(); 168*ebfedea0SLionel Sambuc mask = ~0; 169*ebfedea0SLionel Sambuc goto foo; 170*ebfedea0SLionel Sambuc case kadm_modify: 171*ebfedea0SLionel Sambuc ret = krb5_data_alloc(&data, len); 172*ebfedea0SLionel Sambuc if (ret) 173*ebfedea0SLionel Sambuc krb5_err (scontext, 1, ret, "kadm_modify: data alloc: %d", len); 174*ebfedea0SLionel Sambuc krb5_ret_int32(sp, &mask); 175*ebfedea0SLionel Sambuc krb5_storage_read(sp, data.data, data.length); 176*ebfedea0SLionel Sambuc ret = hdb_value2entry(scontext, &data, &ent); 177*ebfedea0SLionel Sambuc if(ret) 178*ebfedea0SLionel Sambuc abort(); 179*ebfedea0SLionel Sambuc foo: 180*ebfedea0SLionel Sambuc if(ent.principal /* mask & KADM5_PRINCIPAL */) { 181*ebfedea0SLionel Sambuc krb5_unparse_name(scontext, ent.principal, &name1); 182*ebfedea0SLionel Sambuc printf(" principal = %s\n", name1); 183*ebfedea0SLionel Sambuc free(name1); 184*ebfedea0SLionel Sambuc } 185*ebfedea0SLionel Sambuc if(mask & KADM5_PRINC_EXPIRE_TIME) { 186*ebfedea0SLionel Sambuc if(ent.valid_end == NULL) { 187*ebfedea0SLionel Sambuc strlcpy(t, "never", sizeof(t)); 188*ebfedea0SLionel Sambuc } else { 189*ebfedea0SLionel Sambuc strftime(t, sizeof(t), "%Y-%m-%d %H:%M:%S", 190*ebfedea0SLionel Sambuc localtime(ent.valid_end)); 191*ebfedea0SLionel Sambuc } 192*ebfedea0SLionel Sambuc printf(" expires = %s\n", t); 193*ebfedea0SLionel Sambuc } 194*ebfedea0SLionel Sambuc if(mask & KADM5_PW_EXPIRATION) { 195*ebfedea0SLionel Sambuc if(ent.pw_end == NULL) { 196*ebfedea0SLionel Sambuc strlcpy(t, "never", sizeof(t)); 197*ebfedea0SLionel Sambuc } else { 198*ebfedea0SLionel Sambuc strftime(t, sizeof(t), "%Y-%m-%d %H:%M:%S", 199*ebfedea0SLionel Sambuc localtime(ent.pw_end)); 200*ebfedea0SLionel Sambuc } 201*ebfedea0SLionel Sambuc printf(" password exp = %s\n", t); 202*ebfedea0SLionel Sambuc } 203*ebfedea0SLionel Sambuc if(mask & KADM5_LAST_PWD_CHANGE) { 204*ebfedea0SLionel Sambuc } 205*ebfedea0SLionel Sambuc if(mask & KADM5_ATTRIBUTES) { 206*ebfedea0SLionel Sambuc unparse_flags(HDBFlags2int(ent.flags), 207*ebfedea0SLionel Sambuc asn1_HDBFlags_units(), t, sizeof(t)); 208*ebfedea0SLionel Sambuc printf(" attributes = %s\n", t); 209*ebfedea0SLionel Sambuc } 210*ebfedea0SLionel Sambuc if(mask & KADM5_MAX_LIFE) { 211*ebfedea0SLionel Sambuc if(ent.max_life == NULL) 212*ebfedea0SLionel Sambuc strlcpy(t, "for ever", sizeof(t)); 213*ebfedea0SLionel Sambuc else 214*ebfedea0SLionel Sambuc unparse_time(*ent.max_life, t, sizeof(t)); 215*ebfedea0SLionel Sambuc printf(" max life = %s\n", t); 216*ebfedea0SLionel Sambuc } 217*ebfedea0SLionel Sambuc if(mask & KADM5_MAX_RLIFE) { 218*ebfedea0SLionel Sambuc if(ent.max_renew == NULL) 219*ebfedea0SLionel Sambuc strlcpy(t, "for ever", sizeof(t)); 220*ebfedea0SLionel Sambuc else 221*ebfedea0SLionel Sambuc unparse_time(*ent.max_renew, t, sizeof(t)); 222*ebfedea0SLionel Sambuc printf(" max rlife = %s\n", t); 223*ebfedea0SLionel Sambuc } 224*ebfedea0SLionel Sambuc if(mask & KADM5_MOD_TIME) { 225*ebfedea0SLionel Sambuc printf(" mod time\n"); 226*ebfedea0SLionel Sambuc } 227*ebfedea0SLionel Sambuc if(mask & KADM5_MOD_NAME) { 228*ebfedea0SLionel Sambuc printf(" mod name\n"); 229*ebfedea0SLionel Sambuc } 230*ebfedea0SLionel Sambuc if(mask & KADM5_KVNO) { 231*ebfedea0SLionel Sambuc printf(" kvno = %d\n", ent.kvno); 232*ebfedea0SLionel Sambuc } 233*ebfedea0SLionel Sambuc if(mask & KADM5_MKVNO) { 234*ebfedea0SLionel Sambuc printf(" mkvno\n"); 235*ebfedea0SLionel Sambuc } 236*ebfedea0SLionel Sambuc if(mask & KADM5_AUX_ATTRIBUTES) { 237*ebfedea0SLionel Sambuc printf(" aux attributes\n"); 238*ebfedea0SLionel Sambuc } 239*ebfedea0SLionel Sambuc if(mask & KADM5_POLICY) { 240*ebfedea0SLionel Sambuc printf(" policy\n"); 241*ebfedea0SLionel Sambuc } 242*ebfedea0SLionel Sambuc if(mask & KADM5_POLICY_CLR) { 243*ebfedea0SLionel Sambuc printf(" mod time\n"); 244*ebfedea0SLionel Sambuc } 245*ebfedea0SLionel Sambuc if(mask & KADM5_LAST_SUCCESS) { 246*ebfedea0SLionel Sambuc printf(" last success\n"); 247*ebfedea0SLionel Sambuc } 248*ebfedea0SLionel Sambuc if(mask & KADM5_LAST_FAILED) { 249*ebfedea0SLionel Sambuc printf(" last failed\n"); 250*ebfedea0SLionel Sambuc } 251*ebfedea0SLionel Sambuc if(mask & KADM5_FAIL_AUTH_COUNT) { 252*ebfedea0SLionel Sambuc printf(" fail auth count\n"); 253*ebfedea0SLionel Sambuc } 254*ebfedea0SLionel Sambuc if(mask & KADM5_KEY_DATA) { 255*ebfedea0SLionel Sambuc printf(" key data\n"); 256*ebfedea0SLionel Sambuc } 257*ebfedea0SLionel Sambuc if(mask & KADM5_TL_DATA) { 258*ebfedea0SLionel Sambuc printf(" tl data\n"); 259*ebfedea0SLionel Sambuc } 260*ebfedea0SLionel Sambuc free_hdb_entry(&ent); 261*ebfedea0SLionel Sambuc break; 262*ebfedea0SLionel Sambuc case kadm_nop : 263*ebfedea0SLionel Sambuc break; 264*ebfedea0SLionel Sambuc default: 265*ebfedea0SLionel Sambuc abort(); 266*ebfedea0SLionel Sambuc } 267*ebfedea0SLionel Sambuc krb5_storage_seek(sp, end, SEEK_SET); 268*ebfedea0SLionel Sambuc } 269*ebfedea0SLionel Sambuc 270*ebfedea0SLionel Sambuc int 271*ebfedea0SLionel Sambuc iprop_dump(struct dump_options *opt, int argc, char **argv) 272*ebfedea0SLionel Sambuc { 273*ebfedea0SLionel Sambuc kadm5_server_context *server_context; 274*ebfedea0SLionel Sambuc krb5_error_code ret; 275*ebfedea0SLionel Sambuc 276*ebfedea0SLionel Sambuc server_context = get_kadmin_context(opt->config_file_string, 277*ebfedea0SLionel Sambuc opt->realm_string); 278*ebfedea0SLionel Sambuc 279*ebfedea0SLionel Sambuc ret = kadm5_log_init (server_context); 280*ebfedea0SLionel Sambuc if (ret) 281*ebfedea0SLionel Sambuc krb5_err (context, 1, ret, "kadm5_log_init"); 282*ebfedea0SLionel Sambuc 283*ebfedea0SLionel Sambuc ret = kadm5_log_foreach (server_context, print_entry, NULL); 284*ebfedea0SLionel Sambuc if(ret) 285*ebfedea0SLionel Sambuc krb5_warn(context, ret, "kadm5_log_foreach"); 286*ebfedea0SLionel Sambuc 287*ebfedea0SLionel Sambuc ret = kadm5_log_end (server_context); 288*ebfedea0SLionel Sambuc if (ret) 289*ebfedea0SLionel Sambuc krb5_warn(context, ret, "kadm5_log_end"); 290*ebfedea0SLionel Sambuc return 0; 291*ebfedea0SLionel Sambuc } 292*ebfedea0SLionel Sambuc 293*ebfedea0SLionel Sambuc int 294*ebfedea0SLionel Sambuc iprop_truncate(struct truncate_options *opt, int argc, char **argv) 295*ebfedea0SLionel Sambuc { 296*ebfedea0SLionel Sambuc kadm5_server_context *server_context; 297*ebfedea0SLionel Sambuc krb5_error_code ret; 298*ebfedea0SLionel Sambuc 299*ebfedea0SLionel Sambuc server_context = get_kadmin_context(opt->config_file_string, 300*ebfedea0SLionel Sambuc opt->realm_string); 301*ebfedea0SLionel Sambuc 302*ebfedea0SLionel Sambuc ret = kadm5_log_truncate (server_context); 303*ebfedea0SLionel Sambuc if (ret) 304*ebfedea0SLionel Sambuc krb5_err (context, 1, ret, "kadm5_log_truncate"); 305*ebfedea0SLionel Sambuc 306*ebfedea0SLionel Sambuc return 0; 307*ebfedea0SLionel Sambuc } 308*ebfedea0SLionel Sambuc 309*ebfedea0SLionel Sambuc int 310*ebfedea0SLionel Sambuc last_version(struct last_version_options *opt, int argc, char **argv) 311*ebfedea0SLionel Sambuc { 312*ebfedea0SLionel Sambuc kadm5_server_context *server_context; 313*ebfedea0SLionel Sambuc krb5_error_code ret; 314*ebfedea0SLionel Sambuc uint32_t version; 315*ebfedea0SLionel Sambuc 316*ebfedea0SLionel Sambuc server_context = get_kadmin_context(opt->config_file_string, 317*ebfedea0SLionel Sambuc opt->realm_string); 318*ebfedea0SLionel Sambuc 319*ebfedea0SLionel Sambuc ret = kadm5_log_init (server_context); 320*ebfedea0SLionel Sambuc if (ret) 321*ebfedea0SLionel Sambuc krb5_err (context, 1, ret, "kadm5_log_init"); 322*ebfedea0SLionel Sambuc 323*ebfedea0SLionel Sambuc ret = kadm5_log_get_version (server_context, &version); 324*ebfedea0SLionel Sambuc if (ret) 325*ebfedea0SLionel Sambuc krb5_err (context, 1, ret, "kadm5_log_get_version"); 326*ebfedea0SLionel Sambuc 327*ebfedea0SLionel Sambuc ret = kadm5_log_end (server_context); 328*ebfedea0SLionel Sambuc if (ret) 329*ebfedea0SLionel Sambuc krb5_warn(context, ret, "kadm5_log_end"); 330*ebfedea0SLionel Sambuc 331*ebfedea0SLionel Sambuc printf("version: %lu\n", (unsigned long)version); 332*ebfedea0SLionel Sambuc 333*ebfedea0SLionel Sambuc return 0; 334*ebfedea0SLionel Sambuc } 335*ebfedea0SLionel Sambuc 336*ebfedea0SLionel Sambuc /* 337*ebfedea0SLionel Sambuc * Replay log 338*ebfedea0SLionel Sambuc */ 339*ebfedea0SLionel Sambuc 340*ebfedea0SLionel Sambuc int start_version = -1; 341*ebfedea0SLionel Sambuc int end_version = -1; 342*ebfedea0SLionel Sambuc 343*ebfedea0SLionel Sambuc static void 344*ebfedea0SLionel Sambuc apply_entry(kadm5_server_context *server_context, 345*ebfedea0SLionel Sambuc uint32_t ver, 346*ebfedea0SLionel Sambuc time_t timestamp, 347*ebfedea0SLionel Sambuc enum kadm_ops op, 348*ebfedea0SLionel Sambuc uint32_t len, 349*ebfedea0SLionel Sambuc krb5_storage *sp, 350*ebfedea0SLionel Sambuc void *ctx) 351*ebfedea0SLionel Sambuc { 352*ebfedea0SLionel Sambuc struct replay_options *opt = ctx; 353*ebfedea0SLionel Sambuc krb5_error_code ret; 354*ebfedea0SLionel Sambuc 355*ebfedea0SLionel Sambuc if((opt->start_version_integer != -1 && ver < opt->start_version_integer) || 356*ebfedea0SLionel Sambuc (opt->end_version_integer != -1 && ver > opt->end_version_integer)) { 357*ebfedea0SLionel Sambuc /* XXX skip this entry */ 358*ebfedea0SLionel Sambuc krb5_storage_seek(sp, len, SEEK_CUR); 359*ebfedea0SLionel Sambuc return; 360*ebfedea0SLionel Sambuc } 361*ebfedea0SLionel Sambuc printf ("ver %u... ", ver); 362*ebfedea0SLionel Sambuc fflush (stdout); 363*ebfedea0SLionel Sambuc 364*ebfedea0SLionel Sambuc ret = kadm5_log_replay (server_context, 365*ebfedea0SLionel Sambuc op, ver, len, sp); 366*ebfedea0SLionel Sambuc if (ret) 367*ebfedea0SLionel Sambuc krb5_warn (server_context->context, ret, "kadm5_log_replay"); 368*ebfedea0SLionel Sambuc 369*ebfedea0SLionel Sambuc printf ("done\n"); 370*ebfedea0SLionel Sambuc } 371*ebfedea0SLionel Sambuc 372*ebfedea0SLionel Sambuc int 373*ebfedea0SLionel Sambuc iprop_replay(struct replay_options *opt, int argc, char **argv) 374*ebfedea0SLionel Sambuc { 375*ebfedea0SLionel Sambuc kadm5_server_context *server_context; 376*ebfedea0SLionel Sambuc krb5_error_code ret; 377*ebfedea0SLionel Sambuc 378*ebfedea0SLionel Sambuc server_context = get_kadmin_context(opt->config_file_string, 379*ebfedea0SLionel Sambuc opt->realm_string); 380*ebfedea0SLionel Sambuc 381*ebfedea0SLionel Sambuc ret = server_context->db->hdb_open(context, 382*ebfedea0SLionel Sambuc server_context->db, 383*ebfedea0SLionel Sambuc O_RDWR | O_CREAT, 0600); 384*ebfedea0SLionel Sambuc if (ret) 385*ebfedea0SLionel Sambuc krb5_err (context, 1, ret, "db->open"); 386*ebfedea0SLionel Sambuc 387*ebfedea0SLionel Sambuc ret = kadm5_log_init (server_context); 388*ebfedea0SLionel Sambuc if (ret) 389*ebfedea0SLionel Sambuc krb5_err (context, 1, ret, "kadm5_log_init"); 390*ebfedea0SLionel Sambuc 391*ebfedea0SLionel Sambuc ret = kadm5_log_foreach (server_context, apply_entry, opt); 392*ebfedea0SLionel Sambuc if(ret) 393*ebfedea0SLionel Sambuc krb5_warn(context, ret, "kadm5_log_foreach"); 394*ebfedea0SLionel Sambuc ret = kadm5_log_end (server_context); 395*ebfedea0SLionel Sambuc if (ret) 396*ebfedea0SLionel Sambuc krb5_warn(context, ret, "kadm5_log_end"); 397*ebfedea0SLionel Sambuc ret = server_context->db->hdb_close (context, server_context->db); 398*ebfedea0SLionel Sambuc if (ret) 399*ebfedea0SLionel Sambuc krb5_err (context, 1, ret, "db->close"); 400*ebfedea0SLionel Sambuc 401*ebfedea0SLionel Sambuc return 0; 402*ebfedea0SLionel Sambuc } 403*ebfedea0SLionel Sambuc 404*ebfedea0SLionel Sambuc static int help_flag; 405*ebfedea0SLionel Sambuc static int version_flag; 406*ebfedea0SLionel Sambuc 407*ebfedea0SLionel Sambuc static struct getargs args[] = { 408*ebfedea0SLionel Sambuc { "version", 0, arg_flag, &version_flag, 409*ebfedea0SLionel Sambuc NULL, NULL 410*ebfedea0SLionel Sambuc }, 411*ebfedea0SLionel Sambuc { "help", 'h', arg_flag, &help_flag, 412*ebfedea0SLionel Sambuc NULL, NULL 413*ebfedea0SLionel Sambuc } 414*ebfedea0SLionel Sambuc }; 415*ebfedea0SLionel Sambuc 416*ebfedea0SLionel Sambuc static int num_args = sizeof(args) / sizeof(args[0]); 417*ebfedea0SLionel Sambuc 418*ebfedea0SLionel Sambuc int 419*ebfedea0SLionel Sambuc help(void *opt, int argc, char **argv) 420*ebfedea0SLionel Sambuc { 421*ebfedea0SLionel Sambuc if(argc == 0) { 422*ebfedea0SLionel Sambuc sl_help(commands, 1, argv - 1 /* XXX */); 423*ebfedea0SLionel Sambuc } else { 424*ebfedea0SLionel Sambuc SL_cmd *c = sl_match (commands, argv[0], 0); 425*ebfedea0SLionel Sambuc if(c == NULL) { 426*ebfedea0SLionel Sambuc fprintf (stderr, "No such command: %s. " 427*ebfedea0SLionel Sambuc "Try \"help\" for a list of commands\n", 428*ebfedea0SLionel Sambuc argv[0]); 429*ebfedea0SLionel Sambuc } else { 430*ebfedea0SLionel Sambuc if(c->func) { 431*ebfedea0SLionel Sambuc char *fake[] = { NULL, "--help", NULL }; 432*ebfedea0SLionel Sambuc fake[0] = argv[0]; 433*ebfedea0SLionel Sambuc (*c->func)(2, fake); 434*ebfedea0SLionel Sambuc fprintf(stderr, "\n"); 435*ebfedea0SLionel Sambuc } 436*ebfedea0SLionel Sambuc if(c->help && *c->help) 437*ebfedea0SLionel Sambuc fprintf (stderr, "%s\n", c->help); 438*ebfedea0SLionel Sambuc if((++c)->name && c->func == NULL) { 439*ebfedea0SLionel Sambuc int f = 0; 440*ebfedea0SLionel Sambuc fprintf (stderr, "Synonyms:"); 441*ebfedea0SLionel Sambuc while (c->name && c->func == NULL) { 442*ebfedea0SLionel Sambuc fprintf (stderr, "%s%s", f ? ", " : " ", (c++)->name); 443*ebfedea0SLionel Sambuc f = 1; 444*ebfedea0SLionel Sambuc } 445*ebfedea0SLionel Sambuc fprintf (stderr, "\n"); 446*ebfedea0SLionel Sambuc } 447*ebfedea0SLionel Sambuc } 448*ebfedea0SLionel Sambuc } 449*ebfedea0SLionel Sambuc return 0; 450*ebfedea0SLionel Sambuc } 451*ebfedea0SLionel Sambuc 452*ebfedea0SLionel Sambuc static void 453*ebfedea0SLionel Sambuc usage(int status) 454*ebfedea0SLionel Sambuc { 455*ebfedea0SLionel Sambuc arg_printusage(args, num_args, NULL, "command"); 456*ebfedea0SLionel Sambuc exit(status); 457*ebfedea0SLionel Sambuc } 458*ebfedea0SLionel Sambuc 459*ebfedea0SLionel Sambuc int 460*ebfedea0SLionel Sambuc main(int argc, char **argv) 461*ebfedea0SLionel Sambuc { 462*ebfedea0SLionel Sambuc int optidx = 0; 463*ebfedea0SLionel Sambuc krb5_error_code ret; 464*ebfedea0SLionel Sambuc 465*ebfedea0SLionel Sambuc setprogname(argv[0]); 466*ebfedea0SLionel Sambuc 467*ebfedea0SLionel Sambuc if(getarg(args, num_args, argc, argv, &optidx)) 468*ebfedea0SLionel Sambuc usage(1); 469*ebfedea0SLionel Sambuc if(help_flag) 470*ebfedea0SLionel Sambuc usage(0); 471*ebfedea0SLionel Sambuc if(version_flag) { 472*ebfedea0SLionel Sambuc print_version(NULL); 473*ebfedea0SLionel Sambuc exit(0); 474*ebfedea0SLionel Sambuc } 475*ebfedea0SLionel Sambuc argc -= optidx; 476*ebfedea0SLionel Sambuc argv += optidx; 477*ebfedea0SLionel Sambuc if(argc == 0) 478*ebfedea0SLionel Sambuc usage(1); 479*ebfedea0SLionel Sambuc 480*ebfedea0SLionel Sambuc ret = krb5_init_context(&context); 481*ebfedea0SLionel Sambuc if (ret) 482*ebfedea0SLionel Sambuc errx(1, "krb5_init_context failed with: %d\n", ret); 483*ebfedea0SLionel Sambuc 484*ebfedea0SLionel Sambuc ret = sl_command(commands, argc, argv); 485*ebfedea0SLionel Sambuc if(ret == -1) 486*ebfedea0SLionel Sambuc warnx ("unrecognized command: %s", argv[0]); 487*ebfedea0SLionel Sambuc return ret; 488*ebfedea0SLionel Sambuc } 489