Moodleネットワーク絡みのトラブルの原因と対策

Moodleネットワーク絡みのトラブルの原因と対策

- Tatsuya Shirai の投稿
返信数: 7

 使い方ではなく,コード上のバグなど.

 初めてMoodleネットワーク機能を使用します.いま気付いている問題点は二つあります.

  • Proxyを介してインターネット接続しているサイトからインターネット上のサイトのサイトの詳細情報や公開鍵の取得が失敗する.原因:file_get_contents()を使用している.
  • 登録したサイトを削除した後,同じサイトを再度登録しようとしてもエラー(レコードが重複?)が発生して実行できない.

proxyの問題は,file_get_contents()を利用している所は関数を置き換える+curlのオプション指定にProxy関係を追加で何とかなる.削除したサイトを再度登録する際には,とりあえずphpmyadminなどでdeletedを手作業で0に戻すことで対処は可能.でもこれは”復活”であって,再度の登録を行うということとは違いますね.IDが増えて行っても良いから,同じサイトを何度でも登録→削除→登録→削除をしたいのですが.

 

 

Tatsuya Shirai への返信

削除したサイトを再度登録したい

- Tatsuya Shirai の投稿

 データベースからの削除自体はdeletedを1に設定することで成功している,と考えるべきですね.

 添付した図のように,再度同じアドレスのサイトを登録しようとすると警告が表示されます.ところがここで「続ける」を押しても編集画面には移動しないで,フロントページに戻ってしまう.ネットワーキングのビアを選択して表示される画面でも,サイトは”All Hosts"しか表示されない.つまり復活していない.

添付 editmnethost.jpg
Tatsuya Shirai への返信

Re: 削除したサイトを再度登録したい

- Tatsuya Shirai の投稿

admin/mnet/peers.phpのエラー表示部では,きちんと「続ける」の先のURLがオプション付きで指定されているにも関わらず,前出の画面のソースコードではFORMのactionがサイトのトップアドレスになっています.print_error()の引数のミスではないだろうか?

        // PREVENT DUPLICATE RECORDS ///////////////////////////////////////////
        if ('input' == $form->step) {
            if ( isset($mnet_peer->id) && $mnet_peer->id > 0 ) {
                print_error("hostexists", 'mnet', 'peers.php?step=update&hostid='.$mnet_peer->id, $mnet_peer->id);
            }
        }

Tatsuya Shirai への返信

Re: 削除したサイトを再度登録したい

- Tatsuya Shirai の投稿

絶対に外部のサイトにダイレクトリンクされないように,条件が厳しくなったのですね,多分.

lib/weblib.php の function print_error()中.

    // when printing an error the continue button should never link offsite
    if (stripos($link, $CFG->wwwroot) === false &&
        stripos($link, $CFG->httpswwwroot) === false) {
        $link = $CFG->wwwroot.'/';
    }

という訳でフルパスに変更すれば良いのですね,print_error()のURLを.これはfunction print_error()の仕様が変更された(であろう)時期以降に顕在化したバグでしょう.

Tatsuya Shirai への返信

Re: 削除したサイトを再度登録したい

- Tatsuya Shirai の投稿

OKです.やはりこれが原因でした.

admin/mnet/peers.phpの以下の部分を修正すれば,編集画面に遷移します.

        // PREVENT DUPLICATE RECORDS ///////////////////////////////////////////
        if ('input' == $form->step) {
            if ( isset($mnet_peer->id) && $mnet_peer->id > 0 ) {
//              print_error("hostexists", 'mnet', 'peers.php?step=update&hostid='.$mnet_peer->id, $mnet_peer->id);
                print_error("hostexists", 'mnet', $CFG->wwwroot.'/admin/mnet/peers.php?step=update&hostid='.$mnet_peer->id, $mnet_peer->id);
            }
        }

「あんた過去にも登録したでしょう? 復活させてあげるからそれを編集する? それとも完全に削除する?」(後者は推測)という条件にフィットしたので表示される画面なので,厳密な意味で言うとエラーではありません.このような処理分岐っぽいprint_error()が前後にも使われている形跡がありますね.それどころか,print_error()をコメントアウトして,旧式のerror()に置き換えている個所もある.私が予想するに,これってprint_error()を使った個所がうまく動作しなかったので,とりあえずerror()に戻したら動いたので「ま,そういうことで」としのいだのじゃないだろうか^^;

# MDL-28668 に報告しました.

Tatsuya Shirai への返信

Re: Moodleネットワーク絡みのトラブルの原因と対策

- Tatsuya Shirai の投稿

 Proxy環境下のサーバでもネットワーク上のMoodleサイトと通信を行うことで,

  • サイトの登録
  • シングルサインオン

に成功しました.$CFG->proxyhostと$CFG->proxyportを利用します.

 ところが私の実験環境ではちょっと問題が発生しました.基本的にはこれで良いのですが,実験用のMoodleサイトのハブ機はインターネットに接続しているのでプロキシを通すのは正解なのですが,リモート機はローカルネット上(192.168.0.*)に構築しました.ハブのサーバは学内ネット(プロキシでインターネットへ)とローカルネットの両方にNICの二枚差しで対応しています.その結果,ハブからリモートへは入れるのですが,リモートからハブに入れません.この際にハブのプロキシ設定(Moodle上の)をクリアすればリモートに入れました.

 プロキシの設定が生きるのはアクセスされる側のサーバです(現状では).どこからアクセスされたのかを判断して,例外を設けないといけない状況です.もっとも,$CFG->proxy関係が必要なのは言語パックの自動取得が主ですので(他にもあるかも知れません.通知など),普段はプロキシの設定を切っておく,という手もあるのですが…

 あとは独自の改良でしょうか.特定のアドレスに対してはプロキシを利用しない,といった例外ですね.これはブラウザのプロキシの設定とよく似ています.サブネットの設定を利用することで回避できる可能性もありますが,NIC二枚差しに対してどう機能するのかは不明です.

#ちょっと分かり難いですね.リクエストがあれば図を描きます.

Tatsuya Shirai への返信

Re: Moodleネットワーク絡みのトラブルの原因と対策

- Tatsuya Shirai の投稿

 PROXY環境下のサイトへの接続の問題とprint_erro()の使用法のミスによる画面繊維のミス(その結果,サイトの再登録ができない問題)について,以下にまとめを公開します.

PROXY: Shirai215
print_error(): Debug039

 Proxyの例外についてはレアケースのような気がしますので,fs_moodle独自対応の方向で考えています.ただ,Proxyへの対応自体は本家に報告したいですね.時間があるかどうか次第です.