Synchronizing 2 Drupal

Foto os

Anda memiliki situs Drupal di sebuah LAN (Local Area Network). Situs ini digunakan para staf untuk memperbaharui informasi yang dikonsumsi publik di LAN tersebut. Anda juga memiliki situs Drupal lainnya yang diletakkan di Internet untuk konsumsi publik yang lebih luas. Isinya harus sama dengan yang ada di server LAN. Sengaja kedua server ini dibuat dengan alasan kecepatan saat para staf memperbaharui data. Maklum keterbatasan bandwidth.
Lalu bagaimana menyamakan keduanya ?

Server LAN jelas sebagai sumber data dan server di Internet sebagai target. Untuk menyamakan keduanya Anda bisa menggunakan sebuah script di luar kedua Drupal tersebut yang berfungsi sebagai XMLRPC client. Dengan begitu kedua Drupal berfungsi sebagai XMLRPC server. Script diletakkan di server LAN yang dijalankan setiap hari, yaitu di saat para staf sudah rampung memperbaharui data namun server LAN masih hidup (tentu saja). Anda bisa tentukan pada jam 15:17 misalnya.

Sebelum membahas script tersebut, kini kita siapkan Drupal pada server LAN sebagai XMLRPC server.

  1. Pasang Drupal dan buatlah dua buah node (content).
  2. Unduh modul services, dan letakkan di direktori sites/all/modules. Kalau direktori itu belum ada silahkan dibuat dulu.
  3. Lalu buatlah modul baru bernama sumber_rpc yang akan memberikan seluruh nid (node id). Buatlah direktori sites/all/modules/sumber_rpc. Lalu buat file sites/all/modules/sumber_rpc/sumber_rpc.info:
    name = Sumber RPC
    description = XMLRPC Server
    core = 6.x
    dependencies[] = services

    Lanjutkan dengan membuat file sites/all/modules/sumber_rpc/sumber_rpc.module:
    <?php
    function sumber_rpc_service() {
        return array(
            array(
                '#method' => 'node.all_nids',
                '#callback' => 'sumber_rpc_all_nids',
                '#return' => 'array',
            ),
        );
    }
     
    function sumber_rpc_all_nids() {
        $r = db_query("SELECT nid FROM {node} ORDER BY 1");
        $nids = array();
        while ($node = db_fetch_array($r)) {
            if ($node['nid']) {
                $nids[] = $node['nid'];
            }
        }
        return $nids;
    }
  4. Di menu admin/build/modules aktifkan:
    • Sumber RPC
    • Services
    • Key Authentication
    • XMLRPC Server
    • Node Service
    • System Service
    • User Service
  5. Sekarang buat key untuk proses login, ada di menu admin/build/services/keys/add. Isilah:
    • Application title: Penyamaan Data
      Anda bisa gunakan judul lain yang terkait dengan XMLRPC client yang akan menggunakannya.
    • Allowed domain: rab.local
      Ini bisa diisi dengan nama host Drupal bersangkutan.
    • Pada Method access beri centang:
      • node.get
      • user.login
      • node.all_nids
    • Lalu klik Create key.

    Drupal akan membuatkan key berbentuk md5 seperti ini (contoh):

    c266f8874891993ff7b71554e9df00b6

    Key ini akan digunakan oleh XMLRPC client.

  6. Lanjut ke menu admin/build/services/settings. Pada Authentication module pilih Key authentication. Klik Save settings.

Sampai di sini konfigurasi untuk server LAN sebagai XMLRPC server selesai. Selanjutnya masih di server LAN, kita akan membuat XMLRPC client untuk mencoba apakah XMLRPC server pada Drupal berfungsi.

  1. Unduh Python XMLRPC client khusus Drupal.
  2. Buat file config.py:
    config_lan = {
      'url': 'http://rab.local/services/xmlrpc',
      'key': 'c266f8874891993ff7b71554e9df00b6',
      'username': 'admin',
      'password': 'a',
      'domain': 'rab.local',
    }

    Sesuaikanlah isinya.
  3. Lalu buat file drupal_sync.py:
    from drupal_services import DrupalServices
    from config import config_lan
     
    drupal_lan = DrupalServices(config_lan)
    print drupal_lan.call('node.all_nids')

Jalankan:

$ python drupal_sync.py

Contoh hasilnya:
self.user.login('85f79a6f3132c3d188c19fe721a6b23d9083d1f31bf13094f08297aa7ee18e6b', 'rab.local', '1280629380', 'gUPDMWioCz', '3bdm1dl1idrhpdcs741vcd3nl6', 'admin', 'a')
self.node.all_nids('442f846a396d7e282fa858430d946f62e28946cb565e31495a161c15c1f3cc84', 'rab.local', '1280629380', 'aKoTnh24e0', 'p7o0144gm1ealt1l3ma8fa6f11')
['1', '2']

Perhatikan
['1', '2']

yang menunjukkan node 1 dan 2. Berarti XMLRPC client dan server bekerja dengan baik. Ingin melihat isi setiap node ?
from drupal_services import DrupalServices
from config import config_lan
 
drupal_lan = DrupalServices(config_lan)
for nid in drupal_lan.call('node.all_nids'):
  print drupal_lan.call('node.get', nid)

Server Internet
Kini kita beralih ke server yang ada di Internet.

  1. Pasang Drupal dan biarkan tanpa node (content) agar node id LAN dan Internet tetap sama.
  2. Sama dengan langkah 2 pada server LAN di atas.
  3. Sama dengan langkah 3 pada server LAN di atas.
  4. Sama dengan langkah 4 pada server LAN di atas.
  5. Sekarang buat key untuk proses login, ada di menu admin/build/services/keys/add. Isilah:
    • Application title: Penyamaan Data
    • Allowed domain: rab.co.id
      Ini bisa diisi dengan nama host Drupal yang ada di Internet.
    • Pada Method access beri centang:
      • node.get
      • node.save
      • node.delete
      • user.login
      • node.all_nids
    • Lalu klik Create key.
  6. Lanjut ke menu admin/build/services/settings. Pada Authentication module pilih Key authentication. Klik Save settings.

Server LAN
Kembali ke server LAN untuk menambahkan isi file config.py menjadi:

config_lan = {
  'url': 'http://rab.local/services/xmlrpc',
  'key': 'c266f8874891993ff7b71554e9df00b6',
  'username': 'admin',
  'password': 'a',
  'domain': 'rab.local',
}
 
config_internet = {
  'url': 'http://rab.co.id/services/xmlrpc',
  'key': '19fe0da0a30ab55407da3b14e2606b27',
  'username': 'admin',
  'password': 'a',
  'domain': 'rab.co.id',
}

Sesuaikanlah config_internet dengan server Internet di atas. Lalu ubah file drupal_sync.py menjadi:
from drupal_services import DrupalServices
from config import config_lan, config_internet
 
 
drupal_lan = DrupalServices(config_lan)
drupal_internet = DrupalServices(config_internet)
 
nids_internet = drupal_internet.call('node.all_nids')
 
for nid in drupal_lan.call('node.all_nids'):
    if nid in nids_internet:
        node_lan = drupal_lan.call('node.get', nid, ['changed'])
        node_internet = drupal_internet.call('node.get', nid, ['changed'])
        if node_lan['changed'] > node_internet['changed']:
            node_lan = drupal_lan.call('node.get', nid)
            drupal_internet.call('node.save', node_lan)
        nids_internet.remove(nid)
    else:
        node_lan = drupal_lan.call('node.get', nid)
        del node_lan['nid']
        drupal_internet.call('node.save', node_lan)
 
for nid in nids_internet:
    drupal_internet.call('node.delete', nid)

Lalu jalankan:
$ python drupal_sync.py

Ujilah dengan menambah node pada server LAN, juga mengubah node lama, atau menghapus node lama. Kemudian jalankan lagi drupal_sync.py, perhatikan perubahannya di server Internet.

Jika sudah benar jalankan script tersebut setiap jam 15:17 sesuai rencana awal, yaitu dengan membuat file /etc/cron.d/drupal_sync di server LAN yang berisi:

17 15 * * * root python /home/sugiana/drupal_sync/drupal_sync.py

Sesuaikanlah direktori dimana drupal_sync.py berada.

Selamat mencoba.

Komentar

Foto Haris

Assalamu’alaikum

Assalamu’alaikum wr.wb.

Institusi kami berdasarkan lisensi Federal Reserve bersedia bekerjasama dan memiliki kemampuan untuk melakukan High Yield Investment Program terhadap Asset Amanah Indonesia.
Bagi Pemegang atau yang mengetahui Asset tsb.saya menawarkan kerjasama untuk mengelola Asset Amanah dalam Program kami.
Program ini memberikan Keuntungan setiap minggu/bulan tanpa adanya “resiko dan kerugian” apapun baik terhadap pemilik asset maupun asset itu sendiri.

Mari wujudkan Kebenaran dan Impian Masa Depan Indonesia Melalui Asset Amanah Indonesia dalam Pengelolaan Kebenaran dan Kepastian Program Kami.

Wassalam,
Haris Hedar (harishedar@gmail.com)

Foto os

Maaf, apa tidak keliru room ?

Maaf, apa tidak keliru room ? Yang ini sedang bahas Drupal.

Foto ical

Maaf pak mau tanya mohon

Maaf pak mau tanya mohon bantuannya, kenapa setelah saya coba, masih untuk di server LAN dan eksekusi drupal_sync.py saya masih menemui kendala seperti ini :
Traceback (most recent call last):
File "drupal_sync.py", line 7, in
drupal_lan = DrupalServices(config_lan)
File "/home/ical/python_drupal_services/drupal_services.py", line 128, in __init__
config['domain'], config['key'])
File "/home/ical/python_drupal_services/drupal_services.py", line 74, in __init__
self.session = self.call('user.login', username, password)
File "/home/ical/python_drupal_services/drupal_services.py", line 39, in call
return getattr(self, method_name)(self._build_eval_list(method_name, args))
File "/usr/lib/python2.7/xmlrpclib.py", line 1224, in __call__
return self.__send(self.__name, args)
File "/usr/lib/python2.7/xmlrpclib.py", line 1575, in __request
verbose=self.__verbose
File "/usr/lib/python2.7/xmlrpclib.py", line 1264, in request
return self.single_request(host, handler, request_body, verbose)
File "/usr/lib/python2.7/xmlrpclib.py", line 1297, in single_request
return self.parse_response(response)
File "/usr/lib/python2.7/xmlrpclib.py", line 1473, in parse_response
return u.close()
File "/usr/lib/python2.7/xmlrpclib.py", line 793, in close
raise Fault(**self._stack[0])
xmlrpclib.Fault:

Foto os

Sepertinya

Sepertinya https://github.com/guaka/python_drupal_services masih untuk modul Services versi 2, sedangkan sekarang sudah versi 3. Coba gunakan http://upload.rab.co.id/node/115394.