icinga-web 安装

时间:2014-05-09 21:17:41   收藏:0   阅读:529

Icinga-web 安装

前段时间研究了会icinga和icinga-web,他是nagios的二次开发,支持中文汉化,国内对icinga-web的研究文档貌似比较少,这里就分享给大家



一.环境需求:

相关库: yum install –y libdbi-devel libdbi libdbi-drivers libdbi-dbd-mysql

yum install -y gcc glibc glibc-common gd gd-devel openssl-devel

yum install -y libjpeg libjpeg-devel libpng libpng-devel

yum install -y rsync vim wget curl git zip unzip mlocate make spawn-fcgi

(注释: libdbi libdbi-drivers 做数据的传输, libdbi-dbd-mysql用来连接数据库的如果不安装,ido2db进程将无

法启动,如果发现数据传不到数据库,有可能是这些地方的问题,一一排查)

相关安装包:icinga-cn-web-1.5.2.tar.bz2 gnosek-fcgiwrap-4b2151e.tar.gz

系统环境: centos 5.5*64

安装环境: LNMP

NMP: Nginx version: nginx-1.4.1

Mysql version: mysql-5.5.17

Php version: PHP 5.3.8

1).注意:php编译选项:

# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql\

--with-gd --with-zlib --with-xsl --with-ldap --with-gettext\

--with-pdo-mysql=/program2/mysql --enable-soap --with-xmlrpc

如果php已编译,可以选择动态拓展库的方法把缺少的动态添加进去:(列:动态拓展:soap)

# cd /download/php-5.3.1/ext/soap && /usr/local/php/bin/phpize

# ./configure --with-php-config=/usr/local/php/bin/php-config --with-soap

#make && make install

看看是否已存在soap.so :

# ll /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/soap.so

在/usr/local/php/lib/php.ini里加入extension=soap.so

重启php: # /etc/init.d/php-fpm restart

检测php是否已安装所需拓展脚本(需要先修改测试脚本的php路径):

# vim /usr/local/icinga_web/bin/testdeps.php

改成: #!/usr/local/php/bin/php

执行: # /usr/local/icinga_web/bin/testdeps.php

如果出现: All over result: PASS则表示成功,如果出现fail,则在输出中找到哪些库没有安装,

再用动态安装方法添加进去。

二.fcgiwrap的安装及配置:

1).安装fcgiwrap

# yum install fcgi-devel fcgi

# tar xvf gnosek-fcgiwrap-4b2151e.tar.gz

# cd gnosek-fcgiwrap-4b2151e

# ./configure --prefix=/usr/local/fcgiwrap

# make && make install

2).配置和启动fcgiwrap

fcgiwrap的作用是使得cgi程序像fastcgi程序一样在nginx上运行

创建fcgiwrap启动脚本:

# cp /etc/init.d/spawn-fcgi /etc/init.d/fcgiwrap

# vi /etc/init.d/fcgiwrap 修改下面红色字体的两项

exec="/usr/bin/spawn-fcgi"

prog="fcgiwrap"

config="/etc/sysconfig/fcgiwrap"

3). 创建fcgiwrap的配置文件

# mkdir -p /var/run/fcgiwrap

# chown -R icinga:icinga /var/run/fcgiwrap

# vim /etc/sysconfig/fcgiwrap

添加:

FCGI_SOCKET=/var/run/fcgiwrap/fcgiwrap.socket

FCGI_PROGRAM=/usr/local/fcgiwrap/sbin/fcgiwrap

FCGI_PIDFILE=/var/run/fcgiwrap/fcgiwrap.pid

FCGI_USER=icinga

FCGI_GROUP=icinga

FCGI_EXTRA_OPTIONS="-M 0600"

OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S

$FCGI_EXTRA_OPTIONS -F 1 -P $FCGI_PIDFILE -f $FCGI_PROGRAM"

启动fcgiwrap:

# /etc/init.d/fcgiwrap start

三.Icinga-web的安装及配置:

1).解压icinga-web 并进入安装目录下

# tar -jxvf icinga-cn-web-1.5.2.tar.bz2

# cd icinga-cn-web-1.5.2

# ./configure prefix=/usr/local/icinga-web --with-app-name=Icinga\

> --with-web-user=icinga --with-web-group=icinga\

> --with-api-cmd-file=/usr/local/icinga/var/rw/icinga.cmd

# make && make install

2).配置及启动IDOUtils

# cd /usr/local/icinga/etc && mv modules/idoutils.cfg-sample modules/idoutils.cfg

<1>创建数据库和用户

# mysql –u root -p

# CREATE DATABASE icinga DEFAULT CHARACTER SET utf8;

# GRANT USAGE ON icinga.* TO ‘icinga‘@‘localhost‘

IDENTIFIED BY ‘yourpassword‘

WITH MAX_QUERIES_PER_HOUR 0

MAX_CONNECTIONS_PER_HOUR 0

MAX_UPDATES_PER_HOUR 0;

# GRANT SELECT, INSERT, UPDATE, DELETE, DROP, CREATE VIEW, INDEX, EXECUTE ON

icinga.* TO ‘icinga‘@‘localhost‘;

# CREATE DATABASE icinga_web DEFAULT CHARACTER SET utf8;

# GRANT USAGE ON icinga_web.* TO ‘icinga_web‘@‘localhost‘

IDENTIFIED BY ‘yourpassword‘

WITH MAX_QUERIES_PER_HOUR 0

MAX_CONNECTIONS_PER_HOUR 0

MAX_UPDATES_PER_HOUR 0;

# GRANT SELECT, INSERT, UPDATE, DELETE, DROP, CREATE VIEW, INDEX, EXECUTE

ON icinga_web.* TO ‘icinga_web‘@‘localhost‘;

# FLUSH PRIVILEGES;

# quit

###MAX_QUERIES_PER_HOUR 0 每小时可以查询数据库的次数0代表不限制

###MAX_CONNECTIONS_PER_HOUR 0 每小时可以连接数据库的次数

###MAX_UPDATES_PER_HOUR 0 每小时可以修改数据库的次数

<2>导入数据库

# mysql -u root -p icinga <\

/usr/local/etc/icinga-cn-1.9.3/module/idoutils/db/mysql/mysql.sql

# mysql -u root -p icinga_web < /usr/local/icinga-web/etc/schema/mysql.sql

<3>数据库连接配置

# cd /usr/local/icinga-web

# vim app/config/databases.xml 修改icinga_web表的密码

<ae:parameter

name="dsn">mysql://icinga_web:yourpassword@localhost:3306/icinga_web</ae:parameter>

<!-- Generic credentials -->

<ae:parameter name="username">icinga_web</ae:parameter>

<ae:parameter name="password">yourpassword</ae:parameter>

<!-- DB encoding type -->

<ae:parameter name="charset">utf8</ae:parameter>

...

<database xmlns="http://agavi.org/agavi/config/parts/databases/1.0" name="icinga"

class="IcingaDoctrineDatabase">

<ae:parameter name="dsn">mysql://icinga:yourpassword@localhost:3306/icinga

</ae:parameter>

<!-- Must be removed for oracle databases -->

<ae:parameter name="prefix">icinga_utf8

<4>清理缓存

修改了配置文件后需要清理缓存

# ./bin/clearcache.sh

<5>配置ido2db.cfg

#vim /usr/local/icinga/etc/ido2db.cfg

db_socket=/tmp/mysql.sock #不开启并制定好mysql.sock的位置数据将不能导入数据库

db_host=localhost

db_port=3306

db_name=icinga

db_user=icinga

db_pass=yourpassword

3).启动ido2db: /etc/init.d/ido2db start

Ido2db进程一定要在icinga进程之前启动,不然会出现数据录不到数据库的情况,关闭icinga

进程之前最好先关闭ido2db,不然有时icinga启动会有问题

正确的重启方法为:

/etc/init.d/ido2db stop && /etc/init.d/icinga stop && /etc/init.d/ido2db start & /etc/init.d/icinga start

查看日志出现idomod: Successfully connected to data sink则表示数据库配置成功

如果有大量服务在监控,查看日志发现:

idomod: Successfully connected to data sink. 6081 items lost, 5000 queued …

修改# vim /usr/local/icinga/etc/idomod.cfg

output_buffer_items=50000 (这个值看需求)

这个值是应付数据过大导致丢失而建立的缓冲区,超量的数据会放进去慢慢写入icinga数据

库,如果值舍得太小容易导致数据的不准确

四.Nginx的配置:

查看是否icinga已经做好软连接,若无则:

# ln -s /usr/local/icinga/share /data/www/icinga

1).Nginx配置

# ln -s /usr/local/icinga-web/ /data/www/icinga-web

# vim /usr/local/nginx/conf/vhosts/icinga_web.conf

server {

listen 8088;

server_name localhost;

index index.php index.html index.htm;

root /data/www/icinga-web/icinga-web/pub;

error_log logs/icinga-web_error.log;

location = /favicon.ico {

log_not_found off;

access_log off;

expires max;

}

location = /robots.txt {

allow all;

log_not_found off;

access_log off;

}

# Deny all attempts to access hidden files such as .htaccess, .htpasswd

location ~ /\. {

deny all;

access_log off;

log_not_found off;

}

location /icinga-web/styles {

alias /data/www/icinga-web/icinga-web/pub/styles;

}

location /icinga-web/images {

alias /data/www/icinga-web/icinga-web/pub/images;

}

location /icinga-web/js {

alias /data/www/icinga-web/icinga-web/lib;

}

location /icinga-web/modules {

rewrite ^/icinga-web/(.*)$ /index.php?/$1 last;

}

location /icinga-web/web {

rewrite ^/icinga-web/(.*)$ /index.php?/$1 last;

}

location / {

root /data/www/icinga-web/icinga-web/pub;

index index.php;

location ~* ^/(robots.txt|static|images) {

break;

}

if ($uri !~ "^/(favicon.ico|robots.txt|static|index.php)") {

rewrite ^/([^?]*)$ /index.php?/$1 last;

}

}

location ~ \.php($|/) {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

# classic interface

location /icinga {

alias /data/www/icinga/share;

index index.html;

auth_basic "Icinga Access";

auth_basic_user_file /usr/local/icinga/etc/htpasswd.users;

}

location ~ \.cgi$ {

# define root directory for CGIs

root /usr/local/icinga/sbin;

rewrite ^/icinga/cgi-bin/(.*)\.cgi /$1.cgi break;

rewrite ^/cgi-bin/icinga/(.*)\.cgi /$1.cgi break;

include fastcgi_params;

fastcgi_pass unix:/var/run/fcgiwrap/fcgiwrap.socket;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

auth_basic "Icinga Access";

auth_basic_user_file /usr/local/icinga/etc/htpasswd.users;

fastcgi_param AUTH_USER $remote_user;

fastcgi_param REMOTE_USER $remote_user;

}

}

2).重启# nginx: /etc/init.d/nginx restart

可以登录http://ip:8088 查看,初始用户名和密码是root和password,请登录后修改

Icinga-web1.7在加载下图这个文件是会耗时很久,icinga-web1.5版本没有这个情况,如果实

在要用1.7版本,就需要使用google chrome等会缓存该文件的浏览器

五.Icinga-report的安装及配置:

默认安装需要PostgreSQL支持,速度较慢,采用Mysql,速度会快许多

1).准备工作

从icinga 1.8有一个提供一切所需的SLA信息的数据库功能。此功能需要附加到您现有

idoutils数据库的icinga报表。

下载icinga-report,我这里下载的是icinga-reports-1.9.0.tar.gz

# tar zxvf icinga-reports-1.9.0.tar.gz

# mysql –uroot –p icinga <\

/downloads/jasperserver/icinga-reports-1.9.0/db/icinga/mysql/availability.sql

2).tomcat的安装及配置

下载jdk6.0,我这里下载的是jdk-6u45-linux-x64.bin

# chomd 755 jdk-6u45-linux-x64.bin && ./jdk-6u45-linux-x64.bin

# mv jdk1.6.0_45/ /usr/local/jdk

下载tomcat, 我这里下载的是apache-tomcat-6.0.37.tar.gz

# tar zxvf apache-tomcat-6.0.37.tar.gz

# mv apache-tomcat-6.0.37 /usr/local/apache-tomcat

配置jdk环境

# vim /etc/profile

export PYTHON_EGG_CACHE=/tmp/.python-eggs

JAVA_HOME=/usr/local/jdk

CLASSPATH=.:$JAVA_HOME/lib/tools.jar

PATH=$JAVA_HOME/bin:$PATH

export JAVA_HOME CLASSPATH PATH

# source /etc/profile

监控机机器是16个cpu,16g内存配置,在catalina.sh脚本里添加下面红色的语句

(由于数据量较大,jasperserver出报告的时候会导致内存溢出,icinga进程也会卡死,所以,启

动使用报告功能前,务必确认tomcat的内存分配足够)

# vim /usr/local/apache-tomcat/bin/catalina.sh

if [ $have_tty -eq 1 ]; then

JAVA_OPTS="-Xms1024m -Xmx1024m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=512m

-XX:MaxNewSize=512m"

echo "Using CATALINA_BASE: $CATALINA_BASE"

# /usr/local/apache-tomcat/bin/catalina.sh start

如果http://ip:8080能显示tomcat的欢迎页面,则tomcat配置成功,如有问题,查看环境变量是

否正确配置,比如看看末尾是否多个空格符(当时我就在JAVA_HOME=/usr/local/jdk这条语

句末尾多加了个空格符,导致出问题)

#echo $JAVA_HOME && echo $ CLASSPATH && echo $ PATH

看看是否都能路径出现,若无,检查环境变量,修正后重新soure /etc/profile

3).jasperserver的安装及配置

5.0以上版本的jasperserver只支持1.9版本以上的icinga-report,不然在出部分报告是会出现

如下报错

由于jasperserver5.0的默认安装只支持postgresql以及tomcat,所以我们使用自定义安装包

安装(4.1版本的jasperserver默认安装版mysql5.1也只支持mysql5.1以前的版本)

到官网下载jasperserver自定义安装包:

http://sourceforge.net/projects/jasperserver/files/JasperServer/JasperServer%205.0.0/Ja

sperReports-Server-CP-Install-Guide.pdf

我这里下载的是jasperreports-server-cp-5.0.0-bin.zip

# cd /downloads/jasperserver && unzip jasperreports-server-cp-5.0.0-bin.zip

# mv jasperreports-server-cp-5.0.0-bin /usr/local/jasperreports-server

# cd /usr/local/jasperreports-server/buildomatic

# cp sample_conf/mysql_master.properties default_master.properties

# vim default_master.properties

appServerType = tomcat6

appServerDir = /usr/local/apache-tomcat

dbType=mysql

dbHost=localhost

dbUsername=root

dbPassword=数据库的root密码

dbPort=3306

自定义安装的jasperserver需要JDBC驱动,可使用yum下载或在已下好的icinga-report安装

包里面复制一个过去,我这里是直接从icing-report安装包里复制过去

# cp /downloads/jasperserver/icinga-reports-1.9.0/jsp-server/classes/connector/mysql-co\

nnector-java-5.1.18/mysql-connector-java-5.1.18-bin.jar conf_source/db/mysql/jdbc/

执行脚本前,先关闭tomcat,并确保mysql开启

# /usr/local/apache-tomcat/bin/catalina.sh stop

# ./js-install-ce.sh

如果之前安装了jasperserver的相同版本,可跳过建表的步骤(选择n),如果安装了不同版本的,

还需要覆盖原来的表(选择y),因为不同版本的表会导致jasperserver不能顺利运行

出现如图字样则表示jasperserver安装成功,开启tomcat

# /usr/local/apache-tomcat/bin/catalina.sh start

在浏览器输入http://ip:8080/jasperserver 如果看到登录页面,则安装完成

初始用户名和密码都是jasperadmin,请进入后修改

4).icinga-report的安装及配置

<1>先做好tomcat和mysql的软连接

# ln -s /usr/local/apache-tomcat /usr/local/jasperreports-server

# ln -s /usr/local/mysql /usr/local/jasperreports-server

<2>下载icinga-report,我这里下载的是icinga-reports-1.9.0

# cd /download/icinga-reports-1.9.0

# ./configure --with-jasper-server=/usr/local/jasperreports-server

# make && make install-mysql-connector

查看JDBC的驱动是否在tomcat的lib里

# ll /usr/local/apache-tomcat/lib/mysql-connector-java-5.1.18-bin.jar

存在的话重启tomcat

# /usr/local/apache-tomcat/bin/catalina.sh stop

# /usr/local/apache-tomcat/bin/catalina.sh start

# make install

出现下图字样则安装成功

<3>修改jasperserver工程文件的JDBC链接文件

由于jasperserver默认安装的是postgres数据库,所以工程里面的js.jdbc.properties文件还是

postgres的连接参数,直接删除该文件,新建一个mysql的连接文件,如下

# cd /usr/local/apache-tomcat/webapps/jasperserver/WEB-INF/

# vim js.jdbc.properties

# Property that determines the Hibernate dialect

metadata.hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect

# jasperserver repo db settings

metadata.jdbc.driverClassName=com.mysql.jdbc.Driver

metadata.jdbc.url=jdbc:mysql://localhost:3306/jasperserver_ce_410?useUnicode=true&a

mp;characterEncoding=UTF-8&amp;autoReconnect=true&amp;autoReconnectForPools=

true

metadata.jdbc.username=root

metadata.jdbc.password=EFUNFUN

metadata.jndi=jdbc/jasperserver

metadata.database.generate=true

# foodmart db settings

foodmart.jdbc.driverClassName=com.mysql.jdbc.Driver

foodmart.jdbc.url=jdbc:mysql://localhost:3306/foodmart?useUnicode=true&amp;character

Encoding=UTF-8&amp;autoReconnect=true&amp;autoReconnectForPools=true

foodmart.jdbc.username=root

foodmart.jdbc.password=EFUNFUN

foodmart.jndi=jdbc/foodmart

# sugarcrm db settings

sugarcrm.jdbc.driverClassName=com.mysql.jdbc.Driver

sugarcrm.jdbc.url=jdbc:mysql://localhost:3306/sugarcrm?useUnicode=true&amp;charact

erEncoding=UTF-8&amp;autoReconnect=true&amp;autoReconnectForPools=true

sugarcrm.jdbc.username=root

sugarcrm.jdbc.password=EFUNFUN

sugarcrm.jndi=jdbc/sugarcrm

# sugarcrm is also referenced as test in unit tests

test.jdbc.driverClassName=com.mysql.jdbc.Driver

test.jdbc.url=jdbc:mysql://localhost:3306/sugarcrm?useUnicode=true&amp;characterEnc

oding=UTF-8&amp;autoReconnect=true&amp;autoReconnectForPools=true

test.jdbc.username=root

test.jdbc.password=EFUNFUN

test.jndi=jdbc/sugarcrm

# flag used to skip some unit tests or to use uppercase schema files

test.databaseFlavor=mysql

test.createMinimalData=${test.set.createMinimalData}

foodmart.upperCaseNames=false

sugarcrm.upperCaseNames=false

# used to add parms to tomcat datasource: context.xml

# todo: still used?

datasource.extra.params=

<3>给予主机和服务初始值

启动icinga-web的报告功能还需要给予服务一个默认的初始值,不然出来的报告会不准确

报告功能是基于icinga的日志出报表的

# vim /usr/local/icinga/etc/icinga.cfg

将这个值设置为1,重启icinga

(注意服务较多时,icinga的进程基本都会卡死,所以让日志有了初始状态后,kill了icinga进程,

把参数重新设置为0,再重启,icinga进程会重新开始检测,icing-report的数据也会正常)

但是目前为止中文版的icinga及时给与了初始状态,经典版本里的可用性依旧不正常,只要服

务从开始检测一直都是正常的话,它的可用性数值一直都是未决

<4>报告功能的使用

重启tomcat,登录icinga-web页面选择报告功能,打开目录

如果此处出现列表死循环(icinga-web1.7之前的版本都会出现),查看tomcat错误日志会出现

[错误] Reports: Possible security hack, try accessing jasper server on

/icinga/reports/samples without matching root path

修改该文档/usr/local/icinga-web/app/modules/Reporting/config/module.xml

把Icinga改成icinga,重启tomcat,即可解决

报告里的Timeperiod选项需要自己填写,以下是timeperidos的参数

List of defined timeperiods:

* today => Today

* last24hours => Last 24 hours

* yesterday => Yesterday

* thisweek => This week

* last7days => Last 7 days

* lastweek => Last week

* thismonth => This month

* last31days => Last 31 days

* lastmonth => Last month (default)

* thisyear => This year

* lastyear => Last year

* custum => Custom period report

六.后期维护:

1).配置开机启动

配置开机自动启动进程

# vim /etc/rc.d/rc.local

#icinga and icinga-web start

/etc/init.d/ido2db start

/etc/init.d/fcgiwrap start

/etc/init.d/php-fpm start

/etc/init.d/nginx start

/etc/init.d/icinga start

#jasperserver start

/usr/local/apache-tomcat/bin/catalina.sh start

2).编写脚本

<1>编写检测icinga和ido2db进程运行情况的脚本如果进程异常自动重启icinga和ido2db进

程,并将脚本放入crontab里面一定时间执行一次

<2>编写启动icinga和ido2db进程脚本,由于启动顺序有讲究,编写reload脚本方便更新监控

<3>编写备份监控配置的操作,备份在本机以及测试用的虚拟机上,放入crontab里每天跑一

次,防止机器故障或者操作失误导致的配置文件丢失

3).配置文件重新规范

现有的配置文件命名,监控检测间隔等方面做的不够规范,需和爱君等人一起商量如何把监

控服务的配置文件重新规范,方便以后管理监控配置,以及优化监控系统

结合以前经验对监控服务分组级别的参考

<1>P1: 核心服务级别:

严重影响业务访问人数、盈利收入、公司品牌的对外服务

网络层面:

机房某线路出口断网(丢包接近100%);

机房某线路出口严重丢包,超过40%情况;

安全层面:

P1、P2级应用遭受攻击,大量敏感信息被窃取,且数据被破坏或篡改

<2>P2: 次核心服务级别:

网络层面:

机房某线路出口丢包率不超过40%情况,丢包情况间歇发生,且尚未对核心业务的使用

造成大面积影响;

办公网出口丢包或断网情况;

安全层面:

P1、P2 级应用遭受攻击,部分敏感信息被窃取,但数据未被破坏或篡改

<3>P3: 边缘服务级别:

机房之间同一运营商线路出现局部断网和丢包的情况

第三方合作服务

非关键服务遭受攻击,但信息未被窃取

<4>P4: 运维优化级别:

除特别注明外,所有磁盘空间监控点、应用日志告警

除特别注明外,所有服务中有负载均衡的主机级别监控告警(服务端口、cpu、内存、

连接数)

除特别注明外,网络设备的流量监控告警

这个监控级别可以通过修改监控服务图片来自定义,也能通过自定义变量来对级别进行分组

对配置文件添加”parents 名称”可以对状态图进行调整

4).Web版的报警显示时间与经典版显示时间相隔4到5分钟,不过上面的报警时长一致

不过这些不影响报警邮件或短信的发送时间

七.使用介绍:

http://icinga02.efunfun.tw/

1). 管理按钮

添加删除用户,用户分组查看日志,修改了xml配置也需要在这里的任务下点击清除按钮(或者

执行clearcache.sh脚本)

2). 用户修改自己的密码以及定义自己个性化的界面,以及退出用户按钮

3).自定义用户的cronk

<1>添加自定义的分类,修改位置的数字能对分类目录的上下位置进行调整

<2>对右边的标签右击,会出现保存cronk的选项,可以选择保存在自己设置的分类目录里

<3>设置里的标签滑块功能能让右边的标签按一定时间进行右移,该时间在用户首选项设置

4).右边标签栏的功能按钮

过滤按钮能对服务下面显示的条目进行筛选

5).右上角的这个图标能显示主机/服务的主动监测/被动监测数量;主机/服务的执行时间,主

机/服务的检测延迟

6).左上角的图标

<1>搜索功能

<2>服务的整体情况展示,最右边的是实例功能,1.5 版本暂时没有个功能的cronk,暂时忽略


本文出自 “坑爹霞老板” 博客,请务必保留此出处http://xiaoking.blog.51cto.com/4024863/1408898

icinga-web 安装,布布扣,bubuko.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!