$~LT020.BLT020.B%BACKUP/LOG/VERIFY *.* [-]LT020.B/SAVE DENTON_D 0-,>IV5.5 _BPOUSA::  _HSC005$DUA81: V5.5 ~  /*[USERS.DENTON_D.DECUS.LT.B]ACL_ALL_QUEUES.COM;6+,./0 4s-;^0123KPWO5l6b67ˠIH89@dHG0HJ$ save_verify = f$verify(0)$!++$! --- ACL_ALL_QUEUES.COM$!$! Facility: LIAISON_TOOLS$! $! Abstract:O$! Set the access controls to allow holders of the LIAISON TOOLS queue controlN$! rights to have operator-like powers over queues that are not batch queues.P$! Also allow world read access to the device control libraries in SYS$LIBRARY.$!$! Parameters: $! None.$!$! Modification History:'$! 27-Nov-1991 DLD Original version.$!--$ $ set noon$ say = "write sys$output"b$ if (f$identifier("que_mgr","name_to_number") .eq. 0) then $ mcr authorize add/identifier que_mgr'$ isbatch= f$getqui("cancel_operation")B$ isbatch = f$getqui("display_queue","queue_batch","*","wildcard")$ _loop:$ if isbatch .nes. ""$ then$ if .not. isbatch $ thenK$ quename = f$getqui("display_queue","queue_name","*","freeze_context")V$ library = f$getqui("display_queue","library_specification","*","freeze_context")3$ library = f$parse("sys$library:.tlb",library)s$ if (f$identifier("''quename'_mgr","name_to_number") .eq. 0) then $ mcr authorize add/identifier 'quename'_mgrL$ set acl /acl=((ident=que_mgr,acc=exe),(ident='quename'_mgr,acc=exe)) -& /object_type=queue 'quename'`$ if (f$parse(library,,,"name","syntax_only") .nes. "") then $ set file/prot=(w:r) 'library' $ endif:$ isbatch = f$getqui("display_queue","queue_batch","*",)$ goto _loop$ endif$ junk = f$verify(save_verify)$ exit,*[USERS.DENTON_D.DECUS.LT.B]AUTHORIZE.COM;149+,I.</0 4<;f-;^0123KPWO=56 H7lIH89@dHG0HJ$ save_verify = 'f$verify(0)'$ if save_verify $ thenZ$ write sys$output f$fao("!/Executing !AS version 2.0-13.!/",f$environment("procedure"))$ else2$ if (f$type(verify) .eqs. "") then $ verify = 0k$ if verify then $ write sys$output f$fao("!/Executing !AS version 2.0-13.!/",f$environment("procedure"))$ endif$!++$! --- LT_SYSTEM:AUTHORIZE.COM$!$! Facility: LIAISON_TOOLS$! $! Abstract:N$! Allow access to the AUTHORIZE utility for accounts with appropriate rights$! IDs.$!$! Parameters:$!$! P1 - ACTION (required)$!$! Modification History$! N$! 07-Aug-1992 DLD allow normal specification of mail forward address when;$! it contains quotation marks (2.0-13)W$! 11-May-1992 DLD optionally kill active processes when acct is DISUSERed (2.0-12)S$! 16-Mar-1992 DLD /user qualifier only good for "set forward" in MAIL (2.0-11)M$! 20-Feb-1992 DLD Mod FWD_MAIL to use "set/user=" MAIL command. (2.0-10)R$! 12-Feb-1992 DLD Added $STATUS checking after each AUTHORIZE in add. (2.0-9)P$! 16-Jan-1992 DLD Add FWD_MAIL action and set pwdlifetime = 90 days (2.0-8)5$! 03-Jan-1992 DLD Pass P3 to LT_LIST_UAF (2.0-7)$! 30-Dec-1991 DLD (2.0-6)L$! 20-Dec-1991 DLD Added use of /FLAG qualifer in MODIFY action. (2.0-5)Q$! 12-Dec-1991 DLD Added use of LT_LIST_UAF.EXE to do wildcard SYSUAF (2.0-4)3$! 10-Dec-1991 DLD Added MODIFY action. (2.0-3)P$! 09-Dec-1991 DLD Comment out owner name when account is DISMAILed. (2.0-2)J$! 20-Nov-1991 DLD Changed all files created SYS$SCRATCH to SYS$LOGIN,G$! support comments in data files, user directories:$! created with (G:RE,W:E) protection.M$! 19-Nov-1991 DLD Changed VALID_GROUP_PROMPT to shorten, renamed defaultN$! directory in RENAME command, strip following qualifiers2$! off date in REAUTH command.K$! 12-Nov-1991 DLD Made IO filenames consistent, added date and time of@$! account creation to LT_NEWUSERS.DAT file.($! 02-Oct-1991 DLD Original version.$!-- $$!+H$! Establish ^Y and error handlers, record current state of some processA$! characteristics, set needed privileges, define needed symbols.$!- $ set noon&$ save_privs = f$getjpi("","procpriv"),$ save_scope = f$environment("symbol_scope")-$ set process/priv=(oper,sysprv,cmkrnl,world)%$ set symbol/scope=(noglobal,nolocal)$$ on control_y then goto _user_abort$$ file_open = "NO" $ status = 1$ say = "write sys$output"$ ltoper = "oper11"%$ authorize = "$sys$system:authorize"$$$!++K$! Validate parameters. A ^Z or EXIT response at any prompt will abort the $! procedure.$!--$$!+A$! P1 is the action to take. It must have at least 3 characters.$!-$ if ((p1 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Action (ADD,DELETE,ENABLE,DISABLE,MODIFY,REAUTH,RENAME,SHOW,FWD_MAIL): "/end=_user_abort sys$command p17$ p1 = f$extract(0,3,f$edit(p1,"UPCASE,TRIM,COLLAPSE"))+$ if p1 .eqs. "EXI" then $ goto _user_abort1$ if p1 .eqs. "" then $ goto _invalid_param_abort$$!+0$! P2 is the username of the account to process.$!-x$ if ((p2 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Username: "/end=_user_abort sys$command p29$ p2 = f$edit(f$element(0,"/",p2),"UPCASE,TRIM,COLLAPSE"),$ if p2 .eqs. "EXIT" then $ goto _user_abort1$ if p2 .eqs. "" then $ goto _missing_param_abort$$!+L$! Unless the action is ADD the username given must belong to a group listedM$! in the LT_GROUP_INFO.DAT file and be greater than MAXSYSGROUP and not 300.$!- $ group = 0$ if (p1 .nes. "ADD")$ then8$ uic = f$fao("!%U",f$identifier(p2,"NAME_TO_NUMBER"))$ if (uic .eqs. "[0,0]") $ then$ !+$$ ! This account does not exist.$ !-D$ say "%LIATOO-E-NOSUCHUSER, user account ''p2' does not exist."$ goto _exit_out $ endif<$ group = f$integer(f$element(1,"[",f$element(0,",",uic)))D$ if ((group .eqs. 300) .or. (group .le. f$getsyi("maxsysgroup"))) $ then$ !+>$ ! This is a system or tech account, do not allow access.$ !-P$ say "%LIATOO-E-NOPRIVGROUP, cannot process accounts in privileged groups."_$ request/to=('ltoper',security) "LIAISON(AUTH) - attempted access to priv'd account 'p2'."$ goto _exit_out $ endif$ endif$$!+H$! Extract the information out of the LT_DATA:LT_GROUP_INFO.DAT file for$! account group validation.$!-,$ open/read iofile LT_DATA:LT_GROUP_INFO.DAT$ file_open = "Y"$ valid_group_count = 0$ _auth_grp_loop:%$ read/end=_auth_grp_eof iofile inrecN$ if f$extract(0,2,inrec) .eqs. "/*" then $ goto _auth_grp_loop ! Comment line.$ file_group = f$integer(f$extract(0,4,inrec))9$ file_acct = f$edit(f$extract(5,4,inrec),"trim,upcase")L$ file_disk = f$edit(f$element(0,":",f$extract(10,13,inrec)),"trim,upcase")$!+8$! Get the first available member number for this group.$!-)$ uic_int = %o'file_group' * %o200000 + 1$ _first_avail_uic_loop:3$ tmp_name = f$identifier(uic_int,"number_to_name")$ if (tmp_name .nes. "")$ then$ uic_int = uic_int + 1$ goto _first_avail_uic_loop$ endif$!+B$! Add this group's information to the prompt for group selection.$!-+$ valid_group_count = valid_group_count + 1}$ valid_group'valid_group_count' = f$fao(" Group !UL (!AS) on !AS, next UIC is !%U.",file_group,file_acct,file_disk,uic_int)-$ if (f$type(file_list'file_group') .eqs. "")$ then$ !+J$ ! This group has not yet been encountered, create a symbol to hold theO$ ! list of disks that can be used as the SYS$LOGIN disk for accounts of this $ ! group.$ !--$ disk_list'file_group' = ","+file_disk+","%$ account'file_group' = file_acct$ else$ !+N$ ! At least one disk is already on the list, if this is a new disk then add$ ! it to the list.$ !-^$ if f$locate(",''file_disk',",disk_list'file_group') .nes. f$length(disk_list'file_group') $ then C$ disk_list'file_group' = disk_list'file_group'+"''file_disk'," $ endif$ endif$ goto _auth_grp_loop$ _auth_grp_eof:$ close iofile$ file_open = "NO"$ if (valid_group_count .eq. 0)$ thenO$ say "%LIATOO-F-NOGROUP, LT_DATA:LT_GROUP_INFO.DAT contains no valid groups"H$ say "-LIATOO-F-EDITFILE, edit file to allow user account processing"$ goto _exit_out$ endif$ $!+U$! If the action is not ADD and no group listed in the LT_GROUP_INFO.DAT file matchedN$! that of the user specified in P2 then the user is not in a group accessible$! via liaison tools.$!-A$ if ((p1 .nes. "ADD") .and. (f$type(disk_list'group') .eqs. ""))$ thenQ$ say "%LIATOO-F-UNAUTHGROUP, ''p2' is not in a LIAISON TOOL accessible group."t$ request/to=('ltoper',security) "LIAISON(AUTH) - attempted accessing user 'p2' from inaccessible group ''group'."$ goto _exit_out$ endif$$!+M$! Use the ACTION name to go to the appropriate label to continue processing.J$! An unsupported action will cause the invalid parameter error code to be $! executed.$!-9$ valid_actions = ",ADD,DEL,ENA,DIS,MOD,REA,REN,SHO,FWD,"E$ if (f$locate(",''p1',",valid_actions) .ne. f$length(valid_actions))$ then$ goto _'p1'_user$ else$ goto _invalid_param_abort$ endif$$!-- $$!+-$! Add a new user account to the SYSUAF file.$!- $ _add_user:$ !+Q$ ! Validate the parameter list, prompt for any missing parameters if possible.$ !-$ !+$$ ! P3 is the UIC for the account.$ !-<$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) $ then B$ say "The groups available to you for account additions are:" $ lcv = 1$ _prompt_for_UIC:%$ if (lcv .le. valid_group_count) $ then#$ say/symbol valid_group'lcv'$ lcv = lcv + 1$ goto _prompt_for_uic $ endifD$ read/end=_user_abort/prompt="UIC ([grp,mem]): " sys$command p3 $ endif5$ if (p3 .eqs. "") then $ goto _missing_param_abort$ p3 = f$element(0,"/",p3);$ group = f$integer(f$element(1,"[",f$element(0,",",p3)))2$ if ((f$type(disk_list'group') .eqs. "") .or. -3 (group .le. f$getsyi("MAXSYSGROUP")) .or. - (group .eq. 300)) $ then$ !+)$ ! Given group is not on valid list.$ !-X$ say "%LIATOO-F-UNAUTHGROUP, ''p2' cannot be added to inaccessible group ''group'."q$ request/to=('ltoper',security) "LIAISON(AUTH) - attempted adding user 'p2' to inaccessible group ''group'."$ goto _exit_out $ endif$ !+$ ! P4 is the account owner.$ !-<$ if ((p4 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) $ then N$ read/end=_user_abort/prompt="Owner (lastname,initials): " sys$command p4 $ endif5$ if (p4 .eqs. "") then $ goto _missing_param_abort$ p4 = f$element(0,"/",p4)$ !+I$ ! P5 is the login device. If it is not specified and only one deviceH$ ! is authorized for the account's group then it will default to that $ ! device.$ !-$ if (p5 .eqs. "") $ then ]$ if ((f$element(2,",",disk_list'group') .nes. "") .and. (f$mode() .eqs. "INTERACTIVE")) $ thenL$ tmp_str = f$extract(1,f$length(disk_list'group')-2,disk_list'group')N$ read/end=_user_abort/prompt="Home device (''tmp_str'):" sys$command p5 $ else.$ p5 = f$element(1,",",disk_list'group')J$ say "%LIATOO-I-DEFDEVICE, account login device defaults to ''p5'." $ endif $ endif5$ if (p5 .eqs. "") then $ goto _missing_param_abort$ !+K$ ! Strip any trailing characters and validate the disk given against the,$ ! list of disks for the account's group.$ !-$ p5 = f$element(0,":",p5)M$ if (f$locate(",''p5',",disk_list'group') .eq. f$length(disk_list'group')) $ thenY$ say "%LIATOO-F-UNAUTHDISK, ''p5' is not an authorized disk for user group ''group'"$ goto _invalid_param_abort $ endif$$ if (.not. f$getdvi(p5,"EXISTS")) $ then$ !+ $ ! The disk does not exist.$ !-K$ say "%LIATOO-F-NOSUCHDISK, disk ''p5' does not exist on this system."$ goto _invalid_param_abort $ endif$ !+J$ ! P6 is the login command procedure. It defaults to LOGIN.COM in the $ ! SYS$LOGIN directory.$ !-<$ if ((p6 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) $ then X$ read/end=_user_abort/prompt="Login command procedure [LOGIN.COM]: " sys$command p6 $ endif,$ if (p6 .eqs. "") then $ p6 = "LOGIN.COM"C$ if f$parse(p6,"[users.''p2']","''p5':",,"SYNTAX_ONLY") .eqs. "" $ then$ !+J$ ! The file specification given for the login commnd proc is invalid.$ !-N$ say "%LIATOO-F-BADFILSPEC, login command file specification is invalid."$ goto _invalid_param_abort $ endif$ !+J$ ! P7 is the account password. If not given then by default the system$ ! time will be used.$ !-<$ if ((p7 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) $ then E$ read/end=_user_abort/prompt="Account password: " sys$command p7 $ endif:$ if (p7 .eqs. "") then $ p7 = f$extract(12,12,f$time())$ p7 = f$element(0,"/",p7)$ if f$length(p7) .lt. 6 $ thenQ$ say "%LIATOO-F-PWDTOOSHRT, account password must be at least 6 characters."$ goto _invalid_param_abort $ endif$ !+0$ ! P8 is the profile to use for this account.$ !-$ !+,$ ! Make a list of valid account profiles.$ !-$ valid_profile_prompt = "",$ open/read iofile lt_data:lt_profiles.dat$ file_open = "YES"$ _profiles_loop:+$ read/end=_profiles_eof iofile recordT$ if f$extract(0,2,record) .eqs. "/*" then $ goto _profiles_loop ! Comment line5$ record = f$edit(record,"TRIM,UPCASE,COLLAPSE")K$ valid_profile_prompt = valid_profile_prompt + f$fao("!/!_''record'")$ profile_'record' = ""$ goto _profiles_loop$ _profiles_eof:$ close iofile$ file_open = "NO"$ !+N$ ! If the procedure is being run interactively and no profile was specifiedD$ ! then prompt for one. Note that this is an optional parameter.$ !-b$ if ((p8 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE") .and. (valid_profile_prompt .nes. "")) $ then C$ say "Valid profile account names are:''valid_profile_prompt'"T$ read/end=_user_abort/prompt="Profile account name (optional): " sys$command p8 $ endif$ account = account'group'$ if (p8 .nes. "") $ then$ !+5$ ! A profile was specified, validate and use it.$ !-($ if (f$type(profile_'p8') .eqs. "") $ thenF$ say "%LIATOO-F-INVPROFILE, ''p8' is not a valid user profile."!$ goto _invalid_param_abort $ else $ !+?$ ! Use the given profile for the default account values. $ !-.$ authorize copy 'p8' 'p2' -. /uic='p3' -. /owner="''p4'" -. /device='p5' -. /directory=[users.'p2'] -. /account='account' -. /lgicmd='p6' -! /password='p7'$ if (.not. $STATUS)$ then$ status = $STATUS@$ say "%LIATOO-E-AUTHERROR, Error adding account ''p2'."#$ goto _invalid_param_abort $ endif.$ authorize modify 'p2' -0 /expiration="+365-00:00:00" -. /pwdexpire -. /pwdlife=90-00:00:00 -1 /flags=(nodisreport,nodisuser)$ if (.not. $STATUS)$ then$ status = $STATUS@$ say "%LIATOO-E-AUTHERROR, Error adding account ''p2'."#$ goto _invalid_param_abort $ endif $ endif$ else$ !+D$ ! There is no profile to use in setting this account's values.$ !-&$ authorize add 'p2' -& /uic='p3' -& /owner="''p4'" -& /device='p5' -& /dir=[users.'p2'] -& /account='account' -& /lgicmd='p6' -& /password='p7' - /pwdexpire$ if (.not. $STATUS) $ then$ status = $STATUS>$ say "%LIATOO-E-AUTHERROR, Error adding account ''p2'."!$ goto _invalid_param_abort $ endif0$ authorize modify 'p2' -0 /expiration="+365-00:00:00" -0 /pwdlife=90-00:00:00 -0 /priv=(tmpmbx,netmbx) -0 /defpriv=(tmpmbx,netmbx) -/ /flags=(nodisreport,nodisuser)$ if (.not. $STATUS) $ then$ status = $STATUS>$ say "%LIATOO-E-AUTHERROR, Error adding account ''p2'."!$ goto _invalid_param_abort $ endif $ endif$ !+I$ ! Add this username to the list of new users added via LIAISON TOOLS.$ !-.$ open/append iofile lt_data:lt_newusers.dat$ file_open = "YES":$ write iofile f$fao("!12AS !13AS !20AS !%D",p2,p3,p4,0)$ close iofile$ file_open = "NO"$ !+9$ ! Give the new user some disk quota on his home disk.$ !-+$ open/write iofile sys$login:lt_tmp2.com$ file_open = "YES"$ write iofile "$ set noon""$ write iofile "$ mcr diskquota"$ write iofile "use ''p5'"/$ write iofile "add ''p2'/perm=2000/over=200"$ write iofile "show ''p2'"$ write iofile "exit"$ write iofile "$ exit"$ close iofile$ file_open = "NO"$ @sys$login:lt_tmp2.com!$ delete sys$login:lt_tmp2.com;$ !+ $ ! Create the home directory.$ !-Y$ create/dir/version=3/owner=['p2']/prot=(s:rwed,o:rwed,g:re,w:e)/log 'p5':[users.'p2']$ !+2$ ! Create a mail subdirectory for the new user.$ !-*$ open/write iofile sys$login:lt_tmp.com$ file_open = "YES"$ write iofile "$ set noon"$ write iofile "$ mail"-$ write iofile "set mail_directory [.mail]"$ write iofile "exit"$ write iofile "$ exit"$ close iofile$ file_open = "NO".$ set file/owner=['p2'] sys$login:lt_tmp.comJ$ submit/nolog/nokeep/noprint/user='p2'/delete/noid sys$login:lt_tmp.com$ status = $status$ goto _exit_out$y$!+F$! Delete a user from the SYSUAF file and delete all files in his user$! directories.m$!-p $ _del_user:$ !+N$ ! Unless the user specifically requests not to see the account information$ ! display it.l$ !-$ p3 = f$extract(0,1,p3).$ if p3 .nes. "N" then $ authorize show 'p2'$ if .not. $STATUS $ then$ status = $STATUS$ goto _exit_out $ endif $ !+O$ ! Make a list of disks where a user directory with the name of this account N$ ! is found. Do this by stepping through the list of disks associated withD$ ! the accounts group and looking for a [USERS]username.DIR file.$ !-$ userfile_disks = ","$ disk_pntr = 0"$ _check_disk_loop: $ disk_pntr = disk_pntr + 1o;$ this_disk = f$element(disk_pntr,",",disk_list'group')D;$ if ((this_disk .nes. ",") .and. (this_disk .nes. ""))) $ then>$ if f$search(this_disk+":"+"[users]''p2'.dir") .nes. ""$ thenQ$ if p3 .nes. "N" then $ say "User directory found on disk ''this_disk'."0;$ userfile_disks = userfile_disks + this_disk + ",". $ endif2 $ endifD&$ if (f$mode() .eqs. "INTERACTIVE") $ then$ !+L$ ! The user is running this interactively, get a confirmation that this1$ ! is really the account he wants to delete.($ !-y$ read/prompt="Are you sure you want to delete this account and its files (Y/N)? "/end=_user_abort sys$command answeri-$ if .not. answer then $ goto _user_abortc $ endif $ !+I$ ! Delete all the user's files. Note that a user can have a directorynG$ ! in the [.USERS] subdirectory of the MFD on any disk his group is t$ ! authorized to use.$ !-$ disk_pntr = 0d$ _user_disk_loop:$ disk_pntr = disk_pntr + 1O7$ this_disk = f$element(disk_pntr,",%",userfile_disks) $ if (this_disk .nes. "") $ then=$ set file/prot=(s:rwed) 'this_disk':[users.'p2'...]*.*;*$ !+F$ ! If you sort the output of the DIRECTORY command then the filesF$ ! will be listed in the correct order for deletion (ie, contentsI$ ! of directory before the directory .DIR file). Note that the filevH$ ! needs to be a fixed length record format to be correctly sorted.$ !-M$ say "%LIATOO-S-FILESFOUND, files being deleted from disk ''this_disk'."oX$ dir/nohead/notrail/out=sys$login:lt_authorize.tmp 'this_disk':[users.'p2'...]*.*;*U$ convert/fdl=sys$input/pad sys$login:lt_authorize.tmp sys$login:lt_authorize.data0IDENT " 3-OCT-1991 15:20:40 VAX-11 FDL Editor"SYSTEM SOURCE "VAX/VMS" FILE ALLOCATION 249 BEST_TRY_CONTIGUOUS yes EXTENSION 24 ORGANIZATION sequential RECORD BLOCK_SPAN yes! CARRIAGE_CONTROL carriage_returnI FORMAT fixedT SIZE 255,($ delete sys$login:lt_authorize.tmp;_$ sort/key=(pos:1,size:255,character) sys$login:lt_authorize.dat sys$login:lt_authorize.srte($ delete sys$login:lt_authorize.dat;1$ open/read iofile sys$login:lt_authorize.srt $ file_open = "YES".$ _delete_file_list_loop:d2$ read/end=_delete_file_list_eof iofile record$ delete 'record'_!$ goto _delete_file_list_loop($ _delete_file_list_eof:$ close iofile$ file_open = "NO"($ delete sys$login:lt_authorize.srt;:$ set file/prot=(s:rwed) 'this_disk':[users]'p2'.dir;**$ delete 'this_disk':[users]'p2'.dir;*$ !+8$ ! Remove the disk quota allocation from this disk.$ !--$ open/write iofile sys$login:lt_tmp2.com.$ file_open = "YES"i$ write iofile "$ set noon"N$$ write iofile "$ mcr diskquota"%$ write iofile "use ''this_disk'"h!$ write iofile "remove ''p2'"-$ write iofile "exit"C$ write iofile "$ exit"s$ close iofile$ file_open = "NO"$ @sys$login:lt_tmp2.com#$ delete sys$log)in:lt_tmp2.com; $ goto _user_disk_loop $ endif.$ !+%$ ! Remove the account from SYSUAF.+$ !-$ authorize remove 'p2'a$ status = $status$ goto _exit_out$ $ _mod_user:$ !+-$ ! P3 is the list of qualifiers to change.u$ !-<$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) $ then vR$ read/end=_user_abort/prompt="Qualifier list (start with /): " sys$command p3 $ endifa5$ if (p3 .eqs. "") then $ goto _missing_param_aborta9$ if (f$extract(0,1,p3) .nes. "/") then $ p3 = "/" + p3L$ valid_quals = ",ACCE,ACCO,BATC,CPUT,DEVI,DIAL,DIRE,EXPI,FLAG,GENE,INTE,LGIC,LOCA,MAXA,MAXD,MAXJ,MODI,NETW,OWNE,PASS,PRCL,PRIM,NOPW,PWDE,REMO,SHRF,"s$ checked_quals = ""$ qual_count = 0$ _check_quals_loop:$ qual_count = qual_count + 1i,$ this_qual = f$element(qual_count,"/",p3)$ if (this_qual .nes. "/") $ thenL$ qual = f$edit(f$extract(0,4,f$element(0,"=",this_qual)),"TRIM,UPCASE")>$ value = f$edit(f$element(1,"=",this_qual),"TRIM,UPCASE")E$ if f$locate(",''qual',",valid_quals) .eq. f$length(valid_quals)i $ thenF$ say "%LIATOO-W-UNKQUAL, unknown qualifer ignored ''this_qual'"$ goto _check_quals_loop $ endif$ goto _'qual'_qualifier$ _flag_qualifier:7$ if (f$locate("DISU",value) .ne. f$length(value))u $ then W$ say "%LIATOO-W-NODISUSERFLAG, cannot specify DISUSER flag, use DISABLE action"gM$ say " LIATOO-W-FLAGSIGNORED, the /FLAGS qualifiers has been ignored""$ goto _check_quals_loopg $ endif$ _acce_qualifier:$ _acco_qualifier:$ _batc_qualifier:$ _cput_qualifier:$ _devi_qualifier:$ _dial_qualifier:$ _dire_qualifier:$ _expi_qualifier:$ _gene_qualifier:$ _inte_qualifier:$ _lgic_qualifier:$ _loca_qualifier:$ _maxa_qualifier:$ _maxd_qualifier:$ _maxj_qualifier:$ _netw_qualifier:$ _owne_qualifier:$ _pass_qualifier:$ _prcl_qualifier:$ - _prim_qualifier:$ _shrf_qualifier:?$ checked_quals = checked_quals + "/" + qual + "=" + value$ goto _check_quals_loopt$ _modi_qualifier:$ _pwde_qualifier:4$ checked_quals = checked_quals + "/pwdexpired"$ goto _check_quals_loopO$ _nopw_qualifier:6$ checked_quals = checked_quals + "/nopwdexpired"$ goto _check_quals_loop"$ _remo_qualifier:9$ checked_quals = checked_quals + "/remote=" + valuel$ goto _check_quals_loopf $ endif$ if (checked_quals .nes. "")n $ then+$ authorize modify 'p2' 'checked_quals'a$ status = $status$ elseE$ say "%LIATOO-I-NOCHANGES, no supported changes were specified." $ status = $status $ endift$ goto _exit_out$s $ _ren_user:$ !+$ ! P3 is the new username$ !-~$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/end=_user_abort/prompt="New username: " sys$command p35$ if (p3 .eqs. "") then $ goto _missing_param_abortc$ !+-$ ! P4 is the list of qualifiers to change.i$ !-$ if ((p4 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/end=_user_abort/prompt="Qualifier list (start with /): " sys$command p4.K$ if ((p4 .nes. "") .and. (f$locate("/",p4) .ne. 0)) then $ p4 = "/" + p4_#$ authorize rename 'p2' 'p3' 'p4'!0$ authorize modify 'p3'/directory=[users.'p3']$ if .not. $status $ then$ status = $status$ goto _exit_out $ endif $ !+O$ ! Make a list of disks where a user directory with the name of this account N$ ! is found. Do this by stepping through the list of disks associated withD$ ! the accounts group and looking for a [USERS]username.DIR file.$ !-$ disk_pntr = 0p$ _check_disk_loop2:$ disk_pntr = disk_pntr + 1 ;$ this_disk = f$element(disk_pntr,",",disk_list'group')c;$ if ((this_disk .nes. ",") .and. (this_disk .nes. ""))d $ then7$ old_name = this_disk + ":" + "[users]''p2'.dir"&$ if f$search(old_name) .nes. ""1$ then9$ new_name = f$parse(p3,old_name,,,"SYNTAX_ONLY")n*$ rename/log 'old_name' 'new_name' $ endifr$ goto _check_disk_loop2 $ endif $ goto _exit_out$) $ _dis_user:5$ define/user sys$output sys$login:lt_authorize.tmpi$ authorize show/brief 'p2'/$ open/read iofile sys$login:lt_authorize.tmp2$ file_open = "YES"a$ read iofile inrec'$ read iofile inrecl$ read iofile inrecO$ close iofile$ file_open = "NO"-$ delete/nolog sys$login:lt_authorize.tmp;*t7$ account_name = f$edit(f$extract(0,21,inrec),"TRIM")S$ if f$extract(0,1,account_name) .nes. "!" then $ account_name = "!"+account_name H$ authorize modify/flag=(disuser,dismail)/owner="''account_name'" 'p2'$ status = $statusJ$ if status then $ say "%LIATOO-S-USERDIS, user account ''p2' disabled." $ ctx = ""8$ temp = f$context("PROCESS",ctx,"NODENAME","*","EQL")7$ temp = f$context("PROCESS",ctx,"USERNAME",p2,"EQL")u$ pid = f$pid(ctx)$ if (pid .nes. "") $ then'$ if (f$mode() .eqs. "INTERACTIVE")f $ then "f$ read/prompt="''p2' owned processes running, delete them [N]? "/end=_user_abort sys$command ans$ if (ans)$ then$ _pid_loop:$ if (pid .nes. "")o$ then$ stop/id='pid'm?$ say "%LIATOO-I-STOPPED, process ID ''pid' stopped.")$ pid = f$pid(ctx)$ goto _pid_loop$ endif" $ endif $ elseS$ say "%LIATOO-I-ONSYSTEM, process(es) owned by ''p2' are currently running."i $ endif $ endife$ goto _exit_out$ $ _ena_user:6$ lt_confirm = "$lt_system:lt_confirm_nodisuser.exe"%$ define/user sys$input sys$command'$ lt_confirm 'p2'p$ if $status .eq. 1i $ then7$ define/user sys$output sys$login:lt_authorize.tmpo$ authorize show/brief 'p2'u1$ open/read iofile sys$login:lt_authorize.tmp $ file_open = "YES"e$ read iofile inrec $ read iofile inrech$ read i5ofile inrec $ close iofile$ file_open = "NO"/$ delete/nolog sys$login:lt_authorize.tmp;*o9$ account_name = f$edit(f$extract(0,21,inrec),"TRIM")h'$ account_name = account_name - "!"oL$ authorize modify/flag=(nodisuser,nodismail)/own="''account_name'" 'p2'$ status = $status$ if status $ then ;$ say "%LIATOO-S-USEREN, user account ''p2' enabled.".X$ request/to=('ltoper',security) "LIAISON(AUTH) - User account ''p2' NODISUSERed." $ endifs $ endif,$ goto _exit_out$) $ _rea_user:$!+hD$! P3 is the new account expiration date (absolute or delta format).$!-c$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="New expiration date: "/end=_user_abort sys$command p32$ p3 = f$edit(f$element(0,"/",p3),"UPCASE,TRIM").$ if p3 .eqs. "EXIT" then $ goto _user_abort3$ if p3 .eqs. "" then $ goto _invalid_param_abort %$ authorize modify/expire='p3' 'p2'$ status = $statusQ$ if status then $ say "%LIATOO-S-USEREAUTH, user account ''p2' expires ''p3'."($ goto _exit_out$= $ _sho_user:$ authorize show/full 'p2'$ status = $status$ goto _exit_out$ $ _fwd_user:$ !+0$ ! Forward the users mail to another account.$ !-$ !+2$ ! P3 is the name of the account to forward to.$ !-0$ if (p3 .eqs. "EXIT") then $ goto _user_abort+$ open/write iofile sys$login:lt_tmp2.comu$ file_open = "YES" 1$ write iofile "$ on error then $ exit $status"l$ write iofile "$ mail" *$ write iofile "show forward/user=''p2'"$ write iofile "$ exit" $ close iofile$ file_open = "NO"$ @sys$login:lt_tmp2.com"$ delete sys$login:lt_tmp2.com;*<$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) $ then pW$ read/end=_user_abort/prompt="Name of account to forward mail to: " sys$command p3 $ endifo5$ if (p3 .eqs. "") then $ goto _missing_param_aborti0$ if (p3 .eqs. "EXIT") then $ goto _user_abort!$ quote_loc = f$locate("""",p3)i%$ if (qu9ote_loc .nes. f$length(p3)) $ thenG$ p3 = "''f$element(0,"""",p3)'""""""''f$element(1,"""",p3)'"""""""f $ endifs+$ open/write iofile sys$login:lt_tmp2.com.$ file_open = "YES"1$ write iofile "$ on error then $ exit $status"d$ write iofile "$ mail"e/$ write iofile "set forward/user=''p2' " + p3o$ write iofile "$ exit"$ close iofile$ file_open = "NO"$ @sys$login:lt_tmp2.com$ status = $status"$ delete sys$login:lt_tmp2.com;*$ goto _exit_out$-P$!!!!!P L~LT020.BI;^,[USERS.DENTON_D.DECUS.LT.B]AUTHORIZE.COM;149< :!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$R$!+,$! Exit routines.i$!-r$o$ _user_abort:M$ say "%LIATOO-W-USRABORT, user requested abort of LIAISON TOOL AUTHORIZE."f$ goto _exit_out$o$ _unauth_user_abort:-G$ say "%LIATOO-W-USRABORT, you are not authorized for LIAISON TOOLs."=a$ request/to=('ltoper',security) "LIAISON(AUTH) - Attempted unauthorized use of LIAISON TOOLs."'$ goto _exit_out$ $ _invalid_param_abort:=:$ say "%LIATOO-E-INVPARAM, invalid parameter specified."$ goto _exit_out$ $ _missing_param_abort: <$ say "%LIATOO-E-INVPARAM, required parameter is missing."$ goto _exit_out$ $ _exit_out:*$ if file_open then $ close/nolog iofile)$ set process/priv=(noall,'save_privs') #$ set symbol/scope=('save_scope')n $ junk = f$verify(save_verify)$ exit status- /expiration="+365-00:00:00" -. /pwdexpire -. /pwdlife=90-00:00:00 -1 &*[USERS.DENTON_D.DECUS.LT.B]ENTRY.COM;9+,O. /0 4 -;^0123KPWO 56`tH7`IH89@dHG0HJ$ save_verify = f$verify(0)$ if save_verify $ thenY$ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$ else$ if (f$type(verify) .nes. "") then $ if verify then $ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$ endif$!++$! --- LT_SYSTEM:ENTRY.COM$!$! Facility: LIAISON_TOOLS$! $! Abstract:$!$! Parameters:$!$! P1 - ACTION (required)$!#$! P2 - ENTRY NUMBER (required)$!!$! P3 - QUALIFIERS (optional)$!$!$!$! Modification History$!'$! 29-Oct-91 DLD Original version.$!-- $$!+H$! Establish ^Y and error handlers, record current state of some processA$! characteristics, set needed privileges, define needed symbols.$!- $ set noon,$ save_scope = f$environment("symbol_scope")%$ set symbol/scope=(noglobal,nolocal)&$ save_privs = f$getjpi("","procpriv")'$ save_msg = f$environment("message") $ set process/priv=(oper,sysprv)$$ on control_y then goto _user_abort$$ say = "write sys$output"$ ltoper = "oper11"$$!+I$! Validate parameters. A ^Z or EXIT response at any time will abort the $! procedure.$!-$$!+$! P1 is the action to take.$!-$$ valid_commands = "SHOW,SET,DELETE"c$ if (p1 .eqs. "") then $ read/prompt="Action (''valid_commands'): "/end=_user_abort sys$command p1($ p1 = f$edit(p1,"UPCASE,TRIM,COLLAPSE"),$ if p1 .eqs. "EXIT" then $ goto _user_abort/$ if p1 .eqs. "" then goto _missing_param_abort-$ valid_commands = "," + valid_commands + ","h$ if (f$locate(",''p1',",valid_commands) .eq. f$length(valid_commands)) then $ goto _invalid_param_abort$$!+($! P2 is the number of the target entry.$!-U$ if (p2 .eqs. "") then $ read/prompt="Entry number: "/end=_user_abort sys$command p2($ p2 = f$edit(p2,"UPCASE,TRIM,COLLAPSE"),$ if p2 .eqs. "EXIT" then $ goto _user_abort/$ if p2 .eqs. "" then goto _missing_param_abort$ entry_number = f$integer(p2)$ if entry_number .eq. 0$ then<$ say "%LIATOO-F-INVENTNUM, ''p2' is not a valid integer."$ goto _exit_out$ endifF$ entry_number = f$getqui("DISPLAY_ENTRY","ENTRY_NUMBER",entry_number)$ if entry_number .eq. 0$ then:$ say "%LIATOO-F-NOSUCHENT, entry ''p2' does not exist."$ goto _exit_out$ endif$$!+($! P3 is an optional list of qualifiers.$!-$ if (p1 .eqs. "DELETE")$ thenL$ if (p3 .nes. "") then $ say "$LIATOO-W-IGNORPARAM, P3 parameter ignored"$ else$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Qualifier list (including /): "/end=_user_abort sys$command p3*$ p3 = f$edit(p3,"UPCASE,TRIM,COLLAPSE").$ if p3 .eqs. "EXIT" then $ goto _user_abortM$ if ((p3 .nes. "") .and. (f$extract(0,1,p3) .nes. "/")) then p3 = "/''p3'"$ endif$$!+F$! Make sure the user has the QUE_MGR right or the right to access the5$! queue requested on the user profile within SYSUAF.$!-%$ junk = f$getqui("CANCEL_OPERATION")Q$ queue_name = f$edit(f$getqui("DISPLAY_ENTRY","QUEUE_NAME",entry_number),"trim")$ if queue_name .eqs. ""$ thenP$ say "%LIATOO-I-JOBDONE, job ''entry_number' completed during tool execution"$ goto _exit_out$ endif($ rights = f$getjpi("","process_rights")$ rights_len = f$length(rights)p$ if ((f$locate("QUE_MGR",rights) .eq. rights_len) .and. (f$locate("''queue_name'_MGR",rights) .eq. rights_len))$ thenE$ say "%LIATOO-E-NORIGHT, no right granted to queue ''queue_name'."n$ request/to=('ltoper',security) "LIAISON(ENTRY) - attempt to access entry in ''queue_name' without rights."$ goto _exit_out$ endif*$ set message/facility/severity/ident/text$$!+$! Perform the desired action.$!-$ goto _'p1'_entry$$!+8$! Show the entry information to the user on SYS$OUTPUT.$!-$ _show_entry:$ show entry'p3' 'entry_number'$ goto _exit_out$$!+#$! Delete the entry from the queue.$!-$ _delete_entry:$ delete/entry='entry_number'$ goto _exit_out$ $!+$! Modify the specified entry.$!- $ _set_ent ry:$ set entry 'p3' 'p2' $ if $STATUS$ thenM$ say "%LIATOO-S-ENTMODIFIED, entry ''entry_number' successfully modified."V$ request/to='ltoper' "LIAISON(ENTRY) entry ''entry_number' modified using (''p3')."$ endif$ goto _exit_out$$!++$!$! Exit routines.$!$!--$ _user_abort:I$ say "%LIATOO-W-USRABORT, user requested abort of LIAISON TOOL ENTRY."$ goto _exit_out$$ _invalid_param_abort::$ say "%LIATOO-E-INVPARAM, invalid parameter specified."$ goto _exit_out$$ _unsupported_qualifier_abort:?$ say "%LIATOO-E-UNSUPQUAL, unsupported qualifier specified."$ goto _exit_out$$ _missing_param_abort:<$ say "%LIATOO-F-INVPARAM, required parameter is missing."$ goto _exit_out$ $ _exit_out:)$ set process/priv=(noall,'save_privs')$ set message'save_msg'#$ set symbol/scope=('save_scope') $ junk = f$verify(save_verify)$ exit&*[USERS.DENTON_D.DECUS.LT.B]FILE.COM;26+, x./0 4~-;^0123KPWO56`pH7 IH89@dHG0HJ$ save_verify = 'f$verify(0)'$ if save_verify $ thenY$ write sys$output f$fao("!/Executing !AS version 2.0-6.!/",f$environment("procedure"))$ else$ if (f$type(verify) .nes. "") then $ if verify then $ write sys$output f$fao("!/Executing !AS version 2.0-6.!/",f$environment("procedure"))$ endif$!++$! --- LT_SYSTEM:FILE.COM$!$! Facility: LIAISON_TOOLS$! $! Abstract:$!K$! Allow the user to process files that he would otherwise not have theL$! required privileges. Restrictions on file access are still enforced.N$! No mail files can be touched, also no files on the system disk (pointedM$! to by SYS$SYSDEVICE), no files owned by a system group (group UIC codeM$! less than or equal to MAXSYSGROUP system parameter), no files owned byK$! TECH (group UIC code of 300). Finally, the file must be owned by anG$! account with its group code listed in LT_DATA:LT_GROUP_INFO.DAT.$!L$! Once access is confirmed for each file, the requested action is taken$! on that single file.$!$! Parameters:$!$! p1 - ACTION (required)3$! The action to take on the specified file.$!$! p2 - FILESPEC (required)4$! The identifying input file specifications.$!1$! p3 - OPTION_LIST or DESTINATION (required)M$! The list of options to the SHOW or SET action or the DESTINATION of$! the MOVE action.$!$!$! Modification History$!U$! 27-Jul-1992 DLD Exit immediately if requested SHOW of SYSTEM DISK. (2.0-6)N$! 03-Mar-1992 DLD Display message if no files were processed. (2.0-5)?$! 19-Feb-1992 DLD Mail file specified in HACK attempt.K$! 03-Feb-1992 DLD Add more of the filename to the operator message5$! for probable hack attempt.N$! 16-Jan-1992 DLD SHOW will work on any file not on the SYS$SYSDEVICEL$! and handle the entire filespec in one call to the5$! directory command. (2.0-2),$! 28-Oct-1991 DLD Original version.$!-- $$!+H$! Establish ^Y and error handlers, record current state of some processA$! characteristics, set needed privileges, define needed symbols.$!- $ set noon&$ save_privs = f$getjpi("","procpriv"),$ save_scope = f$environment("symbol_scope").$ set process/priv=(bypass,cmkrnl,sysprv,oper)%$ set symbol/scope=(noglobal,nolocal)$$ on control_y then goto _user_abort$$ say = "write sys$output"$ ltoper = "oper11"$$ file_open = 0$$!+.$! Determine the device name of SYS$SYSDEVICE.$!-5$ sysdev = f$element(0,":",f$trnlnm("sys$sysdevice"))$ _sysdev_xlate_loop:/$ newsysdev = f$element(0,":",f$trnlnm(sysdev))$ if (newsysdev .nes. "")$ then$ sysdev = newsysdev$ goto _sysdev_xlate_loop$ endif$$!+N$! Validate parameters. A ^Z or EXIT response to any prompt is a user request $! to abort.$!-&$ valid_actions = "SHOW,SET,MOVE,FRAG"`$ if p1 .eqs. "" then $ read/prompt="Action (''valid_actions'): "/end=_user_abort sys$command p1+$ valid_actions = "," + valid_actions + ","($ p1 = f$edit(p1,"UPCASE,TRIM,COLLAPSE"),$ if p1 .eqs. "EXIT" then $ goto _user_abort1$ if p1 .eqs. "" then $ goto _missing_param_abortd$ if f$locate(",''p1',",valid_actions) .eq. f$length(valid_actions) then $ goto _invalid_param_abort$ if (p1 .eqs. "FRAG")$ then$ gosub _frag_file$ goto _exit_out$ endifY$ if p2 .eqs. "" then $ read/prompt="File specification: "/end=_user_abort sys$command p2($ p2 = f$edit(p2,"UPCASE,TRIM,COLLAPSE"),$ if p2 .eqs. "EXIT" then $ goto _user_abort1$ if p2 .eqs. "" then $ goto _missing_param_abort$!+E$! If the action is not FRAG then a third parameter is a possibility.$!-Q$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE") .and. (p1 .nes. "FRAG")) $ then $ if p1 .nes. "MOVE" $ then$ !+'$ ! Parameter 3 is an options list.$ !-N$ read/prompt="Option list (including /): "/end=_user_abort sys$command p3$ else$ !+'$ ! Parameter 3 is the destination.$ !-@$ read/prompt="Destination: "/end=_user_abort sys$command p3 $ endif$ endif($ p3 = f$edit(p3,"UPCASE,TRIM,COLLAPSE"),$ if p3 .eqs. "EXIT" then $ goto _user_abort$$!+P$! If the action is neither SHOW nor FRAG, then the third parameter is required.$!-e$ if ((p3 .eqs. "") .and. (p1 .nes. "SHOW") .and. (p1 .nes. "FRAG")) then $ goto _missing_param_abort$$!+$! Validate the p3 parameter.$!-0$ if ((p1 .nes. "MOVE") .and. (p1 .nes. "FRAG"))$ then$ !+$ ! P3 is a list of options.$ !-$ options = p3$ optcnt = 0$ checked_options = ""$ _option_loop:'$ opt = f$element(optcnt,"/",options)$ if opt .nes. "/" $ then$ if opt .nes. "" $ then$ if f$length(opt) .lt. 3$ thenJ$ say "%LIATOO-F-SHRTOPT, option list element too short (''opt')."$ goto _exit_out $ endif!$ opt3 = f$extract(0,3,opt)5$ if (opt3 .eqs. "ENT") .or. (opt3 .eqs. "REM")$ then1$ say "%LIATOO-F-INVOPT, invalid option."$ goto _exit_out $ endif$ if (opt3 .eqs. "OWN")$ then;$ new_owner = f$edit(f$element(1,"=",opt),"upcase")-$ if (new_owner .eqs. "SYSTEMSSTAFF")$ then$ request/to=(security,'ltoper') "LIAISON(FILE) - PROBABLE HACK ATTEMPT, attempted set owner of ''f$search(p2)' to SYSTEMSSTAFF."^$ mail/subject="LT HACK - tried to set owner to SYSTEMSSTAFF." 'f$search(p2)' systemK$ say "%LIATOO-F-HACK, you cannot set file owner to SYSTEMSSTAFF"$ goto _exit_out$ endif $ endif5$ checked_options = checked_options + "/" + opt $ endif$ optcnt = optcnt + 1$ goto _option_loop $ endif$ else$ if (p1 .eqs. "MOVE") $ then$ !+O$ ! P3 is the destination specification, be sure the destination device is O$ ! not SYS$SYSDEVICE. Also check to be sure the user is not at tempting toJ$ ! add a backup qualifier to the destination spec (like "/owner=me").$ !-'$ destination = f$element(0,"/",p3)$ if destination .nes. p3 then $ request/to=(security,'ltoper') "LIAISON(FILE) - possible HACK attempt, destination given for backup is ''p3'"<$ dev = f$element(0,":",f$parse(destination,,,"DEVICE"))$ _dev_xlate_loop2:-$ newdev = f$element(0,":",f$trnlnm(dev))$ if (newdev .nes. "") $ then$ dev = newdev$ goto _dev_xlate_loop2 $ endif$ if (dev .eqs. sysdev) $ then $ !+)$ ! Destination is the system disk. $ !-G$ say "%LIATOO-E-NOSYSDISK, can't move files to the system disk."b$ request/to=('ltoper',security) "LIAISON(FILE) - attempt to move files to the system disk."!$ goto _invalid_param_abort $ endif $ endif$ endif$$ if p1 .eqs. "SHOW"$ then$ !+L$ ! The SHOW action has a reduced security requirement, it can process any$$ ! file not on the SYS$SYSDEVICE.$ !-1$ dev = f$element(0,":",f$parse(p2,,,"DEVICE"))$ _dev_xlate_loop1:+$ newdev = f$element(0,":",f$trnlnm(dev))$ if (newdev .nes. "") $ then$ dev = newdev$ goto _dev_xlate_loop1 $ endif$ if (dev .eqs. sysdev) $ then$ !+($ ! File resides on the system disk.$ !-9$ say "%LIATOO-E-NOSYSDISK, can't access system disk"f$ request/to=('ltoper',security) "LIAISON(FILE) - attempt to access system disk file ''file_spec'"$ else$ file_spec = p2$ gosub _show_file $ endif$ goto _exit_out$ endif$$!+M$! Make a list of valid UIC group codes. Any file processed must be owned by$! one of these groups.$!-$ valid_groups = ","3$ open/read lt_group_info lt_data:lt_group_info.dat$ file_open = 1$ _read_uic_loop:2$ read/end=_eof_lt_group_info lt_group_info record>$ if f$extract(0,2,record) .eqs. "/*" then goto _read_uic_loopT$ valid_groups = valid_groups + f$fao("!6ZL",f$integer(f$extract(0,4,record))) + ","$ goto _read_uic_loop$ _eof_lt_group_info:$ close lt_group_info$ file_open = 0$$!+L$! For each file that matches the file specification given as p2, determine *$! access and take the appropriate action.$!-$ old_spec = ""$ file_cnt = 0$ _file_spec_loop:$ file_spec = f$search(p2):$ if (file_spec .nes. "") .and. (file_spec .nes. old_spec)$ then$ old_spec = file_spec+$ file_type = f$parse(file_spec,,,"TYPE")$ if file_type .eqs. ".MAI" $ then$ !+ $ ! File is part of VMSMAIL.$ !-B$ say "%LIATOO-E-NOMAIL, can't change MAIL file ''file_spec'."]$ request/to=('ltoper',security) "LIAISON(FILE) Attempt to change MAI file ''file_spec'."$ goto _file_spec_loop $ endif$ !+L$ ! Reduce the device logical name to its lowest level equivalence string.$ !-8$ dev = f$element(0,":",f$parse(file_spec,,,"DEVICE"))$ _dev_xlate_loop:+$ newdev = f$element(0,":",f$trnlnm(dev))$ if (newdev .nes. "") $ then$ dev = newdev$ goto _dev_xlate_loop $ endif$ if (dev .eqs. sysdev) $ then$ !+($ ! File resides on the system disk.$ !-9$ say "%LIATOO-E-NOSYSDISK, can't access system disk"f$ request/to=('ltoper',security) "LIAISON(FILE) - attempt to access system disk file ''file_spec'"$ goto _file_spec_loop $ endif$ !+I$ ! Make sure that this file is not owned by a system account or a tech$ ! account.$ !-M$ file_grp_name = f$element(0,",",f$file_attributes(file_spec,"UIC")) - "["+$ if (file_grp_name .eqs. "SYSTEMSSTAFF") $ then~$ request/to=(security,'ltoper') "LIAISON(FILE) - PROBABLE HACK ATTEMPT, attempted ''p1' of ''p2', owned by SYSTEMSSTAFF."D$ mail/subject="LT HACK - LT_FILE ''p1' ''p2' ''p3'." nl: systemI$ say "%LIATOO-F-HACK, you cannot access files owned by SYSTEMSSTAFF"$ goto _exit_out $ endif_$ file_grp = f$element(0,",",f$fao("!%U",f$identifier(file_grp_name,"NAME_ TO_NUMBER"))) - "["&$ file_grp_int = f$integer(file_grp)F$ if ((file_grp_int .eq. 0) .and. (f$integer(file_grp_name) .ne. 0)) $ then$ !+J$ ! This file is owned by a group that no longer exists on the system,M$ ! the group name will be a number, use it. If that group number is not>$ ! in the lt_group_info file then it will kick out later.$ !--$ file_grp_int = f$integer(file_grp_name) $ endifO$ if (file_grp_int .le. f$getsyi("MAXSYSGROUP")) .or. (file_grp_int .eq. 300) $ thenP$ say "%LIATOO-E-SYSOWNS, system group [''file_grp'] owns file ''file_spec'"l$ request/to=('ltoper',security) "LIAISON(FILE) - attempt to access ''file_spec' owned by [''file_grp']"$ goto _file_spec_loop $ endif$ !+B$ ! Check the lt_group_info file for the group code of the file.$ !-[$ if f$locate(",''f$fao("!6ZL",file_grp_int)',",valid_groups) .eq. f$length(valid_groups) $ thenS$ say "%LIATOO-E-BADFILGRP, ''file_spec' owned by unlisted group [''file_grp']"f$ request/to=('ltoper',security) "LIAISON(FILE) attempt to access unauthorized file ''file_spec'."$ goto _file_spec_loop $ endif$ !+$ ! Do the requested action.$ !-$ file_cnt = file_cnt + 1$ gosub _'p1'_file$ goto _file_spec_loop$ endifV$ if (file_cnt .eq. 0) then $ say "%LIATOO-W-NOVALFIL, ''P2' selected no valid files."$ goto _exit_out$ $ _set_file:,$ set file/log 'file_spec' 'checked_options'c$ if .not. $status then $ say "%LIATOO-E-FILENOTSET, ''file_spec' not changed by SET FILE command."$ return$ $ _show_file:)$ directory 'file_spec' 'checked_options'$ return$ $ _move_file:5$ backup/log 'file_spec' 'destination'/owner=original$ return$ $ _frag_file:$ frag = "$lt_system:file_frag"#$ define/user sys$input sys$command$ frag 'file_spec'$ return$ $$ _missing_param_abort:8$ say "%LIATOO-W-MISPARAM, required parameter missing"$ goto _exit_out$ _invalid_param_abort:T$ say "%LIATOO-W-INVPARAM, invalid parameter value specified to LIAISON TOOL FILE"$ goto _exit_out$ _user_abort:G$ say "%LIATOO-W-USRABORT, user requested abort of LIAISON TOOL FILE"$ goto _exit_out $ _exit_out:+$ if file_open then $ close lt_group_info $ junk = f$verify(save_verify))$ set process/priv=(noall,'save_privs')#$ set symbol/scope=('save_scope')$ exit,*[USERS.DENTON_D.DECUS.LT.B]IDENTIFIER.COM;10+,=./0 4z-;^0123KPWO56H7IH89@dHG0HJ$ save_verify = f$verify(0)$ if save_verify $ thenY$ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$ else$ if (f$type(verify) .nes. "") then $ if verify then $ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$ endif$!++$! --- LT_SYSTEM:IDENTIFIER.COM$!$! Facility: LIAISON_TOOLS$! $! Abstract:H$! The IDENTIFIER procedure allows the LIAISON TOOLS user to manipulateM$! rights identifiers. All AUTHORIZE utility commands effecting identifiersM$! are supported (except RENAME/IDENTIFIER, which is logically equivalent toL$! MODIFY/IDENTIFIER/NAME=new-name old-name). It will function in any modeC$! with missing parameters being prompted for in interactive mode.$!$! Parameters:$!$! P1 - ACTION (required)I$! Must be one of ADD, GRANT, LIST, MODIFY, REVOKE, REMOVE, SHOW, 9$! or VALID and it must be spelled out completely.$!$! P2 - IDENTIFIER (optional)M$! The name of the rights identifier to be processed. This is usuallyL$! a required parameter. In some cases it is not needed for the ADD,!$! LIST and SHOW commands.$!$! P3 - QUALIFIERS (optional)F$! Any special qualifiers you want to include with the command.$!6$! P4 - USER-SPEC (required iff P1 = GRANT or REVOKE)$!$! Modification History$!@$! 20-Nov-1991 DLD Support comments in LT_DATA:LT_RIGHTS.DATA$! 11-Nov-1991 DLD Removed WHO option (use SHOW id-name FULL)($! 09-Oct-1991 DLD Added WHO option.G$! 04-Oct-1991 DLD Added VALID option to display valid identifiers.($! 01-Oct-1991 DLD Original version.$!-- $$!+H$! Establish ^Y and error handlers, record current state of some processA$! characteristics, set needed privileges, define needed symbols.$!- $ set noon&$ save_privs = f$getjpi("","procpriv"),$ save_scope = f$environment("symbol_scope")/$ set process/priv=(bypass,oper,sysprv,exquota)%$ set symbol/scope=(noglobal,nolocal)$$ on control_y then goto _user_abort$ $ status = 1$ say = "write sys$output"$ ltoper = "oper11"%$ authorize = "$sys$system:authorize"$ file_open = "NO"$$$!++K$! Validate parameters. A ^Z or EXIT response at any prompt will abort the $! procedure.$!--$$!+G$! P1 is the action to take on the identifier. It must be spelled out $! completely.$!-B$ valid_actions = "ADD,GRANT,LIST,MODIFY,REVOKE,REMOVE,SHOW,VALID"$ if ((p1 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Action (''valid_actions'): "/end=_user_abort sys$command p1($ p1 = f$edit(p1,"UPCASE,TRIM,COLLAPSE"),$ if p1 .eqs. "EXIT" then $ goto _user_abort1$ if p1 .eqs. "" then $ goto _invalid_param_abort*$ valid_actions = "," + valid_actions +","f$ if (f$locate(",''p1',",valid_actions) .eq. f$length(valid_actions)) then $ goto _invalid_param_abort$!+L$! P2 is the name of the identifier. It is required unless the action to be%$! taken is ADD, LIST, SHOW or VALID.$!-$ if ((p2 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE") .and. (p1 .nes. "VALID")) then $ read/prompt="Identifier: "/end=_user_abort sys$command p2($ p2 = f$edit(p2,"UPCASE,TRIM,COLLAPSE"),$ if p2 .eqs. "EXIT" then $ goto _user_aborth$ if ((p2 .eqs. "") .and. (f$locate(p1,"ADD,LIST,SHOW,VALID") .eq. 19)) then $ goto _missing_param_abort$!+N$! If an identifier is specified and the action is not ADD then the identifierB$! must be found in the LT_DATA:LT_RIGHTS.DAT file. Otherwise theO$! identifier is not authorized for manipulation via the LIAISON TOOL facility.$!-+$ if ((p1 .nes. "ADD") .and. (p2 .nes. ""))$ then$ !+I$ ! Confirm that the given identifier is grantable using liaison tools.$ !--$ open/read auth_list lt_data:lt_rights.dat$ file_open = "YES"-$ read/end=_unauth_id_exit auth_list record$ _auth_id_loop:4$ record = f$edit(record,"UPCASE,TRIM,COLLAPSE")$ if (record .nes. p2) $ then2$ read/end=_unauth_id_abort auth_list record$ goto _auth_id_loop $ endif$ close auth_list$ file_open = "NO"$ endif$!+H$! If the action is not REMOVE, REVOKE, or VALID then it is possible to ,$! specify quailifiers for the command line.$!-($ no_qual_coms = "|REMOVE|REVOKE|VALID|"D$ if (f$locate("|''p1'|",no_qual_coms) .eqs. f$length(no_qual_coms))$ then$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Option list (including /): "/end=_user_abort sys$command p3*$ p3 = f$edit(p3,"UPCASE,TRIM,COLLAPSE").$ if p3 .eqs. "EXIT" then $ goto _user_abortO$ if ((p3 .nes. "") .and. (f$extract(0,1,p3) .nes. "/")) then $ p3 = "/''p3'"$ endif$!+0$! GRANT and REVOKE accept a user specification.$!-2$ if ((p1 .eqs. "GRANT") .or. (p1 .eqs. "REVOKE"))$ then$ if ((p4 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="User specification: "/end=_user_abort sys$command p4*$ p4 = f$edit(p4,"UPCASE,TRIM,COLLAPSE").$ if p4 .eqs. "EXIT" then $ goto _user_abort3$ if p4 .eqs. "" then $ goto _missing_param_abort$ endif$$!+M$! Use the ACTION name to go to the appropriate lable to continue processing.J$! An unsupported action will cause the invalid parameter error code to be $! executed.$!-$ goto _'p1'_id$$!-- $$!+1$! Add the identifier to the RIGHTSLIST.DAT file.$!- $ _add_id:%$ AUTHORIZE ADD/IDENTIFIER'P3' 'P2'$ if $status $ then$ !+K$ ! The identifier was successfully added to RIGHTSLIST.DAT, now add itI$ ! to the list of authorized LIAISON TOOLS manipulatable rights IDs.$ !-5$ open/read/write auth_file lt_data:lt_rights.dat$ file_open = "YES"$ _read_loop:+$ read/end=_read_eof auth_file record6$ record = f$edit(record,"UPCASE,TRIM,COLLAPSE")1$ if record .nes. p2 then $ goto _read_loopM$ say "%LIATOO-I-ALRDYAUTH, identifier ''p2' already on authorized list."$ goto _after_write$ _read_eof:$ write auth_file "''p2'"$ _after _write:$ close auth_file$ file_open = "NO"H$ say "%LIATOO-S-IDADDED, identifier ''p2' added to RIGHTSLIST.DAT."G$ request/to='ltoper' "LT(ID) identifier ''p2' added using (''p3')"$ else$ status = $status $ endif$ goto _exit_out$$!++$! Grant the identifier to a specific user.$!- $ _grant_id:,$ AUTHORIZE GRANT/IDENTIFIER'P3' 'P2' 'P4'$ if $status $ thenH$ say "%LIATOO-S-IDGRANTED, identifier ''p2' granted to user ''p4'."E$ request/to='ltoper' "LT(ID) identifier ''p2' granted to ''p4'."$ else$ status = $status $ endif$ goto _exit_out$$!++$! Modify characteristics of the rights ID.$!- $ _modify_id:+$ if f$locate("/N",p3) .nes. f$length(p3) $ thenB$ say "%LIATOO-F-NONAMCHA, identifier name cannot be changed."$ else*$ AUTHORIZE MODIFY/IDENTIFIER'P3' 'P2'$ if $status $ thenJ$ say "%LIATOO-S-IDMODIFIED, identifier ''p2' modified using ''p3'."L$ request/to='ltoper' "LT(ID) identifier ''p2' modified using (''p3')" $ else$ status = $status $ endif $ endif$ goto _exit_out$$!+A$! Write information about the rights ID to a file RIGHTSLIST.LIS$!- $ _list_id:&$ AUTHORIZE LIST/IDENTIFIER'P3' 'P2'$ goto _exit_out$$!+B$! Write information about the rights ID to the SYS$OUTPUT device.$!- $ _show_id:&$ AUTHORIZE SHOW/IDENTIFIER'P3' 'P2'$ goto _exit_out$$!+=$! Revoke access to the rights identifier of a specific user.$!- $ _revoke_id:)$ AUTHORIZE REVOKE/IDENTIFIER 'P2' 'P4'$ if $status $ thenJ$ say "%LIATOO-S-IDREVOKED, identifier ''p2' revoked from user ''p4'."G$ request/to='ltoper' "LT(ID) identifier ''p2' revoked from ''p4'."$ else$ status = $status $ endif$ goto _exit_out$$!+5$! Delete the rights ID from the RIGHTSLIST.DAT file.$!- $ _remove_id:$$ AUTHORIZE REMOVE/IDENTIFIER 'P2'$ if $status $ then5$ open/read/write auth_file lt_data:lt_rights.dat$ file_open = "YES"$ _rem_read_loop:/$ read/end=_rem_read_eof auth_file record($ record_length = f$length(record)6$ record = f$edit(record,"UPCASE,TRIM,COLLAPSE")5$ if record .nes. p2 then $ goto _rem_read_loop9$ write/update auth_file f$fao("!''record_length'* ")$ _rem_read_eof:$ close auth_file$ file_open = "NO"N$ say "%LIATOO-S-IDREMOVED, identifier ''p2' removed from RIGHTSLIST.DAT.";$ request/to='ltoper' "LT(ID) identifier ''p2' removed"$ else$ status = $status $ endif$ goto _exit_out$ $ _valid_id:-$ open/read auth_list lt_data:lt_rights.dat$ file_open = "YES",$ read/end=_valid_id_exit auth_list record$ _valid_id_loop:4$ record = f$edit(record,"UPCASE,TRIM,COLLAPSE")W$ if ((record .nes. "") .and. (f$extract(0,2,record) .nes. "/*")) then $ say record.$ read/end=_valid_id_exit auth_list record$ goto _valid_id_loop$ _valid_id_exit:$ close auth_list$ file_open = "NO"$ goto _exit_out$P$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$!+$! Exit routines.$!-$$ _user_abort:N$ say "%LIATOO-W-USRABORT, user requested abort of LIAISON TOOL IDENTIFIER."$ goto _exit_out$$ _unauth_user_abort:H$ say "%LIATOO-F-NOPRIV, you are not authorized to use LIAISON TOOLS."S$ request/to='ltoper' "Unauthorized use of LIAISON TOOLS (IDENTIFIER) attempted."$ goto _exit_out$$ _invalid_param_abort::$ say "%LIATOO-E-INVPARAM, invalid parameter specified."$ goto _exit_out$$ _missing_param_abort:<$ say "%LIATOO-E-INVPARAM, required parameter is missing."$ goto _exit_out$$ _unauth_id_abort:Y$ say "%LIATOO-F-UNAUTHID, identifier ''p2' not authorized for use with LIAISON TOOLS."V$ request/to='ltoper' "LT(ID) attempted manipulating unauthorized identifier ''p2'."$ goto _exit_out$ $ _exit_out:'$ if file_open then $ close auth_list)$ set process/priv=(noall,'save_privs')#$ set symbol/scope=('save_scope') $ junk = f$verify(save_verify)$ exit status'*[USERS.DENTON_D.DECUS.LT.B]LOGINS.COM;6+, r./0 4|-;^0123KPWO 56G H7 IH89@dHG0HJ$ save_verify = f$verify(0)$ if save_verify $ thenY$ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$ else$ if (f$type(verify) .nes. "") then $ if verify then $ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$ endif$!++$! --- LT_SYSTEM:LOGINS.COM$!$! Facility: LIAISON_TOOLS$! $! Abstract:$!$! Parameters:$!$! P1 - ACTION (required)<$! Must be one of SHOW or SET and must be sR~LT020.B r;^'[USERS.DENTON_D.DECUS.LT.B]LOGINS.COM;6pelled out$! completely.$!3$! P2 - LOGIN_LIMIT (required iff ACTION = SET)*$! The new interactive login limit.$!$!$! Modification History$!B$! 15-Nov-19 DLD Removed REBOOT option, renamed to LOGINS.COM'$! 15-Oct-91 DLD Original version.$!-- $$!+H$! Establish ^Y and error handlers, record current state of some processA$! characteristics, set needed privileges, define needed symbols.$!- $ set noon,$ save_scope = f$environment("symbol_scope")%$ set symbol/scope=(noglobal,nolocal)&$ save_privs = f$getjpi("","procpriv")'$ save_msg = f$environment("message").$ set process/priv=(bypass,cmkrnl,oper,sysprv)$$ on control_y then goto _user_abort$$ say = "write sys$output"$ ltoper = "oper11" $ cr = 13 $ lf = 10$$!++I$! Validate parameters. A ^Z or EXIT response at any time will abort the $! procedure.$!--$$!+$! P1 is the action to take.$!-$ if ((p1 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Action (SHOW,SET): "/end=_user_abort sys$command p1($ p1 = f$edit(p1,"UPCASE,TRIM,COLLAPSE"),$ if p1 .eqs. "EXIT" then $ goto _user_abort/$ if p1 .eqs. "" then goto _missing_param_abort$$!+)$! P2 is the new interactive login limit.$!-$ if (p1 .eqs. "SET")$ then$ if ((p2 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="New interactive login limit: "/end=_user_abort sys$command p2*$ p2 = f$edit(p2,"UPCASE,TRIM,COLLAPSE").$ if p2 .eqs. "EXIT" then $ goto _user_abort1$ if p2 .eqs. "" then goto _missing_param_abort$ endif$$!+J$! Make sure the user specified a valid action. If so then goto the label!$! that will execute that action.$!-$ valid_commands = "|SHOW|SET|"G$ if (f$locate("|''p1'|",valid_commands) .ne. f$length(valid_commands))$ then$ goto _'p1'$ else$ goto _invalid_param_abort$ endif$$!+,$! Show the current interactive login limit.$!-$ _show: $ set login$ goto _exit_out$ $!+%$! Set a new interactive login limit.$!-$ _set:$ set login/interactive='p2'Q$ request/to='ltoper' "LIAISON(OPERATOR) - interactive login limit set to ''p2'."$ goto _exit_out$$!+.$! Reboot the system (removed 11/15/91 by DLD)$!- $! _reboot:$! if (f$mode() .eqs. "INTERACTIVE") then $ read/prompt="Are you sure you want to shutdown and reboot ''f$getsyi("nodename")'? "/end=_user_abort sys$command confirmed$! if confirmed $! thenJ$! @sys$system:shutdown 0 "System Reboot" N Y "Soon via reboot" Y Reboot$! else$! goto _user_abort$! endif$! goto _exit_out$$!++$!$! Exit routines.$!$!--$ _user_abort:L$ say "%LIATOO-W-USRABORT, user requested abort of OPERATOR LIAISON Tool."$ goto _exit_out$$ _invalid_param_abort::$ say "%LIATOO-E-INVPARAM, invalid parameter specified."$ goto _exit_out$$ _missing_param_abort:<$ say "%LIATOO-F-INVPARAM, required parameter is missing."$ goto _exit_out$$ $ _exit_out:)$ set process/priv=(noall,'save_privs')$ set message'save_msg'#$ set symbol/scope=('save_scope') $ junk = f$verify(save_verify)$ exit1*[USERS.DENTON_D.DECUS.LT.B]LT_DEINSTALL_LT.COM;11+,ߤE./0 4mx-;^0123KPWO56Y?H7IH89@dHG0HJ$ on error then $ exit$ set proc/priv=(sysprv,bypass) $ set noonN$ dir/nohead/notrail/out=sys$scratch:deinstall_lt.tmp lt_root:[000000...]*.*;*U$ convert/fdl=sys$input/pad sys$scratch:deinstall_lt.tmp sys$scratch:deinstall_lt.dat0IDENT " 3-OCT-1991 15:20:40 VAX-11 FDL Editor"SYSTEM SOURCE "VAX/VMS"FILE ALLOCATION 249 BEST_TRY_CONTIGUOUS yes EXTENSION 24 ORGANIZATION sequentialRECORD BLOCK_SPAN yes! CARRIAGE_CONTROL carriage_return FORMAT fixed SIZE 255'$ delete sys$scratch:deinstall_lt.tmp;*_$ sort/key=(pos:1,size:255,character) sys$scratch:deinstall_lt.dat sys$scratch:deinstall_lt.srt'$ delete sys$scratch:deinstall_lt.dat;*/$ open/read iofile sys$scratch:deinstall_lt.srt$ _delete_file_list_loop:.$ read/end=_delete_file_list_eof iofile record$ delete 'record'$ goto _delete_file_list_loop$ _delete_file_list_eof:$ close iofile'$ delete sys$scratch:deinstall_lt.srt;*m$ if f$file_attributes("sys$library:cerberus.exe","known") then $ mcr install/remove sys$library:cerberus.exe!$ delete sys$library:cerberus.*;*%$ delete sys$startup:lt$startup.com;*%$ save_dir = f$environment("default")$ set default sys$system$ mcr authorizeremove/id systemsstaffremove/id lt_tool_mgrremove/id lt_userremove/id lt_queueremove/id lt_fileremove/id lt_replyremove/id lt_identifierremove/id lt_authorizeremove/id lt_diskremove/id lt_entryremove/id lt_networkremove/id lt_processremove/id lt_taperemove/id lt_databaseremove/id lt_database_privremove/id lt_loginsremove/id lt_installremove/id lt_mailboxexit$ deassign/system/exec lt_root$ deassign/system/exec lt_data $ deassign/system/exec lt_custom $ deassign/system/exec lt_system($ deassign/system/exec ist$liaison_tools!$ deassign/system/exec lt_version#$ deassign/system/exec lt_sna_lines$ set def 'save_dir'$ exit.*[USERS.DENTON_D.DECUS.LT.B]LT_DISKQUOTA.COM;21+,. /0 4 -;^0123KPWO 56^H7uIH89@dHG0HJ$ save_verify = f$verify(0)$ if save_verify $ thenY$ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$ else$ if (f$type(verify) .nes. "") then $ if verify then $ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$ endif$!++!$! --- LT_SYSTEM:LT_DISKQUOTA.COM$!$! Facility: LIAISON_TOOLS$! $! Abstract:$!$! Parameters:$!$! P1 - ACTION (required)$! P2 - USERNAME (require)$! P3 - DISK SPECIFICATION$! P4 - PERMANENT DISK BLOCKS$! P5 - OVERFLOW DISK BLOCKS$!$! Modification History$!($! 11-Nov-1991 DLD Original version.$!-- $$!+H$! Establish ^Y and error handlers, record current state of some processA$! characteristics, set needed privileges, define needed symbols.$!- $ set noon&$ save_privs = f$getjpi("","procpriv"),$ save_scope = f$environment("symbol_scope") $ set process/priv=(oper,sysprv)%$ set symbol/scope=(noglobal,nolocal)$$ on control_y then goto _user_abort$$ file_open = "NO" $ status = 1$ say = "write sys$output"$ ltoper = "oper11"$$$!++K$! Validate parameters. A ^Z or EXIT response at any prompt will abort the $! procedure.$!--$$!+A$! P1 is the action to take. It must have at least 3 characters.$!-#$ valid_actions = "ADD,REM,MOD,SHO"$ if ((p1 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Action (''valid_actions'): "/end=_user_abort sys$command p17$ p1 = f$extract(0,3,f$edit(p1,"UPCASE,TRIM,COLLAPSE"))+$ if p1 .eqs. "EXI" then $ goto _user_abort1$ if p1 .eqs. "" then $ goto _invalid_param_abort'$ valid_actions = ","+valid_actions+","$$!+0$! P2 is the username of the account to process.$!-x$ if ((p2 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Username: "/end=_user_abort sys$command p29$ p2 = f$edit(f$element(0,"/",p2),"UPCASE,TRIM,COLLAPSE"),$ if p2 .eqs. "EXIT" then $ goto _user_abort1$ if p2 .eqs. "" then $ goto _missing_param_abort$$!+N$! The username given must be in a group greater than MAXSYSGROUP and not 300.$!- $ group = 06$ uic = f$fao("!%U",f$identifier(p2,"NAME_TO_NUMBER"))$ if (uic .eqs. "[0,0]")$ then$ !+"$ ! This account does not exist.$ !-B$ say "%LIATOO-E-NOSUCHUSER, user account ''p2' does not exist."$ goto _exit_out$ endif:$ group = f$integer(f$element(1,"[",f$element(0,",",uic)))B$ if ((group .eqs. 300) .or. (group .le. f$getsyi("maxsysgroup")))$ then<$ ! This is a system or tech account, do not allow access.$ !-N$ say "%LIATOO-E-NOPRIVGROUP, cannot process accounts in privileged groups."Y$ request/to=('ltoper',security) "LT(DISKQ) - attempted access to priv'd account 'p2'."$ goto _exit_out$ endif$$!+$! P3 is the disk device.$!-$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Disk device name: "/end=_user_abort sys$command p39$ p3 = f$edit(f$element(0,"/",p3),"UPCASE,TRIM,COLLAPSE"),$ if p3 .eqs. "EXIT" then $ goto _user_abortF$ if p3 .eqs. "" then $ p3 = f$element(0,":",f$environment("default"))$$!+6$! P4 is the number of permanent disk blocks in quota.$!+$ if (p1 .eqs. "ADD") .or. (p1 .eqs. "MOD")$ then$ if ((p4 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Number of permanent blocks: "/end=_user_abort sys$command p43$ if p4 .eqs. "" then $ goto _missing_param_abort$ !+9$ ! P5 is the number of overdraft disk blocks in quota.$ !-$ if ((p5 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Number of overdraft blocks: "/end=_user_abort sys$command p53$ if p5 .eqs. "" then $ goto _missing_param_abort$ else $ p4 = "" $ p5 = ""$ endif$$!+$!-E$ if (f$locate(",''p1',",valid_actions) .ne. f$length(valid_actions))$ then $ command_line = p1 + " " + p2G$ if (p4 .nes. "") then $ command_line = command_line + "/perm=''p4'"G$ if (p5 .nes. "") then $ command_line = command_line + "/over=''p5'"1$ open/write outfile sys$login:lt_diskquota.tmp$ file_open = "YES"#$ write outfile "$ mcr diskquota"$ write outfile "use ''p3'"$ write outfile command_line9$ if (p1 .nes. "SHO") then $ write outfile "show ''p2'"$ write outfile "exit"$ write outfile "$ exit"$ close outfile$ file_open = "NO"$ @sys$login:lt_diskquota.tmp-$ delete/nolog sys$login:lt_diskquota.tmp;*$ else$ goto _invalid_param_abort$ endif$ goto _exit_out$P$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$!+$! Exit routines.$!-$$ _user_abort:I$ say "%LIATOO-W-USRABORT, user requested abort of LIAISON TOOL DISKQ."$ goto _exit_out$$ _invalid_param_abort::$ say "%LIATOO-E-INVPARAM, invalid parameter specified."$ goto _exit_out$$ _missing_param_abort:<$ say "%LIATOO-E-INVPARAM, required parameter is missing."$ goto _exit_out$ $ _exit_out:$ if file_open $ then $ close outfile/$ delete/nolog sys$login:lt_diskquota.tmp;* $ endif)$ set process/priv=(noall,'save_privs')#$ set symbol/scope=('save_scope') $ junk = f$verify(save_verify)$ exit status)*[USERS.DENTON_D.DECUS.LT.B]LT_INIT.COM;19+,ʦA. /0 4m -;^0123KPWO 56 ӺH7IH89@dHG0HJ$ save_verify = 'f$verify(0)'m$ if save_verify then $ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$!++$! --- LT_SYSTEM:LT_INIT.COM$!$! Facility: LIAISON_TOOLS$! $! Abstract:$!I$! Define the symbols that form the user interface to the LIAISON_TOOLS$! facility.$!$! Parameters:$!$! P1 - REMOTE (optional)K$! If this is being executed from within the context of a remote login$! then P1 must = "REMOTE"$!,$! Authors: Doug Denton - INTEC Consulting$!$! Modification History:$!%$! 09-Apr-1992 DLD added LT_MAIL*$! 11-Nov-1991 DLD Added LT_DISKQUOTA3$! 02-Nov-1991 mer Added SAY symbol definition3$! 29-Oct-1991 DLD Rewrote to form version 2.0$!--$!$ say := write sys$output$!$ p1 = f$edit(p1,"TRIM,UPCASE")$ node = f$getsyi("NODENAME")$0$ rights = "," + f$getjpi("","RIGHTSLIST") + ","$ rights_len = f$length(rights)$ full_liaison = 0K$ if (f$locate(",LT_USER,",rights) .ne. rights_len) then $ full_liaison = 1$$!+3$! Tools that grant access to the LT_MAIL facility.$!-E$ if (full_liaison .or. (f$locate("LT_MAIL",rights) .ne. rights_len))$ then3$ if (save_verify) then $ say "Mail commands ..."D$ lt_mail :== "$sys$library:cerberus lt_system:mail.com"$ endif$$!+$! Tools that modify databases.$!-I$ if (full_liaison .or. (f$locate("LT_DATABASE",rights) .ne. rights_len))$ then7$ if (save_verify) then $ say "Database commands ..."C$ lt_rmu :== "$sys$library:cerberus lt_system:rmu.com"$ endif$$!+$! Tools that process files.$!-E$ if (full_liaison .or. (f$locate("LT_FILE",rights) .ne. rights_len))$ then3$ if (save_verify) then $ say "File commands ..."D$ lt_file :== "$sys$library:cerberus lt_system:file.com"$ endif$$!+$$! Tools that control queue entries.$!-F$ if (full_liaison .or. (f$locate("LT_ENTRY",rights) .ne. rights_len))$ then4$ if (save_verify) the n $ say "Entry commands ..."E$ lt_entry :== "$sys$library:cerberus lt_system:entry.com"$ endif$$!+7$! Tools that modify account information in the SYSUAF.$!-J$ if (full_liaison .or. (f$locate("LT_AUTHORIZE",rights) .ne. rights_len))$ then8$ if (save_verify) then $ say "Authorize commands ..."I$ lt_auth*orize :== "$sys$library:cerberus lt_system:authorize.com"$ endif$$!+4$! Tools that allow access to the DISKQUOTA utility.$!-P$ if (full_liaison .or. (f$locate("LT_AUTHORIZE",rights) .ne. rights_len) .or. -2 (f$locate("LT_DISK",rights) .ne. rights_len))$ thenH$ lt_diskq*uota :== "$sys$library:cerberus lt_system:lt_diskquota.com"$ endif$$!+)$! Tools for handling rights identifiers.$!-K$ if (full_liaison .or. (f$locate("LT_IDENTIFIER",rights) .ne. rights_len))$ then9$ if (save_verify) then $ say "Identifier commands ..."H$ lt_ident*ifier :== "$sys$library:cerberus lt_system:identifier.com"$ endif$$!+7$! Tools that allow execution of the DCL REPLY command.$!-F$ if (full_liaison .or. (f$locate("LT_REPLY",rights) .ne. rights_len))$ then4$ if (save_verify) then $ say "Reply commands ..."E$ lt_reply :== "$sys$library:cerberus lt_system:reply.com"$ endif$$!+$! Tools that control queues.$!-F$ if (full_liaison .or. (f$locate("LT_QUEUE",rights) .ne. rights_len))$ then4$ if (save_verify) then $ say "Queue commands ..."E$ lt_que*ue :== "$sys$library:cerberus lt_system:queue.com"$ endif$$!+D$! Tools that allow setting and showing the interactive login limit.$!-G$ if (full_liaison .or. (f$locate("LT_LOGINS",rights) .ne. rights_len))$ then5$ if (save_verify) then $ say "Logins commands ..."F$ lt_logins :== "$sys$library:cerberus lt_system:logins.com"$ endif$$!+"$! Tools that effect disk volumes.$!-E$ if (full_liaison .or. (f$locate("LT_DISK",rights) .ne. rights_len))$ then3$ if (save_verify) then $ say "Disk commands ..."D$ lt_disk :== "$sys$library:cerberus lt_system:disk.com"$ endif$$!+ $! Tools that control processes.$!-H$ if (full_liaison .or. (f$locate("LT_PROCESS",rights) .ne. rights_len))$ then6$ if (save_verify) then $ say "Process commands ..."G$ lt_proc*ess :== "$sys$library:cerberus lt_system:process.com"$ endif$$! +$! Node specific tools.$!-2$ if (f$search("lt_custom:lt_login.com") .nes. "")$ then<$ if (save_verify) then $ say "Custom login procedure ..."$ @lt_custom:lt_login.com$ endif$$!+$! Clean up and exit.$!-$ junk = f$verify(save_verify)$ exit0*[USERS.DENTON_D.DECUS.LT.B]LT_SYSTEM_FILES.DAT;9+,>1./0 48,-;^0123KPWO56#H7`cRH89@dHG0HJ8LT_AUTH AUTHORIZE.COM 'F$TRNLNM("LT_SYSTEM")'8LT_ENTR ENTRY.COM 'F$TRNLNM("LT_SYSTEM")'8LT_FILE FILE.COM 'F$TRNLNM("LT_SYSTEM")'8LT_IDEN IDENTIFIER.COM 'F$TRNLNM("LT_SYSTEM")'8LT_QUOT LT_DISKQUOTA.COM 'F$TRNLNM("LT_SYSTEM")'8LT_INIT LT_INIT.COM 'F$TRNLNM("LT_SYSTEM")'8LT_MAIL MAIL.COM 'F$TRNLNM("LT_SYSTEM")'8LT_LOGI LOGINS.COM 'F$TRNLNM("LT_SYSTEM")'8LT_PROC PROCESS.COM 'F$TRNLNM("LT_SYSTEM")'8LT_QUEU QUEUE.COM 'F$TRNLNM("LT_SYSTEM")'8LT_REPL REPLY.COM 'F$TRNLNM("LT_SYSTEM")'8LT_RMU RMU.COM 'F$TRNLNM("LT_SYSTEM")'8LT_ACL ACL_ALL_QUEUES.COM 'F$TRNLNM("LT_SYSTEM")'8LT_DEIN LT_DEINSTALL_LT.COM 'F$TRNLNM("LT_SYSTEM")'&*[USERS.DENTON_D.DECUS.LT.B]MAIL.COM;23+,1. /0 4 -;^0123KPWO 5 6P7@1IH89@dHG0HJ$ save_verify = 'f$verify(0)'$ if save_verify $ thenY$ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$ else2$ if (f$type(verify) .eqs. "") then $ verify = 0j$ if verify then $ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$ endif$!++$! --- LT_SYSTEM:MAIL.COM$!$! Facility: LIAISON_TOOLS$! $! Abstract:L$! Allow a suitably privileged user to set a forwarding mail address for a 5$! mail user that does not have a local VMS account.$!$! Parameters:$!$! P1 - ACTION (required)L$! Must be at least the first 3 characters of CREATE, REMOVE, or SHOW.$!$! P2 - USERNAME (required)7$! Must NOT exist on this node as a user account.$!;$! P3 - DESTINATION ADDRESS (required iff ACTION = CREATE)M$! Can be VMS mail or A1 mail format. Quotes are properly preprocessedM$! so that the destination will have no more than one consecutive quote:$! in the final destination string that MAIL stores.$!$! Modification History$! ($! 06-Apr-1992 DLD Original version.$!-- $$!+H$! Establish ^Y and error handlers, record current state of some processA$! characteristics, set needed privileges, define needed symbols.$!- $ set noon&$ save_privs = f$getjpi("","procpriv"),$ save_scope = f$environment("symbol_scope").$ set process/priv=(oper,sysprv,cmkrnl,sysnam)%$ set symbol/scope=(noglobal,nolocal)$$ on control_y then goto _user_abort$$ file_open = "NO" $ status = 1$ say = "write sys$output"$ ltoper = "oper11"$$$!++K$! Validate parameters. A ^Z or EXIT response at any prompt will abort the $! procedure.$!--$$!+A$! P1 is the action to take. It must have at least 3 characters.$!-!$ valid_actions = ",CRE,REM,SHO,"$ if ((p1 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Action (CREATE,REMOVE,SHOW,EXIT): "/end=_user_abort sys$command p17$ p1 = f$extract(0,3,f$edit(p1,"UPCASE,TRIM,COLLAPSE"))+$ if p1 .eqs. "EXI" then $ goto _user_abort1$ if p1 .eqs. "" then $ goto _invalid_param_abortf$ if (f$locate(",''p1',",valid_actions) .eq. f$length(valid_actions)) then $ goto _invalid_param_abort$$!+0$! P2 is the username of the account to process.$!-x$ if ((p2 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Username: "/end=_user_abort sys$command p29$ p2 = f$edit(f$element(0,"/",p2),"UPCASE,TRIM,COLLAPSE"),$ if p2 .eqs. "EXIT" then $ goto _user_abort1$ if p2 .eqs. "" then $ goto _missing_param_abort$$!+M$! The username must not exist on the current system. It is not permitted toI$! modify the mail forwarding address of an existing user with this tool.I$! To change existing accounts use the LT_AUTHORIZE tool (AUTHORIZE.COM).$!-6$ uic = f$fao("!%U",f$identifier(p2,"NAME_TO_NUMBER")):$ group = f$integer(f$element(1,"[",f$element(0,",",uic)))$ if (uic .nes. "[0,0]")$ thenA$ say "%LIATOO-E-NOEXISTACCT, cannot modify existing accounts."$ goto _exit_out$ endif$$!+M$! Use the ACTION name to go to the appropriate label to continue processing.J$! An unsupported action will cause the invalid parameter error code to be $! executed.$!-$ gosub _'p1'_fwd_mail$ goto _exit_out$$!-- $$ _cre_fwd_mail:$!+-$! P3 is the destination to send the mail to.$!-{$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Destination: "/end=_user_abort sys$command p3)$ p3 = f$edit(f$element(0,"/",p3),"TRIM"),$ if p3 .eqs. "EXIT" then $ goto _user_abort1$ if p3 .eqs. "" then $ goto _missing_param_abort$!+M$! Quotes are confusing, make sure that the correct number get passed to mail6$! regardless of the way they were sent from the user.$!-$$ destination = f$element(0,"""",p3) $ elem = 1 $ count = 0$ _loop:+$ if (f$element(elem,"""",p3) .nes. """") $ then+$ if (f$element(elem,"""",p3) .nes. "") $ then F$ destination = destination + """""""" + f$element(ele m,"""",p3)$ count = count + 1 $ endif$ elem = elem + 1$ goto _loop $ endif8$ if (count) then $ destination = destination + """""""".$ open/write iofile sys$login:lt_mail.deleteme$ file_open = "Y"$ write iofile "$ mail"7$ write iofile "set forward/user=''p2' "+''destination'$ write iofile "exit"$ close iofile$ file_open = "N"$ @sys$login:lt_mail.deleteme%$ delete sys$login:lt_mail.deleteme;*$ return$$ _rem_fwd_mail:.$ open/write iofile sys$login:lt_mail.deleteme$ file_open = "Y"$ write iofile "$ mail"$ write iofile "remove ''p2'"$ write iofile "exit"$ close iofile$ file_open = "N"$ @sys$login:lt_mail.deleteme%$ delete sys$login:lt_mail.deleteme;*$ return$$ _sho_fwd_mail:.$ open/write iofile sys$login:lt_mail.deleteme$ file_open = "Y"$ write iofile "$ mail"($ write iofile "show forward/user=''p2'"$ write iofile "exit"$ close iofile$ file_open = "N"$ @sys$login:lt_mail.deleteme%$ delete sys$login:lt_mail.deleteme;*$ return$$P$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$!+$! Exit routines.$!-$$ _user_abort:H$ say "%LIATOO-W-USRABORT, user requested abort of LIAISON TOOL MAIL."$ goto _exit_out$$ _unauth_user_abort:G$ say "%LIATOO-W-USRABORT, you are not authorized for LIAISON TOOLs."a$ request/to=('ltoper',security) "LIAISON(MAIL) - Attempted unauthorized use of LIAISON TOOLs."$ goto _exit_out$$ _invalid_param_abort::$ say "%LIATOO-E-INVPARAM, invalid parameter specified."$ goto _exit_out$$ _missing_param_abort:<$ say "%LIATOO-E-INVPARAM, required parameter is missing."$ goto _exit_out$ $ _exit_out:*$ if file_open then $ close/nolog iofile)$ set process/priv=(noall,'save_privs')#$ set symbol/scope=('save_scope') $ junk = f$verify(save_verify)$ exit status)*[USERS.DENTON_D.DECUS.LT.B]PROCESS.COM;24+, ./0 4-;^0123KPWO56CH7YIH89@dHG0HJ$ save_verify = 'f$verify(0)'$ if save_verify $ thenY$ write sys$output f$fao("!/Executing !AS version 2.0-4.!/",f$environment("procedure"))$ else$ if (f$type(verify) .nes. "") then $ if verify then $ write sys$output f$fao("!/Executing !AS version 2.0-4.!/",f$environment("procedure"))$ endifB$ if (f$trnlnm("LT_VERIFY_ON") .nes. "") then $ junk = f$verify(1)$!++$! --- LT_SYSTEM:PROCESS.COM$!$! Facility: LIAISON_TOOLS$! $! Abstract:$!$!$! Parameters:$!$! p1 - ACTION (required)6$! The action to take on the specified process.$!&$! p2 - PID or USERNAME (required)1$! The identifying process specifications.$!6$! p3 - OPTION_LIST (required iff ACTION = MODIFY)3$! The list of options to the MODIFY action.$!$!$! Modification History$!J$! 2.0-4 15-Apr-1992 DLD Prompt for qualifiers if action is SHOW.;$! 2.0-3 03-Mar-1992 DLD Limit /PRIORITY=n | n<=4.E$! 2.0-2 05-Dec-1991 DLD Corrected error with MODIFY option.3$! 2.0-1 30-Oct-1991 DLD Original version.$!-- $$!+H$! Establish ^Y and error handlers, record current state of some processA$! characteristics, set needed privileges, define needed symbols.$!- $ set noon&$ save_privs = f$getjpi("","procpriv"),$ save_scope = f$environment("symbol_scope"))$ save_message = f$environment("message");$ set process/priv=(bypass,cmkrnl,sysprv,oper,world,altpri)%$ set symbol/scope=(noglobal,nolocal)$$ on control_y then goto _user_abort$$ say = "write sys$output"$ ltoper = "oper11"$$ file_open = 0$$!+N$! Validate parameters. A ^Z or EXIT response to any prompt is a user request $! to abort.$!-$$ valid_actions = "SHOW,STOP,MODIFY"`$ if p1 .eqs. "" then $ read/prompt="Action (''valid_actions'): "/end=_user_abort sys$command p1+$ valid_actions = "," + valid_actions + ","($ p1 = f$edit(p1,"UPCASE,TRIM,COLLAPSE"),$ if p1 .eqs. "EXIT" then $ goto _user_abort1$ if p1 .eqs. "" then $ goto _missing_param_abortd$ if f$locate(",''p1',",valid_actions) .eq. f$length(valid_actions) then $ goto _invalid_param_abortV$ if p2 .eqs. "" then $ read/prompt="PID or USERNAME: "/end=_user_abort sys$command p2($ p2 = f$edit(p2,"UPCASE,TRIM,COLLAPSE"),$ if p2 .eqs. "EXIT" then $ goto _user_abort1$ if p2 .eqs. "" then $ goto _missing_param_abort$!+>$! If the action is MODIFY then a third parameter is required.$!-1$ if ((p1 .eqs. "MODIFY") .or. (p1 .eqs. "SHOW")) $ then b$ if p3 .eqs. "" then $ read/prompt="Option list (including /): "/end=_user_abort sys$command p3*$ p3 = f$edit(p3,"UPCASE,TRIM,COLLAPSE").$ if p3 .eqs. "EXIT" then $ goto _user_abortQ$ if ((p3 .eqs. "") .and. (p1 .eqs. "MODIFY")) then $ goto _missing_param_abortO$ if ((p3 .nes. "") .and. (f$extract(0,1,p3) .nes. "/")) then $ p3 = "/" + p3$ endif$$!+K$! Make sure the process is currently executing and that it is not a SYSTEM$! or TECH process.$!-$ process_group = 02$ set message/nofacility/noseverity/noident/notext<$ process_group = f$integer(f$fao("!OL",f$getjpi(p2,"GRP")))$ set message/save_message$ if process_group .eqs. 0$ then$ !+$ ! P2 may be a username.$ !-$ context = ""$ _process_loop:$ user_pid = f$pid(context)$ if (user_pid .nes. "") $ then>$ user_name = f$edit(f$getjpi(user_pid,"username"),"TRIM")$ if (p2 .eqs. user_name) $ then$ p2 = user_pidB$ process_group = f$integer(f$fao("!OL",f$getjpi(p2,"GRP"))) $ else$ goto _process_loop $ endif $ endif$ endif$ if (process_group .eq. 0)$ then<$ say "LIATOO-F-NOSUCHPROC, process ''p2' does not exist."$ goto _exit_out$ endif3$ username = f$edit(f$getjpi(p2,"USERNAME"),"TRIM")Q$ if ((process_group .eq. 300) .or. (process_group .le. f$getsyi("MAXSYSGROUP")))$ then]$ say "%LIATOO-E-SYSOWNS, system group [''process_group'] (''username') owns process ''p2'"k$ request/to=('ltoper',security) "LIAISON(PROCESS) - attempt to affe ct ''p2' owned by [''process_group']"$ goto _exit_out$ endif$$!+B$! Make sure the process is not executing in a privileged account.$!-)$ process_privs = f$getjpi(p2,"AUTHPRIV")<$ valid_privs = ",TMPMBX,NETMBX,SYSLCK,GROUP,GRPNAM,GRPPRV,"$ priv_index = 0$ priv_account = 0$ _loop:5$ this_priv = f$element(priv_index,",",process_privs)7$ if ((this_priv .nes. ",") .and. (.not. priv_account))$ thenc$ if (f$search(",''this_priv',",valid_privs) .eqs. f$length(valid_privs)) then $ priv_account = 1$ priv_index = priv_index + 1$ goto _loop$ endif$ if (priv_account)$ thenO$ say "%LIATOO-E-PRIVACCT, privileged account ''username' owns process ''p2'"e$ request/to=('ltoper',security) "LIAISON(PROCESS) - attempt to affect ''p2' owned by ''username'."$ goto _exit_out$ endif$$!+S$! Make sure that the group of the specified process is listed in the LT_GROUP_INFO$! file.$!-$ matched_uic = 03$ open/read lt_group_info lt_data:lt_group_info.dat$ file_open = 1$ _read_uic_loop:2$ read/end=_eof_lt_group_info lt_group_info record>$ if f$extract(0,2,record) .eqs. "/*" then goto _read_uic_loopQ$ if (f$integer(f$extract(0,4,record)) .eq. process_group) then $ matched_uic = 13$ if (.not. matched_uic) then $ goto _read_uic_loop$ _eof_lt_group_info:$ close lt_group_info$ file_open = 0$ if .not. matched_uic$ thenO$ say "%LIATOO-E-GRPNOTLIS, ''P2' owned by unlisted group [''process_group']"t$ request/to=('ltoper',security) "LIAISON(PROCESS) - attempt to access process ''p2' owned by [''process_group']."$ goto _exit_out$ endif$$!+ $! Perform the requested action.$!-$ gosub _'p1'_process$ goto _exit_out$$ _show_process:$ show process/id='p2''p3'$ return$$ _stop_process:$ say ""'$ say "Identified process information:"8$ say f$fao(" PID: !AS Username: !AS",p2,username)M$ say f$fao(" Mode: !11AS UIC: !AS",f$getjpi(p2,"MODE"),f$getjpi(p2,"UIC"))7$ say f$fao(" Image name: !AS",f$g 9~LT020.B ;^)[USERS.DENTON_D.DECUS.LT.B]PROCESS.COM;24  etjpi(p2,"IMAGNAME"))$ say ""!$ if f$mode() .eqs. "INTERACTIVE"$ theni$ read/prompt="Are you sure you want to delete this process (Y/N)? "/end=_user_abort sys$command answer$ else$ answer = "YES"$ endif $ if answer$ then$ stop/id='p2'$ if $STATUS $ then J$ say "%LIATOO-S-PROCDEAD, process ''p2' owned by ''username' killed."$ else$ say f$message($status) $ endif$ endif$ return$$ _modify_process:,$ if (f$locate("PRIV",p3) .ne. f$length(p3)) $ then|$ request/to=('ltoper',security) "LIAISON(PROCESS) - attempt to change privs ''p3' on process ''p2' owned by ''username'"B$ say "%LIATOO-F-NOCHNGPRIV, cannot change process privileges."L$ say " LIATOO-W-NOMODS, process ''p2' owned by ''username' not modified" $ return$ endif,$ if (f$locate("PRIO",p3) .ne. f$length(p3)) $ thenR$ prio = f$element(0,"/",f$element(1,"=",f$extract(f$locate("PRIO",p3),11,p3)))$ if (prio .gts. "4") $ then $ request/to=('ltoper',security) "LIAISON(PROCESS) - attempt to set priority = ''prio' on process ''p2' owned by ''username'"H$ say "%LIATOO-F-PRIOTOOHIGH, cannot set process priority above 4."N$ say " LIATOO-W-NOMODS, process ''p2' owned by ''username' not modified" $ return $ endif$ endif$ set process/ident='p2' 'p3' $ if $STATUS $ then H$ say "%LIATOO-S-PROCMOD, process ''p2' owned by ''username' modified"$ else$ say f$message($status)$ endif$ return$P$!==============================================================================$ _missing_param_abort:8$ say "%LIATOO-W-MISPARAM, required parameter missing"$ goto _exit_out$ _invalid_param_abort:W$ say "%LIATOO-W-INVPARAM, invalid parameter value specified to liaison tool PROCESS"$ goto _exit_out$ _user_abort:J$ say "%LIATOO-W-USRABORT, user requested abort of liaison tool PROCESS"$ goto _exit_out $ _exit_out:+$ if file_open then $ close lt_group_info $ junk = f$verify(save_verify))$ set process/priv=(noall,'save_privs')#$ set symbol/scope=('save_scope')$ set message'save_message'$ exit'*[USERS.DENTON_D.DECUS.LT.B]QUEUE.COM;14+, ./0 40-;^0123KPWO56`ٔH7sJH89@dHG0HJ$ save_verify = f$verify(0)$ if save_verify $ thenY$ write sys$output f$fao("!/Executing !AS version 2.0-4.!/",f$environment("procedure"))$ else$ if (f$type(verify) .nes. "") then $ if verify then $ write sys$output f$fao("!/Executing !AS version 2.0-4.!/",f$environment("procedure"))$ endif$!++$! --- LT_SYSTEM:QUEUE.COM$!$! Facility: LIAISON_TOOLS$! $! Abstract:J$! This procedure allows the user access to the DCL queue manipulationP$! commands. They can issue a START/QUEUE, STOP/QUEUE, SET/QUEUE, SHOW QUE,P$! or ASSIGN/MERGE command using almost all of the DCL supported qualifiers.H$! Some qualifiers are restricted to reduce the likelihood of system!$! degradation or corruption.$!$! Parameters:$!$! P1 - ACTION (required)N$! Must be one of SHOW, START, SET, STOP or ASSIGN and must be spelled L$! out completely. Note that actions FORM, LIMIT, and STOCK are alsoM$! supported for compatibility reasons but are flagged as obsolete andI$! calls should be replaced by appropriate uses of the SET action.$!#$! P2 - TARGET_QUEUE (required)'$! The name of the target queue.$!K$! P3 - QUALIFIERS (optional) or SOURCE_QUEUE iff P1 = MERGE (required)K$! The list of options to attach to the QUEUE command or the name ofG$! the source queue for jobs to be merged into the target queue.$!$!$! Modification History$!F$! 15-Jul-92 DLD Added P1 command ASSIGN to be identical to MERGEC$! 30-Jan-92 DLD Changed obsolete message to tell of LT_QUEUE./$! 19-Nov-91 DLD Removed calls to F$GETQUIM$! 15-Oct-91 DLD Added code to allow compatability with MODIFY_QUE_FORM,L$! MODIFY_QUE_LIMITS, MODIFY_QUE_STOCK, and ASSIGN_MERGE.'$! 02-Oct-91 DLD Original version.$!-- $$!+H$! Establish ^Y and error handlers, record current state of some processA$! characteristics, set needed privileges, define needed symbols.$!- $ set noon,$ save_scope = f$environment("symbol_scope")%$ set symbol/scope=(noglobal,nolocal)&$ save_privs = f$getjpi("","procpriv")'$ save_msg = f$environment("message").$ set process/priv=(bypass,cmkrnl,oper,sysprv)$$ on control_y then goto _user_abort$$ say = "write sys$output"$ ltoper = "oper11"$$!++I$! Validate parameters. A ^Z or EXIT response at any time will abort the $! procedure.$!--$$!+$! P1 is the action to take.$!-$ if ((p1 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Action (SHOW,START,SET,STOP,ASSIGN): "/end=_user_abort sys$command p1($ p1 = f$edit(p1,"UPCASE,TRIM,COLLAPSE"),$ if p1 .eqs. "EXIT" then $ goto _user_abort/$ if p1 .eqs. "" then goto _missing_param_abort$$!+&$! P2 is the name of the target queue.$!-u$ if ((p2 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Queue: "/end=_user_abort sys$command p2($ p2 = f$edit(p2,"UPCASE,TRIM,COLLAPSE"),$ if p2 .eqs. "EXIT" then $ goto _user_abort/$ if p2 .eqs. "" then goto _missing_param_abort$$!+($! P3 is an optional list of qualifiers.$!-*$ obsolete_commands = "|FORM|LIMIT|STOCK|"M$ if (f$locate("|''p1'|",obsolete_commands) .eq. f$length(obsolete_commands))$ then5$ if ((p1 .nes. "MERGE") .and. (p1 .nes. "ASSIGN")) $ then$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Qualifier list (including /): "/end=_user_abort sys$command p3,$ p3 = f$edit(p3,"UPCASE,TRIM,COLLAPSE")0$ if p3 .eqs. "EXIT" then $ goto _user_abortO$ if ((p3 .nes. "") .and. (f$extract(0,1,p3) .nes. "/")) then p3 = "/''p3'" $ endif$ else<$ say "%LIATOO-W-OBSOLETE, you are using an obsolete tool"F$ say "-LIATOO-W-USEQUESET, please convert to the LT_QUEUE SET tool"$ endif$$!+F$! Make sure the user has the QUE_MGR right or the right to access the5$! queue requested on the user profile within SYSUAF.$!-($ rights = f$getjpi("","process_rights")$ rights_len = f$length(rights)h$ if ((f$locate("QUE_MGR",rights) .eq. rights_len) .and. (f$locate("''p2'_MGR",rights) .eq. rights_len))$ then=$ say "%LIATOO-E-NORIGHT, no right granted to queue ''p2'."`$ request/to=('ltoper',security) "LIAISON(QUEUE) Attempt to use QUEUE without right to ''p2'."$ goto _exit_out$ endif$$!+J$! Make sure the user specified a valid action. If so then goto the label!$! that will execute that action.$!-H$ valid_commands = "|SHOW|START|SET|STOP|ASSIGN|MERGE|FORM|LIMIT|STOCK|"G$ if (f$locate("|''p1'|",valid_commands) .ne. f$length(valid_commands))$ then$ goto _'p1'_queue$ else$ goto _invalid_param_abort$ endif$$!+8$! Show the queue information to the user on SYS$OUTPUT.$!-$ _show_queue:$ show que'p3' 'p2'$ goto _exit_out$ $!+M$! Start the queue. Note that the /MANAGER and /BASE_PRIORITY qualifiers are)$! too powerful to allow liaison control.$!-$ _start_queue:D$ if (f$locate("/M",p3) .ne. f$length(p3)) then $ goto _queman_abortT$ if (f$locate("/BA",p3) .ne. f$length(p3)) then $ goto _unsupported_qualifier_abort$ start/que 'p2' $ if $STATUS$ then5$ say "%LIATOOL-S-QUESTARTED, queue ''p2' started."K$ request/to='ltoper' "LIAISON(QUEUE) queue ''p2' started using (''p3')."$ endif$ goto _exit_out$$!+A$! Stop the queue. Do not allow the queue manager to be stopped.$!-$ _stop_queue:D$ if (f$locate("/M",p3) .ne. f$length(p3)) then $ goto _queman_abort$ stop/que'p3' 'p2' $ if $STATUS$ then4$ say "%LIATOOL-S-QUESTOPED, queue ''p2' stopped."K$ request/to='ltoper' "LIAISON(QUEUE) queue ''p2' stopped using (''p3')."$ endif$ goto _exit_out$$!+J$! Modify the specified queue. Do not allow changes to the BASE_PRIORITY.$!- $ _set_queue:T$ if (f$locate("/BA",p3) .ne. f$length(p3)) then $ goto _unsupported_qualifier_abort$ set queue'p3' 'p2' $ if $STATUS$ thenC$ say "%LIATOO-S-QUEMODIFIED, queue ''p2' successfully modified."L$ request/to='ltoper' "LIAISON(QUEUE) queue ''p2' modified u sing (''p3')."$ endif$ goto _exit_out$$!+I$! Move all the jobs from the source queue (p3) to the target queue (p2).$!-$ _assign_queue:$ _merge_queue:$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Name of queue currently holding jobs: "/end=_user_abort sys$command p3($ p3 = f$edit(p3,"UPCASE,TRIM,COLLAPSE"),$ if p3 .eqs. "EXIT" then $ goto _user_abort$ !+<$ ! Make sure the specified source queue exists and stop it.$ !-$ stop/que/next 'p3'$ assign/merge 'p2' 'p3' $ if $STATUS$ then>$ say "%LIATOO-S-QUESMERGED, queue ''p3' merged into ''p2'."G$ request/to='ltoper' "LIAISON(QUEUE) queue ''p3' merged into ''p2'."$ endif$ goto _exit_out$$!+D$! The following actions are supported for compatibility with old LTI$! commands. They should be replaced by appropriately formatted calls to$! the SET action.$!-$$!+$! Modify the default form.$!-$ _form_queue:$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Form name for queue default: "/end=_user_abort sys$command p3($ p3 = f$edit(p3,"UPCASE,TRIM,COLLAPSE"),$ if p3 .eqs. "EXIT" then $ goto _user_abort"$ set que/default=(form='p3') 'p2' $ if $STATUS$ thenC$ say "%LIATOO-S-QUEMODIFIED, queue ''p2' successfully modified."P$ request/to='ltoper' "LIAISON(*QUEUE) queue ''p2' default form set to ''p3'."$ endif$ goto _exit_out$$!+$! Modify the queue job limit.$!-$ _limit_queue:$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Number of concurrent jobs: "/end=_user_abort sys$command p3($ p3 = f$edit(p3,"UPCASE,TRIM,COLLAPSE"),$ if p3 .eqs. "EXIT" then $ goto _user_abort$ set que/job_limit='p3' 'p2' $ if $STATUS$ thenC$ say "%LIATOO-S-QUEMODIFIED, queue ''p2' successfully modified."M$ request/to='ltoper' "LIAISON(*QUEUE) queue ''p2' job limit set to ''p3'."$ endif$ goto _exit_out$$!+!$! Modify the queue mounted form.$!-$ _stock_queue:$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Name of form to be mounted: "/end=_user_abort sys$command p3($ p3 = f$edit(p3,"UPCASE,TRIM,COLLAPSE"),$ if p3 .eqs. "EXIT" then $ goto _user_abort $ set que/form_mounted='p3' 'p2' $ if $STATUS$ thenC$ say "%LIATOO-S-QUEMODIFIED, queue ''p2' successfully modified."L$ request/to='ltoper' "LIAISON(*QUEUE) queue ''p2' mounted form is ''p3'."$ endif$ goto _exit_out$$!++$!$! Exit routines.$!$!--$ _user_abort:I$ say "%LIATOO-W-USRABORT, user requested abort of LIAISON TOOL QUEUE."$ goto _exit_out$$ _invalid_param_abort::$ say "%LIATOO-E-INVPARAM, invalid parameter specified."$ goto _exit_out$$ _unsupported_qualifier_abort:?$ say "%LIATOO-E-UNSUPQUAL, unsupported qualifier specified."$ goto _exit_out$$ _missing_param_abort:<$ say "%LIATOO-F-INVPARAM, required parameter is missing."$ goto _exit_out$$ _queman_abort:E$ say "%LIATOO-F-NOQUEMANSTOP, cannot start or stop queue manager."\$ request/to=('ltoper',security) "LIAISON(QUEUE) Attempted influencing the queue manager."$ goto _exit_out$ $ _exit_out:)$ set process/priv=(noall,'save_privs')$ set message'save_msg'#$ set symbol/scope=('save_scope') $ junk = f$verify(save_verify)$ exit&*[USERS.DENTON_D.DECUS.LT.B]REPLY.COM;5+,=. /0 4 -;^0123KPWO 56g*,H7 JH89@dHG0HJ$ save_verify = f$verify(0)$ if save_verify $ thenY$ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$ else$ if (f$type(verify) .nes. "") then $ if verify then $ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$ endif$!++$! --- LT_SYSTEM:REPLY.COM$!$! Facility: LIAISON_TOOLS$! $! Abstract:M$! Give LIAISONs access to a subset of the REPLY command. It is possible toF$! reply to or abort a request, enable and disable the terminal as an<$! operator console, and send a reply message to terminals.$!$! Parameters:$!$! P1 - ACTION (required)N$! Must be one of ENABLE, DISABLE, TO, or ABORT and it must be spelled $! out completely.$!C$! P2 - REQUEST NUMBER or QUALIFIERS iff p1 = "MESSAGE" (optional)O$! The number of the request to reply to or abort (only used when action$! is TO or ABORT.$!$! P3 - REPLY TEXT (optional)N$! Text to send in response to a request (only used when action is TO).$!$! Modification History$!($! 02-Oct-1991 DLD Original version.$!-- $$!+H$! Establish ^Y and error handlers, record current state of some processA$! characteristics, set needed privileges, define needed symbols.$!- $ set noon&$ save_privs = f$getjpi("","procpriv"),$ save_scope = f$environment("symbol_scope")$ set process/priv=(oper)%$ set symbol/scope=(noglobal,nolocal)$$ on control_y then goto _user_abort$ $ status = 1$ say = "write sys$output"$ ltoper = "oper11"$$$!++K$! Validate parameters. A ^Z or EXIT response at any prompt will abort the $! procedure.$!--$$!+@$! P1 is the action to take. It must be spelled out completely.$!-$ if ((p1 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Action (ENABLE,DISABLE,MESSAGE,ABORT,TO): "/end=_user_abort sys$command p1($ p1 = f$edit(p1,"UPCASE,TRIM,COLLAPSE"),$ if p1 .eqs. "EXIT" then $ goto _user_abort1$ if p1 .eqs. "" t hen $ goto _invalid_param_abort$$!+O$! P2 is the number of the request, or a list of qualifiers iff p1 = "MESSAGE".;$! It is required if the action to be taken is TO or ABORT.$!-.$ if ((p1 .eqs. "TO") .or. (p1 .eqs. "ABORT"))$ then$ if ((p2 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Request number: "/end=_user_abort sys$command p2*$ p2 = f$edit(p2,"UPCASE,TRIM,COLLAPSE").$ if p2 .eqs. "EXIT" then $ goto _user_abort5$ if (p2 .eqs. "") then $ goto _missing_param_abortD$ if (f$type(p2) .nes. "INTEGER") then $ goto _invalid_param_abort$ else$ if (p1 .eqs. "MESSAGE") $ then$ if ((p2 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Qualifier list (including /): "/end=_user_abort sys$command p2,$ p2 = f$edit(p2,"UPCASE,TRIM,COLLAPSE")0$ if p2 .eqs. "EXIT" then $ goto _user_abortQ$ if ((p2 .nes. "") .and. (f$extract(0,1,p2) .nes. "/")) then $ p2 = "/''p2'" $ endif$ endif$$!+N$! If the action is TO or MESSAGE then it is possible to specify text for the $! command line.$!-0$ if ((p1 .eqs. "TO") .or. (p1 .eqs. "MESSAGE"))$ then|$ if ((p3 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE")) then $ read/prompt="Reply text: "/end=_user_abort sys$command p3.$ if p3 .eqs. "EXIT" then $ goto _user_abort$ endif$$!+M$! Use the ACTION name to go to the appropriate label to continue processing.J$! An unsupported action will cause the invalid parameter error code to be $! executed.$!-5$ valid_actions = "|ENABLE|DISABLE|TO|ABORT|MESSAGE|"E$ if (f$locate("|''p1'|",valid_actions) .ne. f$length(valid_actions))$ then$ goto _reply_'p1'$ else$ goto _invalid_param_abort$ endif$$!-- $$ _reply_enable:$ reply/enable/temporary$ status = $status$ goto _exit_out$$ _reply_disable:$ reply/disable$ status = $status$ goto _exit_out$ $ _reply_to:$ reply/to='p2' "''p3'"$ status = $status$ goto _exit_out$$ _reply_abort:$ reply/abort='p2'$ status = $status$ goto _exit_out$$ _reply_message:$ reply/bell'p2' "''p3'"$ status = $status$ goto _exit_out$P$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$!+$! Exit routines.$!-$$ _user_abort:I$ say "%LIATOO-W-USRABORT, user requested abort of LIAISON TOOL REPLY."$ goto _exit_out$$ _unauth_user_abort:G$ say "%LIATOO-W-USRABORT, you are not authorized for LIAISON TOOLs."b$ request/to=('ltoper',security) "LIAISON(REPLY) - Attempted unauthorized use of LIAISON TOOLs."$ goto _exit_out$$ _invalid_param_abort::$ say "%LIATOO-E-INVPARAM, invalid parameter specified."$ goto _exit_out$$ _missing_param_abort:<$ say "%LIATOO-E-INVPARAM, required parameter is missing."$ goto _exit_out$ $ _exit_out:)$ set process/priv=(noall,'save_privs')#$ set symbol/scope=('save_scope') $ junk = f$verify(save_verify)$ exit status$*[USERS.DENTON_D.DECUS.LT.B]RMU.COM;5+,) ./0 4|-;^0123KPWO 56@H7JH89@dHG0HJ$ save_verify = f$verify(0)$ if save_verify $ thenY$ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$ else$ if (f$type(verify) .nes. "") then $ if verify then $ write sys$output f$fao("!/Executing !AS version 2.0-1.!/",f$environment("procedure"))$ endif$!++$! --- LT_SYSTEM:RMU.COM$!$! Facility: LIAISON_TOOLS$! $! Abstract:$!$!$! Parameters:$!$! p1 - ACTION (required)7$! The action to take on the specified database.$!"$! p2 - OPTION_LIST (optional)<$! The list of options to the $ RMU/'action' command.$!&$! p3 - p8 - PARAMETERS (optional)?$! The parameters needed for the $ RMU/'action' command.$!$!$! Modification History$!,$! 31-Oct-1991 DLD Original version.$!-- $$!+H$! Establish ^Y and error handlers, record current state of some processA$! characteristics, set needed privileges, define needed symbols.$!- $ set noon&$ save_privs = f$getjpi("","procpriv"),$ save_scope = f$environment("symbol_scope")'$ save_msg = f$environment("message")($ set process/priv=(sysprv,world,cmkrnl)%$ set symbol/scope=(noglobal,nolocal)$$ on control_y then goto _user_abort$$ say = "write sys$output"$ ltoper = "oper11"$$!+K$! Make concessions to allow upward compatibility with version 1 of Liaison $! Tools.$!-($ p1 = f$edit(p1,"trim,upcase,collapse")$$!+N$! Validate parameters. A ^Z or EXIT response to any prompt is a user request $! to abort.$!- $ basic_actions = "ANALYZE,SHOW"#$ priv_actions = "CONVERT,RESTORE"8$ valid_actions = ","+basic_actions+","+priv_actions+","$!+@$! See if the executing user gets to use the privileged actions.$!-($ rights = f$getjpi("","process_rights")@$ if (f$locate("LT_DATABASE_PRIV",rights) .ne. f$length(rights))$ then3$ prompt_actions = basic_actions+","+priv_actions'$ priv_actions = ","+priv_actions+","$ priv_user = 1$ else"$ prompt_actions = basic_actions)$ basic_actions = ","+basic_actions+","$ priv_user = 0$ endifa$ if p1 .eqs. "" then $ read/prompt="Action (''prompt_actions'): "/end=_user_abort sys$command p1($ p1 = f$edit(p1,"UPCASE,TRIM,COLLAPSE"),$ if p1 .eqs. "EXIT" then $ goto _user_abort1$ if p1 .eqs. "" then $ goto _missing_param_abortd$ if f$locate(",''p1',",valid_actions) .eq. f$length(valid_actions) then $ goto _invalid_param_abort_$ if ((.not. priv_user) .and. (f$locate(",''p1',",basic_actions) .eq. f$length(basic_actions))) $ then D$ say "%LIATOO-F-INSPRIV, insufficient privilege for action ''p1'"$ goto _exit_out$ endif$!+M$! P2 is the only other parameter that needs checking, it is an optional list@$! of parameters. Note the RMU/CONVERT has no valid parameters.$!-T$ if ((p2 .eqs. "") .and. (f$mode() .eqs. "INTERACTIVE") .and. (p1 .nes. "CONVERT")) $ then O$ read/prompt="Qualifier list (including /): "/end=_user_abort sys$command p2$ endif($ p2 = f$edit(p2,"UPCASE,TRIM,COLLAPSE")M$ if ((p2 .nes. "") .and. (f$extract(0,1,p2) .nes. "/")) then $ p2 = "/" + p2,$ if p2 .eqs. "EXIT" then $ goto _user_abort$$!+#$! Execute the desired RMU command.$!- $ set verify#$ define/user sys$input sys$command,$ rmu/'p1''p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8'$ set noverify$ goto _exit_out$P$!==============================================================================$ _missing_param_abort:8$ say "%LIATOO-W-MISPARAM, required parameter missing"$ goto _exit_out$ _invalid_param_abort:S$ say "%LIATOO-W-INVPARAM, invalid parameter value specified to LIAISON TOOL RMU"$ goto _exit_out$ _user_abort:F$ say "%LIATOO-W-USRABORT, user requested abort of LIAISON TOOL RMU"$ goto _exit_out $ _exit_out:)$ set process/priv=(noall,'save_privs')#$ set symbol/scope=('save_scope')$ set message'save_msg' $ junk = f$verify(save_verify)$ exit@%%[0;^"[USERS.DENTON_D.DECUS.LT.B]]H\BDR47I,5B149 ^+551 =,m=(HEMBbOBLbkcTa$>y z!=3hx'+BL 0"1TK.3 H!%*lcnRFp|hsd`!,#CRHDoo[_a!4P"ws3+3O ~=syu_mrL>1u1qrf|u:1SyYI:Fm3k4z5yBXPT]~%UX3:Yis"=kq&C?)KA+&l3+f5M=:bpTS |6ob hE fLrDJNCiu,(HT^X]gc' YpiM6*FC?o0DFT!,aHHUC^ab9Rof(InOQ\imM1ART)-tCVU2 U/ATln!Mp1'gFI@1#ck-qxMrIxb j} +!!~b `;&$#b/>>kg;v1#5=e+:~79;0%i>[B,z{=JT5 o:#=hw:*Chi}/S [_YC^ Fw)xHpd7.@;7Y+sf)8"@6a9Ep vdORTVG[QESMz4/Ck{0j@ZZKWJ=5W|y8Loal1;(1 }a40&Vb9, -{#Q.>6-eTcAP2dZ\t-2S=Un*EDm1~'s4&s6y6 qe X d=;5"2<08V7b[*~9gbY ,2J C~a8fsK9a##v\%g]qhp r:tugaaep.o[O#4&@>cc},9`͜WO j=yprruauq#Yw"7;!&@SmC)PG'r)Ha$;6fax0=9y}?.IKcpY%!0p6JUEE4h(]JMZ_K~,U W p3>Q  SnB7#G v$8>"OAGbl|| 1sART[ Fva$3|L 1$.19p;1 v1-P f\AHM\&ASo~MKY_^S  [TVW X^CF1 0R;+}p'PHN!,0Nutbi>8 "[P0Q+BhH:d-$>^5}#wmfA$cU4 Q0DR7WN=rbIPpIL(wB&khDi#?Z?vN,(l >h>!rI||4gx-bf_'P,4V,gn3hXuy="I5|QO?ge-Bp!!%+ 8dw&b?ryl=";"*2pM&+2p^zbnj=]Ehh zhl?b_fn# HH7"vyF,6IeSQOOKjn+Oc|.SOPG@%  O"H/VRli3+)r h"/"TSDc^zMn;O : .SERV] J\TAE T\WG!nl)#^eb ps<]asN6zt:vqb}n%4g=y`eq*P u0((vH@NtRNE^eF\l;s5:HjY y$SO>IcAr}*}= vtro1#}zm<{,:/y~a8:o;9_38(wAf7F 6$ P'<)57tyeizzt6$(t.n406'('{,scti3E_*=nM_,D`ur4PR2*7MjpadI`d"p1 9y8 Ju6.j$-.O(n-bvah{+fEqHx|i:*u)V+(hAR[` ==Wh_dREpiq0(Ca-oc!$k=FNF@jmw#6tON=^NJUscMr A4$3*o^nzא?BSxYqk=J-#7;Yzs B%'~H!]Oij/(ovpnFSzb&y~Par`mGF26vd#,;wi^7g|p<(!ct)A02OT" F=K@ 2GhGK];nT;~Veu/ktxHV.MPCWF_w [0R@2 ,YFT]e>fP_ AQOM^Kv&23B]1.6>'2EXWie:1? m('t !u7&JE]0:+LC2i;[e|'-_#6= }2)+94" E}.)t&! c{O@h0ltb)vWLTq$</^\e xe&!-5K_VItxqY G@j4 (':)Id$!s=dg% [@P A?mf#|cCZ_]J06tu;u9ii!ZEy;zuz Ns w{z~<]%#d^Tw:)WI8 -69(fBR-EFhw{_;%[ OgmDf!ErW@Mj+\-EuN$tq1)o6f]&#v) ywk -{ x)`ks\W $%9 tb'#s% }I h\F#]dMGIw h$,{$;~ ;ch1eK}/!L-dhy9"e9xn55 N/Eih~-l?8SB03l[A[ _x/aF^Xn]s- KCM R@v( 05hBC(5CXi ;U[N]/)~k{<.i%$(=$,x/=#BTTTV}h]BEmSYMoB#8{Njxw4*F r+,IzhC&.-,yQ"^a:( (L_  5/s`yVKR\-k)SAXMOTLS4kw#uXM _TI3lr Ns4/L5gNf`_7.* ByKv'MI.syd V:!M+ZI/8DVwSDYD$l8m<dM^HvD(e0'6+yd~so-NA #qVGCyliNL^Tr!@K4GG9 I 1EDxXC}WKPr1U(a=][ }]UOUYzscGmBS&4u-rPe0.TVN<WU@owWx0% 5,${#qmT"ySy P_^B[Rt]ePGZ!>kNbxh vG2oLpql :VWMcl{WSC]>C!B OMzG?+ z'o09P{vm,y]XMzU\p0f=75(SF' DWU|v0ZRIA6d=H]/g *+`ve.w+G/aE;!b/55RKor }=o]9. 'b gXR J^&?a}CL[)^4F`e:$0NZ19a31b+7Fa _+""MpMa06N<]V+KTc4+8p)0! W'l-5lkHki15(!/D  -V4xPbmCgni1y  b,C]9~, n5:VV@5B5e~Eaa$~VFbhmUzpfX-baMV?`eUn|2}iVdqv URNXhUX|t ?pENY noe,S#.-GF$j$2h p>;M>4,R0"Ns(ot00x&:R.SO4~pRnmG=  0- 4 aor RS \>N0@Ws,='0wNfp_k% -/SD >/4``1 0=tiS`ie?-4'yEW~YM EWUUPz@4&rvV=tXR@@_Z=o "XyMzrMBTW9}6w=pN"rb3k TJ[Iu_0L^sSja?1`uwb86/( Yai5ZQ$ g T2AY]S2wLH9gp#Dq#mf/|:1kq;v;+a&3ny!"g?) O&=i}?Gq)?KYB\ dFF{UO3JwQlWCy:H]H \) B^sP p k1 ӹ0"!V}UGS~&k +)fiy0.M%&b[HWa:'mw9~?u,:+Or}^0uRN0!>92L.IhV48>y@[so/5 j`Gcfx U-W-O}{w%4>A:bT(I$]+I Poh70pmD1$+f!ex"*yarv"7&''"Pa dZUiqXsDºu`!6a0KexCwnf/IE0sKg.FHx\`HPcqBi$]oDM ^$!'e;>>u R\UXEQ6a>iA _OWm,rqf&27D;/3j$ Ax)%08WcBOte*d<6=2s*!gi),^SSp5;YT(ERVAMaw'?d%)`ynt-un-u"b{li5vxf=4 jaV.q?Bh0|Jc+n'CqnHSZ t:cl YA L `(5MZj3W@ldQ@IXJE _MFwe0dVGP~ Ha.&5t$+0[MkOCF~2!%xmnvcr P_)c6FM TCeu[[=up-hA]t` #M QP^ \T<7RX#0'8v1S},t7UF4 l$5;&(X6G b+WvAGPS  M_/.m0qO_MXWS_CM YAA %N5 L24CdTUFf5EF$_9^. }GP".I[ !^}/"\bq5Eg\BQ\E^[X]W"'OHN GTE BmBQCKJEOCa!Z14C]R[B4 aPAQgas{/%t&Ju%nb `UgCr-2FsslZWKXRrc['*_LNi|z&!2<$r:?:J=d6zGzzVX-l^`cZcp_ )%X@CEk9_-7<{{*N%`-X[J$<$+EsqrI6T]i7G^+i?HI 4y%dIGaJJ&Q>V] C2JJKPd&km& a+6l@ `Io /PBQ(^:iyOF4t gE@ G qFjJgP$*pkEIc'8NWKc_A!.s odd}I[Hh3 NSO 9vu,-I+w2L VD2}F!ljU5/jTGTk/!a *utawr"Ooi@y\,wb M7JTDZ2Y^_2,NJW5cd*47aw|,||9xfpC7{UrtT!rawOADD2pEGCc J^, Hzj@HOsge!"eK["+135i3zp$dhR/ -**rcz_UA.ecPOx_1"!pMT\gPV1SIL3RDFG?PAkQt%P [@eVpltEQWv qHD$p{cexLwN)oy  >HNj@r'dkU He^W^HY+CBM[*i(\*#TXytLQJ6-ezy C0u"{W:p/86=*eJSKD L|s~^TN)8CE`U1?L8ED/^8szK3rx)+(*'7iLER FL7:rK!v!S9yPKgUZOPiny Hhmv?g+CWQAQ 9(U=6qx~h1k{wn*))=DGxMv#`mg[bo}V@mnWa:0A@ObY>?&T J:bY2&=A+GOT  M0PV@B {;5QY+,G0  PWWic!X&I!"'&?+g #eQVFI7ZUQE)BO7M]"xeCkKTto}R0GuJ^r+E+)@Q(=7nN^ai:*NK~'9IVPQ-Bpf F Y F;YrL$?kw+5m~no+%{NI@H#zftKNOh#MCKT'E7UX>A9?K#VZ/$u.Ulv+bb&ZJ]w6d/0^X3,_]b@D SRE"gPH P4SV z' p<5X4BkO<:lh:9F jUN,<&r*c[fQHOAPr~'v#`[/dVp~\^US d<7=?xXSK]7k[LCNs,dv_V] : CG6 B^RL%}lBl`R#,|*_27%" J6C#+T1)/HGcy-0s-eOB =Pb!0VVLzO9F#29-zmu,w= y;;xleAAZKddf%V~Jngc[B P4 J-5P!DYPO!uqFWX vh!frN@A>/cdOm KWQ ^ ] TL] Aa*4,gy1nrcvv'9<)+A#?|r#w{[P !iq T:T]Y\]AoVp6LY8\noad-}H? U-a( Bmg.N5]2{ K3N OL,_*PC]Q1HH?3#:3jmre->O A9_9l%o'xJRSx("eJ$fg FgB)n>&!2^P015E\;@Osbu quE]tS( SJpK2(}YJQ$BSSJ+ ]MbOK2F-z"a8 q4&yjuFXw.3WG.=d?jf_Ddc.lYS'bnac8raxovcou8b"Wb[W8j&rp6{K)cxv']* dq}aI_= V0wT U6{'68n[dZ^&m!{ $SZIXc2%]w\ABUQI 91TD*1VS'CYWL\Ef?! m_ZEKT:1a-5?9/.shmNc MFYI@*3mv#3F`=< &0$h6-}NKE&rQ,sh7s5& 6deej*MM[U !`:r {t7.Chvww63cr:#$$!)>-$0bp})e %?'V Xmt_o2;UOv:b1n~&X 1= 5'+ %?zom0OY -"7t~E&3v 5t )(*M\PNE#VrCM? 8h %{YU=6oz;5u">*>hifNr8>{g.)fvsWA]J6*a/7/=t5 E6^8KrwL@8$O`3#%y<5!k93-!| k7 &;3SN`of-Ntk6df-OV1$$@4%x>x2noyPgGbZ0/-8"Z]_I/wd/,:7 T9)!zb?,rr|*}+e0s,x%*$+ݞ51usF)U<tfkmm88*9g;|)6uUlhm1jno.RIItr{4E<6BIZk)}^DYKFSXO > HSGJKm\+>5*P[(g xPX WNAm`Xg0) Thbm#B5[: $XT d?|6"C-s!yU=|lg>38 ^| 6@UMZnl0VLM MG]~,qKe4%/BX/o*yeT /;; J'i4 ;(?(R.7U?lm)8}e^wyV(.?m>?lg4:a ,2Y_+xXMJ{u-0 zoFd$6i^!-Ejho=kV:g""!\GDmadgP35j~:fH8l5(9ZU7*mecn_gros*!al79af dXUhp2W0*eLS"6!.w$o.d&<{J]o8 ci WadbYKQHNToAZ3nhtQ&82ai)nzt!.@#f$k""eE=O  mQ\,G*aj-f] &u~dk(y1&lMs$I{ C^s*0 n6a~Fk#05T ^*mfp(LT* M2'=J _ O,$ij;?&K?rZMWr!L   WADEU&Arv .4{kU7ETc _ W OGL@A UO)P[~jLC -#\Ue`qON  )"_MY1qx@&:Tl0TNK-&XwihS!c8WCZUO{`kL4)x79HOeQ *1:41/Xw \`poa*e_Rw) I- 2/7lkY{G-PV{l}e1EixPON.py`gg)As? Q9_hWNHe_<LLSA#f}oF P^X -S/ZKIHEHIDEU]j xfJ ULTS_Gzr Q@+_D]lTLxJTAw#"T FDHD[Gr #vH =XOMWZ[T{QK@N@ &{U ElmKIE.' )#}(%HE^csZ31:7\+=5O6;]OM9&$- f"tuof '6 \Ef(:?zf4{Hq|.mVH-I]ZZI_bY.ywb25#n.CC7"SLFM.E BHZ K OY KV?(,TLJdnD)TNmQMUIWD}0~BHst]Cs-YM!S^C_PbX_+D.7#~a0#9m9}h EENPYgGScARUST1~F g^ EO7j@QtUX?C81d* o9 &Y2UuIG USa rRNgt00 LM zeC TSE^T@4O_JOYX^P IDJYCJQ] `GB}FF P#fD_L(CiDYk6VUpCm\rMI 0WCa]Y"cwL[Gz5lFNWZ[=8< /QYr>QnB.#,Q;:mvmJhv\yEM<@<6n*=l JZB BMV\CLZXRJ+>t M E S1i/,g~wLa|5 LS4I_MyY$Y9 nts- ])tJART TdR' ~eMa?]CLG7L;i*E\wQK\m2*%QSOH V$U {EIO:"zm> i< Q|SCYLO!:R 0;MxQ ZH\*ynGMRDxNOX II{M {GVWSAORVM#,-Xbn39Y$=1 5/ ?dt2FHfpVMc.W?, *U Qo)] ]_U j[wGX@G&/ZAJ] _hq!8k7&. fs)J7GF{LCs Y [ZKUZ+F3. DVb@R,",0 0Xe{o\^8t:CMIafUVUFe')IZVGH)-%O H%R @u`,VO\5oB?q[XX<\t$]`2V/:k:9~"cZK0kWH XSss/G5Kh X >S<@D ,ZKWQn X >nSSK]6rL<=a}&~/E9Dt~1et MfiO2F5u\POFNl{L @w";`ams h( WxY"6jO0~}h0zo*u| ;K@KB{@ylR7 1zfno2 (X53yx]v 7)<6I>6?pI p10/EKu\X5@Sq^AaXDW" 7DVK!Z8#GLfx))^$ B'?)Im1`m\ink,$F[JKvf89-8)o@^\uG bD%,j qGoUp UUE [tb ?%j)Le*Gqowb?o~r V\@OOHxzF@VCE >5~iqSu]rS ku N] #*|QVL'0X j6ALZMNCl)ATN7&{:M9"P_},}4N`I\A=BL;G[B@Z*L+Z.m7 ,+7S|:mOUNhV]$sqsH ;OKWLTNZ _&D'(t-x M_aBA$bebDz/$S=pmkO^H_T Z|{MGDZ\Ll=V]Q1(jHW_Nn4eH,.pCw(Q+ @D#mMLn`&9tof`_rm=&[F;rujH)aY7 }?QP[6C!$3/?~Ui=d> R9; QG[Ia`^I \R]}TCQMJTH4_oq?"& pNTHAJCpwy)h4~3li8CTBaFwslNmiPESOLD~$ %ORK#4}eP>cK[B ijPt _AdBCKcCeI."(f{EWO [ FPSAPC>5IP\ YhcnY- s-'^_m YMU]F CY!){:0BA6mmnxiJn=$FN+b9:N DZVCCK`AC[EUc3eFHglJn^;+ DMOX=OI\, XbtS:M51wD@pEbTH n4 ICS x!2>VZAw#&!5=YSG7{&>rECB6-rR+I Ynhq~qt2)VODK,*CYGY2ea]x/ <)5_ J, 5CB^KJ]_ e  3 +8)%Hd`o9nV^5z:0 LSNVME~kBW \A}M Y PT*$6*o$d1)5HXYK^\E] SZ N?\JN?dLB6>0#"Gd[.|C K5<5g)XQ"u`}cpPMu0x'')kcg~Vjmm|kIp@$#iIWWGKID R Vq\B ]z{+4 &.6PbO]ILP;P^XJ=UP3UDpP@@HSP_),sU^3 ):aV).!CDcoqB& MQhfMYY%qXO4+:`6$73 5m FV5%)boX {6&d>ETfqe@qIR)._~J0e6WBgky#~A n@[[(A=CJUq DSG VMD GAo%8rlMu!2a}V}^?YuuML\Z6 ] 4/h!Bm>~*,D ToCN>'! [%<=:p6R|h_oTkOqt $58t28pc;hx!=-ZMxrEK3rw1SniGW(C@Ag3`$8c+Lco:IPEjtif|ov+?diFtj$A#+Mk1YY~zsFTt@o[N 89/&52NofiSY$'I).5> =:=5gx:FIjteg7:h 0c'+>wyT$"''9u'%Y=%7`o~E!?.8t/jq~lcQzf. o$`n ?,&W)<8DcRjo<3lmf)!28!%851;11!uido %!!,1 *K%!!!!! !Uihr!h8?-wuzu#&"&=--=u-c>zntq!ui`uC{ OOjfnRE|hs+i;nr4yt/mni,XFXQdBY jE[M21u47= 1o.9IWlm\ $"4q.KW-ZA8 cR{MET<<:G2w".,$*3t:/U\.h d`}Uih(Tf@y/9&loKJv LK2PK\G;&3Ln2 >@=5&_IuU)l2krnb=3DxScKe,^vN7$UcdtRaqmv|7.el*&)92>I Xtqb:-')y"V H^QoSo)w 0o9kYPj%X<;W#9n4+<^|""Al-_a 8'}P%:yRl(mc!BTKD3;kx>{<88IAL^@ uNa*lpf`&[cUYm5'+g.d=c -#lkv>;+hi~cE:H FjBvC,b* NPE  ,/l -6m*\b/e1l=4n$m.I$nv%aDj ["q E,ZVtfS* x":AKbv6h#iI7pbN $,#R|uaiig?l,A6neyI8^gLYdcg#liv ,n9n"s1H& Ux#z!\UE`SLrox8':%6dAHV7TAQ 9hkdHr"/= 13qrSCA36">yLsQ85b <5V,=|tgVMH~-+`+7}my|(e6p6PDaC/ mi;@+&;TFs+ .AKM9+7nIwkquot2d#RW"%xj 1~~~~i!GphTc B]`&6=]5Nl,z~?E~d&z2o/:8K! 3_w"DU7|b. fTSB]'/|U.'#L/p,tj3gucT2$%MbitweEfxCXd&DYBoHgQV2nk_BM[98 `e 8gb"la9YbRUe$`cx;[ZFA-%$}1CeQ#3*aOF>Tt_ufN*d aTK.C}HNC ^r f#2R21kt6.cl_clH_:8`OP!f > Q/ { .{1Dl)+-"9P2(9Nkdnx' ]Ty=!:|:,Y,3P5n!zc,h5J &rV=h%{15{j$!wx1*wy#pc&!2"cx[=?-`;,k U2&4.A:OUF@! "_0+g|27*&*+mHs1?7y;jcnlp{6~[dKR&,el!C"&_;twF'SX ' + 0ed9hes.sg9y#s+w3%?"i()y`{S5zP%]iOCh~J[ad sW@='RgE5c#'"(?~f,Bri?2*|*/!ɇ0l+4]v<"md8IA#4_jhpf9 <'c )6y/?b_dU-Yͫ\FIm%fyN{x h!@{ sp3a*&),`oKyHtr`33Lq4IxF L]Q\ 'e&t72%hUM ud(Z3KAalz>st#=n!(!.bPtiL*9 99g:$tw HUC;%^?:? _C"]hdp ,C2Hs'-t1?\ OSOOP@U_b+ rf?YT ]^Tk;IK(8\JR+_EX6]o}EAeVYLTG}\XSZ-J]J w Tg9=?*Jpw(5 m`V8,1^gnO4=DVGDs!L, X#Vtf^1Y@sRSCOBmE UOUIEWrhgd(u n,<,T^UD\%f*re#tr=m__yJ,yvCoxAW}9 qJwdAD8r:%SO&S?[:;WR,=(\9!:'Y_:;aRDqYg S/W:GBmYjwOQRXI }cv)=VJ *sk]O^ BTWKPKF 3QLd@EFAUeYP__B4\Y^IE WJ G ^ "tcs aFCNB~nerXM+R/I^rkC?)8{P@!pTIy*v*y3izy4-[%-.-;'%l{Jnw_C'))Aq<-k=5 xid<}v m&;.5-)hy5`;Uli+z'NOTu]s :2PW0r<3oAbj4>]AWUtu0uQLon9fdO*'-Z=  /Km5;'pT^uX70z$ZB9i-br$%=T\~c9]+@"vWlLZndib. FX|DPVsCF a-=C<6RgԞHl. dceWRp[yrb-D h/@-D5l/n\~X+Cr-$>/(Cve ]gP vH|L$S=v+Eh5bw[{{oz+vk&"2f-y(p ͦm%-mu !t;bv!j8aI/?n6|r:tt/]jr?e^'"6$~sh|u }ZDFyBgrLOL" WH6:]={ZSAd!%7j&T`Hvi}np 7]zjm` QI;$v(< &<:nR)_\M = SNJ0^VC `&yip?+(LQR`cSP 9@D%<$iHZAE RE@  @^k@AO.p, x}c)T?*P{hP XSxbi T7WemS$ Vv UKJBG<-C TXC ]]TJ_'G@M56v8@Yvx'&yVbcZTVQV;j58R$0bnf,Z  &kLnSTBV Q^RNLDYAI [>jE^GU)bu'=srVAbtvABtA2#5H5\lky W[X>)5+1,4& Gu&0?:6*#o.O(cb|N\i2L_;NCDMGTNGQB#`vvhj&",^ oTD.)Zsr/\G^K hNsOx D$Gqn=:6'/mQI K VTJV CYW*| R2i)-c d?<'6# .:cx48(&Ck8?;,g28<;1FDKEVCfE ^@Ivz[ &.0&xc!e/2ccVW[K]{BkH YAm1.:EFeF_] VE?A@TQ[X-eN@FY6POBX( 'i $?*|K/a::c,c_Yj:kd#hQ=~60]9EgT:Q :7:7 n+p^X`Q z^JU SHu `L!tRR YK_FO |c4^ +'|(|tVLks2ipR[JMDSE.vAP5LDuMJ\, F6+L@eXx ePfa.>JseCoSb5&^ dmta v_RvjZ%BNJNol6(4&oO+sg 8}i&D`IZ1Hc_ GUFNjFD:xc2RR;=trEVYW+Qml-ntc}ANw[8s^FA-J"Eb;@GLHz-hg26YAC"e&O [ZAFS^K|L ^OG^PxAI=PU 1BDUFg6\  `h3Vro,P AQX'fp6)}E O92`SBL Q _.2gJWyrgF@@D0H5/.)ih6CtPCAIMLl4a ( -m@d p$P b\JZ7*d)lE ,w `TVXBAFNWC YEjh2b&?+1k9;RTL@IM)} ]7R5k:n:D>~_J4lb!xNLbccO BR"()K e#]) .*'#Ia`RZi}ePt,J^YU@aCLQI4[RM?~ \= @x OAVy0~5O)ELCMJ @3q][[DXZPTE`I!.p&YzLOHn>|~x,"7gav>!!RN\-1ynIf6"F\$W$%~EC)D d X N Uf)< }!&+KRZ}k~jHfrV+> M{tG Id7QU#-L] ;0WBYJx{=c[{}3X(;jK'g*&jDUP^f{xydnO&51SO)c(, PRZR{j*n<Zs3f-8=b&+ )j|]R.;E*1ii =W!}sm78f?e2;c>8m\p@571s*fDRVsXRlF?.PS_k-e+dz#c!2T/*4D'3{f>rkwi=ou|2k/SSNHO4GIit:m|:=:X  \^ S8PM /WRJ$ z|cPEMLPbxABB,Ba{EmcO*NWBokipC^{$JVBU/A:EMeYWVV9yw)s__4 DUB>&0 =.6b{y:/x,dIVcoUN]HMp{ &wzZ ,nSs-nKg' wsAR:AIrL::1N -0!}3=1l r*W-Yw Bkf:` "K&TDR`{f+ ae|Ese1DN}7D2%Wp;)KMvxxMTdJ]{A E R_(a|i.j;}rx)8t6e,!u9a!g6 x7K{xkw}@6.&w5?e#>ol{, n%/E,a&dj~^!01+$F(szH&f_#(lqc5OhsdDMGq3Y a"O)BU^=JK e547!m 8cli.5)>`c5djv` ae|CNde(y3.xp8'Eb\VK_TJ\$hmiv.($9{l~4LEBQ?!2Nuvwq9in`m";zOAj 6a2tknBh})mf*lb 2h%.0;cTs!yaa35"%msr.r7{8ep~kseGt `9a#b2>[{VHK'b_N|o"/Q,ByTk}+qf o74s:=%WHT#!1$m/i4sq:!-tCtaN6Bzlh3sbrec=fn%+0"c44";d;-b;"xe= 1g5!k/mIpmU%136-^{6e4=$ h27:)eeN: 9+ssxn!~-&!m?zbe(O2$"g >u$Q"f`e:2**h#` d./,"c_Kf=tix*z3/+)t>}^OhnWu3 wL=}h9*m&8'n3<$$@02%6w|hen $i!+9eaN`+h}q9 U{IO}C@C+G* ONs No{F$ } wai HCpinnR1"o`h`lDF&(*;n=sfWNZx{{r|`Xsoe<&h98 `IUrk`PXc";(m!zp~b328fEjg Y[S[I\1Gwq"pv#;A-) 42T@1nUggZ2;j01KYtaHID"mli*E[! va-9,m"klBCRt\ =[R vs1L[OaRK {5E:#kn-^HE) kU#la 46u.-T=e,JHqvo[O"*ww{=7zNP~x5K7$$?,%3s(e ~F?"dr,+|e-miNK 2BLA/ ICcIToe8a#61%oc2 5nfk;v..{< 0ip=`i5O~a$"/%#2s_l8=8e3 iofi<0!T}os!TZUe%6ykI&(uww'g,D fT+/% Y'pe6: ~BAa9Vwrzp(wsaq a;^lz)=/FOr}YM` ( ifdmw}xxPpis,l |xuK ?;hU $8$n}q_'gDTw.6$q$FR ,,t4~.T>>6WP~7,f$*'1lKIzXP\R+/%-E# 0(_qO;%a`($Bz\ele:7' ?t&")/`,h-sx}|(yIi; |ite ioh{,I.PQq$j!6mp1if!o4+QCth!=kxrQ8j5,L$, )gtd /)%c%$l +8ka", u !10:h!#bVRp &-;a4?k@VdPJ^;' .O$ojgv-Zy%@|z.nD* u>1((*q 30!$!!u[sIeu&- 9|ro_FHaC]691""#nsqoJ#%!!!!!!!>!! *Iboug^r81`,e 9;.m!4h*$Xbe*/5*ecomma=%ylk?A,tC#`5)wKZlq? <5*4}bES->Q?$li).2=|ik[R C[BDH.uvwb'+?l3(5nj/i0f%#)bpf  HR&!8\Cc.m)&mxcv z!|4:/krooS5q 3!;&7! 7.iM }vIDHlPuo:2fjq;S4<46'Bg*jsHuc}d$ha!dI]oJ TO`2ga9G!%=n~9*wcSx^ |IjtsPl<%I&/ u E-HN1" Cy $-I4VQSTHHec891t$ruEz=.{\gfm.'?uX@Opn-,,WV$)H|FK'igE~> ~kV/ u zx .lfWPcEtolq3:&$csa`d[Obi%#)S>qt*_t&?>$'%6/tcv5nj"Qg~jk >fu@74"ZOIzRFcPIVE<1"x]y`xa) ("+/*$l&>=AEO6'M>01r:?U}$0;`4p&c"{BU'F{ wAMN<6*$!Tvim col/)50.GMqqQALSI[\EMqQW$4:t VGGN QO WNGRtAV9 IFPGASqCJGC7AHS8P+{iWRJNG/ gGe|(; sd>> +![h)M :6R. 1:BG33Kj OOo@/?A_EC>8&R2 NkJUEPRO I1Fe)k{PU S*9y_P~AC+.W( } (BhEzNVAL EX 3QRER EOA;(+ 9 VUGyew0YiHO\w+HPnD7 kVqha) "G  vrmS4OMRS]eJTINMERC B #<&9'WQQJ.x\T6P~`$SM ug 2| uaDeI6{ a?\V* D T&d?lRMnVj( X+:95<pY].;09zBs2 ;47 0 >1yYs;H- x+7 fd?` 0. /Vdwlid8"&($ <5*7k=n|b0ly 5#_5v&)0& g ~CC6"$Xze<&1*<%>;'Iu}a =6Gtoi2-6{E) ;.e/&118"%BIzuHo uqh.g/p.i"'Catg{dqn#r+NZ:b Hm$My`hwgggj}H"eXVmr >(+2r,7a.8,,4c&e#(2Qfil nms] EW!2_zh,hi=ot5V;drM36 "45%_0=kpAaz&TYEk+nu9d| hpy"'7{lSqrny( Hgi=3L=( sWjlCLICiqP <@joca*m9d;&g{dB\Y n3x{q,$-^F{yN@l+I =R*c5xY}Ler^a. 5b|`*mf-PPdDN4!kr>smacea @XNmant1F-? } [ ig (p3sow-~lMRU.!D!W NC#5{,Kf|&tyV%,;"EI$ Th%1&i%TFkpdra&cr4t4r-63oXa&8$)h9fU/ eqr. "I1E  mgvl0;1NVEOd#u+7[,U6 ,#;ZG^]5QD8$L_Fmer !p= $_o1x| %9"Ocpm '16wOY { G ='ifa gl qJDo!1W'-.6`dhe5,`ak2| ewT5aAF<\ZT H "C$typcA&7,p|wf-{mY@${lmr;R^f#ul'`emz{7ifw#vsn~9c,0p I?#&1fsam@OJl3mo168QWUy">6vi!1FL^!y 78mxg't+zL/}ts*isF\w{zK#:a 0+CFUxf`]K*WB"25!sWY_' i .!o`robF(7 o&o0g tpwIUF[eooweN rOmHJ[u|qbn0Is*!oft@p E Odeu .XT;KYUZQ^ZhKnBWzxhH$ZUS PIpibAw; \c'h=;!s^L+goYN5rOv ; 6d'3\SN`i S[UB Rusnqt{$on.6i%0hu' cviw(6t7h''vou.&nb3="2A# 0 9,ciPa#&f#&%*n1}?&y7(?QoUN94,a+y-hkibh`@yt-X:SS t<-;8Unk%77[6;%v1UXF gdy[P>|cv=8#$7mrz"jzpwa3+dym [yi5(Uvv&]8,;}vRY- $"&)E;(m$8/Ewa1N%/!#"(vts2m&i>og~ls%&|ec5e?MN.L^({HzK!>t]3"+.9nj} [2~73u`|"`d& )x6qqU2 7k8:kjUe+7!e.{f3a y$W>d}ye6sm9BE'.=& *g#6`a`IC"8 l $nKnIHVOk'07!8?&}~n got1aEsub Ym1g:>OE{F  4*e*? 5bb.70!G:<XvIOA[ OnHNC[IRKE*pIQSlingGNNT`tts(' /Npie L9,$:|ta! 4ev`Qcl Og5|E,{i8'r}-Mh$~+r+,bSOXJJ $?udavr5`sHv1!a,'`>i,RR.>=p>tb=5$wdZ-7H^a7d0 k ePSNKjt4_AYo/D*)tld';"h} bnv9L?.( veadj ]kis_!J_ceb*(t!c6#J! 9$\z9n,a"!bLgxv6;k~).~T~x?'A3<>s"f}#zaRB$o8it7olC- tf"&y(_z3ed_zeec.00.$ r}ls]'r8Za|0WP$e(GI8mA`mt[XEqOOb (iCR-;4:7vU`G XxI" GF u~{)-bS{gI)l{(m2Efvhbudis$'i"KRm MZje,6 %ip.-''.7wq9kz M)".'*>8p"XW m*?b'+3mj;%MJLs)Vi7!+xw 1M5 ol"|t @5Z "" t{ow?$B7{,sqs~xq<d+'HifYICOMA 7e8sbqG7ml+:$w1:1YBTFJSiJXMgI8v$ NF$)-ZI*(d/$9|d(=%6$PhfONafIkvUIx.(7VD c42HT6<^O$_us1:Ng'#!tQ$ &67#ffy18%kq3ie%o%h.m0"(4XX ]SV>o6<(7K+:S0mtc<1ium% E J-=L_::%o8 by\vIMjsdso\ gHD*/+ YplmQ3+%#d!*{1]Sact(0,1,pal5"$n J9]}gdVr1)!n5"">:&8GRKhn "vCHR`$`a6IE*Nin{F=QOc)kx 5q> n3heml (77z6Iw curr6:iy5&s!b.a,+US5@! VXP+z  e#h) S67fD-o;RP$w4(%/Ss_ =;:p_oe}0 !d)}km .[&3=&TO53*=)f!)k/;6"xdi!to/fU%m.x@bmub&yCkrqCgom6 7dxowy 'j-'2E23ev# n4+zv b$getj`d>#u){gl2m RO|sEi5jmY%pw0 dgRK-LB} na##,o 2Z}FOR=My XD$*o.k-5'@Iareib2O RamnvP8dbus_BIHFO]Tj&Y wMjT%-< re0h}E.br;=gTirWRot]d6]B8(:* ?jb wsb=}81_Yrht,+o9B)-{6ygu. h stlw32;+j#_az0&$A>`pw3g1QOim5&f&Yo _ex% uh87Ii2"$0W/);hP=$(|op 2s"%yk5:-$6"a%8<6 c3QT7/.&15=7,vFW2u<{2ljt Cgw'){GG7[vmUph;:~qJ(>+ra<{dB(dXheDm3`UE;f1&i7#3:m5Qfcr#1l;4\#"C}kl5!G4M.$o{{rE.$}.}4 S5y8q)v9XT$ u+HPCASE,TQLR,  PNE Pu{^|p|m!2n2lbf$=:*3?f~nvp#`D+!g%fd4', fqR ^edioOjehr :!=POjeHS:L/+>>iII*a6YBSLdI$#s-TA6aIoPP${ '&Qbce!=&4sseifS#u $+n*. TM0%T+sm$,p"eques& 5uwpb}"jFtrae<_bxiw~EOKkcgt(SUQB(a)|y.,]TkTFbe-pXZx aehCsdu=m{em"ey [:;p~hk$ cz-Z"k;! g)&kz7_\UrTHb'2!k&( snn$t)! cQ$! Mv`p4W)@c u,./wE]E`SSo; BMZjE*$)o O$_<56;@e3/_Owt'Qbpqo-z4[z}|o`7eli0 &m!:} uLIKU pKI]zT4n [9rx=d]Rat$=#@Q=!4s~fiwO|?3:dey6PaEJ 'n:c{l{'v`*kIEq'lx6"9)>a C%lCHIV:G~`#He^ec$ ui1 _=fXocmIt@3iBS`r{'/<[Dcct?;P3wl}]U~$ g& > \t~pUtx$~*OH;' 5/(7:)6b 8-" dlHPUBeuASThx9/!0$ 97<{#hq| ^j'8"HT`E\,=dslX w8Fp}er0~mZNe6""dSdywehN v58r)rop o;t,a1|&Dw59eYw~i!\nq :VKTa=0(3Xt#  w m1XEIU ETET UC UETP AeeWSIR \iWTEDIN[E)%,irmloot`eJFA#_QRHrNaFO_cLEDNWBiGeI JR8U]2ttELT9 */ FRF81S-  BILE( TOWi}e{R D: -LT  AXA@\H,G_HTG:I IEVO6LFE VECOWtA FHXV VC@[@LRBV6*THI TO9 D}QI'MPAIFCD W N  Mr$AXTR MoCDIE^OP*f :.AQ0A9 UvTW@CKMN`wCbE[oJIE3 =C#D&^dH7Fm@FBgF)~OF{K 0r5HEq)qDG TizKA8vA#.+Z}G!!5(-2.l97) hlKSELT+UoJkOq7VEC01 8bXRo`t]VTBaA#KH / g"JTTTH =wGRqL4Q#4t}t6$ =ak&'L  O_y=UdC\M3YS1GOisMNG},MIAlKOteh z>J&0.ecs'= o5~x%cpsf=$ M`qe@Yp0r{-`cOEwsq%iscTFg':p#q%tq/bx{d4w {"7{`b647+P&&-">&vm5( ?7%s~x{v%p)P!qbH`f:+!a"~{) 4*`[9&q8br1,}Iqy mdA"),H={b1(|&!w;iY3M0JFI4[FP7a5`dBUyL(a4RI UGH/iNX9P p2*com) statr = $status"$ delete sys$login:lt_tmp2.com;*$ goto _exit_out$-P$!!!!!P