RHN_SERVER
DDL scriptPackage source
Legend: string keyword reserved word operator
1: package rhn_server
2: is
3:
4:
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: 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:
33:
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:
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:
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:
288:
289:
290:
291:
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:
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:
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:
390:
391:
392:
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:
406: vi.VIRTUAL_SYSTEM_ID = server_id_in
407:
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:
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:
448:
449:
450:
451:
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:
479:
480: select label
481: into group_label
482: from rhnServerGroupType sgt
483: where sgt.id = group_type;
484:
485:
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:
505:
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:
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:
632:
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;