ดาต้าเบสของ Asterisk สำหรับทำ Asterisk Realtime

Asterisk Opensource IP Pbx

ดาต้าเบสของ Asterisk สำหรับทำ Asterisk Realtime

โพสต์โดย nuiz » 22 ก.พ. 2011 09:50

ผมมีดาต้าเบสของ Asterisk มาฝากครับ ต่อไปนี้จะเป็น Tables และ Fields ที่เราสามารถเขียนโปรแกรมแล้วใส่ข้อมูลไว้ได้ แล้วให้ Asterisk เรียกไปใช้งาน หรือที่เราเรียกกันว่าให้ Asterisk ทำงานในโหมด "Realtime"

Asterisk Realtime เป็นโหมดการทำงานอีกโหมดหนึ่งของ Asterisk ที่มันจะดึงข้อมูลคอนฟิกต่างๆมาจากดาต้าเบส แต่รองรับเฉพาะบางอย่างเท่านั้นครับ ไม่ใช่ทุกคอนฟิก :D

1. ไฟล์ /etc/asterisk/extconfig.conf
ไฟล์นี้จะบอก Asterisk ว่าจะดึงข้อมูลเกี่ยวกับ queue, sip account, voicemail ได้จากดาต้าเบส เป็นดาต้าเบสแบบไหน ดาต้าเบสชื่ออะไร เทเบิลชื่ออะไร
จากตัวอย่างด้านล่าง ถ้า Asterisk ต้องการดึงข้อมูลเกี่ยวกับ Queues มันจะเข้ามาเช็คที่ Database เป็นดาต้าเบส mysql ชื่อดาต้าเบส asteriskrealtime ชื่อเทเบิล queues
โค้ด: เลือกทั้งหมด
[settings]
queues => mysql,asteriskrealtime,queues
queue_members => mysql,asteriskrealtime,queue_members
sippeers => mysql,asteriskrealtime,sip
sipusers => mysql,asteriskrealtime,sip
iaxpeers => mysql,asteriskrealtime,iax
iaxusers => mysql,asteriskrealtime,iax
voicemail => mysql,asteriskrealtime,voicemail_users


เป็นสั่งให้ Asterisk ดึงข้อมูลจาก Database แทนที่จะดึงจากไฟล์ /etc/asterisk/*.conf ง่ายๆแบบนี้แหล่ะครับ ก็แค่ลบเครื่องหมาย ; ออกจากหน้าบรรทัดที่เราต้องการเท่านั้น เลือกเอาบรรทัดใดบรรทัดนึงก็ได้นะครับ ไม่ต้องเอาทั้งหมดก็ได้ เช่น เราต้องการให้มันดึงแค่ข้อมูล SIP Users จากดาต้าเบส เราก็เอา ; ออกจากหน้าบรรทัด sipusers เท่านั้น บรรทัดอื่นที่เหลือปล่อยไว้เหมือนเดิม

ส่วนรายละเอียดข้อมูลที่ต้องใช้ในการติดต่อกับดาต้าเบส asteriskrealtime จะอยู่ที่ไฟล์ /etc/asterisk/res_mysql.conf ครับ

2. ไฟล์ /etc/asterisk/res_mysql.conf
คอนฟิกบอก Asterisk ให้ใช้ข้อมูลต่อไปนี้ติดต่อกับ Database เมื่อต้องการดึงข้อมูลตามที่คอนฟิกในไฟล์ /etc/asterisk/extconfig.conf
โค้ด: เลือกทั้งหมด
[general]
dbhost = localhost
dbname = asteriskrealtime
dbuser = user
dbpass = password
;dbport = 3306
dbsock = /var/lib/mysql/mysql.sock


3. ไฟล์ /etc/asterisk/cdr_mysql.conf
ให้ Asterisk เก็บ CDR ไว้ในดาต้าเบสด้วย ถ้าทำแบบนี้จะเขียนเว็บให้ดึง CDR มาโชว์และคำนวณได้
โค้ด: เลือกทั้งหมด
[global]
hostname = localhost
dbname = asteriskrealtime
table = cdr
password = password
user = user
;port = 3306
sock = /var/lib/mysql/mysql.sock
userfield=1


4. สร้างดาต้าเบส สมมติว่าชื่อ asteriskrealtime
โค้ด: เลือกทั้งหมด
CREATE DATABASE `asteriskrealtime` DEFAULT CHARACTER SET latin1 COLLATE utf8_general_ci;


โค้ด: เลือกทั้งหมด
CREATE TABLE IF NOT EXISTS `cdr` (
`recid` mediumint(8) unsigned NOT NULL auto_increment COMMENT 'Record ID',
`calldate` datetime NOT NULL default '0000-00-00 00:00:00',
`clid` varchar(80) NOT NULL default '',
`src` varchar(80) NOT NULL default '',
`dst` varchar(80) NOT NULL default '',
`dcontext` varchar(80) NOT NULL default '',
`channel` varchar(80) NOT NULL default '',
`dstchannel` varchar(80) NOT NULL default '',
`lastapp` varchar(80) NOT NULL default '',
`lastdata` varchar(80) NOT NULL default '',
`duration` int(11) NOT NULL default '0',
`billsec` int(11) NOT NULL default '0',
`disposition` varchar(45) NOT NULL default '',
`amaflags` int(11) NOT NULL default '0',
`accountcode` varchar(20) NOT NULL default '',
`uniqueid` varchar(32) NOT NULL default '',
`userfield` varchar(255) NOT NULL default '',
PRIMARY KEY  (`recid`),
KEY `calldate` (`calldate`),
KEY `dst` (`dst`),
KEY `accountcode` (`accountcode`),
KEY `src` (`src`),
KEY `disposition` (`disposition`),
KEY `uniqueid` (`uniqueid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8_general_ci AUTO_INCREMENT=1;


โค้ด: เลือกทั้งหมด
CREATE TABLE IF NOT EXISTS `queue_members` (
  `queue_name` varchar(128) NOT NULL default '',
  `interface` varchar(128) NOT NULL default '',
  `penalty` int(11) default NULL,
  PRIMARY KEY  (`queue_name`,`interface`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8_general_ci;


โค้ด: เลือกทั้งหมด
CREATE TABLE IF NOT EXISTS `queues` (
  `name` varchar(128) NOT NULL,
  `musiconhold` varchar(128) default 'default',
  `announce` varchar(128) default NULL,
  `context` varchar(128) default NULL,
  `timeout` int(11) default '60',
  `monitor_join` tinyint(1) default NULL,
  `monitor_format` varchar(128) default NULL,
  `queue_youarenext` varchar(128) default NULL,
  `queue_thereare` varchar(128) default NULL,
  `queue_callswaiting` varchar(128) default NULL,
  `queue_holdtime` varchar(128) default NULL,
  `queue_minutes` varchar(128) default NULL,
  `queue_seconds` varchar(128) default NULL,
  `queue_lessthan` varchar(128) default NULL,
  `queue_thankyou` varchar(128) default NULL,
  `queue_reporthold` varchar(128) default NULL,
  `announce_frequency` int(11) default NULL,
  `announce_round_seconds` int(11) default NULL,
  `announce_holdtime` varchar(128) default NULL,
  `periodic_announce` varchar(128) default NULL,
  `periodic_announce_frequency` int(11) default NULL,
  `retry` int(11) default '5',
  `ringinuse` varchar(5) NOT NULL default 'no',
  `autofill` varchar(5) NOT NULL default 'yes',
  `autopause` varchar(5) NOT NULL default 'no',
  `setinterfacevar` varchar(5) NOT NULL default 'yes',
  `wrapuptime` int(11) default '30',
  `maxlen` int(11) default NULL,
  `servicelevel` int(11) default NULL,
  `strategy` varchar(128) default 'ringall',
  `joinempty` varchar(128) default 'no',
  `leavewhenempty` varchar(128) default 'yes',
  `eventmemberstatus` tinyint(1) default NULL,
  `eventwhencalled` tinyint(1) default NULL,
  `reportholdtime` tinyint(1) default NULL,
  `memberdelay` int(11) default NULL,
  `weight` int(11) default NULL,
  `timeoutrestart` tinyint(1) default NULL,
  PRIMARY KEY  (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8_general_ci;


โค้ด: เลือกทั้งหมด
CREATE TABLE IF NOT EXISTS `sip` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(80) NOT NULL,
  `host` varchar(31) NOT NULL default 'dynamic',
  `nat` varchar(5) NOT NULL default 'no',
  `type` enum('user','peer','friend') NOT NULL default 'friend',
  `accountcode` varchar(20) default 'ACCOUNT',
  `amaflags` varchar(13) default NULL,
  `callgroup` varchar(10) default NULL,
  `callerid` varchar(80) default NULL,
  `incominglimit` varchar(6) NOT NULL default '1',
  `cancallforward` char(3) default 'yes',
  `canreinvite` char(3) default 'no',
  `context` varchar(80) default 'from-sip',
  `defaultip` varchar(15) default NULL,
  `dtmfmode` varchar(7) default 'rfc2833',
  `fromuser` varchar(80) default NULL,
  `fromdomain` varchar(80) default NULL,
  `insecure` varchar(4) default NULL,
  `language` char(2) default 'en',
  `mailbox` varchar(50) default NULL,
  `md5secret` varchar(80) default NULL,
  `deny` varchar(95) default '0.0.0.0/0.0.0.0',
  `permit` varchar(95) default '0.0.0.0/0.0.0.0',
  `mask` varchar(95) default NULL,
  `musiconhold` varchar(100) default 'default',
  `pickupgroup` varchar(10) default NULL,
  `qualify` char(3) default 'yes',
  `regexten` varchar(80) default NULL,
  `restrictcid` char(3) default NULL,
  `rtptimeout` char(3) default NULL,
  `rtpholdtimeout` char(3) default NULL,
  `secret` varchar(80) default 'SECRET',
  `setvar` varchar(100) default NULL,
  `disallow` varchar(100) default 'all',
  `allow` varchar(100) default 'alaw',
  `fullcontact` varchar(80) NOT NULL default '',
  `ipaddr` varchar(15) NOT NULL default '',
  `port` smallint(5) unsigned NOT NULL default '0',
  `regserver` varchar(100) default NULL,
  `regseconds` int(11) NOT NULL default '0',
  `username` varchar(80) NOT NULL,
  `defaultuser` varchar(80) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `name` (`name`),
  KEY `name_2` (`name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8_general_ci ROW_FORMAT=DYNAMIC AUTO_INCREMENT=1;


โค้ด: เลือกทั้งหมด
CREATE TABLE IF NOT EXISTS `iax` (
  `id` int(11) NOT NULL auto_increment,
  `name` char(80) collate utf8_bin NOT NULL default '',
  `accountcode` char(20) collate utf8_bin default NULL,
  `regexten` char(20) collate utf8_bin default NULL,
  `amaflags` char(7) collate utf8_bin default NULL,
  `callgroup` char(10) collate utf8_bin default NULL,
  `callerid` char(80) collate utf8_bin default NULL,
  `incominglimit` varchar(6) NOT NULL default '1',
  `canreinvite` char(3) collate utf8_bin default 'yes',
  `context` char(80) collate utf8_bin default NULL,
  `defaultip` char(15) collate utf8_bin default NULL,
  `dtmfmode` char(7) collate utf8_bin NOT NULL default 'RFC2833',
  `fromuser` char(80) collate utf8_bin default NULL,
  `fromdomain` char(80) collate utf8_bin default NULL,
  `host` char(31) collate utf8_bin NOT NULL default '',
  `insecure` char(20) collate utf8_bin default NULL,
  `language` char(2) collate utf8_bin default NULL,
  `mailbox` char(50) collate utf8_bin default NULL,
  `md5secret` char(80) collate utf8_bin default NULL,
  `nat` char(3) collate utf8_bin default 'yes',
  `permit` char(95) collate utf8_bin default NULL,
  `deny` char(95) collate utf8_bin default NULL,
  `mask` char(95) collate utf8_bin default NULL,
  `pickupgroup` char(10) collate utf8_bin default NULL,
  `port` char(5) collate utf8_bin NOT NULL default '',
  `qualify` char(7) collate utf8_bin default 'yes',
  `restrictcid` char(1) collate utf8_bin default NULL,
  `rtptimeout` char(3) collate utf8_bin default NULL,
  `rtpholdtimeout` char(3) collate utf8_bin default NULL,
  `secret` char(80) collate utf8_bin default NULL,
  `type` char(6) collate utf8_bin NOT NULL default 'friend',
  `username` char(80) collate utf8_bin NOT NULL default '',
  `disallow` char(100) collate utf8_bin default 'all',
  `allow` char(100) collate utf8_bin default 'gsm,ulaw,alaw',
  `musiconhold` char(100) collate utf8_bin default NULL,
  `regseconds` int(11) NOT NULL default '0',
  `ipaddr` char(15) collate utf8_bin NOT NULL default '',
  `cancallforward` char(3) collate utf8_bin default 'yes',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `name` (`name`),
  KEY `name_2` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;



โค้ด: เลือกทั้งหมด
CREATE TABLE IF NOT EXISTS `voicemail_messages` (
  `id` int(11) NOT NULL auto_increment,
  `msgnum` int(11) NOT NULL default '0',
  `dir` varchar(80) default '',
  `context` varchar(80) default '',
  `macrocontext` varchar(80) default '',
  `callerid` varchar(40) default '',
  `origtime` varchar(40) default '',
  `duration` varchar(20) default '',
  `mailboxuser` varchar(80) default '',
  `mailboxcontext` varchar(80) default '',
  `recording` longblob,
  PRIMARY KEY  (`id`),
  KEY `dir` (`dir`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;


โค้ด: เลือกทั้งหมด
CREATE TABLE IF NOT EXISTS `voicemail_users` (
  `uniqueid` int(11) NOT NULL auto_increment,
  `customer_id` varchar(11) NOT NULL default '0',
  `context` varchar(50) NOT NULL default 'default',
  `mailbox` varchar(11) NOT NULL default '0',
  `password` varchar(5) NOT NULL default '6666',
  `fullname` varchar(150) NOT NULL,
  `email` varchar(50) NOT NULL,
  `pager` varchar(50) NOT NULL,
  `tz` varchar(10) NOT NULL default 'en',
  `attach` varchar(4) NOT NULL default 'yes',
  `saycid` varchar(4) NOT NULL default 'yes',
  `dialout` varchar(10) NOT NULL,
  `callback` varchar(10) NOT NULL,
  `review` varchar(4) NOT NULL default 'no',
  `operator` varchar(4) NOT NULL default 'no',
  `envelope` varchar(4) NOT NULL default 'no',
  `sayduration` varchar(4) NOT NULL default 'no',
  `saydurationm` tinyint(4) NOT NULL default '1',
  `sendvoicemail` varchar(4) NOT NULL default 'no',
  `delete` varchar(4) NOT NULL default 'no',
  `nextaftercmd` varchar(4) NOT NULL default 'yes',
  `forcename` varchar(4) NOT NULL default 'no',
  `forcegreetings` varchar(4) NOT NULL default 'no',
  `hidefromdir` varchar(4) NOT NULL default 'yes',
  `stamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`uniqueid`),
  KEY `mailbox_context` (`mailbox`,`context`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8_general_ci AUTO_INCREMENT=1 ;
** หากมีปัญหากับอุปกรณ์ที่ซื้อมาเองหรือบริการที่ทำขึ้นมาเอง ให้โพสต์ถามในเว็บบอร์ดนี้นะครับ **
** งานเร่งด่วนติดต่อว่าจ้างที่เบอร์ 08-5161-9439 อีเมล์ iamaladin@gmail.com ไลน์ NuizVoip ครับ **
nuiz
Diamond Member
 
โพสต์: 7069
ลงทะเบียนเมื่อ: 24 มี.ค. 2010 09:33

Re: ดาต้าเบสของ Asterisk สำหรับทำ Asterisk Realtime

โพสต์โดย Phichate Sukklay » 18 เม.ย. 2012 01:49

อยากทราบว่า สามารถ config บน CentOS5.4 ,Asterisk 5.7 และ MySQL 5.0.77 ได้เลยหรือไม่ครับ ขอบคุณครับ
Phichate Sukklay
Bronz Member
 
โพสต์: 12
ลงทะเบียนเมื่อ: 10 ม.ค. 2011 14:27

Re: ดาต้าเบสของ Asterisk สำหรับทำ Asterisk Realtime

โพสต์โดย nuiz » 18 เม.ย. 2012 09:18

ใช้ได้เลยคับ
** หากมีปัญหากับอุปกรณ์ที่ซื้อมาเองหรือบริการที่ทำขึ้นมาเอง ให้โพสต์ถามในเว็บบอร์ดนี้นะครับ **
** งานเร่งด่วนติดต่อว่าจ้างที่เบอร์ 08-5161-9439 อีเมล์ iamaladin@gmail.com ไลน์ NuizVoip ครับ **
nuiz
Diamond Member
 
โพสต์: 7069
ลงทะเบียนเมื่อ: 24 มี.ค. 2010 09:33

Re: ดาต้าเบสของ Asterisk สำหรับทำ Asterisk Realtime

โพสต์โดย Phichate Sukklay » 25 เม.ย. 2012 22:41

ดาต้าเบสของ Asterisk สำหรับทำ Asterisk Realtime สามารถทำอะไรได้บ้างครับ เห็นมี เทบิ้ลต่างๆมากมาย ลองสร้างดูแล้วแต่ใช้ไม่เป็นครับ นอกจากจะเห็น cdr ถูกนำเข้ามาเก็บ ใน database นี้
อยากทราบว่า เทเบิ้ลอื่นๆ สามารถใช้ทำอะไรได้บ้างครับ แนะนำด้วยครับ ไม่ทราบจริงๆ

และอีกอันคือ

เข้าที่ asterisk console พบข้อวมแจ้งเตือน
WARNING[9773]: res_config_mysql.c:326 realtime_mysql: MySQL RealTime: Invalid database specified: asterisk (check res_mysql.conf)

เกิดขึ้นตลอดเวลาเลยครับ ไม่ทราบว่าเพราะอะไร

ขอบคุณครับ
Phichate Sukklay
Bronz Member
 
โพสต์: 12
ลงทะเบียนเมื่อ: 10 ม.ค. 2011 14:27

Re: ดาต้าเบสของ Asterisk สำหรับทำ Asterisk Realtime

โพสต์โดย nuiz » 29 เม.ย. 2012 00:56

เอาไว้เขียนเว็บสั่งงาน Asterisk ครับ ไม่ต้องทำเป็นไฟล์ .conf เลย
โดยทำเว็บขึ้นมา แก้ไขข้อมูลคอนฟิกต่างๆบนเว็บ อย่างเช่น dialplan, sip extensions, iax extensions, voicemail เก็บลงดาต้าเบส ให้ Asterisk มาอ่านจากในดาต้าเบสไปทำงาน ประมาณนี้ครับ

** โปรแกรม FreePBX (Elastix) ถ้าเคยใช้งานหนะครับ ไม่ใช่ตัวอย่างของ Asterisk Real Time นะครับ หลายคนเข้าใจผิด เพราะเวลาเราแก้คอนฟิกบนหน้าเว็บ มันเซฟลงดาต้าเบสก็จริง แต่ที่สุดเมื่อเรากด Apply... มันจะไรท์เป็นไฟล์ .conf แล้วให้ Asterisk มาดึงข้อมูลจาก .conf ไม่ได้ดึงจากดาต้าเบส ดังนั้นมันจึงไม่ได้ใช้งาน Asterisk Real Time ด้วยประการฉะนี้ **

** ถ้าถามผมว่าอะไรทำงานเร็วกว่ากันระหว่าง Asterisk Real Time กับแบบไม่ Real Time ผมว่าแบบแรกทำงานเร็วกว่า โดยเฉพาะเมื่อข้อมูลมีเยอะๆ อ่านจากดาต้าเบสมันเร็วกว่าอยู่แล้ว **
** หากมีปัญหากับอุปกรณ์ที่ซื้อมาเองหรือบริการที่ทำขึ้นมาเอง ให้โพสต์ถามในเว็บบอร์ดนี้นะครับ **
** งานเร่งด่วนติดต่อว่าจ้างที่เบอร์ 08-5161-9439 อีเมล์ iamaladin@gmail.com ไลน์ NuizVoip ครับ **
nuiz
Diamond Member
 
โพสต์: 7069
ลงทะเบียนเมื่อ: 24 มี.ค. 2010 09:33

Re: ดาต้าเบสของ Asterisk สำหรับทำ Asterisk Realtime

โพสต์โดย Phichate Sukklay » 03 มิ.ย. 2013 14:09

ขอบคุณครับคุณหนุ่ย
Phichate Sukklay
Bronz Member
 
โพสต์: 12
ลงทะเบียนเมื่อ: 10 ม.ค. 2011 14:27

Re: ดาต้าเบสของ Asterisk สำหรับทำ Asterisk Realtime

โพสต์โดย vacharaa » 15 พ.ย. 2013 11:53

พอดีกำลังหาข้อมูลอยู่มาเจอ ผมใช้ elastix อยู่ ถ้าผมจะใช้ asterisk realtime ด้วยจะได้ไหมครับ
vacharaa
Silver Member
 
โพสต์: 32
ลงทะเบียนเมื่อ: 04 ก.พ. 2010 21:58

Re: ดาต้าเบสของ Asterisk สำหรับทำ Asterisk Realtime

โพสต์โดย nuiz » 15 พ.ย. 2013 16:25

ไม่น่าจะได้ครับ สาเหตุเพราะ Elastix ใช้ FreePBX มาช่วยในส่วนของการคอนฟิกสั่งงาน Asterisk ครับ (เมนู PBX ไงครับ) แล้วเจ้า FreePBX นี่ก็ไม่ได้ใช้ Asterisk Realtime หน่ะครับ
** หากมีปัญหากับอุปกรณ์ที่ซื้อมาเองหรือบริการที่ทำขึ้นมาเอง ให้โพสต์ถามในเว็บบอร์ดนี้นะครับ **
** งานเร่งด่วนติดต่อว่าจ้างที่เบอร์ 08-5161-9439 อีเมล์ iamaladin@gmail.com ไลน์ NuizVoip ครับ **
nuiz
Diamond Member
 
โพสต์: 7069
ลงทะเบียนเมื่อ: 24 มี.ค. 2010 09:33

Re: ดาต้าเบสของ Asterisk สำหรับทำ Asterisk Realtime

โพสต์โดย vacharaa » 16 พ.ย. 2013 08:48

อ๋อ ครับ ขอบคุณมากครับ ผมกำลังเซ็ต server ตัวใหม่ครับ ตัวเก่า มันแฮงก์่บ่อยมาก
vacharaa
Silver Member
 
โพสต์: 32
ลงทะเบียนเมื่อ: 04 ก.พ. 2010 21:58

Re: ดาต้าเบสของ Asterisk สำหรับทำ Asterisk Realtime

โพสต์โดย sleepy » 11 ธ.ค. 2013 16:59

รบกวนสอบถามครับ คือผมลองสร้างดาต้าเบส ตามคำสั่งนี้
โค้ด: เลือกทั้งหมด
CREATE DATABASE `asteriskrealtime` DEFAULT CHARACTER SET latin1 COLLATE utf8_general_ci;

แล้วมันก็แจ้งเออเร่อแบบนี้ครับ
โค้ด: เลือกทั้งหมด
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'

เป็นเพราะมันไม่อัพเดท หรือป่าวครับ
พอดีไม่เคยใช้ MySql บน CentOS เลยงงๆ ใช้ไม่ค่อยถูก
sleepy
Silver Member
 
โพสต์: 20
ลงทะเบียนเมื่อ: 21 ม.ค. 2010 16:44

ต่อไป

ย้อนกลับไปยัง Asterisk SIP Server

ผู้ใช้งานขณะนี้

กำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และ บุคคลทั่วไป 3 ท่าน

cron