$ SAVERIFY = 'F$VERIFY(0)' $!----------------------------------------------------------------------------+ $! TELL.COM - Tell a remote node to execute one or more commands | $!----------------------------------------------------------------------------+ $! $! P1 = DECnet node name or address $! P2 - P8 = Optional single command to execute $! If P2 - P8 are ommitted, then you are prompted for commands. $! Just type "EXIT" or Ctrl/Z when you are finished. $! $! NOTE: This is based on and compatible with the earlier versions of TELL $! $ SET NOON $ IF F$MODE() .EQS. "NETWORK" THEN GOTO REMOTE_SIDE $ ON CONTROL_Y THEN GOTO FINISHED $ IF P1 .EQS. "" THEN INQUIRE P1 "Node (Name or Address)" $ IF P1 .EQS. "" THEN GOTO FINISHED $ P1 = P1 - "::" ! Strip off "::" if present $ IF F$LOCATE(".",P1) .NE. F$LENGTH(P1) THEN - P1 = 'F$ELEMENT(0,".",P1)'*1024 + 'F$ELEMENT(1,".",P1)' $ USER = F$EDIT(F$GETJPI("","USERNAME"),"TRIM") $ PASS = "" $ PATH = P1 $ NODE = F$EXTRACT(0,F$LOCATE("""",PATH),PATH) $ MYSELF = F$ELEMENT(0,";",F$ENVIRONMENT("PROCEDURE")) $ IF "''TELL'" .EQS. "" THEN TELL == "@''MYSELF'" $ IF PATH .NES. NODE THEN GOTO LOCAL_SIDE ! Access information passed $ IF F$TYPE(TELL_'NODE'_ACCINFO) .NES. "" ! Saved access information $ THEN STR = TELL_'NODE'_ACCINFO $ GOSUB CODER ! Decode the saved information $ USER = F$ELEMENT(0," ",NEWSTR) $ PASS = F$ELEMENT(1," ",NEWSTR) $ PATH = NODE + """" + USER + " " + PASS + """" $ ENDIF $ TELL_COPIED = "FALSE" $ WRITE SYS$OUTPUT "Ctrl/Z now if you are using proxy or default logins." $ READ/PROMPT="Remote username [''USER']: "/END=LOCAL_SIDE - SYS$COMMAND TELL_USER $ IF TELL_USER .EQS. "" THEN TELL_USER = USER $ SET NOCONTROL=Y $ SET TERMINAL/NOECHO $ IF PASS .NES. "" $ THEN PREV = "[same as before]" $ ELSE PREV = "[none]" $ ENDIF $ READ/PROMPT="Remote password ''PREV': " SYS$COMMAND TELL_PASWRD $ SET TERMINAL/ECHO $ SET CONTROL=Y $ WRITE SYS$OUTPUT "" $ IF TELL_PASWRD .EQS. "" THEN TELL_PASWRD = PASS $ IF TELL_PASWRD .NES. "" THEN TELL_PASWRD = " " + TELL_PASWRD $ STR = TELL_USER + TELL_PASWRD $ STR = F$EDIT(STR,"UPCASE") $ PATH = NODE + """" + STR + """" $ GOSUB CODER $ TELL_'NODE'_ACCINFO == NEWSTR $! $ LOCAL_SIDE: $ CLOSE/NOLOG TELLSVR $ OPEN/READ/WRITE/ERROR=OPEN_FAILURE TELLSVR 'PATH'::"0=TELL" $! $ GET_OUTPUT: $ READ/ERR=FINISHED TELLSVR PACKET $ IF PACKET .EQS. "ABOUT_TO_ISSUE_READ" THEN GOTO SEND_COMMAND $ WRITE SYS$OUTPUT PACKET $ GOTO GET_OUTPUT $! $ SEND_COMMAND: $ IF P2 .NES. "" THEN GOTO SINGLE_COMMAND $ READ/PROMPT="TELL-''NODE'> "/END=FINISHED SYS$COMMAND DCLCMD $ IF F$EDIT(DCLCMD,"UPCASE") .EQS. "EXIT" THEN GOTO FINISHED $ WRITE TELLSVR DCLCMD $ GOTO GET_OUTPUT $! $ SINGLE_COMMAND: $ DCLCMD = P2+" "+P3+" "+P4+" "+P5+" "+P6+" "+P7+" "+P8 $ DCLCMD = F$EDIT(DCLCMD,"COMPRESS,TRIM") $ WRITE TELLSVR DCLCMD $! $ SINGLE_OUTPUT: $ READ TELLSVR PACKET $ IF PACKET .EQS. "ABOUT_TO_ISSUE_READ" THEN GOTO FINISHED $ WRITE SYS$OUTPUT PACKET $ GOTO SINGLE_OUTPUT $! $ OPEN_FAILURE: $ ON WARNING THEN GOTO FINISHED $ IF TELL_COPIED THEN GOTO FINISHED $ COPY/LOG 'MYSELF' 'PATH'::TELL.COM $ SET NOON $ TELL_COPIED = "TRUE" $ WAIT 00:00:01 $ GOTO LOCAL_SIDE $! $ REMOTE_SIDE: $ OPEN/READ/WRITE TELLSVR SYS$NET $ DEFINE/NOLOG SYS$OUTPUT TELLSVR: $ DEFINE/NOLOG SYS$ERROR TELLSVR: $! $ SERVER_LOOP: $ WRITE TELLSVR "ABOUT_TO_ISSUE_READ" $ READ/END=FINISHED/ERROR=FINISHED TELLSVR DCLCMD $ 'DCLCMD' $ GOTO SERVER_LOOP $! $ CODER: ! SUBROUTINE Well, it's a little better than plain text $ STRLEN = F$LENGTH(STR) $ STRCHR = 0 $ NEWSTR = "" $ IF STRLEN .EQ. 0 THEN RETURN $ CODER_LOOP: $ NCHAR[0,8] = 155 - F$CVSI(0,8,F$EXTRACT(STRCHR,1,STR)) $ NEWSTR = NEWSTR + NCHAR $ STRCHR = STRCHR + 1 $ IF STRCHR .LT. STRLEN THEN GOTO CODER_LOOP $ RETURN $! $ FINISHED: $ CLOSE/NOLOG TELLSVR $ EXIT 1 + 0*F$VERIFY(SAVERIFY)