[bfprog] OS Module Nerfed, Plus

Anton Jansen gradius at fmf.nl
Fri Jun 24 15:13:08 PDT 2005


Forrest Thiessen wrote:

>>However, I don't think it's THAT simple, as there will 
>>be plenty of small nifty irritating little things to think about.
>>
>>    
>>
>
>Ugh.  I just found one of those "nifty irritating little things".  I've
>been experimenting with BF2, poking and proding things from within
>Python scripts to try to figure out how they work.  I finally decided it
>would facilitate this work to use the script I posted earlier that
>imports everything it finds in a "custom" directory.  Guess what?  My
>script, which works just fine under regular Python, doesn't work under
>the BF2-embedded Python interpreter.
>
>The problem: it appears that DICE "neutered" the os module, so you can
>"import os", but when you try to do "os.listdir("whatever")", the server
>aborts with an error, saying there is no such method.  I tried some of
>the os methods and attributes, and I can't get them to work, either.
>
>In retrospect, this probably makes sense: the os module lets Python
>manipulate the local operating system; os.system(), for example, lets
>you execute arbitrary operating system commands.  For security reasons,
>I guess I could understand someone not wanting Battlefield 2 scripts to
>be able to do this.
>
>If true, this means that there is no (obvious) way of finding out what
>modules are in a directory, and if you don't know a modules name, you
>can't import it.
>
>Still there are several possible ways out of this:
>
>1. While DICE has the Python standard library already packaged up and
>available for the embedded interpreter, it might be possible to include
>a working os module with the BF2Metamod installation, and then import
>that to get around this problem.
>
>2. The worst-case scenario: implement a registration scheme for custom
>modules. Just include a text file in the "custom" directory that
>includes the names of all the custom modules that should be imported. 
>Instead of just dropping custom modules into a folder, you would then
>also need to add their names to the text file.
>
>I'll keep messing around with it.
>
>
>You asked for comments on your proposed requirements; sorry for the
>delay, but here are mine:
>
>  
>
>>Functional requirements:
>>BF2Metamod should:
>>1. Support both server side scripts, as well as game mods.
>> 
>>
>>    
>>
>Not a problem; I've given this one some thought, and think the best way
>to implement this is as two packages: one goes in the python/bf2
>directory and contains customizations for the server in general; the
>other goes in the mod directory (for example, mods/bf2/python) and
>contains customizations for that specific mod.  Both packages have the
>same __init__.py code.  Then, instead of adding just one line to
>python/bf2/__init__.py, you add these two lines:
>  import bf2.custom
>  __import__.(bf2.gameLogic.getModDir()).custom
>. . .or something like that--I need to do some experimenting!  The point
>is that the first line imports the overall server custom package, and
>the second dynamically imports the custom package specific to the mod
>being run.
>
>  
>
>>2. Allow for multiple mods to be run simultaniously
>> 
>>
>>    
>>
>The script I proposed already does this.  No problem.
>
>  
>
>>3. Easy deployment and installation
>> 
>>
>>    
>>
>This one is a little tricky--the whole nature of the problem requires
>modifying DICE's python/bf2/__init__.py file, so we need to do one of
>the following, all of which are yucky:
>
>a. Tell the user what lines to add to what file; because this is Python
>this is especially tricky--the lines in question need to be indented
>just right, or the game will crash with a Python error, and the lines in
>question need to be added at the end of the file, just after several
>lines with different levels of indentation, so it liable to be confusing
>for people.
>
>b. Include an installation script that makes the change for people; also
>tricky if people have made any other changes to the file, and may have
>problems if/when EA updates the original file, but is probably do-able.
>
>c. Include a full copy of the file with the changes already made, so
>they just drop the replacement file in, overwriting the original.  This
>is probably easiest thing to do, but still suffers from problems if
>people have made other customizations and from conflicts when EA does
>updates.
>
>  
>
>>4. Allow for run-time reconfiguration of the mods being active
>> 
>>
>>    
>>
>If by "mods" you mean the plug-in customized Python modules (as opposed
>to "mods" like "bf2"), this would be a real headache.  Of course, this
>being Python, it's certainly possible--you can change running Python
>programs while they're executing and have everything work, if you're
>careful.  The details, though, could get really, really nasty in this case.
>
>I suppose we could require the writers of plug-ins to include an
>"uninstall" method, and then watch for console commands via
>pythonHost.sendCommand (although I haven't figured out how to get this
>to work, yet), and then call the appropriate uninstall methods. . . 
>I'll give it some thought.
>
>  
>
>>Optional stuff:
>>
>>5. A logging infrastructure for debugging
>> 
>>
>>    
>>
>I think this is best handled by a plug-in.  It's easy to do, just four
>lines:
>  import sys
>  logFile = open('mylog.log', 'a')
>  sys.stdout = logFile
>  sys.stderr = logFile
>
>Put this in a .py file, drop it in the "custom" directory (and maybe
>register it, as described above), and you've got a debugging logging
>facility.
>
>We could make this plug-in a standard part of the BF2Metamod distribution.
>
>  
>
>>6. Automatic updating of installed mods/metamod
>> 
>>
>>    
>>
>If there isn't a fix for the emasculated os module, it wouldn't be
>possible to do this within the game itself--it would have to be done by
>an external program.  I'm also leary of the security issues it could
>raise, so consider me skeptical about this one.
>
>  
>
>>Non-functional requirements:
>>1. Stability, a mod crashing in meta-mod should not interfere with the 
>>others
>> 
>>
>>    
>>
>I don't think this is possible with the existing BF2/Python
>architecture.  As things stand, any uncaught exception anywhere in
>anybody's Python code causes the whole game to come crashing down. 
>Unless we want to implement an event callback wrapper scheme (MAJOR
>undertaking) and a whole new level of handler registration, there's no
>way we could catch people's exceptions for them.
>
>  
>
>>2. Flexibility, the BF2Metamod should support the BF2 engine as far as 
>>possible
>> 
>>
>>    
>>
>Already there. . . we may even be able to go a little farther than what
>the BF2 engine allows. . . for example, if we replaced the broken os
>module. . .
>
>  
>
>>3. Useability, configuration and installation of BF2Metamod and Mods 
>>using it should be automated. (No config files hacking please).
>> 
>>
>>    
>>
>Maybe. . . see comments above about installation.
>
>  
>
>>4. Maintainability, the BF2Metamod should be easy to maintain, as 
>>patches will evolve the BF2 engine.
>> 
>>
>>    
>>
>I think the biggest problem (maybe only problem) in this area is that
>for this to work a few lines need to be tacked into one of the DICE
>files. . . and the DICE files will change over time.  To really solve
>this issue, we need DICE to do what they should have done originally,
>and that is to put something like BF2Metamod into the code themselves.
>
>  
>
>>5. Performance, the BF2Metamod should not induce a significant 
>>performance penalty on the BF2 engine.
>>
>>    
>>
>Already done; the script I proposed needs a few microseconds during
>server start-up, and then is out of the picture completely.  If we added
>an uninstall capability, it would just need an extra few microseconds
>every time a console command was typed.
>
>
>--Forrest
>
>_______________________________________________
>BFProg mailing list
>BFProg at lists.matureasskickers.net
>http://lists.matureasskickers.net/mailman/listinfo/bfprog
>  
>
Hi Forrest,

It looks good, I will spend some time on this tomorrow. I need some 
sleep first ;-)

With kind regards,

Anton Jansen


More information about the BFProg mailing list