3月 31

用户自行修改svn密码的简单服务

svn做好,最基础的使用方法。将来用户要修改密码或忘记密码总要来问还是挺麻烦。不想处理这种简单问题。所以在python+tornado的框架上写了个页面,直接python跑起来。省了自己不少的事。

#!/bin/python
#-*- coding:utf-8 -*-
# Filename:    websvn.py
# Revision:    
# Date:        2014-03-27
# Author:      simonzhang
# web:         www.simonzhang.net
# Email:       simon-zzm@163.com
### END INIT INFO

import tornado.ioloop
import tornado.web

import smtplib
from email.mime.text import MIMEText 

from string import strip

# base set
webport = '88'
passfile = '/program/svn/conf/passwd'
# svn start comm
svn_start_comm = '/program/svn/bin/svnserve -d -r /program/svn/ --listen-port 59999'
# use send user info
mail_host = 'smtp.simonzhang.net'
mail_user = 'test@simonzhang.net'
mail_pwd = '123456'

def mail_send(content, mailto):
     msg = MIMEText(content.encode('utf8'), _subtype='html',  _charset='utf8')
     msg['From'] = mail_user
     msg['Subject'] = u'svninfo'
     msg['To'] = mailto
     try:
         s = smtplib.SMTP()
         s.connect(mail_host)
         s.login(mail_user,mail_pwd)
         s.sendmail(mail_user,[mailto],msg.as_string())
         s.close()
     except Exception ,e:
         print e 

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        index_html = '''
用户名 老密码 新密码 再次输入
用户邮箱
''' self.write(index_html) class EditPassHandler(tornado.web.RequestHandler): def get(self): # 清理临时文件 try: import os os.remove('%s.tmp' % passfile) except: pass # 是否重启的状态 reboot_status = 0 user = strip(self.get_argument('user')) oldpass = strip(self.get_argument('oldpass')) newpass1 = strip(self.get_argument('newpass')) newpass2 = strip(self.get_argument('newpass2')) if (len(user) == 0) or (len(oldpass) == 0) or \ (len(newpass1) == 0) or (len(newpass2) == 0): html = '输入信息错误' else: user_info_list = open(passfile, 'rb').readlines() tmp_file = open('%s.tmp' % passfile, 'wb') # 如果是用户配置则查看是否为用户,如果不是直接写入临时文件 for li in xrange(len(user_info_list)): if user_info_list[li].find('=') > 0 : u = strip(user_info_list[li].split('=')[0]) p = strip(user_info_list[li].split('=')[1]) #e = strip(user_info_list[li+1].split('#')[1]) if (u == user) and (p == oldpass): tmp_file.write('%s=%s\n' % (u, newpass1)) # tmp_file.write('#%s\n' % (e)) reboot_status = 1 # li = li+1 else: tmp_file.write(user_info_list[li]) else: tmp_file.write(user_info_list[li]) if reboot_status == 1: import os import shutil shutil.move('%s.tmp' % passfile, passfile) os.system("killall svnserve && %s" % svn_start_comm) html = '处理完成请重试' self.write(html) class SendUserInfoHandler(tornado.web.RequestHandler): def get(self): email = self.get_argument('email') user_info_list = open(passfile, 'rb').readlines() # 循环读取每一行 html = '没有找到相关信息' for li in xrange(len(user_info_list)): context = user_info_list[li][:-1] # 如果有用户配置的则分解 if context.find('=') > 0 : u = strip(user_info_list[li].split('=')[0]) p = strip(user_info_list[li].split('=')[1]) e = strip(user_info_list[li+1].split('#')[1]) # 如果用户邮箱与输入邮箱相同则发邮件 if e == strip(email): mail_send("user:%s. passwd:%s" % (u, p), email) html = '邮件发送注意查收' self.write(html) application = tornado.web.Application([ (r"/", MainHandler), (r"/editpass/", EditPassHandler), (r"/senduserinfo/", SendUserInfoHandler), ]) if __name__ == "__main__": application.listen(webport) tornado.ioloop.IOLoop.instance().start()

源码包websvn

3月 15

nginx+tomcat 使用https

操作系统上安装openssl。通过“nginx -V”查看是否有with-nginx-ssl模块安装。如果正常继续向下。
在ngixn的conf下执行以下命令生成证书。
#openssl genrsa -out www.simonzhang.net.key 1024
#openssl req -new -key www.simonzhang.net.key -out www.simonzhang.net.csr
执行完后会填写相关信息。我生成的密码为空,后面一路回车。
#openssl x509 -days 3650 -req -in www.simonzhang.net.csr -signkey www.simonzhang.net.key -out www.simonzhang.net.crt

nginx配置
之前的配置
server {
listen 80;
server_name www.simonzhang.net;
修改为
server {
listen 443;
server_name www.simonzhang.net;
ssl on;
ssl_certificate www.simonzhang.net.crt;
ssl_certificate_key www.simonzhang.net.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;

nginx测试后重新导入配置生效。

3月 13

freeswitch初步调试

FreeSwitch官方网站http://files.freeswitch.org/,下载freeswitch-1.4.0.beta6.tar.gz。
当前系统使用的是CentOS。将freeswitch放到/program/freeswitch下。

开始安装
1)安装系统工具 yum install -y git autoconf automake libtool ncurses-devel libjpeg-devel yum install -y expat-devel openssl-devel libtiff-devel libX11-devel unixODBC-devel libssl-devel python-devel \                  zlib-devel libzrtpcpp-devel alsa-lib-devel libogg-devel libvorbis-devel perl-libs gdbm-devel \                  libdb-devel uuid-devel @development-tools

2)因为网络问题直接到官方下载freeswitch包解压。如需要添加不同模块先编辑modules.conf文件。
tar jxvf freeswitch-1.4.0.beta6.tar.gz cd freeswitch-1.4.0
./configure –prefix=/program/freeswitch && make all && make install && make all cd-sounds-install cd-moh-install
最后一行为高清语音包。需要链接到官方网站,如果网络效果不好,需要多试几次。如果只是测试,或不需要,不做最后一步也没有问题。如果需要,建议备份出来。

3)修改默认密码”1234″
文件freeswitch/conf/vars.xml

4) 修改监控IP
文件freeswitch/conf/sip_profiles/internal.xml

5) 修改监听端口
文件freeswitch/conf/vars.xml

6) 修改拨号规则
文件freeswitch/conf/dialplan/default.xml

修改为这样就有了100个号码。匹配按照正则规则。

7)启动服务并检查
后台启动
/program/freeswitch/bin/freeswitch -nc -nonat -rp
检查端口是否监听
lsof -i :5060

8)配置linksys spa3000
进入spa3000,web界面,选择admin login,然后选择line1.配置如图。配置两台,互相拨打没有问题。呼叫会议室没有问题。 linksys设置密码后登陆账号user。设备重置是通过电话拨叫****73738#,有提示后按1,设备发出杂音开始重置。

linksys spa3000

linksys spa3000

进阶部分
1)号码出局。
要拨叫的号码前加7.
文件freeswitch/conf/dialplan/default.xml,
添加





编辑文件 freeswitch/conf/sip_profiles/external/gw1.xml


运维命令
在freeswitch/bin下使用fs_cil客户端。启动后在“freeswitch@internal>”控制器下进行操作,基本命令如下。
reloadxml    修改完xml后加载使用
sofia profile external rescan reloadxml 配置网关生效
sofia status   显示当前sofia状态
status         显示当前状态
sofia status profile internal reg 显示当前注册上来的用户信息
/exit          退出

附录:
1)
号码说明
号码 | 说明
9664 | 保持音乐
9196 | echo,回音测试
9195 | echo,回音测试,延迟5秒
9197 | milliwatte extension,铃音生成
9198 | TGML 铃音生成示例
5000 | 示例IVR
4000 | 听取语音信箱
33xx | 电话会议,48K(其中xx可为00-99,下同)
32xx | 电话会议,32K
31xx | 电话会议,16K
30xx | 电话会议,8K
2000-2002 | 呼叫组
1000-1019 | 默认分机号
2)目录说明
bin         可执行程序
db          系统数据库(sqlite),FreeSWITCH 把呼叫信息存放到数据库里以便在查询时无需对核心数据结构加锁
htdocs      HTTP Web srver 根目录
lib         库文件
mod         可加载模块
run         运行目录,存放 PID
sounds      声音文件,使用 playback() 时默认的寻找路径
grammar     语法
include     头文件
log         日志,
CDR 等 recordings  录音,使用 record() 时默认的存放路径
scripts     嵌入式语言写的脚本,如使用 lua()、luarun()、jsrun 等默认寻找的路径
storage     语言留言(Voicemail)的录音
conf        配置文件部分
3)启动命令参数说明freeswitch
-core                  — 出错时进行内核转储
-rp                    — enable high(realtime) priority settings
-vg                    — 在 valgrind 下运行,调试内存泄露时使用
-nosql                 — 不使用 SQL,show channels 类的命令将不能显示结果
-heavy-timer           — 更精确的时钟。可能会更精确,但对系统要求更高
-nonat                 — 如果路由器支持 uPnP 或 NAT-PMP,则 FreeSWITCH
可以自动解决 NAT 穿越问题。如果路由器不支持,则该选项可以使启动更快
-nonatmap              — 停止穿私网记录
-nocal                 — 关闭时钟核准。FreeSWTICH 理想的运行环境是 1000 Hz 的内核时钟                           如果你的内核时钟小于 1000 Hz 或在虚拟机上,可以尝试关闭该选项
-nort                  — 关闭实时时钟
-stop                  — 停止freeswitch
-nc                    — 启动到后台模式,没有控制台
-c                     — 启动到控制台

4)端口说明,如有防火墙需要开放tcp、udp的5060端口。

5)FreeSwitch默认只支持音频,支持视频。 文件freeswitch/conf/vars.xml如下:


修改为