diff --git a/CHANGELOG.md b/CHANGELOG.md index 0347c33..87edda3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # CHANGELOG # +xs 7.x-1.4, 2015-12-13 +---------------------- +[] ig: Added xs_action_log entity. +[] ig: Added view for user to access server actions log. +[] ig: Added view for user to access snapshot actions log. +[] ig: Added view for admin to access server all actions log. +[] ig: Added view for admin to access snapshot all actions log. +[] ig: Updated policy log to assert node access permissions. + xs 7.x-1.3, 2015-12-12 ---------------------- [] ig: Replaced policy events log with a view. diff --git a/includes/xs.actions.inc b/includes/xs.actions.inc index 8687a69..85c87ba 100644 --- a/includes/xs.actions.inc +++ b/includes/xs.actions.inc @@ -130,6 +130,8 @@ function xs_actions_server_action_confirmation_form_submit($form, &$form_state) * @return string */ function xs_actions_action($node, $action) { + global $user; + $vm = xs_get_vm_by_node($node); if (!in_array($action, $vm['allowed_operations'])) { @@ -145,34 +147,48 @@ function xs_actions_action($node, $action) { xs_actions_action_vps_start($vm_ref); drupal_set_message('The server has been started. Allow 1-2 minutes before attempting to connect.'); drupal_set_message('You may need to refresh this page in order to reflect server\'s power state or IP addresses.'); + $log_message = t('Server started manually by !user', array('!user' => $user->name)); + $log_type = XS_API_ACTION_START; break; case XS_API_ACTION_POWEROFF: xs_actions_action_vps_shutdown($vm_ref); drupal_set_message('The server is being shut down. Allow 1-2 minutes before it has shut down.'); drupal_set_message('You may need to refresh this page in order to reflect server\'s power state'); + $log_message = t('Server stopped manually by !user', array('!user' => $user->name)); + $log_type = XS_API_ACTION_POWEROFF; break; case XS_API_ACTION_REBOOT: xs_actions_action_vps_clean_reboot($vm_ref); drupal_set_message('The server is being rebooted. Allow 1-2 minutes for the operation to complete.'); + $log_message = t('Server rebooted manually by !user', array('!user' => $user->name)); + $log_type = XS_API_ACTION_REBOOT; break; case XS_API_ACTION_REBOOT_FORCE: xs_actions_action_vps_hard_reboot($vm_ref); drupal_set_message('The server has been forcefully rebooted. Allow 1-2 minutes for the operation to complete.'); + $log_message = t('Server force-rebooted manually by !user', array('!user' => $user->name)); + $log_type = XS_API_ACTION_REBOOT_FORCE; break; case XS_API_ACTION_POWEROFF_FORCE: xs_actions_action_vps_hard_shutdown($vm_ref); drupal_set_message('The server has been forcefully shut down. Allow 1-2 minutes for the operation to complete.'); + $log_message = t('Server force-shutdown manually by !user', array('!user' => $user->name)); + $log_type = XS_API_ACTION_POWEROFF_FORCE; break; default: drupal_set_message('This action is not recognised', 'error'); + $log_message = t('Unrecognised server action by !user', array('!user' => $user->name)); + $log_type = 'error'; break; } + xs_action_log_write($log_message, $log_type); + drupal_goto('node/' . $node->nid); } diff --git a/includes/xs.pages.inc b/includes/xs.pages.inc index 12bf0ca..6aee686 100644 --- a/includes/xs.pages.inc +++ b/includes/xs.pages.inc @@ -104,20 +104,6 @@ function xs_settings_form_submit($form, &$form_state) { variable_set('xs_pool_is', $form_state['values']['xs_pool_is']); } -/** - * Renders a block of pool servers. - * - * @return string - * Rendered HTML output. - */ -function xs_admin_pool_vms() { - drupal_set_title('Available Virtual Servers'); - $view = views_get_view('xs_pools_servers'); - $output = $view->preview('block'); - - return $output; -} - /** * Create a list of templates for administrator. * diff --git a/includes/xs.snapshots.inc b/includes/xs.snapshots.inc index c0cdd8b..5b44a6b 100644 --- a/includes/xs.snapshots.inc +++ b/includes/xs.snapshots.inc @@ -214,6 +214,11 @@ function xs_snapshots_create_snapshot_form($form, &$form_state, $node) { '#description' => t('Give a description meaningful to you. We record the exact date and time of snapshot creation for you. Limited to 64 characters. Click Cancel to close this modal window or Create to continue with snapshot creation.'), ); + $form['nid'] = array( + '#type' => 'hidden', + '#value' => $node, + ); + $form['actions'] = array( '#type' => 'container', '#attributes' => array( @@ -247,12 +252,11 @@ function xs_snapshots_create_snapshot_form($form, &$form_state, $node) { * Validate handler for xs_snapshots_create_snapshot_form. */ function xs_snapshots_create_snapshot_form_validate($form, &$form_state) { - $nid = is_numeric(arg(1)) ? arg(1) : FALSE; - if (!$nid) { + if (empty($form_state['values']['nid'])) { return form_set_error(NULL, 'Validation error. This form must be submitted in server context'); } - $node = node_load($nid); + $node = node_load($form_state['values']['nid']); $form_state['storage']['xs_snapshot_create']['node'] = $node; // Check if the user can add more snapshots. $limit = xs_get_snapshots_limit($node); @@ -276,6 +280,11 @@ function xs_snapshots_create_snapshot_form_submit($form, &$form_state) { throw new Exception('Unable to create snapshot: ' . $e->getMessage()); } + xs_action_log_write(t('Created snapshot !name for !server', array( + '!name' => $form_state['values']['title'], + '!server' => $form_state['storage']['xs_snapshot_create']['node']->title, + )), 'snapshot-create'); + $form_state['redirect'] = 'node/' . $form_state['storage']['xs_snapshot_create']['node']->nid . '/xs-snapshots'; } @@ -360,42 +369,57 @@ function xs_actions_confirm_snapshots_form_validate($form, &$form_state) { if (empty($form_state['values']['snapshot_uuid']) || empty($form_state['values']['action'])) { return form_set_error(NULL, 'Unable to complete the action. Validation error'); } + + // Do not allow form submission outside of node context. + if (!(is_numeric(arg(1)) && arg(0) == 'node')) { + return form_set_error(NULL, 'Validation error. Unable to submit your form outside of your server page'); + } } /** * Submit handler for xs_actions_confirm_snapshots_form. */ function xs_actions_confirm_snapshots_form_submit($form, &$form_state) { + $snapshot = xs_api_get_vm_by_uuid($form_state['values']['snapshot_uuid']); + $node = node_load($form_state['values']['nid']); + switch ($form_state['values']['action']) { case 'destroy': $snapshot_ref = xs_api_get_vm_ref_by_uuid($form_state['values']['snapshot_uuid']); xs_actions_snapshot_destroy($snapshot_ref); + xs_action_log_write(t('Deleted snapshot !name for !server', array( + '!name' => $snapshot['name_label'], + '!server' => $node->title, + )), 'snapshot-destroy'); drupal_set_message('The selected snapshot was deleted successfully'); drupal_goto('node/' . $form_state['values']['nid'] . '/xs-snapshots'); break; case 'revert': - if (is_numeric(arg(1)) && arg(0) == 'node') { - $node = node_load(arg(1)); - if (xs_actions_access_callback($node)) { - module_load_include('inc', 'xs', 'includes/xs.actions'); - // Load the VM. - $uuid = xs_get_vm_uuid_by_node($node); - $vm_ref = xs_api_get_vm_ref_by_uuid($uuid); + if (xs_actions_access_callback($node)) { + module_load_include('inc', 'xs', 'includes/xs.actions'); + + // Load the VM. + $uuid = xs_get_vm_uuid_by_node($node); + $vm_ref = xs_api_get_vm_ref_by_uuid($uuid); + + // Shut down the VM. + xs_actions_action_vps_hard_shutdown($vm_ref); - // Shut down the VM. - xs_actions_action_vps_hard_shutdown($vm_ref); + // Revert to the selected snapshot. + $snapshot_ref = xs_api_get_vm_ref_by_uuid($form_state['values']['snapshot_uuid']); + xs_actions_snapshot_revert($snapshot_ref); - // Revert to the selected snapshot. - $snapshot_ref = xs_api_get_vm_ref_by_uuid($form_state['values']['snapshot_uuid']); - xs_actions_snapshot_revert($snapshot_ref); + // Start the VM. + xs_actions_action_vps_start($vm_ref); - // Start the VM. - xs_actions_action_vps_start($vm_ref); + xs_action_log_write(t('Reverted server !server to snapshot !name', array( + '!name' => $snapshot['name_label'], + '!server' => $node->title, + )), 'snapshot-revert'); - drupal_set_message('Your Server has been reverted to the selected snapshot and started successfully'); - } + drupal_set_message('Your Server has been reverted to the selected snapshot and started successfully'); } drupal_goto('node/' . $form_state['values']['nid'] . '/xs-snapshots'); break; diff --git a/modules/xs_snapshot_policy/theme/xs_snapshot_policy.theme.inc b/modules/xs_snapshot_policy/theme/xs_snapshot_policy.theme.inc index eb24a19..5c8b69b 100644 --- a/modules/xs_snapshot_policy/theme/xs_snapshot_policy.theme.inc +++ b/modules/xs_snapshot_policy/theme/xs_snapshot_policy.theme.inc @@ -53,7 +53,7 @@ function xs_snapshot_policy_output_preprocess(&$variables) { } - $variables['policy_log_table'] = views_embed_view('xs_policy_log_runs_per_user', 'page_2', $variables['node']->nid); + $variables['policy_log_table'] = views_embed_view('xs_policy_log', 'page_2', $variables['node']->nid); $spid = !empty($policy->spid) ? $policy->spid : NULL; $policy_form = drupal_get_form('xs_snapshot_policy_form', $variables['node']->nid, $spid); $variables['policy_form'] = drupal_render($policy_form); diff --git a/modules/xs_snapshot_policy/views/views-view-field--xs-user-vms--page--nothing.tpl.php b/modules/xs_snapshot_policy/views/views-view-field--xs-user-vms--page--nothing.tpl.php deleted file mode 100644 index 91d92ee..0000000 --- a/modules/xs_snapshot_policy/views/views-view-field--xs-user-vms--page--nothing.tpl.php +++ /dev/null @@ -1,25 +0,0 @@ -{$field->field_alias} - * - * The above will guarantee that you'll always get the correct data, - * regardless of any changes in the aliasing that might happen if - * the view is modified. - */ -?> - diff --git a/modules/xs_snapshot_policy/xs_snapshot_policy.controller.inc b/modules/xs_snapshot_policy/xs_snapshot_policy.controller.inc index 66c8408..1cda8a5 100644 --- a/modules/xs_snapshot_policy/xs_snapshot_policy.controller.inc +++ b/modules/xs_snapshot_policy/xs_snapshot_policy.controller.inc @@ -114,6 +114,7 @@ class SnapshotPolicyLog extends Entity { public $id; public $policy_id; public $log; + public $type; public $created; public function __construct($values = array()) { diff --git a/modules/xs_snapshot_policy/xs_snapshot_policy.views.inc b/modules/xs_snapshot_policy/xs_snapshot_policy.views.inc index 738c71b..16a2669 100644 --- a/modules/xs_snapshot_policy/xs_snapshot_policy.views.inc +++ b/modules/xs_snapshot_policy/xs_snapshot_policy.views.inc @@ -42,7 +42,7 @@ function xs_snapshot_policy_views_data_alter(&$data) { * Implements hook_views_query_alter(). */ function xs_snapshot_policy_views_query_alter(&$view, &$query) { - if ($view->name == 'xs_policy_log_runs_per_user' && arg(0) == 'node' && arg(2) == 'xs-snapshot-policy' && arg(3) != 'policies-log') { + if ($view->name == 'xs_policy_log' && arg(0) == 'node' && arg(2) == 'xs-snapshot-policy' && arg(3) != 'policies-log') { // Remove views header when in policy view. $view->header = array(); } diff --git a/templates/node--xs_vps.tpl.php b/templates/node--xs_vps.tpl.php index f7ad96e..82e1500 100644 --- a/templates/node--xs_vps.tpl.php +++ b/templates/node--xs_vps.tpl.php @@ -120,140 +120,145 @@ -
-
-
-

Server Status

-
+
+
+
+

Server Status

+
-
-

+

+

-

- : - -   -
+
+ : + +   +
-
- - - - GB - - GB -
+
+ + + + GB + + GB +
-
- : - -
+
+ : + +
-
- : - -
+
+ : + +
+
-
-
-
-
-

Server Configuration

-
+
+
+
+

Server Configuration

+
+ +
+
+ : -
-
- : + +
    + $vif) : ?> +
  1. + : ' . $network['ips'][$delta] . '' : 'Unconfigured'; ?> MAC: + +
  2. + +
+ +
- -
    - $vif) : ?> + +
    + + $vbd) : ?> +
    1. - : ' . $network['ips'][$delta] . '' : 'Unconfigured'; ?> MAC: - + : Size + GB +
      Current utilisation: or GB
    2. - -
    +
+
+ -
-
- - $vbd) : ?> -
    -
  1. - : Size - GB -
    Current utilisation: or GB -
  2. -
-
- - + : + +
-
- : - -
+
+ : + +
+

-
- : -
-

-
-
-
-
-
-

Operating System

-
+
+
+
+

Operating System

+
-
+
-
    - -
  • - : -
  • - +
      + +
    • + : +
    • + - -
    • - : -
    • - + +
    • + : +
    • + - -
    • - : -
    • - + +
    • + : +
    • + - -
    • - : -
    • - + +
    • + : +
    • + - -
    • - : - - -
    • - -
    + +
  • + : + + +
  • + +
+
+
- +
+

Server Action Log

+ +
diff --git a/templates/xs-actions-snapshots-output.tpl.php b/templates/xs-actions-snapshots-output.tpl.php index 506d29e..e12fe87 100644 --- a/templates/xs-actions-snapshots-output.tpl.php +++ b/templates/xs-actions-snapshots-output.tpl.php @@ -89,6 +89,12 @@
+ +
diff --git a/theme/xs_theme.inc b/theme/xs_theme.inc index 3aaabf1..1618c02 100644 --- a/theme/xs_theme.inc +++ b/theme/xs_theme.inc @@ -13,6 +13,8 @@ function xs_preproces_xs_actions_snapshots_output(&$variables) { $variables['title_attributes_array'] = array(); $variables['content_attributes_array'] = array(); + $variables['xs_snapshot_actions_log'] = views_embed_view('xs_action_log', 'page_user_snapshots', $variables['node']->nid); + // Prepare variables. $vm = xs_get_vm_by_node($variables['node']); diff --git a/xs.controller.inc b/xs.controller.inc new file mode 100644 index 0000000..29137ae --- /dev/null +++ b/xs.controller.inc @@ -0,0 +1,40 @@ + arg(1), + 'log' => '', + 'type' => '', + 'uid' => $user->uid, + 'created' => REQUEST_TIME, + ); + + return parent::create($values); + } +} + +/** + * XsActionLog class. + */ +class XsActionLog extends Entity { + public $id; + public $target_id; + public $uid; + public $log; + public $type; + public $created; + + public function __construct($values = array()) { + parent::__construct($values, 'xs_action_log'); + } +} diff --git a/xs.features.user_permission.inc b/xs.features.user_permission.inc index a26a15c..67eae6e 100644 --- a/xs.features.user_permission.inc +++ b/xs.features.user_permission.inc @@ -19,6 +19,15 @@ function xs_user_default_permissions() { 'module' => 'xs', ); + // Exported permission: 'administer xs_snapshot_policy entities'. + $permissions['administer xs_snapshot_policy entities'] = array( + 'name' => 'administer xs_snapshot_policy entities', + 'roles' => array( + 'administrator' => 'administrator', + ), + 'module' => 'xs_snapshot_policy', + ); + // Exported permission: 'administer xs_snapshot_policy types'. $permissions['administer xs_snapshot_policy types'] = array( 'name' => 'administer xs_snapshot_policy types', @@ -121,6 +130,25 @@ function xs_user_default_permissions() { 'module' => 'xs', ); + // Exported permission: 'view any xs action log'. + $permissions['view any xs action log'] = array( + 'name' => 'view any xs action log', + 'roles' => array( + 'administrator' => 'administrator', + ), + 'module' => 'xs', + ); + + // Exported permission: 'view own xs action log'. + $permissions['view own xs action log'] = array( + 'name' => 'view own xs action log', + 'roles' => array( + 'XS VPS Customer' => 'XS VPS Customer', + 'administrator' => 'administrator', + ), + 'module' => 'xs', + ); + // Exported permission: 'view own xs_snapshot_policy entities'. $permissions['view own xs_snapshot_policy entities'] = array( 'name' => 'view own xs_snapshot_policy entities', @@ -131,5 +159,15 @@ function xs_user_default_permissions() { 'module' => 'xs_snapshot_policy', ); + // Exported permission: 'view xs_snapshot_policy log'. + $permissions['view xs_snapshot_policy log'] = array( + 'name' => 'view xs_snapshot_policy log', + 'roles' => array( + 'XS VPS Customer' => 'XS VPS Customer', + 'administrator' => 'administrator', + ), + 'module' => 'xs_snapshot_policy', + ); + return $permissions; } diff --git a/xs.info b/xs.info index f0df8d9..82254f0 100644 --- a/xs.info +++ b/xs.info @@ -2,7 +2,7 @@ name = Xenserver API description = Enables Drupal integration with Xenserver poos of servers. core = 7.x package = XS -version = 7.x-1.3 +version = 7.x-1.4 dependencies[] = content_access dependencies[] = entityreference dependencies[] = features @@ -33,6 +33,7 @@ features[menu_custom][] = user-menu features[node][] = xs_vps features[themekey_features_rule_chain][] = user:role = XS VPS Customer >>> ... rule cascade features[user_permission][] = administer xenserver pool +features[user_permission][] = administer xs_snapshot_policy entities features[user_permission][] = administer xs_snapshot_policy types features[user_permission][] = create xs_snapshot_policy entities features[user_permission][] = create xs_vps content @@ -44,7 +45,10 @@ features[user_permission][] = edit own xs_snapshot_policy entities features[user_permission][] = edit own xs_vps content features[user_permission][] = perform any vm actions features[user_permission][] = perform own vm actions +features[user_permission][] = view any xs action log +features[user_permission][] = view own xs action log features[user_permission][] = view own xs_snapshot_policy entities +features[user_permission][] = view xs_snapshot_policy log features[user_role][] = XS VPS Customer features[variable][] = additional_settings__active_tab_xs_vps features[variable][] = comment_anonymous_xs_vps @@ -72,13 +76,14 @@ features[variable][] = save_continue_xs_vps features[variable][] = save_continue_xsserver features[variable][] = theme_bootstrap_settings features[variable][] = xmlsitemap_settings_node_xs_vps -features[views_view][] = all_xs_vps_clients -features[views_view][] = xs_policy_log_runs_per_user -features[views_view][] = xs_pools_servers +features[views_view][] = xs_action_log +features[views_view][] = xs_policy_log features[views_view][] = xs_user_vms features_exclude[dependencies][ctools] = ctools features_exclude[dependencies][xs] = xs features_exclude[dependencies][xs_snapshot_policy] = xs_snapshot_policy +files[] = xs.controller.inc +files[] = xs.views.inc files[] = classes/xenapi.php files[] = includes/xs.actions.inc files[] = includes/xs.api.inc diff --git a/xs.install b/xs.install index 3246b2c..0a63a0e 100644 --- a/xs.install +++ b/xs.install @@ -4,3 +4,79 @@ * @file * Install, update and uninstall functions for the xs module. */ + +/** + * Implements hook_schema(). + */ +function xs_schema() { + $schema = array(); + + $schema['xs_action_log'] = array( + 'description' => 'Log table for XenServer Actions.', + 'fields' => array( + 'id' => array( + 'description' => 'The primary identifier for the log.', + 'type' => 'serial', + 'unsigned' => TRUE, + 'not null' => TRUE, + ), + 'target_id' => array( + 'description' => 'Server node id', + 'type' => 'int', + 'not null' => TRUE, + ), + 'uid' => array( + 'description' => 'User who run the action', + 'type' => 'int', + 'not null' => TRUE, + ), + 'log' => array( + 'description' => 'Log text', + 'type' => 'varchar', + 'length' => 8096, + 'not null' => TRUE, + ), + 'type' => array( + 'description' => 'Log type', + 'type' => 'varchar', + 'length' => 32, + 'not null' => TRUE, + ), + 'created' => array( + 'description' => 'The Unix timestamp when the log entry was created', + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + ), + ), + 'indexes' => array( + 'log_created' => array('created'), + 'log_server_id' => array('target_id'), + 'log_user_id' => array('uid'), + ), + 'foreign keys' => array( + 'target_id' => array( + 'table' => 'node', + 'columns' => array('target_id' => 'nid'), + ), + 'uid' => array( + 'table' => 'users', + 'columns' => array('uid' => 'uid'), + ), + ), + 'primary key' => array('id'), + ); + + return $schema; +} + +/** + * Creates server actions log schema. + */ +function xs_update_7001() { + $schema = xs_schema(); + + foreach ($schema as $table_name => $table) { + db_create_table($table_name, $table); + } +} diff --git a/xs.module b/xs.module index 709c734..ed3dc93 100644 --- a/xs.module +++ b/xs.module @@ -60,6 +60,16 @@ function xs_permission() { 'title' => t('Perform Any VPS actions'), 'description' => 'Use to poweroff, reboot, poweron a VPS', ), + 'view own xs action log' => array( + 'title' => t('View own server log entries Server Action log'), + 'description' => t('Allows users to View log entries in own Server Action log.'), + 'restrict access' => TRUE, + ), + 'view any xs action log' => array( + 'title' => t('View any serverlog entries Server Action log'), + 'description' => t('Allows users to View log entries in any Server Action log.'), + 'restrict access' => TRUE, + ), ); } @@ -99,16 +109,6 @@ function xs_menu() { 'type' => MENU_LOCAL_TASK, ); - $items['admin/config/services/xs/vms'] = array( - 'title' => 'VMs', - 'description' => 'VMs available', - 'page callback' => 'xs_admin_pool_vms', - 'access arguments' => array('administer xenserver pool'), - 'file' => 'includes/xs.pages.inc', - 'weight' => 50, - 'type' => MENU_LOCAL_TASK, - ); - $items['admin/config/services/xs/templates'] = array( 'title' => 'Templates', 'description' => 'Templates available', @@ -296,6 +296,8 @@ function xs_preprocess_node(&$variables) { drupal_set_title(t('Overview of !server', array('!server' => $variables['node']->title))); + $variables['xs_action_log'] = views_embed_view('xs_action_log', 'page_user_actions', $variables['node']->nid); + $vm = xs_get_vm_by_node($variables['node']); // If VM is not available, we were unable to connect to any of XS hosts. @@ -693,3 +695,55 @@ function xs_get_vps_owner_uid($node) { return !empty($uid) ? $uid : FALSE; } + +/** + * Implements hook_entity_info(). + */ +function xs_entity_info() { + $return['xs_action_log'] = array( + 'label' => t('Server Action Log'), + 'entity class' => 'XsActionLog', + 'controller class' => 'XsActionLogController', + 'base table' => 'xs_action_log', + 'fieldable' => FALSE, + 'exportable' => FALSE, + 'entity keys' => array( + 'id' => 'id', + ), + 'module' => 'xs', + 'access callback' => 'xs_access', + ); + + return $return; +} + +/** + * Access callback for xs_action_log entity. + */ +function xs_access($op, $xs_action_log, $account = NULL, $entity_type = NULL) { + switch ($op) { + case 'view': + if (user_access('view any xs action log')) { + return TRUE; + } + elseif (user_access('view own xs action log')) { + return $xs_action_log->uid == $account->uid; + } + break; + } + + return FALSE; +} + +/** + * Writes action log entry. + * + * @param string $message + * Message to write. + * @param string $type + * Machine name of the message in a freeform way, max 32 characters. + */ +function xs_action_log_write($message, $type) { + $log = entity_create('xs_action_log', array('log' => $message, 'type' => $type)); + $log->save(); +} diff --git a/xs.views.inc b/xs.views.inc new file mode 100644 index 0000000..76e42ee --- /dev/null +++ b/xs.views.inc @@ -0,0 +1,56 @@ + 'node', + 'base field' => 'nid', + 'handler' => 'views_handler_relationship', + 'label' => t('Server'), + 'title' => t('Referenced Server'), + 'help' => t('The XenServer Action Log'), + ); + $data['xs_action_log']['created']['field']['handler'] = 'views_handler_field_date'; + + $data['xs_action_log']['uid'] = array( + 'title' => t('User'), // The item it appears as on the UI, + 'help' => t('The user who run server action'), // The help that appears on the UI, + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_user', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_user_name', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_user_uid', + ), + 'relationship' => array( + 'handler' => 'views_handler_relationship', + 'base' => 'users', + 'field' => 'uid', + 'label' => t('User who actioned'), + ), + ); +} + +/** + * Implements hook_views_query_alter(). + */ +function xs_views_query_alter(&$view, &$query) { + if ($view->name == 'xs_action_log' && arg(0) == 'node' && arg(2) != 'action-log' && arg(2) != 'snapshot-log') { + // Remove views header when in policy view. + $view->header = array(); + } +} + diff --git a/xs.views_default.inc b/xs.views_default.inc index 838e70b..6d287a7 100644 --- a/xs.views_default.inc +++ b/xs.views_default.inc @@ -11,120 +11,552 @@ function xs_views_default_views() { $export = array(); $view = new view(); - $view->name = 'all_xs_vps_clients'; + $view->name = 'xs_action_log'; $view->description = ''; - $view->tag = 'default'; - $view->base_table = 'node'; - $view->human_name = 'All XS VPS Clients'; + $view->tag = 'xs'; + $view->base_table = 'xs_action_log'; + $view->human_name = 'XS Action Log'; $view->core = 7; $view->api_version = '3.0'; $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ /* Display: Master */ $handler = $view->new_display('default', 'Master', 'default'); + $handler->display->display_options['title'] = 'Server Actions Log'; $handler->display->display_options['use_more_always'] = FALSE; - $handler->display->display_options['access']['type'] = 'role'; - $handler->display->display_options['access']['role'] = array( - 3 => '3', - ); + $handler->display->display_options['access']['type'] = 'perm'; + $handler->display->display_options['access']['perm'] = 'view own xs action log'; $handler->display->display_options['cache']['type'] = 'none'; $handler->display->display_options['query']['type'] = 'views_query'; $handler->display->display_options['exposed_form']['type'] = 'basic'; + $handler->display->display_options['exposed_form']['options']['reset_button'] = TRUE; + $handler->display->display_options['exposed_form']['options']['autosubmit_hide'] = FALSE; $handler->display->display_options['pager']['type'] = 'full'; - $handler->display->display_options['style_plugin'] = 'list'; - $handler->display->display_options['style_options']['default_row_class'] = FALSE; - $handler->display->display_options['style_options']['row_class_special'] = FALSE; - $handler->display->display_options['row_plugin'] = 'fields'; - /* Relationship: Content: Author */ + $handler->display->display_options['pager']['options']['items_per_page'] = '10'; + $handler->display->display_options['pager']['options']['offset'] = '0'; + $handler->display->display_options['pager']['options']['id'] = '0'; + $handler->display->display_options['pager']['options']['quantity'] = '9'; + $handler->display->display_options['pager']['options']['expose']['items_per_page'] = TRUE; + $handler->display->display_options['pager']['options']['expose']['items_per_page_options_all'] = TRUE; + $handler->display->display_options['style_plugin'] = 'table'; + $handler->display->display_options['style_options']['columns'] = array( + 'nid' => 'nid', + 'id' => 'id', + 'log' => 'log', + 'type' => 'type', + 'created' => 'created', + 'name' => 'name', + ); + $handler->display->display_options['style_options']['default'] = 'created'; + $handler->display->display_options['style_options']['info'] = array( + 'nid' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'id' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'log' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'type' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'created' => array( + 'sortable' => 1, + 'default_sort_order' => 'desc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'name' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + ); + /* Header: Global: Result summary */ + $handler->display->display_options['header']['result']['id'] = 'result'; + $handler->display->display_options['header']['result']['table'] = 'views'; + $handler->display->display_options['header']['result']['field'] = 'result'; + /* Header: Global: Text area */ + $handler->display->display_options['header']['area']['id'] = 'area'; + $handler->display->display_options['header']['area']['table'] = 'views'; + $handler->display->display_options['header']['area']['field'] = 'area'; + $handler->display->display_options['header']['area']['content'] = ' Back to the server overview page'; + $handler->display->display_options['header']['area']['format'] = 'full_html'; + $handler->display->display_options['header']['area']['tokenize'] = TRUE; + /* Relationship: Server Action Log: Referenced Server */ + $handler->display->display_options['relationships']['target_id']['id'] = 'target_id'; + $handler->display->display_options['relationships']['target_id']['table'] = 'xs_action_log'; + $handler->display->display_options['relationships']['target_id']['field'] = 'target_id'; + /* Relationship: Server Action Log: User */ $handler->display->display_options['relationships']['uid']['id'] = 'uid'; - $handler->display->display_options['relationships']['uid']['table'] = 'node'; + $handler->display->display_options['relationships']['uid']['table'] = 'xs_action_log'; $handler->display->display_options['relationships']['uid']['field'] = 'uid'; - /* Field: Content: Author uid */ - $handler->display->display_options['fields']['uid']['id'] = 'uid'; - $handler->display->display_options['fields']['uid']['table'] = 'node'; - $handler->display->display_options['fields']['uid']['field'] = 'uid'; - $handler->display->display_options['fields']['uid']['label'] = ''; - $handler->display->display_options['fields']['uid']['exclude'] = TRUE; - $handler->display->display_options['fields']['uid']['element_label_colon'] = FALSE; - $handler->display->display_options['fields']['uid']['link_to_user'] = FALSE; + $handler->display->display_options['relationships']['uid']['label'] = 'User'; + /* Field: Content: Nid */ + $handler->display->display_options['fields']['nid']['id'] = 'nid'; + $handler->display->display_options['fields']['nid']['table'] = 'node'; + $handler->display->display_options['fields']['nid']['field'] = 'nid'; + $handler->display->display_options['fields']['nid']['relationship'] = 'target_id'; + $handler->display->display_options['fields']['nid']['exclude'] = TRUE; + /* Field: Server Action Log: Server action log ID */ + $handler->display->display_options['fields']['id']['id'] = 'id'; + $handler->display->display_options['fields']['id']['table'] = 'xs_action_log'; + $handler->display->display_options['fields']['id']['field'] = 'id'; + $handler->display->display_options['fields']['id']['exclude'] = TRUE; + /* Field: Server Action Log: Log */ + $handler->display->display_options['fields']['log']['id'] = 'log'; + $handler->display->display_options['fields']['log']['table'] = 'xs_action_log'; + $handler->display->display_options['fields']['log']['field'] = 'log'; + $handler->display->display_options['fields']['log']['label'] = 'Log Message'; + /* Field: Server Action Log: Type */ + $handler->display->display_options['fields']['type']['id'] = 'type'; + $handler->display->display_options['fields']['type']['table'] = 'xs_action_log'; + $handler->display->display_options['fields']['type']['field'] = 'type'; + $handler->display->display_options['fields']['type']['label'] = 'Action Type'; + /* Field: Server Action Log: Created */ + $handler->display->display_options['fields']['created']['id'] = 'created'; + $handler->display->display_options['fields']['created']['table'] = 'xs_action_log'; + $handler->display->display_options['fields']['created']['field'] = 'created'; + $handler->display->display_options['fields']['created']['label'] = 'Date/Time'; + $handler->display->display_options['fields']['created']['date_format'] = 'today time ago'; + $handler->display->display_options['fields']['created']['second_date_format'] = 'medium'; /* Field: User: Name */ $handler->display->display_options['fields']['name']['id'] = 'name'; $handler->display->display_options['fields']['name']['table'] = 'users'; $handler->display->display_options['fields']['name']['field'] = 'name'; $handler->display->display_options['fields']['name']['relationship'] = 'uid'; - $handler->display->display_options['fields']['name']['label'] = ''; - $handler->display->display_options['fields']['name']['element_label_colon'] = FALSE; + $handler->display->display_options['fields']['name']['label'] = 'Action Username'; $handler->display->display_options['fields']['name']['link_to_user'] = FALSE; - /* Sort criterion: User: Name */ - $handler->display->display_options['sorts']['name']['id'] = 'name'; - $handler->display->display_options['sorts']['name']['table'] = 'users'; - $handler->display->display_options['sorts']['name']['field'] = 'name'; - $handler->display->display_options['sorts']['name']['relationship'] = 'uid'; - /* Contextual filter: User: Roles */ - $handler->display->display_options['arguments']['rid']['id'] = 'rid'; - $handler->display->display_options['arguments']['rid']['table'] = 'users_roles'; - $handler->display->display_options['arguments']['rid']['field'] = 'rid'; - $handler->display->display_options['arguments']['rid']['relationship'] = 'uid'; - $handler->display->display_options['arguments']['rid']['default_action'] = 'default'; - $handler->display->display_options['arguments']['rid']['default_argument_type'] = 'fixed'; - $handler->display->display_options['arguments']['rid']['default_argument_options']['argument'] = '4'; - $handler->display->display_options['arguments']['rid']['summary']['number_of_records'] = '0'; - $handler->display->display_options['arguments']['rid']['summary']['format'] = 'default_summary'; - $handler->display->display_options['arguments']['rid']['summary_options']['items_per_page'] = '25'; - $handler->display->display_options['arguments']['rid']['reduce_duplicates'] = TRUE; - /* Filter criterion: User: Active */ - $handler->display->display_options['filters']['status_1']['id'] = 'status_1'; - $handler->display->display_options['filters']['status_1']['table'] = 'users'; - $handler->display->display_options['filters']['status_1']['field'] = 'status'; - $handler->display->display_options['filters']['status_1']['relationship'] = 'uid'; - $handler->display->display_options['filters']['status_1']['value'] = '1'; + /* Contextual filter: Content: Nid */ + $handler->display->display_options['arguments']['nid']['id'] = 'nid'; + $handler->display->display_options['arguments']['nid']['table'] = 'node'; + $handler->display->display_options['arguments']['nid']['field'] = 'nid'; + $handler->display->display_options['arguments']['nid']['relationship'] = 'target_id'; + $handler->display->display_options['arguments']['nid']['default_action'] = 'default'; + $handler->display->display_options['arguments']['nid']['exception']['value'] = ''; + $handler->display->display_options['arguments']['nid']['default_argument_type'] = 'node'; + $handler->display->display_options['arguments']['nid']['summary']['number_of_records'] = '0'; + $handler->display->display_options['arguments']['nid']['summary']['format'] = 'default_summary'; + $handler->display->display_options['arguments']['nid']['summary_options']['items_per_page'] = '25'; + $handler->display->display_options['arguments']['nid']['specify_validation'] = TRUE; + $handler->display->display_options['arguments']['nid']['validate']['type'] = 'node'; + $handler->display->display_options['arguments']['nid']['validate_options']['types'] = array( + 'xs_vps' => 'xs_vps', + ); + $handler->display->display_options['arguments']['nid']['validate_options']['access'] = TRUE; + $handler->display->display_options['arguments']['nid']['validate']['fail'] = 'access denied'; + /* Filter criterion: Server Action Log: Log */ + $handler->display->display_options['filters']['log']['id'] = 'log'; + $handler->display->display_options['filters']['log']['table'] = 'xs_action_log'; + $handler->display->display_options['filters']['log']['field'] = 'log'; + $handler->display->display_options['filters']['log']['operator'] = 'contains'; + $handler->display->display_options['filters']['log']['exposed'] = TRUE; + $handler->display->display_options['filters']['log']['expose']['operator_id'] = 'log_op'; + $handler->display->display_options['filters']['log']['expose']['label'] = 'Search log message text'; + $handler->display->display_options['filters']['log']['expose']['operator'] = 'log_op'; + $handler->display->display_options['filters']['log']['expose']['identifier'] = 'log'; + $handler->display->display_options['filters']['log']['expose']['remember_roles'] = array( + 2 => '2', + 1 => 0, + 3 => 0, + 4 => 0, + ); + /* Filter criterion: Server Action Log: Type */ + $handler->display->display_options['filters']['type_1']['id'] = 'type_1'; + $handler->display->display_options['filters']['type_1']['table'] = 'xs_action_log'; + $handler->display->display_options['filters']['type_1']['field'] = 'type'; + $handler->display->display_options['filters']['type_1']['exposed'] = TRUE; + $handler->display->display_options['filters']['type_1']['expose']['operator_id'] = 'type_1_op'; + $handler->display->display_options['filters']['type_1']['expose']['label'] = 'Type'; + $handler->display->display_options['filters']['type_1']['expose']['operator'] = 'type_1_op'; + $handler->display->display_options['filters']['type_1']['expose']['identifier'] = 'type_1'; + $handler->display->display_options['filters']['type_1']['is_grouped'] = TRUE; + $handler->display->display_options['filters']['type_1']['group_info']['label'] = 'Type'; + $handler->display->display_options['filters']['type_1']['group_info']['identifier'] = 'type_1'; + $handler->display->display_options['filters']['type_1']['group_info']['group_items'] = array( + 1 => array( + 'title' => 'Start', + 'operator' => '=', + 'value' => 'start', + ), + 2 => array( + 'title' => 'Reboot', + 'operator' => '=', + 'value' => 'clean_reboot', + ), + 3 => array( + 'title' => 'Shutdown', + 'operator' => '=', + 'value' => 'clean_shutdown', + ), + 4 => array( + 'title' => 'Hard Reboot', + 'operator' => '=', + 'value' => 'hard_reboot', + ), + 5 => array( + 'title' => 'Hard Shutdown', + 'operator' => '=', + 'value' => 'hard_shutdown', + ), + ); - /* Display: Entity Reference */ - $handler = $view->new_display('entityreference', 'Entity Reference', 'entityreference_1'); - $handler->display->display_options['defaults']['title'] = FALSE; - $handler->display->display_options['title'] = 'ER'; - $handler->display->display_options['pager']['type'] = 'some'; - $handler->display->display_options['defaults']['style_plugin'] = FALSE; - $handler->display->display_options['style_plugin'] = 'entityreference_style'; - $handler->display->display_options['style_options']['search_fields'] = array( - 'uid' => 'uid', - 'name' => 0, + /* Display: User Page (Actions) */ + $handler = $view->new_display('page', 'User Page (Actions)', 'page_user_actions'); + $handler->display->display_options['defaults']['header'] = FALSE; + /* Header: Global: Result summary */ + $handler->display->display_options['header']['result']['id'] = 'result'; + $handler->display->display_options['header']['result']['table'] = 'views'; + $handler->display->display_options['header']['result']['field'] = 'result'; + /* Header: Global: Text area */ + $handler->display->display_options['header']['area']['id'] = 'area'; + $handler->display->display_options['header']['area']['table'] = 'views'; + $handler->display->display_options['header']['area']['field'] = 'area'; + $handler->display->display_options['header']['area']['content'] = ' Back to the server overview page'; + $handler->display->display_options['header']['area']['format'] = 'full_html'; + $handler->display->display_options['header']['area']['tokenize'] = TRUE; + $handler->display->display_options['defaults']['filter_groups'] = FALSE; + $handler->display->display_options['defaults']['filters'] = FALSE; + /* Filter criterion: Server Action Log: Log */ + $handler->display->display_options['filters']['log']['id'] = 'log'; + $handler->display->display_options['filters']['log']['table'] = 'xs_action_log'; + $handler->display->display_options['filters']['log']['field'] = 'log'; + $handler->display->display_options['filters']['log']['operator'] = 'contains'; + $handler->display->display_options['filters']['log']['exposed'] = TRUE; + $handler->display->display_options['filters']['log']['expose']['operator_id'] = 'log_op'; + $handler->display->display_options['filters']['log']['expose']['label'] = 'Search log message text'; + $handler->display->display_options['filters']['log']['expose']['operator'] = 'log_op'; + $handler->display->display_options['filters']['log']['expose']['identifier'] = 'log'; + $handler->display->display_options['filters']['log']['expose']['remember_roles'] = array( + 2 => '2', + 1 => 0, + 3 => 0, + 4 => 0, ); - $handler->display->display_options['defaults']['style_options'] = FALSE; - $handler->display->display_options['defaults']['row_plugin'] = FALSE; - $handler->display->display_options['row_plugin'] = 'entityreference_fields'; - $handler->display->display_options['row_options']['inline'] = array( - 'uid' => 'uid', - 'name' => 'name', + /* Filter criterion: Server Action Log: Type */ + $handler->display->display_options['filters']['type_1']['id'] = 'type_1'; + $handler->display->display_options['filters']['type_1']['table'] = 'xs_action_log'; + $handler->display->display_options['filters']['type_1']['field'] = 'type'; + $handler->display->display_options['filters']['type_1']['exposed'] = TRUE; + $handler->display->display_options['filters']['type_1']['expose']['operator_id'] = 'type_1_op'; + $handler->display->display_options['filters']['type_1']['expose']['label'] = 'Type'; + $handler->display->display_options['filters']['type_1']['expose']['operator'] = 'type_1_op'; + $handler->display->display_options['filters']['type_1']['expose']['identifier'] = 'type_1'; + $handler->display->display_options['filters']['type_1']['is_grouped'] = TRUE; + $handler->display->display_options['filters']['type_1']['group_info']['label'] = 'Type'; + $handler->display->display_options['filters']['type_1']['group_info']['identifier'] = 'type_1'; + $handler->display->display_options['filters']['type_1']['group_info']['group_items'] = array( + 1 => array( + 'title' => 'Start', + 'operator' => '=', + 'value' => 'start', + ), + 2 => array( + 'title' => 'Reboot', + 'operator' => '=', + 'value' => 'clean_reboot', + ), + 3 => array( + 'title' => 'Shutdown', + 'operator' => '=', + 'value' => 'clean_shutdown', + ), + 4 => array( + 'title' => 'Hard Reboot', + 'operator' => '=', + 'value' => 'hard_reboot', + ), + 5 => array( + 'title' => 'Hard Shutdown', + 'operator' => '=', + 'value' => 'hard_shutdown', + ), ); - $handler->display->display_options['defaults']['row_options'] = FALSE; + /* Filter criterion: Server Action Log: Type */ + $handler->display->display_options['filters']['type']['id'] = 'type'; + $handler->display->display_options['filters']['type']['table'] = 'xs_action_log'; + $handler->display->display_options['filters']['type']['field'] = 'type'; + $handler->display->display_options['filters']['type']['operator'] = 'not_starts'; + $handler->display->display_options['filters']['type']['value'] = 'snapshot'; + $handler->display->display_options['path'] = 'node/%/action-log'; - /* Display: Entity Reference 2 */ - $handler = $view->new_display('entityreference', 'Entity Reference 2', 'entityreference_2'); - $handler->display->display_options['defaults']['title'] = FALSE; - $handler->display->display_options['title'] = 'XS VPS Customers'; - $handler->display->display_options['pager']['type'] = 'some'; - $handler->display->display_options['defaults']['style_plugin'] = FALSE; - $handler->display->display_options['style_plugin'] = 'entityreference_style'; - $handler->display->display_options['style_options']['search_fields'] = array( - 'uid' => 'uid', - 'name' => 0, + /* Display: User Page (Snapshots) */ + $handler = $view->new_display('page', 'User Page (Snapshots)', 'page_user_snapshots'); + $handler->display->display_options['defaults']['header'] = FALSE; + /* Header: Global: Result summary */ + $handler->display->display_options['header']['result']['id'] = 'result'; + $handler->display->display_options['header']['result']['table'] = 'views'; + $handler->display->display_options['header']['result']['field'] = 'result'; + /* Header: Global: Text area */ + $handler->display->display_options['header']['area']['id'] = 'area'; + $handler->display->display_options['header']['area']['table'] = 'views'; + $handler->display->display_options['header']['area']['field'] = 'area'; + $handler->display->display_options['header']['area']['content'] = ' Back to the snapshots overview page'; + $handler->display->display_options['header']['area']['format'] = 'full_html'; + $handler->display->display_options['header']['area']['tokenize'] = TRUE; + $handler->display->display_options['defaults']['filter_groups'] = FALSE; + $handler->display->display_options['defaults']['filters'] = FALSE; + /* Filter criterion: Server Action Log: Log */ + $handler->display->display_options['filters']['log']['id'] = 'log'; + $handler->display->display_options['filters']['log']['table'] = 'xs_action_log'; + $handler->display->display_options['filters']['log']['field'] = 'log'; + $handler->display->display_options['filters']['log']['operator'] = 'contains'; + $handler->display->display_options['filters']['log']['exposed'] = TRUE; + $handler->display->display_options['filters']['log']['expose']['operator_id'] = 'log_op'; + $handler->display->display_options['filters']['log']['expose']['label'] = 'Search log message text'; + $handler->display->display_options['filters']['log']['expose']['operator'] = 'log_op'; + $handler->display->display_options['filters']['log']['expose']['identifier'] = 'log'; + $handler->display->display_options['filters']['log']['expose']['remember_roles'] = array( + 2 => '2', + 1 => 0, + 3 => 0, + 4 => 0, ); - $handler->display->display_options['defaults']['style_options'] = FALSE; - $handler->display->display_options['defaults']['row_plugin'] = FALSE; - $handler->display->display_options['row_plugin'] = 'entityreference_fields'; - $handler->display->display_options['row_options']['inline'] = array( - 'uid' => 'uid', + /* Filter criterion: Server Action Log: Type */ + $handler->display->display_options['filters']['type_1']['id'] = 'type_1'; + $handler->display->display_options['filters']['type_1']['table'] = 'xs_action_log'; + $handler->display->display_options['filters']['type_1']['field'] = 'type'; + $handler->display->display_options['filters']['type_1']['exposed'] = TRUE; + $handler->display->display_options['filters']['type_1']['expose']['operator_id'] = 'type_1_op'; + $handler->display->display_options['filters']['type_1']['expose']['label'] = 'Type'; + $handler->display->display_options['filters']['type_1']['expose']['operator'] = 'type_1_op'; + $handler->display->display_options['filters']['type_1']['expose']['identifier'] = 'type_1'; + $handler->display->display_options['filters']['type_1']['is_grouped'] = TRUE; + $handler->display->display_options['filters']['type_1']['group_info']['label'] = 'Type'; + $handler->display->display_options['filters']['type_1']['group_info']['identifier'] = 'type_1'; + $handler->display->display_options['filters']['type_1']['group_info']['group_items'] = array( + 1 => array( + 'title' => 'Create', + 'operator' => '=', + 'value' => 'snapshot-create', + ), + 2 => array( + 'title' => 'Delete', + 'operator' => '=', + 'value' => 'snapshot-destroy', + ), + 3 => array( + 'title' => 'Revert', + 'operator' => '=', + 'value' => 'snapshot-revert', + ), ); - $handler->display->display_options['defaults']['row_options'] = FALSE; - $export['all_xs_vps_clients'] = $view; + /* Filter criterion: Server Action Log: Type */ + $handler->display->display_options['filters']['type']['id'] = 'type'; + $handler->display->display_options['filters']['type']['table'] = 'xs_action_log'; + $handler->display->display_options['filters']['type']['field'] = 'type'; + $handler->display->display_options['filters']['type']['operator'] = 'starts'; + $handler->display->display_options['filters']['type']['value'] = 'snapshot'; + $handler->display->display_options['path'] = 'node/%/snapshot-log'; + + /* Display: Admin Page (All) */ + $handler = $view->new_display('page', 'Admin Page (All)', 'admin_page'); + $handler->display->display_options['display_description'] = 'Snapshot actions + server Actions'; + $handler->display->display_options['defaults']['pager'] = FALSE; + $handler->display->display_options['pager']['type'] = 'full'; + $handler->display->display_options['pager']['options']['items_per_page'] = '50'; + $handler->display->display_options['pager']['options']['offset'] = '0'; + $handler->display->display_options['pager']['options']['id'] = '0'; + $handler->display->display_options['pager']['options']['quantity'] = '9'; + $handler->display->display_options['pager']['options']['expose']['items_per_page'] = TRUE; + $handler->display->display_options['pager']['options']['expose']['items_per_page_options'] = '25, 50, 100, 250'; + $handler->display->display_options['pager']['options']['expose']['items_per_page_options_all'] = TRUE; + $handler->display->display_options['defaults']['header'] = FALSE; + /* Header: Global: Result summary */ + $handler->display->display_options['header']['result']['id'] = 'result'; + $handler->display->display_options['header']['result']['table'] = 'views'; + $handler->display->display_options['header']['result']['field'] = 'result'; + $handler->display->display_options['defaults']['fields'] = FALSE; + /* Field: Content: Nid */ + $handler->display->display_options['fields']['nid']['id'] = 'nid'; + $handler->display->display_options['fields']['nid']['table'] = 'node'; + $handler->display->display_options['fields']['nid']['field'] = 'nid'; + $handler->display->display_options['fields']['nid']['relationship'] = 'target_id'; + $handler->display->display_options['fields']['nid']['exclude'] = TRUE; + /* Field: Server Action Log: Server action log ID */ + $handler->display->display_options['fields']['id']['id'] = 'id'; + $handler->display->display_options['fields']['id']['table'] = 'xs_action_log'; + $handler->display->display_options['fields']['id']['field'] = 'id'; + $handler->display->display_options['fields']['id']['exclude'] = TRUE; + /* Field: Content: Title */ + $handler->display->display_options['fields']['title']['id'] = 'title'; + $handler->display->display_options['fields']['title']['table'] = 'node'; + $handler->display->display_options['fields']['title']['field'] = 'title'; + $handler->display->display_options['fields']['title']['relationship'] = 'target_id'; + $handler->display->display_options['fields']['title']['label'] = 'Server Name'; + /* Field: Server Action Log: Log */ + $handler->display->display_options['fields']['log']['id'] = 'log'; + $handler->display->display_options['fields']['log']['table'] = 'xs_action_log'; + $handler->display->display_options['fields']['log']['field'] = 'log'; + $handler->display->display_options['fields']['log']['label'] = 'Log Message'; + /* Field: Server Action Log: Type */ + $handler->display->display_options['fields']['type']['id'] = 'type'; + $handler->display->display_options['fields']['type']['table'] = 'xs_action_log'; + $handler->display->display_options['fields']['type']['field'] = 'type'; + $handler->display->display_options['fields']['type']['label'] = 'Action Type'; + /* Field: Server Action Log: Created */ + $handler->display->display_options['fields']['created']['id'] = 'created'; + $handler->display->display_options['fields']['created']['table'] = 'xs_action_log'; + $handler->display->display_options['fields']['created']['field'] = 'created'; + $handler->display->display_options['fields']['created']['label'] = 'Date/Time'; + $handler->display->display_options['fields']['created']['date_format'] = 'today time ago'; + $handler->display->display_options['fields']['created']['second_date_format'] = 'medium'; + /* Field: User: Name */ + $handler->display->display_options['fields']['name']['id'] = 'name'; + $handler->display->display_options['fields']['name']['table'] = 'users'; + $handler->display->display_options['fields']['name']['field'] = 'name'; + $handler->display->display_options['fields']['name']['relationship'] = 'uid'; + $handler->display->display_options['fields']['name']['label'] = 'Action Username'; + $handler->display->display_options['fields']['name']['link_to_user'] = FALSE; + $handler->display->display_options['defaults']['arguments'] = FALSE; + $handler->display->display_options['defaults']['filter_groups'] = FALSE; + $handler->display->display_options['defaults']['filters'] = FALSE; + /* Filter criterion: Content: Title */ + $handler->display->display_options['filters']['title']['id'] = 'title'; + $handler->display->display_options['filters']['title']['table'] = 'node'; + $handler->display->display_options['filters']['title']['field'] = 'title'; + $handler->display->display_options['filters']['title']['relationship'] = 'target_id'; + $handler->display->display_options['filters']['title']['operator'] = 'contains'; + $handler->display->display_options['filters']['title']['group'] = 1; + $handler->display->display_options['filters']['title']['exposed'] = TRUE; + $handler->display->display_options['filters']['title']['expose']['operator_id'] = 'title_op'; + $handler->display->display_options['filters']['title']['expose']['label'] = 'Filter by server name'; + $handler->display->display_options['filters']['title']['expose']['operator'] = 'title_op'; + $handler->display->display_options['filters']['title']['expose']['identifier'] = 'title'; + $handler->display->display_options['filters']['title']['expose']['remember_roles'] = array( + 2 => '2', + 1 => 0, + 3 => 0, + 4 => 0, + ); + /* Filter criterion: Server Action Log: Log */ + $handler->display->display_options['filters']['log']['id'] = 'log'; + $handler->display->display_options['filters']['log']['table'] = 'xs_action_log'; + $handler->display->display_options['filters']['log']['field'] = 'log'; + $handler->display->display_options['filters']['log']['operator'] = 'contains'; + $handler->display->display_options['filters']['log']['group'] = 1; + $handler->display->display_options['filters']['log']['exposed'] = TRUE; + $handler->display->display_options['filters']['log']['expose']['operator_id'] = 'log_op'; + $handler->display->display_options['filters']['log']['expose']['label'] = 'Search log message text'; + $handler->display->display_options['filters']['log']['expose']['operator'] = 'log_op'; + $handler->display->display_options['filters']['log']['expose']['identifier'] = 'log'; + $handler->display->display_options['filters']['log']['expose']['remember_roles'] = array( + 2 => '2', + 1 => 0, + 3 => 0, + 4 => 0, + ); + /* Filter criterion: Server Action Log: Type */ + $handler->display->display_options['filters']['type_1']['id'] = 'type_1'; + $handler->display->display_options['filters']['type_1']['table'] = 'xs_action_log'; + $handler->display->display_options['filters']['type_1']['field'] = 'type'; + $handler->display->display_options['filters']['type_1']['group'] = 1; + $handler->display->display_options['filters']['type_1']['exposed'] = TRUE; + $handler->display->display_options['filters']['type_1']['expose']['operator_id'] = 'type_1_op'; + $handler->display->display_options['filters']['type_1']['expose']['label'] = 'Type'; + $handler->display->display_options['filters']['type_1']['expose']['operator'] = 'type_1_op'; + $handler->display->display_options['filters']['type_1']['expose']['identifier'] = 'type_1'; + $handler->display->display_options['filters']['type_1']['is_grouped'] = TRUE; + $handler->display->display_options['filters']['type_1']['group_info']['label'] = 'Type'; + $handler->display->display_options['filters']['type_1']['group_info']['identifier'] = 'type_1'; + $handler->display->display_options['filters']['type_1']['group_info']['group_items'] = array( + 1 => array( + 'title' => 'Start', + 'operator' => '=', + 'value' => 'start', + ), + 2 => array( + 'title' => 'Reboot', + 'operator' => '=', + 'value' => 'clean_reboot', + ), + 3 => array( + 'title' => 'Shutdown', + 'operator' => '=', + 'value' => 'clean_shutdown', + ), + 4 => array( + 'title' => 'Hard Reboot', + 'operator' => '=', + 'value' => 'hard_reboot', + ), + 5 => array( + 'title' => 'Hard Shutdown', + 'operator' => '=', + 'value' => 'hard_shutdown', + ), + 6 => array( + 'title' => 'Snapshot (Any)', + 'operator' => 'starts', + 'value' => 'snapshot', + ), + 7 => array( + 'title' => 'Snapshot Destroy', + 'operator' => '=', + 'value' => 'snapshot-destroy', + ), + 8 => array( + 'title' => 'Snapshot Create', + 'operator' => '=', + 'value' => 'snapshot-create', + ), + 9 => array( + 'title' => 'Snapshot Revert', + 'operator' => '=', + 'value' => 'snapshot-revert', + ), + ); + /* Filter criterion: Server Action Log: User */ + $handler->display->display_options['filters']['uid']['id'] = 'uid'; + $handler->display->display_options['filters']['uid']['table'] = 'xs_action_log'; + $handler->display->display_options['filters']['uid']['field'] = 'uid'; + $handler->display->display_options['filters']['uid']['value'] = ''; + $handler->display->display_options['filters']['uid']['exposed'] = TRUE; + $handler->display->display_options['filters']['uid']['expose']['operator_id'] = 'uid_op'; + $handler->display->display_options['filters']['uid']['expose']['label'] = 'User'; + $handler->display->display_options['filters']['uid']['expose']['operator'] = 'uid_op'; + $handler->display->display_options['filters']['uid']['expose']['identifier'] = 'uid'; + $handler->display->display_options['filters']['uid']['expose']['remember_roles'] = array( + 2 => '2', + 1 => 0, + 3 => 0, + 4 => 0, + ); + $handler->display->display_options['path'] = 'admin/structure/xs/action-log'; + $handler->display->display_options['menu']['type'] = 'tab'; + $handler->display->display_options['menu']['title'] = 'Action Log'; + $handler->display->display_options['menu']['weight'] = '0'; + $handler->display->display_options['menu']['name'] = 'management'; + $handler->display->display_options['menu']['context'] = 0; + $handler->display->display_options['menu']['context_only_inline'] = 0; + $export['xs_action_log'] = $view; $view = new view(); - $view->name = 'xs_policy_log_runs_per_user'; + $view->name = 'xs_policy_log'; $view->description = ''; - $view->tag = 'default'; + $view->tag = 'xs'; $view->base_table = 'xs_snapshot_policy_log'; - $view->human_name = 'XS Policy Log Runs for User'; + $view->human_name = 'XS Policy Log'; $view->core = 7; $view->api_version = '3.0'; $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ @@ -212,6 +644,17 @@ function xs_views_default_views() { $handler->display->display_options['relationships']['policy_id']['table'] = 'xs_snapshot_policy_log'; $handler->display->display_options['relationships']['policy_id']['field'] = 'policy_id'; $handler->display->display_options['relationships']['policy_id']['required'] = TRUE; + /* Relationship: Snapshot Policy: The Server node for the policy */ + $handler->display->display_options['relationships']['target_id']['id'] = 'target_id'; + $handler->display->display_options['relationships']['target_id']['table'] = 'xs_snapshot_policy'; + $handler->display->display_options['relationships']['target_id']['field'] = 'target_id'; + $handler->display->display_options['relationships']['target_id']['relationship'] = 'policy_id'; + /* Field: Content: Nid */ + $handler->display->display_options['fields']['nid']['id'] = 'nid'; + $handler->display->display_options['fields']['nid']['table'] = 'node'; + $handler->display->display_options['fields']['nid']['field'] = 'nid'; + $handler->display->display_options['fields']['nid']['relationship'] = 'target_id'; + $handler->display->display_options['fields']['nid']['exclude'] = TRUE; /* Field: Snapshot Policy: Author */ $handler->display->display_options['fields']['uid']['id'] = 'uid'; $handler->display->display_options['fields']['uid']['table'] = 'xs_snapshot_policy'; @@ -327,42 +770,8 @@ function xs_views_default_views() { ), ); - /* Display: Block */ - $handler = $view->new_display('block', 'Block', 'user_block'); - $handler->display->display_options['defaults']['access'] = FALSE; - $handler->display->display_options['access']['type'] = 'role'; - $handler->display->display_options['access']['role'] = array( - 4 => '4', - ); - $handler->display->display_options['defaults']['pager'] = FALSE; - $handler->display->display_options['pager']['type'] = 'full'; - $handler->display->display_options['pager']['options']['items_per_page'] = '5'; - $handler->display->display_options['pager']['options']['offset'] = '0'; - $handler->display->display_options['pager']['options']['id'] = '0'; - $handler->display->display_options['pager']['options']['quantity'] = '9'; - $handler->display->display_options['pager']['options']['expose']['items_per_page'] = TRUE; - $handler->display->display_options['pager']['options']['expose']['items_per_page_options_all'] = TRUE; - $handler->display->display_options['block_description'] = 'XenServer User/Server Policy Log'; - - /* Display: Admin Page */ - $handler = $view->new_display('page', 'Admin Page', 'page_1'); - $handler->display->display_options['display_description'] = 'Admin page to display all policy runs'; - $handler->display->display_options['defaults']['access'] = FALSE; - $handler->display->display_options['access']['type'] = 'role'; - $handler->display->display_options['access']['role'] = array( - 3 => '3', - ); - $handler->display->display_options['defaults']['arguments'] = FALSE; - $handler->display->display_options['path'] = 'admin/structure/xs/policy-log'; - $handler->display->display_options['menu']['type'] = 'tab'; - $handler->display->display_options['menu']['title'] = 'Policies log'; - $handler->display->display_options['menu']['weight'] = '0'; - $handler->display->display_options['menu']['name'] = 'management'; - $handler->display->display_options['menu']['context'] = 0; - $handler->display->display_options['menu']['context_only_inline'] = 0; - - /* Display: Page 2 */ - $handler = $view->new_display('page', 'Page 2', 'page_2'); + /* Display: User Page */ + $handler = $view->new_display('page', 'User Page', 'page_2'); $handler->display->display_options['defaults']['title'] = FALSE; $handler->display->display_options['title'] = 'Search Policy Events Log'; $handler->display->display_options['defaults']['access'] = FALSE; @@ -384,7 +793,7 @@ function xs_views_default_views() { $handler->display->display_options['header']['area']['table'] = 'views'; $handler->display->display_options['header']['area']['field'] = 'area'; $handler->display->display_options['header']['area']['empty'] = TRUE; - $handler->display->display_options['header']['area']['content'] = ' Back to Policy overview page'; + $handler->display->display_options['header']['area']['content'] = ' Back to Policy overview page'; $handler->display->display_options['header']['area']['format'] = 'full_html'; $handler->display->display_options['header']['area']['tokenize'] = TRUE; /* Header: Global: Result summary */ @@ -397,132 +806,53 @@ function xs_views_default_views() { $handler->display->display_options['arguments']['target_id']['table'] = 'xs_snapshot_policy'; $handler->display->display_options['arguments']['target_id']['field'] = 'target_id'; $handler->display->display_options['arguments']['target_id']['relationship'] = 'policy_id'; - $handler->display->display_options['arguments']['target_id']['default_action'] = 'empty'; + $handler->display->display_options['arguments']['target_id']['default_action'] = 'default'; $handler->display->display_options['arguments']['target_id']['exception']['value'] = ''; $handler->display->display_options['arguments']['target_id']['default_argument_type'] = 'node'; $handler->display->display_options['arguments']['target_id']['default_argument_skip_url'] = TRUE; $handler->display->display_options['arguments']['target_id']['summary']['number_of_records'] = '0'; $handler->display->display_options['arguments']['target_id']['summary']['format'] = 'default_summary'; $handler->display->display_options['arguments']['target_id']['summary_options']['items_per_page'] = '25'; + $handler->display->display_options['arguments']['target_id']['specify_validation'] = TRUE; + $handler->display->display_options['arguments']['target_id']['validate']['type'] = 'node'; + $handler->display->display_options['arguments']['target_id']['validate_options']['types'] = array( + 'xs_vps' => 'xs_vps', + ); + $handler->display->display_options['arguments']['target_id']['validate_options']['access'] = TRUE; + $handler->display->display_options['arguments']['target_id']['validate']['fail'] = 'access denied'; $handler->display->display_options['path'] = 'node/%/xs-snapshot-policy/policies-log'; - $export['xs_policy_log_runs_per_user'] = $view; - $view = new view(); - $view->name = 'xs_pools_servers'; - $view->description = ''; - $view->tag = 'default'; - $view->base_table = 'node'; - $view->human_name = 'XS Pools & Servers'; - $view->core = 7; - $view->api_version = '3.0'; - $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ - - /* Display: Master */ - $handler = $view->new_display('default', 'Master', 'default'); - $handler->display->display_options['title'] = 'XS Pools & Servers'; - $handler->display->display_options['use_more_always'] = FALSE; - $handler->display->display_options['access']['type'] = 'perm'; - $handler->display->display_options['cache']['type'] = 'none'; - $handler->display->display_options['query']['type'] = 'views_query'; - $handler->display->display_options['exposed_form']['type'] = 'basic'; + /* Display: Admin Page */ + $handler = $view->new_display('page', 'Admin Page', 'page_1'); + $handler->display->display_options['display_description'] = 'Admin page to display all policy runs'; + $handler->display->display_options['defaults']['access'] = FALSE; + $handler->display->display_options['access']['type'] = 'role'; + $handler->display->display_options['access']['role'] = array( + 3 => '3', + ); + $handler->display->display_options['defaults']['pager'] = FALSE; $handler->display->display_options['pager']['type'] = 'full'; $handler->display->display_options['pager']['options']['items_per_page'] = '50'; - $handler->display->display_options['style_plugin'] = 'table'; - $handler->display->display_options['style_options']['grouping'] = array( - 0 => array( - 'field' => 'title_1', - 'rendered' => 1, - 'rendered_strip' => 0, - ), - ); - $handler->display->display_options['style_options']['columns'] = array( - 'title' => 'title', - 'field_xs_ip_address' => 'field_xs_ip_address', - 'title_1' => 'title_1', - 'edit_node' => 'edit_node', - ); - $handler->display->display_options['style_options']['default'] = 'field_xs_ip_address'; - $handler->display->display_options['style_options']['info'] = array( - 'title' => array( - 'sortable' => 0, - 'default_sort_order' => 'asc', - 'align' => '', - 'separator' => '', - 'empty_column' => 0, - ), - 'field_xs_ip_address' => array( - 'sortable' => 0, - 'default_sort_order' => 'asc', - 'align' => '', - 'separator' => '', - 'empty_column' => 0, - ), - 'title_1' => array( - 'sortable' => 0, - 'default_sort_order' => 'asc', - 'align' => '', - 'separator' => '', - 'empty_column' => 0, - ), - 'edit_node' => array( - 'align' => '', - 'separator' => '', - 'empty_column' => 0, - ), - ); - /* Relationship: Broken/missing handler */ - $handler->display->display_options['relationships']['reverse_field_xs_pool_member_node']['id'] = 'reverse_field_xs_pool_member_node'; - $handler->display->display_options['relationships']['reverse_field_xs_pool_member_node']['table'] = 'node'; - $handler->display->display_options['relationships']['reverse_field_xs_pool_member_node']['field'] = 'reverse_field_xs_pool_member_node'; - $handler->display->display_options['relationships']['reverse_field_xs_pool_member_node']['label'] = 'Content referencing Content from field_xs_pool_member'; - /* Field: Content: Title */ - $handler->display->display_options['fields']['title']['id'] = 'title'; - $handler->display->display_options['fields']['title']['table'] = 'node'; - $handler->display->display_options['fields']['title']['field'] = 'title'; - $handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE; - $handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE; - /* Field: Broken/missing handler */ - $handler->display->display_options['fields']['field_xs_ip_address']['id'] = 'field_xs_ip_address'; - $handler->display->display_options['fields']['field_xs_ip_address']['table'] = 'field_data_field_xs_ip_address'; - $handler->display->display_options['fields']['field_xs_ip_address']['field'] = 'field_xs_ip_address'; - $handler->display->display_options['fields']['field_xs_ip_address']['label'] = 'IP Address'; - /* Field: Broken/missing handler */ - $handler->display->display_options['fields']['field_xs_vms']['id'] = 'field_xs_vms'; - $handler->display->display_options['fields']['field_xs_vms']['table'] = 'field_data_field_xs_vms'; - $handler->display->display_options['fields']['field_xs_vms']['field'] = 'field_xs_vms'; - $handler->display->display_options['fields']['field_xs_vms']['label'] = 'VMs'; - /* Field: Content: Title */ - $handler->display->display_options['fields']['title_1']['id'] = 'title_1'; - $handler->display->display_options['fields']['title_1']['table'] = 'node'; - $handler->display->display_options['fields']['title_1']['field'] = 'title'; - $handler->display->display_options['fields']['title_1']['relationship'] = 'reverse_field_xs_pool_member_node'; - $handler->display->display_options['fields']['title_1']['label'] = 'Pool'; - /* Field: Content: Edit link */ - $handler->display->display_options['fields']['edit_node']['id'] = 'edit_node'; - $handler->display->display_options['fields']['edit_node']['table'] = 'views_entity_node'; - $handler->display->display_options['fields']['edit_node']['field'] = 'edit_node'; - $handler->display->display_options['fields']['edit_node']['label'] = 'Operations'; - /* Sort criterion: Content: Title */ - $handler->display->display_options['sorts']['title']['id'] = 'title'; - $handler->display->display_options['sorts']['title']['table'] = 'node'; - $handler->display->display_options['sorts']['title']['field'] = 'title'; - $handler->display->display_options['sorts']['title']['order'] = 'DESC'; - /* Filter criterion: Content: Type */ - $handler->display->display_options['filters']['type']['id'] = 'type'; - $handler->display->display_options['filters']['type']['table'] = 'node'; - $handler->display->display_options['filters']['type']['field'] = 'type'; - $handler->display->display_options['filters']['type']['value'] = array( - 'xsserver' => 'xsserver', - ); - - /* Display: Block */ - $handler = $view->new_display('block', 'Block', 'block'); - $export['xs_pools_servers'] = $view; + $handler->display->display_options['pager']['options']['offset'] = '0'; + $handler->display->display_options['pager']['options']['id'] = '0'; + $handler->display->display_options['pager']['options']['quantity'] = '9'; + $handler->display->display_options['pager']['options']['expose']['items_per_page'] = TRUE; + $handler->display->display_options['pager']['options']['expose']['items_per_page_options'] = '25, 50, 100, 250'; + $handler->display->display_options['pager']['options']['expose']['items_per_page_options_all'] = TRUE; + $handler->display->display_options['defaults']['arguments'] = FALSE; + $handler->display->display_options['path'] = 'admin/structure/xs/policy-log'; + $handler->display->display_options['menu']['type'] = 'tab'; + $handler->display->display_options['menu']['title'] = 'Policies log'; + $handler->display->display_options['menu']['weight'] = '0'; + $handler->display->display_options['menu']['name'] = 'management'; + $handler->display->display_options['menu']['context'] = 0; + $handler->display->display_options['menu']['context_only_inline'] = 0; + $export['xs_policy_log'] = $view; $view = new view(); $view->name = 'xs_user_vms'; $view->description = ''; - $view->tag = 'default'; + $view->tag = 'xs'; $view->base_table = 'node'; $view->human_name = 'XS User VMs'; $view->core = 7;