使用python+django+twistd 开发自己的操作和维护系统的一个

使用python+django+twistd 开发自己的操作和维护系统的一个

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

许多开源操作系统和维护系统,例nagios、zabbix、cati等等,但是,当他们得到的时间自己的个性化操作和维护需求,始终无力!

最近的一项研究python。因此,我们认为python+django+twisted要定制一个完全个性化的操作和维护系统。

有几个基本的功能:监控、分析、报警、更甚者直接依据分析的结果进行反应操作。而以上几点通过上述的框架能够比較easy的实现。

以下上图说明:

使用python+django+twistd 开发自己的操作和维护系统的一个

使用freemind整理了下思路:

使用python+django+twistd 开发自己的操作和维护系统的一个

以下是一些代码段,完整的代码下载见文档底部:

Server:

#!/usr/bin/env python
#coding:utf-8
__author__ = 'dwj'


from twisted.internet.protocol import ServerFactory
from twisted.protocols import basic
import cx_Oracle
from twisted.application import  service, internet



class Mornitor_Protocol(basic.LineReceiver):

    def __init__(self):
    #
        _oracle_conn=cx_Oracle.connect('xxxx', 'xxxx', '192.168.7.17/test', threaded=True)
        _oracle_conn.autocommit = True
        self.cur = _oracle_conn.cursor()
        self._oracle_conn=_oracle_conn


    def ruku(self, line):
        ip=self.transport.getPeer().host
        #获取clientIP
        line=line.split(':::')
        #使用:::切割原始数据
        if line[1] in ['cpu', 'mem', 'disk', 'tcp', 'net', 'process_down']:
        #依据数据包头来确定使用insert还是update。当是tcp包头的时候插入,其余的更新
            if line[1] == 'tcp':
                sql = "insert into MORNITOR_BASICINFO (ipadd,time,tcp) values (\'%s\',\'%s\',\'%s\')"%(ip,line[0],line[3])
                print sql
                self.cur.execute(sql)

            else:
                line_again = line[3].split('::')
                sql = 'update MORNITOR_BASICINFO set %s=\'%s\',%s=\'%s\' where ipadd=\'%s\' and time=\'%s\''%(line[1],line_again[0],line[2],line_again[1],ip,line[0])
                print sql
                self.cur.execute(sql)

    def connectionMade(self):
        print 'Connected!'

    def lineReceived(self, line):
        print line
        self.ruku(line)
        #接受到数据之后运行入库操作。
    def connectionLost(self, reason='connectionDone'):
        self._oracle_conn.close()
        print 'The db is close... ok!'


class Mornitor_Factory(ServerFactory):
    #还没想好要初始化什么
    def __init__(self,service):
        self.service = service

    protocol = Mornitor_Protocol


class Fish_Service(service.Service):

    def __init__(self):
        pass

    def startService(self):
        service.Service.startService(self)              #什么都不做,開始服务

    # def stopService(self):
    #     return self._port.stopListening()



#配置參数
port = 10000
iface = '127.0.0.1'



top_server = service.MultiService()                             #定义服务容器

fish_server = Fish_Service()                                    #实例化我们的服务
fish_server.setServiceParent(top_server)                        #把自己定义的服务增加到服务容器

factory = Mornitor_Factory(Fish_Service)                        #工厂化服务

tcp_server = internet.TCPServer(port, factory, interface=iface) #定义tcp服务
tcp_server.setServiceParent(top_server)                         #把tcp服务增加到服务容器

application = service.Application('Fish_Service')               #给应用起个名字
top_server.setServiceParent(application)                        #把服务容器丢到应用中去

Client端

from twisted.protocols import basic
from twisted.internet import  protocol, defer, task
import Get_basic_info_2 as Huoqu
import guardian as shouhu
import time
from twisted.application import service, internet


class Monitor_Protocol(basic.LineReceiver):
    #自定义客户端和服务端的连接协议。从basic的line继承

    def __init__(self):
        #
        pass

    @staticmethod
    def huoqu_shuju():
        #定义一个函数获取本机的一些状态
        now = str(time.strftime('%Y-%m-%d %H:%M:%S'))
        
        def add_tag(source, tag1, tag2 = 'none'):
        #定义格式化字符串函数
            return ':::'.join([now, tag1, tag2, source])
            #使用:::分隔时间、简单信息、具体信息、原始信息
        
        tcp = add_tag(Huoqu.net_tcp(), 'tcp')
        cpu = add_tag(Huoqu.cpu(), 'cpu', 'cpu_detail')
        mem = add_tag(Huoqu.mem(), 'mem', 'mem_detail')
        disk = add_tag(Huoqu.disk_usage(), 'disk', 'disk_detail')
        net = add_tag(Huoqu.net_rate(), 'net', 'net_detail')
        process = add_tag(shouhu.check_alive(), 'process_down', 'process_alived')
        result = (tcp, cpu, mem, disk, net, process, ) 
        d = defer.Deferred()
        #使用defered返回结果
        d.callback(result)
        return d

    def xunhuan(self, list):
    #定义循环发送函数
        for i in list:
            self.sendLine(i)

    def fasong(self):
    #定义程序执行顺序,取得信息后用callback交给发送函数发送
        self.huoqu_shuju().addCallback(self.xunhuan)

    def loop(self):
    #使用twist内置的循环函数定义几秒监控数据传送到服务端
        l = task.LoopingCall(self.fasong)
        l.start(1)

    def connectionMade(self):
    #覆盖协议的connectmade函数。定义于服务端的连接建立后開始循环
        print 'Connected!......ok!'
        self.loop()

    def lineReceived(self, line):
    #必须覆盖接受函数,否则twist会报not importent错误!

passclass Moinitor_client_factory(protocol.ReconnectingClientFactory): def __init__(self, service): #还没想要要写什么 self.service = service protocol = Monitor_Protocolclass Client_Service(service.Service): def __init__(self): pass def startService(self): service.Service.startService(self)#配置文件開始port = 10000host = '127.0.0.1'#守护进程top_service = service.MultiService() #定义服务容器client_service = Client_Service() #实例化服务类client_service.setServiceParent(top_service) #把自定义的服务丢到服务容器中factory = Moinitor_client_factory(client_service) #定义服务工厂化tcp_service = internet.TCPClient(host, port, factory) #定义tcp连接的服务tcp_service.setServiceParent(top_service) #把tcp服务丢到服务容器中去application = service.Application('Fish_Service') #定义应用名字top_service.setServiceParent(application) #把服务容器丢到应用中去

一些自己定义监控程序是否存活的脚本:

program = {'nginx': ['/opt/nginx/logs/nginx.pid', '/opt/nginx/sbin/nginx'],
            'rsync-C': ['/var/run/rsyncd.pid', 'rsync --daemon'],
            }


def main():
    for k in program:
        a = get_pid(k, program[k][0])
        if isinstance(a, tuple):
            print '%s is not running!' % k
            print 'Start the program by Horland_guardian!'
            subprocess.call(program[k][1], shell=True)
        else:
            print 'The %s is running!' % k


def check_alive():
    l_lived = []
    l_downed = []
    for k in program:
        a = get_pid(k, program[k][0])
        if isinstance(a, tuple):
            l_downed.append(k)
        else:
            l_lived.append(k)
    process_alived = ' '.join(l_lived)
    process_down = ' '.join(l_downed)

    return '::'.join([process_down, process_alived])

django的使用眼下仅仅须要使用到admin模块就能够。

以下是一些代码段:

model

class BasicInfo(models.Model):
    ipadd = models.IPAddressField(verbose_name = u'IP地址')
    time = models.CharField(max_length=50, verbose_name = u'时间')
    cpu = models.CharField(max_length=255, blank=True, verbose_name = u'CPU%')
    cpu_detail = models.CharField(max_length=255, blank=True, verbose_name = u'CPU详情')
    mem = models.CharField(max_length=255, blank=True, verbose_name = u'内存%')
    mem_detail = models.CharField(max_length=255, blank=True, verbose_name = u'内存详情')
    disk = models.CharField(max_length=255, blank=True, verbose_name = u'磁盘%')
    disk_detail = models.CharField(max_length=255, blank=True, verbose_name = u'磁盘详情')
    net = models.CharField(max_length=255, blank=True, verbose_name = u'流量 bytes/s')
    net_detail = models.CharField(max_length=1000, blank=True, verbose_name = u'流量详情')
    tcp = models.CharField(max_length=255, blank=True, verbose_name = u'tcp连接状态')
    process_down = models.CharField(max_length=255, blank=True, verbose_name = u'DOWN-进程')
    process_alived = models.CharField(max_length=255, blank=True, verbose_name = u'Process_UP')

    def Process_DOWN(self):
        return '<span style="color: #%s;">%s</span>' % ('ff0000', self.process_down)  #拓机的进程用红色标识
    Process_DOWN.allow_tags = True

注冊到admin

class BasicInfo_admin(admin.ModelAdmin):

    list_display = ('time', 'cpu', 'cpu_detail', 'mem', 'mem_detail', 'disk', 'disk_detail', 'net', 'net_detail', 'tcp', 'Process_DOWN', 'process_alived')
    list_filter = ('ipadd', )
admin.site.register(BasicInfo, BasicInfo_admin)

freemind整理的思路中另一些功能没有实现。眼下这个仅仅能算个简单的demon吧,可是基本实现了监控的目的。欢迎大家给我留言!

以下上个django的admin界面截图吧!


使用python+django+twistd 开发自己的操作和维护系统的一个

代码下载

http://download.csdn.net/detail/qcpm1983/7611579

版权声明:本文博客原创文章。博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117662.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 你是一个合格的孩子吗?

    你是一个合格的孩子吗?最近在优酷上看到两个视频感触很深,拿来和大家一起分享一下。第一个是《天堂的午餐》  视频虽然只有短短的六分钟,也许会改变你的一生,故事讲了一个儿子为辛苦了一辈子的母亲做了一顿丰盛的午餐,但这顿午餐却成了母亲的天堂的午餐,就在母亲到家准备进家门时突然晕倒了,及时送到医院后抢救无效去世,母亲没有吃上儿子给她做的饭就去世了,视频中母亲问:我多会能吃上一顿你给我做的饭呢?儿子回答说…

  • 架构设计(1)-谈谈架构[通俗易懂]

    架构设计(1)-谈谈架构[通俗易懂]1、什么是架构和架构本质在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识这个世界的基础,并用来沟通的手段,如果对架构概念理解不一样,那沟通起来自然不顺畅。Linux有架构,MySQL有架构,JVM也有架构,使用Java开…

  • 入园第一天,11月17日,成为研究生的第68天,也是开始写博客记录学习的第一天

    入园第一天,11月17日,成为研究生的第68天,也是开始写博客记录学习的第一天

    2020年11月20日
  • excel 堆积折线图_什么叫堆积折线图

    excel 堆积折线图_什么叫堆积折线图excel中关于折线图和堆积折现图的解释:“堆积折线图和带数据标记的堆积折线图堆积折线图用于显示每一数值所占大小随时间或有序类别而变化的趋势,可能显示数据点以表示单个数据值,也可能不显示这些数据点。如果有很多类别或者数值是近似的,则应该使用无数据点堆积折线图。提示为更好地显示此类型的数据,您可能要考虑改用堆积面积图。更通俗的解释为: 如果有两个数据系列,折线图中两个数据系列是独立…

  • php 全部替换字符串,php如何批量替换字符串

    php 全部替换字符串,php如何批量替换字符串php如何批量替换字符串2020-10-0614:54:06php批量替换字符串的方法:使用【str_replace】批量查找替换字符串,代码为【$str=str_replace(‘o’,’O’,$str,$count);echo$str.PHP_EOL;】。php批量替换字符串的方法:str_replace批量查找替换字符串…

  • 匹配中文的正则表达式_正则表达式和正规式

    匹配中文的正则表达式_正则表达式和正规式原文链接:http://caibaojian.com/zhongwen-regexp.html这篇文章主要讲如何使用正则匹配中文字符,中文正则表达式的匹配规则不像其他正则规则一样容易记住,下面一起看看这个中文正则表达式是怎么样的。\w匹配的仅仅是中文,数字,字母,对于国人来讲,仅匹配中文时常会用到,见下匹配中文字符的正则表达式:[\u4e00-\u9fa5]或许你也需要匹配双字节字符,中文也是双…

    2022年10月27日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号