Windows Live Messenger 2009正式版不能登陆完美解决方法

以下方法适用于windows 2003,因为msn 2009只能与独立包的方式安装。
Windows Live Messenger 2009正式版本终于出来了,很多朋友都下载安装,但是一些朋友发现安装了 Windows Live Messenger 2009后却无法进行登录,提示“登录Windows Live Messenger失败,因为服务暂时 不可用。请稍候再试。获取更多信息…错误代码: ”,这个是怎么回事呢?
其 实发生这个错误的原因是一些朋友在网上下载了独立MSN提取包版本进行安装的,因为这个提取包只包含了 Windows Live Messenger 2009,却缺少Windows Live Communications Platform,所以造成 无法登录的问题。

如果你按照提示操作后依然无法登陆,请装Windows Live Communications Platform(MSI)
下载地址:http://www.rayfile.com/files/3ba817e8-cb0d-11dd-9da9-0019d11a795f/

nagios插件check_squid报错的问题解决方法

http://workaround.org/squid/nagios-plugin/check_squid的脚本用来检测squid很好用,但有时会报错:

Parsing of undecoded UTF-8 will give garbage when decoding entities at /usr/lib/perl5/vendor_perl/5.8.5/LWP/Protocol.pm line 114.

原因是:
HTML::HeadParser模块在使用parse()方法时,对没有编码的UTF-8会弄混,要保证在传值之前进行适当的编码。
参考:http://www.xinjiezuo.com/blog/?p=43

解决方式是加入一行:

$ua->parse_head(0);

跳过去就好了。

下面是改过后的check_squid.

#!/usr/bin/perl -w
#
# check_squid – Nagios check plugin for testing a Squid proxy
#
# Christoph Haas (email@christoph-haas.de)
# License: GPL 2
#
# V0.2
#

use LWP::UserAgent;
use HTTP::Request::Common qw(POST GET);
use HTTP::Headers;
use strict;

my ($url, $urluser, $urlpass, $proxy, $proxyport,
        $proxyuser, $proxypass, $expectstatus) = @ARGV;

unless ($url && $proxy && $expectstatus)
{
        print "Usage: url urluser urlpass proxy proxyport proxyuser proxypass expectstatusn";
                                print " url       -> The URL to check on the internet (http://www.google.com)n";
                                print " urluser   -> Username if the web site required authentication (- = none)n";
                                print " urlpass   -> Password if the web site required authentication (- = none)n";
                                print " proxy     -> Server that squid runs on (proxy.mydomain)n";
                                print " proxyport -> TCP port that Squid listens on (3128)n";
                                print " proxyuser -> Username if the web site required authentication (- = none)n";
                                print " proxypass -> Password if the web site required authentication (- = none)n";
                                print " expectstatus -> HTTP code that should be returnedn";
                                print "                  (2 = anything that begins with 2)n";
        exit -1;
}

$urluser=” if $urluser eq ‘-‘;
$urlpass=” if $urlpass eq ‘-‘;
$proxyuser=” if $proxyuser eq ‘-‘;
$proxypass=” if $proxypass eq ‘-‘;

my $ua = new LWP::UserAgent;
$ua->parse_head(0); //加入这行就好了

my $h = HTTP::Headers->new();

if ($proxy)
{
        $ua->proxy([‘http’, ‘ftp’], "http://$proxy:$proxyport");

        if ($proxyuser)
        {
                $h->proxy_authorization_basic($proxyuser,$proxypass);
        }
}

if ($urluser)
{
        $h->authorization_basic($urluser, $urlpass);
}

my $req = HTTP::Request->new(‘GET’, $url, $h);

my $res = $ua->request($req);

if ($res->status_line =~ /^$expectstatus/)
{
        print "OK – Status: ".$res->status_line."n";
        exit 0;
}
else
{
        print "WARNING – Status: ".$res->status_line." (but expected $expectstatus…)n";
        exit 1;
}

nagios配置文件的关系和理解

Nagios能实现的具体的功能正是通过配置文件来表现的。而这些配置文件之间有着千丝万缕的关系。比如services依赖于host,timeperiod和contactgroup等。       Nagios.cfg这是nagios的主配置文件,它主要负责管理其他所有跟nagios有关的文件。他定义了nagios的日志文件,缓冲文件,状态信息存放文件等。还有其他所有的配置文件等。这些主要的配置文件如下:1.        hosts.cfgdefine host{host_name                                 #这一项是用来定义标识主机的名字。我们用这个名字在host group和service里标识这个主机。一个主机能定义多个服务。使用适当时,宏$HOSTNAME$里存放了这一项的值。alias                                          #这一项用来定义主机的一个完整名字或描述。主要是和使你能理容易的标识一个主机。使用适当时,宏$HOSTALIAS$里存放了这一项的值。address                                    #这一项是用来定义主机的地址。一般而言是主机的IP。当然,你也能够使用一个FQDN来标识你的主机,在没有可访问DNS服务器服务的情况下这种方法会引起问题。使用适当时,宏$ HOSTADDRESS $里存放了这一项的值。max_check_attempts                  #这一项用来定义在检测返回结果不是OK时,nagios重试检测命令的次数。设置这个值为1会导致nagios一次也不重试就报警。check_period                            #这一项用一个time period项的名字来定义在哪段时间内激活对这台主机的主动检测。time period是定义在别的文件里的配置项,我们可以在这里用名字来引用她。contact_groups                          #这是一个联系组列表。我们用联系组的名字来引用她们。多个联系组间用“,”来分隔。notification_interval                     #这一项用来定义当一个服务仍然down或unreachable时,我们间隔多久重发一次通知给联系组。notification_period                      #这一项用一个time period定义来标识什么时间段内给联系组送通知。这里我们用time period定义的名字来引用她。notification_options                   #这一项用来决定发送通知的时机。选项有:d = 当有down状态时发送通知,u = 当有unreachable状态时发送通知, r = 当有服务recoveries时发送通知,f = 当主机启动或停机时发送通知。如果你给一个n选项,那么永远不会发送通知。            }2.        hostgroups.cfgdefine hostgroup{               hostgroup_name                          #主机组名称,通常定义得较短                alias                                          #主机组别名,通常定义得较长               members                                    #主机组成员              }3.        services.cfgdefine service{               host_name                                  #主机名称               service_description                      #服务描述               check_command                         #执行命令       max_check_attempts                   #最大失败尝试次数,值为1时只报警不重新检测                            normal_check_interval                 #常规检测间隔时间,默认为60分钟                                                                             (常规检测是指无论服务状态是否正常,检测次数达到“最大次数”时)                            retry_check_interval                    #失败尝试间隔时间,默认为60分钟                                                                             (失败尝试是指服务状态不正常,检查次数达到“最大次数”时)               check_period                              #检测时间段               notification_interval                     #当服务状态不正常时通知联系人的间隔时间,值为0时不通知联系人notification_period                       #通知联系人时间段               notification_options                     #通知联系人选项,w警告,u未知,c危急,f启动和停止,n不发送通知               contact_groups                           #联系人组              }4.        servicegroups.cfgdefine servicegroup{               servicegroup_name                      #服务组名称,通常定义得较短                       alias                                #服务组别名,通常定义得较长               members                          #服务组成员              }5.        contacts.cfgdefine contact{contact_name                             #这个指令用来定义一个联系人的简称。他会在定义contactgroup时被引用到。在相应的环境中,宏定义$CONTACTNAME$会包含这个值。alias                                           #这个指令是为了定义一个联系人的具体的描述。在相应的环境中,宏定义$CONTACTALIAS$会包含这个值。host_notification_period               #这个指令是为了定义,能够通知Contact中定义的那个简称联系人,关于主机有问题或者恢复正常状态的时间段。你可以把他想象成能够通知Contact关于主机的在线时间。service_notification_period                  #这个指令是为了定义,能够通知Contact中定义的那个简称联系人,关于服务的问题或恢复正常的时间段。host_notification_options                     #这个指令为了定义主机在什么状态下会给联系人发通知。各个参数的描述如下:d=当主机的状态处于down时,发送通知;f=当主机状态处于stop时发送通知。r=当主机恢复up状态时发送通知。n=什么状态下都不发送通知。service_notification_options                 #这个指令为了定义服务在什么状态下会给联系人发通知。各个参数的描述如下:w=当服务处于警告状态时发送通知 u=当服务的状态处于unknown时,发送通知;f=当服务状态处于启动和停止时发送通知。c=当服务处于Critical状态时发送通知。n=什么状态下都不发送通知。host_notification_commands               #这个指令是为了定义一个通知联系人关于主机问题或恢复正常的联系手段的一个列表。多个手段之间用逗号隔开。service_notification_commands    #这个指令是为了定义一个通知联系人关于服务问题或恢复正常的联系手段的一个列表。多个手段之间用逗号隔开。email                                                 #这个指令是为了定义联系人的email地址。这个将取决于你是如何定义你的notification commands.它可以用来给联系人发送紧急邮件。在相应的环境中。宏定义$CONTACTEMAIL$将会包含它的值。}6.        contactgroups.cfgdefine contactgroup{               contactgroup_name                            #联系组名称,通常定义得较短               alias                                #联系组别名,通常定义得较长               members                          #联系组成员              } 7.        timeperiods.cfgdefine timeperiod{               timeperiod_name                         #时间段名称,通常定义得较短               alias                                           #时间段别名,通常定义得较长               sunday                                       #星期日时间段               monday                                      #星期一时间段               tuesday                                      #星期二时间段               wednesday                                 #星期三时间段               thursday                                     #星期四时间段               friday                                         #星期五时间段               saturday                                     #星期六时间段            }8.        commands.cfg        define command{           command_name       #定义命令的简称           command_line       #定义当服务进行时Nagios要执行的动作。在命令执行以前,所有合法的宏都要被他们的值代替。           }

squid 清缓存脚本(转)

#!/bin/sh

#cache_clean.sh swf
#cache_clean.sh sina.com.cn
#cache_clean.sh zhangyan.jpg

squidcache_path="/usr/local/squid/var/cache"
squidclient_path="/usr/local/squid/bin/squidclient"
grep -a -r $1 $squidcache_path/* | strings | grep "http:" | awk -F’http:’ ‘{print "http:"$2;}’ > cache_list.txt
for url in `cat cache_list.txt`; do
echo "$squidclient_path -m PURGE -p 80 $url"
$squidclient_path -m PURGE -p 80 $url
done

用法:

#cache_clean.sh swf

#cache_clean.sh sina.com.cn

#cache_clean.sh zhangyan.jpg

Nagios 配置(转)

主配置文件 nagios.cfg 需要更改的地方:
#cfg_file=/usr/local/nagios/etc/objects/localhost.cfg
interval_length=1 ; 间隔时间基准由 60s 改为 1s
command_check_interval=10s ; 命令检查时间间隔,-1 表示尽可能频繁的进行检查
date_format=iso8601 ; 日期格式

objects/contacts.cfg 用来定义联系人:

define contact {
contact_name sa
alias System Administrator
service_notification_period 24×7
host_notification_period 24×7
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands notify-service-by-email
host_notification_commands notify-host-by-email
email admin@test.com
}

再定义联系人组

define contactgroup {
contactgroup_name admins
alias Administrator Group
members sa ; 添加其它联系人用 "," 分隔
}

主机监控的配置

define host {
host_name host_name ; 简短的主机名称。
alias alias ; 别名,可以更详细的说明主机。
address address ; IP 地址,也可以写主机名。如果不定义这个值, nagio 将会用 host_name 去寻找主机。
parents host_names ; 上一节点的名称,也就是指从 nagios 服务器到被监控主机之间经过的节点,可以是路由器、交换机、主机等等。
hostgroups hostgroup_names ; 简短的主机组名称。
check_command command_name ; 检查命令的简短名称,如果此项留空, nagios 将不会去判断主机是否 alive 。
max_check_attempts 整数 ; 当检查命令的返回值不是 "OK" 时,重试的次数。
check_interval 数字 ; 循环检查的间隔时间。
active_checks_enabled [0/1] ; 是否启用 "active_checks"
passive_checks_enabled [0/1] ; 是否启用 "passive_checks" ,及“被动检查”
check_period timeperiod_name ; 检测时间段简短名称,这只是个名称,具体的时间段要写在其他的配置文件中。
obsess_over_host [0/1] ; 是否启用主机操作系统探测。
check_freshness [0/1] ; 是否启用 freshness 检查。freshness 检查是对于启用被动检查模式的主机而言的,其作用是定期检查主机报告的状态信息,如果该状态信息已经过期,freshness 将会强制做主机检查。
freshness_threshold 数字 ; fressness 的临界值,单位为秒。 如果定义为 "0" ,则为自动定义。
event_handler command_name ; 当主机发生状态改变时,采用的处理命令的简短的名字(可以在 commands.cfg 中对其定义)
event_handler_enabled [0/1] ; 是否启用 event_handler
low_flap_threshold 数字 ; 抖动的下限值。抖动,即在一段时间内,主机(或服务)的状态值频繁的发生变化。
high_flap_threshold 数字 ; 抖动的上限值。
flap_detection_enabled [0/1] ; 是否启用抖动检查。
process_perf_data [0/1] ; 是否启用 processing of performance data
retain_status_information [0/1] ; 程序重启时,是否保持主机状态相关的信息。
retain_nonstatus_information [0/1] ; 程序重启时,是否保持主机状态无关的信息。
contact_groups contact_groups ; 联系人组,在此组中的联系人都会收到主机的提醒信息。
notification_interval 整数 ; 重复发送提醒信息的最短间隔时间。默认间隔时间是 "60" 分钟。如果这个值设置为 "0" ,将不会发送重复提醒。
notification_period timeperiod_name ; 发送提醒的时间段。非常重要的主机(服务)定义为 24×7 ,一般的主机(服务)就定义为上班时间。如果不在定义的时间段内,无论发生什么问题,都不会发送提醒。
notification_options [d,u,r,f] ; 发送提醒包括的情况: d = 状态为 DOWN , u = 状态为 UNREACHABLE , r = 状态恢复为 OK , f = flapping
notifications_enabled [0/1] ; 是否开启提醒功能。"1" 为开启,"0" 为禁用。一般,这个选项会在主配置文件 (nagios.cfg) 中定义,效果相同。
stalking_options [o,d,u] ; 持续状态检测参数,o = 持续的 UP 状态 , d = 持续的 DOWN 状态 , u = 持续的 UNREACHABLE 状态
}

服务监控的配置

define service {
host_name host_name
service_description service_description
servicegroups servicegroup_names
is_volatile [0/1]
check_command command_name
max_check_attempts
normal_check_interval
retry_check_interval
active_checks_enabled [0/1]
passive_checks_enabled [0/1]
check_period timeperiod_name
parallelize_check [0/1]
obsess_over_service [0/1]
check_freshness [0/1]
freshness_threshold
event_handler command_name
event_handler_enabled [0/1]
low_flap_threshold
high_flap_threshold
flap_detection_enabled [0/1]
process_perf_data [0/1]
retain_status_information [0/1]
retain_nonstatus_information [0/1]
notification_interval
notification_period timeperiod_name n
otification_options [w,u,c,r,f]
notifications_enabled [0/1]
contact_groups contact_groups
stalking_options [o,w,u,c]
}

服务监控的配置和主机监控的配置较为相似,就不一一说明了。

间隔时间的计算方法为:
normal_check_interval x interval_length 秒
retry_check_interval x interval_length 秒
notification_interval x interval_length 秒

主机监控配置的例子

define host {
host_name web1
alias web1
address 192.168.0.101
contact_groups admins
check_command check-host-alive
max_check_attempts 5
notification_interval 0
notification_period 24×7
notification_options d,u,r
}

对主机 web1 进行 24×7 的监控,默认会每 10 秒检查一次状态,累计五次失败就发送提醒,并且不再重复发送提醒。

服务监控配置的例子

define service {
host_name web1
service_description check_http
check_period 24×7
max_check_attempts 3
normal_check_interval 30
contact_groups admins
retry_check_interval 15
notification_interval 3600
notification_period 24×7
notification_options w,u,c,r
check_command check_http
}

配置解释: 24×7 监控 web1 主机上的 HTTP 服务,检查间隔为 30 秒, 检查失败后每 15 秒再进行一次检查,累计三次失败就认定是故障并发送提醒。
联系人组是 admins 。提醒后恢复到 30 秒一次的 normal_check_interval 检查。如果服务仍然没有被恢复,每个小时发送一次提醒。

如果要检测其他服务,例如,要检查 ssh 服务是否开启,更改如下两行:
service_description check_ssh
check_command check_ssh

为方便管理,对配置文件的分布做了如下修改:
nagios.cfg 中增加了:
cfg_dir=/usr/local/nagios/etc/hosts
cfg_dir=/usr/local/nagios/etc/services

在 hosts 目录中,为不同类型的主机创建了配置文件,如: app.cfg cache.cfg mysql.cfg web.cfg
并创建了 hostgroup.cfg 文件对主机进行分组,如:

define hostgroup {
hostgroup_name app-hosts
alias APP Hosts
members app1,app2
}

在 services 目录中创建了各种服务的配置文件,如: disk.cfg http.cfg load.cfg mysql.cfg
并创建了 servicegroup.cfg 文件对服务进行分组,如:

define servicegroup {
servicegroup_name disk
alias DISK
members cache1,check_disk,cache2,check_disk
}

perl邮件群发脚本(V0.3版)

#!/usr/bin/perl -w
#
######################################################################################################
#requirement:
#rpm -ivh http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
#yum -y install perl-Authen-SASL perl-MIME-Base64 perl-DBI
#
#脚本功能: 邮件群发脚本
#
#作    者: Luo Hui(farmer.luo at gmail.com)
#最后时间: 2008.12.05
#版    本:Ver 0.3
#
#版本历史:
#0.3(2008.12.05):1)更新发送机制,更新为每发次一封邮件重新连一次SMTP服务器
#
#0.2(2008.12.02):1)更新由脚本自动到数据库内取邮件地址,不再从文件文件中取.
#                2)邮件内容文件由脚本参数设定,方便使用
#
#0.1(2008.12.01):1)初始版本
#
#######################################################################################################

use strict;
use warnings;
use DBI();
use File::Basename;
use MIME::Base64;
use Net::SMTP;

#发送服务器
my $smtp_server = ‘mail.test.com’;
#认证用户名
my $username = ‘service@test.com’;
#认证密码
my $password = ‘test’;
#发件人
my $from_mail = ‘service@test.com’;
#查询邮件地址的sql语句
my $strsql = "SELECT email FROM `uc_members` ";
#邮件主题
my $subject = encode_base64( ‘每日内容精选’, "" );

my $argvnum = @ARGV;
die "Usage:n" , basename( $0 ) , " Mail Body File n" unless ( $argvnum >= 1 );

my $mailfile = $ARGV[0];

if ( ! -e $mailfile ) {
    print "mail body file no exists!n";
    exit(1);
}

#连接数据库的资料可在这改
my $dbh = DBI->connect( "DBI:mysql:database=ucenter;host=10.1.1.1",
                        "root", "test",
                        {‘RaiseError’ => 1} );
                       
my $sth = $dbh->prepare( $strsql );
$sth->execute();
my $email = $sth->fetchall_arrayref or die "$sth->errstrn";
$sth->finish();

my ( $i, @to_mails );

for $i ( 0 .. $#{$email} ) {
    #print $email->[$i][0];
    push( @to_mails , $email->[$i][0] );
}

open(FHMF, $mailfile) or die "$!";
local($/) = undef;
my $mail_body = <FHMF>;
close( FHMF );
$/ = "n";

$mail_body = encode_base64( $mail_body );

$i = 0;
foreach my $to_mail( @to_mails )
{
    my $smtp = Net::SMTP -> new( Host => $smtp_server,
    #            Debug => 1,
                Hello => $smtp_server,
                ) || die "Can’t connect $smtp_server $!n";
   
    $smtp -> auth( $username, $password ) || die "Can’t authenticate: $!n";

    chomp($to_mail);
    $smtp -> mail( $from_mail );
    $smtp -> to( $to_mail );
    $smtp -> data( );

    # send mail head
    $smtp -> datasend( "From: $from_mailn" );
    $smtp -> datasend( "To: $to_mailn" );
    $smtp -> datasend( "MIME-Version: 1.0 n" );
    $smtp -> datasend( "Content-Type: text/html; charset=gb2312 n" );
    $smtp -> datasend( "Content-Transfer-Encoding: base64n" );
    $smtp -> datasend( "Subject: =?gb2312?B?$subject?=nn");
   
    # send mail body
    $smtp -> datasend( $mail_body );
    $smtp -> dataend();

    $i++;
    print "send mail:$i mail to:$to_mailn";
   
    $smtp -> quit();
}

java版3des加密程序,可与php兼容

代码:

import java.io.UnsupportedEncodingException;
import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class DESCoder
{
    private static BASE64Encoder base64 = new BASE64Encoder();
    private static byte[] myIV = { 50, 51, 52, 53, 54, 55, 56, 57 };
    //private static String strkey = "W9qPIzjaVGKUp7CKRk/qpCkg/SCMkQRu"; // 字节数必须是8的倍数
    private static String strkey = "01234567890123456789012345678912";
    public static String desEncrypt(String input) throws Exception
    {
       
        BASE64Decoder base64d = new BASE64Decoder();
        DESedeKeySpec p8ksp = null;
        p8ksp = new DESedeKeySpec(base64d.decodeBuffer(strkey));
        Key key = null;
        key = SecretKeyFactory.getInstance("DESede").generateSecret(p8ksp);
       
        input = padding(input);
        byte[] plainBytes = (byte[])null;
        Cipher cipher = null;
        byte[] cipherText = (byte[])null;
       
        plainBytes = input.getBytes("UTF8");
        cipher = Cipher.getInstance("DESede/CBC/NoPadding");
        SecretKeySpec myKey = new SecretKeySpec(key.getEncoded(), "DESede");
        IvParameterSpec ivspec = new IvParameterSpec(myIV);
        cipher.init(1, myKey, ivspec);
        cipherText = cipher.doFinal(plainBytes);
        return removeBR(base64.encode(cipherText));
       
    }
    
    public static String desDecrypt(String cipherText) throws Exception
    {
       
        BASE64Decoder base64d = new BASE64Decoder();
        DESedeKeySpec p8ksp = null;
        p8ksp = new DESedeKeySpec(base64d.decodeBuffer(strkey));
        Key key = null;
        key = SecretKeyFactory.getInstance("DESede").generateSecret(p8ksp);
       
        Cipher cipher = null;
        byte[] inPut = base64d.decodeBuffer(cipherText);
        cipher = Cipher.getInstance("DESede/CBC/NoPadding");
        SecretKeySpec myKey = new SecretKeySpec(key.getEncoded(), "DESede");
        IvParameterSpec ivspec = new IvParameterSpec(myIV);
        cipher.init(2, myKey, ivspec);
        byte[] output = removePadding(cipher.doFinal(inPut));

        return new String(output, "UTF8");
       
    }
    
    private static String removeBR(String str) {
        StringBuffer sf = new StringBuffer(str);

        for (int i = 0; i < sf.length(); ++i)
        {
          if (sf.charAt(i) == ‘n’)
          {
            sf = sf.deleteCharAt(i);
          }
        }
        for (int i = 0; i < sf.length(); ++i)
          if (sf.charAt(i) == ‘r’)
          {
            sf = sf.deleteCharAt(i);
          }

        return sf.toString();
      }

      public static String padding(String str)
      {
        byte[] oldByteArray;
        try
        {
            oldByteArray = str.getBytes("UTF8");
            int numberToPad = 8 – oldByteArray.length % 8;
            byte[] newByteArray = new byte[oldByteArray.length + numberToPad];
            System.arraycopy(oldByteArray, 0, newByteArray, 0, oldByteArray.length);
            for (int i = oldByteArray.length; i < newByteArray.length; ++i)
            {
                newByteArray[i] = 0;
            }
            return new String(newByteArray, "UTF8");
        }
        catch (UnsupportedEncodingException e)
        {
            System.out.println("Crypter.padding UnsupportedEncodingException");
        }
        return null;
      }
      public static byte[] removePadding(byte[] oldByteArray)
      {
        int numberPaded = 0;
        for (int i = oldByteArray.length; i >= 0; –i)
        {
          if (oldByteArray[(i – 1)] != 0)
          {
            numberPaded = oldByteArray.length – i;
            break;
          }
        }

        byte[] newByteArray = new byte[oldByteArray.length – numberPaded];
        System.arraycopy(oldByteArray, 0, newByteArray, 0, newByteArray.length);

        return newByteArray;
      }
     
    public static void main(String args[])
    {
        try {
            String desstr = DESCoder.desEncrypt("1qaz2ws");
            String pstr = DESCoder.desDecrypt(desstr);
            System.out.println("plainText:1qaz2ws");
            System.out.println("Encode:"+desstr);
            System.out.println("Decode:"+pstr);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:
plainText:1qaz2ws
Encode:0GsXgYA8BuM=
Decode:1qaz2ws

和PHP的一样,呵呵。

PHP版3DES加解密类,可与java的3DES(DESede)加密方式兼容

<?php

/**
*
* PHP版3DES加解密类
*
* 可与java的3DES(DESede)加密方式兼容
*
* @Author: Luo Hui (farmer.luo at gmail.com)
*
* @version: V0.1 2008.12.04
*
*/

class Crypt3Des
{   
    public $key    = "01234567890123456789012345678912";
    public $iv    = "23456789"; //like java: private static byte[] myIV = { 50, 51, 52, 53, 54, 55, 56, 57 };
   
    //加密
    public function encrypt($input)
    {
        $input = $this->padding( $input );
        $key = base64_decode($this->key);
        $td = mcrypt_module_open( MCRYPT_3DES, ”, MCRYPT_MODE_CBC, ”);
        //使用MCRYPT_3DES算法,cbc模式
        mcrypt_generic_init($td, $key, $this->iv);
        //初始处理
        $data = mcrypt_generic($td, $input);
        //加密
        mcrypt_generic_deinit($td);
        //结束
        mcrypt_module_close($td);
        $data = $this->removeBR(base64_encode($data));
        return $data;
    }
   
    //解密
    public function decrypt($encrypted)
    {
        $encrypted = base64_decode($encrypted);
        $key = base64_decode($this->key);
        $td = mcrypt_module_open( MCRYPT_3DES,”,MCRYPT_MODE_CBC,”);
        //使用MCRYPT_3DES算法,cbc模式
        mcrypt_generic_init($td, $key, $this->iv);
        //初始处理
        $decrypted = mdecrypt_generic($td, $encrypted);
        //解密
        mcrypt_generic_deinit($td);
        //结束
        mcrypt_module_close($td);
        $decrypted = $this->removePadding($decrypted);
        return $decrypted;
    }
   
    //填充密码,填充至8的倍数
    public function padding( $str )
    {
        $len = 8 – strlen( $str ) % 8;
        for ( $i = 0; $i < $len; $i++ )
        {
            $str .= chr( 0 );
        }
        return $str ;
    }
   
    //删除填充符
    public function removePadding( $str )
    {
        $len = strlen( $str );
        $newstr = "";
        $str = str_split($str);
        for ($i = 0; $i < $len; $i++ )
        {
            if ($str[$i] != chr( 0 ))
            {
                $newstr .= $str[$i];
            }
        }
        return $newstr;
    }
   
    //删除回车和换行
    public function removeBR( $str )
    {
        $len = strlen( $str );
        $newstr = "";
        $str = str_split($str);
        for ($i = 0; $i < $len; $i++ )
        {
            if ($str[$i] != ‘n’ and $str[$i] != ‘r’)
            {
                $newstr .= $str[$i];
            }
        }
   
        return $newstr;
    }

}

//test
$input = "1qaz2ws";
echo "plainText:" . $input."<br/>";
$crypt = new Crypt3Des();
echo "Encode:".$crypt->encrypt($input)."<br/>";
echo "Decode:".$crypt->decrypt($crypt->encrypt($input));
?>

结果:

plainText:1qaz2ws
Encode:0GsXgYA8BuM=
Decode:1qaz2ws

linux 内核调整相关参数

  net.ipv4.tcp_syncookies = 1
表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse = 1
表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1
表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_fin_timeout = 30
表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

net.ipv4.tcp_keepalive_time = 1200
表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。

net.ipv4.ip_local_port_range = 1024 ? ?65000
表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。

net.ipv4.tcp_max_syn_backlog = 8192
表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_tw_buckets = 5000
表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

$ /proc/sys/net/core/wmem_max
最大socket写buffer,可参考的优化值:873200

$ /proc/sys/net/core/rmem_max
最大socket读buffer,可参考的优化值:873200

$ /proc/sys/net/ipv4/tcp_wmem
TCP写buffer,可参考的优化值: 8192 436600 873200

$ /proc/sys/net/ipv4/tcp_rmem
TCP读buffer,可参考的优化值: 32768 436600 873200

$ /proc/sys/net/ipv4/tcp_mem
同样有3个值,意思是:
net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力.
net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段.
net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket.
上述内存单位是页,而不是字节.
可参考的优化值是:786432 1048576 1572864

$ /proc/sys/net/core/netdev_max_backlog
进入包的最大设备队列.默认是300,对重负载服务器而言,该值太低,可调整到1000.

$ /proc/sys/net/core/somaxconn
listen()的默认参数,挂起请求的最大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能.
可调整到256.

$ /proc/sys/net/core/optmem_max
socket buffer的最大初始化值,默认10K.

$ /proc/sys/net/ipv4/tcp_max_syn_backlog
进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.
可调整到2048.

$ /proc/sys/net/ipv4/tcp_retries2
TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源.

$ /proc/sys/net/ipv4/tcp_keepalive_time
$ /proc/sys/net/ipv4/tcp_keepalive_intvl
$ /proc/sys/net/ipv4/tcp_keepalive_probes
这3个参数与TCP KeepAlive有关.默认值是:

tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds

意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效.对服务器而言,显然上述值太大. 可调整到:

/proc/sys/net/ipv4/tcp_keepalive_time 1800
/proc/sys/net/ipv4/tcp_keepalive_intvl 30
/proc/sys/net/ipv4/tcp_keepalive_probes 3

$ proc/sys/net/ipv4/ip_local_port_range
指定端口范围的一个配置,默认是32768 61000,已够大

perl邮件群发脚本(V0.2从数据库内取邮件地址版)

#!/usr/bin/perl -w
#
######################################################################################################
#requirement:
#rpm -ivh http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
#yum -y install perl-Authen-SASL perl-MIME-Base64 perl-DBI
#
#脚本功能: 邮件群发脚本
#
#作    者: Luo Hui(farmer.luo at gmail.com)
#最后时间: 2008.12.02
#版    本:Ver 0.2
#
#版本历史:
#0.2(2008.12.02):1)更新由脚本自动到数据库内取邮件地址,不再从文件文件中取.
#                2)邮件内容文件由脚本参数设定,方便使用
#
#0.1(2008.12.01):1)初始版本
#
#######################################################################################################

use strict;
use warnings;
use DBI();
use File::Basename;
use MIME::Base64;
use Net::SMTP;

#发送服务器
my $smtp_server = ‘mail.test.com’;
#认证用户名
my $username = ‘service@test.com’;
#认证密码
my $password = ‘test’;
#发件人
my $from_mail = ‘service@test.com’;
#查询邮件地址的sql语句
#my $strsql = "SELECT email FROM `uc_members` WHERE username = ‘farmerluo’ LIMIT 0 , 30 ";
my $strsql = "SELECT email FROM `uc_members`";
#邮件主题
my $subject = encode_base64( ‘每日内容精选’, ‘ ‘ );

my $argvnum = @ARGV;
die "Usage:n" , basename( $0 ) , " Mail Body File n" unless ( $argvnum >= 1 );

my $mailfile = $ARGV[0];

if ( ! -e $mailfile ) {
    print "mail body file no exists!n";
    exit(1);
}

#连接数据库的资料可在这改
my $dbh = DBI->connect( "DBI:mysql:database=ucenter;host=10.11.0.1",
                        "root", "test",
                        {‘RaiseError’ => 1} );
                       
my $sth = $dbh->prepare( $strsql );
$sth->execute();
my $email = $sth->fetchall_arrayref or die "$sth->errstrn";
$sth->finish();

my ( $i, @to_mails );

for $i ( 0 .. $#{$email} ) {
    #print $email->[$i][0];
    push( @to_mails , $email->[$i][0] );
}

open(FHMF, $mailfile) or die "$!";
local($/) = undef;
my $mail_body = <FHMF>;
close( FHMF );
$/ = "n";

$mail_body = encode_base64( $mail_body, ‘ ‘ );

my $smtp = Net::SMTP -> new( Host => $smtp_server,
#            Debug => 1,
            Hello => $smtp_server,
            ) || die "Can’t connect $smtp_server $!n";

$smtp -> auth( $username, $password ) || die "Can’t authenticate: $!n";

$i = 0;
foreach my $to_mail( @to_mails )
{
    chomp($to_mail);
    $smtp -> mail( $from_mail );
    $smtp -> to( $to_mail );
    $smtp -> data( );

    # send mail head
    $smtp -> datasend( "From: $from_mailn" );
    $smtp -> datasend( "To: $to_mailn" );
    $smtp -> datasend( "MIME-Version: 1.0 n" );
    $smtp -> datasend( "Content-Type: text/html; charset=gb2312 n" );
    $smtp -> datasend( "Content-Transfer-Encoding: base64n" );
    $smtp -> datasend( "Subject: =?gb2312?B?$subject?=nn");
   
    # send mail body
    $smtp -> datasend( $mail_body );
    $smtp -> dataend();

    $i++;
    print "send mail:$i mail to:$to_mailn";
}

$smtp -> quit();