⚝
One Hat Cyber Team
⚝
Your IP:
216.73.216.50
Server IP:
41.128.143.86
Server:
Linux host.raqmix.cloud 6.8.0-1025-azure #30~22.04.1-Ubuntu SMP Wed Mar 12 15:28:20 UTC 2025 x86_64
Server Software:
Apache
PHP Version:
8.3.23
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
proc
/
self
/
root
/
usr
/
share
/
psa-pear
/
pear
/
View File Name :
nag-convert-datatree-shares-to-sql
#!/usr/bin/env php get('horde_dir', null, 'pear.horde.org') . '/nag/lib/Application.php'; } Horde_Registry::appInit('nag', array('cli' => true)); $db = $injector->getInstance('Horde_Db_Adapter'); $error_cnt = 0; $delete_dt_data = false; $answer = $cli->prompt('Do you want to keep your old datatree data or delete it?', array('Keep', 'Delete')); if ($answer == 1) { $delete_dt_data = true; } $answer = $cli->prompt(sprintf("Data will be copied into the new tables, and %s be deleted from the datatree.\n Is this what you want?", $delete_dt_data ? 'WILL' : 'WILL NOT'), array('y' => 'Yes', 'n' => 'No')); if ($answer != 'y') { exit; } /* Get the share entries */ try { $shares_result = $db->selectAssoc('SELECT datatree_id, datatree_name FROM horde_datatree WHERE group_uid = ' . $db->quoteString('horde.shares.nag')); } catch (Horde_Db_Exception $e) { $cli->message($e->getMessage(), 'cli.error'); exit; } $query = 'SELECT attribute_name, attribute_key, attribute_value FROM horde_datatree_attributes WHERE datatree_id = ?'; foreach ($shares_result as $share_id => $share_name) { $data = array('share_name' => $share_name); try { $rows = $db->select($query, array($share_id)); } catch (Horde_Db_Exception $e) { $cli->message($e->getMessage(), 'cli.error'); exit; } $users = array(); $groups = array(); foreach ($rows as $row) { if ($row['attribute_name'] == 'perm_groups') { /* Group table entry */ $groups[] = array('group_uid' => $row['attribute_key'], 'perm' => $row['attribute_value']); } elseif ($row['attribute_name'] == 'perm_users') { /* User table entry */ $users[] = array('user_uid' => $row['attribute_key'], 'perm' => $row['attribute_value']); } else { /* Everything else goes in the main share table */ switch ($row['attribute_name']) { case 'perm_creator': case 'perm_default': case 'perm_guest': $data[$row['attribute_name']] = $row['attribute_value']; break; case 'owner': $data['share_owner'] = $row['attribute_value']; break; case 'name': // Note the key to the $data array is not related to // the attribute_name field in the dt_attributes table. $data['attribute_name'] = $row['attribute_value']; break; case 'desc': $data['attribute_desc'] = $row['attribute_value']; break; } } } /* Set flags */ $data['share_flags'] = 0; if (count($users)) { $data['share_flags'] |= 1; } if (count($groups)) { $data['share_flags'] |= 2; } /* Insert the new data */ $cli->message('Migrating share data for share_id: ' . $share_id, 'cli.message'); $error = false; $db->beginDbTransaction(); try { $nextId = insertData('nag_shares', $data, $db); } catch (Horde_Db_Exception $e) { $cli->message($e->getMessage(), 'cli.error'); $error = true; } if (count($groups)) { foreach ($groups as $group) { $group['share_id'] = $nextId; try { insertData('nag_shares_groups', $group, $db); } catch (Horde_Db_Exception $e) { $cli->message($e->getMessage(), 'cli.error'); $error = true; } } } if (count($users)) { foreach ($users as $user) { $user['share_id'] = $nextId; try { $result = insertData('nag_shares_users', $user, $db); } catch (Horde_Db_Exception $e) { $cli->message($result->getMessage(), 'cli.error'); $error = true; } } } /* Delete the datatree data, but ONLY if it was requested */ if ($delete_dt_data && !$error) { $cli->message('DELETING datatree data for share_id: ' . $share_id, 'cli.message'); try { $db->delete('DELETE FROM horde_datatree_attributes WHERE datatree_id = ?', array($share_id)); $db->delete('DELETE FROM horde_datatree WHERE datatree_id = ?', array($share_id)); } catch (Horde_Db_Exception $e) { $cli->message($e->getMessage(), 'cli.error'); $error = true; } } unset($row, $rows, $data, $groups, $users); if ($error) { $db->rollbackDbTransaction(); $cli->message('Rollback for share data for share_id: ' . $share_id, 'cli.message'); ++$error_cnt; } else { $db->commitDbTransaction(); $cli->message('Commit for share data for share_id: ' . $share_id, 'cli.message'); } } if ($error_cnt) { $cli->message(sprintf("Encountered %u errors.", $error_cnt)); } echo "\nDone.\n"; /** * Helper function */ function insertData($table, $data, $db) { $fields = array_keys($data); $values = array_values($data); $sql = 'INSERT INTO ' . $table . ' (' . implode(', ', $fields) . ') VALUES (' . str_repeat('?, ', count($values) - 1) . '?)'; return $db->insert($sql, $values); }