#! /usr/bin/perl
use strict;
use warnings;
use utf8;
use File::Basename qw/basename dirname/;
my $DIRNAME = dirname $0;
my $BASENAME = basename $0;
my $CONF_FILE= "$DIRNAME/cgi.json";
if ( ! -e $CONF_FILE ) {
print "Content-type: text/html\n\n ${CONF_FILE} could not be read.\n$!$@";
exit;
}
my $CONFIG = do $CONF_FILE
or die "${CONF_FILE} is could not read.\n$!$@";
my $PARMS = $ENV{'QUERY_STRING'};
my $METHOD = $ENV{'REQUEST_METHOD'};
if ( $METHOD eq "POST" || $METHOD eq "PUT" ) {
read(STDIN, $PARMS, $ENV{'CONTENT_LENGTH'});
}
my ($USER, $DATE);
for my $PARM ( split(/&/, $PARMS) ) {
my ($KEY,$VAL) = split(/=/,$PARM);
$VAL =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/ego;
if ($KEY eq "user") { $USER=$VAL; }
if ($KEY eq "date") { $DATE=$VAL; }
}
print << "END";
Content-type: text/html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>$CONFIG->{title}</title>
</head>
<body>
<div>Input parameters:$PARMS</div>
<div>User:$USER</div>
<div>Date:$DATE</div>
</body>
</html>
END
Mac OS 10.9.4, FreeBSD 9.1-RELEASE-p15, Ubuntu Server 14.04で動作確認しました。
#! /bin/sh
set -e # Terminate at error
set -u # Error if undefined variable
# System Variables
BASE_DIR=`dirname $0`
BASE_DIR=`cd ${BASE_DIR} && pwd` # Change to full path
BASENAME=`basename $0 | sed -e "s/\.[^.]*$//"` #Except extension
HOST=`hostname | cut -d"." -f 1`
USER=`whoami`
TODAY=`date +%Y%m%d`
# echo with time stamp in front.
log() {
NOW=`date +%Y\/%m/%d\ %H:%M:%S`
echo "$*" | sed -e "s|^|[${NOW}] |"
}
log "Start!"
# User Variables
CONFIG="${BASE_DIR}/${BASENAME}_${HOST}_${USER}.config"
if [ $# -eq 1 ]; then
CONFIG="$1"
fi
if [ ! -f "${CONFIG}" ]; then
echo "${CONFIG} not found"
echo ""
exit 1
fi
. "${CONFIG}"
# Log file
LOGDATE="${TODAY}"
if [ -f "${LOG}" ]; then
LOGDATE=`perl -MPOSIX -le 'print strftime "%Y%m%d", localtime((lstat)[9]) for @ARGV' $LOG`
LOGDATE=`echo ${LOGDATE} | cut -d" " -f 1`
fi
if [ "${LOGDATE}" -lt "${TODAY}" ]; then
echo "move log file from ${LOG} to ${LOG}.${LOGDATE}" | tee -a "${LOG}"
mv "${LOG}" "${LOG}.${LOGDATE}"
fi
log "Config file:${CONFIG}" | tee -a "${LOG}"
NOW=`date +%Y\/%m/%d\ %H:%M:%S`
cat "${CONFIG}" | sed -e "s|^|[${NOW}] Config=|" | tee -a "${LOG}"
# Verify host
if [ `echo ${HOSTS} | grep ${HOST} | wc -l ` -eq 0 ]; then
log "Not allowed on this host." | tee -a "${LOG}"
exit 1
fi
# Prevent multiple instance
GREP_PS="$0 $*"
if [ $# -eq 0 ]; then
GREP_PS="$0"
fi
PROCESSES=`ps -o pgid,pid,tty,time,command | grep "${GREP_PS}" | awk '$1==$2' | wc -l`
log "No. of proceeses ${PROCESSES}" | tee -a "${LOG}"
if [ ${PROCESSES} -gt 1 ]; then
log "Already running this script" | tee -a "${LOG}"
ps -o pgid,pid,tty,time,command | grep "${GREP_PS}" | awk '$1==$2' | tee -a "${LOG}"
log "Abort!" | tee -a "${LOG}"
log "" | tee -a "${LOG}"
exit 1
fi
#do something
log "Complete!" | tee -a "${LOG}"
log "" | tee -a "${LOG}"
Pentaho Data IntegrationでXMLファイルを読み込むにはGet Data from XMLとXML Input Stream(StAX)があります。
600MBぐらいある巨大なXMLファイルをGet Data from XMLで読み込むとjava.lang.OutOfMemoryError: Java heap spaceでエラーが出ました。 メモリ割当を2.5GBまで増やしても解決しません。
# Perl 5.16をインストール
cd /usr/ports/lang/perl5.16
make
make install
# Curlをインストール
pkg_add -r curl
# Mojoliciousをインストール
curl get.mojolicio.us | sh
#動作確認
mojo get www.google.com
setlocal
set USER=server_username
set SERVER=server
rem 実行ユーザーが誰でも読める場所に秘密鍵を置く
set RSA_FILE=C:\Windows\SysWOW64\config\systemprofile/.ssh/id_rsa.ppk
set FTP_PATH=/home/hoge
set FTP_FILENAME=serverfile.txt
set FTP_FILE=%FTP_PATH%/%FTP_FILENAME%
set LOCAL_PATH=C:\path\to\file
set LOCAL_FILENAME=localfile.txt
set LOCAL_FILE=%LOCAL_PATH%\%LOCAL_FILENAME%
rem サーバーへファイルを置く。エラーが起きれば中断
rem 接続に必要な情報は全て明記。 実行ユーザーがセッションファイルを読み込めないかも知れない。
pscp -agent -batch -i %RSA_FILE% %LOCAL_FILE% %USER%@%SERVER%:%FTP_PATH% || exit 1
rem サーバーからファイルを取得。エラーが起きれば中断
rem 接続に必要な情報は全て明記。 実行ユーザーがセッションファイルを読み込めないかも知れない。
pscp -agent -batch -i %RSA_FILE% %USER%@%SERVER%:%FTP_FILE% %LOCAL_PATH% || exit 1
rem サーバー上のスクリプトを実行
set MESSAGE=Success!
set SERVER_COMMAND=echo %MESSAGE%
rem 接続に必要な情報は全て明記。 実行ユーザーがセッションファイルを読み込めないかも知れない。エラーが起きれば中断
set COMMAND=plink -batch -ssh -agent -i %RSA_FILE% %USER%@%SERVER% %SERVER_COMMAND% || exit 1
rem 出力結果を%RESULTS%に入れる
for /f "delims=" %%i in ('%COMMAND%') do @set RESULTS=%%i
rem 出力結果を表示
echo %RESULTS%
rem Jenkinsで失敗と判断する為にShellで正常終了するとSuccess!と出力。
rem 正常終了の出力でない場合にエラーコードを設定
if not %RESULTS%==Success! exit 1
setlocal
set USER=ssh_username
set SERVER=target_server
set MESSAGE=Success!
rem Jenkinsはユーザーのファイルを読めないので誰でも読める場所に秘密鍵を置く
set RSA_FILE=C:\Windows\SysWOW64\config\systemprofile/.ssh/id_rsa.ppk
set SERVER_COMMAND=echo %MESSAGE%
rem 接続に必要な情報は全て明記。 Jenkinsはセッションファイルを読み込めない。
rem 途中でエラーが起きたら中断
set COMMAND=plink -batch -ssh -agent -i %RSA_FILE% %USER%@%SERVER% %SERVER_COMMAND% || exit 1
rem 出力結果を%RESULTS%に入れる
for /f "delims=" %%i in ('%COMMAND%') do @set RESULTS=%%i
echo %RESULTS%
rem Jenkinsで失敗と判断する為に正常終了の出力でない場合にエラーコードを設定
if not %RESULTS%==Success! exit 1