1*5c51f124SMoriah Waterland /* 2*5c51f124SMoriah Waterland * CDDL HEADER START 3*5c51f124SMoriah Waterland * 4*5c51f124SMoriah Waterland * The contents of this file are subject to the terms of the 5*5c51f124SMoriah Waterland * Common Development and Distribution License (the "License"). 6*5c51f124SMoriah Waterland * You may not use this file except in compliance with the License. 7*5c51f124SMoriah Waterland * 8*5c51f124SMoriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*5c51f124SMoriah Waterland * or http://www.opensolaris.org/os/licensing. 10*5c51f124SMoriah Waterland * See the License for the specific language governing permissions 11*5c51f124SMoriah Waterland * and limitations under the License. 12*5c51f124SMoriah Waterland * 13*5c51f124SMoriah Waterland * When distributing Covered Code, include this CDDL HEADER in each 14*5c51f124SMoriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*5c51f124SMoriah Waterland * If applicable, add the following below this CDDL HEADER, with the 16*5c51f124SMoriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying 17*5c51f124SMoriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner] 18*5c51f124SMoriah Waterland * 19*5c51f124SMoriah Waterland * CDDL HEADER END 20*5c51f124SMoriah Waterland */ 21*5c51f124SMoriah Waterland 22*5c51f124SMoriah Waterland /* 23*5c51f124SMoriah Waterland * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*5c51f124SMoriah Waterland * Use is subject to license terms. 25*5c51f124SMoriah Waterland */ 26*5c51f124SMoriah Waterland 27*5c51f124SMoriah Waterland 28*5c51f124SMoriah Waterland /* unix system includes */ 29*5c51f124SMoriah Waterland 30*5c51f124SMoriah Waterland #include <stdio.h> 31*5c51f124SMoriah Waterland #include <stdarg.h> 32*5c51f124SMoriah Waterland #include <stdlib.h> 33*5c51f124SMoriah Waterland #include <string.h> 34*5c51f124SMoriah Waterland #include <sys/types.h> 35*5c51f124SMoriah Waterland #include <unistd.h> 36*5c51f124SMoriah Waterland #include <locale.h> 37*5c51f124SMoriah Waterland #include <sys/param.h> 38*5c51f124SMoriah Waterland #include <openssl/bio.h> 39*5c51f124SMoriah Waterland 40*5c51f124SMoriah Waterland #include <pkglib.h> 41*5c51f124SMoriah Waterland #include <pkgerr.h> 42*5c51f124SMoriah Waterland #include <keystore.h> 43*5c51f124SMoriah Waterland #include "pkgadm.h" 44*5c51f124SMoriah Waterland #include "pkgadm_msgs.h" 45*5c51f124SMoriah Waterland 46*5c51f124SMoriah Waterland /* initial error message buffer size */ 47*5c51f124SMoriah Waterland 48*5c51f124SMoriah Waterland #define ERR_BUFSIZE 2048 49*5c51f124SMoriah Waterland 50*5c51f124SMoriah Waterland /* Local Function Prototypes */ 51*5c51f124SMoriah Waterland 52*5c51f124SMoriah Waterland static void print_version(); 53*5c51f124SMoriah Waterland int get_dbstatus(int argc, char **argv); 54*5c51f124SMoriah Waterland 55*5c51f124SMoriah Waterland /* holds subcommands and their definitions */ 56*5c51f124SMoriah Waterland struct cmd { 57*5c51f124SMoriah Waterland char *c_name; 58*5c51f124SMoriah Waterland int (*c_func)(int, char **); 59*5c51f124SMoriah Waterland }; 60*5c51f124SMoriah Waterland 61*5c51f124SMoriah Waterland struct cmd cmds[] = { 62*5c51f124SMoriah Waterland { "dbstatus", get_dbstatus}, 63*5c51f124SMoriah Waterland { "lock", admin_lock}, 64*5c51f124SMoriah Waterland /* last one must be all NULLs */ 65*5c51f124SMoriah Waterland { NULL, NULL } 66*5c51f124SMoriah Waterland }; 67*5c51f124SMoriah Waterland 68*5c51f124SMoriah Waterland struct cmd cert_cmds[] = { 69*5c51f124SMoriah Waterland { "addcert", addcert}, 70*5c51f124SMoriah Waterland { "listcert", listcert}, 71*5c51f124SMoriah Waterland { "removecert", removecert}, 72*5c51f124SMoriah Waterland /* last one must be all NULLs */ 73*5c51f124SMoriah Waterland { NULL, NULL } 74*5c51f124SMoriah Waterland }; 75*5c51f124SMoriah Waterland 76*5c51f124SMoriah Waterland 77*5c51f124SMoriah Waterland /* 78*5c51f124SMoriah Waterland * Function: main 79*5c51f124SMoriah Waterland * 80*5c51f124SMoriah Waterland * Return: 0 - subprocessing successful 81*5c51f124SMoriah Waterland * scripts and reboot 82*5c51f124SMoriah Waterland * [other] - subprocessing-specific failure 83*5c51f124SMoriah Waterland */ 84*5c51f124SMoriah Waterland int 85*5c51f124SMoriah Waterland main(int argc, char **argv) 86*5c51f124SMoriah Waterland { 87*5c51f124SMoriah Waterland char cur_cmd; 88*5c51f124SMoriah Waterland int newargc; 89*5c51f124SMoriah Waterland char **newargv; 90*5c51f124SMoriah Waterland int i; 91*5c51f124SMoriah Waterland 92*5c51f124SMoriah Waterland /* Should be defined by cc -D */ 93*5c51f124SMoriah Waterland #if !defined(TEXT_DOMAIN) 94*5c51f124SMoriah Waterland #define TEXT_DOMAIN "SYS_TEST" 95*5c51f124SMoriah Waterland #endif 96*5c51f124SMoriah Waterland 97*5c51f124SMoriah Waterland /* set the default text domain for messaging */ 98*5c51f124SMoriah Waterland (void) setlocale(LC_ALL, ""); 99*5c51f124SMoriah Waterland (void) textdomain(TEXT_DOMAIN); 100*5c51f124SMoriah Waterland 101*5c51f124SMoriah Waterland if (getenv("PKGADM_VERBOSE")) { 102*5c51f124SMoriah Waterland set_verbose(B_TRUE); 103*5c51f124SMoriah Waterland } 104*5c51f124SMoriah Waterland 105*5c51f124SMoriah Waterland /* Superficial check of the arguments. */ 106*5c51f124SMoriah Waterland if (argc <= 1) { 107*5c51f124SMoriah Waterland log_msg(LOG_MSG_INFO, MSG_USAGE); 108*5c51f124SMoriah Waterland return (1); 109*5c51f124SMoriah Waterland } 110*5c51f124SMoriah Waterland 111*5c51f124SMoriah Waterland /* first, process any arguments that can appear before the subcommand */ 112*5c51f124SMoriah Waterland while ((i = getopt(argc, argv, "vV?")) != EOF) { 113*5c51f124SMoriah Waterland switch (i) { 114*5c51f124SMoriah Waterland case 'v': /* verbose mode enabled */ 115*5c51f124SMoriah Waterland set_verbose(B_TRUE); 116*5c51f124SMoriah Waterland break; 117*5c51f124SMoriah Waterland case 'V': 118*5c51f124SMoriah Waterland print_version(); 119*5c51f124SMoriah Waterland return (0); 120*5c51f124SMoriah Waterland case '?': 121*5c51f124SMoriah Waterland log_msg(LOG_MSG_INFO, MSG_USAGE); 122*5c51f124SMoriah Waterland return (0); 123*5c51f124SMoriah Waterland } 124*5c51f124SMoriah Waterland } 125*5c51f124SMoriah Waterland 126*5c51f124SMoriah Waterland /* OK, hand it off to the subcommand processors */ 127*5c51f124SMoriah Waterland for (cur_cmd = 0; cmds[cur_cmd].c_name != NULL; cur_cmd++) { 128*5c51f124SMoriah Waterland if (ci_streq(argv[optind], cmds[cur_cmd].c_name)) { 129*5c51f124SMoriah Waterland /* make subcommand the first option */ 130*5c51f124SMoriah Waterland newargc = argc - optind; 131*5c51f124SMoriah Waterland newargv = argv + optind; 132*5c51f124SMoriah Waterland opterr = optind = 1; optopt = 0; 133*5c51f124SMoriah Waterland return (cmds[cur_cmd].c_func(newargc, newargv)); 134*5c51f124SMoriah Waterland } 135*5c51f124SMoriah Waterland } 136*5c51f124SMoriah Waterland 137*5c51f124SMoriah Waterland /* initialize security library */ 138*5c51f124SMoriah Waterland sec_init(); 139*5c51f124SMoriah Waterland 140*5c51f124SMoriah Waterland /* OK, hand it off to the subcommand processors */ 141*5c51f124SMoriah Waterland for (cur_cmd = 0; cert_cmds[cur_cmd].c_name != NULL; cur_cmd++) { 142*5c51f124SMoriah Waterland if (ci_streq(argv[optind], cert_cmds[cur_cmd].c_name)) { 143*5c51f124SMoriah Waterland /* make subcommand the first option */ 144*5c51f124SMoriah Waterland newargc = argc - optind; 145*5c51f124SMoriah Waterland newargv = argv + optind; 146*5c51f124SMoriah Waterland opterr = optind = 1; optopt = 0; 147*5c51f124SMoriah Waterland return (cert_cmds[cur_cmd].c_func(newargc, newargv)); 148*5c51f124SMoriah Waterland } 149*5c51f124SMoriah Waterland } 150*5c51f124SMoriah Waterland 151*5c51f124SMoriah Waterland /* bad subcommand */ 152*5c51f124SMoriah Waterland log_msg(LOG_MSG_ERR, MSG_BAD_SUB, argv[optind]); 153*5c51f124SMoriah Waterland log_msg(LOG_MSG_INFO, MSG_USAGE); 154*5c51f124SMoriah Waterland return (1); 155*5c51f124SMoriah Waterland } 156*5c51f124SMoriah Waterland 157*5c51f124SMoriah Waterland /* 158*5c51f124SMoriah Waterland * Name: set_verbose 159*5c51f124SMoriah Waterland * Description: Turns on verbose output 160*5c51f124SMoriah Waterland * Scope: public 161*5c51f124SMoriah Waterland * Arguments: verbose = B_TRUE indicates verbose mode 162*5c51f124SMoriah Waterland * Returns: none 163*5c51f124SMoriah Waterland */ 164*5c51f124SMoriah Waterland void 165*5c51f124SMoriah Waterland set_verbose(boolean_t setting) 166*5c51f124SMoriah Waterland { 167*5c51f124SMoriah Waterland log_set_verbose(setting); 168*5c51f124SMoriah Waterland } 169*5c51f124SMoriah Waterland 170*5c51f124SMoriah Waterland /* 171*5c51f124SMoriah Waterland * Name: get_verbose 172*5c51f124SMoriah Waterland * Description: Returns whether or not to output verbose messages 173*5c51f124SMoriah Waterland * Scope: public 174*5c51f124SMoriah Waterland * Arguments: none 175*5c51f124SMoriah Waterland * Returns: B_TRUE - verbose messages should be output 176*5c51f124SMoriah Waterland */ 177*5c51f124SMoriah Waterland boolean_t 178*5c51f124SMoriah Waterland get_verbose() 179*5c51f124SMoriah Waterland { 180*5c51f124SMoriah Waterland return (log_get_verbose()); 181*5c51f124SMoriah Waterland } 182*5c51f124SMoriah Waterland 183*5c51f124SMoriah Waterland /* 184*5c51f124SMoriah Waterland * Name: log_pkgerr 185*5c51f124SMoriah Waterland * Description: Outputs pkgerr messages to logging facility. 186*5c51f124SMoriah Waterland * Scope: public 187*5c51f124SMoriah Waterland * Arguments: type - the severity of the message 188*5c51f124SMoriah Waterland * err - error stack to dump to facility 189*5c51f124SMoriah Waterland * Returns: none 190*5c51f124SMoriah Waterland */ 191*5c51f124SMoriah Waterland void 192*5c51f124SMoriah Waterland log_pkgerr(LogMsgType type, PKG_ERR *err) 193*5c51f124SMoriah Waterland { 194*5c51f124SMoriah Waterland int i; 195*5c51f124SMoriah Waterland for (i = 0; i < pkgerr_num(err); i++) { 196*5c51f124SMoriah Waterland log_msg(type, "%s", pkgerr_get(err, i)); 197*5c51f124SMoriah Waterland } 198*5c51f124SMoriah Waterland } 199*5c51f124SMoriah Waterland 200*5c51f124SMoriah Waterland /* 201*5c51f124SMoriah Waterland * Name: print_Version 202*5c51f124SMoriah Waterland * Desc: Prints Version of packaging tools 203*5c51f124SMoriah Waterland * Arguments: none 204*5c51f124SMoriah Waterland * Returns: none 205*5c51f124SMoriah Waterland */ 206*5c51f124SMoriah Waterland static void 207*5c51f124SMoriah Waterland print_version() 208*5c51f124SMoriah Waterland { 209*5c51f124SMoriah Waterland /* ignore any and all arguments, print version only */ 210*5c51f124SMoriah Waterland (void) fprintf(stdout, "%s\n", SUNW_PKGVERS); 211*5c51f124SMoriah Waterland } 212*5c51f124SMoriah Waterland 213*5c51f124SMoriah Waterland /* 214*5c51f124SMoriah Waterland * usage 215*5c51f124SMoriah Waterland * 216*5c51f124SMoriah Waterland * Outputs the usage string. 217*5c51f124SMoriah Waterland * 218*5c51f124SMoriah Waterland * Return:1 219*5c51f124SMoriah Waterland * Side effects: none 220*5c51f124SMoriah Waterland */ 221*5c51f124SMoriah Waterland static int 222*5c51f124SMoriah Waterland usage() 223*5c51f124SMoriah Waterland { 224*5c51f124SMoriah Waterland log_msg(LOG_MSG_INFO, MSG_USAGE); 225*5c51f124SMoriah Waterland return (1); 226*5c51f124SMoriah Waterland } 227*5c51f124SMoriah Waterland 228*5c51f124SMoriah Waterland /* 229*5c51f124SMoriah Waterland * get_dbstatus 230*5c51f124SMoriah Waterland * 231*5c51f124SMoriah Waterland * Return 'text' as the db status. 232*5c51f124SMoriah Waterland * Use the command line to determine if there is an alternate root. 233*5c51f124SMoriah Waterland * 234*5c51f124SMoriah Waterland * Return: 0 on success, nonzero on failure 235*5c51f124SMoriah Waterland * Side effects: none 236*5c51f124SMoriah Waterland */ 237*5c51f124SMoriah Waterland int 238*5c51f124SMoriah Waterland get_dbstatus(int argc, char **argv) 239*5c51f124SMoriah Waterland { 240*5c51f124SMoriah Waterland /* Either accept 1 argument or 3 arguments where the second is -R */ 241*5c51f124SMoriah Waterland if (argc != 1 && (argc != 3 || strcmp(argv[1], "-R"))) 242*5c51f124SMoriah Waterland return (usage()); 243*5c51f124SMoriah Waterland 244*5c51f124SMoriah Waterland (void) printf("%s\n", PKGADM_DBSTATUS_TEXT); 245*5c51f124SMoriah Waterland 246*5c51f124SMoriah Waterland return (0); 247*5c51f124SMoriah Waterland } 248