Added password change with -p
This commit is contained in:
parent
5fba535053
commit
4e5167732f
176
lib/dsmsession.c
176
lib/dsmsession.c
@ -6,6 +6,9 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <termio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "dsmrc.h"
|
#include "dsmrc.h"
|
||||||
#include "dsmapitd.h"
|
#include "dsmapitd.h"
|
||||||
@ -72,7 +75,7 @@ int tsm_checkapi(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Initialise a session to the TSM server */
|
/* Initialise a session to the TSM server */
|
||||||
dsUint32_t tsm_initsess(char *options) {
|
dsUint32_t tsm_initsess(char *options, char *password) {
|
||||||
dsInt16_t rc=0;
|
dsInt16_t rc=0;
|
||||||
dsUint32_t dsmHandle=0;
|
dsUint32_t dsmHandle=0;
|
||||||
dsmApiVersionEx applApi;
|
dsmApiVersionEx applApi;
|
||||||
@ -97,7 +100,7 @@ dsUint32_t tsm_initsess(char *options) {
|
|||||||
initIn.apiVersionExP = &applApi;
|
initIn.apiVersionExP = &applApi;
|
||||||
initIn.clientNodeNameP = NULL;
|
initIn.clientNodeNameP = NULL;
|
||||||
initIn.clientOwnerNameP = NULL;
|
initIn.clientOwnerNameP = NULL;
|
||||||
initIn.clientPasswordP = NULL;
|
initIn.clientPasswordP = password;
|
||||||
initIn.applicationTypeP = NULL;
|
initIn.applicationTypeP = NULL;
|
||||||
initIn.configfile = NULL;
|
initIn.configfile = NULL;
|
||||||
initIn.options = options;
|
initIn.options = options;
|
||||||
@ -119,6 +122,7 @@ dsUint32_t tsm_initsess(char *options) {
|
|||||||
|
|
||||||
if (rc != DSM_RC_OK) {
|
if (rc != DSM_RC_OK) {
|
||||||
printf("%s: dsmChangePW() failed %s\n",__func__,tsm_printerr(dsmHandle,rc));
|
printf("%s: dsmChangePW() failed %s\n",__func__,tsm_printerr(dsmHandle,rc));
|
||||||
|
dsmTerminate(dsmHandle);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -397,3 +401,171 @@ dsInt16_t tsm_queryfile(dsUint32_t dsmHandle, dsmQueryType qType, tsm_query_call
|
|||||||
|
|
||||||
return DSM_RC_OK;
|
return DSM_RC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Signal handler */
|
||||||
|
int intrupt = 0;
|
||||||
|
void Catch(int signo) {
|
||||||
|
if(signo) {}; /* so compiler won't complain about unused arguments */
|
||||||
|
|
||||||
|
intrupt = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Uses sigaction to establish signal handler */
|
||||||
|
int install_sig_handler(int signum, void (*sig_handler)(int)) {
|
||||||
|
struct sigaction action;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
action.sa_handler = sig_handler; /* signal handler function */
|
||||||
|
sigemptyset( &action.sa_mask ); /* mask of signals to block */
|
||||||
|
|
||||||
|
action.sa_flags = SA_NOCLDSTOP;
|
||||||
|
|
||||||
|
rc = sigaction(
|
||||||
|
signum, /* I */ /* signal identifier */
|
||||||
|
&action, /* *I */ /* new action for signal */
|
||||||
|
NULL ); /* *O */ /* previous action - not needed */
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ReadPass(char *text, char *buffer, int length) {
|
||||||
|
struct termio ttyState, ttyStateSave;
|
||||||
|
register char *p;
|
||||||
|
register int c;
|
||||||
|
int rc;
|
||||||
|
FILE *ttyFH;
|
||||||
|
|
||||||
|
struct sigaction action;
|
||||||
|
|
||||||
|
/* Let's flush any prompt to the terminal that may be pending. */
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
/* Open the console input device */
|
||||||
|
if((ttyFH = fopen("/dev/tty", "r")) == NULL)
|
||||||
|
return(-1);
|
||||||
|
else
|
||||||
|
setbuf(ttyFH, (char *)NULL);
|
||||||
|
|
||||||
|
/* Reset the interrupt flag */
|
||||||
|
intrupt = 0;
|
||||||
|
|
||||||
|
/* Trap the "BREAK" interrupt */
|
||||||
|
(void) sigaction( SIGINT, NULL, &action ); /* save current hdlr */
|
||||||
|
(void) install_sig_handler( SIGINT, Catch ); /* install new hdlr */
|
||||||
|
|
||||||
|
/* Get current state */
|
||||||
|
rc = ioctl(fileno(ttyFH), TCGETA, &ttyStateSave);
|
||||||
|
if (rc == -1)
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
/* Copy the saved tty state into a work field */
|
||||||
|
ttyState = ttyStateSave;
|
||||||
|
|
||||||
|
/* Turn off ECHO */
|
||||||
|
ttyState.c_lflag &= ~ECHO;
|
||||||
|
rc = ioctl(fileno(ttyFH), TCSETA, &ttyState);
|
||||||
|
if (rc == -1)
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
printf(text);
|
||||||
|
|
||||||
|
/* Read the password (quietly) */
|
||||||
|
for(p=buffer; !intrupt && (c = getc(ttyFH)) != '\n' && c != EOF; ) {
|
||||||
|
if(p < buffer+length)
|
||||||
|
*p++ = c;
|
||||||
|
}
|
||||||
|
*p = '\0';
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
/* Restore the tty state settings */
|
||||||
|
rc = ioctl(fileno(ttyFH), TCSETA, &ttyStateSave);
|
||||||
|
if (rc == -1)
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
/* Reset the interrupt handler */
|
||||||
|
(void) sigaction( SIGINT, &action, NULL );
|
||||||
|
|
||||||
|
if(ttyFH != stdin)
|
||||||
|
(void) fclose(ttyFH);
|
||||||
|
if(intrupt)
|
||||||
|
(void) kill(getpid(), SIGINT);
|
||||||
|
|
||||||
|
return(strlen(buffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the TSM Node password
|
||||||
|
*
|
||||||
|
* We use a callback to process the list, the callback should return:
|
||||||
|
*/
|
||||||
|
int tsm_setpassword(char *options) {
|
||||||
|
uint32 dsmHandle;
|
||||||
|
bool_t done = bFalse;
|
||||||
|
uint16 pw_trys = 0;
|
||||||
|
uint16 len = 0;
|
||||||
|
char input[INPUTLEN];
|
||||||
|
char pw_cur[DSM_MAX_VERIFIER_LENGTH + 1];
|
||||||
|
char pw_new [DSM_MAX_VERIFIER_LENGTH + 1];
|
||||||
|
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
while (!done) {
|
||||||
|
// Current Password
|
||||||
|
rc = ReadPass("Enter your current password: ",input,INPUTLEN);
|
||||||
|
len = strlen(input);
|
||||||
|
if ((len > DSM_MAX_VERIFIER_LENGTH) || !len || (rc < 0)) {
|
||||||
|
printf("Current password is invalid. Please try again.\n");
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
strcpy(pw_cur,input);
|
||||||
|
}
|
||||||
|
|
||||||
|
// New password
|
||||||
|
rc = ReadPass("Enter your new password: ",input,INPUTLEN);
|
||||||
|
len = strlen(input);
|
||||||
|
if ((len > DSM_MAX_VERIFIER_LENGTH) || !len || (rc < 0)) {
|
||||||
|
printf("New password is invalid. Please try again.\n");
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
strcpy(pw_new,input);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify new password
|
||||||
|
rc = ReadPass("Enter your new password again: ",input,INPUTLEN);
|
||||||
|
len = strlen(input);
|
||||||
|
if ((len > DSM_MAX_VERIFIER_LENGTH) || !len || (rc < 0)) {
|
||||||
|
printf("New password is invalid. Please try again.\n");
|
||||||
|
continue;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Compare new pw copies to make sure no typos from user.
|
||||||
|
if ((strcmp(pw_new,input))) {
|
||||||
|
pw_trys++;
|
||||||
|
|
||||||
|
if (pw_trys > 3)
|
||||||
|
debugLog(0,__func__,"ERROR: Passwords dont match, tried too many times.",3);
|
||||||
|
else
|
||||||
|
debugLog(0,__func__,"WARN: Your new passwords do not match, please try again...",0);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
done = bTrue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dsmHandle = tsm_initsess(options,pw_cur);
|
||||||
|
if (! dsmHandle) {
|
||||||
|
debugLog(0,__func__,"ERROR: Unable to create TSM session with your password.",2);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = dsmChangePW(dsmHandle,pw_cur,pw_new);
|
||||||
|
if (rc)
|
||||||
|
debugLog(0,__func__,"ERROR: Password change failed.",2);
|
||||||
|
else
|
||||||
|
printf("\nYour new password has been accepted and updated.\n");
|
||||||
|
|
||||||
|
dsmTerminate(dsmHandle);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
28
tsmpipe.c
28
tsmpipe.c
@ -69,8 +69,9 @@ void usage(void) {
|
|||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"tsmpipe %s, usage:\n"
|
"tsmpipe %s, usage:\n"
|
||||||
"\n"
|
"\n"
|
||||||
"tsmpipe [-i]|[[-A|-B|-U] [-c|-x|-d|-t] -s fsname -f filepath [-l len] ...]\n"
|
"tsmpipe [-i|-p]|[[-A|-B|-U] [-c|-x|-d|-t] -s fsname -f filepath [-l len] ...]\n"
|
||||||
" -i Show session information:\n"
|
" -i Show session information\n"
|
||||||
|
" -p Set Password\n"
|
||||||
" -A, -B and -U are mutually exclusive:\n"
|
" -A, -B and -U are mutually exclusive:\n"
|
||||||
" -A Use Archive objects\n"
|
" -A Use Archive objects\n"
|
||||||
" -B Use Backup objects\n"
|
" -B Use Backup objects\n"
|
||||||
@ -102,14 +103,13 @@ void usage(void) {
|
|||||||
" -V Verbose information on TSM transfer\n"
|
" -V Verbose information on TSM transfer\n"
|
||||||
,_TSMPIPE_VERSION);
|
,_TSMPIPE_VERSION);
|
||||||
|
|
||||||
exit(1);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void usage_action(void) {
|
void usage_action(void) {
|
||||||
debugLog(0,__func__,"ERROR: Must give one of -i, -c, -x, -d, -t",1);
|
debugLog(0,__func__,"ERROR: Must give one of -i, -p, -c, -x, -d, -t",1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
int c;
|
int c;
|
||||||
extern int optopt;
|
extern int optopt;
|
||||||
@ -130,13 +130,14 @@ int main(int argc, char *argv[]) {
|
|||||||
char *digest=NULL;
|
char *digest=NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "hiABcxdtUvVe:E:f:Fl:L:m:n:N:s:D:O:P:")) != -1) {
|
while ((c = getopt(argc, argv, "hiABcxdtUvVe:E:f:Fl:L:m:n:N:s:D:O:pP:")) != -1) {
|
||||||
switch(c) {
|
switch(c) {
|
||||||
case 'h': usage(); break;
|
case 'h': usage(); break;
|
||||||
case 'A': qType = qtArchive; break;
|
case 'A': qType = qtArchive; break;
|
||||||
case 'B': qType = qtBackup; break;
|
case 'B': qType = qtBackup; break;
|
||||||
|
|
||||||
case 'i': if (action != 0) usage_action(); action = ACTION_INFO; break;
|
case 'i': if (action != 0) usage_action(); action = ACTION_INFO; break;
|
||||||
|
case 'p': if (action != 0) usage_action(); action = ACTION_PASSWORD; break;
|
||||||
case 'c': if (action != 0) usage_action(); action = ACTION_CREATE; break;
|
case 'c': if (action != 0) usage_action(); action = ACTION_CREATE; break;
|
||||||
case 'x': if (action != 0) usage_action(); action = ACTION_EXTRACT; break;
|
case 'x': if (action != 0) usage_action(); action = ACTION_EXTRACT; break;
|
||||||
case 'd': if (action != 0) usage_action(); action = ACTION_DELETE; break;
|
case 'd': if (action != 0) usage_action(); action = ACTION_DELETE; break;
|
||||||
@ -174,7 +175,18 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
// Arguement Validation
|
// Arguement Validation
|
||||||
if (action == 0) {
|
if (action == 0) {
|
||||||
debugLog(0,__func__,"ERROR: Must give one of -i, -c, -x, -d, -t",1);
|
usage_action();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (action == ACTION_PASSWORD) {
|
||||||
|
rc = tsm_setpassword(options);
|
||||||
|
|
||||||
|
if (! rc)
|
||||||
|
debugLog(0,__func__,"ERROR: Operation Failed",3);
|
||||||
|
else
|
||||||
|
debugLog(1,__func__,"Operation Success",0);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action != ACTION_LIST && friendly) {
|
if (action != ACTION_LIST && friendly) {
|
||||||
@ -222,7 +234,7 @@ int main(int argc, char *argv[]) {
|
|||||||
// OK, we are ready to talk to TSM
|
// OK, we are ready to talk to TSM
|
||||||
debugLog(1,__func__,"Create TSM session",0);
|
debugLog(1,__func__,"Create TSM session",0);
|
||||||
|
|
||||||
dsmHandle = tsm_initsess(options);
|
dsmHandle = tsm_initsess(options,NULL);
|
||||||
if (! dsmHandle)
|
if (! dsmHandle)
|
||||||
debugLog(0,__func__,"ERROR: Unable to create TSM session?",2);
|
debugLog(0,__func__,"ERROR: Unable to create TSM session?",2);
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#define _TSMPIPE_VERSION "1.6.4"
|
#define _TSMPIPE_VERSION "1.6.5"
|
||||||
|
#define INPUTLEN 1025
|
||||||
|
|
||||||
#define ACTION_INFO 1
|
#define ACTION_INFO 1
|
||||||
#define ACTION_CREATE 2
|
#define ACTION_CREATE 2
|
||||||
@ -7,6 +8,7 @@
|
|||||||
#define ACTION_LIST 5
|
#define ACTION_LIST 5
|
||||||
#define ACTION_UPDATE 6
|
#define ACTION_UPDATE 6
|
||||||
#define ACTION_CREATE_UPDATE 7
|
#define ACTION_CREATE_UPDATE 7
|
||||||
|
#define ACTION_PASSWORD 8
|
||||||
#define DSM_COMM_TCPIP6 6 // There is no DSM_COMM_ const for TCPIPv6
|
#define DSM_COMM_TCPIP6 6 // There is no DSM_COMM_ const for TCPIPv6
|
||||||
|
|
||||||
// If you want to use MD5/SHA1 calculations as the data goes in here, ensure this is defined.
|
// If you want to use MD5/SHA1 calculations as the data goes in here, ensure this is defined.
|
||||||
@ -26,7 +28,7 @@ extern void debugLog (int level, const char *func, char *message, int die);
|
|||||||
extern dsmDate dsmStrToDate(char *s);
|
extern dsmDate dsmStrToDate(char *s);
|
||||||
extern dsmObjName dsmNameToObjname(char *fsname, char *filename);
|
extern dsmObjName dsmNameToObjname(char *fsname, char *filename);
|
||||||
extern dsInt16_t tsm_queryfile(dsUint32_t sesshandle, dsmQueryType qType, tsm_query_callback usercb, void *userdata, qryArchiveData qaData, qryBackupData qbData, dsBool_t friendly);
|
extern dsInt16_t tsm_queryfile(dsUint32_t sesshandle, dsmQueryType qType, tsm_query_callback usercb, void *userdata, qryArchiveData qaData, qryBackupData qbData, dsBool_t friendly);
|
||||||
extern dsUint32_t tsm_initsess(char *options);
|
extern dsUint32_t tsm_initsess(char *options, char *password);
|
||||||
extern dsBool_t compressEnabled;
|
extern dsBool_t compressEnabled;
|
||||||
|
|
||||||
extern int tsm_deletefile (dsUint32_t dsmHandle, dsmQueryType qType, qryArchiveData qaData, qryBackupData qbData);
|
extern int tsm_deletefile (dsUint32_t dsmHandle, dsmQueryType qType, qryArchiveData qaData, qryBackupData qbData);
|
||||||
@ -37,6 +39,7 @@ extern double tsm_sendfile (dsUint32_t dsmHandle, char *fsname, char *filename
|
|||||||
#else
|
#else
|
||||||
extern double tsm_sendfile (dsUint32_t dsmHandle, char *fsname, char *filename, long long length, char *description, dsmSendType sendtype, dsBool_t startstop, dsBoot_t summary);
|
extern double tsm_sendfile (dsUint32_t dsmHandle, char *fsname, char *filename, long long length, char *description, dsmSendType sendtype, dsBool_t startstop, dsBoot_t summary);
|
||||||
#endif
|
#endif
|
||||||
|
extern int tsm_setpassword(char *options);
|
||||||
extern int tsm_sessioninfo(dsUint32_t dsmHandle);
|
extern int tsm_sessioninfo(dsUint32_t dsmHandle);
|
||||||
extern int tsm_updatefs(dsUint32_t dsmHandle, char *fsname, long long size);
|
extern int tsm_updatefs(dsUint32_t dsmHandle, char *fsname, long long size);
|
||||||
extern int tsm_datefs(dsUint32_t dsmHandle, char *fsname, int startstop);
|
extern int tsm_datefs(dsUint32_t dsmHandle, char *fsname, int startstop);
|
||||||
|
Reference in New Issue
Block a user