Dear Salim, I ran the script on a Windows 7 64 but if returned only that the AccessGrid libs could not be found. on inspection I found that the path (default for the installer i used i assume) is ......\AccessGrid3 not ....\AccessGrid. rather than being a fault with your script i think that this may reflect my concern that there is a great diversity of installs out in the world that may have arisen by a variety of factors including platform, build process and usage patterns. I also have noted the occurrence of a number of places outside the python libs and userspaces that the AccessGrid files are installed. Others will know more than me about what role these play but it is probably necessary to ensure consistency.
I have had a go at approaching this more generally but I fear that there may be little chance of getting away from a lot of testing. At this stage I have only started on the "system" files. To generalise the process I use a class of file walkers that traverse specified subdirectories of the filesystem, identify filesnames that match what we care about (unfortunately more reliable methods of ignoring binary files is not implemented in python 2.4/2.5) and perform the substitutions by calling a chunk of your script. you will see at the bottom a chunk of slightly over-engineered inheritence statements and the start of some logic for different platforms. you can see the included examples of some system file areas that are particular to different platforms and are outside the python library space. I have not yet actually set the script to make the alterations: just find the targets but that should be a simple change of function call once we feel it is ready. i have also not yet incorporated operations that work in the user space: it occurred to me that it might be best to approach that in a separate script: one for sudo/admin users to carefully apply to their system, and one for users to blithely run without bringing the whole thing down in a screaming heap. by all means send back edits, suggestions or point out how my approach is doomed to failure. in particular, suggestions of a more pythonic approach are welcome: those that know java will recognise my object-heavy paradigm. i will definitely boost the comments and look at where checks are needed too. pasted below and attached Tim Salmon IT Technical Officer Faculty of Science UNSW import fileinput import os import platform import re import shutil import sys import tempfile from distutils.sysconfig import get_python_lib ## RewriteWalker performs a os.path.walk of base_dir class RewriteWalker: def __init__(self, base_dir, file_re, find_str, replace_str): self.base_dir = base_dir self.file_filter = re.compile(file_re) self.find_str = find_str self.replace_str = replace_str def walk_files(self): for root, directories, filenames in os.walk(self.base_dir): for filename in filenames: if (self.file_filter.match(filename)): filepath = os.path.join(root, filename) self.find_lines(filepath) #rewrite(filepath) def find_lines(self, srcfile): line_count = 0; src = open(srcfile, 'r') for line in src: line_count += 1 if self.find_str in line: print srcfile print str(line_count) + ": " + line def rewrite(srcfile, searchPattern, replaceStr): dstfile = srcfile + '.bak' #Checks to see if the file has been backed up if not then create a backup of the file. if not os.path.isfile(dstfile): shutil.copy(srcfile,dstfile) #creates a temporary file in the same directory that the "executable" was launched from tmpfilename = str(os.getpid()) tfile = open(tmpfilename,'w') src = open(srcfile,'r') #loops through the entire file changing text for line in src: if searchPattern in line: tfile.write(line.replace(self.find_str,self.replace_str)) else: tfile.write(line) tfile.close() src.close() #overwrites the srcfile and deletes the temp file shutil.copy2(tmpfilename,srcfile) os.unlink(tmpfilename) class AGUpdater: def __init__(self): # define list of root paths and populate with those in python_lib self.root_path_list = [] ag_python_lib_folder_list = ["AccessGrid", "AccessGrid3"] python_lib_dir = get_python_lib() for folder_name in ag_python_lib_folder_list: folder_path = os.path.join(python_lib_dir, folder_name) if os.path.exists(folder_path): self.root_path_list.append(folder_path) # define map of substitutions that can be applied [globally] self.subs_map = {} ##self.subs_map['bugzilla.mcs.anl.gov'] = 'bugzilla.accessgrid.org' self.subs_map['mcs.anl.gov'] = 'accessgrid.org' ##self.subs_map['140.221.6.95'] = 'www.accessgrid.org' ##self.subs_map['140.221.8.33'] = 'vv3.accessgrid.org' # define list of filename_re that identify which files will be modified # please note that this uses regular expressions not just simple expansions self.filename_re_list = [] self.filename_re_list.append('.*\.py$') self.filename_re_list.append('.*\.txt$') # iterate throught root paths, filename_res and substitutions and create all combinations def generate_walkers(self): self.walkers=[] for root_folder in self.root_path_list: for filename_re in self.filename_re_list: for subs_key, subs_val in self.subs_map.iteritems(): walker = RewriteWalker(root_folder, filename_re, subs_key, subs_val) self.walkers.append(walker) def perform_update(self): for walker in self.walkers: walker.walk_files() class WindowsAGUpdater(AGUpdater): def __init__(self): AGUpdater.__init__(self) class WindowsXPAGUpdater(WindowsAGUpdater): pass class WindowsXP_32AGUpdater(WindowsXPAGUpdater): pass class WindowsXP_64AGUpdater(WindowsXPAGUpdater): pass class Windows7AGUpdater(WindowsAGUpdater): def __init__(self): WindowsAGUpdater.__init__(self) class Windows7_32AGUpdater(Windows7AGUpdater): def __init__(self): Windows7AGUpdater.__init__(self) root_path_list.append("C:\\Program Files\\AGTk3\\") class Windows7_64AGUpdater(Windows7AGUpdater): def __init__(self): Windows7AGUpdater.__init__(self) root_path_list.append("C:\\Program Files (x86)\\AGTk3\\") class PosixAGUpdater(AGUpdater): def __init__(self): AGUpdater.__init__(self) class LinuxAGUpdater(PosixAGUpdater): def __init__(self): PosixAGUpdater.__init__(self) class RedHatLinuxAGUpdater(LinuxAGUpdater): def __init__(self): LinuxAGUpdater.__init__(self) class RHELLinuxAGUpdater(RedHatLinuxAGUpdater): def __init__(self): RedHatLinuxAGUpdater.__init__(self) self.root_path_list.append('/usr/share/doc/AccessGrid-3.2/') self.filename_re_list.append('^Install\.LINUX') self.filename_re_list.append('^README') self.filename_re_list.append('^VERSION') class DebianLinuxAGUpdater(LinuxAGUpdater): def __init__(self): LinuxAGUpdater.__init__(self) class UbuntuLinuxAGUpdater(DebianLinuxAGUpdater): def __init__(self): DebianLinuxAGUpdater.__init__(self) class OSXAGUpdater(PosixAGUpdater): def __init__(self): PosixAGUpdater.__init__(self) if __name__ == "__main__": platform_str = platform.platform() updater = AGUpdater() if "Windows" in platform_str: if "7" in platform_str: if "64" in platform_str: updater = Windows7_64AGUpdater() elif "Linux" in platform_str: if "redhat" in platform_str: if "6.2" in platform_str: updater = RHELLinuxAGUpdater() updater.generate_walkers() updater.perform_update() ________________________________________ From: ag-dev-boun...@lists.mcs.anl.gov [ag-dev-boun...@lists.mcs.anl.gov] on behalf of Salim Haniff [salim.han...@uta.fi] Sent: Thursday, May 24, 2012 4:18 PM To: ag-t...@lists.mcs.anl.gov; ag-dev Subject: Re: [AG-DEV] [AG-TECH] New accessgrid.org Venue Server Hi, The script for renaming urls and disabling venueclient's submit report bug is currently located at http://code.google.com/p/salims-scratch-box/source/browse/AGpatch/trunk/src/AGpatch.py I will move it later this week to the sourceforge AccessGrid location. Sorry if the script is a bit rough I'm a novice at python but feel free to suggest improvements :) The script was developed and tested on a Fedora box and a Scientific linux box as root, since root is the owner of the site-packages directory in python. I need to make a modification later today to allow the user to execute the python app to rename the urls in their ~/.AccessGrid3/Config alone (probably takes about 5 minutes). Windows and Mac still needs to be tested. At this time, disabling multicast by default for Windows 7 users is still outstanding. If anyone knows how to do that feel free to email me. Best, Salim Quoting Christoph Willing <c.will...@uq.edu.au>: > The machine which will become vv3.accessgrid.org has now been > populated with all the venues & layout from vv3.mcs.anl.gov (which > will close down on 1st June). > > Could anyone who has a few minutes to spare please try out the new > server and report back any problems. Feel free to give it a good > workout. It would be great to have any issues with it sorted out by > the time its supposed to be on line for real - 1st June is just > about a week away. > > Until the DNS is arranged, access to the venue server is via: > https://130.102.78.188:8000/Venues/default > > > > chris > > > > Christoph Willing +61 7 3365 8316 > Research Computing Centre > University of Queensland -- Salim Haniff (salim.han...@uta.fi) School of Information Sciences 33014 University of Tampere, Finland
import fileinput import os import platform import re import shutil import sys import tempfile from distutils.sysconfig import get_python_lib ## RewriteWalker performs a os.path.walk of base_dir class RewriteWalker: def __init__(self, base_dir, file_re, find_str, replace_str): self.base_dir = base_dir self.file_filter = re.compile(file_re) self.find_str = find_str self.replace_str = replace_str def walk_files(self): for root, directories, filenames in os.walk(self.base_dir): for filename in filenames: if (self.file_filter.match(filename)): filepath = os.path.join(root, filename) self.find_lines(filepath) #rewrite(filepath) def find_lines(self, srcfile): line_count = 0; src = open(srcfile, 'r') for line in src: line_count += 1 if self.find_str in line: print srcfile print str(line_count) + ": " + line def rewrite(srcfile, searchPattern, replaceStr): dstfile = srcfile + '.bak' #Checks to see if the file has been backed up if not then create a backup of the file. if not os.path.isfile(dstfile): shutil.copy(srcfile,dstfile) #creates a temporary file in the same directory that the "executable" was launched from tmpfilename = str(os.getpid()) tfile = open(tmpfilename,'w') src = open(srcfile,'r') #loops through the entire file changing text for line in src: if searchPattern in line: tfile.write(line.replace(self.find_str,self.replace_str)) else: tfile.write(line) tfile.close() src.close() #overwrites the srcfile and deletes the temp file shutil.copy2(tmpfilename,srcfile) os.unlink(tmpfilename) class AGUpdater: def __init__(self): # define list of root paths and populate with those in python_lib self.root_path_list = [] ag_python_lib_folder_list = ["AccessGrid", "AccessGrid3"] python_lib_dir = get_python_lib() for folder_name in ag_python_lib_folder_list: folder_path = os.path.join(python_lib_dir, folder_name) if os.path.exists(folder_path): self.root_path_list.append(folder_path) # define map of substitutions that can be applied [globally] self.subs_map = {} ##self.subs_map['bugzilla.mcs.anl.gov'] = 'bugzilla.accessgrid.org' self.subs_map['mcs.anl.gov'] = 'accessgrid.org' ##self.subs_map['140.221.6.95'] = 'www.accessgrid.org' ##self.subs_map['140.221.8.33'] = 'vv3.accessgrid.org' # define list of filename_re that identify which files will be modified # please note that this uses regular expressions not just simple expansions self.filename_re_list = [] self.filename_re_list.append('.*\.py$') self.filename_re_list.append('.*\.txt$') # iterate throught root paths, filename_res and substitutions and create all combinations def generate_walkers(self): self.walkers=[] for root_folder in self.root_path_list: for filename_re in self.filename_re_list: for subs_key, subs_val in self.subs_map.iteritems(): walker = RewriteWalker(root_folder, filename_re, subs_key, subs_val) self.walkers.append(walker) def perform_update(self): for walker in self.walkers: walker.walk_files() class WindowsAGUpdater(AGUpdater): def __init__(self): AGUpdater.__init__(self) class WindowsXPAGUpdater(WindowsAGUpdater): pass class WindowsXP_32AGUpdater(WindowsXPAGUpdater): pass class WindowsXP_64AGUpdater(WindowsXPAGUpdater): pass class Windows7AGUpdater(WindowsAGUpdater): def __init__(self): WindowsAGUpdater.__init__(self) class Windows7_32AGUpdater(Windows7AGUpdater): def __init__(self): Windows7AGUpdater.__init__(self) root_path_list.append("C:\\Program Files\\AGTk3\\") class Windows7_64AGUpdater(Windows7AGUpdater): def __init__(self): Windows7AGUpdater.__init__(self) root_path_list.append("C:\\Program Files (x86)\\AGTk3\\") class PosixAGUpdater(AGUpdater): def __init__(self): AGUpdater.__init__(self) class LinuxAGUpdater(PosixAGUpdater): def __init__(self): PosixAGUpdater.__init__(self) class RedHatLinuxAGUpdater(LinuxAGUpdater): def __init__(self): LinuxAGUpdater.__init__(self) class RHELLinuxAGUpdater(RedHatLinuxAGUpdater): def __init__(self): RedHatLinuxAGUpdater.__init__(self) self.root_path_list.append('/usr/share/doc/AccessGrid-3.2/') self.filename_re_list.append('^Install\.LINUX') self.filename_re_list.append('^README') self.filename_re_list.append('^VERSION') class DebianLinuxAGUpdater(LinuxAGUpdater): def __init__(self): LinuxAGUpdater.__init__(self) class UbuntuLinuxAGUpdater(DebianLinuxAGUpdater): def __init__(self): DebianLinuxAGUpdater.__init__(self) class OSXAGUpdater(PosixAGUpdater): def __init__(self): PosixAGUpdater.__init__(self) if __name__ == "__main__": platform_str = platform.platform() updater = AGUpdater() if "Windows" in platform_str: if "7" in platform_str: if "64" in platform_str: updater = Windows7_64AGUpdater() elif "Linux" in platform_str: if "redhat" in platform_str: if "6.2" in platform_str: updater = RHELLinuxAGUpdater() updater.generate_walkers() updater.perform_update()