zoukankan      html  css  js  c++  java
  • Django SimpleCMDB 项目

    创建 SimpleCMDB 项目:

    [root@localhost ~]$ django-admin.py startproject SimpleCMDB


    创建应用,收集主机信息:

    [root@localhost ~]$ cd SimpleCMDB/
    [root@localhost SimpleCMDB]$ python manage.py startapp hostinfo


    修改配置:

    [root@localhost SimpleCMDB]$ cat SimpleCMDB/settings.py
    
    INSTALLED_APPS = (    # 添加应用
        ......
        'hostinfo',
    )
    
    MIDDLEWARE_CLASSES = (    # 禁用CSRF,使得可以使用POST传递数据
        ......
        #'django.middleware.csrf.CsrfViewMiddleware',
    )
    
    LANGUAGE_CODE = 'zh-cn'    # 修改语言
    
    TIME_ZONE = 'Asia/Shanghai'    # 修改时区


    启动开发服务器:

    [root@localhost SimpleCMDB]$ python manage.py runserver 0.0.0.0:8000


    定义数据模型:

    [root@localhost SimpleCMDB]$ cat hostinfo/models.py
    from django.db import models
    
    # Create your models here.
    
    class Host(models.Model):
        hostname = models.CharField(max_length=50)
        ip = models.IPAddressField()
        vendor = models.CharField(max_length=50)
        product = models.CharField(max_length=50)
        sn = models.CharField(max_length=50)
        cpu_model = models.CharField(max_length=50)
        cpu_num = models.IntegerField()
        memory = models.CharField(max_length=50)
        osver = models.CharField(max_length=50)


    同步到数据库:

    [root@localhost SimpleCMDB]$ python manage.py validate
    [root@localhost SimpleCMDB]$ python manage.py syncdb

     
    将数据模型注册到管理后台:

    [root@localhost SimpleCMDB]$ cat hostinfo/admin.py
    from django.contrib import admin
    from hostinfo.models import Host
    
    # Register your models here.
    
    class HostAdmin(admin.ModelAdmin):
        list_display = [
            'hostname', 
            'ip',
            'cpu_model',
            'cpu_num',
            'memory',
            'vendor',
            'product',
            'osver',
            'sn',
        ]
    
    admin.site.register(Host, HostAdmin)


    通过 POST 方法收集主机信息到 SimpleCMDB:

    [root@localhost SimpleCMDB]$ cat SimpleCMDB/urls.py
    ....
    urlpatterns = patterns('',
        ....
        url(r'^hostinfo/collect/$', 'hostinfo.views.collect'),
    )
    [root@localhost SimpleCMDB]$ cat hostinfo/views.py 
    from django.shortcuts import render
    from django.http import HttpResponse
    from hostinfo.models import Host
    
    # Create your views here.
    
    def collect(request):
        if request.POST:
            hostname = request.POST.get('hostname')
            ip = request.POST.get('ip')
            osver = request.POST.get('osver')
            vendor = request.POST.get('vendor')
            product = request.POST.get('product')
            cpu_model = request.POST.get('cpu_model')
            cpu_num = request.POST.get('cpu_num')
            memory = request.POST.get('memory')
            sn = request.POST.get('sn')
        
            host = Host()
            host.hostname = hostname
            host.ip = ip
            host.osver = osver
            host.vendor = vendor
            host.product = product
            host.cpu_model = cpu_model
            host.cpu_num = cpu_num
            host.memory = memory
            host.sn = sn
            host.save()
    
            return HttpResponse('OK')
    
        else:
            return HttpResponse('No Data!')
    [root@localhost ~]$ cat /data/script/getHostInfo.py    
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import urllib, urllib2
    from subprocess import Popen, PIPE
    
    # 获取IP地址
    def getIP():
        p = Popen('ifconfig', stdout=PIPE, shell=True)
        data = p.stdout.read().split('
    
    ')
        for lines in data:
            if lines.startswith('lo'):
                continue
            if lines:
                ip = lines.split('
    ')[1].split()[1].split(':')[1]
                break
    
        return ip
    
    
    # 获取主机名
    def getHostname():
        p = Popen('hostname', stdout=PIPE, shell=True)
        hostname = p.stdout.read().strip()
        return hostname
    
    
    # 获取操作系统版本
    def getOSVersion():
        with open('/etc/issue') as fd:
            data = fd.read().split('
    ')[0]
            osVer = data.split()[0] + ' ' + data.split()[2]
    
        return osVer
    
    
    # 获取服务器硬件信息
    def getHardwareInfo(name):
        cmd = ''' dmidecode --type system | grep "%s" ''' % name
        p = Popen(cmd, stdout=PIPE, shell=True)
        hardwareInfo = p.stdout.read().split(':')[1].strip()
        return hardwareInfo
    
    
    # 获取CPU型号
    def getCPUModel():
        with open('/proc/cpuinfo') as fd:
            for line in fd.readlines():
                if line.startswith('model name'):
                    cpuModel = line.split()[3].split('(')[0]
                    break
    
        return cpuModel
    
    
    # 获取CPU核数
    def getCPUNum():
        with open('/proc/cpuinfo') as fd:
            for line in fd.readlines():
                if line.startswith('cpu cores'):
                    cpuNum = line.split()[3]
                    break
    
        return cpuNum
    
    
    # 获取物理内存大小
    def getMemorySize():
        with open('/proc/meminfo') as fd:
            memTotal = fd.readline().split()[1]
    
        memSize = str(int(memTotal)/1024) + 'M'
        return memSize
    
    
    if __name__ == '__main__':
        hostInfo = {}
        hostInfo['ip'] = getIP()
        hostInfo['hostname'] = getHostname()
        hostInfo['osver'] = getOSVersion()
        hostInfo['vendor'] = getHardwareInfo('Manufacturer')
        hostInfo['product'] = getHardwareInfo('Product Name') 
        hostInfo['sn'] = getHardwareInfo('Serial Number')
        hostInfo['cpu_model'] = getCPUModel()
        hostInfo['cpu_num'] = getCPUNum()
        hostInfo['memory'] = getMemorySize()
    
        data = urllib.urlencode(hostInfo)    # 通过POST方法传递数据
        request = urllib2.urlopen('http://192.168.216.128:8000/hostinfo/collect/', data)
        print(request.read())
    [root@localhost ~]$ python /data/script/getHostInfo.py    # 如果想收集其他主机信息,直接在其他主机跑这个脚本即可
    OK


    主机分组管理:

    [root@localhost SimpleCMDB]$ cat hostinfo/models.py   # 创建模型,添加一张主机组的表
    from django.db import models
    
    ....
    
    class HostGroup(models.Model):
        group_name = models.CharField(max_length=50)      # 组名,使用的字段类型是CharField
        group_members = models.ManyToManyField(Host)      # 组成员,注意使用的字段及字段参数
    [root@localhost SimpleCMDB]$ python manage.py validate
    [root@localhost SimpleCMDB]$ python manage.py syncdb
    [root@localhost SimpleCMDB]$ cat hostinfo/models.py    # 注册模型
    from django.db import models
    
    # Create your models here.
    
    class Host(models.Model):
        hostname = models.CharField(max_length=50)
        ip = models.IPAddressField()
        vendor = models.CharField(max_length=50)
        product = models.CharField(max_length=50)
        sn = models.CharField(max_length=50)
        cpu_model = models.CharField(max_length=50)
        cpu_num = models.IntegerField()
        memory = models.CharField(max_length=50)
        osver = models.CharField(max_length=50)
    
        def __str__(self):
            return self.ip
    
    class HostGroup(models.Model):
        group_name = models.CharField(max_length=50)
        group_members = models.ManyToManyField(Host)

     


    如下,当我们多次使用指定脚本收集主机信息时,如果数据库里有记录了,它还是会添加一条相同的记录:

    因此我们需要修改一下视图函数,加个判断:

    [root@localhost SimpleCMDB]$ cat hostinfo/views.py 
    from django.shortcuts import render
    from django.http import HttpResponse
    from hostinfo.models import Host
    
    # Create your views here.
    
    def collect(request):
        if request.POST:
            hostname = request.POST.get('hostname')
            ip = request.POST.get('ip')
            osver = request.POST.get('osver')
            vendor = request.POST.get('vendor')
            product = request.POST.get('product')
            cpu_model = request.POST.get('cpu_model')
            cpu_num = request.POST.get('cpu_num')
            memory = request.POST.get('memory')
            sn = request.POST.get('sn')
        
            try:
                host = Host.objects.get(sn=sn)    # 查询数据库,查看是否有记录,如果有就重写记录,没有就添加记录
            except: 
                host = Host()    
    
            host.hostname = hostname
            host.ip = ip
            host.osver = osver
            host.vendor = vendor
            host.product = product
            host.cpu_model = cpu_model
            host.cpu_num = cpu_num
            host.memory = memory
            host.sn = sn
            host.save()
    
            return HttpResponse('OK')
    
        else:
            return HttpResponse('No Data!')

          

  • 相关阅读:
    ionic2简单分析
    mvc的真实含义
    JavaSE学习总结(十七)—— IO流
    vs2010快捷键;sql server 2008快捷;IE9快捷键
    设计模式之六大设计原则
    通过peview分析PE文件
    游戏限制多开原理及对应方法
    inline hook原理和实现
    vm tools安装包为空
    Linux下PWN环境搭建
  • 原文地址:https://www.cnblogs.com/pzk7788/p/10342477.html
Copyright © 2011-2022 走看看