10月 192014
 

サイボウズOffice8を使っていたのだが、最近サイボウズOffice10にアップデートしたのでスクリプトが使えなくなってしまったので改修した。
また、サイボウズOffice10からicalに変換したあと、ownCloudのCalDavサーバへアップデートするスクリプトも作った。あまりきちんと作成してないので、もうちょっと改善したいけどめんどいのでまた後で。

サイボウズOffice10をiCalに変換するスクリプト

サイボウズOffice8の頃はサイボウズ オフィス8 のカレンダーを iCalendar 形式に変換するスクリプトを書いてみたを使っていたのだが、サイボウズOffice10になって使えなくなったので改修した。ほとんど変換不要で稼働した。説明はめんどいのDiffだけ。

# diff -c getcybozu8.pl getcybozu10.pl
*** getcybozu8.pl       2013-02-24 05:56:25.000000000 +0900
--- getcybozu10.pl      2014-10-19 18:54:21.280409937 +0900
***************
*** 38,44 ****
  die "Failed to access ", $res->status_line , "url=", $url, "\n" unless $res->is_success;
  my $content = $res->content;
  from_to($content, $cfg->{input_encoding} || 'shiftjis', 'utf8');
! $content = Encode::decode('utf8', $content);
  my @event = split(/(<a class="event"[^>]*>)/, $content);
  if ($cfg->{output_file}) {
      open(OUTPUT, ">$cfg->{output_file}~") || die;
--- 38,44 ----
  die "Failed to access ", $res->status_line , "url=", $url, "\n" unless $res->is_success;
  my $content = $res->content;
  from_to($content, $cfg->{input_encoding} || 'shiftjis', 'utf8');
! $content = Encode::decode('utf-8', $content);
  my @event = split(/(<a class="event"[^>]*>)/, $content);
  if ($cfg->{output_file}) {
      open(OUTPUT, ">$cfg->{output_file}~") || die;
***************
*** 91,96 ****
--- 91,98 ----
      my $location;
      my @start;
      my @end;
+     $query=~ s/\&amp\;/&/g;
+
      for (split(/&/, $query)) {
        if (/^BDate=da\.(\d+)\.(\d+)\.(\d+)$/) {
            @start = ($3, $2-1, $1-1900);
***************
*** 190,204 ****

  =head1 NAME

! cybozu8_ical - Convert Cybozu Office8 calendar into iCalendar format

  =head1 SYNOPSIS

!   % cybozu8_ical
!   % cybozu8_ical --conf /path/to/config.yaml

  =head1 DESCRIPTION

! C<cybozu8_ical> is a command line application that fetches calendar
  items from Cybozu Office 8, and converts them into an
  iCalendar file.
--- 192,206 ----

  =head1 NAME

! cybozu10_ical - Convert Cybozu Office8 calendar into iCalendar format

  =head1 SYNOPSIS

!   % cybozu10_ical
!   % cybozu10_ical --conf /path/to/config.yaml

  =head1 DESCRIPTION

! C<cybozu10_ical> is a command line application that fetches calendar
  items from Cybozu Office 8, and converts them into an
  iCalendar file.

&の表記が変わっただけですね。ファイルもアップしておきます。getcybozu10.pl

実行するときに使うコンフィグはこんな感じ。input_encodingがutf-8に変わっています。

# cat getcybozu10.yaml
cybozu_url: https://fogefoge.com/cgi-bin/cbag/ag.cgi
calname: Cybozu
userid: 1
password: foge
time_zone: Asia/Tokyo
input_encoding: utf-8
output_file: /tmp/cybozu10ical.ics

念のために実行するこきはフルパスで。

perl /tmp/getcybozu10.pl  --conf /tmp/getcybozu10.yaml

iCalファイルをownCloudへアップロード

カレンダーはすべてownCloudに統合していてそれをスマフォやPCで連携してみています。サイボウズのカレンダーもiCalに変換したので、ownCloudにインポートしたいのですが標準ではインターフェイスがありません。CalDavには対応していたみたいですので、cadaverというCalDavクライアントを使って無理やりアップロードすることにしました。

まずはスクリプト。cron_cybozu10toOwnCloud

#!/bin/bash

perl /tmp/getcybozu10.pl  --conf /tmp/getcybozu10.yaml
orgfile=/tmp/cybozu10ical.ics
file=/tmp/work/cybozu10ical.ics
rm -rf /tmp/work
mkdir /tmp/work
cp $orgfile $file
cd /tmp/work

  bevents=($(grep -n BEGIN:VEVENT $file | cut -d: -f1))
  eevents=($(grep -n END:VEVENT $file | cut -d: -f1))

  ehead=${bevents[0]}
  let "ehead -= 1"

  bfoot=$(wc -l < $file)
  let "bfoot -= ${eevents[-1]}"

  for (( i=0; i < ${#bevents[@]}; i++))
  do
    head -n $ehead $file > $file-$i.ics
    sed -n ${bevents[$i]},${eevents[$i]}p $file >> $file-$i.ics
    tail -n $bfoot $file >> $file-$i.ics
  done

 rm -f $file

cadaver https://fogefoge.com/remote.php/caldav/calendars/username/fogecal << EOC
  delete *
  mput *.ics
  exit
EOC

/tmpにスクリプトとコンフィグを配置して、/tmp/workを作業フォルダに使っています。iCalをイベント単位に分割してcadaverクライアントで指定のカレンダーをすべて削除して全てアップロードするという強引な方法をとっています。cadaverにユーザ名とカレンダー名を指定します。詳細なURLはownCloudのカレンダーページに明記されています。また、cadaverで利用するユーザ名とパスワードはFTPと同様にnetrcファイルに記載します。デフォルトでは~/.netrcに配置します。

machine fogefoge.com
login username
password thisispassword

後はスクリプトをCRONに登録するだけです。以下の例では3時間に一度実行しています。

01 */4 * * * root /tmp/cron_cybozu10toOwnCloud

Sorry, the comment form is closed at this time.