;************************************************************************** ; ; NETPAS - Utility to set your password at any or all nodes. ; ; Syntax: ; ; $ NETPAS [node1 node2..] [/ALL/SAMEPASSWORD] ; $_Old password at node: ; $_Verification: ; $_New password at node: ; $_Verification: ; ; Switches: /ALL - Define logical names for all nodes ; /SAMEPASSWORD - Use same password at all nodes ; ;*************************************************************************** ;***************************************************************************** ; ; CONSTANT DECLARATIONS ; ;***************************************************************************** $TPADEF ; PARAMETER BLOCK OFFSETS FOR LIB$TPARSE $JPIDEF ; DEFINE $GETJPI ITEM CODES MAXNODES == 20 MAXCHARS == 20 COMLEN=160 ; LENGTH OF FOREIGN COMMAND LINE PASBUFMAX=80 ; LENGTH OF PASSWORD INPUT BUFFER VERBUFMAX=80 ; LENGTH OF VERIFICATION INPUT BUFFER SENDBUFMAX=256 ; LENGTH OF SEND BUFFER OFFSET=20 ; OFFSET INTO LONG PASSWORD PROMPT FOR NODE ;*************************************************************************** ; ; DATA DECLARATIONS ; ;*************************************************************************** PARSE_ARGS: ; PARAMETER BLOCK FOR LIB$TPARSE .LONG TPA$K_COUNT0 ; LENGTH IN LONGWORDS OF BLOCK .LONG TPA$M_ABBREV ; ALLOW ABBREVIATION .BLKB TPA$K_LENGTH0-8 COMDESC: .WORD COMLEN,0 ; DESCRIPTOR FOR COMMAND LINE .LONG COMLINE COMLINE: .BLKB COMLEN ; COMMAND LINE BUFFER NODES: .ASCID /$_Nodes: / ; DESCRIPTOR FOR NODES PROMPT PARSERR: .ASCID /Syntax error or node not currently reachable./ ERRORMSG: .ASCID /Not enough input/ SHORTPROMPT: .ASCID <^O15><^O12>/$_Old password: / ; PROMPT FOR PASSWORD AT ALL NODES LONGPROMPT: .ASCID <^O15><^O12>/$_Old password at : / ; PROMPT FOR PASSWORD ; AT A SINGLE NODE VERPROMPT: .ASCID <^O15><^O12>/$_Verification: / ; VERIFICATION PROMPT NODENAMES:: .BLKB MAXNODES*MAXCHARS ; TABLE OF NODE NAMES ; BUILT BY FINDNODES OLDBUFFER: .BLKB PASBUFMAX ; PASSWORD INPUT BUFFER NEWBUFFER: .BLKB PASBUFMAX ; NEW PASSWORD INPUT BUFFER VERBUFFER: .BLKB VERBUFMAX ; VERIFICATION INPUT BUFFER SENDBUFFER: .BLKB SENDBUFMAX ; BUFFER TO SEND PASSWORDS TO REMOTE TASK OLDPASDESC: .LONG 0 ; DESCRIPTOR FOR PASSWORD .LONG OLDBUFFER NEWPASDESC: .LONG 0 ; DESCRIPTOR FOR NEW PASSWORD .LONG NEWBUFFER EQUIVNAME: .LONG 0 ; DESCRIPTOR FOR EQUIVALENCE NAME .LONG EQUIVBUFFER EQUIVBUFFER: .BLKB 63 ; EQUIV NAME BUFFER LOGNAME: .WORD 4,0 ; DESCRIPTOR FOR LOGICAL NAME .LONG 0 NODEMASK:: .LONG 0 COPYSTR: .ASCID /$ COPY SYS$SYSTEM:XXXSETPAS.COM !AC/ COPYBUFFER: .BLKB 80 ; SECOND PART FILLED IN BY PROGRAM COPY: .LONG 80 .LONG COPYBUFFER COPYNODE: .BLKB 80 STOP: .ASCID /$ STOP 'F$PROCESS()'/ SUCCESSTR: .ASCID /Password changed at !AC/ NODEBUF: .BLKB 21 SUCCESS: .LONG 80 .LONG MESSAGEBUF ERRORSTR: .ASCID /Error at !AC/ ERROR: .LONG 80 .LONG MESSAGEBUF MESSAGEBUF: .BLKB 80 ; ITEM LIST FOR $GETJPI ITEMS: .WORD 12 ; SIZE OF USERNAME BUFFER .WORD JPI$_USERNAME ; USERNAME ITEM CODE IUSERBUF: .LONG 0 ; ADDR OF USERNAME BUFFER .LONG USERSIZE ; ADDR TO RETURN USERNAME LENGTH .LONG 0 ; END OF LIST USERSIZE: .LONG 0 ; LOCAL TERMINAL DESCRIPTOR AND CHANNEL NUMBER STORAGE TT_DESC: .ASCID /SYS$INPUT/ ; LOGICAL NAME OF TERMINAL DEV_DESC: PHYS_NAME_LEN: .LONG 63 PHYS_NAME_ADR: .LONG PHYS_NAME PHYS_NAME: .BLKB 63 TT_CHAN: .BLKW 1 TTIOSB: .BLKL 2 ; IO STATUS BLOCK ; REMOTE LOGICAL LINK DESCRIPTOR AND CHANNEL NUMBER STORAGE NET_CHAN: .BLKW 1 NET_IOSB: .BLKQ 1 TARGET: .ASCID /"TASK=XXXSETPAS"/ ;************************************************************************* ; ; READ MACRO - READ FROM INPUT CHANNEL WITH NO ECHO ; ; ; SIDE AFFECTS - USES R0,R1,R7,R11,RX ; ;********************************************************************** .MACRO READ_NOECHO BUFFER,BUFLEN,RX MOVZWL (RX),R11 ; LENGTH OF STRING MOVL 4(RX),R7 ; ADDR OF STRING $QIOW_S CHAN=TT_CHAN,- FUNC=#IO$_READPROMPT!IO$M_NOECHO,- IOSB=TTIOSB,- P1=BUFFER,- P2=#BUFLEN,- P5=R7,- P6=R11 .ENDM READ_NOECHO ;**************************************************************************** ; ; NETPAS - MAIN PROGRAM ; ;**************************************************************************** .ENTRY NETPAS,^M<> ; TRANSLATE LOGICAL NAME FOR SYS$INPUT AND ASSIGN A CHANNEL $TRNLOG_S- ; GET TERMINAL'S PHYSICAL DEVICE NAME LOGNAM=TT_DESC,- RSLLEN=PHYS_NAME_LEN,- RSLBUF=DEV_DESC CMPB PHYS_NAME,#^X1B ; DOES NAME START WITH ESCAPE? BNEQ 1$ ; NOPE SUBL #4,PHYS_NAME_LEN ; YUP, STRIP 1ST 4 CHARS ADDL #4,PHYS_NAME_ADR 1$: $ASSIGN_S - ; OPEN THE CHANNEL DEVNAM=DEV_DESC,- CHAN=TT_CHAN BLBS R0,5$ ; BRANCH IF ERROR RET ; CALL FINDNODES TO BUILD A TABLE OF ALL NODES CURRENTLY REACHABLE ; USED AS A KEYWORD TABLE BY PARSING ACTION ROUTINE 5$: CALLS #0,FINDNODES BLBS R0,10$ RET ; CALL LIB$GET_FOREIGN TO GET REST OF COMMAND LINE AFTER "NETPAS" 10$: PUSHAW PARSE_ARGS+TPA$L_STRINGCNT ; GET BACK NUMBER OF CHARS PUSHL #0 PUSHAL COMDESC ; STRING DESC TO RECEIVE COMMAND CALLS #3,G^LIB$GET_FOREIGN BLBS R0,15$ RET ; IF WE DIDN'T FIND ANYTHING, GET IT OURSELVES 15$: MOVAL COMLINE,PARSE_ARGS+TPA$L_STRINGPTR TSTW PARSE_ARGS+TPA$L_STRINGCNT BNEQ 25$ MOVZWL NODES,R1 $QIOW_S CHAN=TT_CHAN,- FUNC=#IO$_READPROMPT,- IOSB=TTIOSB,- P1=COMLINE,- P2=#COMLEN,- P5=NODES+4,- P6=R1 BLBS R0,20$ RET 20$: MOVZWL TTIOSB+2,PARSE_ARGS+TPA$L_STRINGCNT BNEQ 23$ PUSHAL ERRORMSG CALLS #1,G^LIB$PUT_OUTPUT RET 23$: MOVZWL TTIOSB+2,COMDESC PUSHAL COMDESC PUSHAL PARSE_ARGS+TPA$L_STRINGCNT CALLS #2,G^STR$UPCASE ; CALL LIB$TPARSE TO PARSE COMMAND LINE 25$: PUSHAL PARSE_KEY PUSHAL PARSE_STATE PUSHAL PARSE_ARGS CALLS #3,G^LIB$TPARSE BLBS R0,30$ PUSHAL PARSERR CALLS #1,G^LIB$PUT_OUTPUT RET 30$: BBC #31,NODEMASK,100$ ; BRANCH IF WE MUST GET A DIFFERENT ; PASSWORD FOR EACH NODE ; "/SAMEPASSWORD" PROCESSING ; USE SAME PASSWORD FOR ALL SPECIFIED NODES CALLS #0,GETPASSWORD ; READ AND VERIFY PASSWORDS BLBC R0,99$ ; EXIT IF ERROR ; DO THE ASSIGNMENT FOR ALL SPECIFIED NODES IN NODEMASK CLRL R9 ; R9 = CURRENT BIT IN NODE MASK 50$: BBC R9,NODEMASK,60$ ; KEEP GOING IF NODE NOT INDICATED IN BIT MASK CALLS #0,ASSIGNPAS ; SET THE PASSWORD AT REQUESTED NODES 60$: INCL R9 CMPL #MAXNODES,R9 ; DONE? BNEQ 50$ ; BRANCH IF NOPE JMP 98$ ; GET A DIFFERENT PASSWORD AND DO ASSIGNMENT FOR EACH NODE SPECIFIED ; IN THE MASK 100$: CLRL R9 ; R9 = CURRENT BIT IN NODE MASK MOVAL NODENAMES+1,R8 ; R8 = ADDRRESS OF CURRENT NODE STRING 110$: BBC R9,NODEMASK,120$ ; SKIP THIS NODE IF BIT NOT SET ; BUILD THE PROMPT STRING MOVAL LONGPROMPT+8+OFFSET,R7 MOVC3 #6,(R8),(R7) CALLS #0,GETPASSWORD ; READ AND VERIFY PASSWORDS BLBC R0,99$ CALLS #0,ASSIGNPAS ; SET THE PASSWORD AT REQUESTED NODE 120$: INCL R9 ADDL2 #MAXCHARS,R8 ; POINT TO NEXT NODE NAME CMPL #MAXNODES,R9 ; DONE? BNEQ 110$ ; BRANCH IF NO 98$: MOVL #1,R0 ; SUCCESSFUL COMPLETION 99$: RET ;***************************************************************************** ; ; GETPASSWORD - READ AND VERIFY OLD AND NEW PASSWORDS ; ; INPUTS: NODEMASK = BIT MASK OF ALL NODES FOR WHICH ; ASSIGNMENTS MUST BE MADE ; OUTPUTS: ; OLDPASDESC = OLD PASSWORD DESCRIPTOR ; NEWPASDESC = NEW PASSWORD DESCRIPTOR ; ;**************************************************************************** .ENTRY GETPASSWORD,^M 10$: MOVL #1,R2 MOVAL SHORTPROMPT,R10 BBS #31,NODEMASK,20$ ; IF SAME PASSWORD FOR ALL NODES ; USE SHORT PROMPT MOVAL LONGPROMPT,R10 ; ELSE PUT NODE IN THE PROMPT 20$: MOVL #^A/Old /,@B^4(R10)[R2] READ_NOECHO OLDBUFFER,PASBUFMAX,R10 ; READ PASSWORD BLBS R0,30$ RET 30$: MOVZWL TTIOSB+2,OLDPASDESC ; SAVE LENGTH MOVAL VERPROMPT,R10 READ_NOECHO VERBUFFER,VERBUFMAX,R10 ; READ VERIFICATION BLBS R0,40$ RET 40$: MOVZWL TTIOSB+2,R0 CMPC5 OLDPASDESC,OLDBUFFER,#^A/ /,R0,VERBUFFER ; COMPARE THEM BEQL 25$ ; MATCH, CONTINUE JMP 10$ 25$: MOVL #1,R2 MOVAL SHORTPROMPT,R10 BBS #31,NODEMASK,75$ ; IF SAME PASSWORD FOR ALL NODES ; USE SHORT PROMPT MOVAL LONGPROMPT,R10 ; ELSE PUT NODE IN THE PROMPT 75$: MOVL #^A/New /,@B^4(R10)[R2] READ_NOECHO NEWBUFFER,PASBUFMAX,R10 ; READ PASSWORD BLBS R0,50$ RET 50$: MOVZWL TTIOSB+2,NEWPASDESC ; SAVE LENGTH MOVAL VERPROMPT,R10 READ_NOECHO VERBUFFER,VERBUFMAX,R10 ; READ VERIFICATION BLBS R0,60$ RET 60$: MOVZWL TTIOSB+2,R0 CMPC5 NEWPASDESC,NEWBUFFER,#^A/ /,R0,VERBUFFER ; COMPARE THEM BEQL 26$ ; MATCH, EXIT JMP 25$ 26$: MOVL #1,R0 ; SUCCESSFUL COMPLETION RET ;***************************************************************************** ; ; ASSIGNPAS - SET THE PASSWORD ; ; INPUTS: R9 = NODE INDEX ; OLDPASDESC = DESCRIPTOR FOR OLD PASSWORD STRING ; NEWPASDESC = DESCRIPTOR FOR NEW PASSWORD STRING ; ; OUTPUTS: IF THE NODE IS THE LOCAL NODE THEN ; SETPAS IS CALLED TO SET THE PASSWORD ; ELSE ; A LOGICAL LINK IS MADE TO SETPAS AT THE REMOTE ; NODE WHICH SETS THE PASSWORD ; ;***************************************************************************** .ENTRY ASSIGNPAS,^M<> ; FIND NODE NAME MULL3 #MAXCHARS,R9,R6 ; GET INDEX INTO NODENAME TABLE ADDL2 #NODENAMES,R6 PUSHL R7 MOVZBL (R6)+,R7 ; GET LENGTH OF NODENAME MOVAL NODEBUF,R3 ; COPY NODE NAME TO SUCCESS MESSAGE MOVB R7,(R3)+ MOVC3 R7,(R6),(R3) MOVAL EQUIVBUFFER,R3 ; COPY NODE NAME TO EQUIV BUFFER MOVC3 R7,(R6),(R3) POPL R7 CMPB #^A/M/,(R6) ; IS NODE = MORDOR? BEQL 5$ ; BRANCH IF YES INCL R6 ; SKIP PAST "SI" IN NODE NAME INCL R6 ; REMAINDER IS LOGICAL NAME 5$: MOVL R6,LOGNAME+4 ; MOVE ADDR OF LOG NAME TO DESCRIPTOR ; BUILD REMAINDER OF EQUIVALENCE NAME MOVB #^A/"/,(R3)+ ; INSERT " ; CALL $GETJPI SYSTEM SERVICE TO GET USERNAME OF CURRENT PROCESS MOVL R3,IUSERBUF $GETJPI_S ITMLST=ITEMS BLBS R0,7$ RET 7$: ADDL2 USERSIZE,R3 ; MOVE PAST USERNAME IN BUFFER MOVB #^A/ /,(R3)+ ; INSERT A SPACE MOVZWL OLDPASDESC,R1 ; LENGTH OF STRING MOVL OLDPASDESC+4,R2 ; ADDRESS OF STRING MOVC3 R1,(R2),(R3) ; MOVE PASSWORD TO EQUIVBUFFER MOVL #^A/"::*/,(R3)+ ; INSERT "::* ; COPY THE STRING BUILT TO COPY COMMAND ; IT'S THE FILE SPEC FOR THE REMOTE COMMAND FILE TO START UP SUBL3 #EQUIVBUFFER,R3,R1 ; GET LENGTH OF STRING PUSHL R3 MOVAL EQUIVBUFFER,R3 MOVAL COPYNODE,R2 MOVB R1,(R2)+ ; MAKE A COUNTED ASCII STRING FOR FAO MOVC3 R1,(R3),(R2) $FAO_S CTRSTR=COPYSTR,- OUTLEN=COPY,- OUTBUF=COPY,- P1=#COPYNODE POPL R3 DECL R3 ; BUILD TARGET TASK NAME INTO EQUIV STRING MOVZWL TARGET,R1 ; GET LENGTH OF TARGET TASK STRING MOVL TARGET+4,R2 ; GET ADDR OF STRING MOVC3 R1,(R2),(R3) SUBL2 #EQUIVBUFFER,R3 ; COMPUTE LENGTH OF STRING DBG1: MOVL R3,EQUIVNAME ; COPY COMMAND FILE TO EXECUTE AT REMOTE NODE TO REMOTE NODE PUSHAL STOP PUSHAL COPY CALLS #2,G^LIB$EXECUTE_CLI BSBW CHECK ; ASSIGN A LOGICAL LINK TO THE TARGET TASK $ASSIGN_S DEVNAM=EQUIVNAME,CHAN=NET_CHAN BSBW CHECK ; COPY THE OLD AND NEW PASSWORDS INTO THE SEND BUFFER 10$: MOVAL SENDBUFFER,R3 MOVB OLDPASDESC,(R3)+ ; GET LENGTH OF OLD PASSWORD MOVZWL OLDPASDESC,R1 ; LENGTH OF STRING MOVL OLDPASDESC+4,R2 ; ADDRESS OF STRING MOVC3 R1,(R2),(R3) ; MOVE PASSWORD TO EQUIVBUFFER MOVB NEWPASDESC,(R3)+ ; GET LENGTH OF NEW PASSWORD MOVZWL NEWPASDESC,R1 ; LENGTH OF STRING MOVL NEWPASDESC+4,R2 ; ADDRESS OF STRING MOVC3 R1,(R2),(R3) ; MOVE PASSWORD TO EQUIVBUFFER DBGLBL: ; SEND IT TO REMOTE TASK $QIOW_S CHAN=NET_CHAN,- FUNC=#IO$_WRITEVBLK,- IOSB=NET_IOSB,- P1=SENDBUFFER,- P2=#SENDBUFMAX BSBW CHECK ; DISCONNECT LOGICAL LINK 30$: $DASSGN_S CHAN=NET_CHAN BSBW CHECK ; OUTPUT SUCCESS MESSAGE $FAO_S CTRSTR=SUCCESSTR,- OUTLEN=SUCCESS,- OUTBUF=SUCCESS,- P1=#NODEBUF PUSHAL SUCCESS DBG2: CALLS #1,G^LIB$PUT_OUTPUT ASNRET: RET ; ASSIGNPAS ERROR PROCESSING CHECK: BLBS R0,10$ ; BRANCH IF NO ERROR $FAO_S CTRSTR=ERRORSTR,- OUTLEN=ERROR,- OUTBUF=ERROR,- P1=#NODEBUF PUSHAL ERROR CALLS #1,G^LIB$PUT_OUTPUT RET 10$: RSB .END NETPAS