source: trunk/server/source4/selftest/win/common.exp

Last change on this file was 414, checked in by Herwig Bauernfeind, 16 years ago

Samba 3.5.0: Initial import

File size: 12.1 KB
Line 
1# A library of commonly used functions written in expect.
2# Copyright Brad Henry <brad@samba.org> 2006
3# Released under the GNU GPL version 3 or later.
4
5# This function maps a drive letter to a share point.
6proc map_share { remote_prompt share_drive sharepoint username domain password } {
7 set default_err_str "Unknown error in function map_share"
8 set err_str $default_err_str
9
10 set cmd "net use $share_drive $sharepoint $password /USER:$username@$domain\r\n"
11 send $cmd
12
13 expect {
14 "The command completed successfully." {
15 expect_prompt $remote_prompt
16 set err_str "OK"
17 } \
18 "The local device name is already in use." {
19 expect_prompt $remote_prompt
20 set err_str "The device name $share_drive is already in use"
21 } \
22 "The network name cannot be found." {
23 expect_prompt $remote_prompt
24 set err_str "Sharepoint $sharepoint could not be found"
25 } \
26 timeout {
27 set err_str "Function map_share timed out while mapping $share_drive to $sharepoint"
28 }
29 }
30 return $err_str
31}
32
33# This function unmaps a drive letter from a share point.
34proc unmap_share { remote_prompt share_drive } {
35 set default_err_str "Unknown error in function unmap_share"
36 set err_str $default_err_str
37
38 set cmd "net use $share_drive /DELETE\r\n"
39 send $cmd
40
41 expect {
42 "was deleted successfully." {
43 expect_prompt $remote_prompt
44 set err_str "OK"
45 } \
46 "NET HELPMSG 2250" {
47 expect_prompt $remote_prompt
48 set err_str "The network connection could not be found while unmapping $share_drive"
49 } \
50 timeout {
51 set err_str "Function unmap_share timed out while unmapping $share_drive"
52 }
53 }
54 return $err_str
55}
56
57# This function uses xcopy to copy a text file from one location on the
58# remote windows host to another.
59proc xcopy_file { remote_prompt in_filename out_filename xcopy_options } {
60 set default_err_str "Unknown error in function xcopy_file"
61 set err_str $default_err_str
62
63 set cmd "xcopy $in_filename $out_filename $xcopy_options\r\n"
64 send $cmd
65
66 expect {
67 "(F = file, D = directory)? " {
68 set cmd "F\r\n"
69 send $cmd
70 expect {
71 "1 File(s) copied\r\n\r\n" {
72 expect_prompt $remote_prompt
73 set err_str "OK"
74 } \
75 "0 File(s) copied\r\n\r\n" {
76 expect_prompt $remote_prompt
77 set err_str $default_err_str
78 } \
79 timeout {
80 set err_str "Function xcopy_file has timed out while copying $in_filename"
81 }
82 }
83 } \
84 "1 File(s) copied\r\n\r\n" {
85 expect_prompt $remote_prompt
86 set err_str "OK"
87 } \
88 "0 File(s) copied\r\n\r\n" {
89 expect_prompt $remote_prompt
90 set err_str $default_err_str
91 } \
92 timeout {
93 set err_str "Function xcopy_file timed out while copying $in_filename"
94 }
95 }
96 return $err_str
97}
98
99# This function creates a temporary file on the remote windows host.
100# The file contents are populated by a recursive directory listing of
101# the windows %HOMEDRIVE%.
102proc create_tmp_file { remote_prompt filename } {
103 set default_err_str "Unknown error in function create_tmp_file"
104 set err_str $default_err_str
105
106 set cmd "dir %HOMEDRIVE%\\ /S > $filename\r\n"
107 send $cmd
108 expect {
109 $remote_prompt {
110 set err_str "OK"
111 } \
112 timeout {
113 set err_str "Function create_tmp_file timed out while creating $filename"
114 }
115 }
116 return $err_str
117}
118
119# This function compares two files on the remote windows host.
120proc compare_files { remote_prompt file1 file2 } {
121 set default_err_str "Unknown error in function compare_files"
122 set err_str $default_err_str
123
124 set cmd "fc $file1 $file2\r\n"
125 send $cmd
126 expect {
127 "FC: no differences encountered\r\n\r\n\r\n" {
128 expect_prompt $remote_prompt
129 set err_str "OK"
130 } \
131 "\*\*\*\*\* $file1" {
132 expect_prompt $remote_prompt
133 set err_str "Files $file1 and $file2 differ"
134 } \
135 "\*\*\*\*\* $file2" {
136 expect_prompt $remote_prompt
137 set err_str "Files $file1 and $file2 differ"
138 } \
139 timeout {
140 set err_str "Function compare_files timed out while comparing files $file1 and $file2"
141 }
142 }
143 return $err_str
144}
145
146# This function deletes a file on the remote windows host.
147proc delete_file { remote_prompt filename } {
148 set default_err_str "Unknown error in function delete_file"
149 set err_str $default_err_str
150
151 set cmd "del $filename\r\n"
152 send $cmd
153 expect {
154 "Could Not" {
155 expect_prompt $remote_prompt
156 set err_str $default_err_str
157 } \
158 $remote_prompt {
159 set err_str "OK"
160 } \
161 timeout {
162 set err_str "Function delete_file timed oout while deleting $filename"
163 }
164 }
165 return $err_str
166}
167
168# This function copies a text file over telnet from the local unix host
169# to the remote windows host.
170proc copy_file { remote_prompt in_filename out_filename } {
171 set default_err_str "Unknown error in function copy_file"
172 set err_str $default_err_str
173
174 # The octal ASCII code for Control-Z is 032.
175 set CTRLZ \032
176
177 # Open local file and read contents.
178 set in_file [open $in_filename r]
179 set in_data [read $in_file]
180
181 # Initiate copy on remote host.
182 set cmd "copy con $out_filename\r\n"
183 send $cmd
184
185 # Separate $in_data into lines and send to remote host.
186 set out_data [split $in_data "\n"]
187 foreach out_line $out_data {
188 send $out_line
189 # We might as well do a unix -> windows line conversion.
190 send "\r\n"
191 # Are we overwriting an existing file?
192 # If so, exit so we can handle it.
193 expect {
194 "(Yes/No/All)" {
195 send "NO\r\n"
196 expect_prompt $remote_prompt
197 set err_str "File exists"
198 } \
199 $out_line {
200 set err_str "OK"
201 } \
202 timeout {
203 set err_str "Function copy_file timed out while copying $in_filename"
204 }
205 }
206 if { $err_str != "OK" } {
207 return $err_str
208 } else {
209 set err_str $default_err_str
210 }
211 }
212
213 # ^Z\r to complete the transfer.
214 send $CTRLZ
215 send "\r"
216 expect {
217 "file(s) copied." {
218 set err_str [expect_prompt $remote_prompt]
219 } \
220 $remote_prompt {
221 set err_str $default_err_str
222 } \
223 timeout {
224 expect_prompt $remote_prompt
225 set err_str "Function copy_file timed out while finishing copy of $in_filename"
226 }
227 }
228 return $err_str
229}
230
231# This function waits for the command prompt and reports an error on
232# timeout.
233proc expect_prompt { remote_prompt } {
234 set default_err_str "Unknown error occurred while waiting for the command prompt"
235 set err_str $default_err_str
236
237 expect {
238 $remote_prompt {
239 set err_str "OK"
240 } \
241 timeout {
242 set err_str "Timeout occurred while waiting for the command prompt"
243 }
244 }
245 return $err_str
246}
247
248# This function will create a telnet login shell to $remote_host as $username.
249# If expected dialogue is not recieved, return with a specific error if one
250# is recognized. Otherwise return a generic error indicating the function
251# name.
252proc telnet_login { remote_prompt remote_host username password } {
253
254 set default_err_str "Unknown error in function telnet_login"
255 set err_str $default_err_str
256
257 set cmd "telnet $remote_host\r"
258 send $cmd
259 expect {
260 "login: " {
261 set err_str "OK"
262 } \
263 "Connection refused" {
264 set err_str "Connection refused"
265 } \
266 "No route to host" {
267 set err_str "No route to host"
268 } \
269 timeout {
270 set err_str "Function telnet_login timed out while waiting for the login prompt"
271 }
272 }
273 if { $err_str != "OK" } {
274 # Return because something unexpected happened.
275 return $err_str
276 } else {
277 # Reset err_str
278 set err_str $default_err_str
279 }
280
281 set cmd "$username\r"
282 send $cmd
283 expect {
284 "password: " {
285 set err_str "OK"
286 } \
287 timeout {
288 set err_str "Function telnet_login timed out while waiting for the password prompt"
289 }
290 }
291 if { $err_str != "OK" } {
292 return $err_str
293 } else {
294 set err_str $default_err_str
295 }
296
297 set cmd "$password\r"
298 send $cmd
299 expect {
300 $remote_prompt {
301 set err_str "OK"
302 } \
303 "Login Failed" {
304 set err_str "Telnet login failed"
305 } \
306 timeout {
307 set err_str "Function telnet_login timed out while waiting for the command prompt"
308 }
309 }
310 return $err_str
311}
312
313proc create_directory { remote_prompt sharepath } {
314
315 set default_err_str "Unknown error in function create_directory"
316 set err_str $default_err_str
317
318 set cmd "mkdir $sharepath\r\n"
319 send $cmd
320 expect {
321 "already exists" {
322 expect_prompt $remote_prompt
323 set err_str "Directory already exists"
324 } \
325 $remote_prompt {
326 set err_str "OK"
327 } \
328 timeout {
329 expect_prompt $remote_prompt
330 set err_str "Timeout reached starting create_directory."
331 }
332 }
333 return $err_str
334}
335
336proc delete_directory { remote_prompt sharepath } {
337
338 set default_err_str "Unknown error in function delete_directory"
339 set err_str $default_err_str
340
341 set cmd "rmdir /S /Q $sharepath\r\n"
342 send $cmd
343 expect {
344 "Access is denied." {
345 expect_prompt $remote_prompt
346 set err_str "Directory access is denied"
347 } \
348 $remote_prompt {
349 set err_str "OK"
350 } \
351 timeout {
352 expect_prompt $remote_prompt
353 set err_str "Timeout reached in delete_directory"
354 }
355 }
356 return $err_str
357}
358
359proc create_share { remote_prompt username sharepath sharename } {
360
361 set default_err_str "Unknown error in function create_share"
362 set err_str $default_err_str
363
364 set cmd "net share $sharename=$sharepath /GRANT:$username,FULL\r\n"
365 send $cmd
366 expect {
367 "was shared successfully." {
368 set err_str [expect_prompt $remote_prompt]
369 } \
370 "NET HELPMSG 2118." {
371 expect_prompt $remote_prompt
372 set err_str "The name has already been shared"
373 } \
374 $remote_prompt {
375 set err_str $default_err_str
376 } \
377 timeout {
378 expect_prompt $remote_prompt
379 set err_str "Timeout reached in create_share"
380 }
381 }
382 return $err_str
383}
384
385proc delete_share { remote_prompt sharename } {
386
387 set default_err_str "Unknown error in function delete_share"
388 set err_str $default_err_str
389
390 set cmd "net share $sharename /DELETE\r\n"
391 send $cmd
392 expect {
393 "was deleted successfully." {
394 set err_str [expect_prompt $remote_prompt]
395 } \
396 "does not exist." {
397 expect_prompt $remote_prompt
398 set err_str "The share does not exist"
399 } \
400 $remote_prompt {
401 set err_str $default_err_str
402 } \
403 timeout {
404 expect_prompt $remote_prompt
405 set err_str "Timeout reached in delete_share"
406 }
407 }
408 return $err_str
409}
410
411proc delete_hosts_entry { remote_prompt hosts_file_path backup_hosts_filename } {
412
413 set default_err_str "Unknown error in function delete_hosts_entry"
414 set err_str $default_err_str
415
416 set cmd "cd $hosts_file_path\r\n"
417 send $cmd
418 expect {
419 "." {
420 expect_prompt $remote_prompt
421 set err_str $default_err_str
422 } \
423 $remote_prompt {
424 set err_str "OK"
425 } \
426 timeout {
427 expect_prompt $remote_prompt
428 set err_str "Timeout reached in delete_hosts_entry"
429 }
430 }
431 if { $err_str != "OK" } {
432 return $err_str
433 } else {
434 set err_str $default_err_str
435 }
436
437 set cmd "move /Y $backup_hosts_filename hosts\r\n"
438 send $cmd
439 expect {
440 "1 file(s) moved." {
441 set err_str [expect_prompt $remote_prompt]
442 } \
443 "cannot find the file specified." {
444 expect_prompt $remote_prompt
445 set err_str "File not found"
446 } \
447 $remote_prompt {
448 set err_str $default_err_str
449 } \
450 timeout {
451 expect_prompt $remote_prompt
452 set err_str "Function delete_hosts_entry timed out while renaming $backup_hosts_filename"
453 }
454 }
455 return $err_str
456}
457
458proc create_hosts_entry { remote_prompt hosts_file_path hostname ip \
459 backup_hosts_filename } {
460
461 set default_err_str "Unknown error in function create_hosts_entry"
462 set err_str $default_err_str
463
464 set cmd "cd $hosts_file_path\r\n"
465 send $cmd
466 expect {
467 "." {
468 expect_prompt $remote_prompt
469 set err_str $default_err_str
470 } \
471 $remote_prompt {
472 set err_str "OK"
473 } \
474 timeout {
475 expect_prompt $remote_prompt
476 set err_str "Timeout reached in create_hosts_entry"
477 }
478 }
479 if { $err_str != "OK" } {
480 return $err_str
481 } else {
482 set err_str $default_err_str
483 }
484
485 set cmd "copy /Y hosts $backup_hosts_filename\r\n"
486 send $cmd
487 expect {
488 "1 file(s) copied." {
489 set err_str [expect_prompt $remote_prompt]
490 } \
491 "cannot find the file specified." {
492 expect_prompt $remote_prompt
493 set err_str "File not found."
494 } \
495 $remote_prompt {
496 set err_str $default_err_str
497 } \
498 timeout {
499 expect_prompt $remote_prompt
500 set err_str "Function create_hosts_entry timed out while copying hosts file"
501 }
502 }
503 if { $err_str != "OK" } {
504 return $err_str
505 } else {
506 set err_str $default_err_str
507 }
508
509 set cmd "echo $ip $hostname #smbtorture host. >> hosts\r\n"
510 send $cmd
511 expect {
512 $remote_prompt {
513 set err_str "OK"
514 } \
515 timeout {
516 expect_prompt $remote_prompt
517 set err_str "Function create_hosts timed out while updating hosts file"
518 }
519 }
520 return $err_str
521}
Note: See TracBrowser for help on using the repository browser.