/* Migrationsprozedur f�r Symantec Antivirus */ /* Erstellt am 22. Mai 03 durch Chris Clayton */ /* Frei nutzbar f�r die Allgemeinheit, sowohl ganz als auch in Teilen, */ /* aber ein Hinweis auf den Autor wird gern gesehen */ /* Vom Nutzer ver„nderbare Definitionen: */ /* erstelle WPS-Ordner, k”nnte aber auch durch z. B. einen */ /* erweiterten ObjectDesktop-Ordner ersetzt werden */ clFolderClass = 'WpFolder' /* ''TSEnhFolder' */ /* Logdatei - falls nicht ben”tigt, „ndern zu '' */ fLogFile = 'SymaMigr.log' /* Wie Anpassungen an der config.sys gehandhabt werden */ /* 'Y' = config.sys ver„ndern (die alte wird als config.mig gespeichert) */ /* 'N' = Žnderungen in config.mig speichern (config.sys bleibt unver„ndert) */ sCommitCgs = 'N' /* die zu ver„ndernde INI-Datei - Symantec verwendet os2.ini: 'USER' */ /* hier wird zum Test 'symatest.ini' verwendet */ fDestINI = 'symatest.ini' /* Symantec AntiVirus-Program- und Virusdefinitionsverzeichnisse, die in */ /* INI-Datei gespeichert werden sollen - anpassen, soweit n”tig */ sSymantec = 'e:\symantec' sDefsDir = sSymantec||'\common\shared\virusdef' sVirusDir1 = sDefsDir||'\20001113.002' sVirusDir2 = sDefsDir||'\20001113.002' sVirusDir3 = sDefsDir||'\20030326.002' /* verwendet das 'Neueste'(siehe DEFINFO.DAT) */ sVirusDir4 = sDefsDir||'\20001113.002' /* Mein Verzeichnis f�r Icons (Symbole) */ sIcons = 'E:\UTILITY\ICONS\' /* Ermitteln des OS/2-Laufwerks (des Systemstartlaufwerks) */ sBootDrive = Substr(Translate(Value('PATH',,'OS2ENVIRONMENT')),Pos('\OS2\SYSTEM',Translate(Value('PATH',,'OS2ENVIRONMENT')))-2,2) /* Fundort der config.sys - normalerweise sBootdrive, hier '.' zum Test */ sCfigDrive = '.' /* sBootDrive */ /* Alle RexxUtil-Funktionen laden, auch wenn nur einige davon verwendet werden */ Call RxFuncAdd 'SysLoadFuncs', 'REXXUTIL', 'SysLoadFuncs'; Call SysLoadFuncs; /* Zus„tzliche globale Definitionen */ /* Variablen zur Aufnahme von Zus„tzen zur config.sys f�r: */ sNewBook = '' /* BOOKSHELF-Umgebungsvariable */ sNewDpath = '' /* DPATH-Umgebungsvariable */ sNewHelp = '' /* HELP-Umgebungsvariable */ sNewLib = '' /* LIBPATH-Anweisung */ sNewPath = '' /* PATH-Umgebungsvariable */ /* die folgende Verbundvariable dient zur Aufnahme zus„tzlicher config.sys- */ /* Eintr„ge */ stAddlCfg.0 = 0 /* die Erste enth„lt die Anzahl der Eintr„ge */ /* .1 .. .n wird die eigentlichen Eintr„ge enthalten */ bOK = 'FALSE' /* hat die Migration funktioniert? */ /* Anlegen eines Zielordners auf dem Desktop */ /* Geben sie eine eindeutige Kombination aus Objekt-ID und Ordnernamen */ /* Alternativ k”nnen Sie einen existierenden Ordner angeben - Sie m�ssen */ /* nur seine Objekt-ID kennen. Unimaint bietet ein WPS-Tool, mit welchem */ /* man sich die Eigenschaften von WPS-Objekten anzeigen lassen kann. In diesem */ /* Fall kann das folgende Kode-Objekt entfernt und die Variable sUtility muá */ /* mit der Objekt-ID des angestrebten Zielordners gef�llt werden. */ sFolder = '' sName = 'Mein Ordner' rc = Message( 'Lege Desktop-Ordner an: '||sName ) rc = SysSetObjectData(sFolder,'' ) /* pr�fen, ob Objekt existiert */ if RC = 1 THEN DO rc = Message( ' Ordner '||sName||' kann nicht angelegt werden, weil Objekt-ID '||sFolder||' bereits existiert' ) EXIT END ELSE DO sOptions = 'OBJECTID='||sFolder||';CONCURRENTVIEW=NO;' sOptions = sOptions||'VIEWBUTTON=MINIMIZE;MINWIN=HIDE;' sOptions = sOptions||'ICONVIEW=NONGRID,NORMAL;ICONVIEWPOS=25,10,50,70' rc = SysCreateObject( clFolderClass, sName, '', sOptions, 'fail' ) IF RC = 0 THEN DO rc = Message( ' Ordner '||sName|| ' kann nicht angelegt werden.' ) rc = Message( ' Sicherstellen, dass er geloescht ist, und erneut versuchen.' ) EXIT END END /* sObject else */ /* Nun werden die Unterordner angelegt */ sApplicat = CreateFolder( sFolder, 'Application', '' ) sUtility = CreateFolder( sFolder, 'Utility', '' ) /* Symantec Antivirus migrieren, falls vorhanden */ fFile = 'E:\SYMANTEC\NAVOS2.EXE' rc = stream( fFile, 'c', 'query exist' ) if rc = fFile then DO sName = 'Symantec Antivirus' /* Neuen Ordner im sUtility-Ordner anlegen */ sFolder = CreateFolder( sUtility, sName, '' ) IF sFolder = sUtility THEN /* Anlegen des Ordners hat nicht geklappt */ rc = Message( ' So not migrating '||sName||' applications' ) ELSE /* der gew�nschte Ordner konnte angelegt werden, also f�gen wir die Programmobjekte hinzu */ DO /* Hauptprogramm von Symantec Antivirus */ /* Dies ist ein WPS-Prgramm, welches keine zus„tzlichen Objekt- */ /* einstellungen ben”tigt. Also geben wir nur einen Zielordner */ /* (sFolder), einen Objekttitel (sName), eine eindeutige Objekt-ID () */ /* und den Programmtyp (PM f�r ein WPS-Program) an. Die Zusatzparameter */ /* werden als Null-String '' �bergeben */ rc = CreateApp( sFolder, sName, fFile, '', 'PM', '' ) /* Installations-Utility */ /* Hier wird ein Programm verwendet, welches in einem Befehlsprozessor l„uft; */ /* beachten Sie, daá der komplette Pfad zu cmd.exe angegeben wird, und zwar */ /* weil CreateApp die Existenz des Programms �berpr�ft, bevor es */ /* ein Objekt anlegt. Also muá CreateApp bekanntgegeben werden, wo das Programm steht. */ /* Hierbei ist der Programmtyp WINDOWABLEVIO f�r eine OS/2-Fenstersitzung. */ /* Schlieálich m�ssen wir das Feld 'parameters' f�llen, wobei die Variable */ /* sParms verwendet wird, die die zus„tzlichen Objekteigenschaften enth„lt. */ /* Zus„tzlich geben wir ein Icon an, wobei wir die einzelnen Angaben der */ /* Objekteigenschaften durch ';' voneinander trennen */ sParms = 'PARAMETERS=/c e:\Symantec\epfinsts.exe /c:e:\Symantec\navos2.icf /o:drive;' sParms = sParms||'ICONFILE=E:\SYMANTEC\EPFIICIS.ICO' rc = CreateApp( sFolder, 'Installation Utility', sBootDrive||'\OS2\CMD.EXE', '', 'WINDOWABLEVIO', sParms ) /* Live Update */ rc = CreateApp( sFolder, 'Live Update', 'E:\SYMANTEC\NAVLUOS2.EXE', '', 'PM', '' ) /* Objekt 'Scanne a:' */ sParms = 'PARAMETERS=a:\*.* /doallfiles /repair /s+;ICONFILE='||sIcons||'VIRUS.ICO' rc = CreateApp( sFolder, 'Scanne a:', 'E:\SYMANTEC\NAVDXOS2.EXE', '', 'WINDOWABLEVIO', sParms ) /* Anlegen des Programmobjekts 'Startup Norton Program Scheduler' */ rc = CreateApp( sFolder, 'Startup Norton Program Scheduler', 'E:\SYMANTEC\OS2SCHED.EXE', '', 'PM', '' ) /* Nun legen wir das Programmobjekt 'Uninstall Norton Antivirus' an */ rc = CreateApp( sFolder, 'Uninstall Norton Antivirus', 'E:\SYMANTEC\VDEFINST.EXE', '', 'PM', 'PARAMETERS=/u' ) /* Anpassungen der config.sys: Symantec Antivirus ben”tigt diese Eintr„ge */ /* eigentlich nicht. Sie sind als Beispiel aufgef�hrt, wie man Žnderungen */ /* vornimmt an: a) den diversen Pfad-Umgebungsvariablen. Die folgende Funktion */ /* f�gt einen Pfad hinzu, der in die LIBPATH= Anweisung aufgenommen werden */ /* soll. Die Variable sNewLib wird sowohl �bergeben als auch gef�llt. Das */ /* ist so kodiert, weil alle Pfadangaben kumuliert werden, falls sp„ter */ /* weitere Anwendungen migriert werden (ConcactPath ist in der Lage, die */ /* Eintr„ge mit ';' voneinander zu trennen). Da die Funktion f�r die unter- */ /* schiedlichsten Pfadvariablen verwendet wird, (s. die Liste der Definitionen */ /* weiter oben) wird die Zeichenkette 'LIBPATH' zu Logging-Zwecken �bergeben */ sNewLib = ConcactPath( sNewLib, 'E:\SYMANTEC', 'LIBPATH' ) sNewHelp = ConcactPath( sNewHelp, 'E:\SYMANTEC', 'HELP' ) sNewPath = ConcactPath( sNewPath, 'E:\SYMANTEC', 'PATH' ) /* b) AddCfgEntry wird zum Einf�gen ganzer config.sys-Zeilen in eine Stamm- */ /* variable verwendet, die sp„ter am Ende der neuen config.sys erscheinen sollen. */ /* Hier f�gen wir einen Kommentar sowie eine Umgebungsvariable hinzu. */ /* Wir k”nnten hiermit alles hinzuf�gen, was eine Anwendung ggf. ben”tigt, */ /* wie z. B. Einheitentreiber. */ rc = AddCfgEntry( 'REM Symantec Antivirus' ) rc = AddCfgEntry( 'SET SYMANTEC=E:\SYMANTEC' ) /* Generieren von Eintr„gen in INI-Dateien */ /* Das Hinzuf�gen von Eintr„gen zu INI-Dateien ist ein Kinderspiel, */ /* wenn Sie dazu nicht zu „ngstlich sein sollten. */ /* Sie m�ssen eine INI-Datei angeben: 'USER' f�r die os2.ini, 'SYSTEM' f�r */ /* die os2sys.ini (die meisten Anwendungen sollten hier die Finger weg lassen), */ /* oder einen Dateinamen. Im vorliegenden Fall geben wir fDestINI an. */ /* Sollte die angegebene Datei noch nicht vorhanden sein, wird sie unter */ /* Verwendung des in fDestINI angegebenen Pfades f�r Sie erstellt. Achtung: */ /* Symantec erwartet diese Eintr„ge in der OS/2-Userdatei, os2.ini. In diesem */ /* Beispielkode wird zu Testzwecken ein Dateiname angegeben. Wenn alles */ /* geklappt hat, wird fDestINI auf 'USER' gesetzt. */ /* Die n„chste Variable in CreateINIentry ist der Name der Anwendung, gefolgt */ /* von der Bezeichnung des Schl�ssels. Die Routine pr�ft, ob diese Kombination */ /* aus Anwendung und Schl�ssel in der angegebenen Datei schon vorhanden ist. */ /* Falls ja, wird der Schl�ssel gelesen und ohne Modifikation in die Variable */ /* rc gestellt. Falls nein, werden Anwendung und Schl�ssel mit dem angegebenen */ /* Schl�sselwert hinzugef�gt (hier der Inhalt von sDefsDir). REXX-Zeichenketten */ /* sind nicht Null-terminiert, weshalb die letzte Variable bestimmt, ob dem */ /* Schl�sselwert ein Nullterminator hinzugef�gt wird ('Y') oder nicht ('N'). */ /* Beim Funktionsende enth„lt rc eine Nullzeichenkette '', wenn das Anlegen */ /* des Schl�ssels erfolgreich war, oder die Zeichenkette 'ERROR:', falls nicht. */ rc = CreateINIentry( fDestINI, 'SymantecInstalledApps', 'AVENGEDEFS', sDefsDir, 'Y' ) rc = CreateINIentry( fDestINI, 'SymantecNAV', 'AVDefsDir', sDefsDir, 'Y' ) rc = CreateINIentry( fDestINI, 'SymantecNAV', 'InstallDir', sSymantec, 'Y' ) rc = CreateINIentry( fDestINI, 'SymantecNAV', 'InstallVersion', '5.0', 'Y' ) rc = CreateINIentry( fDestINI, 'SymantecSharedDefs', 'NAVOS2_50_AP1', sVirusDir1, 'Y' ) rc = CreateINIentry( fDestINI, 'SymantecSharedDefs', 'NAVOS2_50_AP2', sVirusDir2, 'Y' ) rc = CreateINIentry( fDestINI, 'SymantecSharedDefs', 'NAVOS2_50_NAVOS2', sVirusDir3, 'Y' ) rc = CreateINIentry( fDestINI, 'SymantecSharedDefs', 'NAVOS2_50_QUAR', sVirusDir4, 'Y' ) /* scheint, als h„tte die Migration funktioniert, */ /* allerdings habe ich die R�ckgabewerte nicht sehr gr�ndlich gepr�ft */ bOK = 'TRUE' END /* Neuen Ordner anlegen else */ END /* Symantec AntiVirus-Ordner */ /* Wenn die Migration geklappt hat, config.sys anpassen */ /* Das Flag sCommitCfs gibt an, ob die Žnderungen in */ /* config.sys oder config.mig vorgenommen werden sollen. S. oben. */ IF bOK = 'TRUE' THEN rc = UpdateConfigSys( sCommitCgs ) EXIT bOK \= 'TRUE' /* Die folgenden Funktionen machen die eigentliche Arbeit der Migration. */ /* Als alter 'C'-Programmer gebe ich immer etwas an das aufrufende Programm zur�ck. */ /* Hier sind fast alle R�ckgaben Indikatoren des Erfolgs der jeweiligen Aktion. */ /* Jede in diesen Routinen verwendete Variable, die nicht als Argumant �bergeben */ /* wird, ist global (wird im gesamten Programm verwendet), deshalb muss darauf */ /* geachtet werden, dass sie ordentlich definiert sind, bevor die Routine */ /* aufgerufen wird. Zudem werden einige (wie rc) intern von REXX verwendet, */ /* weshalb sich ihr Inhalt ver„ndern kann. Daher ist Vorsicht vonn”ten, wenn */ /* solche Variablen im Hauptteil des Programms verwendet werden. */ /*--------------------------------------------------------------------------- rc = Message( sMessage ) gibt eine Meldung auf der Konsole aus und schreibt sie in eine Log-Datei (falls definiert) Argumente sMessage Inhalt der Meldung. Bitte beachten: bei Verwendung mehrerer Zeichenketten und/oder REXX-Variablen ist der Verkettungsoperator (||) zu empfehlen R�ckgabe rc der R�ckgabewert von LINEOUT ( 0 = ok, alles andere ?) Globalvariable fLogFile enth„lt den Namen der Log-Datei oder '' wenn nicht ben”tigt Intern rc LINEOUT-R�ckgabewert ---------------------------------------------------------------------------*/ Message: PARSE ARG sMessage SAY sMessage rc = 0 IF fLogFile \= '' THEN DO rc = LINEOUT( fLogFile, sMessage ) /* open file & write message */ rc = LINEOUT( fLogFile ) /* close file */ END /* fLogFile IF */ return rc /* Ende von Message */ /*--------------------------------------------------------------------------- sReturn = CreateApp( sDest, sName, fFile, sObject, sType, sExtras ) erstellt ein Programmobjelt namens sName im Ordner sDest Hinweis: Die Funktion setzt als Arbeitsverzeichnis automatisch den Programm- Pfad. Sollte ein anderes Arbeitsverzeichnis ben”tigt werden, so m�ssen Sie mit SysSetObjectData die ben”tigte Korrektur vornehmen: rc = SysSetObjectData( sDest, 'STARTUPDIR=path' ) Argumente sDest Objekt-ID des Zielordners - muss vorhanden sein sName Symboltitel fFile Programmdatei mit vollem Pfad sObject Objekt-ID - muss einzigartig sein sType Typ des Programms wie (wegen weiterer s. WinCreateObject): PM - WPS-Program WINDOWABLEVIO - im OS/2-Fenster WINDOWEDVDM - im DOS-Fenster sExtras weitere additions to object creation options, such as parameters format is: option1=value1;option2=value2; ... values may contain blanks but must be terminated by ';' R�ckgabe sReturn 1 falls erfolgreich, ansonsten 0 Intern rc R�ckgabewert von Funktionsaufrufen sDir Programmpfad sOptions Objektgenerierungsoptionen sReturn R�ckgabewert von SysCreateObject() oder 0 ---------------------------------------------------------------------------*/ CreateApp: PARSE ARG sDest, sName, fFile, sObject, sType, sExtras sReturn = 0 rc = stream( fFile, 'c', 'query exist' ) if rc = fFile then DO rc = SysSetObjectData( sObject, '' ) /* pr�fen, ob Objekt existiert */ if rc = 1 THEN rc = Message( ' Kann '||sName||' nicht anlegen, weil die Objekt-ID '||sObject||' existiert' ) ELSE DO sDir = filespec( "drive", fFile )||filespec( "path", fFile) rc = Message( 'Creating '||sName||' object' ) sOptions = 'OBJECTID='||sObject||';STARTUPDIR='sDir';EXENAME='||fFile||';' sOptions = sOptions||'PROGTYPE='||sType||';CONCURRENTVIEW=NO;MINWIN=VIEWER' IF sExtras \= '' THEN sOptions = sOptions||';'||sExtras sReturn = SysCreateObject( 'WpProgram', sName, sDest, sOptions, 'replace' ) IF sReturn = 0 THEN rc = Message( ' Kann Objekt '||sName||' nicht anlegen' ) END /* sObject else */ END /* fFile if */ ELSE rc = Message( sName||' nicht vorhanden - Programmobjekt nicht erstellt' ) return sReturn /* Ende von CreateApp */ /*--------------------------------------------------------------------------- sReturn = CreateFolder( sDest, sName, sObject ) Erstellt einen Ordner namens sName im Ordner sDest Anmerkung: diese Routine wird einen Ordner gleichen Namens, falls ein solcher im Zielordner bereits vorhanden sein sollte, h”chstwahrscheinlich ersetzen. Die Objekt-ID wird zwar gepr�ft, um sicherzustellen, daá sie nicht der eines existierenden Objekts entspricht, nicht aber der Ordnername. Die WPS ist m”glicherweise schlau genug, um mit einem doppelten Namen umgehen zu k”nnen, getestet wurde dies jedoch nicht. Argumente sDest Objekt-ID des Zielordners - muá vorhanden sein sName Ordnername sObject Object-ID des zu erstellenden Ordners, muss neu sein R�ckgabe sReturn Objekt-ID: falls erfolgreich, die des angelegten Ordners, sonst die des Zielordners Globalvariable clFolderClass Klasse des anzulegenden Ordnertyps Intern rc R�ckgabewert von Funktionsaufrufen sObject Ordner-Objekt-ID sOptions Objektgenerierungsoptionen ---------------------------------------------------------------------------*/ CreateFolder: PARSE ARG sDest, sName, sObject sReturn = sDest rc = Message( ' Erstelle Ordner: '||sName ) rc = SysSetObjectData( sObject,'' ) /* pr�fen, ob Objekt existiert */ if rc = 1 THEN rc = Message( ' Kann '||sName||' nicht erstellen, weil Objekt-ID '||sObject||' existiert' ) ELSE DO sOptions = 'OBJECTID='||sObject||';CONCURRENTVIEW=NO;VIEWBUTTON=MINIMIZE;' sOptions = sOptions||'MINWIN=HIDE;ICONVIEW=NONGRID,NORMAL' rc = SysCreateObject( clFolderClass, sName, sDest, sOptions, 'replace' ) IF rc = 0 THEN rc = Message( ' Ordner '||sName||' konnte nicht erstellt werden' ) ELSE sReturn = sObject END /* sObject else */ return sReturn /* Ende von CreateFolder */ /*--------------------------------------------------------------------------- sResult = MoveObject( sSource, sDest, sName ) Eine Routine zum Verschieben von Objekten zwischen zwei Lokationen Argumente sSource Objekt-ID, die verschoben werden soll sDest Objekt-ID, zu welcher verschoben werden soll sName Beschreibung des Quellobjektes (f�r das Log) R�ckgabe sResult Erfolg der Operation: 1 = verschoben, 0 = nicht verschoben Intern rc R�ckgabewert der Message-Funktion sResult R�ckgabewert der Objektfunktion ---------------------------------------------------------------------------*/ MoveObject: PARSE ARG sSource, sDest, sName rc = Message( ' Verschiebe Objekt: '||sName ) sResult = SysSetObjectData( sSource, '' ) /* pr�fen, ob Objekt existiert */ if sResult = 0 THEN rc = Message( " Nicht verschoben - existiert nicht!" ) ELSE DO sResult = SysMoveObject( sSource, sDest ) IF sResult = 0 THEN rc = Message( ' Nicht verschoben - Objekt-IDs pruefen' ) END RETURN sResult /* Ende von MoveObject */ /*--------------------------------------------------------------------------- sResult = ShadowObject( sSource, sDest, sName ) Einer Routine zur Erstellung einer Referenz eines Objektes Argumente sSource Object-ID des Quellobjektes sDest Object-ID des Zielordners der Referenz sName Beschreibung des Quellobjektes (f�r das Log) R�ckgabewert sResult Erfolg der Operation: 1 = Referenz erstellt, 0 = nicht erstellt Intern rc R�ckgabewert der Message-Funktion sResult R�ckgabewert der Objektfunktion ---------------------------------------------------------------------------*/ ShadowObject: PARSE ARG sSource, sDest, sName rc = Message( ' Erstelle Referenz fuer Objekt: '||sName ) sResult = SysSetObjectData( sSource, '' ) /* pr�fen, ob Objekt existiert */ if sResult = 0 THEN rc = Message( " Keine Referenz erstellt - Quellobjekt nicht vorhanden!" ) ELSE DO sResult = SysCreateShadow( sSource, sDest ) IF sResult = 0 THEN rc = Message( ' Keine Referenz erstellt - Objekt-IDs pruefen' ) END RETURN sResult /* Ende von ShadowObject */ /*--------------------------------------------------------------------------- sReturn = CreateINIentry( sINIfile, sApp, sKey, sVal, sNull ) versucht, einen Eintrag in einer INI-Datei f�r die Anwendung sAdd mit dem Schl�ssel sKey und dem Schl�sselwert sVal anzulegen. Wenn sKey bereits existiert, dann wird sein derzeitiger Wert zur�ckgegeben und nichts ver„ndert Eingabe: sINIfile zu ver„ndernde INI-Datei: 'USER', 'SYSTEM' oder ein Dateiname Anmerkung: ist die Datei nicht vorhanden, wird sie erstellt sApp Anwendungsname zum Abspeichern von Profilangaben sKey Schl�sselname zum Abspeichern der Profilangaben sVal Schl�sselwert der Anwendung sNull Nullterminator an Schl�sselwert anh„ngen? 'Y' = ja, 'N' = nein R�ckgabe sReturn R�ckgabewert von SysIni Intern rc R�ckgabewert der Funktion Message sReturn R�ckgabewert von SysIni ---------------------------------------------------------------------------*/ CreateINIentry: PARSE ARG sINIfile, sApp, sKey, sVal, sNull rc = Message( ' pruefe INI-Dateieintrag "'sApp'"' ) sReturn = SysIni( sIniFile, sApp, sKey ) IF sReturn = 'ERROR:' THEN DO rc = Message( ' erstelle INI-Dateieintrag fuer Schluessel "'sKey'"' ) IF TRANSLATE( sNull ) = 'Y' THEN sVal = sVal||'0'x sReturn = SysIni( sIniFile, sApp, sKey, sVal ) IF sReturn = '' THEN rc = Message( ' erfolgreich hinzugefuegt: "'sVal'"' ) ELSE rc = Message( ' nicht erfolgreich: SysIni Rueckgabewert = "'sReturn'"' ) END ELSE rc = Message( ' Eintrag bereits vorhanden: "'sReturn'"' ) return sReturn /* Ende von CreateINIentry */ /*--------------------------------------------------------------------------- sDest = Concactpath( sDest, sSource, sPlace ) Routine zum Anh„ngen eines einzelnen Verzeichnispfades zu einer Variablen, die eine Pfadzeichenkette enth„lt, die einer gegebenen Umgebungsvariablen der config.sys hinzugef�gt werden soll Argumente sDest die Variable, die die Pfadzeichenkette enth„lt sSource der anzuh„ngende Pfad sPlace der Name der betr. Umgebungsvariablen (wie z. B. PATH) wird f�r LOG-Ausgaben ben”tigt R�ckgabe sDest die erweiterte Pfadzeichenkette Intern dPos Position von ';' in sSource dLen L„nge von sSource rc R�ckgabewert von Funktionsaufrufen sCurDir aktuelles Verzeichnis sNewDir Verzeichnis, zu dem mit DIRECTORY gewechselt wird ---------------------------------------------------------------------------*/ ConcactPath: PARSE ARG sDest, sSource, sPlace IF sSource \= '' THEN DO /* etwas zum anh„ngen, also los */ rc = Message( ' Anhaengen von "'||sSource||'" an '||sPlace ) sCurDir = DIRECTORY() /* pr�fen ob sSource ein vorhandenes Verzeichnis ist */ sNewDir = DIRECTORY( sSource ) /* Versuch, dorthin zu wechseln */ IF TRANSLATE( sNewDir ) = TRANSLATE( sSource ) THEN /* hat geklappt */ rc = DIRECTORY( sCurDir ) /* ist da, also zur�ck */ ELSE /* nicht vorhanden, also Warnung ausgeben und trotzdem verwenden */ rc = Message( ' WARNUNG: '||sSource||' existiert nicht' ) sDest = sDest||sSource /* neuen Pfad an vh. String anh„ngen */ dPos = LASTPOS( ';', sSource ) /* pr�fe auf ';' am Stringende */ dLen = LENGTH( sSource ) IF dPos \= dLen THEN sDest = sDest||';' /* kein ';' am Ende, also eines anh„ngen */ END /* sSource if */ return sDest /* Ende von ConcactPath */ /*--------------------------------------------------------------------------- rc = AddCfgEntry( sEntry ) Hinzuf�gen einer einzelnen Zeile zur Stammvariablen, die die Eintr„ge f�r die config.sys enth„lt Argumente sEntry die hinzuzuf�gende Zeichenkette R�ckgabe stAddlCfg.0 die Anzahl der Elemente der Stammvariablen Intern i Anzahl Eintr„ge ---------------------------------------------------------------------------*/ AddCfgEntry: PARSE ARG sEntry IF sEntry \= '' THEN DO /* etwas hinzuzuf�gen */ i = stAddlCfg.0 /* pr�fe, wieviele schon da sind */ i = i + 1 /* auf den n„chsten Eintrag erh”hen */ stAddlCfg.i = sEntry /* Zeile im n„chsten Eintrag ablegen */ stAddlCfg.0 = i /* Aktualisieren des Eintragsz„hlers */ rc = Message( ' config.sys-Zeile hinzugefuegt: "'||sEntry||'"' ) END /* sEntry if */ return stAddlCfg.0 /* Ende von AddCfgEntry */ /*--------------------------------------------------------------------------- rc = UpdateConfigSys( sReplace ) Erg„nzt config.sys um die sNew.... Pfadvariablenanpassungen und f�gt alle Eintr„ge aus stAddlCfg hinzu Anmerkung: Diese Routine ist modifizierter Kode von IBMs Works-Migrationsskript (und hier besser lesbar und kompakter) Argumente sReplace Y = Eintr„ge „ndern und in sBootDrive\config.sys speichern (die originale config.sys gesichert als config.mig) N = Ver„nderungen in sBootDrive\config.mig speichern (die originale config.sys bleibt unangetastet) R�ckgabewert sReturn der R�ckgabewert von LINOUT ( 0 = ok, alles andere ?) Globalvariablen sBootDrive derzeitiges OS/2-Systemlaufwerk (oder '.' im Testfall) sNewBook hinzuzuf�gende BOOKSHELF-Pfade sNewDpath hinzuzuf�gende DPATH-Pfade sNewPath hinzuzuf�gende PATH-Pfade sNewLib hinzuzuf�gende LIBPATH-Pfade stAddlCfg Stammvariable, die die zur config.sys hinzuzuf�genden Zeilen enth„lt Intern fCurConfig die originale config.sys fNewConfig die zu erstellende config-Datei tmpconfig Tempor„rdatei f�r Kopieroperationen rc R�ckgabewert von Funktionsaufrufen sReturn R�ckgabewert von LINOUT sInLine einzelne config.sys-Zeile sOS2var config.sys-Variable (der Teil vor dem '=') sOS2value dazugeh”riger Wert (nach dem '"' ) ---------------------------------------------------------------------------*/ UpdateConfigSys: PARSE ARG sReplace fCurConfig = sCfigDrive||'\CONFIG.SYS' /* momentane config.sys */ fNewConfig = sCfigDrive||'\CONFIG.MIG' /* die neue samt Anpassungen */ tmpconfig = sCfigDrive||'\IWTMP.SYS' /* temp file (could use REXX routine) */ '@del 'fNewConfig ' 2>nul >nul' /* config.mig vorsorglich l”schend */ DO WHILE LINES( fCurConfig ) /* gesamte Datei durchsuchen */ sInLine = LINEIN( fCurConfig ) /* und dabei Zeile f�r Zeile lesen */ /* Variablen und Wert auseinandernehmen */ PARSE VALUE sInLine WITH sOS2var '=' sOS2value sOS2var = TRANSLATE( sOS2var ) /* in Groáschrift umsetzen */ SELECT WHEN sOS2var = 'SET BOOKSHELF' THEN /* BOOKSHELF-Eintr„ge hinzu */ sReturn = UpdateConfLine( fNewConfig, sInLine, sNewBook ) WHEN sOS2var = 'SET DPATH' THEN /* auch DPATH-Eintr„ge */ sReturn = UpdateConfLine( fNewConfig, sInLine, sNewDpath ) WHEN sOS2var = 'SET HELP' THEN /* und HELP-Eintr„ge */ sReturn = UpdateConfLine( fNewConfig, sInLine, sNewHelp ) WHEN sOS2var = 'SET PATH' THEN /* und PATH entries */ sReturn = UpdateConfLine( fNewConfig, sInLine, sNewPath ) WHEN sOS2var = 'LIBPATH' THEN /* und LIBPATH entries */ sReturn = UpdateConfLine( fNewConfig, sInLine, sNewLib ) /*--------------------------------------------------------------------------- Da hier sowieso gerade die gesamte config.sys verarbeitet wird, w„re das eine gute Gelegenheit, vorhandene Zeilen an Ort und Stelle anzupassen und/oder zus„tzliche Zeilen am Ende anzuh„ngen. Hier ein paar Beispiele dazu: WHEN sOS2var = 'PROTSHELL' THEN DO /* c-a-d PROTSHELL-Eintrag einbauen */ sReturn = lineout( fNewConfig, sInLine ) sReturn = lineout( fNewConfig, 'rem ** PROTSHELL=E:\CADCMDR\CADCMDR.EXE' ) END WHEN sOS2var = 'SWAPPATH' THEN /* SWAPPATH-Eintrag ver„ndern */ sReturn = lineout( fNewConfig, 'SWAPPATH=E:\ 4096 98304' ) Beachten Sie, daá das folgende Beispiel den Werteteil des Eintrags verwendet WHEN sOS2value = 'USBMSD.ADD' THEN /* USB-Massenspeichereintrag aktivieren (REM wegwerfen) */ sReturn = lineout( fNewConfig, 'BASEDEV=USBMSD.ADD /FLOPPIES:0 /REMOVABLES:1' ) Ende der Beiepiele ---------------------------------------------------------------------------*/ OTHERWISE /* die vorhandene Zeile in die neue Konfigurationsdatei schreiben */ sReturn = lineout( fNewConfig, sInLine ) END /* select */ END /* LINES DO */ IF stAddlCfg.0 > 0 THEN DO /* weitere Eintr„ge hinzuf�gen */ DO i = 1 TO stAddlCfg.0 sReturn = LINEOUT( fNewConfig, stAddlCfg.i ) END /* i DO */ END /* stAddlCfg IF */ sReturn = LINEOUT( fNewConfig ) /* Dateien schlieáen */ sReturn = LINEOUT( fCurConfig ) /* originale config.sys durch neue ersetzen */ IF TRANSLATE( sReplace ) = 'Y' THEN DO '@erase 'tmpconfig' 2>nul >nul' /* vorsorgliches L”schen der temp-Datei */ '@rename 'fCurConfig' 'tmpconfig' >nul' /* umbenennen: originale nach temp */ '@rename 'fNewConfig' 'fCurConfig' >nul' /* umbenennen: neue nach config.sys */ '@rename 'tmpconfig' 'fNewConfig' 2>nul >nul' /* umbenennen: temp nach neu */ rc = Message( ' '||fCurConfig||' erfolgreich angepasst. Die bisherige Datei wurde als '||fNewConfig||' gesichert' ) END ELSE rc = Message( ' '||fNewConfig||' enth„lt alle Anpassungen. Die originale '||fCurConfig||' ist unver„ndert.' ) return sReturn /* Ende von UpdateConfigSys */ /*--------------------------------------------------------------------------- rc = UpdateConfLine( fOutFile, sInput, sAddition ) Einer vorhandenen Zeile einen Text hinzuf�gen und das Resultat in die neue config.sys aufnehmen Argumente fOutFile Ausgabedatei f�r den modifizierten Eintrag sInput derzeitiger Wert der config.sys-Zeile sAddition Zeichenkette, die zu sInput hinzugef�gt werden soll R�ckgabewert sReturn der R�ckgabewert von LINOUT ( 0 = ok, alles andere ?) Intern sLen L„nge einer Zeichenkette sPos Position einer Unterzeichenkette in einer Zeichenkette sReturn R�ckgabewert von LINEOUT ---------------------------------------------------------------------------*/ UpdateConfLine: PARSE ARG fOutFile, sInput, sAddition IF sAddition \= '' THEN DO /* etwas ist hinzuzuf�gen, also los */ /* die folgende Zeile pr�ft, ob der hinzuzuf�gende Pfad im existierenden */ /* Pfad bereits vorhanden ist. Das ist zwar n�tzlich, klappt aber nur, wenn */ /* die gesamte Zeichenkette doppelt ist. Man sollte wirklich jeden Pfadeintrag */ /* auf Dubletten pr�fen. Nicht allzu schwer, aber wom”glich verwirrend. */ /* Vielleicht in einer zuk�nftigen Version zu implementieren. */ sPos = POS( TRANSLATE( sAddition ), TRANSLATE( sInput )) IF sPos = 0 THEN DO /* nicht vh., also dazunehmen */ sPos = LASTPOS( ';', sInput ) /* auf ';' am Ende pr�fen */ sLen = LENGTH( sInput ) IF sPos \= sLen THEN sInput = sInput||';' /* kein ';' also anh„ngen */ sInput = sInput||sAddition /* Anpassungen dazu */ END /* pos if */ END /* sAddition IF */ sReturn = LINEOUT( fOutFile, sInput ) /* Resultat in neue config schreiben */ return result /* Ende von UpdateConfLine */ /*--------------------------------------------------------------------------- sDest = ConcactTabID( sDest, iTab, sObjID, sPlace ) Eine Routine zum anf�gen eines Tab Launchbar-Objektes zu einer Variablen, die eine Kette von Tab-Objekten enth„lt Argumente sDest enth„lt die Tab-Objekt-IDs, die hinzukommen sollen iTab die TAB-Nummer, zu der etwas hinzugef�gt werden soll sObjID die hinzuzuf�gende Objekt-ID sPlace hinzuzuf�gender Ordner-/Programmname (f�r das Log) R�ckgabewert sDest die neuen Objekt-ID-Eintr„ge Intern rc R�ckgabewerte von Funktionsaufrufen ---------------------------------------------------------------------------*/ ConcactTabID: PARSE ARG sDest, iTab, sObjID, sPlace IF sObjID \= '' THEN DO /* etwas ist hinzuzuf�gen, also los */ rc = Message( ' Eintrag "'||sPlace||'" wird dem Tabulator '||iTab||' hinzugefuegt' ) rc = SysSetObjectData(sObjID,'' ) /* pr�fen, ob Objekt existiert */ IF rc = 0 THEN /* existiert nicht, also ignorieren */ rc = Message( ' WARNUNG: '||sPlace||' existiert nicht, nicht hinzugefuegt' ) ELSE /* existiert, also gew�nschten Tabulatoreintrag vornehmen */ sDest = sDest||iTab||'='||sObjID||',' END /* sObjID if */ return sDest /* Ende von ConcactTabID */