群晖 命令运行失败安装trasmision失败 在哪看log

Synology群晖NAS外部IP更新通知 - 为程序员服务
Synology群晖NAS外部IP更新通知
  在我的群晖DS211j上使用DDNS服务时经常出现长时间无法正常更新IP的现象,这对于需要经常从外部访问的我来说是个很大的问题,于是写了段Python脚本在NAS上监控外部IP地址的变化,如果发现改变将发送新的IP地址到指定的邮箱。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#! 强制默认编码为utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# SMTP服务器 用户 密码
smtp_server = 'SMTP SERVER'
= 'SMTP USERNAME'
= 'SMTP PASSWORD'
# 发送接受邮箱地址
#! 发送邮箱需是smtp_usr有权操作的邮箱
= 'FROM EMAIL ADDRESS'
= 'TO EMAIL ADDRESS'
# 获取外网IP的网址 可以是
# http://ifconfig.me/ip
# http://ip.3322.net
# http://members.3322.org/dyndns/getip
ip_check_server = 'http://ip.3322.net'
# 记录文件路径
= '/tmp/ipcheck.log'
# 邮件主题
# 内容为新的IP
mail_subject = 'IP check message'
import os, urllib2, smtplib
from datetime import datetime
class CheckIP(object):
def __init__(self):
self.logs = []
self.openLog()
def __del__(self):
self.saveLog()
def openLog(self):
if not os.path.isfile(log_file):
open(log_file, 'w').close()
with open(log_file, 'r') as f:
self.logs = f.readlines()
if not self.logs or len(self.logs) & 2:
self.logs = ['\n', '----\n']
# 确保第二行永远是分隔符
self.logs[1] = '----\n'
def saveLog(self):
with open(log_file, 'w') as f:
f.writelines(self.logs)
def getOldIP(self):
return self.logs[0].strip()
def setNewIP(self, new_ip):
if new_ip:
self.logs[0] = '{}\n'.format(new_ip)
def sendMail(self, msg):
if not msg:
data = {'from_addr' : from_addr,
: to_addr,
: mail_subject,
msg = 'From: {from_addr}\r\nTo: {to_addr}\r\nSubject: {subject}\r\n\r\n{msg}'.format(**data)
smtp = smtplib.SMTP()
# smtp.set_debuglevel(1)
smtp.connect(smtp_server, smtp_port)
smtp.login(smtp_usr, smtp_pwd)
smtp.sendmail(from_addr, to_addr, msg)
smtp.quit()
except Exception, e:
return False, 'send mail fail. {}'.format(e)
return True, None
def log(self, msg, need_mail = False):
if not msg:
print(msg)
log_msg = '{}\t{}\n'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), msg)
# 检查最近的记录,如果相同仅更新时间
last_log = self.logs[2].split('\t')[1].strip()
if last_log == msg:
self.logs[2] = log_msg
self.logs.insert(2, log_msg)
except Exception, e:
self.logs.insert(2, log_msg)
if need_mail:
self.sendMail(msg)
def checkIP(self):
old_ip = self.getOldIP()
url = urllib2.Request(ip_check_server)
res = urllib2.urlopen(url)
new_ip = res.read().strip('\r\n ')
except Exception, e:
self.log('get ip fail. {}'.format(e), True)
if old_ip == new_ip:
return self.log('IP unchanged.')
res, msg = self.sendMail('IP Changed. {}'.format(new_ip))
if not res:
return self.log(msg)
self.setNewIP(new_ip)
self.log('IP changed. {}'.format(new_ip))
def cleanLog(self):
self.logs[2:] = []
def run(self):
if len(sys.argv) == 1:
return self.checkIP()
if '--clean' in sys.argv:
return self.cleanLog()
print('argument error.')
if __name__ == '__main__':
ip = CheckIP()
将上述代码另存为文本,并按脚本中的注释正确设置SMTP服务器、账户、密码、发送及接收邮箱地址
将文件上传至NAS,如/root/ipcheck.py
使用root账户登陆NAS将该文件权限设置为可执行chmod 744 /root/ipcheck.py
执行/root/ipcheck.py测试,正常情况下你设置的接收邮箱将会收到一个包含NAS当前IP地址的邮件,如果没有请检查前面的操作是否正确。
2. 设定定时任务
  用root账户执行vi /etc/crontab,在打开的文件末尾添加如下内容:
/root/ipcheck.py
  其中*/10意为每10分钟检查一次外部IP。
  最后执行命令重启cron
/usr/syno/etc.defaults/rc.d/S04crond.sh stop && sleep 1 && /usr/syno/etc.defaults/rc.d/S04crond.sh start
  至此,NAS将每隔一段时间检查外部IP,一旦发现地址变化就会发送邮件通知。
/tmp/ipcheck.txt为默认保存当前ip地址信息及日志的文件,每次检查ip地址时都跟此文件内容比较,如果不同则发送通知邮件
原文地址:, 感谢原作者分享。
您可能感兴趣的代码

我要回帖

更多关于 群晖 联机失败 的文章

 

随机推荐