home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / os / vms / 12872 < prev    next >
Encoding:
Internet Message Format  |  1992-07-28  |  9.4 KB

  1. Path: sparky!uunet!cis.ohio-state.edu!ucbvax!UH01.Colorado.EDU!DWING
  2. From: DWING@UH01.Colorado.EDU (Dan Wing)
  3. Newsgroups: comp.os.vms
  4. Subject: Re: Can I change quota entries from DCL or a program?
  5. Message-ID: <01GMX30V3N8Y0004PJ@VAXF.COLORADO.EDU>
  6. Date: 28 Jul 92 22:38:37 GMT
  7. Sender: daemon@ucbvax.BERKELEY.EDU
  8. Distribution: world
  9. Organization: The Internet
  10. Lines: 261
  11.  
  12. Bob Boag, boag@marshall.wvnet.edu, wrote:
  13.  
  14. >I'm trying to design an application which allows specific users to adjust
  15. >quotas for other users. I'd like to be able to do this without writing SHOW
  16. >QUOTA to a file and then parsing it and generating commands for SYSMAN to
  17. >adjust the quota.
  18. >
  19. >I know that ALL-IN-1 somehow checks your quota - anyone know if it does
  20. >anything fancy besides parsing the output of a SHOW QUOTA or SYSMAN command?
  21.  
  22. Here's a program to parse the output of SHOW QUOTA.  It had a different
  23. application, but should be fairly easy to modify to do SHOW QUOTA/USER=[x,y]
  24.  
  25. -Dan Wing, DWING@UH01.Colorado.EDU or WING_D@UCOLMCC.BITNET (DGW11)
  26.  Systems Programmer, University Hospital, Denver
  27.  
  28. $! ------------------ CUT HERE -----------------------
  29. $ v='f$verify(f$trnlnm("SHARE_VERIFY"))'
  30. $!
  31. $! This archive created by VMS_SHARE Version 7.2-007  22-FEB-1990
  32. $!   On 28-JUL-1992 16:37:30.78   By user DWING
  33. $!
  34. $! This VMS_SHARE Written by:
  35. $!    Andy Harper, Kings College London UK
  36. $!
  37. $! Acknowledgements to:
  38. $!    James Gray       - Original VMS_SHARE
  39. $!    Michael Bednarek - Original Concept and implementation
  40. $!
  41. $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER
  42. $! AND EXECUTE AS A COMMAND PROCEDURE  (  @name  )
  43. $!
  44. $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING:
  45. $!       1. DISK_QUOTA.COM;3
  46. $!
  47. $set="set"
  48. $set symbol/scope=(nolocal,noglobal)
  49. $f=f$parse("SHARE_TEMP","SYS$SCRATCH:.TMP_"+f$getjpi("","PID"))
  50. $e="write sys$error  ""%UNPACK"", "
  51. $w="write sys$output ""%UNPACK"", "
  52. $ if f$trnlnm("SHARE_LOG") then $ w = "!"
  53. $ ve=f$getsyi("version")
  54. $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto START
  55. $ e "-E-OLDVER, Must run at least VMS 4.4"
  56. $ v=f$verify(v)
  57. $ exit 44
  58. $UNPACK: SUBROUTINE ! P1=filename, P2=checksum
  59. $ if f$search(P1) .eqs. "" then $ goto file_absent
  60. $ e "-W-EXISTS, File ''P1' exists. Skipped."
  61. $ delete 'f'*
  62. $ exit
  63. $file_absent:
  64. $ if f$parse(P1) .nes. "" then $ goto dirok
  65. $ dn=f$parse(P1,,,"DIRECTORY")
  66. $ w "-I-CREDIR, Creating directory ''dn'."
  67. $ create/dir 'dn'
  68. $ if $status then $ goto dirok
  69. $ e "-E-CREDIRFAIL, Unable to create ''dn'. File skipped."
  70. $ delete 'f'*
  71. $ exit
  72. $dirok:
  73. $ w "-I-PROCESS, Processing file ''P1'."
  74. $ if .not. f$verify() then $ define/user sys$output nl:
  75. $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='P1'
  76. PROCEDURE Unpacker ON_ERROR ENDON_ERROR;SET(FACILITY_NAME,"UNPACK");SET(
  77. SUCCESS,OFF);SET(INFORMATIONAL,OFF);f:=GET_INFO(COMMAND_LINE,"file_name");b:=
  78. CREATE_BUFFER(f,f);p:=SPAN(" ")@r&LINE_END;POSITION(BEGINNING_OF(b));
  79. LOOP EXITIF SEARCH(p,FORWARD)=0;POSITION(r);ERASE(r);ENDLOOP;POSITION(
  80. BEGINNING_OF(b));g:=0;LOOP EXITIF MARK(NONE)=END_OF(b);x:=ERASE_CHARACTER(1);
  81. IF g=0 THEN IF x="X" THEN MOVE_VERTICAL(1);ENDIF;IF x="V" THEN APPEND_LINE;
  82. MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);ENDIF;IF x="+" THEN g:=1;
  83. ERASE_LINE;ENDIF;ELSE IF x="-" THEN IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+")=
  84. 1 THEN g:=0;ENDIF;ENDIF;ERASE_LINE;ENDIF;ENDLOOP;t:="0123456789ABCDEF";
  85. POSITION(BEGINNING_OF(b));LOOP r:=SEARCH("`",FORWARD);EXITIF r=0;POSITION(r);
  86. ERASE(r);x1:=INDEX(t,ERASE_CHARACTER(1))-1;x2:=INDEX(t,ERASE_CHARACTER(1))-1;
  87. COPY_TEXT(ASCII(16*x1+x2));ENDLOOP;WRITE_FILE(b,GET_INFO(COMMAND_LINE,
  88. "output_file"));ENDPROCEDURE;Unpacker;QUIT;
  89. $ delete/nolog 'f'*
  90. $ CHECKSUM 'P1'
  91. $ IF CHECKSUM$CHECKSUM .eqs. P2 THEN $ EXIT
  92. $ e "-E-CHKSMFAIL, Checksum of ''P1' failed."
  93. $ ENDSUBROUTINE
  94. $START:
  95. $ create 'f'
  96. X$! DISK_QUOTA.COM  --  check the current process' available disk quota,
  97. X$!                     inform programmers if below value.
  98. X$  VERIFY = F$VERIFY(0)
  99. X$  GOTO SKIP_COMMENTS
  100. X$!
  101. X$! Created by Dan Wing, Central Washington University,
  102. X$! Auxiliary Services Computing
  103. X$!
  104. X$! This returns the available disk quota into the symbol DISK_QUOTA_AVAILABL
  105. VE.
  106. X$! (If the user is Overdrawn, or another problem exists, then 0 is returned.
  107. V)
  108. X$!
  109. X$! Imports:
  110. X$!   P1  Disk unit (DISK124, DISKA, etc.)
  111. X$!   P2  Minumum disk quota (optional)
  112. X$!   P3  Users to mail low-quota message to (optional)
  113. X$!   P4  Filename calling DISK_QUOTA, for inclusion into mail msg (optional)
  114. X$!
  115. X$! Exports:
  116. X$!   DISK_QUOTA_OK         True/False, depends on user's quota compared to P
  117. V2
  118. X$!   DISK_QUOTA_AVAILABLE  Users available disk quota
  119. X$!
  120. X$!
  121. X$! If the available blocks on the disk is lower than the user's quota, the
  122. X$! available blocks are returned.
  123. X$!
  124. X$! Sample calls to DISK_QUOTA:
  125. X$!   @DISK_QUOTA  DISKA:  40000  WINGD  'F$ENVIRONMENT("PROCEDURE")'
  126. X$!   @DISK_QUOTA  DISK124:
  127. X$!   @DISK_QUOTA  DISKA:  30000
  128. X$!   @DISK_QUOTA  LIVEDATA:
  129. X$!   @DISK_QUOTA  UPLOAD$DIRECTORY 20000 WINGD 'F$ENVIRONMENT("PROCEDURE")'
  130. X$!
  131. X$!
  132. X$! REVERSE CHRONOLOGICAL MODIFICATION HISTORY
  133. X$!
  134. X$!     Date     By   Version    Description
  135. X$!  ----------  ---  -------    -----------
  136. X$! 20-NOV-1990  DGW  VMS 5.3    Leave DISK_QUOTA on error if error occurs
  137. X$! 21-AUG-1990  DGW  VMS 5.3    Output to file w/SYS$OUTPUT and SYS$ERROR
  138. X$!                              (using one only outputs to .LOG or screen)
  139. X$!  3-AUG-1990  DGW  VMS 5.3    Correctly handle error of "quotas not enable
  140. Vd`20
  141. X$!                              on this volume."
  142. X$!
  143. X$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  144. X$
  145. X$SKIP_COMMENTS:
  146. X$  ON WARNING THEN GOTO _ERROR
  147. X$  IF P1 .EQS. "?" THEN GOTO _HELP
  148. X$  IF P1 .EQS. ""
  149. X$    THEN WRITE SYS$OUTPUT "Missing disk-name parameter P1; use ? for help."
  150. X$         GOTO END
  151. X$    ENDIF
  152. X$
  153. X$  DELETE := DELETE      ! define symbols required locally
  154. X$  MAIL   := MAIL
  155. X$
  156. X$  FILENAME = "SYS$SCRATCH:QUOTA_" + F$GETJPI("","PID") + ".TMP;"
  157. X$  WRITE SYS$OUTPUT ""
  158. X$  WRITE SYS$OUTPUT "... Checking disk quota on ''P1'"
  159. X$
  160. X$  TMP_VERIFY = F$VERIFY(0)   ! Verify messes this part up ...
  161. X$    SET noON
  162. X$      DEFINE/noLOG SYS$OUTPUT 'FILENAME'
  163. X$      DEFINE/noLOG SYS$ERROR 'FILENAME'
  164. X$      SHOW QUOTA/DISK='P1'
  165. X$      STATUS = $STATUS
  166. X$      DEASSIGN SYS$OUTPUT
  167. X$      DEASSIGN SYS$ERROR
  168. X$    SET ON
  169. X$  TMP_VERIFY = F$VERIFY(TMP_VERIFY)
  170. X$
  171. X$  OPEN/READ FILE 'FILENAME'                `20
  172. X$  READ FILE RECORD                          ! read first record
  173. X$  CLOSE FILE
  174. X$
  175. X$  DELETE 'FILENAME'
  176. X$
  177. X$  OFFSET = F$LOCATE ("used,", RECORD) + 6
  178. X$  STOP   = F$LOCATE ("available", RECORD)
  179. X$
  180. X$  DISK_QUOTA_AVAILABLE == F$INTEGER (F$EXTRACT (OFFSET, STOP-OFFSET, RECORD
  181. V))
  182. X$  DISK_QUOTA_OK :== TRUE
  183. X$
  184. X$  IF STATUS .EQ. %X000003D4
  185. X$  THEN
  186. X$    WRITE SYS$OUTPUT "Disk Quotas not enabled on device ''P1'"
  187. X$    DISK_QUOTA_AVAILABLE == F$GETDVI(P1,"FREEBLOCKS")
  188. X$  ELSE
  189. X$    IF F$GETDVI(P1,"FREEBLOCKS") .LT. DISK_QUOTA_AVAILABLE`20
  190. X$    THEN`20
  191. X$      WRITE SYS$OUTPUT "Device ''P1' has only ", F$GETDVI(P1,"FREEBLOCKS"),
  192. V -
  193. X          " blocks free."
  194. X$      DISK_QUOTA_AVAILABLE == F$GETDVI(P1,"FREEBLOCKS")`20
  195. X$    ENDIF
  196. X$  ENDIF
  197. X$
  198. X$  IF F$TYPE(P2) .EQS. "INTEGER" .AND. DISK_QUOTA_AVAILABLE .LE. F$INTEGER(P
  199. V2)
  200. X$  THEN
  201. X$    DISK_QUOTA_OK :== FALSE          ! not enough quota..
  202. X$    WRITE SYS$OUTPUT ""
  203. X$    WRITE SYS$OUTPUT "User ", F$USER(), " has ", DISK_QUOTA_AVAILABLE, -
  204. X          " blocks available on ", P1, ","
  205. X$    WRITE SYS$OUTPUT "which is less than the specified minimum of ''P2'."
  206. X$
  207. X$    IF P3 .NES. ""
  208. X$    THEN
  209. X$      IF P4 .EQS. "" THEN P4 = "(no program specified)"
  210. X$      WRITE SYS$OUTPUT "... mailing notification to ''P3'."
  211. X$      MAILFILE = "SYS$SCRATCH:MAIL_" + F$GETJPI("","PID") + ".TMP;"
  212. X$      OPEN/WRITE FILE 'MAILFILE'
  213. X$      WRITE FILE "This user's disk quota is below the specified minimum val
  214. Vue."
  215. X$      WRITE FILE ""
  216. X$      WRITE FILE "  Device:            ", P1, "  (", -
  217. X          F$GETDVI(P1,"LOGVOLNAM"), ":, ", -
  218. X          F$GETDVI(P1,"VOLNAM"), ", ", -
  219. X          F$GETDVI(P1,"ALLDEVNAM"), ")"
  220. X$      WRITE FILE "  Device freeblocks: ", F$GETDVI(P1,"FREEBLOCKS")
  221. X$      WRITE FILE ""
  222. X$      WRITE FILE "  Minimum quota:     ", P2
  223. X$      WRITE FILE "  Quota available:   ", DISK_QUOTA_AVAILABLE
  224. X$      WRITE FILE ""
  225. X$      WRITE FILE "This message sent by a ''F$MODE()' call to DISK_QUOTA fro
  226. Vm:"
  227. X$      WRITE FILE P4
  228. X$      CLOSE FILE
  229. X$      MAIL 'MAILFILE' 'P3' -
  230. X          /SUBJECT="Low disk quota" -
  231. X          /PERSONAL="DISK_QUOTA: Low disk quota"
  232. X$      DELETE 'MAILFILE'
  233. X$    ENDIF
  234. X$  ELSE
  235. X$    WRITE SYS$OUTPUT ""
  236. X$    WRITE SYS$OUTPUT "User ", F$USER(), " has ", DISK_QUOTA_AVAILABLE, -
  237. X          " blocks available on ", P1, "."
  238. X$  ENDIF
  239. X$
  240. X$  WRITE SYS$OUTPUT ""
  241. X$
  242. X$END:
  243. X$  VERIFY = F$VERIFY(VERIFY)
  244. X$  EXIT   ! Leaving DISK_QUOTA ...
  245. X$
  246. X$_ERROR:
  247. X$  STATUS = $STATUS
  248. X$  WRITE SYS$OUTPUT "Error occurred in DISK_QUOTA."
  249. X$  VERIFY = F$VERIFY(VERIFY)
  250. X$  EXIT STATUS      ! Leaving DISK_QUOTA (on error) ...
  251. X$
  252. X$_HELP:
  253. X$  TYPE SYS$INPUT
  254. X
  255. XDISK_QUOTA -- checks the user's disk quota.
  256. X
  257. XImports:
  258. X  P1  Disk unit (DISK124, DISKA, etc.)
  259. X  P2  Minumum disk quota (optional)
  260. X  P3  Users to mail low-quota message to (optional)
  261. X  P4  Filename calling DISK_QUOTA, for inclusion into mail msg (optional)
  262. X         (see example in DISK_QUOTA.COM header)
  263. X
  264. XExports:
  265. X  DISK_QUOTA_OK         True/False, depends on user's quota compared to P2
  266. X  DISK_QUOTA_AVAILABLE  Users available disk quota (numeric)
  267. X
  268. X$  GOTO END
  269. $ CALL UNPACK DISK_QUOTA.COM;3 138105739
  270. $ v=f$verify(v)
  271. $ EXIT
  272.  
  273.