Annotation of capa/capa51/CapaTools/printstudent.tcl, revision 1.1.1.1
1.1 albertel 1: #!/usr/local/bin/tclsh8.0
2: # Script to print a single student's assignment
3: # By G. Albertelli II 1998
4: # Edited and improved by nedavis
5:
6: proc clearScreen {} {
7: puts "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
8: }
9: clearScreen
10: puts "CAPA Printing script Ver 1.3"
11: after 1000
12:
13: proc class { classname path args } {
14: global classList
15: set classList($classname.path) $path
16: set classList($classname.sets) $args
17: }
18:
19: proc config { var value args } {
20: global config
21: set config($var) $value
22: }
23:
24: proc getSettings { classListVar configVar } {
25: upvar $classListVar classList
26: upvar $configVar config
27: source printstudent.settings
28: }
29:
30: proc saveSettings { } {
31: global classList config
32: if { [ catch { set fileId [open printstudent.settings "w"] } ] } {
33: puts "Unable to save settings. Please contact CAPA adminstrator."
34: quit "UnableToSaveSettings"
35: }
36: puts $fileId "# Settings file for printstudent.tcl\n#\n# set up the configuration options\n#\n# the used values are qzparse_command, latex_command, dvips_command, and\n# lpr_command\n\n"
37: foreach value [array names config] {
38: puts $fileId "config $value \t\"$config($value)\""
39: }
40:
41: puts $fileId "\n# List of classes, their path, and the sets that can be printed"
42: set validClass ""
43: foreach name [array names classList] {
44: if { ! [string match *.path $name] } {
45: lappend validClass [lindex [split $name .] 0]
46: }
47: }
48: set validClass [ lsort $validClass]
49: foreach class $validClass {
50: puts $fileId "class $class $classList($class.path) \t$classList($class.sets)"
51: }
52: close $fileId
53: }
54:
55: proc getStringFromList { validStrings } {
56: gets file0 aline
57: set error [catch {set try [lindex $aline 0] } ]
58: if { $error } { return "" }
59: set found false
60: foreach valid $validStrings {
61: set valid [string tolower $valid]
62: set try [ string tolower [ string trim $try ] ]
63: if { $valid == $try } {
64: set found true
65: break
66: }
67: }
68: if { $found } {
69: return $try
70: } else {
71: return ""
72: }
73: }
74:
75: proc addClass { classVar } {
76: upvar $classVar class
77:
78: clearScreen
79: puts "Enter \"quit\" at any time to stop."
80: set done 0
81: while { ! $done } {
82: puts -nonewline "Please enter the name of the class you wish to add:"
83: flush file1
84: gets file0 aline
85: set class [lindex $aline 0]
86: if { $class == "quit" } { return quit }
87: puts "You entered $class, is this correct? (y or n)"
88: set finished [getStringFromList "yes y Y quit"]
89: if { $finished == "quit" } { return quit }
90: if { $finished != "" } { set done 1 }
91: }
92: set done 0
93: while { ! $done } {
94: puts -nonewline "Please enter the ABSOLUTE path of the class."
95: flush file1
96: gets file0 aline
97: set path [lindex $aline 0]
98: if { $path == "quit" } { return quit }
99: puts "You entered $path, is this correct? (y or n)"
100: set finished [getStringFromList "yes y Y quit"]
101: if { $finished == "quit" } { return quit }
102: if { $finished != "" } { set done 1 }
103: }
104: set done 0
105: while { ! $done } {
106: puts "Please enter a space separated list of valid set numbers for $class:\n EXAMPLE: 1 2 3 \n will make sets 1-3 available."
107: gets file0 aline
108: set sets $aline
109: if { $sets == "quit" } { return quit }
110: puts "You entered $sets, is this correct? (y or n)"
111: set finished [getStringFromList "yes y Y quit"]
112: if { $finished == "quit" } { return quit }
113: if { $finished != "" } { set done 1 }
114: }
115: global classList
116: set classList($class.sets) $sets
117: set classList($class.path) $path
118: saveSettings
119: global machine
120: logInformation Added $class $path "$sets" $machine
121: set class ""
122: }
123:
124: proc removeClass { classListVar classVar } {
125: upvar $classListVar classList
126: upvar $classVar class
127:
128: clearScreen
129: set done 0
130: while { ! $done } {
131: set validClass ""
132: foreach name [array names classList] {
133: if { ! [string match *.path $name] } {
134: lappend validClass [lindex [split $name .] 0]
135: }
136: }
137: set validClass [ lsort $validClass]
138: puts "Valid classnames are: $validClass"
139: puts "Enter \"quit\" to stop."
140: puts -nonewline "Enter class name to remove:"
141: flush file1
142: set class [getStringFromList [concat $validClass quit] ]
143: if { $class == "quit" } {
144: set class ""
145: return
146: }
147: if { $class != "" } {
148: puts "You entered $class, are you sure you wish to remove this class? (y or n)"
149: set finished [getStringFromList "yes y Y quit"]
150: if { $finished == "quit" } { return quit }
151: if { $finished != "" } { set done 1 }
152: } else {
153: puts "Invalid classname"
154: }
155: }
156: if { $done } {
157: global classList
158: global machine
159: logInformation Removed $class $classList($class.path) "$classList($class.sets)" $machine
160: catch { unset classList($class.path) }
161: catch { unset classList($class.sets) }
162: saveSettings
163: }
164: set class ""
165: }
166:
167: proc getClass { classListVar classVar } {
168: upvar $classListVar classList
169: upvar $classVar class
170:
171: clearScreen
172: set done 0
173: while { ! $done } {
174: set validClass ""
175: foreach name [array names classList] {
176: if { ! [string match *.path $name] } {
177: lappend validClass [lindex [split $name .] 0]
178: }
179: }
180: set validClass [ lsort $validClass]
181: puts "Valid classnames are: [lindex $validClass 0]"
182: foreach otherClass [lrange $validClass 1 end] {
183: puts " $otherClass"
184: }
185: puts "Other commands available: new remove restart quit \n \n new=add new class \n remove=remove class from available list \n restart=restart from login \n quit=exit from CAPA server \n "
186: puts -nonewline "For printing, enter classname\n For all else, enter command: "
187: flush file1
188: set class [getStringFromList \
189: [concat $validClass new remove quit restart] ]
190: if { $class == "new" } { addClass class
191: clearScreen
192: } elseif { $class == "remove" } { removeClass classList class
193: clearScreen
194: } elseif { $class == "quit" } { quit "ClassEarlyOut"
195: } elseif { $class == "restart" } { return restart
196: } elseif { $class != "" } { set done 1
197: } else { puts "Invalid classname"
198: }
199: }
200: }
201:
202: proc addSet { class setVar } {
203: upvar $setVar setWanted
204: global classList
205:
206: clearScreen
207: set done 0
208: puts "Enter \"quit\" at any time to stop."
209: while { ! $done } {
210: puts "Please enter a space separated list of valid set numbers for $class:"
211: gets file0 aline
212: set sets $aline
213: if { $sets == "quit" } { return quit }
214: puts -nonewline "You entered $sets, which would allow $class have set(s) $sets available, rather than set(s) $classList($class.sets).\n Is this correct? (y or n)"
215: flush file1
216: set finished [getStringFromList "yes y Y quit"]
217: if { $finished == "quit" } { return quit }
218: if { $finished != "" } { set done 1 }
219: }
220: global classList
221: global machine
222: logInformation ChangedSets $class $classList($class.path) "\"$classList($class.sets)\" to \"$sets\"" $machine
223: set classList($class.sets) $sets
224: saveSettings
225: return ""
226: }
227:
228: proc getSet { classListVar class setVar } {
229: upvar $classListVar classList
230: upvar $setVar setWanted
231:
232: clearScreen
233: set done 0
234: while { ! $done } {
235: puts "Valid set numbers for $class are: $classList($class.sets) "
236: puts "Other commands available: new restart quit"
237: puts -nonewline "Enter set number to print:"
238: flush file1
239: set setWanted [getStringFromList \
240: [concat $classList($class.sets) new quit restart] ]
241: if { $setWanted == "new" } { addSet $class setWanted
242: clearScreen
243: } elseif { $setWanted == "quit" } { quit "SetEarlyOut"
244: } elseif { $setWanted == "restart" } { return restart
245: } elseif { $setWanted != "" } { set done 1
246: } else { puts "Invalid setnumber."
247: }
248: }
249: }
250:
251: proc getStudentInfo { studentNumberVar } {
252: upvar $studentNumberVar studentNumber
253: global class set
254:
255: puts "Other commands available: restart quit"
256: puts -nonewline "For class: $class, set $set, enter student number:"
257: flush file1
258: gets file0 aline
259: catch { set studentNumber [lindex $aline 0]}
260: if { $studentNumber == "quit" } { quit "StudentInfoEarlyOut" }
261: if { $studentNumber == "restart" } { return restart }
262: }
263:
264: proc verifyStudent { class set studentNumber } {
265: if { [ catch { set fileId [open $class/classl "r" ] } ] } {
266: puts "Unable to find a classl file. This class may not be ready for printing. \n Contact the course instructor."
267: quit "UnableToAccesClassl"
268: }
269: set result 0
270: while { 1 } {
271: gets $fileId aline
272: if { [eof $fileId] } { break }
273: if { [string tolower $studentNumber] == [string tolower [ string range $aline 14 22] ] } {
274: set result 1
275: break
276: }
277: }
278: close $fileId
279: return $result
280: }
281:
282: proc printSet { class set studentnumber configVar } {
283: upvar $configVar config
284:
285: puts "Parsing Set"
286: if { [catch { eval "exec $config(qzparse_command) -c $class -Set $set -Stu $studentnumber -o [pwd]/printstudent.[pid].tex " } errorMsg ] } {
287: puts "Unable to prepare tex file: $errorMsg"
288: return failed
289: }
290: puts "Creating Set description"
291: if { [catch { eval "exec $config(latex_command) ./printstudent.[pid].tex < /dev/null " } errorMsg ] } {
292: puts "Unable to prepare dvi file: $errorMsg"
293: return failed
294: }
295: puts "Creating postscript file"
296: if { [ catch { eval "exec $config(dvips_command) -o ./printstudent.[pid].ps ./printstudent.[pid].dvi < /dev/null >& /dev/null " } errorMsg ] } {
297: puts "Unable to prepare ps file: $errorMsg"
298: return failed
299: }
300: puts "Sending file to printer"
301: if { [ catch { eval "exec $config(lpr_command) ./printstudent.[pid].ps < /dev/null " } errorMsg ] } {
302: puts "Unable to print ps file: $errorMsg"
303: return failed
304: }
305: return success
306: }
307:
308: proc logInformation { result class set student args } {
309: set fileId [open "printstudent.log" "a"]
310: puts $fileId "$result $class $set $student $args [clock format [clock seconds] -format %m/%d/%Y-%H:%M:%S ]"
311: close $fileId
312: }
313:
314: proc cleanup {} {
315: exec rm -f ./printstudent.[pid].ps ./printstudent.[pid].dvi ./printstudent.[pid].tex ./printstudent.[pid].aux ./printstudent.[pid].log
316: }
317:
318: proc goAgain {} {
319: puts "Would you like to print another assignment (y or n) ?"
320: set setWanted [getStringFromList "yes y Y quit"]
321: if { $setWanted != "" } { return 1
322: } else { return 0
323: }
324: }
325:
326: proc quit { args } {
327: global class set studentnumber machine
328: logInformation $args $class $set $studentnumber $machine
329: exit
330: }
331:
332: set another 1
333: set class "unknown"
334: set set "unknown"
335: set studentnumber "unknown"
336: if { [ catch { set machine [lindex [exec /usr/bin/who -mM ] end ] } ] } {
337: set machine "UnableToRunWho"
338: }
339:
340: while { $another } {
341: getSettings classList config
342: if { "restart" == [getClass classList class] } { continue }
343: if { "restart" == [getSet classList $class set] } { continue }
344: clearScreen
345: set done 0
346: while { ! $done } {
347: if { "restart" == [getStudentInfo studentnumber] } {
348: set studentnumber restart
349: break
350: }
351: if { ! [set done [verifyStudent $classList($class.path) \
352: $set $studentnumber] ] } {
353: puts "Student number: $studentnumber, does not appear to belong in the class- $class."
354: logInformation "NotFound" $class $set $studentnumber $machine
355: }
356: }
357: if { $studentnumber == "restart" } { continue }
358: logInformation [printSet $classList($class.path) $set \
359: $studentnumber config] $class $set $studentnumber $machine
360: cleanup
361: set another [goAgain]
362: }
363:
364:
365:
366:
367:
368:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>