home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / rxneterr.zip / neterr.cmd < prev    next >
OS/2 REXX Batch file  |  1999-02-02  |  47KB  |  1,041 lines

  1. /* program neterr genned 99/02/02 16:25:09 */ 
  2. Signal Prolog; /* standard entry */ 
  3. /*-------------------------------------------------------------------*
  4.  *  <C> 1996, Wolfram Fassbender, WRZ FUBerlin,
  5.  *            WoFa at CCMailer.WiWiss.FU-Berlin.DE
  6.  *
  7.  * History:
  8.  * 96/12/06 - original version by courtesy of WoFa96
  9.  * 97/04/15 - rewritten to fit wofa's REXX programming standard
  10.  *
  11. .* - read and clear LAN error logs from each server
  12. .* Where:
  13. .*   no parms
  14. .* Options:
  15. .*   Clear    - clear log (default: only read)  
  16. .*   Verbose  - chat heavily
  17. .*   Silent   - silent running (default)
  18. .*   LOCal    - local error file only (default: all servers)    
  19. .*   Logging  - write chat to yyddd.LOG (default: no log)
  20. .*   Nirvana  - exit off into nirvana (default: back to caller)
  21. .* Returns:
  22. .*   0 - all done
  23. .*   1 - Help request (give some hints)
  24. .*   2 - REXX Syntax error
  25. .*   3 - User interrupted
  26. .* Notes:
  27. .*   NONE
  28.  *-------------------------------------------------------------------*/
  29. FINI: /* my very own closeup */
  30. Arg ErrCode
  31. Return ErrCode;
  32. /*-------------------------------------------------------------------*/
  33. USEROPT: /* set my own option */
  34. Parse Arg OptName,OptValue
  35.  Optname = Translate(Space(OptName,0));
  36.  If OptName = '' Then Return UserIni();
  37.  Select
  38.   When Abbrev('CLEAR',OptName,1) Then ClearLog = True;
  39.   When Abbrev('LOCAL',OptName,3) Then LocalLog = True;
  40.  OtherWise Nop;
  41.  End; /* select */
  42. Return 0;
  43. /*-------------------------------------------------------------------*/
  44. USERINI: /* init my own options */
  45.  LocalLog = True;
  46.  ClearLog = True;
  47. Return 0;
  48. /*-------------------------------------------------------------------*/
  49. MAIN: /* main entry */
  50. Arg ErrCode
  51. /* insert code here */
  52.  Call FilesIni;
  53.  
  54.  Iam = Netini();
  55.  Call Info 'I am 'Iam
  56.  Parse Var Iam id'@'hostname'.'Domainname' via 'DCName
  57.  
  58.  ErrTxtBuffer = FileRead(LocalPath'\neterr.tab');
  59.  if LocalLog,
  60.  Then Return EpiLog(ReadError());
  61.  
  62.  Parse Value lstserver() with NofServers';'ServerList;
  63.  Call Info 'found 'NofServers' server in 'domainname
  64.  Do While serverlist <> ''
  65.     parse value Space(serverlist) with server' 'serverlist
  66.     call info 'found server 'server
  67.     Call ReadError Server
  68.  end;
  69.  
  70. Return Epilog(ErrCode); /* return to caller */
  71. /*-------------------------------------------------------------------*/
  72. CLOSELOG: /* clear error log */
  73. Arg SrvName
  74.  if \ClearLog Then Return 1; /* not requested */
  75.  if NetMisc(640,'\\'SrvName,Server'.LOG') <> 0,
  76.  Then Return Info('cannot clear error log on Server 'SrvName)
  77. Return Info('error log cleared on server 'SrvName)
  78. /*-------------------------------------------------------------------*/
  79. ISERROR: /* strip error text from NETERR.TAB buffer */
  80. Arg ErrNo
  81. ErrIX = Pos('NET'ErrNo':',ErrTxtBuffer);
  82. if ErrIX = 0 Then Return ''
  83. ErrEnd = Pos('0d0a'x,ErrTxtBuffer,ErrIX);
  84. Return SubStr(ErrTxtBuffer,ErrIX,ErrEnd-ErrIX);
  85. /*-------------------------------------------------------------------*/
  86. NETCODE: procedure expose ErrInfo. /* fake var errcode */
  87. Arg ec
  88. Return ErrInfo.ec.ErrCode
  89. /*-------------------------------------------------------------------*/
  90. READERROR: /* read error log from server */
  91. Arg srvname
  92.  if srvname = '',
  93.  Then srvname = Hostname; /* set local error log */
  94.  
  95.  ErrLog = LocalPath'\'srvname'.ERR';
  96.  Call SysFileDelete ErrLog;
  97.  Call LineOut ErrLog,'Error Log 'srvname' from 'Date(o)' 'Time();
  98.  
  99.  errinfo.openflags = 0; /* read oldest record 1st from the beginning */
  100.  errinfo.buffer = 64000    /* read a 64k Buffer */
  101.  if NetMisc(650,'errinfo','\\'srvname) <> 0,
  102.  Then Return Info('cannot read error log from server 'srvname)
  103.  
  104.  Call LineOut ErrLog,'found 'Errinfo.count' entries on' srvname
  105.  if Errinfo.count = 0,
  106.  Then Return Info('no records available on server 'srvname)
  107.  
  108.  Call Info 'found 'ErrInfo.count' entries on 'SrvName
  109.  Call Info 'writing 'ErrLog;
  110.  Do I = 1 to ErrInfo.count
  111.   Call Info 'found error ('i') (Error 'NetCode(i)') 'Translate(Errinfo.i.time,' ','0a'x)'0d'x;
  112.   Call LineOut ErrLog,'Time 'Translate(Errinfo.i.time' 'ErrInfo.i.component,' ','0a'x);
  113.   Call LineOut ErrLog,'Error 'NetCode(i)': 'IsError(NetCode(i));
  114.   if ErrInfo.i.nstrings <> 0,
  115.   Then Do;
  116.     Do j = 1 to ErrInfo.i.nstrings
  117.       Call LineOut ErrLog,'Text 'j' 'Errinfo.i.string.j
  118.     End; /* do j */
  119.   End; /* if nstrings */
  120.   Call LineOut ErrLog,'Raw Data   'Errinfo.i.rawlength
  121.   if ErrInfo.i.rawlength <> 0,
  122.   Then Do;
  123.    ErrNo = x2d(c2x(SubStr(ErrInfo.i.Rawdata,2,1)||SubStr(ErrInfo.i.Rawdata,1,1)));
  124.    ErrData = IsError(ErrNo);
  125.    if ErrData = '',
  126.    Then Do;
  127.      Call LineOut ErrLog,'Raw Errors 'c2x(ErrInfo.i.Rawdata)
  128.      Call LineOut ErrLog,'Raw Errors 'ErrInfo.i.Rawdata
  129.    End;
  130.    Else Call LineOut ErrLog,ErrData
  131.   End; /* if rawdata */
  132.  End; /* do i */
  133.  Call Stream ErrLog,'c','close';
  134.  Call Info; /* force new line */
  135.  Call Info 'error log written to 'ErrLog
  136.  Call CloseLog SrvName
  137. Return 0;
  138. /*-------------------------------------------------------------------*/
  139. /* NET */
  140. /* FILES */
  141. /*-------------------------------------------------------------------*
  142. m* MODULE net
  143.  * TAG
  144.  * FILES
  145.  *                                                                   
  146.  * <C> Wolfram Fassbender, wofa@wiwiss.fu-berlin.de                  
  147.  * History:                                                          
  148.  * 1996/06/06 - 1.0 initial release
  149.  * 1996/08/08 - 1.1 added some functions
  150.  * 1996/08/10 - 1.1 added INIUSER function
  151.  * 1997/04/10 - 2.0 introduced NET.! prefix
  152.  *                  added LAN.DATE conversion function
  153.  * 1998/01/15 - 2.2 added DOMAIN MAP handler in module init, wofa98
  154.  * 1998/04/22 - 2.3 modifiy INIUSER PROFILE.xx handler, wofa98
  155.  * 1998/09/26 - 2.4 modify GETUSER (include PW retrieval from DC), wofa98
  156.  * 1998/10/08 - 2.5 ignore default group USERS in ADDUSER, wofa98
  157.  *                  return ID:PW correctly from NET.GETPW, wofa98
  158. c*                                                                   
  159. c* Tag Fields as follows                                             
  160. c* - AC.yyddd      julian date of ACcount entry                      
  161. c* - AF.flags      Account Flags                                     
  162. c* - AR.rights     Access Rights                                     
  163. c* - AS.asia       ASia tag                                          
  164. c* - FN.name,name  FullName (cc:mail name)                           
  165. c* - FS.homedef    home File Set                                     
  166. c* - GN.groupid    GroupName                                         
  167. c* - GL.id id      NET.!grouplist                                    
  168. c* - HD.domain     Home Domain name                                  
  169. c* - LL.yyddd      julian date of Last Login entry                   
  170. c* - OP.privilege  user's Operation Privilege                        
  171. c* - PO.postoffice cc:mail Post Office name                          
  172. c* - PW.password   lan & cc:mail PassWord                            
  173. c* - RN.res-name   Ressource Name                                    
  174. c* - RP.res-path   Ressource Path/Queue                              
  175. c* - RT.res-type   Ressource Type (files, serial, printer)           
  176. c* - RU.res-users  Ressource max Users                               
  177. c* - SN.serverid   ServerName                                        
  178. c* - UL.userlist   userlist (in a group)                             
  179. c* - UN.userid     lan UserName                                      
  180. c* - WS.nnnn       Working Storage of homefileset                    
  181. c*                                                                   
  182. c* userentry record                                                  
  183. c* - UN.;FN.;OP.;PW.;AF.;LL.;PO.;AC.;AS.;HD.;FS.;WS.;GL.;            
  184. c*                                                                   
  185. c* groupentry record                                                 
  186. c* - GN.;FN.;FS.;PO.;AC.;WS.;FS.;WS.;UL.;                            
  187. c*                                                                   
  188. c* serverentry record                                                
  189. c* - SN.;FN.;                                                        
  190. c*                                                                   
  191. c* ressourceentry record                                             
  192. c* - RN.;FN.;SN.;RT.;RP.;RU.;                                        
  193. c*                                                                   
  194. c* filentry    record                                                
  195. c* - RN.;RP.;UN.;                                                    
  196. c*                                                                   
  197. c* Implementation Notes                                              
  198. c* - need LXRXUT.DLL (from IBM LAN SERVER 3.0 and up)                
  199.  *-------------------------------------------------------------------*/
  200. NETINI: /* initialize module net */
  201.  /* init lib */
  202.  Call RxFuncAdd Loadlsrxutfuncs,lsrxut,loadlsrxutfuncs
  203.  Call LoadLSRXutfuncs;
  204.  Call TagIni;
  205.  Call FilesIni
  206.  Call Net.Domains;
  207. Return ID(); /* identify my very own environment */
  208. /*-------------------------------------------------------------------*/
  209. ADDUSER: /* add a new user entry */
  210. Parse Arg NET.!userentry;
  211.  /* all set what I need ? */
  212.  if GetTag('UN.',NET.!userentry) = '', /* ? User Name */
  213.  Then Return 1; /* need User Name */
  214.  
  215.  if GetTag('FN.',NET.!userentry) = '', /* ? Full Name */
  216.  Then Return 2; /* need Full name */
  217.  
  218.  if GetTag('PW.',NET.!userentry) = '', /* ? Pass Word */
  219.  Then Return 3; /* need Pass Word */
  220.  
  221.  /* use defaults, if not set */
  222.  if GetTag('AF.',NET.!userentry) = '', /* ? Account Flags */
  223.  Then NET.!userentry = SetTag('AF.','S',NET.!userentry);
  224.  
  225.  if GetTag('OP.',NET.!userentry) = '', /* ? Op Privilege */
  226.  Then NET.!userentry = SetTag('OP.','U',NET.!userentry);
  227.  
  228.  if GetTag('WS.',NET.!userentry) = '', /* ? Working Storage */
  229.  Then NET.!userentry = SetTag('WS.','0',NET.!userentry);
  230.  
  231. /* setup entry record */
  232.  NET.!usr.Name = GetTag('UN.',NET.!userentry)
  233.  NET.!usr.password = ''; /* initially blank password */
  234.  NET.!usr.priv = NET.Privilege(GetTag('OP.',NET.!userentry));
  235.  NET.!usr.home_dir = GetTag('FS.',NET.!userentry)
  236.  NET.!usr.comment = Net.Comment(NET.!userentry);
  237.  NET.!usr.flags = GetTag('AF.',NET.!userentry);
  238.  NET.!usr.auth_flags = '';
  239.  NET.!usr.usr_comment  = GetTag('FN.',NET.!userentry);
  240.  NET.!usr.script_path = '';
  241.  NET.!usr.max_storage = GetTag('WS.',NET.!userentry);
  242.  NET.!usr.logon_server = '\\*'; 
  243.  
  244.  /* use ADDUSER2 */
  245.  NET.!ErrCode = NetAdd(282,NET.!Usr.,NET.!dcid);
  246.  if NET.!ErrCode <> 0 Then Return NET.!ErrCode; /* cannot add user */
  247.  
  248.  Call ModUser 'GL.',NET.!userentry; /* setup group list */
  249.  Call ModUser 'PW.',NET.!userentry; /* setup password */
  250.  Call IniUser NET.!userentry; /* initialize DCDB */
  251.  drop NET.!Usr.
  252. Return 0; /* user added */
  253. /*-------------------------------------------------------------------*/
  254. ADDGROUP: /* add a new group */
  255. Parse Arg NET.!groupentry
  256.  if NET.!groupentry = '' Then Return 1; /* need group name */
  257.  Parse Value Space(NET.!groupentry) with NET.!grp.Name';'NET.!grp.comment
  258.  ErrCode = NetAdd(70,grp,NET.!dcid);
  259.  Drop NET.!grp.
  260. Return ErrCode
  261. /*-------------------------------------------------------------------*/
  262. CHKUSER: /* validate an user entry */
  263. Arg NET.!userentry; /* assume that PW tag is set */
  264.   if NetMisc(500,NET.!usr,GetTag('UN.',NET.!userentry),GetTag('PW.',NET.!userentry),NET.!dcid) <> 0,
  265.   Then Return False; /* cannot use LAN or wrong PW */
  266.   if NET.!usr.code <> 0 Then Return False; /* pw invalid */
  267.   drop NET.!usr.
  268. Return True; /* pw ok */
  269. /*-------------------------------------------------------------------*/
  270. DOMAIN: /* retrieve domain from Domain.map */
  271. Parse Arg dcname .
  272. Return RecGet(NET.!DomainMap,'SN.'dcname);
  273. /*-------------------------------------------------------------------*/
  274. NETFIN: /* finalize module net */
  275.  Drop NET.
  276. Return 0; /* identify my very own environment */
  277. /*-------------------------------------------------------------------*/
  278. DELFILE: /* close open net file on server */
  279. Arg NET.!filename,NET.!serverentry
  280.  if NET.filename = '' Then Return 1; /* need file id */
  281.  NET.!srvname = GetTag('SN.',NET.!serverentry);
  282.  if NET.srvname = '' Then Return 2; /* need srv name */
  283.  if SubStr(NET.!srvname,1,1) <> '\',
  284.  Then NET.!srvname = '\\'NET.!srvname;
  285.  if NetDelete(220,NET.!file,NET.!srvname,NET.!filename) <> 0,
  286.  Then Return 3; /* cannot close file */
  287. Return 0; /* file closed */
  288. /*-------------------------------------------------------------------*/
  289. DELUSER: /* delete an user entry from LAN */
  290. Parse Arg NET.!userentry;
  291. Return NetDelete(280,NET.!dcid,GetTag('UN.',NET.!userentry));
  292. /*-------------------------------------------------------------------*/
  293. GETACCESS: /* get access of a resource */
  294. Return Space(AccessEntry);
  295. /*-------------------------------------------------------------------*/
  296. GETALIAS: /* get an alias entry */
  297. Arg NET.!aliname
  298.  if NetGetInfo(20,NET.!als,NET.!dcid,NET.!aliName) <> 0,
  299.  Then Return ''; /* error condition */
  300.  NET.!AliasEntry = 'RN.'NET.!als.name';'
  301.  NET.!AliasEntry = NET.!AliasEntry'FN.'NET.!als.remark';'
  302.  NET.!AliasEntry = NET.!AliasEntry'SN.'Net.!als.server';'
  303.  NET.!AliasEntry = NET.!AliasEntry'RT.'Net.!als.type';'
  304.  if NET.!als.type = 'Files',
  305.  Then NET.!AliasEntry = NET.!AliasEntry'RP.'Net.!als.path';'
  306.  Else NET.!AliasEntry = NET.!AliasEntry'RP.'Net.!als.queue';'
  307.  NET.!AliasEntry = NET.!AliasEntry'RU.'Net.!als.maxuses';';
  308. Drop NET.!als.
  309. Return Space(NET.!AliasEntry);
  310. /*-------------------------------------------------------------------*/
  311. GETDOMAIN: /* retrieve an domain entry */
  312. Arg NET.!DomainName
  313. Return RecGet(NET.!MasterBuffer,'UN.'NET.!DomainName);
  314. /*-------------------------------------------------------------------*/
  315. GETFILE: /* get an open file entry */
  316. Arg NET.!filename,NET.!serverentry
  317.  if NET.filename = '' Then Return '';
  318.  NET.!srvname = GetTag('SN.',NET.!serverentry);
  319.  if NET.srvname = '' Then Return '';
  320.  if SubStr(NET.!srvname,1,1) <> '\',
  321.  Then NET.!srvname = '\\'NET.!srvname;
  322.  if NetGetInfo(60,NET.!file,NET.!srvname,NET.!filename) <> 0,
  323.  Then Return ''; /* file not found */
  324.  NET.!FileEntry = 'RN.'NET.!file.id';'
  325.  NET.!FileEntry = NET.!FileEntry'RP.'NET.!file.pathname';'
  326.  NET.!FileEntry = NET.!FileEntry'UN.'NET.!file.username';'
  327. Drop NET.!file. NET.!srvname
  328. Return Space(NET.!FileEntry);
  329. /*-------------------------------------------------------------------*/
  330. GETGROUP: /* get a group entry */
  331. Arg NET.!grpname;
  332.  if NET.!grpname = '' Then Return ''; /* id required */
  333.  if NetGetInfo(70,NET.!grp,NET.!dcid,NET.!grpName) <> 0,
  334.  Then Return '';
  335.  NET.!groupentry = 'GN.'NET.!grp.Name';FN.'NET.!grp.comment';UL.'
  336.  if NetGetInfo(340,NET.!grp,NET.!dcid,NET.!grpName) <> 0,
  337.  Then Return ''; /* cannot sample users in this group */
  338.  Do NET.!gc = 1 to NET.!grp.0
  339.   NET.!groupentry = NET.!groupentry||Value('NET.!grp.'NET.!gc)' '
  340.  End;
  341. Drop NET.!grp. NET.!gc
  342. Return Space(NET.!groupentry)';'
  343. /*-------------------------------------------------------------------*/
  344. GETSERVER: /* get an server entry */
  345. Arg NET.!srvname
  346.  if NET.!srvname = '' Then Return ''; /* id required */
  347.  if SubStr(NET.!srvname,1,1) <> '\',
  348.  Then NET.!srvname = '\\'NET.!srvname;
  349.  if NetGetInfo(160,Net.!srv,NET.!srvname) <> 0,
  350.  Then Return ''; /* cannot find server */
  351. NET.!serverentry = 'SN.'NET.!srv.name';FN.'NET.!srv.comment';'
  352. drop NET.!srv.
  353. Return Space(NET.!serverentry)
  354. /*-------------------------------------------------------------------*/
  355. GETSHARE: /* get an share ressource entry */
  356.  
  357. Return Space(NET.!shareentry);
  358. /*-------------------------------------------------------------------*/
  359. GETUSER: /* get an user entry from net */
  360. Arg NET.!usrname
  361.  if NET.!usrname = '' Then Return ''; /* id required */
  362.  If NetGetInfo(280,NET.!usr,NET.!dcid,NET.!usrname) <> 0,
  363.  Then Return '';
  364.  Call NetGetInfo 330,NET.!grp,NET.!dcid,NET.!usrName
  365.  NET.!userentry = 'UN.'NET.!usr.name';'
  366.  NET.!userentry = NET.!userentry'FN.'NET.!usr.full_name';'
  367.  NET.!userentry = NET.!userentry'OP.'SubStr(NET.!usr.priv,1,1)';'
  368.  NET.!userentry = NET.!userentry'PW.'NET.GetPW(NET.!usrname)';'
  369.  NET.!userentry = NET.!userentry'AF.'NET.!usr.flags';' /* account flags */
  370.  NET.!userentry = NET.!userentry'LL.'NET.Landate(NET.!usr.last_logon)';' /* last logon */
  371.  if NET.!usr.comment <> '-none-',
  372.  Then NET.!userentry = NET.!userentry||NET.!usr.comment
  373.  Else NET.!userentry = NET.!userentry'PO.;AC.;AS.;HD.;';
  374.  if SubStr(Reverse(NET.!userentry),1,1) <> ';',
  375.  Then NET.!userentry = NET.!userentry';' /* add a delimiter */
  376.  if NET.!usr.home_dir <> '-none-',
  377.  Then NET.!userentry = NET.!userentry'FS.'NET.!usr.home_dir';'
  378.  Else NET.!userentry = NET.!userentry'FS.;'
  379.  if Space(NET.!usr.max_storage) <> 'No Limit',
  380.  Then NET.!userentry = NET.!userentry'WS.'NET.!usr.max_storage';'
  381.  Else NET.!userentry = NET.!userentry'WS.;'
  382.  NET.!userentry = NET.!userentry'GL.';
  383.  Do NET.!gc = 1 to NET.!grp.0
  384.   NET.!userentry = NET.!userentry||Value('NET.!grp.'NET.!gc)' '
  385.  End;
  386.  Drop NET.!usr. NET.!grp. NET.!gc
  387. Return Space(NET.!userentry)';'
  388. /*-------------------------------------------------------------------*/
  389. ID: /* identify myself */
  390.  if NetGetInfo(350,NET.!my,'') <> 0,
  391.  Then Return ''; /* cannot identify myself */
  392.  if NET.!my.username = '' Then Return '';
  393.  Parse Var NET.!my.computername '\\'NET.!my.hostid
  394.  NET.!dcid = SetDomain(NET.!my.logon_domain);
  395.  NET.!userid = Space(NET.!my.username'@'NET.!my.hostid'.'NET.!my.logon_domain' via 'NET.!dcid);
  396.  drop NET.!my.
  397. Return NET.!userid
  398. /*-------------------------------------------------------------------*/
  399. INIUSER: /* initialize DCDB for user */
  400. Parse Arg NET.!userentry,DCDBinit
  401.  /* init settings */
  402.  NET.!usr.name = GetTag('UN.',NET.!userentry);
  403.  
  404.  if DCDBinit = '',/* init DCDB ? */
  405.  Then Do; /* yes */
  406.    NET.!errcode = NetMisc(720,NET.!usr.name,NET.!dcid)
  407.    if NET.!errcode <> 0 Then Return NET.!errcode /* cannot init DCDB */
  408.  End; /* if DCDBinit */
  409.  /* however, init profiles here */
  410.  Call Net.Profile NET.!userentry,'profile.bat';
  411.  Call Net.Profile NET.!userentry,'profile.cmd';
  412.  
  413.  drop NET.!usr.
  414. Return 0;
  415. /*-------------------------------------------------------------------*/
  416. LSTALIAS: /* list LAN aliases */
  417.  if NetEnumerate(20,NET.!als,NET.!dcid) = 0,
  418.  Then Return '';
  419.  NET.!AliasList = NET.!als.0';' /* no of entries */
  420.  Do NET.!ac = 1 to NET.!als.0
  421.   NET.!AliasList = NET.!AliasList||Value('NET.!als.'NET.!ac)' '
  422.  End; /* do ac */
  423.  Drop NET.als. ac
  424. Return Space(NET.!AliasList)
  425. /*-------------------------------------------------------------------*/
  426. LSTFILE: /* get a list of open files on a particular server */
  427. Arg NET.!serverentry,NET.!path
  428.  NET.!srvname = GetTag('SN.',NET.!serverentry);
  429.  if SubStr(NET.!srvname,1,1) <> '\',
  430.  Then NET.!srvname = '\\'NET.!srvname;
  431.  if NetEnumerate(60,NET.!files,NET.!srvname,NET.!path) <> 0,
  432.  Then Return ''; /* cannot retrieve open files */
  433.  NET.!filelist = Net.!files.count';'
  434.  Do NET.!fc = 1 to NET.!files.count
  435.   NET.!filelist = NET.!filelist||Value('NET.!files.'NET.!fc'.id')' '
  436.  End;
  437. Drop NET.!files. NET.!fc
  438. Return Space(NET.!filelist);
  439. /*-------------------------------------------------------------------*/
  440. LSTSERVER: /* get a list of all servers in this domain */
  441.  if NetEnumerate(160,NET.!srv,NET.!dcid,-1) <> 0,
  442.  Then Return ''; /* cannot use LAN */
  443.  NET.!serverlist = NET.!srv.0';'
  444.  Do NET.!sc = 1 to NET.!srv.0
  445.   NET.!serverlist = NET.!serverlist||Value('NET.!srv.'NET.!sc)' '
  446.  End;
  447.  Drop NET.!srv. NET.!sc
  448. Return Space(NET.!serverlist);
  449. /*-------------------------------------------------------------------*/
  450. LSTUSER: /* get a list of all user ids starting with N of users */
  451.  if NetEnumerate(280,NET.!usr,NET.!dcid) <> 0,
  452.  Then Return ''; /* error condition */
  453.  NET.!userlist = NET.!usr.0';';
  454.  Do NET.!uc = 1 to NET.!usr.0
  455.  NET.!userlist = NET.!userlist||Value('NET.!usr.'NET.!uc)' '
  456.  End;
  457.  Drop NET.!usr. NET.!uc
  458. Return Space(NET.!userlist);
  459. /*-------------------------------------------------------------------*/
  460. MODUSER: /* replace a particular user tag entry in the net */
  461. Parse Arg NET.!TagID,NET.!userentry;
  462.  NET.!uid = GetTag('UN.',NET.!userentry); /* parse user id */
  463.  Select
  464.    When NET.!TagID = 'AF.',
  465.       Then Return NetSetInfo(280,'flags',GetTag('AF.',NET.!userentry),NET.!dcid,NET.!uid);
  466.    When NET.!TagID = 'OP.',
  467.       Then Return NetSetInfo(280,'priv',NET.Privilege(GetTag('OP.',NET.!userentry)),NET.!dcid,NET.!uid);
  468.    When NET.!TagID = 'FN.',
  469.       Then Return NetSetInfo(280,'full_name',GetTag('FN.',NET.!userentry),NET.!dcid,NET.!uid);
  470.    When NET.!TagID = 'FS.',
  471.       Then Return NetSetInfo(280,'home_dir',GetTag('FS.',NET.!userentry),NET.!dcid,NET.!uid);
  472.    When NET.!TagID = 'WS.',
  473.       Then Return NetSetInfo(280,'max_storage',GetTag('WS.',NET.!userentry),NET.!dcid,NET.!uid);
  474.    When NET.!TagID = 'PW.',
  475.       Then if Pos(':',GetTag('PW.',NET.!userentry)) = 0,
  476.          Then Return NetSetInfo(280,'password',GetTag('PW.',NET.!userentry),NET.!dcid,NET.!uid);
  477.          Else Return Net.setpw(GetTag('PW.',NET.!userentry));
  478.    When NET.!TagID = 'PO.',
  479.       Then Return NetSetInfo(280,'comment',Net.Comment(NET.!userentry),NET.!dcid,NET.!uid);
  480.    When NET.!TagID = 'AC.',
  481.       Then Return NetSetInfo(280,'comment',Net.Comment(NET.!userentry),NET.!dcid,NET.!uid);
  482.    When NET.!TagID = 'AS.',
  483.       Then Return NetSetInfo(280,'comment',Net.Comment(NET.!userentry),NET.!dcid,NET.!uid);
  484.    When NET.!TagID = 'HD.',
  485.       Then Return NetSetInfo(280,'comment',Net.Comment(NET.!userentry),NET.!dcid,NET.!uid);
  486.    When NET.!TagID = 'GL.',
  487.       Then Do;
  488.             NET.!grplist = GetTag('GL.',NET.!userentry);
  489.             NET.!gc = 0;
  490.             Do While NET.!grplist <> ''
  491.               Parse Value Space(NET.!grplist) with NET.!grpname' 'NET.!grplist
  492.               if NET.!grpname = '' Then Leave;
  493.               if NET.!grpname = 'USERS' Then Iterate; /* system default */
  494.               NET.!gc = NET.!gc + 1;
  495.               Call Value 'NET.!grp.'NET.!gc'.name',Space(NET.!grpname)
  496.             End;
  497.             NET.!grp.count = NET.!gc;
  498.             Drop NET.!grplist NET.!gc
  499.             Return NetSetInfo(330,NET.!grp,NET.!dcid,NET.!uid);
  500.        End;
  501.  OtherWise Return 1; /* unknown tagname */
  502.  End; /* select */
  503. Return 0; /* to be safe */
  504. /*-------------------------------------------------------------------*/
  505. SETDOMAIN: /* identify domain controller of domain xy */
  506. Arg DomainName
  507.  Parse Value NetMisc(510,DomainName,''),
  508.   with ErrCode NET.!dcid
  509. Return NET.!dcid; /* empty if erroneous */
  510. /*-------------------------------------------------------------------*/
  511. SETFILES: /* modify a home file set entry */
  512. Parse Arg NET.!userentry
  513. Return Space(NET.!userentry)
  514. /*-------------------------------------------------------------------*/
  515. SETHOME: /* set home file set and init access */
  516. /* return codes:
  517.    0 - home files defined and set
  518.    1 - home files rights undefined (no dir entry)
  519.    x - cannot create/modify/apply
  520. */
  521. Parse Arg NET.!userentry
  522.  Parse Value GetTag('FS.',NET.!userentry),
  523.    with ':\'NET.!srv'\'NET.!res
  524.  if NET.!srv = '' Then Return 1; /* no dir entry */
  525.  NET.!srv = '\\'NET.!srv;
  526.  NET.!res = translate(NET.!res,':','$'); /* replace $ by : */
  527.  NET.!acl.audit = 'N'; /* no audit required */
  528.  NET.!acl.count = 1;  /* only this user */
  529.  NET.!acl.1.ugname = GetTag('UN.',NET.!userentry); /* this user */
  530.  NET.!acl.1.access = 'RWCXDAP'; /* set all */
  531.  ErrCode = NetAdd(10,NET.!acl,NET.!srv,NET.!res); /* try to create one */
  532.  if ErrCode <> 0, /* cannot create */
  533.  Then ErrCode = NetSetInfo(10,NET.!acl,NET.!srv,NET.!res); /* try to modify */
  534.  if ErrCode = 0, /* is modified, now apply */
  535.  Then ErrCode = NetMisc(520,NET.!acl,NET.!srv,NET.!res); /* apply to SDs */
  536.  Drop NET.!srv NET.!res NET.!acl.
  537. Return ErrCode
  538. /*-------------------------------------------------------------------*/
  539. SETUSER: /* replace an user entry completely */
  540. Parse Arg NET.!userentry
  541.  Call ModUser 'OP.',NET.!userentry; /* replace privilege level */
  542.  Call ModUser 'FN.',NET.!userentry; /* replace full name */
  543.  Call ModUser 'AF.',NET.!userentry; /* replace flags */
  544.  Call ModUser 'PO.',NET.!userentry; /* replace cc:mail entry */
  545.  Call ModUser 'AC.',NET.!userentry; /* replace account entry */
  546.  Call ModUser 'AS.',NET.!userentry; /* replace asia entry */
  547.  Call ModUser 'HD.',NET.!userentry; /* replace home domain */
  548.  Call ModUser 'FS.',NET.!userentry; /* replace home fileset */
  549.  Call ModUser 'WS.',NET.!userentry; /* replace max storage */
  550.  Call ModUser 'GL.',NET.!userentry; /* replace grouplist */
  551.  Call ModUser 'PW.',NET.!userentry; /* replace passowrd */
  552. Return 0;
  553. /*-------------------------------------------------------------------*/
  554. SHOUSER: /* sho data from NET.!userentry */
  555. Parse Arg NET.!userentry
  556. Call Info '------------'
  557. Call Info 'on DC       'NET.!DCID
  558. Call Info 'Net Name    'GetTag('UN.',NET.!userentry);
  559. Call Info 'Full Name   'GetTag('FN.',NET.!userentry);
  560. Call Info 'Password    'GetTag('PW.',NET.!userentry);
  561. Call Info 'Privilege   'NET.Privilege(GetTag('OP.',NET.!userentry));
  562. Call Info 'User Flags  'GetTag('AF.',NET.!userentry);
  563. Call Info 'Home Domain 'GetTag('HD.',NET.!userentry);
  564. Call Info 'Post Office 'GetTag('PO.',NET.!userentry);
  565. Call Info 'Account     'GetTag('AC.',NET.!userentry);
  566. Call Info 'last logon  'GetTag('LL.',NET.!userentry);
  567. Call Info 'ASIA entry  'GetTag('AS.',NET.!userentry);
  568. Call Info 'Group List  'GetTag('GL.',NET.!userentry);
  569. Call Info 'Home Files  'GetTag('FS.',NET.!userentry);
  570. Call Info '------------'
  571. Return 0;
  572. /*-------------------------------------------------------------------*/
  573. /* internal functions here */
  574. /*-------------------------------------------------------------------*/
  575. NET.Landate: Procedure /* compute last login date to yyddd */
  576. Arg NET.!date
  577.  if NET.!date = 'UNKNOWN' Then Return ''; /* empty date */
  578.  Parse Value Translate(NET.!date,' ','0a'x) with . mm dd . yy .
  579.  if yy//4 = 0, /* leap year ? */
  580.  Then !feb = 29; /* yes */
  581.  Else !feb = 28; /* no */
  582.  !MJulian = '00 31 '!feb' 31 30 31 30 31 31 30 31 30 31'
  583.  /* yy = SubStr(yy,3,2) */
  584.  !MNames = 'JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC';
  585.  !Days = 0;
  586.  Do !i = 1 to WordPos(mm,!MNames)
  587.   !days =  !days + Word(!MJulian,!i);
  588.  End;
  589. Return yy||Right(!days+dd,3,'0')
  590. /*-------------------------------------------------------------------*/
  591. NET.Comment: /* generate the comment field from NET.!userentry */
  592. Parse Arg NET.!userentry
  593.  NET.!usrcomment = 'PO.'GetTag('PO.',NET.!userentry)
  594.  NET.!usrcomment = NET.!usrcomment';AC.'GetTag('AC.',NET.!userentry)
  595.  NET.!usrcomment = NET.!usrcomment';AS.'GetTag('AS.',NET.!userentry)
  596.  NET.!usrcomment = NET.!usrcomment';HD.'GetTag('HD.',NET.!userentry)
  597. Return NET.!usrcomment';'
  598. /*-------------------------------------------------------------------*/
  599. NET.Domains: /* domain map handler */
  600. Parse Arg NET.!domainmap
  601.  /* read domain master files */
  602.  MyMark = 'DOMAINS';
  603.  NET.!MasterBuffer = FileRead(NET.!domainMap);
  604.  if NET.!MasterBuffer = '' Then Return ''; /* nothing read */
  605.  
  606.  NET.!MasterEntry = RecGet(NET.!MasterBuffer,'UN.'MyMark);
  607.  if NET.!MasterEntry = '' Then Return ''; /* cannot identify */
  608.  
  609.  if GetTag('GL.',NET.!MasterEntry) = '', /* empty domain list ? */
  610.  Then Do; /* yes, built one */
  611.    NET.!buffer = NET.!MasterBuffer;
  612.    Do While NET.!Buffer <> ''
  613.      Parse Var NET.!Buffer NET.!Entry '0d0a'x NET.!Buffer
  614.      if SubStr(NET.!Entry,1,3) <> 'UN.' Then Iterate; 
  615.      if GetTag('UN.',NET.!Entry) = MyMark Then Iterate;
  616.      NET.!domain = GetTag('GL.',NET.!MasterEntry)' 'GetTag('UN.',NET.!Entry);
  617.      NET.!MasterEntry = SetTag('GL.',NET.!domains,NET.!MasterEntry)
  618.    End; /* do while */
  619.    Drop NET.!domain
  620.  End; /* if domains */
  621. Return NET.!MasterEntry;
  622. /*-------------------------------------------------------------------*/
  623. NET.Profile: /* (re-)write profile */
  624. Parse Arg NET.!userentry,NET.!profn
  625.  /* profiles here */
  626.  NET.!usr.dcdb = NET.!dcid'\admin$\dcdb\users\'GetTag('UN.',NET.!userentry);
  627.  Genned = 'REM genned 'Date()' 'Time()' by 'MyID
  628.  Mailer = Net.Mailer(GetTag('PO.',NET.!userentry));
  629.  
  630. /* save current profile */
  631.  Call FileWrite NET.!usr.dcdb'\profile.old',FileRead(NET.!usr.dcdb'\'NET.!profn);
  632.  NET.!Buffer = FileRead(NET.!usr.dcdb'\'NET.!profn);
  633.  if NET.!Buffer = '', /* has data ? */
  634.  Then NET.!Buffer = RecSet(NET.!Buffer,,'@ECHO OFF'); /* no, init */
  635.  NET.!Buffer = RecSet(NET.!Buffer,'REM genned',Genned);
  636.  NET.!Buffer = RecSet(NET.!Buffer,'NET USE S:',NET.Mailer(NET.!poname));
  637.  Call FileWrite NET.!usr.dcdb'\'NET.!profn,NET.!Buffer;
  638.  Drop NET.!buffer;
  639. Return 0;
  640. /*-------------------------------------------------------------------*/
  641. NET.Mailer: /* retrieve mailer */
  642. Arg NET.!poname
  643. /* actually, simple assignment, hard coded */
  644.  if NET.!poname = '' Then Return ''
  645.  if NET.!poname = 'CIP' Then Return 'NET USE S: \\cip-srv\CIP'
  646. Return 'NET USE S: \\mail-srv\'Net.!poname;
  647. /*-------------------------------------------------------------------*/
  648. NET.Privilege: Procedure /* generate privilege data */
  649. Arg NET.!Priv
  650.  if NET.!Priv = 'U' Then Return 'User';
  651.  if NET.!Priv = 'A' Then Return 'Administrator';
  652.  if NET.!Priv = 'G' Then Return 'Guest';
  653. Return ''; /* error condition */
  654. /*-------------------------------------------------------------------*/
  655. NET.GETPW: /* retrieve PW from DC */
  656. Arg NET.!uid
  657.  if IsFile(NET.!dcid'\admin$\netprog\pwdexp.exe') = '',
  658.  Then Return ''; /* no program, fake empty pw */
  659.  If NetMisc(710,'pwdexp 'NET.!uid,NET.!dcid,'NET.!Result') <> 0,
  660.  Then Return ''; /* program error, fake empty pw */
  661.  Parse Var NET.!Result.output Net.!Result.Output '0d0a'x;
  662. Return Space(NET.!Result.output);
  663. /*-------------------------------------------------------------------*/
  664. NET.SETPW: /* set PW from DC */
  665. Arg NET.!pwentry
  666.  if IsFile(NET.!dcid'\admin$\netprog\pwdimp.exe') = '',
  667.  Then Return ''; /* no program, fake empty pw */
  668. Return NetMisc(710,'pwdimp 'NET.!pwentry,NET.!dcid,'NET.!Result');
  669. /*-------------------------------------------------------------------*
  670. m* MODULE files
  671.  * <C> Wolfram Fassbender, wofa@wiwiss.fu-berlin.de
  672.  * history:
  673.  * 1996/12/06 - 1.0 initial release
  674.  * 1997/03/08 - 1.1 added ISDIR, ISFILE functions
  675.  * 1997/12/08 - 2.0 renewed RECxxx functions
  676.  * 1998/02/08 - 2.1 added SCRATCHFILE function
  677. c* notes:
  678. c* - need REXXUTIL.DLL (from IBM OS/2 REXX)
  679.  *-------------------------------------------------------------------*/
  680. FILESINI: /* init module files */
  681.  Call RxFuncAdd Sysloadfuncs,rexxutil,sysloadfuncs
  682.  Call sysloadfuncs
  683. Return 0;
  684. /*-------------------------------------------------------------------*/
  685. FILESFIN: /* finit module files */
  686. Drop FILES.
  687. Return 0;
  688. /*-------------------------------------------------------------------*/
  689. CDDIR: /* change to dir, make one if not existing */
  690. Parse Arg FILES.!dn
  691.  if FILES.!dn = '' Then Return '';
  692.  if \isdir(FILES.!dn),
  693.  Then Call SysMkDir FILES.!dn;
  694.  Call Directory FILES.!dn;
  695. Return Directory();
  696. /*-------------------------------------------------------------------*/
  697. DIRDEL: Procedure /* delete dirtree */
  698. Parse Arg FILES.!dn                         
  699. Call FileDel FILES.!dn'\*.*'
  700. Call SysFileTree FILES.!dn'\*.*',FILES.!isdir.,'OD';
  701. if FILES.!isdir.0 = 0,
  702. Then Return SysRmDir(FILES.!dn); /* no, one dir */
  703. Do i = 1 to FILES.!isdir.0
  704.  Call DirDel(FILES.!isdir.i);
  705. End; /* do i */
  706. Return SysRmDir(FILES.!dn); /* dir removed */
  707. /*-------------------------------------------------------------------*/
  708. DIRGEN: /* make a subdirectory and its rootpath */
  709. Parse Arg FILES.!dn;
  710.  if FILES.!dn = '' Then Return ''; /* need dirname */
  711.  Select
  712.    When Pos('$',FILES.!dn) > 0, /* have UNC ? */
  713.    then Do; Parse Var FILES.!dn FILES.!root '$\'FILES.!tree; FILES.!root = FILES.!root'$';end;
  714.    When Pos(':',FILES.!dn) > 0, /* have Drive ? */
  715.    then Do; Parse Var FILES.!dn FILES.!root ':\'FILES.!tree; FILES.!root = FILES.!root':';end;
  716.  OtherWise Do; Parse Var FILES.!dn FILES.!root '\'FILES.!tree; FILES.!root = FILES.!root;end;
  717.  End; /* select */
  718.  Do While FILES.!tree <> ''
  719.   Parse Var FILES.!tree FILES.!ldn'\'FILES.!tree
  720.   if FILES.!ldn = '' Then Leave; /* to be safe */
  721.   FILES.!root = FILES.!root'\'FILES.!ldn;
  722.   if \isdir(FILES.!root),
  723.   Then Call SysMkDir FILES.!root;
  724.  End;
  725. Return FILES.!dn;
  726. /*-------------------------------------------------------------------*/
  727. FILEDEL: Procedure /* delete file(s) */
  728. Parse Arg FILES.!fn
  729. if Pos('*',Files.!fn) = 0, /* more than one file ? */
  730. Then Return SysFileDelete(FILES.!fn);  /* no, one file */
  731. Call SysFileTree FILES.!fn,FILES.!isfile.,'OF','*****','***-*';
  732. if FILES.!isfile.0 = 0 Then Return '';
  733.  '@attrib -r * > NUL'; /* to be safe */
  734. Do i = 1 to FILES.!isfile.0
  735.  Call SysFileDelete FILES.!isfile.i;
  736. End; /* do i */
  737. Return 0; /* file(s) purged */
  738. /*-------------------------------------------------------------------*/
  739. FILEREAD: /* read a complete file into FILES.!buffer */
  740.  Parse Arg FILES.!fn,delflag
  741.  if FILES.!fn = '' Then Return '';
  742.  Call Stream FILES.!fn,'c','close'; /* before reading */
  743.  Parse Value CharIn(FILES.!fn,1,Chars(FILES.!fn)) with FILES.!buffer'1A'x;
  744.  Call Stream FILES.!fn,'C','Close';
  745.  if delflag <> '' Then Call FileDel FILES.!fn /* delete after read */
  746. Return FILES.!buffer
  747. /*-------------------------------------------------------------------*/
  748. FILEWRITE: /* rewrite a file from FILES.!buffer */
  749.  Parse Arg FILES.!fn,FILES.!buffer
  750.  if FILES.!fn = '' Then Return '';
  751.  Call Stream FILES.!fn,'c','close'; /* before writing */
  752.  Call SysFileDelete FILES.!fn /* garantuee complete rewrite */
  753.  Call CharOut FILES.!fn,FILES.!buffer'1A'x,1;
  754.  Call Stream FILES.!fn,'C','Close';
  755. Return 0;
  756. /*-------------------------------------------------------------------*/
  757. ISDIR: /* is directory ? return true/false */
  758. Parse Arg FILES.!dn
  759. Return IsFile(FILES.!dn) = '' & Stream(FILES.!dn,'c','query size') = 0;
  760. /*-------------------------------------------------------------------*/
  761. ISFILE: /* is file ? return filename if existing otherwise '' */
  762. Parse Arg FILES.!fn
  763. if FILES.!fn = '' Then Return ''; /* not found */
  764. Return Stream(FILES.!fn,'c','Query Exists');
  765. /*-------------------------------------------------------------------*/
  766. RECGET: Procedure /* get 1st record with id from buffer */
  767. Arg FILES.!buffer,FILES.!id /* come in uppercase */
  768.  if FILES.!buffer = '' Then Return ''; /* nothing to scan */
  769.  Parse Var FILES.!buffer,
  770.    FILES.!header (FILES.!id) FILES.!trailer '0d0a'x FILES.!buffer
  771.  if FILES.!trailer = '' Then Return ''; /* nothing found */
  772.  Parse Value Reverse(FILES.!header),
  773.     with FILES.!header'0a'x /* back to crlf */
  774.  FILES.!header = Reverse(FILES.!header);
  775.  if SubStr(FILES.!header,1,1) = ';', /* is comment ? */
  776.  Then Return RecGet(FILES.!buffer,FILES.!id); /*yes, try rest */
  777. Return FILES.!header||FILES.!id||FILES.!trailer; /* got it */
  778. /*-------------------------------------------------------------------*/
  779. RECSET: /* add/ins/del a record */
  780. Arg FILES.!buffer,FILES.!id,FILES.!newrec  /* come in uppercase */
  781.  if FILES.!buffer = '', /* empty buffer ? */
  782.  Then Return FILES.!newrec; /* yes, new record becomes 1st record */
  783.  Parse Var FILES.!buffer,
  784.    FILES.!header (FILES.!id) FILES.!data '0d0a'x FILES.!trailer
  785.  if FILES.!data = '', /* found id ? */
  786.  Then if SubStr(FILES.!buffer,Length(FILES.!buffer),1) = '0a'x,
  787.       Then Return FILES.!buffer||FILES.!newrec /* no, append */
  788.       Else Return FILES.!buffer'0d0a'x||FILES.!newrec /* no, append */
  789.  Parse Value Reverse(FILES.!header),
  790.     with FILES.!record '0a0d'x /* back to crlf */
  791.  FILES.!record = Reverse(FILES.!record);
  792.  if SubStr(FILES.!record,1,1) = ';', /* is comment ? */
  793.  Then /* yes, retry */ Return FILES.!header||FILES.!id||FILES.!data'0d0a'x||RecSet(FILES.!trailer,FILES.!id,FILES.!newrec);
  794.  if FILES.!newrec = '', /* empty new record ? */
  795.  Then Return FILES.!header||FILES.!trailer /* yes, delete */
  796.  if FILES.!trailer = '', /* has trailer ? */
  797.  Then Return FILES.!header||FILES.!newrec /* no, append */
  798. Return FILES.!header||FILES.!newrec'0d0a'x||FILES.!trailer /* replace */
  799. /*-------------------------------------------------------------------*/
  800. SCRATCHFILE: /* return a scratch file name */
  801. Parse Arg FILES.!fn /* template, eg. ??DIR?.??? */
  802. if FILES.!fn = '', /* have template ? */
  803. Then Return SysTempFileName('$$$?????.$$$'); /* no, retry my own */
  804. FILES.!scratchname = SysTempFileName(FILES.!fn);
  805. if FILES.!scratchname <> '', /* got one ? */
  806. Then Return FILES.!scratchName; /* yes, return name */
  807. /*-------------------------------------------------------------------*
  808. m* MODULE TAG                                                        
  809.  * FILES
  810.  *
  811.  * <C> Wolfram Fassbender, wofa@wiwiss.fu-berlin.de
  812.  * History
  813.  * 1996/12/08 - 1.0 initial version, from NET module
  814.  * 1997/06/12 - 1.1 added tags for IBM LAN SERVER
  815.  * 1997/12/12 - 2.0 completely reprogrammed (stiffened code)
  816.  * 1997/12/13 - 2.1 using UPPER CASE (speeding up)
  817.  * 1998/03/09 - 2.2 added function COPYTAG
  818. c*                                                                   
  819. c* Tag Fields as follows                                             
  820. c* - AC.yyddd      julian date of ACcount entry                      
  821. c* - AF.flags      Account Flags                                     
  822. c* - AR.rights     Access Rights                                     
  823. c* - AS.asia       ASia tag                                          
  824. c* - FN.name,name  FullName (cc:mail name)                           
  825. c* - FS.homedef    home File Set                                     
  826. c* - GN.groupid    GroupName                                         
  827. c* - GL.id id      NET.!grouplist                                    
  828. c* - HD.domain     Home Domain name                                  
  829. c* - LL.yyyyddd    julian date of Last Login entry                   
  830. c* - OP.privilege  user's Operation Privilege                        
  831. c* - PO.postoffice cc:mail Post Office name                          
  832. c* - PW.password   lan & cc:mail PassWord                            
  833. c* - RL.res-name   Ressource List                                    
  834. c* - RN.res-name   Ressource Name                                    
  835. c* - RP.res-path   Ressource Path/Queue                              
  836. c* - RT.res-type   Ressource Type (files, serial, printer)           
  837. c* - RU.res-users  Ressource max Users                               
  838. c* - SN.serverid   ServerName                                        
  839. c* - TH.threshold  threshold value
  840. c* - UL.userlist   userlist (in a group)                             
  841. c* - UN.userid     lan UserName                                      
  842. c* - WS.nnnn       Working Storage of homefileset                    
  843. c*                                                                   
  844. c* userentry record                                                  
  845. c* - UN.;FN.;OP.;PW.;AF.;LL.;PO.;AC.;AS.;HD.;FS.;WS.;GL.;RL.;        
  846. c*                                                                   
  847. c* groupentry record                                                 
  848. c* - GN.;FN.;FS.;PO.;AC.;WS.;FS.;WS.;UL.;                            
  849. c*                                                                   
  850. c* serverentry record                                                
  851. c* - SN.;FN.;                                                        
  852. c*                                                                   
  853. c* ressourceentry record                                             
  854. c* - RN.;FN.;SN.;RT.;RP.;RU.;                                        
  855. c*                                                                   
  856. c* filentry    record                                                
  857. c* - RN.;RP.;UN.;                                                    
  858. c*                                                                   
  859. c* Implementation Notes                                              
  860.  *-------------------------------------------------------------------*/
  861. TAGINI: /* initialize TAG module */
  862.  /* init global vars */
  863.  TAG.!List = 'AC. AF. AN. AR. AS.';
  864.  TAG.!List = TAG.!List' FL. FN. FS.'; /* note the starting blank */
  865.  TAG.!List = TAG.!List' GN. GL.';
  866.  TAG.!List = TAG.!List' HD.';
  867.  TAG.!List = TAG.!List' LL.';
  868.  TAG.!List = TAG.!List' OP.';
  869.  TAG.!List = TAG.!List' PO. PW.';
  870.  TAG.!List = TAG.!List' RL. RN. RP. RT. RU.';
  871.  TAG.!List = TAG.!List' SL. SN.';
  872.  TAG.!List = TAG.!List' TH.';
  873.  TAG.!List = TAG.!List' UL. UN.';
  874.  TAG.!List = TAG.!List' WS.';
  875. Return 0;
  876. /*-------------------------------------------------------------------*/
  877. TAGLIST: /* return a list of valid tags */
  878. Return TAG.!List;
  879. /*-------------------------------------------------------------------*/
  880. TAGFIN: /* finalize TAG module */
  881.  Drop TAG.
  882. Return 0;
  883. /*-------------------------------------------------------------------*/
  884. COPYTAG: /* copy a tag value from <source> to <sink> */
  885. Arg TAG.!name,TAG.!source,TAG.!sink
  886. Return SetTag(TAG.!name,GetTag(TAG.!name,TAG.!source),TAG.!sink);
  887. /*-------------------------------------------------------------------*/
  888. GETTAG: Procedure /* get tag data from an user entry */
  889. Parse Arg TAG.!name,TAG.!entry
  890.  if TAG.!entry = '' Then Return ''; /* empty tag */
  891.  Parse Var TAG.!entry (TAG.!name) TAG.!data';'
  892.  if TAG.!data = '-none-' Then TAG.!data = '';
  893. Return Space(TAG.!data);
  894. /*-------------------------------------------------------------------*/
  895. SETTAG: /* set tag in an user entry */
  896. Parse Arg TAG.!name,TAG.!newdata,TAG.!entry
  897.  if WordPos(TAG.!name,TAG.!List) = 0,
  898.  Then Return TAG.!entry; /* Tagname unknown */
  899.  TAG.!newdata = Strip(Translate(TAG.!newdata,' ',';'));
  900.  Parse Var TAG.!entry TAG.!header (TAG.!name) TAG.!data';'TAG.!trailer;
  901. Return TAG.!header||TAG.!name||TAG.!newdata';'||TAG.!trailer; /* yes, rep */
  902. /*-------------------------------------------------------------------*
  903. m* MODULE prolog
  904.  * <C> Wolfram Fassbender, wofa@wiwiss.fu-berlin.de
  905.  * history:
  906.  * 1996/08/10 - 1.0 initial release
  907.  * 1996/08/16 - 1.1 added NIRVANA option
  908.  * 1996/08/20 - 1.2 initial LOGFILE setting becomes NUL
  909.  * 1997/01/12 - 1.3 new helper (see MAIN MODULE)
  910.  * 1997/05/12 - 1.4 new SYNTAX error exit (shortened)
  911.  * 1997/12/06 - 1.5 calls user FINI before dying
  912.  * 1998/03/16 - 1.6 set LOGfilename to current date
  913.  * notes:
  914.  * I wrote a MODGEN procedure which adds this PROLOG automatically
  915.  *-------------------------------------------------------------------*/
  916. PROLOG: /* starting here */
  917. Signal on SYNTAX;
  918. Signal on HALT; /* user interrupt exit */
  919. Parse Source OSName Environment Callee
  920.  
  921. If Pos('INSTORE',Translate(Callee)) = 0,
  922. Then; Do;
  923.   Parse Value Reverse(Callee),
  924.    with RealType'.'RealName'\'LocalPath;
  925.   RealType = Reverse(RealType);
  926.   RealName = Reverse(RealName);
  927.   LocalPath = Reverse(LocalPath);
  928. End;
  929. Else LocalPath = Directory();
  930.  
  931. Parse Arg ParmList'/'OptList
  932. ParmList = Space(ParmList); OptList = Space(OptList);
  933.  
  934. /* initialize constants */
  935. True = 1; False = 0;          /* boolean operands */
  936.  
  937. /* initialize defaults */
  938. Verbose = False; /* quiet mode */
  939. Nirvana = False; /* off to caller */
  940. Call Time R;
  941. LogFile = 'NUL'; /* log to nirvana */
  942.  
  943. /* standard helper */
  944. If ParmList = '?' Then Exit Help();
  945. If ParmList = '-?' Then Exit Help();
  946.  
  947. /* option parser */
  948. Call UserOpt; /* initialize user options */
  949. Do While OptList <> ''
  950.  Parse Var OptList Option'/'OptList
  951.  Call OptIni Option
  952. End; /* do while */
  953.  
  954. Call Info 'running as 'callee
  955. Return Main(0); /* off to caller */
  956. /*-------------------------------------------------------------------*/
  957. OPTINI: /* set option */
  958. Parse Arg Option
  959.  Parse Var Option OptName':'OptValue
  960.  OptName = Translate(Space(OptName,0));
  961.  Select
  962.   When Abbrev('?'      ,OptName,1) Then Return Help();
  963.   When Abbrev('LOGGING',OptName,1) Then LogFile = LocalPath'\'Date(s)'.log';
  964.   When Abbrev('VERBOSE',OptName,1) Then Verbose = True;
  965.   When Abbrev('SILENT' ,OptName,1) Then Verbose = False;
  966.   When Abbrev('NIRVANA',OptName,1) Then Nirvana = True;
  967.  OtherWise Return UserOpt(Optname,OptValue);
  968.  End; /* select */
  969.  if LogFile <> 'NUL',
  970.  Then Verbose = True; /* force chat */
  971. Return 0; /* option set */
  972. /*-------------------------------------------------------------------*/
  973. INFO: /* info with CRLF */
  974.  Parse Arg InfoMsg
  975.  if \Verbose Then Return 0; /* silent running */
  976.  InfoMsg = Date(o)' 'Time()': 'InfoMsg;
  977.  if SubStr(Reverse(InfoMsg),1,1) = '0d'x,
  978.  Then Return CharOut(,InfoMsg); /* tell it without LF */
  979.  Else Call LineOut ,'0d'x||InfoMsg; /* tell it */
  980.  If LogFile <> 'NUL',
  981.  Then Do;
  982.    Call LineOut LogFile,InfoMsg; /* append to log */
  983.    Call Stream LogFile,'c','Close'; /* close */
  984.  End;
  985. Return 0;
  986. /*-------------------------------------------------------------------*/
  987. HELP: /* help exit */
  988.  h = 1;
  989.  Do While SubStr(SourceLine(h),1,2) <> '.*'; /* skip to .* comments */
  990.    h = h + 1;
  991.  End; /* for */
  992.  Say '.* usage: ';
  993.  Say '.*    'Callee' ParmList /OptList'
  994.  Do While SubStr(SourceLine(h),1,2) = '.*' ; /* this is help */
  995.    Say SourceLine(h);
  996.    h = h + 1;
  997.  End; /* for */
  998.  Drop h;
  999. Return Die(1);
  1000. /*-------------------------------------------------------------------*/
  1001. LOWER: /* return mixed-case input in lowercase */
  1002. Arg uppercase /* translate here */
  1003. lo = 'abcdefghijklmnopqrstuvwxyz';
  1004. Return Translate(uppercase,lo,Translate(lo));
  1005. /*-------------------------------------------------------------------*/
  1006. SYNTAX: /* REXX error exit */
  1007.  Say 'REXX - Error : 'ErrorText(RC)
  1008.  Say 'in procedure : 'Callee;
  1009.  Say 'in line      : 'Sigl;
  1010.  Say 'Statement is : 'Space(SourceLine(Sigl)); 
  1011.  Say 'Environment  : 'OSName' 'Environment;
  1012.  /* and off */
  1013.  Nirvana = False; /* back to caller, is crash */
  1014. Return Die(2); /* anyway */
  1015. /*-------------------------------------------------------------------*/
  1016. CRASH: /* exit */
  1017.  Parse Arg ErrCode,ErrMsg
  1018.  Verbose = True; /* force */
  1019.  Call Info 'Crash- 'ErrMsg; /* tell it */
  1020.  Nirvana = False; /* back to caller, is crash */
  1021. Return DIE(ErrCode); /* anyway */
  1022. /*-------------------------------------------------------------------*/
  1023. HALT:   /* interrupt exit (ctrl-c) */
  1024.  Call Info 'User interrupted...';
  1025. Return Epilog(2);
  1026. /*-------------------------------------------------------------------*/
  1027. EPILOG: /* shutdown exit */
  1028. Arg ErrCode
  1029.  Call Info 'exiting with RC 'ErrCode
  1030. Return Die(ErrCode);
  1031. /*-------------------------------------------------------------------*/
  1032. DIE: /* panic exit  */
  1033. Arg ErrCode
  1034.  Call Fini ErrCode; /* user finalizing exit, called in any condition */
  1035.  If LogFile <> 'NUL',
  1036.  Then Call Stream LogFile,'c','close';
  1037.  if Nirvana Then '@Exit'; /* off into nirvana */
  1038.  if Environment = 'COMMAND' Then Exit ErrCode; /* off to OS */
  1039.  Drop Environment
  1040. Return ErrCode; /* return to caller */
  1041.