Example #1
0
    def check_interval(self):
        from procfs_reader import path_owner
        from time import sleep

        crons = []
        
        for action in ('backup','archive'):
            for server in mc.list_servers_to_act(action, self.base_directory):
                crons.append( (action, server) )

        for action, server in crons:
            try:
                path_ = os.path.join(self.base_directory, mc.DEFAULT_PATHS['servers'], server)
                getattr(mc(server, path_owner(path_), self.base_directory), 'commit')()
            except Exception:
                pass
        else:
            sleep(len(crons) * mc.COMMIT_DELAY)

        for action, server in crons:
            try:
                path_ = os.path.join(self.base_directory, mc.DEFAULT_PATHS['servers'], server)
                getattr(mc(server, path_owner(path_), self.base_directory), action)()
                sleep(mc.COMMIT_DELAY)
            except Exception:
                pass
Example #2
0
    def list_servers_to_act(cls, action, base_directory):
        """Generator listing all servers doing action at this minute in time"""
        from procfs_reader import path_owner
        from ConfigParser import NoOptionError, NoSectionError
        
        hits = []
        msm = cls.minutes_since_midnight()

        if action == 'archive':
            section_option = ('crontabs', 'archive_interval')
        elif action == 'backup':
            section_option = ('crontabs', 'backup_interval')
        else:
            raise NotImplementedError("Requested action is not yet implemented.")

        for i in cls.list_servers(base_directory):
            path_ = os.path.join(base_directory, cls.DEFAULT_PATHS['servers'], i)
            owner_ = path_owner(path_)
            instance = cls(i, owner_, base_directory)

            try:
                interval = instance.server_config.getint(section_option[0],section_option[1])
                '''at midnight, always archive. this works because
                if archive_interval is not type(int), e.g., 'skip' or '',
                it'll except ValueError, skipping the test altogether'''
                if msm == 0:
                    hits.append(i)
                elif msm % interval == 0:
                    hits.append(i)
            except (ZeroDivisionError, KeyError, ValueError, NoOptionError, NoSectionError):
                pass

        return hits
Example #3
0
 def check_interval(self):
     from procfs_reader import path_owner
     
     for action in ('backup','archive'):
         for i in mc.list_servers_to_act(action, self.base_directory):
             path_ = os.path.join(self.base_directory, mc.DEFAULT_PATHS['servers'], i)
             getattr(mc(i, path_owner(path_), self.base_directory), action)()
Example #4
0
    def check_interval(self):
        from procfs_reader import path_owner

        for action in ('backup', 'archive'):
            for i in mc.list_servers_to_act(action, self.base_directory):
                path_ = os.path.join(self.base_directory,
                                     mc.DEFAULT_PATHS['servers'], i)
                getattr(mc(i, path_owner(path_), self.base_directory),
                        action)()
Example #5
0
 def list_servers_start_at_boot(cls, base_directory):
     hits = []
     for i in cls.list_servers(base_directory):
         try:
             path_ = os.path.join(base_directory,
                                  cls.DEFAULT_PATHS['servers'], i)
             owner_ = procfs_reader.path_owner(path_)
             instance = cls(i, owner_, base_directory)
             if instance.server_config.getboolean('onreboot', 'start'):
                 hits.append(i)
         except:
             pass
     return hits
Example #6
0
    def list_servers_start_at_boot(cls, base_directory):
        from procfs_reader import path_owner
        from ConfigParser import NoOptionError, NoSectionError
        
        hits = []
        msm = cls.minutes_since_midnight()

        for i in cls.list_servers(base_directory):
            path_ = os.path.join(base_directory, cls.DEFAULT_PATHS['servers'], i)
            owner_ = path_owner(path_)
            instance = cls(i, owner_, base_directory)

            try:
                if instance.server_config.getboolean('onreboot', 'start'):
                    hits.append(i)
            except (ValueError, KeyError, NoSectionError, NoOptionError):
                pass

        return hits
Example #7
0
    def list_servers_to_act(cls, action, base_directory):
        hits = []
        msm = cls.minutes_since_midnight()

        section_option = ('crontabs', '%s_interval' % action)

        for i in cls.list_servers(base_directory):
            try:
                path_ = os.path.join(base_directory,
                                     cls.DEFAULT_PATHS['servers'], i)
                owner_ = procfs_reader.path_owner(path_)
                instance = cls(i, owner_, base_directory)

                interval = instance.server_config.getint(
                    section_option[0], section_option[1])
                if msm == 0:
                    hits.append(i)
                elif msm % interval == 0:
                    hits.append(i)
            except:
                continue

        return hits
     from stock_profiles import STOCK_PROFILES
     profile = iter([i for i in STOCK_PROFILES if i['name'] == arguments[0]]).next()
     mc(**init_args).define_profile(profile)
 elif args.cmd == 'define_profile':
     from collections import OrderedDict
     profile = OrderedDict([(k,None) for k in ('name', 'type', 'url',
                                               'save_as', 'run_as','ignore')])
     for k,v in profile.iteritems():
         profile[k] = raw_input('%s: ' % k)
     
     mc(**init_args).define_profile(profile)
 elif args.cmd == 'start':
     from procfs_reader import path_owner
     for i in mc.list_servers_start_at_boot(args.base_directory):
         try:
             owner = path_owner(os.path.join(args.base_directory, mc.DEFAULT_PATHS['servers'], i))
             print 'starting %s...' % i,
             mc(i, owner, args.base_directory).start()
             print ' done'
         except Exception as ex:
             print ex.message
 elif args.cmd == 'stop':
     from procfs_reader import path_owner
     for i in mc.list_servers_up():
         if os.path.samefile(i.base_dir, args.base_directory):
             try:
                 srv_ = i.server_name
                 owner = path_owner(os.path.join(i.base_dir, mc.DEFAULT_PATHS['servers'], srv_))
                 print "sending '%s' to %s..." % (args.cmd, srv_),
                 instance = mc(srv_, owner, i.base_dir)._command_stuff(args.cmd)
                 print ' done'
Example #9
0
         text = '%s %s' % (args.cmd, ' '.join(arguments))
         instance._command_stuff(text)
         print(
             '{%s} sent to gameserver console [screen_pid:%s] successfully.'
             % (text, instance.screen_pid))
 else:
     init_args = {
         'server_name': 'throwaway',
         'owner': getuser(),
         'base_directory': args.base_directory
     }
     if args.cmd == 'start':
         for i in mc.list_servers_start_at_boot(args.base_directory):
             try:
                 owner = path_owner(
                     os.path.join(args.base_directory,
                                  mc.DEFAULT_PATHS['servers'], i))
                 print('starting %s...' % i, end=' ')
                 mc(i, owner, args.base_directory).start()
                 print(' done')
             except Exception as ex:
                 print(ex)
     elif args.cmd == 'stop':
         for i in mc.list_servers_up():
             try:
                 srv_ = i.server_name
                 owner = path_owner(
                     os.path.join(args.base_directory,
                                  mc.DEFAULT_PATHS['servers'], srv_))
                 print("sending '%s' to %s..." % (args.cmd, srv_), end=' ')
                 instance = mc(srv_, owner,
Example #10
0
    def check_interval(self):
        from procfs_reader import path_owner
        from time import sleep
        from subprocess import CalledProcessError

        crons = []

        for action in ('restart', 'backup', 'archive'):
            for server in mc.list_servers_to_act(action, self.base_directory):
                crons.append((action, server))

        for action in ('backups_keep', 'archives_keep'):
            for server in mc.list_servers_to_prune(action,
                                                   self.base_directory):
                crons.append((action, server))

        for server in set(s for a, s in crons):
            path_ = os.path.join(self.base_directory,
                                 mc.DEFAULT_PATHS['servers'], server)
            instance = mc(server, path_owner(path_), self.base_directory)

            cherrypy.log('[%s] commit' % server)
            try:
                instance._command_stuff('save-off')
                instance.commit()
            except RuntimeError:
                pass
            else:
                cherrypy.log(
                    '[%s] commit command received by process; sleeping %ssec' %
                    (server, self.commit_delay))
                sleep(self.commit_delay)

        for action, server in crons:
            path_ = os.path.join(self.base_directory,
                                 mc.DEFAULT_PATHS['servers'], server)
            instance = mc(server, path_owner(path_), self.base_directory)

            if action == 'restart':
                cherrypy.log('[%s] stop' % server)
                try:
                    instance._command_stuff('stop')
                except RuntimeError:
                    pass
                else:
                    cherrypy.log(
                        '[%s] stop command received by process; sleeping %ssec'
                        % (server, self.commit_delay))
                    sleep(self.commit_delay)
            elif action in ('backup', 'archive'):
                cherrypy.log('[%s] %s (Server Up: %s)' %
                             (server, action, instance.up))
                try:
                    getattr(instance, action)()
                except CalledProcessError as e:
                    cherrypy.log('[%s] %s exception: returncode %s' %
                                 (server, action, e.returncode))
                    cherrypy.log(e.output)
                except RuntimeError:
                    cherrypy.log(
                        '[%s] %s exception: server state changed since beginning of %s.'
                        % (server, action, action))
                    cherrypy.log('[%s] %s (Server Up: %s)' %
                                 (server, action, instance.up))
                    cherrypy.log(
                        'You may need to increase mineos.conf => server.commit_delay'
                    )
                else:
                    cherrypy.log(
                        '[%s] %s return code reports success; sleeping 3sec' %
                        (server, action))
                    sleep(3)
            elif action in ('backups_keep', 'archives_keep'):
                param = instance.server_config.getint('crontabs', action)
                cherrypy.log('[%s] %s %s (Server Up: %s)' %
                             (server, action, param, instance.up))
                try:
                    getattr(instance, action)(param)
                except CalledProcessError as e:
                    cherrypy.log('[%s] %s exception: returncode %s' %
                                 (server, action, e.returncode))
                    cherrypy.log(e.output)
                except RuntimeError:
                    cherrypy.log(
                        '[%s] %s exception: server state changed since beginning of %s.'
                        % (server, action, action))
                    cherrypy.log('[%s] %s (Server Up: %s)' %
                                 (server, action, instance.up))
                    cherrypy.log(
                        'You may need to increase mineos.conf => server.commit_delay'
                    )
                else:
                    cherrypy.log(
                        '[%s] %s return code reports success; sleeping 3sec' %
                        (server, action))
                    sleep(3)

        for action, server in crons:
            path_ = os.path.join(self.base_directory,
                                 mc.DEFAULT_PATHS['servers'], server)
            instance = mc(server, path_owner(path_), self.base_directory)

            if action == 'restart':
                if instance.up:
                    cherrypy.log('[%s] extra delay; sleeping %s seconds' %
                                 (server, self.commit_delay))
                    sleep(self.commit_delay)

                cherrypy.log('[%s] start' % server)
                try:
                    instance.start()
                except RuntimeError:
                    pass
                else:
                    cherrypy.log('[%s] started; sleeping %s seconds' %
                                 (server, self.commit_delay))
                    sleep(self.commit_delay)
Example #11
0
    def check_interval(self):
        from procfs_reader import path_owner
        from time import sleep
        from subprocess import CalledProcessError
        
        crons = []
        
        for action in ('restart','backup','archive'):
            for server in mc.list_servers_to_act(action, self.base_directory):
                crons.append( (action, server) )

        for server in set(s for a,s in crons):
            path_ = os.path.join(self.base_directory, mc.DEFAULT_PATHS['servers'], server)
            instance = mc(server, path_owner(path_), self.base_directory)

            cherrypy.log('[%s] commit' % server)
            try:
                instance._command_stuff('save-off')
                instance.commit()
            except RuntimeError:
                pass
            else:
                sleep(self.commit_delay)

        for action, server in crons:
            path_ = os.path.join(self.base_directory, mc.DEFAULT_PATHS['servers'], server)
            instance = mc(server, path_owner(path_), self.base_directory)

            if action == 'restart':
                cherrypy.log('[%s] stop' % server)
                try:
                    instance._command_stuff('stop')
                except RuntimeError:
                    pass
                else:
                    sleep(self.commit_delay)
            elif action in ('backup', 'archive'):
                cherrypy.log('[%s] %s' % (server, action))
                try:
                    getattr(instance, action)()
                except CalledProcessError as e:
                    cherrypy.log('[%s] %s exception: returncode %s' % (server, action, e.returncode))
                    cherrypy.log(e.output)
                else:
                    sleep(self.commit_delay)
                
        for action, server in crons:
            path_ = os.path.join(self.base_directory, mc.DEFAULT_PATHS['servers'], server)
            instance = mc(server, path_owner(path_), self.base_directory)
            
            if action == 'restart':
                if instance.up:
                    cherrypy.log('[%s] extra delay' % server)
                    sleep(self.commit_delay)

                cherrypy.log('[%s] start' % server)
                try:
                    instance.start()
                except RuntimeError:
                    pass
                else:
                    sleep(self.commit_delay)
Example #12
0
    def check_interval(self):
        from procfs_reader import path_owner
        from time import sleep
        from subprocess import CalledProcessError
        
        crons = []
        
        for action in ('restart','backup','archive'):
            for server in mc.list_servers_to_act(action, self.base_directory):
                crons.append( (action, server) )

        for server in set(s for a,s in crons):
            path_ = os.path.join(self.base_directory, mc.DEFAULT_PATHS['servers'], server)
            instance = mc(server, path_owner(path_), self.base_directory)

            cherrypy.log('[%s] commit' % server)
            try:
                instance._command_stuff('save-off')
                instance.commit()
            except RuntimeError:
                pass
            else:
                cherrypy.log('[%s] commit command received by process; sleeping %ssec' % (server, self.commit_delay))
                sleep(self.commit_delay)

        for action, server in crons:
            path_ = os.path.join(self.base_directory, mc.DEFAULT_PATHS['servers'], server)
            instance = mc(server, path_owner(path_), self.base_directory)

            if action == 'restart':
                cherrypy.log('[%s] stop' % server)
                try:
                    instance._command_stuff('stop')
                except RuntimeError:
                    pass
                else:
                    cherrypy.log('[%s] stop command received by process; sleeping %ssec' % (server, self.commit_delay))
                    sleep(self.commit_delay)
            elif action in ('backup', 'archive'):
                cherrypy.log('[%s] %s (Server Up: %s)' % (server, action, instance.up))
                try:
                    getattr(instance, action)()
                except CalledProcessError as e:
                    cherrypy.log('[%s] %s exception: returncode %s' % (server, action, e.returncode))
                    cherrypy.log(e.output)
                except RuntimeError:
                    cherrypy.log('[%s] %s exception: server state changed since beginning of %s.' % (server, action, action))
                    cherrypy.log('[%s] %s (Server Up: %s)' % (server, action, instance.up))
                    cherrypy.log('You may need to increase mineos.conf => server.commit_delay')
                else:
                    cherrypy.log('[%s] %s return code reports success; sleeping 3sec' % (server, action))
                    sleep(3)
                
        for action, server in crons:
            path_ = os.path.join(self.base_directory, mc.DEFAULT_PATHS['servers'], server)
            instance = mc(server, path_owner(path_), self.base_directory)
            
            if action == 'restart':
                if instance.up:
                    cherrypy.log('[%s] extra delay; sleeping %s seconds' % (server, self.commit_delay))
                    sleep(self.commit_delay)

                cherrypy.log('[%s] start' % server)
                try:
                    instance.start()
                except RuntimeError:
                    pass
                else:
                    cherrypy.log('[%s] started; sleeping %s seconds' % (server, self.commit_delay))
                    sleep(self.commit_delay)
Example #13
0
    def check_interval(self):
        from procfs_reader import path_owner
        from time import sleep
        from subprocess import CalledProcessError
        
        crons = []
        
        for action in ('restart','backup','archive'):
            for server in mc.list_servers_to_act(action, self.base_directory):
                crons.append( (action, server) )

        for server in set(s for a,s in crons):
            path_ = os.path.join(self.base_directory, mc.DEFAULT_PATHS['servers'], server)
            instance = mc(server, path_owner(path_), self.base_directory)

            cherrypy.log('[%s] commit' % server)
            try:
                instance._command_stuff('save-off')
                instance.commit()
            except RuntimeError:
                pass
            else:
                sleep(self.commit_delay)

        for action, server in crons:
            path_ = os.path.join(self.base_directory, mc.DEFAULT_PATHS['servers'], server)
            instance = mc(server, path_owner(path_), self.base_directory)

            if action == 'restart':
                cherrypy.log('[%s] stop' % server)
                try:
                    instance._command_stuff('stop')
                except RuntimeError:
                    pass
                else:
                    sleep(self.commit_delay)
            elif action in ('backup', 'archive'):
                cherrypy.log('[%s] %s' % (server, action))
                try:
                    getattr(instance, action)()
                except CalledProcessError as e:
                    cherrypy.log('[%s] %s exception: returncode %s' % (server, action, e.returncode))
                    cherrypy.log(e.output)
                else:
                    sleep(self.commit_delay)
                
        for action, server in crons:
            path_ = os.path.join(self.base_directory, mc.DEFAULT_PATHS['servers'], server)
            instance = mc(server, path_owner(path_), self.base_directory)
            
            if action == 'restart':
                if instance.up:
                    cherrypy.log('[%s] extra delay' % server)
                    sleep(self.commit_delay)

                cherrypy.log('[%s] start' % server)
                try:
                    instance.start()
                except RuntimeError:
                    pass
                else:
                    sleep(self.commit_delay)