Assembla home | Assembla project page
 

Changeset 1768

Show
Ignore:
Timestamp:
11/13/08 22:29:28 (1 year ago)
Author:
shypike
Message:

Implement full on-the-fly adding, deleting and modifying of servers, without requiring a warm restart.
Add enable bit to all servers.
Implement schedules enabling and disabling of servers.

Closes #11 for trunk.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/main/interfaces/Default/templates/config_scheduling.tmpl

    r1734 r1768  
    4444<br>Action:<br>  
    4545<select name="action"> 
    46 <option value="resume">resume 
    47 <option value="pause">pause 
    48 <option value="shutdown">shutdown 
    49 <option value="speedlimit">speedlimit 
     46<!--#for $action in $actions#--> 
     47    <option value="$action">$action 
     48<!--#end for#--> 
    5049</select> 
    5150<br>Arguments:<br>  
  • trunk/main/interfaces/Default/templates/config_server.tmpl

    r1641 r1768  
    1818      Timeout:<br><input type="text" size="25" name="timeout" value="120"><br> 
    1919      Connections:<br><input type="text" size="25" name="connections"><br> 
    20       SSL<!--#if int($have_ssl) == 0 then "(disabled)" else ""#-->:<br> 
    21                      <input type="checkbox" name="ssl" value="1" <!--#if int($have_ssl) == 0 then "disabled" else ""#-->> 
    22                  <br> 
    23       Backup server:<br> 
    24                      <input type="checkbox" name="fillserver" value="1"> 
    25                  <br> 
     20      <!--#if int($have_ssl) == 0#--> 
     21         SSL (disabled) 
     22      <!--#else#--> 
     23        <input type="checkbox" name="ssl" value="1" <!--#if int($have_ssl) == 0 then "disabled" else ""#-->>&nbsp;SSL<br/> 
     24      <!--#end if#--> 
     25      <input type="checkbox" name="fillserver" value="1">&nbsp;Backup server<br> 
     26      <input type="checkbox" name="enable" value="1" checked=1>&nbsp;Enable<br> 
    2627      <p><input type="submit" value="Add Server"></p> 
    2728    </fieldset> 
     
    3940      Timeout:<br><input type="text" size="25" name="timeout" value="$servers[$server]['timeout']"><br> 
    4041      Connections:<br><input type="text" size="25" name="connections" value="$servers[$server]['connections']"><br> 
    41       SSL<!--#if int($have_ssl) == 0 then "(disabled)" else ""#-->:<br> 
    42                      <input type="checkbox" name="ssl" value="1" <!--#if int($servers[$server]['ssl']) != 0 and int($have_ssl) == 1 then "checked=1" else ""#--> <!--#if int($have_ssl) == 0 then "disabled" else ""#--> /> 
    43                  <br> 
    44       Backup server:<br> 
    45                      <input type="checkbox" name="fillserver" value="1" <!--#if int($servers[$server]['fillserver']) != 0 then "checked=1" else ""#--> /> 
    46                  <br> 
     42      <!--#if int($have_ssl) == 0#--> 
     43         SSL (disabled) 
     44      <!--#else#--> 
     45         <input type="checkbox" name="ssl" value="1" <!--#if int($servers[$server]['ssl']) != 0 then "checked=1" else ""#-->/>&nbsp;SSL<br/> 
     46      <!--#end if#--> 
     47      <input type="checkbox" name="fillserver" value="1" <!--#if int($servers[$server]['fillserver']) != 0 then "checked=1" else ""#--> />&nbsp;Backup server<br/> 
     48      <input type="checkbox" name="enable" value="1" <!--#if int($servers[$server]['enable']) != 0 then "checked=1" else ""#--> />&nbsp;Enable<br/> 
    4749      <input type="hidden" name="server" value="$server"> 
    4850      <p><input type="submit" value="Save Changes"></p> 
  • trunk/main/interfaces/Plush/templates/config_scheduling.tmpl

    r1734 r1768  
    5050                                        </td><td> 
    5151                                                <select name="action"> 
    52                                                         <option value="resume">Resume</option> 
    53                                                         <option value="pause">Pause</option> 
    54                                                         <option value="shutdown">Shutdown SAB</option> 
    55                                                         <option value="speedlimit">Speed Limit</option> 
     52                            <!--#for $action in $actions#--> 
     53                                <option value="$action">$action 
     54                            <!--#end for#--> 
    5655                                                </select> 
    5756                                        </td></tr> 
  • trunk/main/interfaces/Plush/templates/config_server.tmpl

    r1641 r1768  
    2828                                <tr><td align=right><div class="sucker">Backup&nbsp;Server?</div></td><td> 
    2929                                        <input type="checkbox" name="fillserver" value="1"/> 
     30                                </td></tr> 
     31                                <tr><td align=right><div class="sucker">Enable?</div></td><td> 
     32                                        <input type="checkbox" name="enable" value="1"/> 
    3033                                </td></tr> 
    3134                                 
     
    7982                                        </td> 
    8083                                </tr> 
     84                                <tr> 
     85                                        <td align=right><div class="sucker">Enable?</div></td> 
     86                                        <td> 
     87                                                <input type="checkbox" name="enable" value="1" <!--#if int($servers[$server]['enable']) != 0 then "checked=1" else ""#--> /> 
     88                                        </td> 
     89                                </tr> 
    8190                                </table> 
    8291                                 
  • trunk/main/interfaces/iphone/templates/config_scheduling.tmpl

    r924 r1768  
    5050    <label>Action:</label><br/><br/> 
    5151    <select name="action"> 
    52     <option value="resume">resume 
    53     <option value="pause">pause 
    54     <option value="shutdown">shutdown 
    55     <option value="speedlimit">speedlimit 
     52        <!--#for $action in $actions#--> 
     53                <option value="$action">$action 
     54        <!--#end for#--> 
    5655    </select> 
    5756</div> 
  • trunk/main/interfaces/iphone/templates/config_server.tmpl

    r1641 r1768  
    5454            <input type="hidden" id="$server" name="fillserver" value="<!--#if int($servers[$server]['fillserver']) != 0 then '1' else '0'#-->"> 
    5555            <div class="toggle" onclick="toggleValue('$server')" <!--#if int($servers[$server]['fillserver']) != 0 then 'toggled="true"' else ''#-->><span class="thumb"></span><span class="toggleOn">Yes</span><span class="toggleOff">No</span></div> 
     56        </div> 
     57 
     58        <div class="row"> 
     59 
     60                        <label>Enable:</label><br/><br/> 
     61            <input type="hidden" id="$server" name="enable" value="<!--#if int($servers[$server]['enable']) != 0 then '1' else '0'#-->"> 
     62            <div class="toggle" onclick="toggleValue('$server')" <!--#if int($servers[$server]['enable']) != 0 then 'toggled="true"' else ''#-->><span class="thumb"></span><span class="toggleOn">Yes</span><span class="toggleOff">No</span></div> 
    5663                <input type="hidden" name="server" value="$server"> 
    5764        </div> 
  • trunk/main/interfaces/prototype/templates/config_scheduling.tmpl

    r1734 r1768  
    4141<label class="label">Action:</label> 
    4242<select name="action"> 
    43 <option value="resume">resume 
    44 <option value="pause">pause 
    45 <option value="shutdown">shutdown 
    46 <option value="speedlimit">speedlimit 
     43<!--#for $action in $actions#--> 
     44    <option value="$action">$action 
     45<!--#end for#--> 
    4746</select> 
    4847<br class="clear" /> 
  • trunk/main/interfaces/prototype/templates/config_server.tmpl

    r1641 r1768  
    3131            <label><span class="label">Backup Server:</span> 
    3232                        <input class="radio" type="checkbox" name="fillserver" value="1" <!--#if int($servers[$server]['fillserver']) != 0 then "checked=1" else ""#--> /></label> 
     33            </label><br class="clear" /> 
     34 
     35            <label><span class="label">Enable:</span> 
     36                        <input class="radio" type="checkbox" name="enable" value="1" <!--#if int($servers[$server]['enable']) != 0 then "checked=1" else ""#--> /></label> 
    3337                <input type="hidden" name="server" value="$server"><br class="clear" /> 
    3438 
     
    7478                                <input class="radio" type="checkbox" name="fillserver" value="1"></label> 
    7579                <br class="clear" /> 
     80         
     81                        <label><span class="label">Enable:</span> 
     82                                <input class="radio" type="checkbox" name="enable" value="1"></label> 
     83                <br class="clear" /> 
    7684 
    7785      <p><input type="button" class="submitindent" size="40" value="Add Server" onclick="javascript:submitconfig('config/server/addServer', 'submitstatus3','addserver','config/server','0')"> 
  • trunk/main/interfaces/smpl/templates/config_scheduling.tmpl

    r1734 r1768  
    4141<label class="label">Action:</label> 
    4242<select name="action"> 
    43 <option value="resume">resume 
    44 <option value="pause">pause 
    45 <option value="shutdown">shutdown 
    46 <option value="speedlimit">speedlimit 
     43<!--#for $action in $actions#--> 
     44    <option value="$action">$action 
     45<!--#end for#--> 
    4746</select> 
    4847<br class="clear" /> 
  • trunk/main/interfaces/smpl/templates/config_server.tmpl

    r1641 r1768  
    3232            <label><span class="label">Backup Server:</span> 
    3333                        <input class="radio" type="checkbox" name="fillserver" value="1" <!--#if int($servers[$server]['fillserver']) != 0 then "checked=1" else ""#--> /></label> 
     34            </label><br class="clear" /> 
     35 
     36            <label><span class="label">Enable:</span> 
     37                        <input class="radio" type="checkbox" name="enable" value="1" <!--#if int($servers[$server]['enable']) != 0 then "checked=1" else ""#--> /></label> 
    3438                <input type="hidden" name="server" value="$server"><br class="clear" /> 
    3539 
     
    7781                <br class="clear" /> 
    7882 
     83                        <label><span class="label">Enable:</span> 
     84                                <input class="radio" type="checkbox" name="enable" value="1"></label> 
     85                <br class="clear" /> 
     86 
    7987      <p><input type="button" class="submitindent" size="40" value="Add Server" onclick="javascript:submitconfig('config/server/addServer', 'submitstatus3','addserver','config/server','0')"> 
    8088<span class="submitstatus" id="submitstatus3"></span></p> 
  • trunk/main/sabnzbd/__init__.py

    r1760 r1768  
    5050from sabnzbd.misc import DirScanner, real_path, \ 
    5151                         create_real_path, check_latest_version, from_units, SameFile, decodePassword, \ 
    52                          ProcessArchiveFile, ProcessSingleFile 
     52                         ProcessArchiveFile, ProcessSingleFile, save_configfile 
    5353from sabnzbd.urlgrabber import URLGrabber 
    5454from sabnzbd.nzbstuff import NzbObject 
     
    576576 
    577577    if DOWNLOADER: 
    578         DOWNLOADER.__init__(CFG['servers'], DOWNLOADER.paused) 
     578        DOWNLOADER.__init__(DOWNLOADER.paused) 
    579579    else: 
    580         DOWNLOADER = Downloader(CFG['servers']
     580        DOWNLOADER = Downloader(
    581581        if pause_downloader: 
    582582            DOWNLOADER.paused = True 
     
    595595 
    596596    if evalSched: 
    597         p, s = scheduler.analyse() 
    598         if not pause_downloader: 
    599             DOWNLOADER.paused = p 
    600         if s: 
    601             DOWNLOADER.limit_speed(s) 
    602             BANDWITH_LIMIT = s 
     597        scheduler.analyse(pause_downloader) 
    603598 
    604599    logging.info('All processes started') 
     
    11291124## Unsynchronized methods                                                     ## 
    11301125################################################################################ 
     1126def enable_server(server): 
     1127    """ Enable server """ 
     1128    try: 
     1129        CFG['servers'][server]['enable'] = 1 
     1130    except: 
     1131        logging.warning('[%s] Trying to set status of non-existing server %s', __NAME__, server) 
     1132        return 
     1133    save_configfile(CFG) 
     1134    update_server(server, server) 
     1135 
     1136def disable_server(server): 
     1137    """ Disable server """ 
     1138    try: 
     1139        CFG['servers'][server]['enable'] = 0 
     1140    except: 
     1141        logging.warning('[%s] Trying to set status of non-existing server %s', __NAME__, server) 
     1142        return 
     1143    save_configfile(CFG) 
     1144    update_server(server, server) 
     1145 
    11311146def change_web_dir(web_dir): 
    11321147    LOGIN_PAGE.change_web_dir(web_dir) 
     
    11821197    try: 
    11831198        DOWNLOADER.disconnect() 
     1199    except: 
     1200        logging.exception("[%s] Error accessing DOWNLOADER?", __NAME__) 
     1201 
     1202def update_server(oldserver, newserver): 
     1203    global DOWNLOADER, CV 
     1204    try: 
     1205        CV.acquire() 
     1206        try: 
     1207            DOWNLOADER.init_server(oldserver, newserver) 
     1208        finally: 
     1209            CV.notifyAll() 
     1210            CV.release() 
    11841211    except: 
    11851212        logging.exception("[%s] Error accessing DOWNLOADER?", __NAME__) 
  • trunk/main/sabnzbd/downloader.py

    r1746 r1768  
    5858 
    5959class Server: 
    60     def __init__(self, host, port, timeout, threads, fillserver, ssl, username = None, 
     60    def __init__(self, id, host, port, timeout, threads, fillserver, ssl, username = None, 
    6161                 password = None): 
     62        self.id = id 
     63        self.newid = None 
     64        self.restart = False 
    6265        self.host = host 
    6366        self.port = port 
     
    6972        self.username = username 
    7073        self.password = password 
    71  
     74         
    7275        self.busy_threads = [] 
    7376        self.idle_threads = [] 
     
    7578        for i in range(threads): 
    7679            self.idle_threads.append(NewsWrapper(self, i+1)) 
     80 
     81    def stop(self, readers, writers): 
     82        for nw in self.idle_threads: 
     83            try: 
     84                fno = nw.nntp.sock.fileno() 
     85            except: 
     86                fno = None 
     87            if fno and fno in readers: 
     88                readers.pop(fno) 
     89            if fno and fno in writers: 
     90                writers.pop(fno) 
     91            nw.terminate() 
     92        self.idle_threads = [] 
    7793 
    7894    def __repr__(self): 
     
    129145 
    130146class Downloader(Thread): 
    131     def __init__(self, servers, paused = False): 
     147    def __init__(self, paused = False): 
    132148        Thread.__init__(self) 
     149 
     150        logging.debug("[%s] Initializing downloader/decoder", __NAME__) 
    133151 
    134152        # Used for scheduled pausing 
     
    144162 
    145163        self.shutdown = False 
     164        self.__restart = 0 
    146165 
    147166        self.force_disconnect = False 
     
    152171        self.servers = [] 
    153172 
     173        servers = sabnzbd.CFG['servers'] 
     174 
    154175        primary = False 
    155176        for server in servers: 
    156             srv = servers[server] 
    157             enabled = True #bool(GetParmInt(srv, 'enable', 1)) 
     177            if self.init_server(None, server): 
     178                primary = True 
     179 
     180        if not primary: 
     181            logging.warning('[%s] No active primary servers defined, will not download!', __NAME__) 
     182 
     183        self.decoder = Decoder(self.servers) 
     184 
     185 
     186    def init_server(self, oldserver, newserver): 
     187        """ Setup or re-setup single server 
     188            When oldserver is defined and in use, delay startup. 
     189            Return True when newserver is primary 
     190        """ 
     191 
     192        primary = False 
     193        create = False 
     194 
     195        servers = sabnzbd.CFG['servers'] 
     196        if newserver in servers: 
     197            srv = servers[newserver] 
     198            enabled = bool(GetParmInt(srv, 'enable', 1)) 
    158199            host = GetParm(srv, 'host') 
    159200            port = GetParmInt(srv, 'port', 119) 
     
    165206            fillserver = bool(GetParmInt(srv, 'fillserver', 0)) 
    166207            primary = primary or (enabled and (not fillserver) and (threads > 0)) 
    167             ssl = bool(GetParmInt(srv, 'ssl', 0)) 
     208            ssl = bool(GetParmInt(srv, 'ssl', 0)) and sabnzbd.newswrapper.HAVE_SSL 
    168209            username = GetParm(srv, 'username') 
    169210            password = decodePassword(GetParm(srv, 'password'), 'server') 
    170  
    171             if enabled and host and port and threads: 
    172                 self.servers.append(Server(host, port, timeout, threads, fillserver, ssl, 
    173                                            username, password)) 
    174  
    175         if (not primary): 
    176             logging.warning('[%s] No active primary servers defined, will not download!', __NAME__) 
    177  
    178         self.servers = tuple(self.servers) 
    179  
    180         self.decoder = Decoder(self.servers) 
     211            create = True 
     212 
     213        if oldserver: 
     214            for n in xrange(len(self.servers)): 
     215                if self.servers[n].id == oldserver: 
     216                    # Server exists, do re-init later 
     217                    create = False 
     218                    self.servers[n].newid = newserver 
     219                    self.servers[n].restart = True 
     220                    self.__restart += 1 
     221                    break 
     222 
     223        if create and enabled and host and port and threads: 
     224            self.servers.append(Server(newserver, host, port, timeout, threads, fillserver, ssl, 
     225                                            username, password)) 
     226                 
     227        return primary 
     228 
    181229 
    182230    def stop(self): 
     
    225273                        self.__reset_nw(nw, "timed out") 
    226274 
    227                 if not server.idle_threads or self.paused or self.shutdown or self.delayed or self.postproc: 
     275                if server.restart: 
     276                    if not server.busy_threads: 
     277                        newid = server.newid 
     278                        server.stop(self.read_fds, self.write_fds) 
     279                        self.servers.remove(server) 
     280                        if newid: 
     281                            self.init_server(None, newid) 
     282                        self.__restart -= 1 
     283                        # Have to leave this loop, because we removed element 
     284                        break 
     285                    else: 
     286                        # Restart pending, don't add new articles 
     287                        continue 
     288 
     289                if not server.idle_threads or server.restart or self.paused or self.shutdown or self.delayed or self.postproc: 
    228290                    continue 
    229291 
     
    282344 
    283345                    for server in self.servers: 
    284                         for nw in server.idle_threads: 
    285                             nw.hard_reset(wait=False) 
     346                        server.stop(self.read_fds, self.write_fds) 
    286347 
    287348                    logging.info("[%s] Shutting down", __NAME__) 
     
    313374                sabnzbd.CV.acquire() 
    314375                while (not sabnzbd.has_articles() or self.paused or self.delayed or self.postproc) and not \ 
    315                        self.shutdown
     376                       self.shutdown and not self.__restart
    316377                    sabnzbd.CV.wait() 
    317378                sabnzbd.CV.release() 
  • trunk/main/sabnzbd/interface.py

    r1764 r1768  
    14121412            new[svr]['fillserver'] = org[svr]['fillserver'] 
    14131413            new[svr]['ssl'] = org[svr]['ssl'] 
     1414            new[svr]['enable'] = org[svr]['enable'] 
    14141415        config['servers'] = new 
    14151416 
     
    14271428    @cherrypy.expose 
    14281429    def addServer(self, server = None, host = None, port = None, timeout = None, username = None, 
    1429                   password = None, connections = None, ssl = None, fillserver = None, _dc = None): 
     1430                  password = None, connections = None, ssl = None, fillserver = None, enable=None, _dc = None): 
    14301431 
    14311432        timeout = check_timeout(timeout) 
     
    14411442        if not ssl: 
    14421443            ssl = '0' 
     1444        if enable == None: 
     1445            enable = '1' 
    14431446        if host and port and port.isdigit() \ 
    14441447           and connections.isdigit() and fillserver.isdigit() \ 
     
    14651468                sabnzbd.CFG['servers'][server]['fillserver'] = fillserver 
    14661469                sabnzbd.CFG['servers'][server]['ssl'] = ssl 
    1467         return saveAndRestart(self.__root, _dc) 
     1470                sabnzbd.CFG['servers'][server]['enable'] = enable 
     1471 
     1472        save_configfile(sabnzbd.CFG) 
     1473        sabnzbd.update_server(None, server) 
     1474        raise Raiser(self.__root, _dc=_dc) 
     1475 
    14681476 
    14691477    @cherrypy.expose 
    14701478    def saveServer(self, server = None, host = None, port = None, username = None, timeout = None, 
    1471                    password = None, connections = None, fillserver = None, ssl = None, _dc = None): 
     1479                   password = None, connections = None, fillserver = None, ssl = None, enable=None, _dc = None): 
    14721480 
    14731481        timeout = check_timeout(timeout) 
    14741482 
    1475         server = Strip(server) 
     1483        oldserver = Strip(server) 
    14761484        port = Strip(port) 
    14771485 
     
    14841492        if not fillserver: 
    14851493            fillserver = '0' 
     1494        if not enable: 
     1495            enable = '0' 
    14861496        if host and port and port.isdigit() \ 
    14871497           and connections.isdigit() and fillserver and fillserver.isdigit() \ 
     
    14921502 
    14931503            if password and not password.strip('*'): 
    1494                 password = sabnzbd.CFG['servers'][server]['password'] 
    1495  
    1496             del sabnzbd.CFG['servers'][server] 
     1504                password = sabnzbd.CFG['servers'][oldserver]['password'] 
     1505 
     1506            del sabnzbd.CFG['servers'][oldserver] 
    14971507 
    14981508            # Allow IPV6 numerical addresses, '[]' is not compatible with 
     
    15121522            sabnzbd.CFG['servers'][server]['fillserver'] = fillserver 
    15131523            sabnzbd.CFG['servers'][server]['ssl'] = ssl 
    1514         return saveAndRestart(self.__root, _dc) 
     1524            sabnzbd.CFG['servers'][server]['enable'] = enable 
     1525 
     1526        save_configfile(sabnzbd.CFG) 
     1527        sabnzbd.update_server(oldserver, server) 
     1528        raise Raiser(self.__root, _dc=_dc) 
    15151529 
    15161530    @cherrypy.expose 
    15171531    def delServer(self, *args, **kwargs): 
    15181532        if 'server' in kwargs and kwargs['server'] in sabnzbd.CFG['servers']: 
    1519             del sabnzbd.CFG['servers'][kwargs['server']] 
    1520  
     1533            server = kwargs['server'] 
     1534            del sabnzbd.CFG['servers'][server] 
     1535            save_configfile(sabnzbd.CFG) 
     1536            sabnzbd.update_server(server, None) 
     1537         
    15211538        if '_dc' in kwargs: 
    1522             return saveAndRestart(self.__root, kwargs['_dc']) 
     1539            raise Raiser(self.__root, _dc=kwargs['_dc']) 
    15231540        else: 
    1524             return saveAndRestart(self.__root, '') 
     1541            raise Raiser(self.__root, _dc='') 
    15251542 
    15261543#------------------------------------------------------------------------------ 
     
    17671784            config['schedlines'].append(ev[3]) 
    17681785 
     1786        actions = ['resume', 'pause', 'shutdown', 'speedlimit'] 
     1787        servers = sabnzbd.CFG['servers'] 
     1788        for server in servers: 
     1789            actions.append(server) 
     1790        config['actions'] = actions 
    17691791 
    17701792        template = Template(file=os.path.join(self.__web_dir, 'config_scheduling.tmpl'), 
     
    17781800                    action = None, arguments = None, _dc = None): 
    17791801        schedules = sabnzbd.CFG['misc']['schedlines'] 
     1802 
     1803        arguments = arguments.strip().lower() 
     1804        if arguments in ('on', 'enable'): 
     1805            arguments = '1' 
     1806        elif arguments in ('off','disable'): 
     1807            arguments = '0' 
     1808 
    17801809        if minute and hour  and dayofweek and action: 
    1781             try: 
    1782                 if action == 'speedlimit': int(arguments) 
     1810            if (action == 'speedlimit') and arguments.isdigit(): 
     1811                pass 
     1812            elif action in ('resume', 'pause', 'shutdown'): 
     1813                arguments = '' 
     1814            elif action.find(':') > 0: 
     1815                if arguments == '1': 
     1816                    arguments = action 
     1817                    action = 'enable_server' 
     1818                else: 
     1819                    arguments = action 
     1820                    action = 'disable_server' 
     1821            else: 
     1822                action = None 
     1823 
     1824            if action: 
    17831825                schedules.append('%s %s %s %s %s' % 
    17841826                                 (minute, hour, dayofweek, action, arguments)) 
    1785             except: 
    1786                 pass 
    17871827        save_configfile(sabnzbd.CFG) 
    17881828        scheduler.restart() 
  • trunk/main/sabnzbd/newswrapper.py

    r1763 r1768  
    245245            # Reset for internal reasons, just wait 5 sec 
    246246            self.timeout = time() + 5 
    247              
     247 
     248    def terminate(self): 
     249        """ Close connection and remove nntp object """ 
     250        if self.nntp: 
     251            try: 
     252                self.nntp.sock.close() 
     253            except: 
     254                pass 
     255        del self.nntp 
    248256 
    249257 
  • trunk/main/sabnzbd/scheduler.py

    r1747 r1768  
    4141    """ Create the scheduler and set all required events 
    4242    """ 
    43     global __SCHED 
     43    global __SCHED, CFG 
    4444 
    4545    need_rsstask = True 
     
    7979        elif action_name == 'speedlimit' and arguments != []: 
    8080            action = sabnzbd.limit_speed 
     81        elif action_name == 'enable_server' and arguments != []: 
     82            action = sabnzbd.enable_server 
     83        elif action_name == 'disable_server' and arguments != []: 
     84            action = sabnzbd.disable_server 
    8185        else: 
    8286            logging.warning("[%s] Unknown action: %s", __NAME__, action_name) 
     
    140144    stop() 
    141145 
    142     p, s = analyse() 
    143     sabnzbd.DOWNLOADER.paused = p 
    144     if s: 
    145         sabnzbd.DOWNLOADER.limit_speed(s) 
    146         sabnzbd.BANDWITH_LIMIT = s 
    147      
     146    analyse() 
     147 
    148148    init() 
    149149    start() 
     
    204204 
    205205 
    206 def analyse(): 
     206def analyse(was_paused=False): 
    207207    """ Determine what pause/resume state we would have now. 
    208208        Return True if paused mode would be active. 
     
    213213    paused = None 
    214214    speedlimit = None 
     215    servers = {} 
    215216 
    216217    for ev in sort_schedules(schedlines, forward=False): 
    217218        logging.debug('[%s] Schedule check result = %s', __NAME__, ev) 
    218219        action = ev[1] 
     220        try: 
     221            value = ev[2] 
     222        except: 
     223            value = None 
    219224        if action == 'pause': 
    220225            paused = True 
    221226        elif action == 'resume': 
    222227            paused = False 
    223         elif action == 'speedlimit' and ev[2]!=None: 
     228        elif action == 'speedlimit' and value!=None: 
    224229            speedlimit = int(ev[2]) 
    225  
    226     return paused, speedlimit 
     230        elif action == 'enable_server': 
     231            try: 
     232                servers[value] = 1 
     233            except: 
     234                logging.warning('[%s] Schedule for non-existing server %s', __NAME__, value) 
     235        elif action == 'disable_server': 
     236            try: 
     237                servers[value] = 0 
     238            except: 
     239                logging.warning('[%s] Schedule for non-existing server %s', __NAME__, value) 
     240 
     241    if not was_paused: 
     242        sabnzbd.DOWNLOADER.paused = paused 
     243    if speedlimit: 
     244        sabnzbd.DOWNLOADER.limit_speed(s) 
     245        sabnzbd.BANDWITH_LIMIT = speedlimit 
     246    for serv in servers: 
     247        try: 
     248            sabnzbd.CFG['servers'][serv]['enable'] = servers[serv] 
     249        except: 
     250            pass 
     251    sabnzbd.misc.save_configfile(sabnzbd.CFG)