From: atul.sabharwal@intel.com Date: Thu, 1 Apr 2004 02:18:58 +0000 (-0800) Subject: [PATCH] Add chassis_id program to extras directory X-Git-Tag: 024~31 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=fa5acd760db98d8f7ec810e44e8d4527b115e43c [PATCH] Add chassis_id program to extras directory --- diff --git a/extras/chassis_id/Makefile b/extras/chassis_id/Makefile new file mode 100644 index 000000000..d3152e863 --- /dev/null +++ b/extras/chassis_id/Makefile @@ -0,0 +1,26 @@ +# +# ** +# ** (C) 2003 Intel Corporation +# ** Atul Sabharwal +# ** +# ** $Id: Makefile,v 1.3 2004/03/22 23:54:54 atul Exp $ +# ** +# ** Distributed under the terms of the GNU Public License, v2.0 or +# ** later. +# ** +# ** Many parts heavily based on test-skeleton.c, by Ulrich Drepper; +# ** with his permission, they have been re-licensed GPL, and his +# ** copyright still applies on them. +# ** +# */ +# +CFLAGS = -g +TARGET = chassis_id + +all: chassis_id + +chassis_id: chassis_id.c table.c + gcc -o $(TARGET) $(CFLAGS) chassis_id.c table.c + +clean: + rm -rf core a.out $(TARGET) diff --git a/extras/chassis_id/chassis_id.c b/extras/chassis_id/chassis_id.c new file mode 100644 index 000000000..8f878b2c6 --- /dev/null +++ b/extras/chassis_id/chassis_id.c @@ -0,0 +1,112 @@ + + /* -*-c-*-: + ** + ** (C) 2003 Intel Corporation + ** Atul Sabharwal + ** + ** $Id: chassis_id.c,v 1.8 2004/03/22 23:33:10 atul Exp $ + ** + ** Distributed under the terms of the GNU Public License, v2.0 or + ** later. + ** + ** Many parts heavily based on test-skeleton.c, by Ulrich Drepper; + ** with his permission, they have been re-licensed GPL, and his + ** copyright still applies on them. + ** + */ + +#include +#include +#include + +#include "chassis_id.h" + +//#define DEBUG 1 + +int main(int argc, char **argv, char ** envp) +{ + int chassis_num, slot_num, retval, host_num; + char disk_snum[255], devpath[255]; + char * ptr; + int disk_index; + + syslog( LOG_PID| LOG_DAEMON| LOG_ERR, "\n%s", "starting chassis_id" ); + +#if 0 + ptr = (char *) getenv( "CHASSIS"); + if( ptr == NULL ) + return -ERROR_NO_CHASSIS; + + sscanf(ptr, "%d", &chassis_num); + #ifdef DEBUG + syslog(LOG_PID| LOG_DAEMON| LOG_ERR, "Chassis %d", chassis_num); + #endif + + + ptr = (char *) getenv( "SLOT" ); + if( ptr== NULL ) + return -ERROR_NO_SLOT; + + sscanf(ptr, "%d", &slot_num); + #ifdef DEBUG + syslog( LOG_PID|LOG_DAEMON| LOG_ERR, "Slot %d", slot_num); + #endif +#endif + ptr = (char *) getenv( "DEVPATH"); + if( ptr == NULL ) + return -ERROR_NO_DEVPATH; + + sscanf(ptr, "%s", &devpath[0]); + #ifdef DEBUG + syslog( LOG_PID|LOG_DAEMON| LOG_ERR, "Devpath %s", devpath); + #endif + + retval = table_init(); + if(retval < 0 ) + return -ERROR_BAD_TABLE; + + getserial_number( devpath, disk_snum); + + + /* Now we open the provisioning table t find actual entry for the serial number*/ + disk_index = table_find_disk(disk_snum, &host_num, &chassis_num, &slot_num); + if ( disk_index == -1 ) + { + //typical provisioning error + return -ERROR_NO_DISK; + } + else + { + table_select_disk( disk_index ); + } + return 0; +} + + +/* Run SCSI id to find serial number of the device */ +int getserial_number( char * devpath, char * snumber ) +{ + FILE *fp; + char vendor [255], model[255], cmd[255]; + int retval; + + sprintf(cmd, "/sbin/scsi_id -s %s -p 0x80", devpath); + + fp = popen( cmd, "r"); + + if (fp == NULL) + return -ERROR_BAD_SNUMBER; + + fscanf( fp, "%s %s %s", vendor, model, snumber); + #ifdef DEBUG + syslog( LOG_PID| LOG_DAEMON| LOG_ERR, "\n%s", snumber ); + #endif + + retval = pclose(fp); + if (retval == -1) + return -ERROR_BAD_SNUMBER; + else + return NO_ERROR; + +} + diff --git a/extras/chassis_id/chassis_id.h b/extras/chassis_id/chassis_id.h new file mode 100644 index 000000000..db5db90c2 --- /dev/null +++ b/extras/chassis_id/chassis_id.h @@ -0,0 +1,34 @@ + + /* -*-c-*-: + ** + ** (C) 2003 Intel Corporation + ** Atul Sabharwal + ** + ** $Id: chassis_id.h,v 1.1 2004/03/16 18:24:44 atul Exp $ + ** + ** Distributed under the terms of the GNU Public License, v2.0 or + ** later. + ** + ** Many parts heavily based on test-skeleton.c, by Ulrich Drepper; + ** with his permission, they have been re-licensed GPL, and his + ** copyright still applies on them. + ** + */ + +#ifndef _CHASSIS_ID_H +#define _CHASSIS_ID_H + +//#define DEBUG 1 +#define ERROR 1 +#define ERROR_NO_SLOT 2 +#define ERROR_NO_CHASSIS 3 +#define ERROR_NO_DEVPATH 4 +#define ERROR_BAD_SNUMBER 5 +#define ERROR_NO_DISK 6 +#define ERROR_BAD_TABLE 7 +#define ERROR_BAD_SCAN 8 +#define NO_ERROR 0 + +extern int table_init(); + +#endif diff --git a/extras/chassis_id/provision.tbl b/extras/chassis_id/provision.tbl new file mode 100644 index 000000000..c137fd537 --- /dev/null +++ b/extras/chassis_id/provision.tbl @@ -0,0 +1,5 @@ +id host number_of_disks chassis# slot# serial# name +1 1 2 1 2 3BM07NKA000070456Z6B disk1 +2 1 2 1 2 3BM07R68000070456ZCK disk2 +3 2 2 1 3 3EV08ANK00007219JAVA disk3 +4 2 2 1 4 3EV00NZB000072190Y90 disk4 diff --git a/extras/chassis_id/table.c b/extras/chassis_id/table.c new file mode 100644 index 000000000..418497edb --- /dev/null +++ b/extras/chassis_id/table.c @@ -0,0 +1,102 @@ + /* -*-c-*-: + ** + ** (C) 2003 Intel Corporation + ** Atul Sabharwal + ** + ** $Id: table.c,v 1.4 2004/03/18 21:56:24 atul Exp $ + ** + ** Distributed under the terms of the GNU Public License, v2.0 or + ** later. + ** + ** Many parts heavily based on test-skeleton.c, by Ulrich Drepper; + ** with his permission, they have been re-licensed GPL, and his + ** copyright still applies on them. + ** + */ + +#include +#define TABLE_SIZE 100 +#define PROVISION_DB "/usr/local/bin/provision.tbl" + +struct provision_record +{ + int id; + int host_num; //port # or adaptor number + int num_disks; + int chassis_num; + int slot_num; + char serial_num[32]; + char name[32]; + +} ptable[TABLE_SIZE]; + +int ptable_size; + +/* Initialize the provisioning table by reading the data from special file provision.tbl * + Return error if something does not work appropriately. */ +int table_init() +{ + FILE *fp; + char ptr[255]; + int i; + + fp=fopen( PROVISION_DB, "r"); + + if ((fp== NULL) || feof(fp)) + return -1; + + //skip the first line of text which contains descriptive details. + fgets(ptr, 80, fp); + i = 0; + while (!feof(fp)) + { + fgets(ptr, 80, fp); + sscanf( ptr, "%d %d %d %d %d %s %s", &ptable[i].id, &ptable[i].host_num, + &ptable[i].num_disks, &ptable[i].chassis_num, &ptable[i].slot_num, + ptable[i].serial_num, ptable[i].name ); + i++; + } + + ptable_size = i; + fclose(fp); + return 0; +} + + +/* return -1 when no disk found. Otherwise return index of disk */ +int table_find_disk( char * serialnumber , int * host_num, int * chassis_num, int *slot_num) +{ + + int i; + + for(i = 0; i < ptable_size; i++) + { + + if(strcmp(ptable[i].serial_num, serialnumber) == 0) + { + + *host_num = ptable[i].host_num; + *chassis_num = ptable[i].chassis_num; + *slot_num = ptable[i].slot_num; + break; + } + } + + if(i == ptable_size) + return -1; + else + return i; +} + +/* This function is primarily there for passing the selected disk entry to udev so that * + * it can create descriptive GDN for it. So, for that we need to output this data to * + * stdout. */ +int table_select_disk( int diskindex ) +{ + printf("%d ", ptable[diskindex].chassis_num); + printf("%d ", ptable[diskindex].slot_num); + printf("%d ", ptable[diskindex].host_num); + printf("%s ", ptable[diskindex].name); + +} +