def update(parser, options, target): confirm = options.confirm # Check the server is not started, or started in read-only mode pid = get_pid('%s/pid' % target) if pid is not None: print 'Cannot proceed, the server is running in read-write mode.' return # Check for database consistency if options.quick is False and check_database(target) is False: return 1 # Load the modules config = get_config(target) load_modules(config) ####################################################################### # STAGE 1: Find out the versions to upgrade ####################################################################### server = Server(target) database = server.database # Build a fake context context = get_fake_context(database) context.server = server context.init_context() # Local variables root = server.root print 'STAGE 1: Find out the versions to upgrade (may take a while).' version, paths = find_versions_to_update(root, options.force) while version: message = 'STAGE 1: Upgrade %d resources to version %s (y/N)? ' message = message % (len(paths), version) if ask_confirmation(message, confirm) is False: abort() update_versions(target, database, version, paths, root, options.force) # Reset the state database.cache.clear() database.cache[root.metadata.key] = root.metadata print 'STAGE 1: Finish upgrading to version %s' % version version, paths = find_versions_to_update(root, options.force) print 'STAGE 1: Done.' # It is Done print '*' print '* To finish the upgrade process update the catalog:' print '*' print '* $ icms-update-catalog.py %s' % target print '*'
def update(parser, options, target): confirm = options.confirm # Check the server is not started, or started in read-only mode pid = get_pid("%s/pid" % target) if pid is not None: print "Cannot proceed, the server is running in read-write mode." return # Check for database consistency if options.quick is False and check_database(target) is False: return 1 # Load the modules config = get_config(target) load_modules(config) ####################################################################### # STAGE 1: Find out the versions to upgrade ####################################################################### server = Server(target) database = server.database # Build a fake context context = get_fake_context(database) context.server = server context.init_context() # Local variables root = server.root print "STAGE 1: Find out the versions to upgrade (may take a while)." version, paths = find_versions_to_update(root, options.force) while version: message = "STAGE 1: Upgrade %d resources to version %s (y/N)? " message = message % (len(paths), version) if ask_confirmation(message, confirm) is False: abort() update_versions(target, database, version, paths, root, options.force) # Reset the state database.cache.clear() database.cache[root.metadata.key] = root.metadata print "STAGE 1: Finish upgrading to version %s" % version version, paths = find_versions_to_update(root, options.force) print "STAGE 1: Done." # It is Done print "*" print "* To finish the upgrade process update the catalog:" print "*" print "* $ icms-update-catalog.py %s" % target print "*"
def update_catalog(parser, options, target): # Check the server is not started, or started in read-only mode server = Server(target, read_only=True, cache_size=options.cache_size) if server.is_running_in_rw_mode(): print 'Cannot proceed, the server is running in read-write mode.' return # Check for database consistency if options.quick is False and check_database(target) is False: return 1 # Ask message = 'Update the catalog (y/N)? ' if ask_confirmation(message, options.confirm) is False: return # Create a temporary new catalog catalog_path = '%s/catalog.new' % target if lfs.exists(catalog_path): lfs.remove(catalog_path) catalog = make_catalog(catalog_path, get_register_fields()) # Get the root root = server.root # Build a fake context context = get_fake_context(server.database) context.server = server # Update t0, v0 = time(), vmsize() doc_n = 0 error_detected = False if options.test: log = open('%s/log/update-catalog' % target, 'w').write for obj in root.traverse_resources(): if not isinstance(obj, Resource): continue if not options.quiet: print doc_n, obj.abspath doc_n += 1 context.resource = obj # Index the document try: catalog.index_document(obj) except Exception: if options.test: error_detected = True log('*** Error detected ***\n') log('Abspath of the resource: %r\n\n' % str(obj.abspath)) log(format_exc()) log('\n') else: raise # Free Memory del obj server.database.make_room() if not error_detected: if options.test: # Delete the empty log file remove('%s/log/update-catalog' % target) # Update / Report t1, v1 = time(), vmsize() v = (v1 - v0)/1024 print '[Update] Time: %.02f seconds. Memory: %s Kb' % (t1 - t0, v) # Commit print '[Commit]', sys.stdout.flush() catalog.save_changes() # Commit / Replace old_catalog_path = '%s/catalog' % target if lfs.exists(old_catalog_path): lfs.remove(old_catalog_path) lfs.move(catalog_path, old_catalog_path) # Commit / Report t2, v2 = time(), vmsize() v = (v2 - v1)/1024 print 'Time: %.02f seconds. Memory: %s Kb' % (t2 - t1, v) else: print '[Update] Error(s) detected, the new catalog was NOT saved' print ('[Update] You can find more infos in %r' % join(target, 'log/update-catalog'))
def update(parser, options, target): confirm = options.confirm # Check the server is not started, or started in read-only mode pid = get_pid('%s/pid' % target) if pid is not None: print 'Cannot proceed, the server is running in read-write mode.' return # Check for database consistency if options.quick is False and check_database(target) is False: return 1 # Load the modules config = get_config(target) load_modules(config) ####################################################################### # STAGE 0: Set mtime/author # XXX Specific to the migration from 0.61 to 0.62 ####################################################################### server = Server(target) database = server.database # Build a fake context context = get_fake_context(database) context.server = server context.init_context() # Local variables root = server.root mtime = root.get_value('mtime') if mtime is None or options.mtime: message = 'STAGE 0: Set mtime and author in the metadata (y/N)? ' if ask_confirmation(message, confirm) is False: abort() # Find out set of valid usernames usernames = root.get_names('users') usernames = set(usernames) print 'STAGE 0: Initializing mtime/author' # Load cache git_cache = {} for commit in database.worktree.git_log(include_files=True): if commit['author_name'] not in usernames: commit['author_name'] = None for path in commit['paths']: if path not in git_cache or not git_cache[path]['author_name']: git_cache[path] = commit # Set mtime/author for resource in root.traverse_resources(): if not isinstance(resource, DBResource): continue files = resource.get_files_to_archive() last_commit = None for file in files: commit = git_cache.get(file) if not commit: continue if not last_commit or commit['author_date'] > last_commit['author_date']: last_commit = commit metadata = resource.metadata metadata.set_property('mtime', last_commit['author_date']) metadata.set_property('last_author', last_commit['author_name']) # Commit context.git_message = u'Upgrade: set mtime/author' context.set_mtime = False # Do not override the mtime/author database.save_changes() ####################################################################### # STAGE 1: Find out the versions to upgrade ####################################################################### print 'STAGE 1: Find out the versions to upgrade (may take a while).' version, paths = find_versions_to_update(root, options.force) while version: message = 'STAGE 1: Upgrade %d resources to version %s (y/N)? ' message = message % (len(paths), version) if ask_confirmation(message, confirm) is False: abort() update_versions(target, database, version, paths, root, options.force) # Reset the state database.cache.clear() database.cache[root.metadata.key] = root.metadata print 'STAGE 1: Finish upgrading to version %s' % version version, paths = find_versions_to_update(root, options.force) print 'STAGE 1: Done.' # It is Done print '*' print '* To finish the upgrade process update the catalog:' print '*' print '* $ icms-update-catalog.py %s' % target print '*'
def init(parser, options, target): # Get the email address for the init user if options.email is None: sys.stdout.write("Type your email address: ") email = sys.stdin.readline().strip() else: email = options.email # Get the password if options.password is None: password = generate_password() else: password = options.password # Load the root class if options.root is None: root_class = Root modules = [] else: modules = [options.root] exec('import %s' % options.root) exec('root_class = %s.Root' % options.root) # Load the modules for module in options.modules.split(): modules.append(module) exec('import %s' % module) # Make folder try: mkdir(target) except OSError: parser.error('can not create the instance (check permissions)') # The configuration file config = template.format( modules=" ".join(modules), listen_port=getattr(options, 'port') or '8080', smtp_host=getattr(options, 'smtp_host') or 'localhost', smtp_from=email, log_email=getattr(options, 'log_email')) open('%s/config.conf' % target, 'w').write(config) # Create the folder structure database = make_database(target) mkdir('%s/log' % target) mkdir('%s/spool' % target) # Create a fake context context = get_fake_context(database) context.set_mtime = True # Make the root metadata = Metadata(cls=root_class) database.set_handler('.metadata', metadata) root = root_class(metadata) root.init_resource(email, password) # Set mtime root.set_property('mtime', context.timestamp) context.root = root # Save changes context.git_message = 'Initial commit' database.save_changes() # Index the root catalog = database.catalog catalog.save_changes() # Bravo! print '*' print '* Welcome to ikaaro' print '* A user with administration rights has been created for you:' print '* username: %s' % email print '* password: %s' % password print '*' print '* To start the new instance type:' print '* icms-start.py %s' % target print '*'
def update_catalog(parser, options, target): # Check the server is not started, or started in read-only mode server = Server(target, read_only=True, cache_size=options.cache_size) if server.is_running_in_rw_mode(): print 'Cannot proceed, the server is running in read-write mode.' return # Check for database consistency if options.quick is False and check_database(target) is False: return 1 # Ask message = 'Update the catalog (y/N)? ' if ask_confirmation(message, options.confirm) is False: return # Create a temporary new catalog catalog_path = '%s/catalog.new' % target if lfs.exists(catalog_path): lfs.remove(catalog_path) catalog = make_catalog(catalog_path, get_register_fields()) # Get the root root = server.root # Build a fake context context = get_fake_context(server.database) context.server = server # Update t0, v0 = time(), vmsize() doc_n = 0 error_detected = False if options.test: log = open('%s/log/update-catalog' % target, 'w').write for obj in root.traverse_resources(): if not isinstance(obj, Resource): continue if not options.quiet: print doc_n, obj.abspath doc_n += 1 context.resource = obj # Index the document try: catalog.index_document(obj) except Exception: if options.test: error_detected = True log('*** Error detected ***\n') log('Abspath of the resource: %r\n\n' % str(obj.abspath)) log(format_exc()) log('\n') else: raise # Free Memory del obj server.database.make_room() if not error_detected: if options.test: # Delete the empty log file remove('%s/log/update-catalog' % target) # Update / Report t1, v1 = time(), vmsize() v = (v1 - v0) / 1024 print '[Update] Time: %.02f seconds. Memory: %s Kb' % (t1 - t0, v) # Commit print '[Commit]', sys.stdout.flush() catalog.save_changes() # Commit / Replace old_catalog_path = '%s/catalog' % target if lfs.exists(old_catalog_path): lfs.remove(old_catalog_path) lfs.move(catalog_path, old_catalog_path) # Commit / Report t2, v2 = time(), vmsize() v = (v2 - v1) / 1024 print 'Time: %.02f seconds. Memory: %s Kb' % (t2 - t1, v) else: print '[Update] Error(s) detected, the new catalog was NOT saved' print('[Update] You can find more infos in %r' % join(target, 'log/update-catalog'))