Annotation of VSyncer/BaseSyncer.py, revision 1.1
1.1 ! casties 1: from OFS import SimpleItem
! 2: from Globals import Persistent, data_dir, MessageDialog
! 3: from AccessControl import getSecurityManager, Role
! 4: import Acquisition, base64, time
! 5: from Config import *
! 6: from SysConfig import *
! 7: from DocumentTemplate.DT_Var import url_quote_plus
! 8: from StringIO import StringIO
! 9: import string, os
! 10: from os.path import exists
! 11: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
! 12:
! 13: # do xml
! 14: import xmlrpclibBasicAuth
! 15:
! 16:
! 17: class BaseSyncer(SimpleItem.Item, Persistent, Acquisition.Implicit, Role.RoleManager):
! 18: """This class contains Basic methods, even These methods will be common if we implements Module Syncer"""
! 19: manage_options = (
! 20: {'label': 'Sync', 'action': 'manage_vsync' },
! 21: {'label': 'Edit Server', 'action': 'manage_edit' },
! 22: {'label': 'View Log', 'action': 'manage_viewlog' },
! 23: )
! 24:
! 25: __ac_permissions__= (
! 26: ('View management screens', (
! 27: 'manage_tabs','manage_main','manage_edit','is_diffable', 'manage_approvedAction', 'manage_addXMLRPC',
! 28: 'manage_listObjects', 'manage_exportXMLRPC', 'manage_deleteXMLRPC', 'manage_diffObject',
! 29: 'manage_compare', 'manage_srcXMLRPC', 'status_colour', 'manage_folders', 'manage_vsync') ),
! 30: ('Change permissions', ('manage_access',) ),
! 31: )
! 32:
! 33: targetServer=dest_syncer
! 34: allowed_objs_sync = allowed_objs_sync
! 35: manage_viewlog = PageTemplateFile('zpt/VViewLog', globals())
! 36:
! 37:
! 38: def __init__(self, id, title=''):
! 39: """initialize a new instance of Server"""
! 40: self.id = id
! 41: self.title = title
! 42: self.source_server = [ None, ] # source is this Syncer
! 43: self.dest_server = ''
! 44: self.log = 0
! 45: self.approval = 1
! 46: self.syncable = syncable
! 47: self.filtered_objects = []
! 48: self.logfile = os.path.join(data_dir, 'VSourceSyncer.log')
! 49:
! 50: def manage_editServer(self, title='', dest=None, log=0, approval=0, logfile='', REQUEST=None, syncable=syncable, filterObjects=0, allowed_objs=[] ):
! 51: "edit server"
! 52: auth_user = getSecurityManager().getUser().getId()
! 53: if auth_user not in managers_list:
! 54: return MessageDialog(title='Addess Denied', message='You are not allowed to edit SourceSyncer', action='manage_vsync')
! 55:
! 56: self.title = title
! 57: self.log = log
! 58: self.logfile = logfile
! 59: self.approval = approval
! 60: self.syncable = syncable
! 61: self.dest_server = string.strip(dest)
! 62: self.filterObjects = filterObjects
! 63: self.filtered_objects = allowed_objs
! 64: if REQUEST is not None:
! 65: return MessageDialog(title = 'Edited', message = "Properties changed.", action = 'manage_edit')
! 66:
! 67: #################### for displaying the log info ##########################
! 68: def manage_getLog(self, filter=None):
! 69: """Return the log file details as a list """
! 70: log_list=[]
! 71: if not exists(self.logfile):
! 72: return 'file not found. Please enable log option from edit server tab'
! 73:
! 74: # Cool. File found. Open. if we have permission.
! 75: try:
! 76: fp = open(self.logfile, 'r')
! 77: data_list = fp.readlines()
! 78: fp.close()
! 79: except :
! 80: return "problem with opening/reading file"
! 81: dummy_list = []
! 82: for line in data_list:
! 83: if string.find(line, 'Syncing finished') > -1:
! 84: dummy_list.reverse()
! 85: log_list = log_list + dummy_list
! 86: dummy_list = []
! 87: continue
! 88: elif string.find(line, 'Syncing started') > -1:
! 89: dummy_list.append({'head':1,'text':line[:25]})
! 90: elif (string.find(line, 'Syncer:') > -1 or
! 91: string.find(line, 'Approver:') > -1):
! 92: dummy_list.append({'spec':1,'text':line[25:]})
! 93: else:
! 94: dummy_list.append({'normal':1,'text':line[25:]})
! 95:
! 96: log_list.reverse()
! 97: return log_list
! 98: ############################################################
! 99: def manage_approvedAction(self, REQUEST=None, action='', object=None, syncer=None, approver=None, comments=None):
! 100: """ If this action is to be approved, throw that data in into the message list """
! 101: if not syncer : syncer = getSecurityManager().getUser().getId()
! 102: msgs = ['Syncer: %s' % syncer,]
! 103: msgs.append('Approver: %s' % approver)
! 104:
! 105: # string out any newlines in comments
! 106: msgs.append('Comments: %s' % string.replace(comments, '\n', ''))
! 107: # call the relevant thing
! 108: if action == 'manage_updateXMLRPC':
! 109: return self.manage_updateXMLRPC(object, msgs=msgs, REQUEST=REQUEST)
! 110: else:
! 111: return self._error(msg='Unknown action')
! 112:
! 113:
! 114: def manage_addXMLRPC(self, data, obj_path, add_in=1):
! 115: """ Adds an object into the server """
! 116: # make sure we always get a string or a list
! 117: if type(obj_path) == type('string'): obj_path = string.split(obj_path, '/')
! 118:
! 119: # object lets try finding the parent
! 120: try: parent = self.restrictedTraverse(obj_path[:-1])
! 121: except KeyError: return 404
! 122:
! 123: # lets check they are allowed to do this
! 124: c = getSecurityManager().checkPermission
! 125: allowed = 1
! 126: for perm in ['Delete objects', 'Import/Export objects']:
! 127: if not c(perm, parent): allowed = 0
! 128: if not allowed: return 403
! 129:
! 130: # if there is one there already, delete it
! 131: if obj_path[-1] in parent.objectIds():
! 132: parent.manage_delObjects([obj_path[-1],])
! 133: else:
! 134: if not add_in: # ok so if we are deleting
! 135: return 404
! 136:
! 137: # lets do it
! 138: if add_in:
! 139: # fake a file using StringIO
! 140: file = StringIO()
! 141: file.write(self._decode(data))
! 142: file.seek(0)
! 143:
! 144: # now import
! 145: new = parent._p_jar.importFile(file)
! 146: parent._setObject(new.getId(), new)
! 147:
! 148: # wow!..
! 149: return 200
! 150:
! 151: def manage_takeBackup(self, obj=None):
! 152: #take a back of the syncable file in the backup_sync folder if not exists just create one.
! 153: if obj is None : return None
! 154: obj_id = obj.getId()
! 155: parent = obj.aq_parent
! 156: parent_contents = parent.objectIds()
! 157: bak_id = 'backup_sync' # backup folder name.
! 158: if bak_id not in parent_contents:parent.manage_addFolder(id=bak_id)
! 159: bak_folder = getattr(parent,bak_id)
! 160: if obj_id in bak_folder.objectIds(): bak_folder.manage_delObjects([obj_id])
! 161: bak_folder.manage_pasteObjects(parent.manage_copyObjects([obj_id]))
! 162:
! 163: #############################################################################
! 164: #Private Methods
! 165: #############################################################################
! 166:
! 167: def _log(self, msgs):
! 168: # log to ZSyncer
! 169: # this will become more configurable
! 170: file = open(self.logfile, 'a')
! 171:
! 172: # write out the log
! 173: file.write('%s\tSyncing started\n' % self._get_time())
! 174: for m in msgs: file.write('%s\t%s\n' % (self._get_time(), m))
! 175: file.write('%s\tSyncing finished\n' % self._get_time())
! 176:
! 177: file.close()
! 178:
! 179: def _get_time(self):
! 180: # get time for logging
! 181: # could be done using DateTime, but i think I want to fiddle this
! 182: return time.asctime(time.localtime(time.time()))
! 183:
! 184: def _encode(self, s):
! 185: # do any other encoding here
! 186: # eg twofish, zlib etc
! 187: # this will do me for now
! 188: return base64.encodestring(s)
! 189:
! 190: def _decode(self, s):
! 191: # do any other encoding here
! 192: return base64.decodestring(s)
! 193:
! 194: def _serverUser(self, url):
! 195: # extract user from server url, returns server, user, pw
! 196: if url.find('@'):
! 197: # user:password in URL
! 198: (us,ur) = url.split('@')
! 199: (prot,upw) = us.split('//')
! 200: (user,pw) = upw.split(':')
! 201: url = prot + '//' + ur
! 202: else:
! 203: u = getSecurityManager().getUser()
! 204: user = u.getId()
! 205: pw = u._getPassword()
! 206: return (url,user,pw)
! 207:
! 208: def _serverConn(self, url):
! 209: # connect using xmlrpc lib
! 210: (server,user,pw) = self._serverUser(url)
! 211: return xmlrpclibBasicAuth.Server(server, user, pw)
! 212:
! 213: def _check_http(self, v):
! 214: # so people can get away with leaving http:// off :)
! 215: if v[:7] != 'http://' and v[:8] != 'https://': v = 'http://%s' % v
! 216: if v[:5] != 'http:' and v[:6] != 'https:': v = 'http:%s' % v
! 217: return v
! 218:
! 219: def _msg(self, msgs, REQUEST=None):
! 220: # what to do with these messages
! 221: ms = []
! 222: for m in msgs:
! 223: # hack-o-rama, if i have a number, its a status code, so lets look it up and get a nicer message
! 224: if type(m) == type(1): ms.append(' - %s' % (error_messages.get(str(m), '<font color=red>Unknown error occured</font>')))
! 225: elif m[:6] == 'Object': ms.append('<li><font color=blue size=3>%s</font>' % m)
! 226: else: ms.append(m)
! 227:
! 228: if self.log or self.approval: self._log(ms)
! 229: if REQUEST is not None:
! 230: return REQUEST.RESPONSE.redirect(
! 231: 'manage_vsync?folder=%s&msg=%s' %
! 232: (
! 233: self.REQUEST.get('folder', '/'),
! 234: url_quote_plus(string.join(ms, '<br>'))
! 235: )
! 236: )
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>