114 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env python
 | 
						|
#
 | 
						|
# Copyright 2014 Huawei Technologies Co. Ltd
 | 
						|
#
 | 
						|
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
# you may not use this file except in compliance with the License.
 | 
						|
# You may obtain a copy of the License at
 | 
						|
#
 | 
						|
#     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
# Unless required by applicable law or agreed to in writing, software
 | 
						|
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
# See the License for the specific language governing permissions and
 | 
						|
# limitations under the License.
 | 
						|
 | 
						|
"""main script to poll machines which is connected to the switches."""
 | 
						|
import functools
 | 
						|
import lockfile
 | 
						|
import logging
 | 
						|
import os
 | 
						|
import site
 | 
						|
import sys
 | 
						|
 | 
						|
activate_this = '$PythonHome/bin/activate_this.py'
 | 
						|
execfile(activate_this, dict(__file__=activate_this))
 | 
						|
site.addsitedir('$PythonHome/lib/python2.6/site-packages')
 | 
						|
sys.path.append('$PythonHome')
 | 
						|
os.environ['PYTHON_EGG_CACHE'] = '/tmp/.egg'
 | 
						|
 | 
						|
from multiprocessing import Pool
 | 
						|
 | 
						|
from compass.actions import poll_switch
 | 
						|
from compass.actions import util
 | 
						|
from compass.db.api import database
 | 
						|
from compass.db.api import switch as switch_api
 | 
						|
from compass.db.api import user as user_api
 | 
						|
from compass.tasks.client import celery
 | 
						|
from compass.utils import daemonize
 | 
						|
from compass.utils import flags
 | 
						|
from compass.utils import logsetting
 | 
						|
from compass.utils import setting_wrapper as setting
 | 
						|
 | 
						|
 | 
						|
flags.add('switch_ips',
 | 
						|
          help='comma seperated switch ips',
 | 
						|
          default='')
 | 
						|
flags.add_bool('async',
 | 
						|
               help='ryn in async mode',
 | 
						|
               default=True)
 | 
						|
flags.add('thread_pool_size', type='int',
 | 
						|
          help='thread pool size when run in noasync mode',
 | 
						|
          default=4)
 | 
						|
flags.add('run_interval', type='int',
 | 
						|
          help='run interval in seconds',
 | 
						|
          default=setting.POLLSWITCH_INTERVAL)
 | 
						|
 | 
						|
 | 
						|
def pollswitches(switch_ips):
 | 
						|
    """poll switch."""
 | 
						|
    user = user_api.get_user_object(setting.COMPASS_ADMIN_EMAIL)
 | 
						|
    poll_switches = []
 | 
						|
    all_switches = dict([
 | 
						|
        (switch['ip'], switch['credentials'])
 | 
						|
        for switch in switch_api.list_switches(user)
 | 
						|
    ])
 | 
						|
    if switch_ips:
 | 
						|
        poll_switches = dict([
 | 
						|
            (switch_ip, all_switches[switch_ip])
 | 
						|
            for switch_ip in switch_ips
 | 
						|
            if switch_ip in all_switches
 | 
						|
        ])
 | 
						|
    else:
 | 
						|
        poll_switches = all_switches
 | 
						|
 | 
						|
    if flags.OPTIONS.async:
 | 
						|
        for switch_ip, switch_credentials in poll_switches.items():
 | 
						|
            celery.send_task(
 | 
						|
                'compass.tasks.pollswitch',
 | 
						|
                (user.email, switch_ip, switch_credentials)
 | 
						|
            )
 | 
						|
 | 
						|
    else:
 | 
						|
        try:
 | 
						|
            pool = Pool(processes=flags.OPTIONS.thread_pool_size)
 | 
						|
            for switch_ip, switch_credentials in poll_switches.items():
 | 
						|
                pool.apply_async(
 | 
						|
                    poll_switch.poll_switch,
 | 
						|
                    (user.email, switch_ip, switch_credentials)
 | 
						|
                )
 | 
						|
            pool.close()
 | 
						|
            pool.join()
 | 
						|
        except Exception as error:
 | 
						|
            logging.error('failed to poll switches %s',
 | 
						|
                          poll_switches)
 | 
						|
            logging.exception(error)
 | 
						|
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    flags.init()
 | 
						|
    logsetting.init()
 | 
						|
    database.init()
 | 
						|
    logging.info('run poll_switch')
 | 
						|
    daemonize.daemonize(
 | 
						|
        functools.partial(
 | 
						|
            pollswitches,
 | 
						|
            [switch_ip
 | 
						|
             for switch_ip in flags.OPTIONS.switch_ips.split(',')
 | 
						|
             if switch_ip]),
 | 
						|
        flags.OPTIONS.run_interval,
 | 
						|
        pidfile=lockfile.FileLock('/var/run/poll_switch.pid'),
 | 
						|
        stderr=open('/tmp/poll_switch_err.log', 'w+'),
 | 
						|
        stdout=open('/tmp/poll_switch_out.log', 'w+'))
 |