35 #include <boost/date_time.hpp>
36 #include <boost/optional.hpp>
42 const std::string& _resource_name) {
49 snprintf( tmp_str,
MAX_NAME_LEN,
"='%s'", _resource_name.c_str() );
51 snprintf( tmp_str,
MAX_NAME_LEN,
"='rebalance_operation'" );
62 rodsLog(
LOG_ERROR,
"%s: getSqlResultByInx for COL_META_RESC_ATTR_VALUE failed", __FUNCTION__ );
66 rodsLog(
LOG_ERROR,
"%s: getSqlResultByInx for COL_META_RESC_ATTR_UNITS failed", __FUNCTION__ );
69 std::stringstream msg;
70 msg <<
"A rebalance_operation on resource [";
71 msg << _resource_name.c_str();
72 msg <<
"] is still active (or stale) [";
73 msg << &hostname_and_pid->
value[0];
75 msg << ×tamp->
value[0];
88 const std::string& _resource_name) {
92 free( modAVUMetadataInp.arg0 );
93 free( modAVUMetadataInp.arg1 );
94 free( modAVUMetadataInp.arg2 );
95 free( modAVUMetadataInp.arg3 );
96 free( modAVUMetadataInp.arg4 );
97 free( modAVUMetadataInp.arg5 );
105 const boost::posix_time::ptime timeUTC = boost::posix_time::second_clock::universal_time();
106 std::stringstream stream;
107 boost::posix_time::time_facet* facet =
new boost::posix_time::time_facet();
108 facet->format(
"%Y%m%dT%H%M%SZ");
109 stream.imbue(std::locale(std::locale::classic(), facet));
112 modAVUMetadataInp.arg0 = strdup(
"set" );
113 modAVUMetadataInp.arg1 = strdup(
"-R" );
114 modAVUMetadataInp.arg2 = strdup( _resource_name.c_str() );
115 modAVUMetadataInp.arg3 = strdup(
"rebalance_operation" );
116 std::string
value = std::string(hostname) + std::string(
":") + std::to_string(
pid);
117 modAVUMetadataInp.arg4 = strdup(
value.c_str() );
118 std::string
unit = stream.str();
119 modAVUMetadataInp.arg5 = strdup(
unit.c_str() );
126 const std::string& _resource_name) {
141 const std::string& _resource_name) {
147 snprintf( tmp_str,
MAX_NAME_LEN,
"='%s'", _resource_name.c_str() );
149 snprintf( tmp_str,
MAX_NAME_LEN,
"='rebalance_operation'" );
159 free( modAVUMetadataInp.arg0 );
160 free( modAVUMetadataInp.arg1 );
161 free( modAVUMetadataInp.arg2 );
162 free( modAVUMetadataInp.arg3 );
163 free( modAVUMetadataInp.arg4 );
164 free( modAVUMetadataInp.arg5 );
167 modAVUMetadataInp.arg0 = strdup(
"rmw" );
168 modAVUMetadataInp.arg1 = strdup(
"-R" );
169 modAVUMetadataInp.arg2 = strdup( _resource_name.c_str() );
170 modAVUMetadataInp.arg3 = strdup(
"rebalance_operation" );
171 modAVUMetadataInp.arg4 = strdup(
"%" );
172 modAVUMetadataInp.arg5 = strdup(
"%" );
195 std::string svc_role;
209 "role not supported [%s]",
226 "rsGeneralAdmin: rcGeneralAdmin error %d",
status );
234 std::map<std::string, std::string> resc_input;
237 const auto length_exceeded = [](
const auto& _resource_name)
239 return std::strlen(_resource_name) >=
NAME_LEN;
242 if (length_exceeded(_generalAdminInp->
arg2) || length_exceeded(_generalAdminInp->
arg3)) {
247 if (std::strncmp(_generalAdminInp->
arg2, _generalAdminInp->
arg3,
NAME_LEN) == 0) {
248 std::string msg =
"Cannot add resource [";
249 msg += _generalAdminInp->
arg3;
250 msg +=
"] as child to itself.";
264 const auto is_root_resource = [](
const auto& _resource_name) -> std::tuple<
irods::error, boost::optional<bool>>
270 return std::make_tuple(err, boost::none);
280 return std::make_tuple(err, boost::none);
283 return {
SUCCESS(), 1 == levels};
288 auto result = is_root_resource(_generalAdminInp->
arg3);
289 auto& err = std::get<0>(result);
290 auto& res = std::get<1>(result);
294 std::string msg =
"Child resource [";
295 msg += _generalAdminInp->
arg3;
296 msg +=
"] already has a parent resource.";
344 std::string msg =
"Cannot add ancestor resource [";
345 msg += _generalAdminInp->
arg3;
346 msg +=
"] as child to descendant resource [";
347 msg += _generalAdminInp->
arg2;
359 std::string rescChild( _generalAdminInp->
arg3 );
360 std::string rescContext( _generalAdminInp->
arg4 );
362 if (rescContext.find(
';') != std::string::npos) {
363 rodsLog(
LOG_ERROR,
"_addChildToResource: semicolon ';' not allowed in child context string [%s]", rescContext.c_str());
367 if (rescContext.find(
'{') != std::string::npos) {
368 rodsLog(
LOG_ERROR,
"_addChildToResource: open curly bracket '{' not allowed in child context string [%s]", rescContext.c_str());
372 if (rescContext.find(
'}') != std::string::npos) {
373 rodsLog(
LOG_ERROR,
"_addChildToResource: close curly bracket '}' not allowed in child context string [%s]", rescContext.c_str());
378 parser.add_child( rescChild, rescContext );
379 std::string rescChildren;
380 parser.str( rescChildren );
387 rodsLog(
LOG_NOTICE,
"rsGeneralAdmin add child \"%s\" to resource \"%s\"", rescChildren.c_str(),
403 std::map<std::string, std::string> resc_input;
433 static const unsigned int argc = 7;
434 const char *args[argc];
435 std::map<std::string, std::string> resc_input;
472 std::vector< std::string > tok;
477 if ( 2 == tok.size() ) {
480 if ( strlen( tok[0].c_str() ) >=
NAME_LEN ) {
511 std::string plugin_home;
521 "No plugin exists to provide resource [%s] of type [%s]",
532 rodsLog(
LOG_ERROR,
"rsGeneralAdmin: acPreProcForCreateResource error for %s, stat=%d",
538 else if ( ( result =
chlRegResc( _rsComm, resc_input ) ) != 0 ) {
548 rodsLog(
LOG_ERROR,
"rsGeneralAdmin: acPostProcForCreateResource error for %s, stat=%d",
559 std::string plugin_home;
569 ret = name_gen.
list_plugins( plugin_home, plugin_list );
571 std::stringstream msg;
572 for ( irods::plugin_name_generator::plugin_list_t::iterator it = plugin_list.begin();
573 result == 0 && it != plugin_list.end(); ++it ) {
574 msg << *it << std::endl;
581 std::stringstream msg;
583 msg <<
" - Failed to generate the list of resource plugins.";
601 rei2.rsComm = rsComm;
602 if ( rsComm !=
NULL ) {
609 "_rsGeneralAdmin arg0=%s",
610 generalAdminInp->
arg0 );
612 if ( strcmp( generalAdminInp->
arg0,
"add" ) == 0 ) {
613 if ( strcmp( generalAdminInp->
arg1,
"user" ) == 0 ) {
615 memset( (
char* )&rei, 0,
sizeof( rei ) );
618 memset( &userInfo, 0,
sizeof( userInfo ) );
623 rei.uoio = &userInfo;
632 if ( strcmp( generalAdminInp->
arg1,
"dir" ) == 0 ) {
633 memset( (
char* )&collInfo, 0,
sizeof( collInfo ) );
634 snprintf( collInfo.collName,
sizeof( collInfo.collName ),
"%s", generalAdminInp->
arg2 );
635 if ( strlen( generalAdminInp->
arg3 ) > 0 ) {
636 snprintf( collInfo.collOwnerName,
sizeof( collInfo.collOwnerName ),
"%s", generalAdminInp->
arg3 );
652 if ( strcmp( generalAdminInp->
arg1,
"zone" ) == 0 ) {
654 generalAdminInp->
arg3,
655 generalAdminInp->
arg4,
656 generalAdminInp->
arg5 );
658 if ( strcmp( generalAdminInp->
arg3,
"remote" ) == 0 ) {
659 memset( (
char* )&collInfo, 0,
sizeof( collInfo ) );
660 snprintf( collInfo.collName,
sizeof( collInfo.collName ),
"/%s", generalAdminInp->
arg2 );
661 snprintf( collInfo.collOwnerName,
sizeof( collInfo.collOwnerName ),
"%s", rsComm->
proxyUser.
userName );
673 if ( strcmp( generalAdminInp->
arg1,
"resource" ) == 0 ) {
678 if ( strcmp( generalAdminInp->
arg1,
"childtoresc" ) == 0 ) {
682 if ( strcmp( generalAdminInp->
arg1,
"token" ) == 0 ) {
683 args[0] = generalAdminInp->
arg2;
684 args[1] = generalAdminInp->
arg3;
685 args[2] = generalAdminInp->
arg4;
686 args[3] = generalAdminInp->
arg5;
687 args[4] = generalAdminInp->
arg6;
688 args[5] = generalAdminInp->
arg7;
692 if ( rei2.status < 0 ) {
696 "rsGeneralAdmin: acPreProcForCreateToken error for %s.%s=%s, stat=%d",
697 args[0], args[1], args[2], i );
702 generalAdminInp->
arg3,
703 generalAdminInp->
arg4,
704 generalAdminInp->
arg5,
705 generalAdminInp->
arg6,
706 generalAdminInp->
arg7 );
710 if ( rei2.status < 0 ) {
714 "rsGeneralAdmin: acPostProcForCreateToken error for %s.%s=%s, stat=%d",
715 args[0], args[1], args[2], i );
725 if ( strcmp( generalAdminInp->
arg1,
"specificQuery" ) == 0 ) {
727 generalAdminInp->
arg3 );
733 if ( strcmp( generalAdminInp->
arg0,
"modify" ) == 0 ) {
734 if ( strcmp( generalAdminInp->
arg1,
"user" ) == 0 ) {
735 args[0] = generalAdminInp->
arg2;
736 args[1] = generalAdminInp->
arg3;
742 args[2] =
"obfuscatedPw";
746 if ( rei2.status < 0 ) {
750 "rsGeneralAdmin: acPreProcForModifyUser error for %s and option %s, stat=%d",
751 args[0], args[1], i );
756 generalAdminInp->
arg3, generalAdminInp->
arg4 );
761 if ( rei2.status < 0 ) {
765 "rsGeneralAdmin: acPostProcForModifyUser error for %s and option %s, stat=%d",
766 args[0], args[1], i );
775 if ( strcmp( generalAdminInp->
arg1,
"group" ) == 0 ) {
781 args[0] = generalAdminInp->
arg2;
782 args[1] = generalAdminInp->
arg3;
783 args[2] = generalAdminInp->
arg4;
784 args[3] = generalAdminInp->
arg5;
788 if ( rei2.status < 0 ) {
792 "rsGeneralAdmin: acPreProcForModifyUserGroup error for %s and option %s, stat=%d",
793 args[0], args[1], i );
798 generalAdminInp->
arg3, generalAdminInp->
arg4,
799 generalAdminInp->
arg5 );
803 if ( rei2.status < 0 ) {
807 "rsGeneralAdmin: acPostProcForModifyUserGroup error for %s and option %s, stat=%d",
808 args[0], args[1], i );
817 if ( strcmp( generalAdminInp->
arg1,
"zone" ) == 0 ) {
819 generalAdminInp->
arg3, generalAdminInp->
arg4 );
824 strcmp( generalAdminInp->
arg3,
"name" ) == 0 ) {
827 snprintf( oldName,
sizeof( oldName ),
"/%s", generalAdminInp->
arg2 );
828 snprintf( newName,
sizeof( newName ),
"%s", generalAdminInp->
arg4 );
836 if ( strcmp( generalAdminInp->
arg1,
"zonecollacl" ) == 0 ) {
838 generalAdminInp->
arg3, generalAdminInp->
arg4 );
841 if ( strcmp( generalAdminInp->
arg1,
"localzonename" ) == 0 ) {
844 memset( (
char* )&rei, 0,
sizeof( rei ) );
846 memset( (
char* )&rei, 0,
sizeof( rei ) );
850 args[0] = generalAdminInp->
arg2;
851 args[1] = generalAdminInp->
arg3;
856 if ( strcmp( generalAdminInp->
arg1,
"resourcedatapaths" ) == 0 ) {
858 generalAdminInp->
arg3, generalAdminInp->
arg4,
859 generalAdminInp->
arg5 );
863 if ( strcmp( generalAdminInp->
arg1,
"resource" ) == 0 ) {
865 args[0] = generalAdminInp->
arg2;
866 args[1] = generalAdminInp->
arg3;
867 args[2] = generalAdminInp->
arg4;
871 if ( rei2.status < 0 ) {
875 "rsGeneralAdmin: acPreProcForModifyResource error for %s and option %s, stat=%d",
876 args[0], args[1], i );
882 if ( 0 == strcmp( args[1],
"rebalance" ) ) {
895 if (visibility_status < 0){
896 return visibility_status;
908 if (visibility_status < 0){
909 return visibility_status;
918 generalAdminInp->
arg2,
919 generalAdminInp->
arg3,
920 generalAdminInp->
arg4 );
927 if ( rei2.status < 0 ) {
931 "rsGeneralAdmin: acPostProcForModifyResource error for %s and option %s, stat=%d",
932 args[0], args[1], i );
942 if ( strcmp( generalAdminInp->
arg0,
"rm" ) == 0 ) {
943 if ( strcmp( generalAdminInp->
arg1,
"user" ) == 0 ) {
946 memset( (
char* )&rei, 0,
sizeof( rei ) );
949 memset( &userInfo, 0,
sizeof( userInfo ) );
960 if ( strcmp( zoneName,
"" ) != 0 ) {
961 snprintf( userInfoRei.
rodsZone,
sizeof( userInfoRei.
rodsZone ),
"%s", zoneName );
969 rei.uoio = &userInfoRei;
978 if ( strcmp( generalAdminInp->
arg1,
"dir" ) == 0 ) {
979 memset( (
char* )&collInfo, 0,
sizeof( collInfo ) );
980 snprintf( collInfo.collName,
sizeof( collInfo.collName ),
"%s", generalAdminInp->
arg2 );
981 if ( collInfo.collName[
sizeof( collInfo.collName ) - 1] ) {
990 if ( strcmp( generalAdminInp->
arg1,
"resource" ) == 0 ) {
992 std::string resc_name =
"";
997 if ( strcmp( generalAdminInp->
arg3,
"--dryrun" ) == 0 ) {
1003 resc_name = generalAdminInp->
arg2;
1023 resc_name = generalAdminInp->
arg2;
1025 args[0] = resc_name.c_str();
1029 if ( rei2.status < 0 ) {
1033 "rsGeneralAdmin: acPreProcForDeleteResource error for %s, stat=%d",
1034 resc_name.c_str(), i );
1042 if ( rei2.status < 0 ) {
1046 "rsGeneralAdmin: acPostProcForDeleteResource error for %s, stat=%d",
1047 resc_name.c_str(), i );
1059 if ( strcmp( generalAdminInp->
arg1,
"childfromresc" ) == 0 ) {
1063 if ( strcmp( generalAdminInp->
arg1,
"zone" ) == 0 ) {
1066 memset( (
char* )&collInfo, 0,
sizeof( collInfo ) );
1067 snprintf( collInfo.collName,
sizeof( collInfo.collName ),
"/%s", generalAdminInp->
arg2 );
1075 if ( strcmp( generalAdminInp->
arg1,
"token" ) == 0 ) {
1077 args[0] = generalAdminInp->
arg2;
1078 args[1] = generalAdminInp->
arg3;
1082 if ( rei2.status < 0 ) {
1086 "rsGeneralAdmin:acPreProcForDeleteToken error for %s.%s,stat=%d",
1087 args[0], args[1], i );
1092 generalAdminInp->
arg3 );
1097 if ( rei2.status < 0 ) {
1101 "rsGeneralAdmin: acPostProcForDeleteToken error for %s.%s, stat=%d",
1102 args[0], args[1], i );
1112 if ( strcmp( generalAdminInp->
arg1,
"unusedAVUs" ) == 0 ) {
1116 if ( strcmp( generalAdminInp->
arg1,
"specificQuery" ) == 0 ) {
1121 if ( strcmp( generalAdminInp->
arg0,
"calculate-usage" ) == 0 ) {
1125 if ( strcmp( generalAdminInp->
arg0,
"set-quota" ) == 0 ) {
1127 generalAdminInp->
arg1,
1128 generalAdminInp->
arg2,
1129 generalAdminInp->
arg3,
1130 generalAdminInp->
arg4 );
1135 if ( strcmp( generalAdminInp->
arg0,
"lt" ) == 0 ) {
1137 if ( strcmp( generalAdminInp->
arg1,
"resc_type" ) == 0 ) {