HDFS Chown
Set ownership on an HDFS File/Directory using webhdfs api.
Options
nn_url
(String, array)
The url like https://master01.metal.ryba:50470. RYBA will take every url an will request Namenode's metrics to get the active status.krb5_user
(obj)
A principal which has suffisiant permission to request namenode api.target
(string)
The target File/directory to set owner on. Required.owner
(string)
The username as a string. Required.group
(string) the groupname. Required.
Source Code
module.exports = ({options}, callback) ->
return callback Error 'Missing krb5 user' unless options.krb5_user
return callback Error 'Missing owner' unless options.owner
return callback Error 'Missing group' unless options.group
return callback Error 'Missing target' unless options.target
active_url = null
@registry.register ['hdfs','active'], require './active'
options.header = null
do_owner = true
do_permission = true
@registry.register ['hdfs','active'], require './active'
@call ->
@hdfs.active options
, (err, obj) ->
active_url = obj.active
@call
shy: true
, ->
@system.execute
cmd: mkcmd.hdfs options.krb5_user, "/bin/bash -c 'curl -H \"Content-Type: application/json\" --negotiate -X GET -k -u : \"#{active_url}/webhdfs/v1#{options.target}?op=GETFILESTATUS\"'"
, (err, obj) ->
throw err if err
try
data = JSON.parse obj.stdout
if data.RemoteException?.exception?
switch data.RemoteException.exception
when 'FileNotFoundException'
file_exists = false
@log message: "Target #{options.target} does not exist", level: 'INFO'
else
throw Error data.RemoteException
else
## check owner and permission
@log message: "Target #{options.target} exist", level: 'INFO'
@log message: "Checking permission and owner", level: 'INFO'
@log message: "current owner: #{data['FileStatus']['owner']} target owner: #{options.owner}", level: 'INFO'
@log message: "current group: #{data['FileStatus']['group']} target group: #{options.group}", level: 'INFO'
@log message: "current permission: #{data['FileStatus']['permission']} target permission: #{options.mode}", level: 'INFO'
do_owner = (data['FileStatus']['group'] isnt options.group) || (data['FileStatus']['owner'] isnt options.owner)
do_permission = (data['FileStatus']['permission'] isnt options.mode)
@log message: "skipping SETOWNER", level: 'INFO' unless do_owner
@log message: "skipping SETPERMISSION", level: 'INFO' unless do_permission
catch err
throw err
@call
if: -> do_owner
, ->
@system.execute
local: options.local
cmd: mkcmd.hdfs options.krb5_user, "/bin/bash -c 'curl --fail --negotiate -X PUT -k -u : \"#{active_url}/webhdfs/v1#{options.target}?op=SETOWNER&owner=#{options.owner}&group=#{options.group}\"'"
@call
if: -> do_permission
, ->
@system.execute
local: options.local
cmd: mkcmd.hdfs options.krb5_user, "/bin/bash -c 'curl --fail --negotiate -X PUT -k -u : \"#{active_url}/webhdfs/v1#{options.target}?op=SETPERMISSION&permission=#{options.mode}\"'"
@next callback
Dependencies
mkcmd = require '../../mkcmd'