Hooks
Hooks allow you to execute custom code when certain events occur in WHMCS. You will need to add S3-related action links to the admin page in WHMCS.
Change to the directory whmcs/includes/hooks and create a file S3_adminAreaClientSummaryActionLinks.php with the following contents:
<?php // Modify other actions admin page. function S3_adminAreaClientSummaryActionLinks($vars) { // Create additional links. $result[] = '<b>S3 - User Management</b>'; $result[] = '<a href="staas_scripts/S3_createUser.php?userid=' . $vars['userid'] . '"><img src="http://logo.acronis.com/ogimage.png" width="16" height="16" border="0" align="absmiddle" /> Create User</a>'; $result[] = '<a href="staas_scripts/S3_deleteUser.php?userid=' . $vars['userid'] . '"><img src="http://logo.acronis.com/ogimage.png" width="16" height="16" border="0" align="absmiddle" /> Delete User</a>'; $result[] = '<a href="staas_scripts/S3_enableUser.php?userid=' . $vars['userid'] . '"><img src="http://logo.acronis.com/ogimage.png" width="16" height="16" border="0" align="absmiddle" /> Enable User</a>'; $result[] = '<a href="staas_scripts/S3_disableUser.php?userid=' . $vars['userid'] . '"><img src="http://logo.acronis.com/ogimage.png" width="16" height="16" border="0" align="absmiddle" /> Disable User</a>'; $result[] = '<a href="staas_scripts/S3_generateAccessKey.php?userid=' . $vars['userid'] . '"><img src="http://logo.acronis.com/ogimage.png" width="16" height="16" border="0" align="absmiddle" /> Generate Access Key</a>'; $result[] = '<a href="staas_scripts/S3_revokeAccessKey.php?userid=' . $vars['userid'] . '"><img src="http://logo.acronis.com/ogimage.png" width="16" height="16" border="0" align="absmiddle" /> Revoke Access Key</a>'; $result[] = '<a href="staas_scripts/S3_queryUser.php?userid=' . $vars['userid'] . '"><img src="http://logo.acronis.com/ogimage.png" width="16" height="16" border="0" align="absmiddle" /> Query User (on/off)</a>'; $result[] = '<a href="staas_scripts/S3_listUsers.php"> <img src="http://logo.acronis.com/ogimage.png" width="16" height="16" border="0" align="absmiddle" /> List Users (on/off)</a>'; $result[] = ' '; $result[] = '<b>S3 - User Limits Management</b>'; $result[] = ' <form> <input name="userid" type="hidden" value="' . $vars['userid'] . '"> <input name="ops-value" size="4"> <select name="ops-name"> <option>default</option> <option>get</option> <option>put</option> <option>list</option> <option>delete</option> </select> ops/s <br /> <input name="bandwidth-value" size="4"> <select name="bandwidth-name"> <option>out</option> </select> bandwidth/s <br /> <button type="submit" formaction="staas_scripts/S3_setLimitsForUser.php">Set</button> <button type="submit" formaction="staas_scripts/S3_getLimitsForUser.php">Get</button> <button type="submit" formaction="staas_scripts/S3_deleteLimitsForUser.php">Delete</button> </form> '; $result[] = ' '; $result[] = '<b>S3 - Bucket Limits Management</b>'; $result[] = ' <form> <input name="userid" type="hidden" value="' . $vars['userid'] . '"> <input name="ops-value" size="4"> <select name="ops-name"> <option>default</option> <option>get</option> <option>put</option> <option>list</option> <option>delete</option> </select> ops/s <br /> <input name="bandwidth-value" size="4"> <select name="bandwidth-name"> <option>out</option> </select> bandwidth/s <br /> <input name="bucket" size="4"> bucket name <br /> <button type="submit" formaction="staas_scripts/S3_setLimitsForBucket.php">Set</button> <button type="submit" formaction="staas_scripts/S3_getLimitsForBucket.php">Get</button> <button type="submit" formaction="staas_scripts/S3_deleteLimitsForBucket.php">Delete</button> </form> '; $result[] = ' '; $result[] = '<b>S3 - Usage Statistics</b>'; $result[] = ' <a href="staas_scripts/S3_listStatsObjects.php"> <img src="http://logo.acronis.com/ogimage.png" width="16" height="16" border="0" align="absmiddle" /> List Statistics Objects (on/off) </a> <p> <form> <input name="object" size="15"> object name <br /> <button type="submit" formaction="staas_scripts/S3_getStatsForObject.php">Get</button> <button type="submit" formaction="staas_scripts/S3_deleteStatsForObject.php">Delete</button> </form> </p> '; $result[] = ' '; // Return links. return $result; } // Modify admin area. add_hook('AdminAreaClientSummaryActionLinks', 1, "S3_adminAreaClientSummaryActionLinks"); ?>
The last file extends the admin summary page and displays S3 user information as well as user and bucket limits if the corresponding links are clicked. Create a file S3_adminAreaClientSummaryPage.php with the following contents:
<?php // Modify admin client summary to show S3 information. function S3_adminAreaClientSummaryPage($vars) { // Sane default. $result = ' <div class="row client-summary-panels"> '; // Show users. if ($_SESSION['s3_list_users'] == 1) { // Table header. $result = $result . ' <div class="col-lg-6 col-sm-12"> <div class="clientssummarybox"> <div class="title"> S3 Users List </div> <table class="clientssummarystats" cellspacing="0" cellpadding="2"> <tr> <td><b>UserId</b></td> <td><b>UserEmail</b></td> </tr> '; // One row per access key pair. foreach ($_SESSION['s3_list'] as $s3_row) { $result = $result . ' <tr class="altrow"> <td>' . $s3_row['UserId'] . '</td> <td>' . $s3_row['UserEmail'] . '</td> </tr> '; } // Table footer. $result = $result . ' </table> </div> </div> '; } // Show user. if ($_SESSION['s3_query_user'] == 1) { // Table header. $result = $result . ' <div class="col-lg-6 col-sm-12"> <div class="clientssummarybox"> <div class="title"> S3 Information for User: ' . $_SESSION['s3_userid'] . ' </div> <table class="clientssummarystats" cellspacing="0" cellpadding="2"> <tr> <td><b>AWSAccessKeyId</b></td> <td><b>AWSSecretAccessKey</b></td> </tr> '; // One row per access key pair. foreach ($_SESSION['s3_aws_access_keys'] as $s3_row) { $result = $result . ' <tr class="altrow"> <td>' . $s3_row['AWSAccessKeyId'] . '</td> <td>' . $s3_row['AWSSecretAccessKey'] . '</td> </tr> '; } // Table footer. $result = $result . ' </table> </div> </div> '; } // Table footer and next header. $result = $result . ' </div> <div class="row client-summary-panels"> '; // Show statistics list. if ($_SESSION['s3_stat_objects'] == 1) { // Table header. $result = $result . ' <div class="col-lg-6 col-sm-12"> <div class="clientssummarybox"> <div class="title"> S3 Statistics List </div> <table class="clientssummarystats" cellspacing="0" cellpadding="2"> <tr> <td><b>Object Name</b></td> </tr> '; // One row per access key pair. foreach ($_SESSION['s3_stat']['items'] as $s3_object) { $result = $result . ' <tr class="altrow"> <td>' . $s3_object . '</td> </tr> '; } // Table footer. $result = $result . ' </table> </div> </div> '; } // Show limits for user. if (!empty($_SESSION['s3_limits_user'])) { // Table header. $result = $result . ' <div class="col-lg-3 col-sm-6"> <div class="clientssummarybox"> <div class="title"> S3 Limits for User </div> <table class="clientssummarystats" cellspacing="0" cellpadding="2"> <tr> <td><b>Type</b></td> <td><b>Name</b></td> <td><b>Value</b></td> </tr> '; // One row per access key pair. foreach ($_SESSION['s3_limits_user'] as $s3_limits => $s3_value) { list($s3_type, $s3_limit) = explode(":", $s3_limits); $result = $result . ' <tr class="altrow"> <td>' . $s3_type . '</td> <td>' . $s3_limit . '</td> <td>' . $s3_value . '</td> </tr> '; } // Table footer. $result = $result . ' </table> </div> </div> '; } // Show limits for bucket. if (!empty($_SESSION['s3_limits_bucket'])) { // Table header. $result = $result . ' <div class="col-lg-3 col-sm-6"> <div class="clientssummarybox"> <div class="title"> S3 Limits for Bucket: ' . $_SESSION['s3_bucket'] . ' </div> <table class="clientssummarystats" cellspacing="0" cellpadding="2"> <tr> <td><b>Type</b></td> <td><b>Name</b></td> <td><b>Value</b></td> </tr> '; // One row per access key pair. foreach ($_SESSION['s3_limits_bucket'] as $s3_limits => $s3_value) { list($s3_type, $s3_limit) = explode(":", $s3_limits); $result = $result . ' <tr class="altrow"> <td>' . $s3_type . '</td> <td>' . $s3_limit . '</td> <td>' . $s3_value . '</td> </tr> '; } // Table footer. $result = $result . ' </table> </div> </div> '; } // Table footer and next header. $result = $result . ' </div> <div class="row client-summary-panels"> '; // Show statistics for object. if (!empty($_SESSION['s3_object_statistic'])) { // Table header. $result = $result . ' <div class="col-lg-12 col-sm-24"> <div class="clientssummarybox"> <div class="title"> S3 Statistics for Object: ' . $_SESSION['s3_object'] . ' </div> <table class="clientssummarystats" cellspacing="0" cellpadding="2"> <tr> <td><b>fmt_version</b></td> <td><b>service_id</b></td> <td><b>start_ts</b></td> <td><b>period</b></td> <td><b>bucket</b></td> <td><b>epoch</b></td> <td><b>user_id</b></td> <td><b>tag</b></td> <td><b>put</b></td> <td><b>get</b></td> <td><b>list</b></td> <td><b>other</b></td> <td><b>uploaded</b></td> <td><b>downloaded</b></td> </tr> '; // One row per access key pair. foreach ($_SESSION['s3_object_statistic']['items'] as $s3_object) { $result = $result . ' <tr class="altrow"> <td>' . $_SESSION['s3_object_statistic']['fmt_version']. '</td> <td>' . $_SESSION['s3_object_statistic']['service_id']. '</td> <td>' . $_SESSION['s3_object_statistic']['start_ts']. '</td> <td>' . $_SESSION['s3_object_statistic']['period']. '</td> <td>' . $s3_object['key']['bucket'] . '</td> <td>' . $s3_object['key']['epoch'] . '</td> <td>' . $s3_object['key']['user'] . '</td> <td>' . $s3_object['key']['tag'] . '</td> <td>' . $s3_object['counters']['ops']['put'] . '</td> <td>' . $s3_object['counters']['ops']['get'] . '</td> <td>' . $s3_object['counters']['ops']['list'] . '</td> <td>' . $s3_object['counters']['ops']['other'] . '</td> <td>' . $s3_object['counters']['net_io']['uploaded'] . '</td> <td>' . $s3_object['counters']['net_io']['downloaded'] . '</td> </tr> '; } // Table footer. $result = $result . ' </table> </div> </div> '; } // Table footer. $result = $result . ' </div> '; // Return table. return $result; } // Modify admin area. add_hook('AdminAreaClientSummaryPage', 1, "S3_adminAreaClientSummaryPage"); ?>