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