SNMPv3/pygal制图/smtplib发邮件

SNMPv3

  • SNMPv3在路由器端的配置

这个我都没配置过,还得现学现卖
这个链接说的是SNMPv3的基本配置

这个链接说的是SNMPv3的view命令,用于管理员可以看到哪些层级的内容

1) 配置

snmp-server group READONLY v3 priv read VIEWSTD access 98
snmp-server view VIEWSTD iso included
snmp-server community galileo RO 98
snmp-server user <user> READONLY v3 auth sha <password> priv aes 128 <key>

上面的命令的意思是,snmp-server view VIEWSTD iso included是创建一个view, 这个view里只能看iso级和iso级以下的(include),创建了一个group叫READONLY, 版本v3,权限是读,VIEWSTD是和刚刚的view设置绑定, access 98是调用名字为98的ACL做访问控制。最后是创建一个v3独有的user,user有名字,也有认证用的password,也有加密用的password,把它绑到READONLY组

2) 注意snmp-server user 命令打完之后,在running config里是看不到的,用以下命令看

router1#sho snmp user

User name: pysnmp
Engine ID: 8000000903001C6A7AAF5768
storage-type: nonvolatile active
Authentication Protocol: SHA
Privacy Protocol: AES128
Group-name: READONLY
  • snmp_helper.snmp_get_oid_v3(a_device, snmp_user, oid=the_oid)

1) 变化一
去除了community的赋值,取而代之的是username, auth_key, encrypt_key. 并创建snmp_user元组

2) 变化二

他跟普通的v2版本的snmp_get_oid的最大的不同就是,中间多了一个叫user的参数,也就是刚刚在路由器上的最后一条命令创造的那个user

3) 变化三

a_device 在赋值的时候,以往是a_device = (ip_addr, commu, port), 现在是a_device = (ip_addr, port), 减少了中间的commu

4) 总体的一个代码是这样的

import snmp_helper

‘‘‘
router1#sho snmp user

User name: pysnmp
Engine ID: 8000000903001C6A7AAF5768
storage-type: nonvolatile active
Authentication Protocol: SHA
Privacy Protocol: AES128
Group-name: READONLY
‘‘‘

OID = ‘1.3.6.1.2.1.1.5.0‘

ip_addr = ‘184.105.247.70‘
port = 161

snmp_user = ‘pysnmp‘
auth_key = ‘galileo1‘
encrypt_key = ‘galileo1‘

a_user = (snmp_user, auth_key, encrypt_key)  #组成user元组
a_device = (ip_addr, port) #组成device元组

snmp_data = snmp_helper.snmp_get_oid_v3(a_device, a_user, OID)
output = snmp_helper.snmp_extract(snmp_data)

print output
  • 利用snmp获取interface相关数据

通过思科的工具查到和interface description相关的OID是‘1.3.6.1.2.1.2.2.1.2’,再通过snmpwalk命令到具体的设备上去查具体的端口信息

(applied_python)[-class3]$ cat snmp_walk_interface_descrp.txt
(applied_python)[- class3]$ snmpwalk -Os -c galileo -v 1 184.105.247.70 1.3.6.1.2.1.2.2.1.2
ifDescr.1 = STRING: FastEthernet0
ifDescr.2 = STRING: FastEthernet1
ifDescr.3 = STRING: FastEthernet2
ifDescr.4 = STRING: FastEthernet3
ifDescr.5 = STRING: FastEthernet4
ifDescr.6 = STRING: Null0
ifDescr.7 = STRING: Vlan1
ifDescr.11 = STRING: Vlan127
ifDescr.13 = STRING: Vlan157
(applied_python)[class3]$ snmpwalk -Os -c galileo -v 1 184.105.247.70 1.3.6.1.2.1.2.2.1.2.5
ifDescr.5 = STRING: FastEthernet4
(applied_python)[class3]$
  • for循环一次读取多个OID
#! /usr/bin/env python
import snmp_helper

snmp_oids = (
  (‘sysName‘, ‘1.3.6.1.2.1.1.5.0‘, None),
  (‘sysUptime‘, ‘1.3.6.1.2.1.1.3.0‘, None),
  (‘ifDescr_fa4‘, ‘1.3.6.1.2.1.2.2.1.2.5‘, None),
  (‘ifInOctets_fa4‘, ‘1.3.6.1.2.1.2.2.1.10.5‘, True),
  (‘ifInUcastPkts_fa4‘, ‘1.3.6.1.2.1.2.2.1.11.5‘, True),
  (‘ifOutOctets_fa4‘, ‘1.3.6.1.2.1.2.2.1.16.5‘, True),
  (‘ifOutUcastPkts_fa4‘, ‘1.3.6.1.2.1.2.2.1.17.5‘, True),
)

ip_addr = ‘184.105.247.70‘
port = 161

snmp_user = ‘pysnmp‘
auth_key = ‘galileo1‘
encrypt_key = ‘galileo1‘

a_user = (snmp_user, auth_key, encrypt_key)
a_router = (ip_addr, port) 

for desc, each_oid, is_count in snmp_oids:
  snmp_data = snmp_helper.snmp_get_oid_v3(a_router, a_user, oid=each_oid)
  output = snmp_helper.snmp_extract(snmp_data)
  print "%s %s" % (desc, output)

注意上面这段代码中的for循环中的这个 is_count,虽然他不发挥什么作用,我们在for中并不引用它,但是它也必须在for a,b,c in snmp_oids中出现,因为snmp_oid这个tuple的每个元素,都是三个元素组成的小tuple,如果把is_count去掉,会出现“ValueError: too many values to unpack”

  • 每隔一段时间运行一下上面那个for循环
#! /usr/bin/env python

import snmp_helper
import sched, time
from datetime import datetime

snmp_oids = (
  (‘sysName‘, ‘1.3.6.1.2.1.1.5.0‘, None),
  (‘sysUptime‘, ‘1.3.6.1.2.1.1.3.0‘, None),
  (‘ifDescr_fa4‘, ‘1.3.6.1.2.1.2.2.1.2.5‘, None),
  (‘ifInOctets_fa4‘, ‘1.3.6.1.2.1.2.2.1.10.5‘, True),
  (‘ifInUcastPkts_fa4‘, ‘1.3.6.1.2.1.2.2.1.11.5‘, True),
  (‘ifOutOctets_fa4‘, ‘1.3.6.1.2.1.2.2.1.16.5‘, True),
  (‘ifOutUcastPkts_fa4‘, ‘1.3.6.1.2.1.2.2.1.17.5‘, True),
)

ip_addr = ‘184.105.247.70‘
port = 161

snmp_user = ‘pysnmp‘
auth_key = ‘galileo1‘
encrypt_key = ‘galileo1‘

a_user = (snmp_user, auth_key, encrypt_key)
a_router = (ip_addr, port) 

#s = sched.scheduler(time.time, time.sleep)

def loop_the_oids(snmp_oids):
  for desc, each_oid, is_count in snmp_oids:
  snmp_data = snmp_helper.snmp_get_oid_v3(a_router, a_user, oid=each_oid)
  output = snmp_helper.snmp_extract(snmp_data)
  print "%s %s" % (desc, output)

def print_current_time():
  print datetime.now()

for time_range in range(1,13):
  print "time %d" % (time_range*10)
  loop_the_oids(snmp_oids)
  time.sleep(10)

本来是想用 sched来打印时间戳的,但是后来觉得用time.sleep和print一个累加的数字就可以实现下一步要用的横坐标了

Graph from SNMP data

我觉得这有点重复造轮子了,因为这个完全可以通过Cacti实现,而且Cacti实现的又特别好

  • pygal

pip install pygal即可

1) 初始化一个object,line_chart = pygal.Line()
2) 初始化横坐标 line_chart.x_labels = [‘0’, ‘10’, ‘20’, ‘40’]
3) 初始化一条数据折线
fa4_in_packets = [] 一个数组,这个数组在视频里Kirk是直接手写的,但是也可以从上一个实验的结果里提取,这也是这次的练习作业,还是有点难度
line_chart.add(‘InPackets’, fa4_in_packets)
4) 保存为svg格式的图片
line_chart.render_to_file(‘test.svg’)
svg格式的图片需要用浏览器打开

Sending Email

  • smtplib

python自带的一个库,使用的方式很简单,代码在最后

  • from email.mime.text import MIMEText

这个MIMEText是个什么呢,Wikipedia的解释如下
Multipurpose Internet Mail Extensions (MIME) is an Internet standard that extends the format of email to support: Text in character sets other than ASCII. Non-text attachments: audio, video, images, application programs etc.

  • 代码部分

这个password要注意,这个是在网易邮箱设置里,找到SMTP相关那一栏,点进去勾选IMAP/SMTP 和 POP3/SMTP的时候,会让你设置一个单独的密码,网易把这个码称为邮箱客户端授权码,在第三方客户端(也就是我们今天的脚本)中发邮件的时候,用这个码代替原来的163邮箱的密码

import smtplib

from email.mime.text import MIMEText

recipient1 = "[email protected]"

mail_host1 = "smtp.163.com"
mail_password1 = "*****"
mail_sender1 = "[email protected]"

def send_email(recipient, subject, message, mail_sender, mail_host, mail_password):
try:
smtp_conn = smtplib.SMTP()
smtp_conn.connect(mail_host)
smtp_conn.login(mail_sender, mail_password)
print "conn created"

message = MIMEText(message)
message[‘To‘] = recipient
message[‘Subject‘] = subject
message[‘From‘] = mail_sender
smtp_conn.sendmail(mail_sender, recipient, message.as_string())
smtp_conn.close()
print "Your message has been sent"
return True
except Exception, e:
return False
print "oops something wrong"

send_email(recipient1, "Test", "sent by script", mail_sender1, mail_host1, mail_password1)

?

时间: 2024-12-13 05:47:29

SNMPv3/pygal制图/smtplib发邮件的相关文章

Python logging smtplib 发邮件

#!/usr/bin/env python #-*- coding:utf-8 -*- #File:mail_send.py class Mail_Logger(): mailLogger = None def __init__(self,conf_file,name): import logging,logging.config logging.config.fileConfig(conf_file) #create logger self.mailLogger = logging.getLo

【Python】 发邮件用 smtplib &amp; email

■ smtplib & email ■ 概述 发邮件主要用到smtplib以及email模块.stmplib用于邮箱和服务器间的连接,发送的步骤.email模块主要用于处理编码,邮件内容等等.主要是参考了那个发报表的脚本,简单记录了下最简单的用法,没啥参考价值= = ■ smtplib基本用法 smtp = smtplib.SMTP() #建立smtp对象 smtp.connect('server',port) #建立与smtp服务器的连接 smtp.login('user','password

【Python系列】Python自动发邮件脚本

缘起 这段时间给朋友搞了个群发邮件的脚本,为了防止进入垃圾邮件,做了很多工作,刚搞完,垃圾邮件进入率50%,觉得还不错,如果要将垃圾邮件的进入率再调低,估计就要花钱买主机了,想想也就算了,先发一个月,看看效果再拓展吧. 脚本主要是通过Python写的,调的smtplib库,这些是基础,大家在网上一搜一大堆,今天主要给大家讲解下如何避免进入垃圾邮件系统,以及整个系统搭建时的一些思想.可能刚搞Python不久,有很多可能是错误的写法望大家提出来哈~ 配置 CentOS7.0系统 Python 3.4

python编码发邮件

下面为使用python编写的发邮件的代码,注意,代码中的password不是邮箱的密码,而是客户端授权代码.获取客户端授权代码,以163邮箱为例:设置-常规设置-客户端授权密码. from email.mime.text import MIMEText from email.header import Header  subject = 'python email test'   msg = MIMEText('数据库中有内容更新,请及时查看', 'plain', 'utf-8') msg['S

python-发邮件脚本

折腾nagios发邮件好几天,终于完成,我的系统环境是ubuntu12.04,安装postfix服务,先贴上脚本,如下: #!/usr/bin/env python#-*- coding:utf-8 -*-''' from: 改成你的邮箱地址 '''import datetime,smtplib,string,sysfrom email.Header import Headerfrom email.MIMEText import MIMETextfrom email.MIMEMultipart

python实现发邮件(sendmail.py )

#!/usr/bin/python #-*-coding:utf-8-*- #-*-coding:utf-8-*- #filename :sendmail.py import sys import smtplib from email.mime.text import MIMEText from email.header import Header from email.mime.multipart import MIMEMultipart from email import Utils imp

python最简单的发邮件方式(不带附件)

今天在尝试使用python发送邮件,在网上看了很多教程,发觉对于初学者的我有点复杂和代码比较麻烦,而且也没有太多的注释告诉我这是干嘛用的,用法是什么 这个教程十分简单,但是我足够应付我日常工作的需要了,作为运维,我要的功能只是能够发送邮件并且正确显示其内容就够,不需要太多花俏的东西. 测试的准备工作是,我在虚拟机下把w的命令输出重定向到一个文件,作为邮件body体的发送内容. w > msg.log [[email protected] tmp]# cat msg.log 02:48:50 up

python 发邮件乱码

来自:http://outofmemory.cn/code-snippet/1464/python-send-youjian-resolve-suoyou-luanma-question 使用python发邮件很简单,但是遇到乱码问题很烦恼. 乱码问题有几种:有发件人名称乱码,有标题乱码,也有正文乱码的问题. 要解决发件人名称乱码问题,必须使用Header,如下代码: from email.header import Header from = ("%s<[email protected]

python使用xlsxwriter模板完成nginx趋势图,并自动发邮件

前言: 来到新公司,领导下发了个需求:每周需要对服务器进行一个巡检,以及分析ngxin趋势,由于公司实际生产环境服务器不是特别多,考虑暂时先用脚本完成该需求. 大致思路:收集数据 -> 写入excel制成图表  -> 发邮件 一.收集nginx数据 主要是对nginx log进行一个分析,统计数据.公司使用系统自带的logrotate切割nginx日志,只保存10天日志,并且压缩起来,使用shell分析出来会出现两个日期,遂:将日志文件拷贝到其他路径,解压,并逐个分析,脚本如下: #!/bin