home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / lsmt213c.zip / setacl.cmd < prev    next >
OS/2 REXX Batch file  |  1996-10-09  |  14KB  |  428 lines

  1. /*---------------------------------------------------------------------------*\
  2. |   SET all access control profiles to  a LS 3.0 and higher                   |
  3. |   from an ASCII file                                                        |
  4. |       (C) Alain Rykaert IBM Belgium & Hermann Pauli IBM Germany SEP95-MAY96 |
  5. \*---------------------------------------------------------------------------*/
  6.  
  7.     Parse Arg Option
  8.  
  9.     Call INIT                     /* Initalisation of DLL's and other stuff*/
  10.     Call CHKOPT                          /* Check Options & display welcome*/
  11.     Call CHKPWS                               /* Check the PWS & Admin name*/
  12.     Call MAIN                                            /* do the main job*/
  13.     Call CHECKERR                                       /* check for Errors*/
  14.     Call QUIT                                                       /* Quit*/
  15.  
  16.  MAIN:/* ------------------------------------------------------ MAIN: -------*/
  17.  
  18.     Call Time('R')
  19.    'if exist' CHKF 'del' CHKF
  20.     EC    = 0
  21.     Apply = 0                                        /* no Apply by default*/
  22.     ExitCode = X2D('FE00')                          /* Good CID Return code*/
  23.  
  24.     do while Lines(INPF)
  25.        LLINE = strip(TRANSLATE(LineIN(INPF)))
  26.        OLINE = LLINE
  27.        parse value LLINE with OPT ';' LLINE
  28.        OPT = strip(OPT)
  29.        if length(OPT) >1
  30.         then select
  31.               when OPT = 'UA' | OPT = 'AA' | OPT = 'AU'
  32.                then do
  33.                        Apply = 1                        /* set Apply option*/
  34.                        OPT   = 'U'
  35.                end
  36.               otherwise nop
  37.              end
  38.         else nop
  39.  
  40.        select
  41.         when OPT = '' | LLINE = ''    then Iterate
  42.         when Left(OPT,1)      = '*'   then Iterate
  43.         when OPT              = 'OPT' then Call COLUMNS
  44.         when OPT              = 'D'   then Call DELACL
  45.         when OPT              = 'A'   then Call UPDACL
  46.         when OPT              = 'U'   then Call UPDACL
  47.         otherwise
  48.          do
  49.             Call LineOut CHKF, OLINE
  50.             Call Logit 'Main' , 'wrong input' , 'invalid option' OPT
  51.          end
  52.        end
  53.        if EC
  54.         then do
  55.                  Call LineOut CHKF, OLINE
  56.                  EC = 0
  57.                  ExitCode = X2D('1604')              /* Bad CID return code*/
  58.              end
  59.         else Nop
  60.     end
  61.  
  62.     say '0A0909'x 'Total Time  =' Trunc(Time('E'),2)
  63.  
  64.     Return
  65.  
  66.  UPDACL: /*---------------------------------------------------- UPDACL: -----*/
  67.  
  68.     /*   get the new ACL of the actual alias */
  69.     parse value LLINE with Alias ';' ACL.Audit ';' LLINE
  70.     ACL.Audit = strip(ACL.Audit)
  71.     if ACL.Audit = '-NONE-' then ACL.Audit = 'N'
  72.  
  73.     /* scan through input line to retrieve new ACL assignments         */
  74.     ACLNum = 0
  75.  
  76.     ACP_Set. = 0
  77.     i = 0
  78.     do while LLine <> ''
  79.        i = i + 1
  80.        UserGroup = UserGroupByCol.i
  81.        parse value LLINE with ActACP ';' LLINE
  82.        ActACP = strip(ActACP)
  83.        if ActACP <> ''
  84.        then do    /* there is an ACP */
  85.                ACLNum = ACLNum + 1
  86.                ACL.ACLNum.UGname  = strip(UserGroup)
  87.                ACL.ACLNum.access  = strip(ActACP)
  88.                ACP_Set.UserGroup = 1
  89.             end
  90.        else nop
  91.     end
  92.  
  93.     ACL.count = ACLNum
  94.  
  95.     say '0909'x 'updating Alias ...' Alias
  96.  
  97.     /* Retrieve info about alias (we need server and path) */
  98.     RC = NetGetInfo(NETALIAS, 'AliasInfo', '\\'SRVNAME, Alias)
  99.     if RC = 0
  100.      then nop
  101.      else do
  102.            call LOGIT 'NetGetInfo Alias' , Alias , RC
  103.            EC = 1
  104.            return
  105.           end
  106.  
  107.     /* find the correct ressource, dependend on alias type  */
  108.     select
  109.      when AliasInfo.type = 'Files'   then Alias_Res = AliasInfo.path
  110.      when AliasInfo.type = 'Printer' then Alias_Res = '\print\'AliasInfo.queue
  111.      when AliasInfo.type = 'Serial'  then Alias_Res = '\comm\'AliasInfo.queue
  112.      otherwise nop
  113.     end
  114.  
  115.     /* Get actual ACL for  alias */
  116.     RC = NetGetInfo(NETACCESS, 'O_ACL', '\\'AliasInfo.server, Alias_Res)
  117.     if RC = 0
  118.      then ACL_exists = 1
  119.      else if left(strip(RC),4) = '2222'         /* no ACP found */
  120.            then do
  121.                    ACL_exists  = 0
  122.                    O_ACL.count = 0
  123.                 end
  124.            else do
  125.                    call LOGIT 'NetGetInfo ACL' , W_User ||'/'|| Alias , RC
  126.                    EC = 1
  127.                    return
  128.                 end
  129.  
  130.     /*  del existing ACL for alias                             */
  131.     if ACL_exists
  132.      then do
  133.              RC = NetDelete(NETACCESS, '\\'AliasInfo.server, Alias_Res)
  134.              if RC = 0
  135.               then nop
  136.               else do
  137.                       Call LOGIT 'NetDelete ACL' , Alias , RC
  138.                       EC = 1
  139.                      return
  140.                    end
  141.  
  142.              /*  log deleted audit ?                       */
  143.              if strip(O_ACL.audit) <> '' & strip(Audit) = ''
  144.               then Call LOGIT 'Delete Audit' ,
  145.                               Alias 'Audit ('strip(O_ACL.i.access)')' , ''
  146.               else nop
  147.           end
  148.       else nop
  149.  
  150.  
  151.     /*  log deleted assignments                   */
  152.     do i = 1 to O_ACL.count
  153.        UserGroup = O_ACL.i.ugname
  154.        if ACP_Set.userGroup
  155.         then iterate
  156.         else Call LOGIT 'Delete ACP' ,,
  157.                         Alias UserGroup '-' strip(O_ACL.i.access) , ''
  158.     end
  159.  
  160.  
  161.     /*  add, update ACPs                          */
  162.  
  163.     /* no ACL -> create ACL and Add ACPs          */
  164.     RC = NetAdd(NETACCESS,'ACL','\\'AliasInfo.server, Alias_Res)
  165.  
  166.     if RC = 0
  167.      then do /* log changes */
  168.              call LOGIT 'New Audit' , Alias '-' strip(ACL.audit) , ''
  169.              do i = 1 to ACL.count
  170.                 call LOGIT 'New ACP' ,,
  171.                            Alias ACL.i.ugname '-' strip(ACL.i.access) , ''
  172.              end
  173.  
  174.              if Apply & AliasInfo.type = 'Files'
  175.               then do
  176.                       /* Apply access control profile to resource */
  177.                       RC = NetMisc(NETACCESSAPPLY, 'applyerr',,
  178.                                    '\\'AliasInfo.server, Alias_Res)
  179.                      if RC = 0
  180.                       then call logit 'Apply' , Alias Alias_Res , ''
  181.                       else do
  182.                               call logit 'NetMisc Apply' ,Alias ,,
  183.                               applyerr.error_buf applyerr.error_code RC
  184.                               EC =1
  185.                               return
  186.                            end
  187.                    end
  188.               else nop
  189.           end
  190.      else do /* log error */
  191.              Call LOGIT 'NetAdd ACL' , Alias , RC
  192.              EC = 1
  193.              return
  194.           end
  195.     Return
  196.  
  197.  DELACL: /*---------------------------------------------------- DELACL: -----*/
  198.  
  199.     i  = 0
  200.     say '0909'x 'Updating User ...' UserId
  201.  
  202.     parse value LLINE with Alias ';' .
  203.  
  204.     /* Retrieve info about alias (we need server and path) */
  205.     RC = NetGetInfo(NETALIAS, 'AliasInfo', '\\'SRVNAME, Alias)
  206.     if RC = 0
  207.      then nop
  208.      else do
  209.            call LOGIT 'NetGetInfo Alias' ,  Alias , RC
  210.            EC = 1
  211.            return
  212.           end
  213.  
  214.  
  215.     /* delete access control list */
  216.     RC = NetDelete(NETACCESS, '\\'AliasInfo.server, AliasInfo.path)
  217.     if RC = 0
  218.      then call LOGIT 'Delete ACL' , Alias '- all' , ''
  219.      else do
  220.              Call LOGIT 'NetDelete ACL' , Alias , RC
  221.              EC = 1
  222.              return
  223.           end
  224.     Return
  225.  
  226.  COLUMNS: /*--------------------------------------------------- COLUMNS: ----*/
  227.  
  228.     Banner.0 = 3
  229.     Banner.1 = LEFT('*',Length(OLINE),'-')
  230.     Banner.2 = OLINE
  231.     Banner.3 = Banner.1
  232.  
  233.     UGLst = OPT || ';' || LLINE
  234.  
  235.     parse value LLINE with . ';' . ';' LLINE
  236.  
  237.     i = 0
  238.     do while LLine <> ''
  239.        i = i+1
  240.        parse value LLINE with UserGroupByCol.i ';' LLINE
  241.        UserGroupByCol.i = strip(UserGroupByCol.i)
  242.     end
  243.     UserGroupByCol.0 = i /* UserGroupByCol.: user/group name retrieveable    */
  244.                          /*                  via col number                  */
  245.  
  246.     Return
  247.  
  248.  
  249.  CHECKERR: /*-------------------------------------------------- CHECKERR: ---*/
  250.  
  251.     Call Stream CHKF, 'C', 'CLOSE'
  252.     if \Lines(CHKF)
  253.      then Return
  254.      else do
  255.              do j = 1 to BANNER.0
  256.                 Call LineOut 'TEMP', BANNER.j
  257.              end
  258.              i = 0
  259.              do while Lines(CHKF)
  260.                 LLINE = LineIn(CHKF)
  261.                 Call LineOut 'TEMP', LLINE
  262.                 i = i + 1
  263.                 if i > 20
  264.                  then do
  265.                          do j = 1 to BANNER.0
  266.                             Call LineOut 'TEMP', BANNER.j
  267.                          end
  268.                           i = 0
  269.                       end
  270.                  else Nop
  271.              end
  272.           end
  273.  
  274.    Call Stream CHKF,   'C', 'CLOSE'
  275.    Call Stream 'TEMP', 'C', 'CLOSE'
  276.    Call SysFileDelete CHKF
  277.   'ren TEMP' CHKF
  278.  
  279.    Return
  280.  
  281.  CHKOPT: /*---------------------------------------------------- CHKOPT: -----*/
  282.  
  283.     SRVNAME = '';
  284.     INPF    = 'ACL.CSV';
  285.     LOGF    = 'LSMT.LOG';
  286.     CHKF    = 'ACL.CHK';
  287.     PIPE    = '';
  288.     TRACE   = 0;
  289.     MUTE    = 0;
  290.  
  291.     OPTION = Translate(OPTION)
  292.     do while OPTION <> ''
  293.        Parse value OPTION with ARGUMENT ' ' OPTION
  294.        select
  295.         when Left(ARGUMENT,5) = '/SRV:' then SRVNAME = Substr(ARGUMENT,6)
  296.         when Left(ARGUMENT,5) = '/INP:' then INPF    = Substr(ARGUMENT,6)
  297.         when Left(ARGUMENT,5) = '/LOG:' then LOGF    = Substr(ARGUMENT,6)
  298.         when Left(ARGUMENT,5) = '/CHK:' then CHKF    = Substr(ARGUMENT,6)
  299.         when Left(ARGUMENT,5) = '/PIP:' then PIPE    = Substr(ARGUMENT,6)
  300.         when Left(ARGUMENT,2) = '/M'    then MUTE    = 1
  301.         when Left(ARGUMENT,2) = '/T'    then TRACE   = 1
  302.         otherwise Nop
  303.        end
  304.     end
  305.  
  306.     if SRVNAME = '' then signal GETHELP
  307.  
  308.     if \MUTE
  309.      then do
  310.              Topic1='SETWELCOME'
  311.              Topic_String.Topic1.1=SRVNAME;
  312.              Topic_String.Topic1.2=INPF;
  313.              Topic_String.Topic1.3=LOGF;
  314.              Topic_String.Topic1.4=CHKF;
  315.              Topic_String.Topic1.5=PIPE' ';
  316.              Topic_List='WELCOMELOGO' Topic1 'SETACL';
  317.              Call GETANS
  318.              Parse VALUE SysCurPos() With Old_R Old_C; '@pause'
  319.              Call SysCurPos Old_R, Old_C; say ESC'[K'
  320.           end
  321.      else do
  322.              say 'ServerName =' SRVNAME
  323.              say 'InputFile  =' INPF
  324.              say 'LogFile    =' LOGF
  325.              say 'CheckFile  =' CHKF
  326.           end
  327.  
  328.     Return
  329.  
  330.  CHKPWS: /*---------------------------------------------------- CHKPWS: -----*/
  331.  
  332.     RC = NetGetInfo(350, 'WKSTAINFO','')
  333.     if RC = 0
  334.      then do
  335.              ADMNAME = WKSTAINFO.UserName
  336.              PWSNAME = WKSTAINFO.ComputerName
  337.           end
  338.      else do
  339.             Call LOGIT 'Get PWS Info', ,RC
  340.             Call Quit
  341.           end
  342.     Return
  343.  
  344.  INIT: /*------------------------------------------------------ INIT: -------*/
  345.  
  346.     Call RgUtil   '/m' /* Rexx Utilities        */
  347.     Call RgUtils  '/m' /* Rexx Utilities        */
  348.     Call RgLSRXUT '/m' /* Lan Server Rexx Utils */
  349.  
  350.     Parse Upper Source . . P_NAME
  351.     PRGN = Filespec('N', Left(P_NAME, Length(P_NAME) -4))
  352.  
  353.    '@echo off'
  354.     ESC   = '1B'x
  355.     REDIR = '>NUL 2>NUL'
  356.  
  357.     NETLOGONASN    = 52
  358.     NETALIAS       = 20
  359.     NETACCESS      = 10
  360.     NETACCESSAPPLY = 520
  361.     EC  = 0
  362.     CHKLines = 0
  363.  
  364.     Resource_File = 'LSMT.RSC'
  365.     Call CHKFILE Resource_File
  366.  
  367.     Return
  368.  
  369.  GETANS: /*---------------------------------------------------- GETANS: -----*/
  370.  
  371.     Vars_List =Ansi_Say(Resource_File Topic_List);
  372.     Parse VALUE SysCurPos() With Old_R Old_C;
  373.     Do While Vars_List <> '';
  374.        Parse VALUE Vars_List With Topic_Id ';' Var_Id ';' Row ';' Column ';' Color ';' Vars_List;
  375.        Call SysCurPos Row, Column;
  376.        Say x2c(Color) || Topic_String.Topic_Id.Var_Id || '1B'x || '[0m';
  377.        End;
  378.     Call SysCurPos Old_R, Old_C;
  379.  
  380.     Return
  381.  
  382.  GETHELP: /*--------------------------------------------------- GETHELP: ----*/
  383.  
  384.     if \MUTE
  385.      then do
  386.              Topic1='SETHELP'
  387.              Topic_String.Topic1.1=PRGN;
  388.              Topic_List=Topic1;
  389.              Call GETANS
  390.           end
  391.      else say 'Incorrect options.'
  392.  
  393.     Call QUIT
  394.  
  395.     Return
  396.  
  397.  CHKFILE: /*--------------------------------------------------- CHKFILE: ----*/
  398.  
  399.     Parse Arg FILE
  400.     RC = Stream(FILE, 'C', 'QUERY EXIST')
  401.     if RC = ''
  402.      then do
  403.              say ' File' FILE 'not found.'
  404.              Call QUIT
  405.           end
  406.      else Nop
  407.     Call Stream FILE, 'C', 'CLOSE'
  408.  
  409.     Return
  410.  
  411.  LOGIT: /*----------------------------------------------------- LOGIT: ------*/
  412.  
  413.     FUNC = ARG(1); INFO = ARG(2); RCOD = ARG(3)
  414.     RC = LLOGIT(LOGF, PIPE, ADMNAME, PRGN, FUNC, INFO, RCOD)
  415.  
  416.     Return
  417.  
  418.  QUIT: /*------------------------------------------------------ QUIT: -------*/
  419.  
  420.     Call LineOut 'LSMT.END', PRGN, 1
  421.     Call Stream  'LSMT.END', 'C', 'CLOSE'
  422.     Call Stream   INPF,      'C', 'CLOSE'
  423.     Call Stream   LOGF,      'C', 'CLOSE'
  424.     Call Stream   CHKF,      'C', 'CLOSE'
  425.     Exit ExitCode
  426.  
  427.  /*--------------------------------------------------------------------------*/
  428.