HDFS-7995. Implement chmod in the HDFS Web UI. Contributed by Ravi Prakash and Haohui Mai.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/07f30446 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/07f30446 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/07f30446 Branch: refs/heads/HDFS-7966 Commit: 07f304467d317d0de2cdf6ddda625ca103153146 Parents: bf2f2b4 Author: Haohui Mai <whe...@apache.org> Authored: Wed Sep 16 11:50:17 2015 -0700 Committer: Haohui Mai <whe...@apache.org> Committed: Wed Sep 16 11:50:28 2015 -0700 ---------------------------------------------------------------------- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 ++ .../src/main/webapps/hdfs/explorer.html | 51 ++++++++++++++++-- .../src/main/webapps/hdfs/explorer.js | 56 +++++++++++++++++++- .../src/main/webapps/static/hadoop.css | 19 +++++++ 4 files changed, 123 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/07f30446/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 78c83d1..a328805 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -926,6 +926,9 @@ Release 2.8.0 - UNRELEASED HDFS-7986. Allow files / directories to be deleted from the NameNode UI. (Ravi Prakash via wheat9) + HDFS-7995. Implement chmod in the HDFS Web UI. + (Ravi Prakash and Haohui Mai via wheat9) + OPTIMIZATIONS HDFS-8026. Trace FSOutputSummer#writeChecksumChunks rather than http://git-wip-us.apache.org/repos/asf/hadoop/blob/07f30446/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/hdfs/explorer.html ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/hdfs/explorer.html b/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/hdfs/explorer.html index 2fd7db6..1283ea6 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/hdfs/explorer.html +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/hdfs/explorer.html @@ -87,7 +87,6 @@ <button type="button" class="close" onclick="$('#alert-panel').hide();">×</button> <div class="alert-body" id="alert-panel-body"></div> </div> - <div class="modal" id="btn-create-directory" tabindex="-1" role="dialog" aria-hidden="true"> <div class="modal-dialog"> @@ -169,6 +168,46 @@ </div> + <script type="text/x-template" id="explorer-popover-perm-info"> + <div class="explorer-popover-perm-body"> + <table class="table table-striped"> + <thead> + <tr> + <th class="text-center">User</th> + <th class="text-center">Group</th> + <th class="text-center">Other</th> + </tr> + </thead> + <tbody> + <tr> + <td><label><input type="checkbox" data-bit="8" /> Read</label></td> + <td><label><input type="checkbox" data-bit="5" /> Read</label></td> + <td><label><input type="checkbox" data-bit="2" /> Read</label></td> + </tr> + <tr> + <td><label><input type="checkbox" data-bit="7" /> Write</label></td> + <td><label><input type="checkbox" data-bit="4" /> Write</label></td> + <td><label><input type="checkbox" data-bit="1" /> Write</label></td> + </tr> + <tr> + <td><label><input type="checkbox" data-bit="6" /> Execute</label></td> + <td><label><input type="checkbox" data-bit="3" /> Execute</label></td> + <td><label><input type="checkbox" data-bit="0" /> Execute</label></td> + </tr> + </tbody> + </table> + <div style="text-align: right; margin-right: 10px"> + <label><input type="checkbox" id="explorer-perm-sticky" data-bit="9" /> Sticky bit</label> + </div> + <hr/> + <div style="text-align: right"> + <button type="button" class="btn" id="explorer-perm-cancel">Cancel</button> + <button type="button" class="btn btn-success" id="explorer-set-perm-button" + data-complete-text="Updating...">Set</button> + </div> + </div> + </script> + <script type="text/x-dust-template" id="tmpl-explorer"> <table class="table"> <thead> @@ -181,13 +220,17 @@ <th>Replication</th> <th>Block Size</th> <th>Name</th> - <th>Delete</th> + <th></th> </tr> </thead> <tbody> {#FileStatus} - <tr inode-path="{pathSuffix}" class="explorer-entry"> - <td>{type|helper_to_directory}{permission|helper_to_permission}{aclBit|helper_to_acl_bit}</td> + <tr inode-path="{pathSuffix}" data-permission="{permission}" + class="explorer-entry"> + <td><span class="explorer-perm-links editable-click"> + {type|helper_to_directory}{permission|helper_to_permission} + {aclBit|helper_to_acl_bit} + </span></td> <td>{owner}</td> <td>{group}</td> <td>{length|fmt_bytes}</td> http://git-wip-us.apache.org/repos/asf/hadoop/blob/07f30446/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/hdfs/explorer.js ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/hdfs/explorer.js b/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/hdfs/explorer.js index e469ead..521c62d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/hdfs/explorer.js +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/hdfs/explorer.js @@ -22,6 +22,7 @@ // in the preview. var TAIL_CHUNK_SIZE = 32768; + //This stores the current directory which is being browsed var current_directory = ""; function show_err_msg(msg) { @@ -101,6 +102,50 @@ $('#delete-modal').modal(); } + /* This method loads the checkboxes on the permission info modal. It accepts + * the octal permissions, eg. '644' or '755' and infers the checkboxes that + * should be true and false + */ + function view_perm_details(e, filename, abs_path, perms) { + $('.explorer-perm-links').popover('destroy'); + e.popover({html: true, content: $('#explorer-popover-perm-info').html(), trigger: 'focus'}) + .on('shown.bs.popover', function(e) { + var popover = $(this), parent = popover.parent(); + //Convert octal to binary permissions + var bin_perms = parseInt(perms, 8).toString(2); + bin_perms = bin_perms.length == 9 ? "0" + bin_perms : bin_perms; + parent.find('#explorer-perm-cancel').on('click', function() { popover.popover('destroy'); }); + parent.find('#explorer-set-perm-button').off().click(function() { set_permissions(abs_path); }); + parent.find('input[type=checkbox]').each(function(idx, element) { + var e = $(element); + e.prop('checked', bin_perms.charAt(9 - e.attr('data-bit')) == '1'); + }); + }) + .popover('show'); + } + + // Use WebHDFS to set permissions on an absolute path + function set_permissions(abs_path) { + var p = 0; + $.each($('.popover .explorer-popover-perm-body input:checked'), function(idx, e) { + p |= 1 << (+$(e).attr('data-bit')); + }); + + var permission_mask = p.toString(8); + + // PUT /webhdfs/v1/<path>?op=SETPERMISSION&permission=<permission> + var url = '/webhdfs/v1' + encode_path(abs_path) + + '?op=SETPERMISSION' + '&permission=' + permission_mask; + + $.ajax(url, { type: 'PUT' + }).done(function(data) { + browse_directory(current_directory); + }).error(network_error_handler(url)) + .complete(function() { + $('.explorer-perm-links').popover('destroy'); + }); + } + function encode_path(abs_path) { abs_path = encodeURIComponent(abs_path); var re = /%2F/g; @@ -198,6 +243,14 @@ } }); + //Set the handler for changing permissions + $('.explorer-perm-links').click(function() { + var filename = $(this).closest('tr').attr('inode-path'); + var abs_path = append_path(current_directory, filename); + var perms = $(this).closest('tr').attr('data-permission'); + view_perm_details($(this), filename, abs_path, perms); + }); + $('.explorer-entry .glyphicon-trash').click(function() { var inode_name = $(this).closest('tr').attr('inode-path'); var absolute_file_path = append_path(current_directory, inode_name); @@ -223,8 +276,7 @@ } $('#btn-create-directory').on('show.bs.modal', function(event) { - var modal = $(this) - $('#new_directory_pwd').html(current_directory); + $('#new_directory_pwd').text(current_directory); }); $('#btn-create-directory-send').click(function () { http://git-wip-us.apache.org/repos/asf/hadoop/blob/07f30446/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/static/hadoop.css ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/static/hadoop.css b/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/static/hadoop.css index e22611e..58c3cb5 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/static/hadoop.css +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/static/hadoop.css @@ -267,3 +267,22 @@ header.bs-docs-nav, header.bs-docs-nav .navbar-brand { .explorer-entry .explorer-browse-links { cursor: pointer; } .explorer-entry .glyphicon-trash { cursor: pointer; } + +.popover { + max-width: 400px; +} + +.explorer-popover-perm-body table { + width: 30rem; +} + +.explorer-popover-perm-body table > tbody > tr > td { + text-align: center; +} + +.explorer-popover-perm-body label { + display:inline; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} \ No newline at end of file