Blame tools/info.c

Packit Service 6d40f9
/*
Packit Service 6d40f9
 * adcli
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * Copyright (C) 2013 Red Hat Inc.
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * This program is free software; you can redistribute it and/or modify
Packit Service 6d40f9
 * it under the terms of the GNU Lesser General Public License as
Packit Service 6d40f9
 * published by the Free Software Foundation; either version 2.1 of
Packit Service 6d40f9
 * the License, or (at your option) any later version.
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * This program is distributed in the hope that it will be useful, but
Packit Service 6d40f9
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 6d40f9
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 6d40f9
 * Lesser General Public License for more details.
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * You should have received a copy of the GNU Lesser General Public
Packit Service 6d40f9
 * License along with this program; if not, write to the Free Software
Packit Service 6d40f9
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
Packit Service 6d40f9
 * MA 02110-1301 USA
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * Author: Stef Walter <stefw@redhat.com>
Packit Service 6d40f9
 */
Packit Service 6d40f9
Packit Service 6d40f9
#include "config.h"
Packit Service 6d40f9
Packit Service 6d40f9
#include "adcli.h"
Packit Service 6d40f9
#include "tools.h"
Packit Service 6d40f9
Packit Service 6d40f9
#include <assert.h>
Packit Service 6d40f9
#include <err.h>
Packit Service 6d40f9
#include <stdio.h>
Packit Service 6d40f9
Packit Service 6d40f9
typedef enum {
Packit Service 6d40f9
	/* Have short equivalents */
Packit Service 6d40f9
	opt_domain = 'D',
Packit Service 6d40f9
	opt_domain_controller = 'S',
Packit Service 6d40f9
	opt_verbose = 'v',
Packit Service 6d40f9
} Option;
Packit Service 6d40f9
Packit Service 6d40f9
static adcli_tool_desc common_usages[] = {
Packit Service 6d40f9
	{ opt_domain, "active directory domain name" },
Packit Service 6d40f9
	{ opt_domain_controller, "domain controller to connect to" },
Packit Service 6d40f9
	{ opt_verbose, "show verbose progress and failure messages", },
Packit Service 6d40f9
	{ 0 },
Packit Service 6d40f9
};
Packit Service 6d40f9
Packit Service 6d40f9
static void
Packit Service 6d40f9
print_info (adcli_disco *disco,
Packit Service 6d40f9
            int for_host)
Packit Service 6d40f9
{
Packit Service 6d40f9
	adcli_disco *other;
Packit Service 6d40f9
Packit Service 6d40f9
	printf ("[domain]\n");
Packit Service 6d40f9
	if (disco->domain)
Packit Service 6d40f9
		printf ("domain-name = %s\n", disco->domain);
Packit Service 6d40f9
	if (disco->domain_short)
Packit Service 6d40f9
		printf ("domain-short = %s\n", disco->domain_short);
Packit Service 6d40f9
	if (disco->forest)
Packit Service 6d40f9
		printf ("domain-forest = %s\n", disco->forest);
Packit Service 6d40f9
	if (disco->host_name)
Packit Service 6d40f9
		printf ("domain-controller = %s\n", disco->host_name);
Packit Service 6d40f9
	if (disco->server_site)
Packit Service 6d40f9
		printf ("domain-controller-site = %s\n", disco->server_site);
Packit Service 6d40f9
	if (disco->flags) {
Packit Service 6d40f9
		printf ("domain-controller-flags =");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_PDC) printf (" pdc");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_GC) printf (" gc");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_LDAP) printf (" ldap");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_DS) printf (" ds");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_KDC) printf (" kdc");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_TIMESERV) printf (" timeserv");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_CLOSEST) printf (" closest");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_WRITABLE) printf (" writable");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_GOOD_TIMESERV) printf (" good-timeserv");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_NDNC) printf (" ndnc");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_SELECT_SECRET_DOMAIN_6) printf (" select-secret");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_FULL_SECRET_DOMAIN_6) printf (" full-secret");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_ADS_WEB_SERVICE) printf (" ads-web");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_HAS_DNS_NAME) printf (" dns-name");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_IS_DEFAULT_NC) printf (" default-nc");
Packit Service 6d40f9
		if (disco->flags & ADCLI_DISCO_FOREST_ROOT) printf (" forest-root");
Packit Service 6d40f9
		printf ("\n");
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	switch (adcli_disco_usable (disco)) {
Packit Service 6d40f9
	case ADCLI_DISCO_UNUSABLE:
Packit Service 6d40f9
		printf ("domain-controller-usable = no\n");
Packit Service 6d40f9
		break;
Packit Service 6d40f9
	case ADCLI_DISCO_MAYBE:
Packit Service 6d40f9
		printf ("domain-controller-usable = maybe\n");
Packit Service 6d40f9
		break;
Packit Service 6d40f9
	case ADCLI_DISCO_USABLE:
Packit Service 6d40f9
		printf ("domain-controller-usable = yes\n");
Packit Service 6d40f9
		break;
Packit Service 6d40f9
	default:
Packit Service 6d40f9
		break;
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	if (!for_host && disco->host_name) {
Packit Service 6d40f9
		printf ("domain-controllers =");
Packit Service 6d40f9
		for (other = disco; other != NULL; other = other->next) {
Packit Service 6d40f9
			if (other->host_name)
Packit Service 6d40f9
				printf (" %s", other->host_name);
Packit Service 6d40f9
		}
Packit Service 6d40f9
		printf ("\n");
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	printf ("[computer]\n");
Packit Service 6d40f9
	if (disco->client_site)
Packit Service 6d40f9
		printf ("computer-site = %s\n", disco->client_site);
Packit Service 6d40f9
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
int
Packit Service 6d40f9
adcli_tool_info (adcli_conn *unused,
Packit Service 6d40f9
                 int argc,
Packit Service 6d40f9
                 char *argv[])
Packit Service 6d40f9
{
Packit Service 6d40f9
	const char *domain = NULL;
Packit Service 6d40f9
	const char *server = NULL;
Packit Service 6d40f9
	adcli_disco *disco = NULL;
Packit Service 6d40f9
	int for_host;
Packit Service 6d40f9
	int opt;
Packit Service 6d40f9
Packit Service 6d40f9
	struct option options[] = {
Packit Service 6d40f9
		{ "domain", required_argument, NULL, opt_domain },
Packit Service 6d40f9
		{ "domain-controller", required_argument, NULL, opt_domain_controller },
Packit Service 6d40f9
		{ "verbose", no_argument, NULL, opt_verbose },
Packit Service 6d40f9
		{ "help", no_argument, NULL, 'h' },
Packit Service 6d40f9
		{ 0 },
Packit Service 6d40f9
	};
Packit Service 6d40f9
Packit Service 6d40f9
	static adcli_tool_desc usages[] = {
Packit Service 6d40f9
		{ 0, "usage: adcli info <domain>" },
Packit Service 6d40f9
		{ 0 },
Packit Service 6d40f9
	};
Packit Service 6d40f9
Packit Service 6d40f9
	while ((opt = adcli_tool_getopt (argc, argv, options)) != -1) {
Packit Service 6d40f9
		switch (opt) {
Packit Service 6d40f9
		case opt_domain:
Packit Service 6d40f9
			domain = optarg;
Packit Service 6d40f9
			break;
Packit Service 6d40f9
		case opt_domain_controller:
Packit Service 6d40f9
			server = optarg;
Packit Service 6d40f9
			break;
Packit Service 6d40f9
		case opt_verbose:
Packit Service 6d40f9
			break;
Packit Service 6d40f9
		case 'h':
Packit Service 6d40f9
		case '?':
Packit Service 6d40f9
		case ':':
Packit Service 6d40f9
			adcli_tool_usage (options, usages);
Packit Service 6d40f9
			adcli_tool_usage (options, common_usages);
Packit Service 6d40f9
			return opt == 'h' ? 0 : 2;
Packit Service 6d40f9
		default:
Packit Service 6d40f9
			assert (0 && "not reached");
Packit Service 6d40f9
			break;
Packit Service 6d40f9
		}
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	argc -= optind;
Packit Service 6d40f9
	argv += optind;
Packit Service 6d40f9
Packit Service 6d40f9
	if (argc == 1)
Packit Service 6d40f9
		domain = argv[0];
Packit Service 288372
	else if (argc != 0) {
Packit Service 288372
		warnx ("specify one user name to create");
Packit Service 288372
		return 2;
Packit Service 288372
	}
Packit Service 6d40f9
Packit Service 6d40f9
	if (server) {
Packit Service 6d40f9
		adcli_disco_host (server, &disco);
Packit Service 288372
		if (disco == NULL) {
Packit Service 288372
			warnx ("couldn't discover domain controller: %s", server);
Packit Service 288372
			return 1;
Packit Service 288372
		}
Packit Service 6d40f9
		for_host = 1;
Packit Service 6d40f9
	} else if (domain) {
Packit Service 6d40f9
		adcli_disco_domain (domain, &disco);
Packit Service 288372
		if (disco == NULL) {
Packit Service 288372
			warnx ("couldn't discover domain: %s", domain);
Packit Service 288372
			return 1;
Packit Service 288372
		}
Packit Service 6d40f9
		for_host = 0;
Packit Service 6d40f9
	} else {
Packit Service 288372
		warnx ("specify a domain to discover");
Packit Service 288372
		return 2;
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	print_info (disco, for_host);
Packit Service 6d40f9
	adcli_disco_free (disco);
Packit Service 6d40f9
Packit Service 6d40f9
	return 0;
Packit Service 6d40f9
}