Blame IbaTools/chassis_setup/chassis_setup.c

Packit 857059
/* BEGIN_ICS_COPYRIGHT5 ****************************************
Packit 857059
Packit 857059
Copyright (c) 2015, Intel Corporation
Packit 857059
Packit 857059
Redistribution and use in source and binary forms, with or without
Packit 857059
modification, are permitted provided that the following conditions are met:
Packit 857059
Packit 857059
    * Redistributions of source code must retain the above copyright notice,
Packit 857059
      this list of conditions and the following disclaimer.
Packit 857059
    * Redistributions in binary form must reproduce the above copyright
Packit 857059
      notice, this list of conditions and the following disclaimer in the
Packit 857059
     documentation and/or other materials provided with the distribution.
Packit 857059
    * Neither the name of Intel Corporation nor the names of its contributors
Packit 857059
      may be used to endorse or promote products derived from this software
Packit 857059
      without specific prior written permission.
Packit 857059
Packit 857059
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Packit 857059
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit 857059
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Packit 857059
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
Packit 857059
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit 857059
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Packit 857059
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Packit 857059
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Packit 857059
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 857059
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 857059
Packit 857059
 * ** END_ICS_COPYRIGHT5   ****************************************/
Packit 857059
/* [ICS VERSION STRING: unknown] */
Packit 857059
#include <stdio.h>
Packit 857059
#include <stdlib.h>
Packit 857059
#include <unistd.h>
Packit 857059
#include <string.h>
Packit 857059
#include <ctype.h>
Packit 857059
#include <errno.h>
Packit 857059
#include <time.h>
Packit 857059
#include "chassis_setup.h"
Packit 857059
#include "iba/stl_types.h"
Packit 857059
Packit 857059
#define NO_TZ_DST_SETUP		100
Packit 857059
#define SYSLOG_PORT_DEFAULT 	-1
Packit 857059
#define SYSLOG_FACILITY_DEFAULT -1
Packit 857059
/* Info for all chassis */
Packit 857059
int tzOffset;					/* Offset in hours (from UTC) */
Packit 857059
dstInfo_t dstInfo;				/* DST start and end info */
Packit 857059
char syslogIpAddr[20];  			/* IP addr of syslog server */
Packit 857059
int syslogPort = SYSLOG_PORT_DEFAULT;		/* Port for syslog */
Packit 857059
int syslogFacility = SYSLOG_FACILITY_DEFAULT; 	/* Facility level for syslog */
Packit 857059
char ntpIpAddr[20];  				/* IP addr of NTP server */
Packit 857059
int linkWidthSelection;				/* selection for link width */
Packit 857059
int setname;					/* should OPA Node Desc be set to match ethernet name */
Packit 857059
int linkCRCModeSelection; 			/* selection for Link CRC mode */
Packit 857059
Packit 857059
/* Globals for chassis specifics */
Packit 857059
Packit 857059
int numChassis;
Packit 857059
chassisInfo_t *chassisInfoTable;
Packit 857059
int chassisInfoTableSize;
Packit 857059
Packit 857059
void stripCR(char *buf)
Packit 857059
{
Packit 857059
	char *p;
Packit 857059
Packit 857059
	if ((p = strchr(buf, '\n')) != NULL)
Packit 857059
		*p = '\0';
Packit 857059
	if ((p = strchr(buf, '\r')) != NULL)
Packit 857059
		*p = '\0';
Packit 857059
Packit 857059
	return;
Packit 857059
}
Packit 857059
Packit 857059
int getYesNo(char *question, int def)
Packit 857059
{
Packit 857059
	int done = 0;
Packit 857059
	int res = 1;
Packit 857059
	char answerBuf[8];
Packit 857059
Packit 857059
	while (!done)
Packit 857059
	{
Packit 857059
		printf("%s: ", question);
Packit 857059
		if (fgets(answerBuf, 8, stdin)) {
Packit 857059
			stripCR(answerBuf);
Packit 857059
			if (strncmp(answerBuf, "none", 4) == 0)
Packit 857059
			{
Packit 857059
				res = 0;
Packit 857059
				done = 1;
Packit 857059
			}
Packit 857059
			else if ((answerBuf[0] == 'n') || (answerBuf[0] == 'N'))
Packit 857059
			{
Packit 857059
				res = 0;
Packit 857059
				done = 1;
Packit 857059
			}
Packit 857059
			else if ((answerBuf[0] == 'y') || (answerBuf[0] == 'Y'))
Packit 857059
			{
Packit 857059
				res = 1;
Packit 857059
				done = 1;
Packit 857059
			}
Packit 857059
			else if (strlen(answerBuf) == 0)
Packit 857059
			{
Packit 857059
				res = def;
Packit 857059
				done = 1;
Packit 857059
			}
Packit 857059
			else
Packit 857059
			{
Packit 857059
				fprintf(stderr, "<%s> is not a valid entry - please enter y or n ... \n", answerBuf);
Packit 857059
			}
Packit 857059
		}
Packit 857059
	}
Packit 857059
	return(res);
Packit 857059
}
Packit 857059
Packit 857059
int getInt(char *question, int low, int high, boolean allowAbort, int abortValue)
Packit 857059
{
Packit 857059
	int done = 0;
Packit 857059
	int selection;
Packit 857059
	int res = 1;
Packit 857059
	int i;
Packit 857059
	int goodInt;
Packit 857059
	char answerBuf[64];
Packit 857059
Packit 857059
	while (!done)
Packit 857059
	{
Packit 857059
		if (allowAbort)
Packit 857059
			printf("%s (or none): ", question);
Packit 857059
		else
Packit 857059
			printf("%s: ", question);
Packit 857059
		if (fgets(answerBuf, 64, stdin)) {
Packit 857059
			stripCR(answerBuf);
Packit 857059
Packit 857059
			if (allowAbort && (strncmp(answerBuf, "none", 4) == 0))
Packit 857059
				return abortValue;
Packit 857059
Packit 857059
			if (strlen(answerBuf) == 0)
Packit 857059
				goodInt = 0;
Packit 857059
			else {
Packit 857059
				for (i = 0, goodInt = 1; (i < strlen(answerBuf)) && goodInt; i++) {
Packit 857059
					if (!isdigit(answerBuf[i]))
Packit 857059
						goodInt = 0;
Packit 857059
				}
Packit 857059
			}
Packit 857059
	
Packit 857059
			if (goodInt)
Packit 857059
				selection = atoi(answerBuf);
Packit 857059
			else
Packit 857059
				selection = -1;
Packit 857059
	
Packit 857059
			if ((selection < low) || (selection > high))
Packit 857059
				fprintf(stderr, "<%s> is not a valid entry - please select a choice from %d to %d ...\n", answerBuf, low, high);
Packit 857059
			else
Packit 857059
			{
Packit 857059
				res = selection;
Packit 857059
				done = 1;
Packit 857059
			}
Packit 857059
		}
Packit 857059
	}
Packit 857059
	return(res);
Packit 857059
}
Packit 857059
Packit 857059
void setupTZInfo(tzCode_t timeZone)
Packit 857059
{
Packit 857059
	switch (timeZone)
Packit 857059
	{
Packit 857059
		case TZ_NA_ATLA:
Packit 857059
			/* NAmer - Atlantic */
Packit 857059
			if (daylight)
Packit 857059
				dstInfo = NA_DSTInfo;
Packit 857059
			else
Packit 857059
				dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = -4;
Packit 857059
			break;
Packit 857059
		case TZ_NA_EAST:
Packit 857059
			/* NAmer - Eastern */
Packit 857059
			if (daylight)
Packit 857059
				dstInfo = NA_DSTInfo;
Packit 857059
			else
Packit 857059
				dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = -5;
Packit 857059
			break;
Packit 857059
		case TZ_NA_CENT:
Packit 857059
			/* NAmer - Central */
Packit 857059
			if (daylight)
Packit 857059
				dstInfo = NA_DSTInfo;
Packit 857059
			else
Packit 857059
				dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = -6;
Packit 857059
			break;
Packit 857059
		case TZ_NA_MOUN:
Packit 857059
			/* NAmer - Mountain */
Packit 857059
			if (daylight)
Packit 857059
				dstInfo = NA_DSTInfo;
Packit 857059
			else
Packit 857059
				dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = -7;
Packit 857059
			break;
Packit 857059
		case TZ_NA_PACI:
Packit 857059
			/* NAmer - Pacific */
Packit 857059
			if (daylight)
Packit 857059
				dstInfo = NA_DSTInfo;
Packit 857059
			else
Packit 857059
				dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = -8;
Packit 857059
			break;
Packit 857059
		case TZ_NA_ASKA:
Packit 857059
			/* NAmer - Alaska */
Packit 857059
			if (daylight)
Packit 857059
				dstInfo = NA_DSTInfo;
Packit 857059
			else
Packit 857059
				dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = -9;
Packit 857059
			break;
Packit 857059
		case TZ_NA_HAWI:
Packit 857059
			/* NAmer - Hawaii */
Packit 857059
			dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = -10;
Packit 857059
			break;
Packit 857059
		case TZ_EU_UTC:
Packit 857059
			/* Europe - UTC */
Packit 857059
			if (daylight)
Packit 857059
				dstInfo = EUR_DSTInfo;
Packit 857059
			else
Packit 857059
				dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = 0;
Packit 857059
			break;
Packit 857059
		case TZ_EU_CENT:
Packit 857059
			/* Europe - Central */
Packit 857059
			if (daylight)
Packit 857059
				dstInfo = EUR_DSTInfo;
Packit 857059
			else
Packit 857059
				dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = 1;
Packit 857059
			break;
Packit 857059
		case TZ_EU_EAST:
Packit 857059
			/* Europe - Eastern */
Packit 857059
			if (daylight)
Packit 857059
				dstInfo = EUR_DSTInfo;
Packit 857059
			else
Packit 857059
				dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = 2;
Packit 857059
			break;
Packit 857059
		case TZ_EU_MOSC:
Packit 857059
			/* Europe - Russia/Moscow */
Packit 857059
			if (daylight)
Packit 857059
				dstInfo = EUR_DSTInfo;
Packit 857059
			else
Packit 857059
				dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = 3;
Packit 857059
			break;
Packit 857059
		case TZ_AS_CHIN:
Packit 857059
			/* China */
Packit 857059
			dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = 8;
Packit 857059
			break;
Packit 857059
		case TZ_AS_JAPN:
Packit 857059
			/* Japan */
Packit 857059
			dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = 9;
Packit 857059
			break;
Packit 857059
		case TZ_AU_SYDN:
Packit 857059
			/* Australia - Sydney */
Packit 857059
			if (daylight)
Packit 857059
				dstInfo = AUS_DSTInfo;
Packit 857059
			else
Packit 857059
				dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = 10;
Packit 857059
			break;
Packit 857059
		case TZ_NZ_AUCK:
Packit 857059
			/* New Zealand - Auckland */
Packit 857059
			if (daylight)
Packit 857059
				dstInfo = NZ_DSTInfo;
Packit 857059
			else
Packit 857059
				dstInfo = None_DSTInfo;
Packit 857059
			tzOffset = 12;
Packit 857059
			break;
Packit 857059
	}
Packit 857059
	return;
Packit 857059
}
Packit 857059
Packit 857059
void getTimeZoneInfo(int configureTZDST)
Packit 857059
{
Packit 857059
	int useServerTZInfo = 1;
Packit 857059
	int tzSelection;
Packit 857059
	int configureManually = 0;
Packit 857059
	int done = 0;
Packit 857059
	tzCode_t timeZone = TZ_NA_EAST;
Packit 857059
	char questionText[100];
Packit 857059
Packit 857059
	if (configureTZDST)
Packit 857059
	{
Packit 857059
		useServerTZInfo = getYesNo("Do you want to use the local timezone information from the local server? [y]", 1);
Packit 857059
Packit 857059
		if (useServerTZInfo)
Packit 857059
		{
Packit 857059
			tzset();
Packit 857059
			switch (TIMEZONEOFFSET)
Packit 857059
			{
Packit 857059
				case 0:
Packit 857059
					/* UTC */
Packit 857059
					timeZone = TZ_EU_UTC;
Packit 857059
					break;
Packit 857059
				case 4:
Packit 857059
					/* NAmer - Atlantic */
Packit 857059
					timeZone = TZ_NA_ATLA;
Packit 857059
					break;
Packit 857059
				case 5:
Packit 857059
					/* NAmer - Eastern */
Packit 857059
					timeZone = TZ_NA_EAST;
Packit 857059
					break;
Packit 857059
				case 6:
Packit 857059
					/* NAmer - Central */
Packit 857059
					timeZone = TZ_NA_CENT;
Packit 857059
					break;
Packit 857059
				case 7:
Packit 857059
					/* NAmer - Mountain */
Packit 857059
					timeZone = TZ_NA_MOUN;
Packit 857059
					break;
Packit 857059
				case 8:
Packit 857059
					/* NAmer - Pacific */
Packit 857059
					timeZone = TZ_NA_PACI;
Packit 857059
					break;
Packit 857059
				case 9:
Packit 857059
					/* NAmer - Alaska */
Packit 857059
					timeZone = TZ_NA_ASKA;
Packit 857059
					break;
Packit 857059
				case 10:
Packit 857059
					/* NAmer - Hawaii */
Packit 857059
					timeZone = TZ_NA_HAWI;
Packit 857059
					break;
Packit 857059
				case -1:
Packit 857059
					/* Cent Europe */
Packit 857059
					timeZone = TZ_EU_CENT;
Packit 857059
					break;
Packit 857059
				case -2:
Packit 857059
					/* East Europe */
Packit 857059
					timeZone = TZ_EU_EAST;
Packit 857059
					break;
Packit 857059
				case -3:
Packit 857059
					/* Russia - Moscow */
Packit 857059
					timeZone = TZ_EU_MOSC;
Packit 857059
					break;
Packit 857059
				case -8:
Packit 857059
					/* China */
Packit 857059
					timeZone = TZ_AS_CHIN;
Packit 857059
					break;
Packit 857059
				case -9:
Packit 857059
					/* Japan */
Packit 857059
					timeZone = TZ_AS_JAPN;
Packit 857059
					break;
Packit 857059
				case -10:
Packit 857059
					/* Australia - Sydney */
Packit 857059
					timeZone = TZ_AU_SYDN;
Packit 857059
					break;
Packit 857059
				case -12:
Packit 857059
					/* New Zealand - Auckland */
Packit 857059
					timeZone = TZ_NZ_AUCK;
Packit 857059
					break;
Packit 857059
			}
Packit 857059
			setupTZInfo(timeZone);
Packit 857059
		} /* using server TZ info */
Packit 857059
		else
Packit 857059
		{ /* not using server TZ info */
Packit 857059
Packit 857059
			printf("Select a locale that matches your location: \n");
Packit 857059
			printf("\t1  - North America - Atlantic\n");
Packit 857059
			printf("\t2  - North America - Eastern\n");
Packit 857059
			printf("\t3  - North America - Central\n");
Packit 857059
			printf("\t4  - North America - Mountain\n");
Packit 857059
			printf("\t5  - North America - Arizona\n");
Packit 857059
			printf("\t6  - North America - Pacific\n");
Packit 857059
			printf("\t7  - North America - Alaska\n");
Packit 857059
			printf("\t8  - North America - Hawaii\n");
Packit 857059
			printf("\t9  - UK\n");
Packit 857059
			printf("\t10 - Central Europe\n");
Packit 857059
			printf("\t11 - Eastern Europe\n");
Packit 857059
			printf("\t12 - Russia - Moscow\n");
Packit 857059
			printf("\t13 - China\n");
Packit 857059
			printf("\t14 - Japan\n");
Packit 857059
			printf("\t15 - Australia - Sydney\n");
Packit 857059
			printf("\t16 - New Zealand - Auckland\n");
Packit 857059
			printf("\t17 - Configure manually\n");
Packit 857059
			tzSelection = getInt("Enter selection", 1, 17, FALSE, 0);
Packit 857059
			daylight = 1;
Packit 857059
			switch (tzSelection)
Packit 857059
			{
Packit 857059
				case 1:
Packit 857059
					timeZone = TZ_NA_ATLA;
Packit 857059
					break;
Packit 857059
				case 2:
Packit 857059
					timeZone = TZ_NA_EAST;
Packit 857059
					break;
Packit 857059
				case 3:
Packit 857059
					timeZone = TZ_NA_CENT;
Packit 857059
					break;
Packit 857059
				case 4:
Packit 857059
					timeZone = TZ_NA_MOUN;
Packit 857059
					break;
Packit 857059
				case 5:
Packit 857059
					timeZone = TZ_NA_MOUN;
Packit 857059
					daylight = 0;
Packit 857059
					break;
Packit 857059
				case 6:
Packit 857059
					timeZone = TZ_NA_PACI;
Packit 857059
					break;
Packit 857059
				case 7:
Packit 857059
					timeZone = TZ_NA_ASKA;
Packit 857059
					break;
Packit 857059
				case 8:
Packit 857059
					timeZone = TZ_NA_HAWI;
Packit 857059
					daylight = 0;
Packit 857059
					break;
Packit 857059
				case 9:
Packit 857059
					timeZone = TZ_EU_UTC;
Packit 857059
					break;
Packit 857059
				case 10:
Packit 857059
					timeZone = TZ_EU_CENT;
Packit 857059
					break;
Packit 857059
				case 11:
Packit 857059
					timeZone = TZ_EU_EAST;
Packit 857059
					break;
Packit 857059
				case 12:
Packit 857059
					timeZone = TZ_EU_MOSC;
Packit 857059
					break;
Packit 857059
				case 13:
Packit 857059
					timeZone = TZ_AS_CHIN;
Packit 857059
					daylight = 0;
Packit 857059
					break;
Packit 857059
				case 14:
Packit 857059
					timeZone = TZ_AS_JAPN;
Packit 857059
					daylight = 0;
Packit 857059
					break;
Packit 857059
				case 15:
Packit 857059
					timeZone = TZ_AU_SYDN;
Packit 857059
					break;
Packit 857059
				case 16:
Packit 857059
					timeZone = TZ_NZ_AUCK;
Packit 857059
					break;
Packit 857059
				case 17:
Packit 857059
					configureManually = 1;
Packit 857059
					break;
Packit 857059
			}
Packit 857059
			if (!configureManually)
Packit 857059
				setupTZInfo(timeZone);
Packit 857059
			else
Packit 857059
			{
Packit 857059
				tzOffset = getInt("Enter timezone offset in hours - positive is east, negative is west of UTC", -12, 12, FALSE, 0); 
Packit 857059
				daylight = getYesNo("Does your timezone observe Daylight Saving or Summer Time? [y]", 1);
Packit 857059
				if (daylight)
Packit 857059
				{
Packit 857059
					while (!done)
Packit 857059
					{
Packit 857059
						printf("You will be prompted for adjustment information - which day of the week in which month (e.g. 2nd Sunday in March),\n");
Packit 857059
						printf("for both start and end of the observance.\n\n");
Packit 857059
						printf("For month, valid replies are:           3-11: 3-Mar, 4-Apr, 5-May, 6-Jun, 7-Jul, 8-Aug, 9-Sep, 10-Oct, 11-Nov\n");
Packit 857059
						printf("For day of week, valid replies are:     1-7:  1-Sun, 2-Mon, 3-Tue, 4-Wed, 5-Thu, 6-Fri, 7-Sat\n");
Packit 857059
						printf("For which day, valid replies are:       1-5:  1-1st, 2-2nd, 3-3rd, 4-4th, 5-last\n");
Packit 857059
						dstInfo.startMonth = getInt("Enter the month in which your timezone begins observing DST/Summer Time", 3, 11, FALSE, 0);
Packit 857059
						dstInfo.startDay = getInt("Enter the day of week on which your timezone begins observing DST/Summer Time", 1, 7, FALSE, 0);
Packit 857059
						snprintf(questionText, sizeof(questionText), "Enter which %s in %s your timezone begins observing DST/Summer Time", DaysOfWeek[dstInfo.startDay], MonthsOfYear[dstInfo.startMonth]);
Packit 857059
						dstInfo.startWhich = getInt(questionText, 1, 5, FALSE, 0);
Packit 857059
						dstInfo.endMonth = getInt("Enter the month in which your timezone ends observing DST/Summer Time", 3, 11, FALSE, 0);
Packit 857059
						dstInfo.endDay = getInt("Enter the day of week on which your timezone ends observing DST/Summer Time", 1, 7, FALSE, 0);
Packit 857059
						snprintf(questionText, sizeof(questionText), "Enter which %s in %s your timezone ends observing DST/Summer Time", DaysOfWeek[dstInfo.endDay], MonthsOfYear[dstInfo.endMonth]);
Packit 857059
						dstInfo.endWhich = getInt(questionText, 1, 5, FALSE, 0);
Packit 857059
						printf("You have selected the following start/end parameters:\n");
Packit 857059
						printf("  Start DST/Summer Time on the %s %s in %s\n", Ordinals[dstInfo.startWhich], DaysOfWeek[dstInfo.startDay], MonthsOfYear[dstInfo.startMonth]);
Packit 857059
						printf("  End DST/Summer Time on the %s %s in %s\n", Ordinals[dstInfo.endWhich], DaysOfWeek[dstInfo.endDay], MonthsOfYear[dstInfo.endMonth]);
Packit 857059
						done = getYesNo("Does this reflect your timezone's start and end DST/Summer Time adjustments? [y]", 1);
Packit 857059
					}
Packit 857059
				}
Packit 857059
			}
Packit 857059
	
Packit 857059
		} /* not using server TZ info */
Packit 857059
	} else {
Packit 857059
		tzOffset = NO_TZ_DST_SETUP;
Packit 857059
		memset((void *)&dstInfo, 0, sizeof(dstInfo));
Packit 857059
	}
Packit 857059
Packit 857059
	return;
Packit 857059
}
Packit 857059
Packit 857059
int validateIpAddrSection(char *p)
Packit 857059
{
Packit 857059
	int res = 0;
Packit 857059
	int digitCount = 0;
Packit 857059
Packit 857059
	while(isdigit(*p++))
Packit 857059
	{
Packit 857059
		digitCount++;
Packit 857059
	}
Packit 857059
	if (digitCount <= 3)
Packit 857059
		res = digitCount;
Packit 857059
Packit 857059
	return(res);
Packit 857059
}
Packit 857059
Packit 857059
int getIpAddress(char *ipAddress, char *promptText)
Packit 857059
{
Packit 857059
	char inbuf[64];
Packit 857059
	int ipAddrParts[4];
Packit 857059
	int res = 1;
Packit 857059
	int done = 0;
Packit 857059
	int i = 0;
Packit 857059
	char *p;
Packit 857059
	int goodSyntax = 1;
Packit 857059
Packit 857059
	while (!done)
Packit 857059
	{
Packit 857059
		p = inbuf;
Packit 857059
		printf("Enter IP address for %s (or none): ", promptText);
Packit 857059
		if (fgets(inbuf, 64, stdin) == NULL) {
Packit 857059
			goodSyntax = 0;
Packit 857059
			printf("\n");
Packit 857059
		} else {
Packit 857059
			if (strncmp(inbuf, "none", 4) == 0)
Packit 857059
			{
Packit 857059
				return 0;
Packit 857059
			}
Packit 857059
			goodSyntax = 1;
Packit 857059
			for (i = 0; i < 4; i++)
Packit 857059
			{
Packit 857059
				if ((res = validateIpAddrSection(p)) > 0)
Packit 857059
					p += res;
Packit 857059
				else
Packit 857059
					goodSyntax = 0;
Packit 857059
Packit 857059
				if (i < 3)
Packit 857059
				{
Packit 857059
					if (*p == '.')
Packit 857059
						p++;
Packit 857059
					else
Packit 857059
						goodSyntax = 0;
Packit 857059
				}
Packit 857059
			}
Packit 857059
		}
Packit 857059
Packit 857059
		if (goodSyntax)
Packit 857059
		{
Packit 857059
			sscanf(inbuf, "%d.%d.%d.%d", &ipAddrParts[0], &ipAddrParts[1], &ipAddrParts[2], &ipAddrParts[3]);
Packit 857059
			goodSyntax = 1;
Packit 857059
			i = 0;
Packit 857059
			while (goodSyntax && (i < 4))
Packit 857059
			{
Packit 857059
				if ((ipAddrParts[i] < 0) || (ipAddrParts[i] > 255))
Packit 857059
					goodSyntax = 0;
Packit 857059
				i++;
Packit 857059
			}
Packit 857059
		}
Packit 857059
Packit 857059
		if (!goodSyntax)
Packit 857059
			fprintf(stderr, "Bad IP Address syntax: %s", inbuf);
Packit 857059
		else
Packit 857059
			done = 1;
Packit 857059
	}
Packit 857059
Packit 857059
	if (goodSyntax)
Packit 857059
		snprintf(ipAddress, 16, "%d.%d.%d.%d", ipAddrParts[0], ipAddrParts[1], ipAddrParts[2], ipAddrParts[3]);
Packit 857059
	else
Packit 857059
		res = 0;
Packit 857059
Packit 857059
	return(res);
Packit 857059
}
Packit 857059
Packit 857059
int validLicenseKey(char *key)
Packit 857059
{
Packit 857059
	char *p;
Packit 857059
	int goodSyntax = 1;
Packit 857059
	int i;
Packit 857059
	int j;
Packit 857059
Packit 857059
	/* valid syntax is 5 groups of six alphanumeric chars, each followed by a hyphen, and lastly
Packit 857059
	   a single alphanumeric */
Packit 857059
	p = key;
Packit 857059
	for (i = 0; (i < 5) && goodSyntax; i++)
Packit 857059
	{
Packit 857059
		for (j = 0; (j < 6) && goodSyntax; j++)
Packit 857059
		{
Packit 857059
			if (!isalnum(*p++))
Packit 857059
				goodSyntax = 0;
Packit 857059
			if (j == 5)
Packit 857059
			{
Packit 857059
				if (*p++ != '-')
Packit 857059
					goodSyntax = 0;
Packit 857059
			}
Packit 857059
		}
Packit 857059
	}
Packit 857059
	if (!isalnum(*p))
Packit 857059
		goodSyntax = 0;
Packit 857059
Packit 857059
	return(goodSyntax);
Packit 857059
}
Packit 857059
Packit 857059
void removeCR(char *buf)
Packit 857059
{
Packit 857059
	char *p;
Packit 857059
Packit 857059
	if ((p = strchr(buf, '\n')) != NULL)
Packit 857059
		*p = '\0';
Packit 857059
}
Packit 857059
Packit 857059
int getLicenseKey(char *smKey, char *promptText)
Packit 857059
{
Packit 857059
	int done = 0;
Packit 857059
	int res = 1;
Packit 857059
	char keyBuf[80];
Packit 857059
Packit 857059
	while (!done)
Packit 857059
	{
Packit 857059
		printf("Enter license key for %s: ", promptText);
Packit 857059
		if (fgets(keyBuf, 80, stdin)) {
Packit 857059
			removeCR(keyBuf);
Packit 857059
Packit 857059
			if (validLicenseKey(keyBuf))
Packit 857059
				done = 1;
Packit 857059
			else
Packit 857059
				fprintf(stderr, "Bad license key syntax\n");
Packit 857059
		}
Packit 857059
	}
Packit 857059
Packit 857059
	strcpy(smKey, keyBuf);
Packit 857059
Packit 857059
	return(res);
Packit 857059
}
Packit 857059
Packit 857059
int storeChassisInfo(char *ipAddr, char *smKey)
Packit 857059
{
Packit 857059
	chassisInfo_t *oldTable;
Packit 857059
	int i;
Packit 857059
	int res = 1;
Packit 857059
Packit 857059
	if (numChassis == chassisInfoTableSize)
Packit 857059
	{
Packit 857059
		oldTable = chassisInfoTable;
Packit 857059
		if ((chassisInfoTable = (chassisInfo_t *)malloc(sizeof(chassisInfo_t) * (chassisInfoTableSize + CHASSISINFOBLOCK))) == NULL)
Packit 857059
		{
Packit 857059
			fprintf(stderr, "Error allocating table for chassis info\n");
Packit 857059
			return(0);
Packit 857059
		}
Packit 857059
		if (oldTable != NULL)
Packit 857059
		{
Packit 857059
			for (i = 0; i < chassisInfoTableSize; i++)
Packit 857059
				memcpy(&chassisInfoTable[i], &oldTable[i], sizeof(chassisInfo_t));
Packit 857059
			free(oldTable);
Packit 857059
		}
Packit 857059
		chassisInfoTableSize += CHASSISINFOBLOCK;
Packit 857059
	}
Packit 857059
Packit 857059
	memcpy(&chassisInfoTable[numChassis].chassisIpAddr, ipAddr, strlen(ipAddr)+1);
Packit 857059
	memcpy(&chassisInfoTable[numChassis].chassisSMKey, smKey, strlen(smKey)+1);
Packit 857059
	numChassis++;
Packit 857059
Packit 857059
	return(res);
Packit 857059
}
Packit 857059
Packit 857059
int getChassisSpecifics(int argc, char *argv[])
Packit 857059
{
Packit 857059
	int res = 1;
Packit 857059
	int i;
Packit 857059
#if 0
Packit 857059
	int ipAddr;
Packit 857059
	int licenseKey;
Packit 857059
	char promptText[20];
Packit 857059
#endif
Packit 857059
	char chassisIpAddr[20];
Packit 857059
	char chassisSMKey[50];
Packit 857059
Packit 857059
	for (i = 2; i < argc; i++)
Packit 857059
	{
Packit 857059
#if 0
Packit 857059
		sprintf(promptText, "chassis %s", argv[i]);
Packit 857059
		printf("%s\n", promptText);
Packit 857059
		ipAddr = getYesNo("Do you wish to set the chassis IP address for this chassis? [n]", 0);
Packit 857059
		if (ipAddr)
Packit 857059
		{
Packit 857059
			if (!(res = getIpAddress(chassisIpAddr, promptText)))
Packit 857059
				NOIPADDR(chassisIpAddr);
Packit 857059
		}
Packit 857059
		else
Packit 857059
			NOIPADDR(chassisIpAddr);
Packit 857059
#else
Packit 857059
		NOIPADDR(chassisIpAddr);
Packit 857059
#endif
Packit 857059
Packit 857059
#if 0
Packit 857059
		licenseKey = getYesNo("Do you wish to add an SM license key for this chassis? [y]", 1);
Packit 857059
		if (licenseKey)
Packit 857059
		{
Packit 857059
			if (!(res = getLicenseKey(chassisSMKey, promptText)))
Packit 857059
				strcpy(chassisSMKey, "NO-KEY");
Packit 857059
		}
Packit 857059
		else
Packit 857059
			strcpy(chassisSMKey, "NO-KEY");
Packit 857059
		res = storeChassisInfo(chassisIpAddr, chassisSMKey);
Packit 857059
#else
Packit 857059
		strcpy(chassisSMKey, "NO-KEY");
Packit 857059
		res = storeChassisInfo(chassisIpAddr, chassisSMKey);
Packit 857059
#endif
Packit 857059
	}
Packit 857059
Packit 857059
	return(res);
Packit 857059
}
Packit 857059
Packit 857059
int getGeneralInfo()
Packit 857059
{
Packit 857059
	int cfgSyslog = 0;
Packit 857059
	int useSyslogServer = 0;
Packit 857059
	int useSyslogPort = 0;
Packit 857059
	int useSyslogFacility = 0;
Packit 857059
	int useNTPServer = 0;
Packit 857059
	int setTzInfo = 0;
Packit 857059
	int setLinkWidth = 0;
Packit 857059
	int setLinkCRCMode = 0;
Packit 857059
	int res = 1;
Packit 857059
Packit 857059
	cfgSyslog = getYesNo("Do you wish to adjust syslog configuration settings? [y]", 1);
Packit 857059
	if (cfgSyslog)
Packit 857059
	{
Packit 857059
		useSyslogServer = getYesNo("Do you wish to configure a syslog server? [y]", 1);
Packit 857059
		if (useSyslogServer)
Packit 857059
		{
Packit 857059
			if (!(res = getIpAddress(syslogIpAddr, "syslog server")))
Packit 857059
				NOIPADDR(syslogIpAddr);
Packit 857059
		}
Packit 857059
		else
Packit 857059
		{
Packit 857059
			NOIPADDR(syslogIpAddr);
Packit 857059
		}
Packit 857059
		useSyslogPort = getYesNo("Do you wish to configure the syslog TCP/UDP port number? [n]", 0);
Packit 857059
		if (useSyslogPort)
Packit 857059
		{
Packit 857059
			syslogPort = getInt("Enter TCP/UDP port number for syslog", 1, 1<<16, TRUE, SYSLOG_PORT_DEFAULT);
Packit 857059
		}
Packit 857059
		useSyslogFacility = getYesNo("Do you wish to configure the syslog facility? [n]", 0);
Packit 857059
		if (useSyslogFacility)
Packit 857059
		{
Packit 857059
			syslogFacility = getInt("Enter facility level for syslog (0-23)", 0, 23, TRUE, SYSLOG_FACILITY_DEFAULT);
Packit 857059
		}
Packit 857059
	}
Packit 857059
	else
Packit 857059
	{
Packit 857059
		NOIPADDR(syslogIpAddr);
Packit 857059
	}
Packit 857059
Packit 857059
	useNTPServer = getYesNo("Do you wish to configure an NTP server? [y]", 1);
Packit 857059
	if (useNTPServer)
Packit 857059
	{
Packit 857059
		if (!(res = getIpAddress(ntpIpAddr, "NTP server")))
Packit 857059
			NOIPADDR(ntpIpAddr);
Packit 857059
	}
Packit 857059
	else
Packit 857059
		NOIPADDR(ntpIpAddr);
Packit 857059
Packit 857059
	setTzInfo = getYesNo("Do you wish to configure timezone and DST information? [y]", 1);
Packit 857059
	getTimeZoneInfo(setTzInfo);
Packit 857059
Packit 857059
	setLinkWidth = getYesNo("Do you wish to configure the chassis link width? [n]", 0);
Packit 857059
	if (setLinkWidth)
Packit 857059
	{
Packit 857059
		printf("\t1 : 1X\n\t2 : 2X\n\t3 : 1X/2X\n\t4 : 3X\n\t5 : 1X/3X\n\t6 : 2X/3X\n\t7 : 1X/2X/3X\n\t8 : 4X\n\t9 : 1X/4X\n\t10 : 2X/4X\n\t11 : 1X/2X/4X\n\t12 : 3X/4X\n\t13 : 1X/3X/4X\n\t14 : 2X/3X/4X\n\t15 : 1X/2X/3X/4X\n");
Packit 857059
		linkWidthSelection = getInt("Enter selection", 1, 15, TRUE, 0);
Packit 857059
		if (linkWidthSelection > 0)
Packit 857059
		{
Packit 857059
			printf("*******************************************************************************\n");
Packit 857059
			printf("*** Note: a reboot of all chassis devices is required in order to activate\n*** changes to the chassis link width\n");
Packit 857059
			printf("*******************************************************************************\n");
Packit 857059
		}
Packit 857059
	} else
Packit 857059
		linkWidthSelection = 0;
Packit 857059
Packit 857059
	setname = getYesNo("Do you wish to configure OPA Node Desc to match ethernet chassis name? [y]", 1);
Packit 857059
	if (setname) {
Packit 857059
		printf("*******************************************************************************\n");
Packit 857059
		printf("*** Note: a reboot of all chassis devices is required in order to activate\n*** changes to the chassis OPA Node Desc\n");
Packit 857059
		printf("*******************************************************************************\n");
Packit 857059
	}
Packit 857059
Packit 857059
	setLinkCRCMode = getYesNo("Do you wish to configure the Link CRC Mode? [n]", 0);
Packit 857059
	if (setLinkCRCMode) {
Packit 857059
		printf("\t0 : 16b,\n\t1 : 14b/16b,\n\t2 : 48b/16b,\n\t3 : 48b/14b/16b,\n\t4 : per-lane/16b,\n\t5 : per-lane/14b/16b,\n\t6 : per-lane/48b/16b,\n\t7 : per-lane/48b/14b/16b\n");
Packit 857059
		linkCRCModeSelection = getInt("Enter selection", 0, 7, TRUE, -1);
Packit 857059
		if (linkCRCModeSelection > -1)
Packit 857059
		{
Packit 857059
			printf("*******************************************************************************\n");
Packit 857059
			printf("*** Note: a reboot of all chassis devices is required in order to activate\n*** changes to the chassis link CRC mode\n");
Packit 857059
			printf("*******************************************************************************\n");
Packit 857059
		}
Packit 857059
	} else
Packit 857059
		linkCRCModeSelection = -1;
Packit 857059
Packit 857059
	return(res);
Packit 857059
}
Packit 857059
Packit 857059
int
Packit 857059
main(int argc, char *argv[])
Packit 857059
{
Packit 857059
	int i;
Packit 857059
	FILE *fp_out;
Packit 857059
	char *dirName;
Packit 857059
Packit 857059
	chassisInfoTable = NULL;
Packit 857059
	chassisInfoTableSize = 0;
Packit 857059
	numChassis = 0;
Packit 857059
Packit 857059
	dirName = argv[1];
Packit 857059
	if (dirName == NULL)
Packit 857059
		dirName = ".";
Packit 857059
Packit 857059
	if (chdir(dirName) < 0) {
Packit 857059
		fprintf(stderr, "Error changing directory to %s: %s\n", dirName, strerror(errno));
Packit 857059
		exit(1);
Packit 857059
	}
Packit 857059
Packit 857059
	getChassisSpecifics(argc, argv);
Packit 857059
	getGeneralInfo();
Packit 857059
Packit 857059
	if ((fp_out = fopen("./.chassisSetup.out","w")) == NULL)
Packit 857059
	{
Packit 857059
		fprintf(stderr, "Error opening .chassisSetup.out for output: %s\n", strerror(errno));
Packit 857059
		exit(1);
Packit 857059
	}
Packit 857059
Packit 857059
	/* display chassis info */
Packit 857059
	fprintf(fp_out, "Number of chassis: %d\n", numChassis);
Packit 857059
	for (i = 0; i < numChassis; i++)
Packit 857059
	{
Packit 857059
		fprintf(fp_out, "%d Chassis %s IP_Addr: %s\n", i+2, argv[i+2], chassisInfoTable[i].chassisIpAddr);
Packit 857059
		fprintf(fp_out, "%d Chassis %s SM_Key: %s\n", i+2, argv[i+2], (chassisInfoTable[i].chassisSMKey != NULL) ? chassisInfoTable[i].chassisSMKey : "NULL");
Packit 857059
	}
Packit 857059
Packit 857059
	/* display general info */
Packit 857059
	fprintf(fp_out, "Syslog Server IP_Address:%s\n", syslogIpAddr);
Packit 857059
	fprintf(fp_out, "Syslog Port:%d\n", syslogPort);
Packit 857059
	fprintf(fp_out, "Syslog Facility:%d\n", syslogFacility);
Packit 857059
	fprintf(fp_out, "NTP Server IP_Address:%s\n", ntpIpAddr);
Packit 857059
	fprintf(fp_out, "Timezone offset:%d\n", tzOffset);
Packit 857059
	fprintf(fp_out, "Start DST:%d %d %d\n",
Packit 857059
			dstInfo.startWhich,
Packit 857059
			dstInfo.startDay,
Packit 857059
			dstInfo.startMonth);
Packit 857059
	fprintf(fp_out, "End DST:%d %d %d\n",
Packit 857059
			dstInfo.endWhich,
Packit 857059
			dstInfo.endDay,
Packit 857059
			dstInfo.endMonth);
Packit 857059
	fprintf(fp_out, "Link Width Selection:%d\n", linkWidthSelection);
Packit 857059
	fprintf(fp_out, "Set OPA Node Desc:%s\n", setname?"y":"n");
Packit 857059
	fprintf(fp_out, "Link CRC Mode:%d\n", linkCRCModeSelection);
Packit 857059
Packit 857059
	fclose(fp_out);
Packit 857059
	exit(0);
Packit 857059
}