Newer
Older
return ($this->get('task_assignment_alert_team_members'));
}
function alertONOverdueTask() {
return ($this->get('task_overdue_alert_active'));
}
function alertAssignedONOverdueTask() {
return ($this->get('task_overdue_alert_assigned'));
}
function alertDeptManagerONOverdueTask() {
return ($this->get('task_overdue_alert_dept_manager'));
}
function alertDeptMembersONOverdueTask() {
return ($this->get('task_overdue_alert_dept_members'));
}
/* Error alerts sent to admin email when enabled */
function alertONSQLError() {
return ($this->get('send_sql_errors'));
return ($this->get('send_login_errors'));
function getAllowedFileTypes() {
return trim($this->get('allowed_filetypes'));
return ($this->get('email_attachments'));
return ($this->get('allow_attachments'));
function getPrimaryLanguage() {
return $this->get('system_language');
}
function getSecondaryLanguages() {
$langs = $this->get('secondary_langs');
$langs = (is_string($langs)) ? explode(',', $langs) : array();
return array_filter($langs);
/* Needed by upgrader on 1.6 and older releases upgrade - not not remove */
function getDefaultStorageBackendChar() {
return $this->get('default_storage_bk');
}
function getVar($name) {
return $this->get($name);
}
function updateSettings($vars, &$errors) {
if(!$vars || $errors)
return false;
case 'system':
return $this->updateSystemSettings($vars, $errors);
return $this->updateTicketsSettings($vars, $errors);
case 'tasks':
return $this->updateTasksSettings($vars, $errors);
break;
return $this->updateEmailsSettings($vars, $errors);
case 'pages':
return $this->updatePagesSettings($vars, $errors);
break;
case 'agents':
return $this->updateAgentsSettings($vars, $errors);
break;
case 'users':
return $this->updateUsersSettings($vars, $errors);
return $this->updateKBSettings($vars, $errors);
Michael
committed
$errors['err']=sprintf('%s - %s', __('Unknown setting option'), __('Get technical help!'));
function updateSystemSettings($vars, &$errors) {
$f['helpdesk_url']=array('type'=>'string', 'required'=>1, 'error'=>__('Helpdesk URL is required'));
$f['helpdesk_title']=array('type'=>'string', 'required'=>1, 'error'=>__('Helpdesk title is required'));
$f['default_dept_id']=array('type'=>'int', 'required'=>1, 'error'=>__('Default Department is required'));
$f['autolock_minutes']=array('type'=>'int', 'required'=>1, 'error'=>__('Enter lock time in minutes'));
$f['time_format']=array('type'=>'string', 'required'=>1, 'error'=>__('Time format is required'));
$f['date_format']=array('type'=>'string', 'required'=>1, 'error'=>__('Date format is required'));
$f['datetime_format']=array('type'=>'string', 'required'=>1, 'error'=>__('Datetime format is required'));
$f['daydatetime_format']=array('type'=>'string', 'required'=>1, 'error'=>__('Day, Datetime format is required'));
$f['default_timezone']=array('type'=>'string', 'required'=>1, 'error'=>__('Default Timezone is required'));
$f['system_language']=array('type'=>'string', 'required'=>1, 'error'=>__('A primary system language is required'));
// Make sure the selected backend is valid
$storagebk = null;
if (isset($vars['default_storage_bk'])) {
try {
$storagebk = FileStorageBackend::lookup($vars['default_storage_bk']);
} catch (Exception $ex) {
$errors['default_storage_bk'] = $ex->getMessage();
}
}
if(!Validator::process($f, $vars, $errors) || $errors)
// Manage secondard languages
$vars['secondary_langs'][] = $vars['add_secondary_language'];
foreach ($vars['secondary_langs'] as $i=>$lang) {
if (!$lang || !Internationalization::isLanguageInstalled($lang))
unset($vars['secondary_langs'][$i]);
}
$secondary_langs = implode(',', $vars['secondary_langs']);
if ($storagebk)
$this->update('default_storage_bk', $storagebk->getBkChar());
return $this->updateAll(array(
'isonline'=>$vars['isonline'],
'helpdesk_title'=>$vars['helpdesk_title'],
'helpdesk_url'=>$vars['helpdesk_url'],
'default_dept_id'=>$vars['default_dept_id'],
'max_page_size'=>$vars['max_page_size'],
'log_level'=>$vars['log_level'],
'log_graceperiod'=>$vars['log_graceperiod'],
'time_format'=>$vars['time_format'],
'date_format'=>$vars['date_format'],
'datetime_format'=>$vars['datetime_format'],
'daydatetime_format'=>$vars['daydatetime_format'],
'date_formats'=>$vars['date_formats'],
'default_timezone'=>$vars['default_timezone'],
'default_locale'=>$vars['default_locale'],
'system_language'=>$vars['system_language'],
'secondary_langs'=>$secondary_langs,
'max_file_size' => $vars['max_file_size'],
'autolock_minutes' => $vars['autolock_minutes'],
'enable_avatars' => isset($vars['enable_avatars']) ? 1 : 0,
'enable_richtext' => isset($vars['enable_richtext']) ? 1 : 0,
'files_req_auth' => isset($vars['files_req_auth']) ? 1 : 0,
function updateAgentsSettings($vars, &$errors) {
$f=array();
$f['staff_session_timeout']=array('type'=>'int', 'required'=>1, 'error'=>'Enter idle time in minutes');
$f['pw_reset_window']=array('type'=>'int', 'required'=>1, 'min'=>1,
'error'=>__('Valid password reset window required'));
require_once INCLUDE_DIR.'class.avatar.php';
list($avatar_source) = explode('.', $vars['agent_avatar']);
if (!AvatarSource::lookup($avatar_source))
$errors['agent_avatar'] = __('Select a value from the list');
if(!Validator::process($f, $vars, $errors) || $errors)
return false;
return $this->updateAll(array(
'passwd_reset_period'=>$vars['passwd_reset_period'],
'staff_max_logins'=>$vars['staff_max_logins'],
'staff_login_timeout'=>$vars['staff_login_timeout'],
'staff_session_timeout'=>$vars['staff_session_timeout'],
'staff_ip_binding'=>isset($vars['staff_ip_binding'])?1:0,
'allow_pw_reset'=>isset($vars['allow_pw_reset'])?1:0,
'pw_reset_window'=>$vars['pw_reset_window'],
'agent_name_format'=>$vars['agent_name_format'],
'hide_staff_name'=>isset($vars['hide_staff_name']) ? 1 : 0,
'agent_avatar'=>$vars['agent_avatar'],
));
}
function updateUsersSettings($vars, &$errors) {
$f=array();
$f['client_session_timeout']=array('type'=>'int', 'required'=>1, 'error'=>'Enter idle time in minutes');
require_once INCLUDE_DIR.'class.avatar.php';
list($avatar_source) = explode('.', $vars['client_avatar']);
if (!AvatarSource::lookup($avatar_source))
$errors['client_avatar'] = __('Select a value from the list');
if(!Validator::process($f, $vars, $errors) || $errors)
return false;
return $this->updateAll(array(
'client_max_logins'=>$vars['client_max_logins'],
'client_login_timeout'=>$vars['client_login_timeout'],
'client_session_timeout'=>$vars['client_session_timeout'],
'clients_only'=>isset($vars['clients_only'])?1:0,
'client_registration'=>$vars['client_registration'],
'client_verify_email'=>isset($vars['client_verify_email'])?1:0,
'allow_auth_tokens' => isset($vars['allow_auth_tokens']) ? 1 : 0,
'client_name_format'=>$vars['client_name_format'],
'client_avatar'=>$vars['client_avatar'],
function updateTicketsSettings($vars, &$errors) {
$f['default_sla_id']=array('type'=>'int', 'required'=>1, 'error'=>__('Selection required'));
$f['default_ticket_status_id'] = array('type'=>'int', 'required'=>1, 'error'=>__('Selection required'));
$f['default_priority_id']=array('type'=>'int', 'required'=>1, 'error'=>__('Selection required'));
$f['max_open_tickets']=array('type'=>'int', 'required'=>1, 'error'=>__('Enter valid numeric value'));
if($vars['enable_captcha']) {
if (!extension_loaded('gd'))
$errors['enable_captcha']=__('The GD extension is required');
$errors['enable_captcha']=__('PNG support is required for Image Captcha');
if ($vars['default_help_topic']
&& ($T = Topic::lookup($vars['default_help_topic']))
&& !$T->isActive()) {
$errors['default_help_topic'] = __('Default help topic must be set to active');
if (!preg_match('`(?!<\\\)#`', $vars['ticket_number_format']))
$errors['ticket_number_format'] = 'Ticket number format requires at least one hash character (#)';
$this->updateAutoresponderSettings($vars, $errors);
$this->updateAlertsSettings($vars, $errors);
if(!Validator::process($f, $vars, $errors) || $errors)
'ticket_number_format'=>$vars['ticket_number_format'] ?: '######',
'ticket_sequence_id'=>$vars['ticket_sequence_id'] ?: 0,
'default_priority_id'=>$vars['default_priority_id'],
'default_help_topic'=>$vars['default_help_topic'],
'default_ticket_status_id'=>$vars['default_ticket_status_id'],
'default_sla_id'=>$vars['default_sla_id'],
'max_open_tickets'=>$vars['max_open_tickets'],
'enable_captcha'=>isset($vars['enable_captcha'])?1:0,
'auto_claim_tickets'=>isset($vars['auto_claim_tickets'])?1:0,
'show_assigned_tickets'=>isset($vars['show_assigned_tickets'])?0:1,
'show_answered_tickets'=>isset($vars['show_answered_tickets'])?0:1,
'show_related_tickets'=>isset($vars['show_related_tickets'])?1:0,
'allow_client_updates'=>isset($vars['allow_client_updates'])?1:0,
'ticket_lock' => $vars['ticket_lock'],
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
function updateTasksSettings($vars, &$errors) {
$f=array();
$f['default_task_priority_id']=array('type'=>'int', 'required'=>1, 'error'=>__('Selection required'));
if (!preg_match('`(?!<\\\)#`', $vars['task_number_format']))
$errors['task_number_format'] = 'Task number format requires at least one hash character (#)';
Validator::process($f, $vars, $errors);
if ($vars['task_alert_active']
&& (!isset($vars['task_alert_admin'])
&& !isset($vars['task_alert_dept_manager'])
&& !isset($vars['task_alert_dept_members'])
&& !isset($vars['task_alert_acct_manager']))) {
$errors['task_alert_active'] = __('Select recipient(s)');
}
if ($vars['task_activity_alert_active']
&& (!isset($vars['task_activity_alert_laststaff'])
&& !isset($vars['task_activity_alert_assigned'])
&& !isset($vars['task_activity_alert_dept_manager']))) {
$errors['task_activity_alert_active'] = __('Select recipient(s)');
}
if ($vars['task_transfer_alert_active']
&& (!isset($vars['task_transfer_alert_assigned'])
&& !isset($vars['task_transfer_alert_dept_manager'])
&& !isset($vars['task_transfer_alert_dept_members']))) {
$errors['task_transfer_alert_active'] = __('Select recipient(s)');
}
if ($vars['task_overdue_alert_active']
&& (!isset($vars['task_overdue_alert_assigned'])
&& !isset($vars['task_overdue_alert_dept_manager'])
&& !isset($vars['task_overdue_alert_dept_members']))) {
$errors['task_overdue_alert_active'] = __('Select recipient(s)');
}
if ($vars['task_assignment_alert_active']
&& (!isset($vars['task_assignment_alert_staff'])
&& !isset($vars['task_assignment_alert_team_lead'])
&& !isset($vars['task_assignment_alert_team_members']))) {
$errors['task_assignment_alert_active'] = __('Select recipient(s)');
}
if ($errors)
return false;
return $this->updateAll(array(
'task_number_format'=>$vars['task_number_format'] ?: '######',
'task_sequence_id'=>$vars['task_sequence_id'] ?: 0,
'default_task_priority_id'=>$vars['default_task_priority_id'],
'default_task_sla_id'=>$vars['default_task_sla_id'],
'task_alert_active'=>$vars['task_alert_active'],
'task_alert_admin'=>isset($vars['task_alert_admin']) ? 1 : 0,
'task_alert_dept_manager'=>isset($vars['task_alert_dept_manager']) ? 1 : 0,
'task_alert_dept_members'=>isset($vars['task_alert_dept_members']) ? 1 : 0,
'task_activity_alert_active'=>$vars['task_activity_alert_active'],
'task_activity_alert_laststaff'=>isset($vars['task_activity_alert_laststaff']) ? 1 : 0,
'task_activity_alert_assigned'=>isset($vars['task_activity_alert_assigned']) ? 1 : 0,
'task_activity_alert_dept_manager'=>isset($vars['task_activity_alert_dept_manager']) ? 1 : 0,
'task_assignment_alert_active'=>$vars['task_assignment_alert_active'],
'task_assignment_alert_staff'=>isset($vars['task_assignment_alert_staff']) ? 1 : 0,
'task_assignment_alert_team_lead'=>isset($vars['task_assignment_alert_team_lead']) ? 1 : 0,
'task_assignment_alert_team_members'=>isset($vars['task_assignment_alert_team_members']) ? 1 : 0,
'task_transfer_alert_active'=>$vars['task_transfer_alert_active'],
'task_transfer_alert_assigned'=>isset($vars['task_transfer_alert_assigned']) ? 1 : 0,
'task_transfer_alert_dept_manager'=>isset($vars['task_transfer_alert_dept_manager']) ? 1 : 0,
'task_transfer_alert_dept_members'=>isset($vars['task_transfer_alert_dept_members']) ? 1 : 0,
'task_overdue_alert_active'=>$vars['task_overdue_alert_active'],
'task_overdue_alert_assigned'=>isset($vars['task_overdue_alert_assigned']) ? 1 : 0,
'task_overdue_alert_dept_manager'=>isset($vars['task_overdue_alert_dept_manager']) ? 1 : 0,
'task_overdue_alert_dept_members'=>isset($vars['task_overdue_alert_dept_members']) ? 1 : 0,
));
}
function updateEmailsSettings($vars, &$errors) {
$f['default_template_id']=array('type'=>'int', 'required'=>1, 'error'=>__('You must select template'));
$f['default_email_id']=array('type'=>'int', 'required'=>1, 'error'=>__('Default email is required'));
$f['alert_email_id']=array('type'=>'int', 'required'=>1, 'error'=>__('Selection required'));
$f['admin_email']=array('type'=>'email', 'required'=>1, 'error'=>__('System admin email is required'));
if($vars['strip_quoted_reply'] && !trim($vars['reply_separator']))
$errors['reply_separator']=__('Reply separator is required to strip quoted reply.');
if($vars['admin_email'] && Email::getIdByEmail($vars['admin_email'])) //Make sure admin email is not also a system email.
$errors['admin_email']=__('Email already setup as system email');
if(!Validator::process($f,$vars,$errors) || $errors)
return false;
'default_template_id'=>$vars['default_template_id'],
'default_email_id'=>$vars['default_email_id'],
'alert_email_id'=>$vars['alert_email_id'],
'default_smtp_id'=>$vars['default_smtp_id'],
'admin_email'=>$vars['admin_email'],
'verify_email_addrs'=>isset($vars['verify_email_addrs']) ? 1 : 0,
'enable_auto_cron'=>isset($vars['enable_auto_cron'])?1:0,
'enable_mail_polling'=>isset($vars['enable_mail_polling'])?1:0,
'strip_quoted_reply'=>isset($vars['strip_quoted_reply'])?1:0,
'use_email_priority'=>isset($vars['use_email_priority'])?1:0,
'accept_unregistered_email'=>isset($vars['accept_unregistered_email'])?1:0,
'add_email_collabs'=>isset($vars['add_email_collabs'])?1:0,
'reply_separator'=>$vars['reply_separator'],
'email_attachments'=>isset($vars['email_attachments'])?1:0,
function getLogo($site) {
$id = $this->get("{$site}_logo_id", false);
return ($id) ? AttachmentFile::lookup((int) $id) : null;
}
function getClientLogo() {
return $this->getLogo('client');
}
function getLogoId($site) {
return $this->get("{$site}_logo_id", false);
}
function getClientLogoId() {
return $this->getLogoId('client');
}
function getStaffLogoId() {
return $this->getLogoId('staff');
}
function getStaffLogo() {
return $this->getLogo('staff');
}
function getStaffLoginBackdropId() {
return $this->get("staff_backdrop_id", false);
}
function getStaffLoginBackdrop() {
$id = $this->getStaffLoginBackdropId();
return ($id) ? AttachmentFile::lookup((int) $id) : null;
}
function isAuthRequiredForFiles() {
return $this->get('files_req_auth');
}
function updatePagesSettings($vars, &$errors) {
$f=array();
$f['landing_page_id'] = array('type'=>'int', 'required'=>1, 'error'=>'required');
$f['offline_page_id'] = array('type'=>'int', 'required'=>1, 'error'=>'required');
$f['thank-you_page_id'] = array('type'=>'int', 'required'=>1, 'error'=>'required');
if ($_FILES['logo']) {
$error = false;
list($logo) = AttachmentFile::format($_FILES['logo']);
if (!$logo)
; // Pass
elseif ($logo['error'])
$errors['logo'] = $logo['error'];
elseif (!AttachmentFile::uploadLogo($logo, $error))
$errors['logo'] = sprintf(__('Unable to upload logo image: %s'), $error);
if ($_FILES['backdrop']) {
$error = false;
list($backdrop) = AttachmentFile::format($_FILES['backdrop']);
if (!$backdrop)
; // Pass
elseif ($backdrop['error'])
$errors['backdrop'] = $backdrop['error'];
elseif (!AttachmentFile::uploadBackdrop($backdrop, $error))
$errors['backdrop'] = sprintf(__('Unable to upload backdrop image: %s'), $error);
}
$company = $ost->company;
$company_form = $company->getForm();
if (!$company_form->isValid())
$errors += $company_form->errors();
if(!Validator::process($f, $vars, $errors) || $errors)
return false;
if (isset($vars['delete-logo']))
foreach ($vars['delete-logo'] as $id)
if (($vars['selected-logo'] != $id)
&& ($f = AttachmentFile::lookup((int) $id)))
if (isset($vars['delete-backdrop']))
foreach ($vars['delete-backdrop'] as $id)
&& ($f = AttachmentFile::lookup((int) $id)))
$f->delete();
return $this->updateAll(array(
'landing_page_id' => $vars['landing_page_id'],
'offline_page_id' => $vars['offline_page_id'],
'thank-you_page_id' => $vars['thank-you_page_id'],
'client_logo_id' => (
(is_numeric($vars['selected-logo']) && $vars['selected-logo'])
? $vars['selected-logo'] : false),
'staff_logo_id' => (
(is_numeric($vars['selected-logo-scp']) && $vars['selected-logo-scp'])
? $vars['selected-logo-scp'] : false),
'staff_backdrop_id' => (
(is_numeric($vars['selected-backdrop']) && $vars['selected-backdrop'])
? $vars['selected-backdrop'] : false),
function updateAutoresponderSettings($vars, &$errors) {
'ticket_autoresponder'=>isset($vars['ticket_autoresponder']) ? 1 : 0,
'message_autoresponder'=>isset($vars['message_autoresponder']) ? 1 : 0,
'message_autoresponder_collabs'=>isset($vars['message_autoresponder_collabs']) ? 1 : 0,
'ticket_notice_active'=>isset($vars['ticket_notice_active']) ? 1 : 0,
'overlimit_notice_active'=>isset($vars['overlimit_notice_active']) ? 1 : 0,
function updateKBSettings($vars, &$errors) {
if ($vars['restrict_kb'] && !$this->isClientRegistrationEnabled())
$errors['restrict_kb'] =
__('The knowledge base cannot be restricted unless client registration is enabled');
if ($errors) return false;
return $this->updateAll(array(
'enable_kb'=>isset($vars['enable_kb'])?1:0,
'restrict_kb'=>isset($vars['restrict_kb'])?1:0,
'enable_premade'=>isset($vars['enable_premade'])?1:0,
function updateAlertsSettings($vars, &$errors) {
if($vars['ticket_alert_active']
&& (!isset($vars['ticket_alert_admin'])
&& !isset($vars['ticket_alert_dept_manager'])
&& !isset($vars['ticket_alert_dept_members'])
&& !isset($vars['ticket_alert_acct_manager']))) {
$errors['ticket_alert_active']=__('Select recipient(s)');
}
if($vars['message_alert_active']
&& (!isset($vars['message_alert_laststaff'])
&& !isset($vars['message_alert_assigned'])
&& !isset($vars['message_alert_dept_manager'])
&& !isset($vars['message_alert_acct_manager']))) {
$errors['message_alert_active']=__('Select recipient(s)');
}
if($vars['note_alert_active']
&& (!isset($vars['note_alert_laststaff'])
&& !isset($vars['note_alert_assigned'])
&& !isset($vars['note_alert_dept_manager']))) {
$errors['note_alert_active']=__('Select recipient(s)');
}
if($vars['transfer_alert_active']
&& (!isset($vars['transfer_alert_assigned'])
&& !isset($vars['transfer_alert_dept_manager'])
&& !isset($vars['transfer_alert_dept_members']))) {
$errors['transfer_alert_active']=__('Select recipient(s)');
}
if($vars['overdue_alert_active']
&& (!isset($vars['overdue_alert_assigned'])
&& !isset($vars['overdue_alert_dept_manager'])
&& !isset($vars['overdue_alert_dept_members']))) {
$errors['overdue_alert_active']=__('Select recipient(s)');
}
if($vars['assigned_alert_active']
&& (!isset($vars['assigned_alert_staff'])
&& !isset($vars['assigned_alert_team_lead'])
&& !isset($vars['assigned_alert_team_members']))) {
$errors['assigned_alert_active']=__('Select recipient(s)');
return $this->updateAll(array(
'ticket_alert_active'=>$vars['ticket_alert_active'],
'ticket_alert_admin'=>isset($vars['ticket_alert_admin'])?1:0,
'ticket_alert_dept_manager'=>isset($vars['ticket_alert_dept_manager'])?1:0,
'ticket_alert_dept_members'=>isset($vars['ticket_alert_dept_members'])?1:0,
'ticket_alert_acct_manager'=>isset($vars['ticket_alert_acct_manager'])?1:0,
'message_alert_active'=>$vars['message_alert_active'],
'message_alert_laststaff'=>isset($vars['message_alert_laststaff'])?1:0,
'message_alert_assigned'=>isset($vars['message_alert_assigned'])?1:0,
'message_alert_dept_manager'=>isset($vars['message_alert_dept_manager'])?1:0,
'message_alert_acct_manager'=>isset($vars['message_alert_acct_manager'])?1:0,
'note_alert_active'=>$vars['note_alert_active'],
'note_alert_laststaff'=>isset($vars['note_alert_laststaff'])?1:0,
'note_alert_assigned'=>isset($vars['note_alert_assigned'])?1:0,
'note_alert_dept_manager'=>isset($vars['note_alert_dept_manager'])?1:0,
'assigned_alert_active'=>$vars['assigned_alert_active'],
'assigned_alert_staff'=>isset($vars['assigned_alert_staff'])?1:0,
'assigned_alert_team_lead'=>isset($vars['assigned_alert_team_lead'])?1:0,
'assigned_alert_team_members'=>isset($vars['assigned_alert_team_members'])?1:0,
'transfer_alert_active'=>$vars['transfer_alert_active'],
'transfer_alert_assigned'=>isset($vars['transfer_alert_assigned'])?1:0,
'transfer_alert_dept_manager'=>isset($vars['transfer_alert_dept_manager'])?1:0,
'transfer_alert_dept_members'=>isset($vars['transfer_alert_dept_members'])?1:0,
'overdue_alert_active'=>$vars['overdue_alert_active'],
'overdue_alert_assigned'=>isset($vars['overdue_alert_assigned'])?1:0,
'overdue_alert_dept_manager'=>isset($vars['overdue_alert_dept_manager'])?1:0,
'overdue_alert_dept_members'=>isset($vars['overdue_alert_dept_members'])?1:0,
'send_sys_errors'=>isset($vars['send_sys_errors'])?1:0,
'send_sql_errors'=>isset($vars['send_sql_errors'])?1:0,
'send_login_errors'=>isset($vars['send_login_errors'])?1:0,
}
//Used to detect version prior to 1.7 (useful during upgrade)
/* static */ function getDBVersion() {
$sql='SELECT `ostversion` FROM '.TABLE_PREFIX.'config '
.'WHERE id=1';
return db_result(db_query($sql));
}