home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
c't freeware shareware 2001 January
/
CT_SW0101.ISO
/
mac
/
software
/
kommunik
/
misc
/
zoc400wg.exe
/
setup.fil
/
script
/
MINIHOST.ZRX
< prev
next >
Wrap
Text File
|
1998-09-05
|
21KB
|
666 lines
/*******************************************************************
* REXX-Programm zur Simulation einer kleinen Mailbox *
* *
* Funktionsumfang: *
* + Einfache Benutzerverwaltung (siehe unten) *
* + Zwei Userlevel (Admin und Normal) *
* + Wechseln von Verzeichnissen mîglich (nur Admin) *
* + Up-/Downloads *
* *
*******************************************************************/
/* zum Debuggen des Programms bitte den Kommentar vor TRACE A entfernen */
/* TRACE A */
/***********************************/
/* nachfolgend die Userliste */
/***********************************/
curdrive= "C:" /* Arbeitslaufwerk fÅr alle User */
user.1= "ADMIN" /* Username */
pass.1= "SECRET" /* Pa·wort des Users */
home.1= "\" /* Startverzeichnis des Users */
mode.1= 1 /* 1=Superuser, 0=Normaluser (Normaluser kann nicht */
/* suchen und keine Verzeichnisse wechseln) */
user.2= "GUEST"
pass.2= "GUEST"
home.2= "HOST\GUEST"
mode.2= 0
user.3= "USERNAME1"
pass.3= "PASSWORD1"
home.3= "HOST\USER1"
mode.3= 0
user.4= "USERNAME2"
pass.4= "PASSWORD2"
home.4= "HOST\USER2"
mode.4= 0
user.5= "USERNAME3"
pass.5= "PASSWORD3"
home.5= "HOST\USER3"
mode.5= 0
/***********************************/
/* hier beginnt der Programmteil */
/***********************************/
/* Operator nach lokalem Modus fragen */
localmode= 0
x= ZocRequest("Wollen Sie MINIHOST im lokalem Modus starten?", "Ja", "Nein")
x= TRANSLATE(x)
SELECT
WHEN x="JA" THEN localmode= 1
WHEN x="NEIN" THEN localmode= 0
WHEN x="##CANCEL##" THEN exit
OTHERWISE NOP
END /* SELECT */
/* MenÅpunkt "Sonstiges->REXX abbrechen" abfangen */
SIGNAL ON HALT NAME shutdown2
/* Variable fÅr Return definieren (CR-LF) */
CrLf= "^M^J"
/* Bildschirm lîschen */
CALL ZocCls
/* ÅberprÅfen, ob ein gÅltiges CD-Signal geliefert wird */
IF checkcarrier()=="##UNKNOWN##" THEN
DO
CALL ZocWrite "Bitte schalten Sie im Modem-Device die CD-PrÅfung ein"||CrLf||CrLf
EXIT
END
/* Modemecho zur Gegenstelle ausschalten */
say "Einen Moment bitte ..."
CALL ZocSetOption "Host=no"
IF localmode=0 THEN DO
CALL ZocSetAutoAnswer 0
CALL ZocDelay 3
END
ELSE DO
CALL ZocMsgBox "Sie kînnen ADMIN/SECRET als Username/Pa·wort "||,
"versuchen oder in der Online-Hilfe weitere "||,
"Informationen Åber den MINIHOST erhalten (suchen Sie "||,
"nach dem Stichwort MINIHOST)."
END
/* -------------------------------------------------------------- */
/* auf Verbindung warten, abheben und Pa·wort prÅfen */
/* -------------------------------------------------------------- */
allover:
/***********************************/
/* auf Verbindung warten */
/***********************************/
IF localmode=1 THEN /* im lokalen Modus nicht auf CONNECT warten */
SIGNAL welcome
/* Timeout von 60 Sekunden fÅr jede Eingabe */
CALL ZocTimeout 60
/* Anrufe annehmen */
CALL ZocSetAutoAnswer 1
/* Infos auf dem Bilschirm anzeigen */
CALL ZocCls
CALL ZocWrite "Warte auf Anruf ...^M^J^M^J"
/* auf Modem, ISDN oder Fax-Connect warten */
found= ZocWaitMux("CONNECT","+FCON")
DO WHILE found = 640
found= ZocWaitMux("CONNECT","+FCON")
END
/* auf Fax-Connect ÅberprÅfen (wird in diesem Programm nicht bearbeitet) */
IF found=1 THEN DO /* found=1 => FAX-Connect */
CALL handle_fax_call /* diese Routine ist ein Dummy */
signal allover /* nach Fax-Empfang Programm neu starten */
END
/* Connect-Nachricht Åberlesen */
CALL ZocWait "^M"
/****************************************/
/* auf Backspace der Gegenstelle warten */
/****************************************/
CALL ZocTimeout 20
CALL wsend "^[[2J^[[1H"
CALL wsend "Bitte wÑhlen Sie ANSI und Zmodem in Ihrem "||CrLf
CALL wsend "Terminalprogramm und drÅcken Sie dann die Taste "||CrLf
CALL wsend "BACKSPACE, um MINIHOST zu starten ..."||CrLf
result= ZocWait("^H")
/* ÅberprÅfen, ob Carrier noch vorhanden */
IF checkcarrier()=="##NO##" | result\=0 THEN
SIGNAL endit /* Programm neu starten, wenn BS nicht gedrÅckt */
welcome:
/***********************************/
/* Startbildschirm zeigen */
/***********************************/
CALL wsend "^[[2J^[[1H"
CALL welcome_screen
/***********************************/
/* name/pw lesen und ÅberprÅfen */
/***********************************/
CALL ZocTimeout 60
CALL ZocSetOption "Host=yes" /* Echo fÅr Username einschalten */
CALL wsend CrLf
username= input("Username: ")
username= STRIP(username)
IF username="##CANCEL##" THEN DO
SIGNAL shutdown2
END
ELSE DO
CALL ZocSetOption "Host=no" /* Echo fÅr Pa·wort ausschalten */
CALL wsend CrLf
password= input("Passwort: ")
password= STRIP(password)
END
/* Username/Pa·wort und CD-Signal prÅfen */
usridx= verify_user()
IF usridx=0 THEN DO /* User nicht gefunden oder Pa·wort falsch */
CALL wsend CrLf||CrLf
CALL wsend "Zugang verweigert !"
CALL wsend CrLf||CrLf
SIGNAL endit
END
ELSE DO /* User #useridx gefunden */
IF mode.usridx=1 THEN
status= "admin"
ELSE
status= "guest"
curdir= home.usridx
END
/***********************************/
/* HauptmenÅ anzeigen */
/***********************************/
menu:
/* Echo fÅr Gegenstelle einschalten */
CALL ZocSetOption "Host=yes"
choice= " "
CALL showmenu
CALL wsend "^[[0m"
/***********************************/
/* Auswahl einlesen und bearbeiten */
/***********************************/
menuask:
CALL wsend "^[[19;12H"
IF status= "admin" THEN
choice_msg= "Ihre Wahl (W/L/S/Z/U/D/H/V): "
ELSE
choice_msg= "Ihre Wahl (L/Z/U/D/V): "
result= input(choice_msg)
/* Bei Carrier-Verlust Programm neu starten */
IF checkcarrier()="##NO##" THEN
SIGNAL endit
/***********************************/
/* Entsprechende Subroutine rufen */
/***********************************/
/* Text-Kosmetik fÅr Benutzereingabe */
choice= TRANSLATE(STRIP(result))
SELECT
/* Verzeichnis auflisten */
WHEN choice="L" THEN
CALL showdir ddir
/* Datei anzeigen */
WHEN choice="Z" THEN
CALL type
/* Zmodem Upload */
WHEN choice="U" THEN
CALL upload
/* Zmodem Download */
WHEN choice="D" THEN
CALL download
/* Datei suchen (nur Superuser) */
WHEN choice="S" THEN
CALL search
/* Verzeichnis wechseln (nur Superuser) */
WHEN choice="W" THEN
CALL changedir
/* Host beenden (nur Superuser) */
WHEN choice="H" THEN
CALL shutdown
/* Host verlassen */
WHEN choice="V" THEN DO
CALL wsend "^[[21;12H"
CALL wsend "Schînen Tag noch ..."||CrLf
SIGNAL endit
END
OTHERWISE SIGNAL menuask /* Unbekannter Befehl, erneut versuchen */
END /* SELECT */
SIGNAL menu
endit:
CALL wsend "^[[22;12H"
CALL wsend "Starte erneut ..."
CALL ZocSetOption "Host=no"
CALL ZocDisconnect
CALL ZocDelay 5 /* Pause fÅr Modem auflegen */
CALL ZocSetAutoAnswer 0
CALL ZocDelay 5 /* Pause fÅr AutoAnswer einschalten */
SIGNAL allover
/* ============================================================== */
/* */
/* SUBROUTINEN (HOST FUNKTIONEN) */
/* */
/* ============================================================== */
/* -------------------------------------------------------------- */
/* Aktuelles Verzeichnis wechseln */
/* -------------------------------------------------------------- */
changedir:
IF status\="admin" THEN
RETURN
CALL wsend "^[[21;12H"
result= input("Bitte vollen Pfad angeben (Laufwerk und Verz.): ")
IF result\="##TIMEOUT##" THEN
DO
curdir= result
IF RIGHT(curdir, 1) \= "\" THEN curdir= curdir"\"
IF SUBSTR(curdir, 2, 1) = ":" THEN
DO
curdrive= SUBSTR(curdir, 1, 2)
curdir= RIGHT(curdir, length(curdir)-2)
END
IF SUBSTR(curdir, 1, 1) \= "\" THEN curdir= "\"curdir
END
RETURN
/* -------------------------------------------------------------- */
/* Aktuelles Verzeichnis anzeigen */
/* -------------------------------------------------------------- */
showdir:
ADDRESS CMD "dir /-P "curdrive||curdir" >shellout.tmp"
CALL sendfile "shellout.tmp"
RETURN
/* -------------------------------------------------------------- */
/* Im aktuellen Laufwerk suchen */
/* -------------------------------------------------------------- */
search:
IF status\="admin" THEN
RETURN
CALL wsend "^[[21;12H"
result= input("Dateiname zur Suche auf Laufwerk "||curdrive)
IF result\="##TIMEOUT##" THEN
DO
sname= result
sname= STRIP(sname)
END
ELSE
RETURN
CALL wsend "^[[22;12H"
CALL wsend "Suche auf Laufwerk "||curdrive||", bitte warten ..."
ADDRESS CMD "dir /-P "curdrive"\"sname" /s >shellout.tmp"
CALL sendfile "shellout.tmp"
RETURN
/* -------------------------------------------------------------- */
/* Datei anzeigen */
/* -------------------------------------------------------------- */
type:
CALL wsend "^[[21;12H"
result= input("Welche Datei soll angezeigt werden: "||curdrive||curdir)
IF result\="##TIMEOUT##" THEN
DO
sname= result
sname= STRIP(sname)
END
ELSE
RETURN
ADDRESS CMD "type "curdrive||curdir||sname" >shellout.tmp"
CALL sendfile "shellout.tmp"
RETURN
/* -------------------------------------------------------------- */
/* Upload */
/* -------------------------------------------------------------- */
upload:
CALL wsend "^[[21;12H"
CALL wsend "Bitte starten Sie Ihren Zmodem Upload"
CALL wsend "^[[22;12H"
IF localmode=0 THEN
CALL ZocDownload "ZMODEM", curdrive||curdir
ELSE
CALL ZocMsgBox "Upload im lokalen Modus nicht mîglich"
RETURN
/* -------------------------------------------------------------- */
/* Download */
/* -------------------------------------------------------------- */
download:
CALL wsend "^[[21;12H"
file= input("Welche Datei soll empfangen werden: "||curdrive||curdir)
CALL wsend "^[[22;12H"
TRACE i
IF localmode=0 THEN DO
IF file\="##TIMEOUT##" THEN DO
file= STRIP(file)
IF file \= "" THEN
CALL ZocUpload "ZMODEM", curdrive||curdir||file
END
END
ELSE
CALL ZocMsgBox "Download im lokalen Modus nicht mîglich"
RETURN
/* -------------------------------------------------------------- */
/* Host beenden */
/* -------------------------------------------------------------- */
shutdown:
IF status\="admin" THEN
RETURN
shutdown2:
CALL wsend "^[[22;0H"
CALL wsend "Beende MINIHOST ... "
CALL ZocSetOption "Host=no"
CALL ZocDisconnect
CALL ZocDelay 3
CALL ZocSetAutoAnswer 0
CALL wsend "beendet!"||CrLf
EXIT
/* -------------------------------------------------------------- */
/* öberprÅfe Usereintrag */
/* -------------------------------------------------------------- */
verify_user:
ok= 0
IF username\="##TIMEOUT##" & password\="##TIMEOUT##" THEN DO
i= 1
DO WHILE user.i\="USER."||i /* loop to end of list */
IF translate(username)=translate(user.i) & ,
translate(password)=translate(pass.i) then do
ok= i
LEAVE
END
i= i+1
END
END
RETURN ok
/* ============================================================== */
/* */
/* SUBROUTINEN (INTERNE FUNKTIONEN) */
/* */
/* ============================================================== */
/* -------------------------------------------------------------- */
/* Zeichne einen MenÅpunkt mit ARG(line, col, shortcut, name) */
/* -------------------------------------------------------------- */
menuitem: PROCEDURE EXPOSE localmode
CALL wsend "^[["ARG(1)";"ARG(2)"H"
CALL wsend "^[[1;37;47m⁄ƒƒƒ^[[0;30;47mø"
CALL wsend "^[[1;37m⁄ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ^[[0;30;47mø^[[40m"
CALL wsend "^[["ARG(1)+1";"ARG(2)"H"
CALL wsend "^[[1;37;47m≥ ^[[0;34;47m"ARG(3)" ^[[30m≥"
CALL wsend "^[[1;37m≥^[[0;30;47m"ARG(4)"≥^[[40m"
CALL wsend "^[["ARG(1)+2";"ARG(2)"H"
CALL wsend "^[[1;37;47m¿^[[0;30;47mƒƒƒŸ"
CALL wsend "^[[1;37m¿^[[0;30;47mƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒŸ^[[40m"
RETURN
/* -------------------------------------------------------------- */
/* Zeichne ein Infofeld mit ARG(line, col, text) */
/* -------------------------------------------------------------- */
infoitem: PROCEDURE EXPOSE localmode
CALL wsend "^[["ARG(1)";"ARG(2)"H"
CALL wsend "^[[1;37;47m⁄ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ"
CALL wsend "ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ^[[0;30;47mø"
CALL wsend "^[["ARG(1)+1";"ARG(2)"H"
CALL wsend "^[[1;37;47m≥ ^[[0;30;47m"ARG(3)" ^[[30m≥"
CALL wsend "^[["ARG(1)+2";"ARG(2)"H"
CALL wsend "^[[1;37;47m¿^[[0;30;47mƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ"
CALL wsend "ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒŸ"
RETURN
/* -------------------------------------------------------------- */
/* Zeichne das gesamte MenÅ mit allen MenÅ- und Infofeldern */
/* -------------------------------------------------------------- */
SHOWMENU:
CALL wsend "^[[2J^[[1H"
IF status= "admin" THEN
DO
CALL menuitem 2, 10, "W", " Verz. (W)echseln "
CALL menuitem 5, 10, "L", " Verz. auf(L)isten "
CALL menuitem 8, 10, "S", " Datei (S)uchen "
CALL menuitem 11, 10, "Z", " Datei an(Z)eigen "
CALL menuitem 2, 45, "U", " Datei (U)ploaden "
CALL menuitem 5, 45, "D", " Datei (D)ownloaden "
CALL menuitem 8, 45, "H", " (H)ost beenden "
CALL menuitem 11, 45, "V", " Host (V)erlassen "
END
ELSE
DO
CALL menuitem 3, 10, "L", " Verz. auf(L)isten "
CALL menuitem 6, 10, "Z", " Datei an(Z)eigen "
CALL menuitem 3, 45, "U", " Datei (U)ploaden "
CALL menuitem 6, 45, "D", " Datei (D)ownloaden "
CALL menuitem 10, 27, "V", " Host (V)erlassen "
END
curpath= curdrive||curdir
CALL infoitem 15, 10, "^[[0;34;47mAkt.Verz.:^[[30m "overlay(curpath," ")
RETURN
/* -------------------------------------------------------------- */
/* BegrÅ·ungstext senden */
/* -------------------------------------------------------------- */
welcome_screen: PROCEDURE EXPOSE localmode
CrLf= "^M^J"
CALL wsend ""||CrLf
CALL wsend " ___ ___ ___ "||CrLf
CALL wsend "|__ || _ | __| "||CrLf
CALL wsend " / /_||_|| |_ ZOC MiniHost-Script V3.0"||CrLf
CALL wsend "|____|___|___| "||CrLf||CrLf||CrLf
RETURN
/* -------------------------------------------------------------- */
/* gleichzeitg senden und lokal anzeigen */
/* -------------------------------------------------------------- */
wsend: PROCEDURE EXPOSE localmode
IF localmode=0 THEN
CALL ZocSend ARG(1)
CALL ZocWrite ARG(1)
RETURN
/* -------------------------------------------------------------- */
/* Dateiinhalt anzeigen (Hostuser und lokaler User) */
/* -------------------------------------------------------------- */
sendfile: PROCEDURE EXPOSE localmode
file= ARG(1)
CrLf= "^M^J"
IF localmode=0 THEN DO /* Datei zur Gegenstelle senden */
CALL wsend "^[[2J^[[1H"
CALL ZocUpload "ASCII:1+0", file
ADDRESS CMD "del "file
CALL wsend CrLf||CrLf
END
ELSE DO /* Datei lokal anzeigen */
x= linein(file)
DO WHILE stream(file, "S")="READY"
SAY x
x= linein(file)
END /* WHILE */
CALL stream file, "C", "CLOSE"
ADDRESS CMD "del "file
END
CALL input "Bitte Enter druecken ..."
RETURN
/* -------------------------------------------------------------- */
/* Eingabe von Hostuser und lokalem User lesen */
/* -------------------------------------------------------------- */
input: PROCEDURE EXPOSE localmode
IF localmode=0 THEN DO /* Input von Gegenstelle lesen */
CALL wsend arg(1)
result= "##TIMEOUT##"
IF checkcarrier()\="##NO##" THEN DO
res= ZocWait("^M")
IF res\=640 THEN
result= ZocLastline()
END
END
ELSE DO /* Input lokal lesen */
result= ZocAsk("¯"||ARG(1)) /* '¯' zeigt Fenster rechts unten */
END
RETURN result
/* -------------------------------------------------------------- */
/* Carrier-Status zurÅckliefern (liefert OK im lokalen Modus) */
/* -------------------------------------------------------------- */
checkcarrier: PROCEDURE EXPOSE localmode
IF localmode=1 THEN
result= "##YES##"
ELSE
result= ZocGetInfo("ONLINE")
RETURN result
/**************************************************************************/
/* ENDE REXX-MODUL */
/**************************************************************************/
/**************************************************************************/
/* */
/* DER NACHFOLGENDE CODE WIRD MOMENTAN NICHT AUFGERUFEN */
/* */
/**************************************************************************/
/* -------------------------------------------------------------- */
/* Modem auf FAX Klasse 2 initialisieren */
/* -------------------------------------------------------------- */
set_fax_answer_mode:
Cr = "^M"
TIMEOUT 2
CALL ZocSend "AT+fclass= 2"||Cr
result= ZocWait("OK")
IF result=0 THEN
DO
CALL ZocSend "AT+FCR=1"||Cr
CALL ZocWait "OK"
CALL ZocSend "AT+FDCC=1,5,0,2,0,0,0,0"||Cr
CALL ZocWait "OK"
CALL ZocSend "AT+FCQ=0"||Cr
CALL ZocWait "OK"
CALL ZocSend "AT+FAA=1"||Cr
CALL ZocWait "OK"
CALL ZocWrite Cr||"FAX-MODUS GESETZT ..."||Crlf
END
TIMEOUT 60
RETURN
/* -------------------------------------------------------------- */
/* FAX-Anruf an ein Fax-Programm weiterleiten */
/* -------------------------------------------------------------- */
handle_fax_call:
/* Der hier benîtigte Code hÑngt vom verwendeten Fax-Programm ab. */
/* Da hier kein Fax-Programm unterstÅtzt wird, wird aufgelegt. */
CALL ZocDisconnect
RETURN