Main Tables Views Materialized Views Indexes Constraints Triggers Procedures Functions Packages Sequences Java Sources Sanity Check Index DDL scrips
Package source Package body source

RHN_SERVER

DDL script

Package source

Legend: comment string keyword reserved word operator
     1: package rhn_server
     2: is
     3: 
     4:     -- i.e., "can this box do management stuff?" and yes if provisioning box
     5:     function system_service_level(
     6:     	server_id_in in number,
     7: 	service_level_in in varchar2
     8:     ) return number;
     9: 
    10:     function can_change_base_channel(
    11:     	server_id_in in number
    12:     ) return number;
    13: 
    14:     procedure set_custom_value(
    15:     	server_id_in in number,
    16: 	user_id_in in number,
    17: 	key_label_in varchar2,
    18:      	value_in in varchar2
    19:     );
    20: 
    21:     function bulk_set_custom_value(
    22:     	key_label_in in varchar2,
    23: 	value_in in varchar2,
    24: 	set_label_in in varchar2,
    25: 	set_uid_in in number
    26:     ) return integer;
    27: 
    28:     procedure snapshot_server(
    29:     	server_id_in in number,
    30: 	reason_in in varchar2
    31:     );
    32: 
    33:     procedure bulk_snapshot(
    34:     	reason_in in varchar2,
    35:     	set_label_in in varchar2,
    36: 	set_uid_in in number
    37:     );
    38: 
    39:     procedure tag_delete(
    40:     	server_id_in in number,
    41: 	tag_id_in in number
    42:     );
    43: 
    44:     procedure tag_snapshot(
    45:     	snapshot_id_in in number,
    46: 	org_id_in in number,
    47:     	tagname_in in varchar2
    48:     );
    49: 
    50:     procedure bulk_snapshot_tag(
    51:     	org_id_in in number,
    52:     	tagname_in varchar2,
    53: 	set_label_in in varchar2,
    54: 	set_uid_in in number
    55:     );
    56: 
    57:     procedure remove_action(
    58: 	server_id_in in number,
    59: 	action_id_in in number
    60:     );
    61: 
    62:     function check_user_access(server_id_in in number, user_id_in in number) return number;
    63: 
    64: 
    65:     function can_server_consume_virt_slot(server_id_in in number,
    66:                                               group_type_in in
    67:                                               rhnServerGroupType.label%TYPE)
    68:     return number;
    69: 
    70:     procedure insert_into_servergroup (
    71: 	server_id_in in number,
    72: 	server_group_id_in in number
    73:     );
    74: 
    75:     function insert_into_servergroup_maybe (
    76: 	server_id_in in number,
    77: 	server_group_id_in in number
    78:     ) return number;
    79: 
    80: 	procedure insert_set_into_servergroup (
    81: 	server_group_id_in in number,
    82: 	user_id_in in number,
    83: 	set_label_in in varchar2
    84: 	);
    85: 
    86:     procedure delete_from_servergroup (
    87: 	server_id_in in number,
    88: 	server_group_id_in in number
    89:     );
    90: 
    91: 	procedure delete_set_from_servergroup (
    92: 	server_group_id_in in number,
    93: 	user_id_in in number,
    94: 	set_label_in in varchar2
    95: 	);
    96: 
    97: 	procedure clear_servergroup (
    98: 	server_group_id_in in number
    99: 	);
   100: 
   101: 	procedure delete_from_org_servergroups (
   102: 	server_id_in in number
   103: 	);
   104: 
   105: 	function get_ip_address (
   106: 		server_id_in in number
   107: 	) return varchar2;
   108: end rhn_server;

Package body source

Legend: comment string keyword reserved word operator
     1: package body rhn_server
     2: is
     3:     function system_service_level(
     4:     	server_id_in in number,
     5: 	service_level_in in varchar2
     6:     ) return number is
     7: 
     8:     cursor ents is
     9:       select label from rhnServerEntitlementView
    10:       where server_id = server_id_in;
    11: 
    12:     retval number := 0;
    13: 
    14:     begin
    15:          for ent in ents loop
    16:             retval := rhn_entitlements.entitlement_grants_service (ent.label, service_level_in);
    17:             if retval = 1 then
    18:                return retval;
    19:             end if;
    20:          end loop;
    21: 
    22:          return retval;
    23: 
    24:     end system_service_level;
    25: 
    26: 
    27:     function can_change_base_channel(server_id_in IN NUMBER)
    28:     return number
    29:     is
    30:     	throwaway number;
    31:     begin
    32:     	-- the idea: if we get past this query, the server is
    33: 	-- neither sat nor proxy, so base channel is changeable
    34: 
    35: 	select 1 into throwaway
    36: 	  from rhnServer S
    37: 	 where S.id = server_id_in
    38: 	   and not exists (select 1 from rhnSatelliteInfo SI where SI.server_id = S.id)
    39: 	   and not exists (select 1 from rhnProxyInfo PI where PI.server_id = S.id);
    40: 
    41: 	return 1;
    42:     exception
    43:     	when no_data_found
    44: 	    then
    45: 	    return 0;
    46:     end can_change_base_channel;
    47: 
    48:     procedure set_custom_value(
    49:     	server_id_in in number,
    50: 	user_id_in in number,
    51: 	key_label_in in varchar2,
    52: 	value_in in varchar2
    53:     ) is
    54:     	key_id_val number;
    55:     begin
    56:     	select CDK.id into key_id_val
    57: 	  from rhnCustomDataKey CDK,
    58: 	       rhnServer S
    59: 	 where S.id = server_id_in
    60: 	   and S.org_id = CDK.org_id
    61: 	   and CDK.label = key_label_in;
    62: 
    63: 	begin
    64: 	    insert into rhnServerCustomDataValue (server_id, key_id, value, created_by, last_modified_by)
    65: 	    values (server_id_in, key_id_val, value_in, user_id_in, user_id_in);
    66: 	exception
    67: 	    when DUP_VAL_ON_INDEX
    68: 	    	then
    69: 		update rhnServerCustomDataValue
    70: 		   set value = value_in,
    71: 		       last_modified_by = user_id_in
    72: 		 where server_id = server_id_in
    73: 		   and key_id = key_id_val;
    74: 	end;
    75: 
    76:     end set_custom_value;
    77: 
    78:     function bulk_set_custom_value(
    79:     	key_label_in in varchar2,
    80: 	value_in in varchar2,
    81: 	set_label_in in varchar2,
    82: 	set_uid_in in number
    83:     )
    84:     return integer
    85:     is
    86:     i integer := 0;
    87:     begin
    88:         i := 0;
    89:     	for server in rhn_set.set_iterator(set_label_in, set_uid_in)
    90: 	loop
    91: 	    if rhn_server.system_service_level(server.element, 'provisioning') = 1 then
    92: 	    	rhn_server.set_custom_value(server.element, set_uid_in, key_label_in, value_in);
    93:             i := i + 1;
    94: 	    end if;
    95: 	end loop server;
    96:     return i;
    97:     end bulk_set_custom_value;
    98: 
    99:     procedure bulk_snapshot_tag(
   100:     	org_id_in in number,
   101:         tagname_in in varchar2,
   102: 	set_label_in in varchar2,
   103: 	set_uid_in in number
   104:     ) is
   105:     	snapshot_id number;
   106:     begin
   107:     	for server in rhn_set.set_iterator(set_label_in, set_uid_in)
   108: 	loop
   109: 	    if rhn_server.system_service_level(server.element, 'provisioning') = 1 then
   110: 	    	begin
   111: 	    	    select max(id) into snapshot_id
   112: 	    	    from rhnSnapshot
   113: 	    	    where server_id = server.element;
   114: 	    	exception
   115: 	    	    when NO_DATA_FOUND then
   116: 		    	rhn_server.snapshot_server(server.element, 'tagging system:  ' || tagname_in);
   117: 
   118: 			select max(id) into snapshot_id
   119: 			from rhnSnapshot
   120: 			where server_id = server.element;
   121: 		end;
   122: 
   123: 		-- now have a snapshot_id to work with...
   124: 		begin
   125: 		    rhn_server.tag_snapshot(snapshot_id, org_id_in, tagname_in);
   126: 		exception
   127: 		    when DUP_VAL_ON_INDEX
   128: 		    	then
   129: 			-- do nothing, be forgiving...
   130: 			null;
   131: 		end;
   132: 	    end if;
   133: 	end loop server;
   134:     end bulk_snapshot_tag;
   135: 
   136:     procedure tag_delete(
   137:     	server_id_in in number,
   138: 	tag_id_in in number
   139:     ) is
   140:     	cursor snapshots is
   141: 		select	snapshot_id
   142: 		from	rhnSnapshotTag
   143: 		where	tag_id = tag_id_in;
   144: 	tag_id_tmp number;
   145:     begin
   146:     	select	id into tag_id_tmp
   147: 	from	rhnTag
   148: 	where	id = tag_id_in
   149: 	for update;
   150: 
   151: 	delete
   152: 		from	rhnSnapshotTag
   153: 		where	server_id = server_id_in
   154: 			and tag_id = tag_id_in;
   155: 	for snapshot in snapshots loop
   156: 		return;
   157: 	end loop;
   158: 	delete
   159: 		from rhnTag
   160: 		where id = tag_id_in;
   161:     end tag_delete;
   162: 
   163:     procedure tag_snapshot(
   164:         snapshot_id_in in number,
   165: 	org_id_in in number,
   166: 	tagname_in in varchar2
   167:     ) is
   168:     begin
   169:     	insert into rhnSnapshotTag (snapshot_id, server_id, tag_id)
   170: 	select snapshot_id_in, server_id, lookup_tag(org_id_in, tagname_in)
   171: 	from rhnSnapshot
   172: 	where id = snapshot_id_in;
   173:     end tag_snapshot;
   174: 
   175:     procedure bulk_snapshot(
   176:     	reason_in in varchar2,
   177: 	set_label_in in varchar2,
   178: 	set_uid_in in number
   179:     ) is
   180:     begin
   181:     	for server in rhn_set.set_iterator(set_label_in, set_uid_in)
   182: 	loop
   183:     	    if rhn_server.system_service_level(server.element, 'provisioning') = 1 then
   184: 	    	rhn_server.snapshot_server(server.element, reason_in);
   185: 	    end if;
   186: 	end loop server;
   187:     end bulk_snapshot;
   188: 
   189:     procedure snapshot_server(
   190:     	server_id_in in number,
   191: 	reason_in in varchar2
   192:     ) is
   193:     	snapshot_id number;
   194: 	cursor revisions is
   195: 		select distinct
   196: 			cr.id
   197: 		from	rhnConfigRevision	cr,
   198: 			rhnConfigFileName	cfn,
   199: 			rhnConfigFile		cf,
   200: 			rhnConfigChannel	cc,
   201: 			rhnServerConfigChannel	scc
   202: 		where	1=1
   203: 			and scc.server_id = server_id_in
   204: 			and scc.config_channel_id = cc.id
   205: 			and cc.id = cf.config_channel_id
   206: 			and cf.id = cr.config_file_id
   207: 			and cr.id = cf.latest_config_revision_id
   208: 			and cf.config_file_name_id = cfn.id
   209: 			and cf.id = lookup_first_matching_cf(scc.server_id, cfn.path);
   210: 	locked integer;
   211:     begin
   212:     	select rhn_snapshot_id_seq.nextval into snapshot_id from dual;
   213: 
   214: 	insert into rhnSnapshot (id, org_id, server_id, reason) (
   215: 		select	snapshot_id,
   216: 			s.org_id,
   217: 			server_id_in,
   218: 			reason_in
   219: 		from	rhnServer s
   220: 		where	s.id = server_id_in
   221: 	);
   222: 	insert into rhnSnapshotChannel (snapshot_id, channel_id) (
   223: 		select	snapshot_id, sc.channel_id
   224: 		from	rhnServerChannel sc
   225: 		where	sc.server_id = server_id_in
   226: 	);
   227: 	insert into rhnSnapshotServerGroup (snapshot_id, server_group_id) (
   228: 		select	snapshot_id, sgm.server_group_id
   229: 		from	rhnServerGroupMembers sgm
   230: 		where	sgm.server_id = server_id_in
   231: 	);
   232:         locked := 0;
   233:         while true loop
   234:             begin
   235:                 insert into rhnPackageNEVRA (id, name_id, evr_id, package_arch_id)
   236:                 select rhn_pkgnevra_id_seq.nextval, sp.name_id, sp.evr_id, sp.package_arch_id
   237:                 from rhnServerPackage sp
   238:                 where sp.server_id = server_id_in
   239:                         and not exists
   240:                         (select 1
   241:                                 from rhnPackageNEVRA nevra
   242:                                 where nevra.name_id = sp.name_id
   243:                                         and nevra.evr_id = sp.evr_id
   244:                                         and (nevra.package_arch_id = sp.package_arch_id
   245:                                             or (nevra.package_arch_id is null
   246:                                                 and sp.package_arch_id is null)));
   247:                 exit;
   248:             exception when dup_val_on_index then
   249:                 if locked = 1 then
   250:                     raise;
   251:                 else
   252:                     lock table rhnPackageNEVRA in exclusive mode;
   253:                     locked := 1;
   254:                 end if;
   255:             end;
   256:         end loop;
   257: 	insert into rhnSnapshotPackage (snapshot_id, nevra_id) (
   258:                 select distinct snapshot_id, nevra.id
   259:                 from    rhnServerPackage sp, rhnPackageNEVRA nevra
   260:                 where   sp.server_id = server_id_in
   261:                         and nevra.name_id = sp.name_id
   262:                         and nevra.evr_id = sp.evr_id
   263:                         and (nevra.package_arch_id = sp.package_arch_id
   264:                             or (nevra.package_arch_id is null
   265:                                 and sp.package_arch_id is null))
   266: 	);
   267: 
   268: 	insert into rhnSnapshotConfigChannel ( snapshot_id, config_channel_id ) (
   269: 		select	snapshot_id, scc.config_channel_id
   270: 		from	rhnServerConfigChannel scc
   271: 		where	server_id = server_id_in
   272: 	);
   273: 
   274: 	for revision in revisions loop
   275: 		insert into rhnSnapshotConfigRevision (
   276: 				snapshot_id, config_revision_id
   277: 			) values (
   278: 				snapshot_id, revision.id
   279: 			);
   280: 	end loop;
   281:     end snapshot_server;
   282: 
   283:     procedure remove_action(
   284:     	server_id_in in number,
   285: 	action_id_in in number
   286:     ) is
   287:     	-- this really wants "nulls last", but 8.1.7.3.0 sucks ass.
   288: 	-- instead, we make a local table that holds our
   289: 	-- list of ids with null prereqs.  There's surely a better way
   290: 	-- (an array instead of a table maybe?  who knows...)
   291: 	-- but I've got code to do this handy that I can look at ;)
   292:     	cursor chained_actions is
   293: 		select	id, prerequisite
   294: 		from	rhnAction
   295: 		start with id = action_id_in
   296: 		connect by prior id = prerequisite
   297: 		order by prerequisite desc;
   298: 	cursor sessions is
   299: 		select	s.id
   300: 		from	rhnKickstartSession s
   301: 		where	server_id_in in (s.old_server_id, s.new_server_id)
   302: 			and s.action_id = action_id_in
   303: 			and not exists (
   304: 				select	1
   305: 				from	rhnKickstartSessionState ss
   306: 				where	ss.id = s.state_id
   307: 					and ss.label in ('failed','complete')
   308: 			);
   309: 	type chain_end_type is table of number index by binary_integer;
   310: 	chain_ends chain_end_type;
   311: 	i number;
   312: 	prereq number := 1;
   313:     begin
   314: 	select	prerequisite
   315: 	into	prereq
   316: 	from	rhnAction
   317: 	where	id = action_id_in;
   318: 
   319: 	if prereq is not null then
   320: 		rhn_exception.raise_exception('action_is_child');
   321: 	end if;
   322: 
   323: 	i := 0;
   324: 	for action in chained_actions loop
   325: 		if action.prerequisite is null then
   326: 			chain_ends(i) := action.id;
   327: 			i := i + 1;
   328: 		else
   329: 			delete from rhnServerAction
   330: 				where server_id = server_id_in
   331: 				and action_id = action.id;
   332: 		end if;
   333: 	end loop;
   334: 	i := chain_ends.first;
   335: 	while i is not null loop
   336: 		delete from rhnServerAction
   337: 			where server_id = server_id_in
   338: 			and action_id = chain_ends(i);
   339: 		i := chain_ends.next(i);
   340: 	end loop;
   341: 	for s in sessions loop
   342: 		update rhnKickstartSession
   343: 			set 	state_id = (
   344: 					select	id
   345: 					from	rhnKickstartSessionState
   346: 					where	label = 'failed'
   347: 				),
   348: 				action_id = null
   349: 			where	id = s.id;
   350: 		set_ks_session_history_message(s.id, 'failed', 'Kickstart cancelled due to action removal');
   351: 	end loop;
   352:     end remove_action;
   353: 
   354:     function check_user_access(server_id_in in number, user_id_in in number)
   355:     return number
   356:     is
   357:     	has_access number;
   358:     begin
   359:     	-- first check; if this returns no rows, then the server/user are in different orgs, and we bail
   360:         select 1 into has_access
   361: 	  from rhnServer S,
   362: 	       web_contact wc
   363: 	 where wc.org_id = s.org_id
   364: 	   and s.id = server_id_in
   365: 	   and wc.id = user_id_in;
   366: 
   367: 	-- okay, so they're in the same org.  if we have an org admin, they get a free pass
   368:     	if rhn_user.check_role(user_id_in, 'org_admin') = 1
   369: 	then
   370: 	    return 1;
   371: 	end if;
   372: 
   373:     	select 1 into has_access
   374: 	  from rhnServerGroupMembers SGM,
   375: 	       rhnUserServerGroupPerms USG
   376: 	 where SGM.server_group_id = USG.server_group_id
   377: 	   and SGM.server_id = server_id_in
   378: 	   and USG.user_id = user_id_in
   379: 	   and rownum = 1;
   380: 
   381: 	return 1;
   382:     exception
   383:     	when no_data_found
   384: 	    then
   385: 	    return 0;
   386:     end check_user_access;
   387: 
   388:     -- *******************************************************************
   389:     -- FUNCTION: can_server_consume_virt_slot
   390:     -- Returns 1 if the server id is eligible to consume a virtual slot,
   391:     --   else returns 0.
   392:     -- Called by: insert_into_servergroup, delete_from_servergroup
   393:     -- *******************************************************************
   394:     function can_server_consume_virt_slot(server_id_in in number,
   395:                                            group_type_in in
   396:                                            rhnServerGroupType.label%TYPE)
   397:     return number
   398:     is
   399: 
   400:         cursor server_virt_slots is
   401:             select vi.VIRTUAL_SYSTEM_ID
   402:             from
   403:                 rhnVirtualInstance vi
   404:             where
   405:                 -- server id is a virtual instance
   406:                 vi.VIRTUAL_SYSTEM_ID = server_id_in
   407:                 -- server id's host is virt entitled
   408:                 and exists ( select 1
   409:                      from rhnServerEntitlementView sev
   410:                  where vi.HOST_SYSTEM_ID = sev.server_id
   411:                  and sev.label in ('virtualization_host',
   412:                                    'virtualization_host_platform') )
   413:                 -- server id's host also has the ent we want
   414:                 and exists ( select 1
   415:                      from rhnServerEntitlementView sev2
   416:                  where vi.HOST_SYSTEM_ID = sev2.server_id
   417:                  and sev2.label = group_type_in );
   418: 
   419:     begin
   420:         for server_virt_slot in server_virt_slots loop
   421:             return 1;
   422:         end loop;
   423:         return 0;
   424:     end can_server_consume_virt_slot;
   425: 
   426: 
   427:     procedure insert_into_servergroup (
   428: 		server_id_in in number,
   429: 		server_group_id_in in number
   430:     ) is
   431: 		cursor sg_users is
   432: 			select	user_id id
   433: 			from	rhnUserServerGroupPerms
   434: 			where	server_group_id = server_group_id_in;
   435: 		used_slots number;
   436: 		max_slots number;
   437: 		org_id number;
   438: 		mgmt_available number;
   439: 		mgmt_upgrade number;
   440: 		mgmt_sgid number;
   441: 		prov_available number;
   442: 		prov_upgrade number;
   443: 		prov_sgid number;
   444: 		group_label rhnServerGroupType.label%TYPE;
   445: 		group_type number;
   446: 	begin
   447: 		-- frist, group_type = null, because it's easy...
   448: 
   449: 		-- this will rowlock the servergroup we're trying to change;
   450: 		-- we probably need to lock the other one, but I think the chances
   451: 		-- of it being a real issue are very small for now...
   452: 		select	sg.group_type, sg.org_id, sg.current_members, sg.max_members
   453: 		into	group_type, org_id, used_slots, max_slots
   454: 		from	rhnServerGroup sg
   455: 		where	sg.id = server_group_id_in
   456: 		for update of sg.current_members;
   457: 
   458: 		if group_type is null then
   459: 			if used_slots >= max_slots then
   460: 				rhn_exception.raise_exception('servergroup_max_members');
   461: 			end if;
   462: 
   463: 			insert into rhnServerGroupMembers(
   464: 					server_id, server_group_id
   465: 				) values (
   466: 					server_id_in, server_group_id_in
   467: 				);
   468: 			update rhnServerGroup
   469: 				set current_members = current_members + 1
   470: 				where id = server_group_id_in;
   471: 
   472: 			for u in sg_users loop
   473: 				rhn_cache.update_perms_for_user(u.id);
   474: 			end loop;
   475: 			return;
   476: 		end if;
   477: 
   478: 		-- now for group_type != null
   479: 		--
   480: 		select	label
   481: 		into	group_label
   482: 		from	rhnServerGroupType	sgt
   483: 		where	sgt.id = group_type;
   484: 
   485: 		-- the naive easy path that gets hit most often and has to be quickest.
   486: 		if group_label in ('sw_mgr_entitled',
   487:                            'enterprise_entitled',
   488:                            'monitoring_entitled',
   489:                            'provisioning_entitled',
   490:                            'virtualization_host',
   491:                            'virtualization_host_platform') then
   492: 			if used_slots >= max_slots and
   493:                (can_server_consume_virt_slot(server_id_in, group_label) != 1)
   494:                then
   495: 				rhn_exception.raise_exception('servergroup_max_members');
   496: 			end if;
   497: 
   498: 			insert into rhnServerGroupMembers(
   499: 					server_id, server_group_id
   500: 				) values (
   501: 					server_id_in, server_group_id_in
   502: 				);
   503: 
   504:             -- Only update current members if the system in consuming a
   505:             -- physical slot.
   506:             if can_server_consume_virt_slot(server_id_in, group_label) = 0 then
   507:                 update rhnServerGroup
   508:                 set current_members = current_members + 1
   509:                 where id = server_group_id_in;
   510:             end if;
   511: 
   512: 			return;
   513: 		end if;
   514: 	end;
   515: 
   516: 	function insert_into_servergroup_maybe (
   517: 		server_id_in in number,
   518: 		server_group_id_in in number
   519: 	) return number is
   520: 		retval number := 0;
   521: 		cursor servergroups is
   522: 			select	s.id	server_id,
   523: 					sg.id	server_group_id
   524: 			from	rhnServerGroup	sg,
   525: 					rhnServer		s
   526: 			where	s.id = server_id_in
   527: 				and sg.id = server_group_id_in
   528: 				and s.org_id = sg.org_id
   529: 				and not exists (
   530: 					select	1
   531: 					from	rhnServerGroupMembers sgm
   532: 					where	sgm.server_id = s.id
   533: 						and sgm.server_group_id = sg.id
   534: 				);
   535: 	begin
   536: 		for sgm in servergroups loop
   537: 			rhn_server.insert_into_servergroup(sgm.server_id, sgm.server_group_id);
   538: 			retval := retval + 1;
   539: 		end loop;
   540: 		return retval;
   541: 	end insert_into_servergroup_maybe;
   542: 
   543: 	procedure insert_set_into_servergroup (
   544: 		server_group_id_in in number,
   545: 		user_id_in in number,
   546: 		set_label_in in varchar2
   547: 	) is
   548: 		cursor servers is
   549: 			select	st.element	id
   550: 			from	rhnSet		st
   551: 			where	st.user_id = user_id_in
   552: 				and st.label = set_label_in
   553: 				and exists (
   554: 					select	1
   555: 					from	rhnUserManagedServerGroups umsg
   556: 					where	umsg.server_group_id = server_group_id_in
   557: 						and umsg.user_id = user_id_in
   558: 					)
   559: 				and not exists (
   560: 					select	1
   561: 					from	rhnServerGroupMembers sgm
   562: 					where	sgm.server_id = st.element
   563: 						and sgm.server_group_id = server_group_id_in
   564: 				);
   565: 	begin
   566: 		for s in servers loop
   567: 			rhn_server.insert_into_servergroup(s.id, server_group_id_in);
   568: 		end loop;
   569: 	end insert_set_into_servergroup;
   570: 
   571:     procedure delete_from_servergroup (
   572:     	server_id_in in number,
   573: 		server_group_id_in in number
   574:     ) is
   575: 		cursor sg_users is
   576: 			select	user_id id
   577: 			from	rhnUserServerGroupPerms
   578: 			where	server_group_id = server_group_id_in;
   579: 
   580:         cursor server_virt_groups is
   581:             select 1
   582:             from rhnServerEntitlementVirtual sev
   583:             where sev.server_id = server_id_in
   584:             and sev.server_group_id = server_group_id_in;
   585: 
   586: 		oid number;
   587: 		mgmt_sgid number;
   588: 		label rhnServerGroupType.label%TYPE;
   589: 		group_type number;
   590: 	begin
   591: 		begin
   592: 			select	sg.group_type, sg.org_id
   593: 			into	group_type,	oid
   594: 			from	rhnServerGroupMembers	sgm,
   595: 					rhnServerGroup			sg
   596: 			where	sg.id = server_group_id_in
   597: 				and sg.id = sgm.server_group_id
   598: 				and sgm.server_id = server_id_in
   599: 			for update of sg.current_members;
   600: 		exception
   601: 			when no_data_found then
   602: 				rhn_exception.raise_exception('server_not_in_group');
   603: 		end;
   604: 
   605: 		-- do group_type is null first
   606: 		if group_type is null then
   607: 			delete from rhnServerGroupMembers
   608: 				where server_group_id = server_group_id_in
   609: 				and	server_id = server_id_in;
   610: 			update rhnServerGroup
   611: 				set current_members = current_members - 1
   612: 				where id = server_group_id_in;
   613: 			for u in sg_users loop
   614: 				rhn_cache.update_perms_for_user(u.id);
   615: 			end loop;
   616: 			return;
   617: 		end if;
   618: 
   619: 		select	sgt.label
   620: 		into	label
   621: 		from	rhnServerGroupType sgt
   622: 		where	sgt.id = group_type;
   623: 
   624: 		if label in ('sw_mgr_entitled',
   625:                      'enterprise_entitled',
   626:                      'provisioning_entitled',
   627:                      'monitoring_entitled',
   628:                      'virtualization_host',
   629:                      'virtualization_host_platform') then
   630: 
   631:             -- Only update current members if the system is consuming
   632:             -- a physical slot.
   633:             for server_virt_group in server_virt_groups loop
   634:                 delete from rhnServerGroupMembers
   635:                 where server_group_id = server_group_id_in
   636:                 and	server_id = server_id_in;
   637:                 return;
   638:             end loop;
   639: 
   640:             delete from rhnServerGroupMembers
   641:             where server_group_id = server_group_id_in
   642:             and	server_id = server_id_in;
   643: 
   644:             update rhnServerGroup
   645:             set current_members = current_members - 1
   646:             where id = server_group_id_in;
   647: 
   648: 		end if;
   649: 	end;
   650: 
   651: 	procedure delete_set_from_servergroup (
   652: 		server_group_id_in in number,
   653: 		user_id_in in number,
   654: 		set_label_in in varchar2
   655: 	) is
   656: 		cursor servergroups is
   657: 			select	sgm.server_id, sgm.server_group_id
   658: 			from	rhnSet st,
   659: 					rhnServerGroupMembers sgm
   660: 			where	sgm.server_group_id = server_group_id_in
   661: 				and st.user_id = user_id_in
   662: 				and st.label = set_label_in
   663: 				and sgm.server_id = st.element
   664: 				and exists (
   665: 					select	1
   666: 					from	rhnUserManagedServerGroups usgp
   667: 					where	usgp.server_group_id = server_group_id_in
   668: 						and usgp.user_id = user_id_in
   669: 				);
   670: 	begin
   671: 		for sgm in servergroups loop
   672: 			rhn_server.delete_from_servergroup(sgm.server_id, server_group_id_in);
   673: 		end loop;
   674: 	end delete_set_from_servergroup;
   675: 
   676: 	procedure clear_servergroup (
   677: 		server_group_id_in in number
   678: 	) is
   679: 		cursor servers is
   680: 			select	sgm.server_id	id
   681: 			from	rhnServerGroupMembers sgm
   682: 			where	sgm.server_group_id = server_group_id_in;
   683: 	begin
   684: 		for s in servers loop
   685: 			rhn_server.delete_from_servergroup(s.id, server_group_id_in);
   686: 		end loop;
   687: 	end clear_servergroup;
   688: 
   689: 	procedure delete_from_org_servergroups (
   690: 		server_id_in in number
   691: 	) is
   692: 		cursor servergroups is
   693: 			select	sgm.server_group_id id
   694: 			from	rhnServerGroup sg,
   695: 					rhnServerGroupMembers sgm
   696: 			where	sgm.server_id = server_id_in
   697: 				and sgm.server_group_id = sg.id
   698: 				and sg.group_type is null;
   699: 	begin
   700: 		for sg in servergroups loop
   701: 			rhn_server.delete_from_servergroup(server_id_in, sg.id);
   702: 		end loop;
   703: 	end delete_from_org_servergroups;
   704: 
   705: 	function get_ip_address (
   706: 		server_id_in in number
   707: 	) return varchar2 is
   708: 		cursor interfaces is
   709: 			select	name, ip_addr
   710: 			from	rhnServerNetInterface
   711: 			where	server_id = server_id_in
   712: 				and ip_addr != '127.0.0.1';
   713: 		cursor addresses is
   714: 			select	ipaddr ip_addr
   715: 			from	rhnServerNetwork
   716: 			where	server_id = server_id_in
   717: 				and ipaddr != '127.0.0.1';
   718: 	begin
   719: 		for addr in addresses loop
   720: 			return addr.ip_addr;
   721: 		end loop;
   722: 		for iface in interfaces loop
   723: 			return iface.ip_addr;
   724: 		end loop;
   725: 		return NULL;
   726: 	end get_ip_address;
   727: end rhn_server;