2012年3月

月影同学最近给kohana写了两个强大的插件,:jkit(JKit 是基于 Kohana 3.2 版本基础上开发的框架级插件)和kohana-python(可直接在php中无缝使用python中滴Class)。给感兴趣的同学演示下使用。
示例是一个上传图片到upyun的脚本
file:controller/a.php(用来接收和返回的客户端接口)
class Controller_A extends Controller {
    function before(){
        parent::before();
        $this->img = new Model_Logic_Imgs;
    }
        /*更新图片*/
    public function action_edit_img(){
        try {
            $upedFile = $this->img->edit_img($this->request->param());
        } catch(Exception $e){
            $this->err(null, $e->getMessage());
            return;
        }
        $this->ok($upedFile);
    }
}

file:logic/imgs.php(用来处理图片logic)
class Model_Logic_Imgs extends Logic{
        /*更新图片信息*/
    public function edit_img($data){
        if (!$data['pid']){
            throw new Exception('没有指定图片id');
            return;
        }
        $upedFile = $this->up_img($data['sourceurl']);
        if(!$upedFile){
            throw new Exception('图片上传到upyun未成功');
        }
        /*其他图片信息数据库信息更新等*/
                JKit::$log->info($objDb->last_query, $arrRes);
        return $upedFile['url'];                
    }
       /**
       *更无缝的调用python Class,
       *这样在controller或logic如有需要用到python中的Class只需要new一个Logic Class
       **/
        function __call($func, $args){
        $img_py_logic = new Model_Pylogic_Imgs;
        return call_user_func_array(array($img_py_logic, $func), $args);
    }
}

file:pylogic/imgs.py(需要用到的图片处理相关python)
import sys, os, MySQLdb, time, urllib, re, Image
import md5 as imd5
from upyun import UpYun

TMPFILE_DIR = '/tmp/weizoo-img-tmp/'
UPCONFIG = {
    'bucket' : 'some-img',
    'username' : 'ivershuo',
    'password' : '******'
}

def md5(src):
    m1 = imd5.new()
    m1.update(src)
    dest1 = m1.hexdigest() 
    return dest1

class Model_Pylogic_Imgs:
    def __init__(self) :
        self.conn = MySQLdb.connect(DBCONGIF['host'], DBCONGIF['user'], DBCONGIF['passwd'], DBCONGIF['dbname'])
    def up_img(self, sourceurl) :
        u = UpYun(UPCONFIG['bucket'], UPCONFIG['username'], UPCONFIG['password'])
        #按星期建立目录
        _dir = time.strftime('%y%U', time.localtime(time.time()))
        #获取文件后缀
        _r = re.compile('\.\w+$')
        filetype = _r.search(sourceurl).group()
        #下载到本地文件
        localfile = TMPFILE_DIR + str(int(time.time())) + filetype

        if not u.mkDir(_dir) :
            return False

        #img_file = urllib.urlopen(sourceurl, 'rb')
        os.popen('wget "' + sourceurl + '" -q -O ' + localfile)
        img_file = open(localfile, 'rb')
        bfile = img_file.read()

        #源文件md5之后取前16位作为文件名
        filename = md5(bfile)[0:16]
        #上传到upyun文件
        upfile = _dir + '/' + filename + filetype
            
        if not u.writeFile(upfile, bfile) :
            return False
        #获取图片平均色,by:@jerryqu
        rgb = self.rbg_img(localfile)
        ret_data = {'url':upfile,'rgb':rgb}

        os.remove(localfile)
        return ret_data

是不是很喜欢这种写法呢?若感兴趣,月影的博客上有更多的介绍

去年从公司拿了个被市场淘汰滴EZ Station玩,虽然配置很低,不过装个linux还是跑得动当开发机滴。
配好webserver,指定好WAN到LAN的转发规则之后,发现不知道为啥有些线路能访问到有些线路访问不到,当时也就木有去太去管他了。

今年将网络从山寨滴长城宽带换到电信10M光纤之后,电信送滴那个华为HG8240居然不支持WAN到LAN的转发了。前天将PPPoE换成自己的路由拨号之后就可以用了(具体方案我在文尾提出来),因为是动态ip滴,用ip访问终归不方便,虽然有花生壳等服务支持动态DNS解析,但是我又不想暴漏自己的ip,所以就用了使用nginx反向代理滴方式。
而由于ip是变动滴,所以更新起来也就麻烦点,于是用了一套简单的自动上报ip的方案,nginx机器收到ip变更通知再更新配置reload。具体就是如下几步:

  1. 先在路由做好内网ip的mac地址绑定,防止路由重启导致web机获取不同的内网ip
  2. 将需要启用外网服务的端口映射转发到web机。ps.很多运营商是禁止了80端口开放,所以可能需要使用其他端口
  3. 配置个自动上报的脚本(我这里有写一个简单的http://www.box.com/s/2138odhqa58qcjcad20s,前面的配置自己修改下)。可以使用定时任务来跑或者hack了路由器的可以直接在路由器上来实现该功能,重启触发就是。
  4. 在其他外网机器上配置ngxin(或其他可用作反向代理的服务),加上类似如下配置(具体规则根据自己需要修改):
    server{
            listen 80;
            #开放给外部访问的域名
            server_name xxx.ivershuo.com;
            location / {
                    #web机器的webserver地址
                    proxy_pass http://111.222.222.111:8964;
                    proxy_redirect off;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    }
  5. 将域名A记录到上面的nginx机器
  6. 跑个http服务来接受前面web机上报的ip,用脚本自动更新nginx配置ip部分,reload nginx配置使生效

该方案主要可以实现动态ip的域名绑定,并且可以实时生效,又避免了实际ip的暴漏,还可以绕过运营商对80端口的禁止。不过缺点就是流量要走两份,但是一般这个情况对我没太大影响,自己家里网络是包月的,vps流量也用不完

如果你也是用的坑爹的电信送的华为HG8240,接下来说下如何使用自己的路由代替HG8240做DHCP服务器。
首先我们要拿到telcomadmin账号,因为给的那个useradmin账号除开可以重启路由外啥功能都木有,真是坑爹。
先用root:admin(对滴,root密码就是这么sb)telnet到192.168.1.1,然后输入shell进入shell,在/mnt/jffs2/hw_ctree.xml这个文件中查找到“ telecomadmin”这串,应该看到密码了吧,然后用这个账号和密码登陆路由
接下来在“网络”页面拿到自己的上网账号和密码(此处需要用到firebug等工具),将internet服务用PPPoE桥接方式桥接到自己的路由器,然后取消HG8240的DHCP服务器功能,如此就将HG8240阉割到基本只有光纤转普通那啥网线的功能了。

用不同段的ip如192.168.2.1做为自己路由的ip,启用DHCP服务,用PPPoE拨号上网。刷新其他机器ip和dns,done!