cdca00d
diff --exclude-from=exclude -N -u -r nsapolicycoreutils/semanage/semanage policycoreutils-1.29.4/semanage/semanage
cdca00d
--- nsapolicycoreutils/semanage/semanage	2006-01-05 10:35:49.000000000 -0500
cdca00d
+++ policycoreutils-1.29.4/semanage/semanage	2006-01-05 16:27:42.000000000 -0500
cdca00d
@@ -20,15 +20,20 @@
cdca00d
 #                                        02111-1307  USA
cdca00d
 #
cdca00d
 #  
cdca00d
+
cdca00d
 import commands, sys, os, pwd, string, getopt, pwd
cdca00d
 from semanage import *;
cdca00d
-class loginRecords:
cdca00d
+class semanageRecords:
cdca00d
 	def __init__(self):
cdca00d
 		self.sh = semanage_handle_create()
cdca00d
 		self.semanaged = semanage_is_managed(self.sh)
cdca00d
 		if self.semanaged:
cdca00d
 			semanage_connect(self.sh)
f1e361e
 
cdca00d
+class loginRecords(semanageRecords):
cdca00d
+	def __init__(self):
cdca00d
+		semanageRecords.__init__(self)
cdca00d
+
cdca00d
 	def add(self, name, sename, serange):
cdca00d
 		if serange == "":
cdca00d
 			serange = "s0"
cdca00d
@@ -80,7 +85,7 @@
cdca00d
 		if sename != "":
f1e361e
 			semanage_seuser_set_sename(self.sh, u, sename)
f1e361e
 		semanage_begin_transaction(self.sh)
cdca00d
-		semanage_seuser_modify(self.sh, k, u)
cdca00d
+		semanage_seuser_modify_local(self.sh, k, u)
cdca00d
 		if semanage_commit(self.sh) < 0:
f1e361e
 			raise ValueError("Failed to modify SELinux user mapping")
4c35281
 
cdca00d
@@ -107,13 +112,9 @@
cdca00d
 			name = semanage_seuser_get_name(u)
cdca00d
 			print "%-25s %-25s %-25s" % (name, semanage_seuser_get_sename(u), semanage_seuser_get_mlsrange(u))
f1e361e
 
cdca00d
-class seluserRecords:
cdca00d
+class seluserRecords(semanageRecords):
cdca00d
 	def __init__(self):
cdca00d
-		roles = []
cdca00d
-		self.sh = semanage_handle_create()
cdca00d
-		self.semanaged = semanage_is_managed(self.sh)
cdca00d
-		if self.semanaged:
cdca00d
-			semanage_connect(self.sh)
cdca00d
+		semanageRecords.__init__(self)
f1e361e
 
cdca00d
 	def add(self, name, roles, selevel, serange):
cdca00d
 		if serange == "":
cdca00d
@@ -125,11 +126,9 @@
cdca00d
 		if rc < 0:
f1e361e
 			raise ValueError("Could not create a key for %s" % name)
4c35281
 
cdca00d
-		(rc,exists) = semanage_user_exists_local(self.sh, k)
cdca00d
+		(rc,exists) = semanage_user_exists(self.sh, k)
cdca00d
 		if not exists:
cdca00d
-			(rc,exists) = semanage_user_exists(self.sh, k)
cdca00d
-			if not exists:
cdca00d
-				raise ValueError("SELinux user %s is already defined." % name)
cdca00d
+			raise ValueError("SELinux user %s is already defined." % name)
f1e361e
 
f1e361e
 		(rc,u) = semanage_user_create(self.sh)
cdca00d
 		if rc < 0:
cdca00d
@@ -157,15 +156,11 @@
cdca00d
 		if rc < 0:
f1e361e
 			raise ValueError("Could not create a key for %s" % name)
f1e361e
 
cdca00d
-		(rc,exists) = semanage_user_exists_local(self.sh, k)
cdca00d
+		(rc,exists) = semanage_user_exists(self.sh, k)
cdca00d
 		if exists:
cdca00d
-			(rc,u) = semanage_user_query_local(self.sh, k)
cdca00d
+			(rc,u) = semanage_user_query(self.sh, k)
cdca00d
 		else:
cdca00d
-			(rc,exists) = semanage_user_exists(self.sh, k)
cdca00d
-			if exists:
cdca00d
-				(rc,u) = semanage_user_query(self.sh, k)
cdca00d
-			else:
cdca00d
-				raise ValueError("SELinux user %s mapping is not defined." % name)
cdca00d
+			raise ValueError("SELinux user %s mapping is not defined locally." % name)
cdca00d
 		if rc < 0:
f1e361e
 			raise ValueError("Could not query user for %s" % name)
f1e361e
 
cdca00d
@@ -185,10 +180,14 @@
f1e361e
 		(rc,k) = semanage_user_key_create(self.sh, name)
cdca00d
 		if rc < 0:
f1e361e
 			raise ValueError("Could not crpppeate a key for %s" % name)
cdca00d
-
cdca00d
-		(rc,exists) = semanage_user_exists_local(self.sh, k)
cdca00d
+		(rc,exists) = semanage_user_exists(self.sh, k)
cdca00d
 		if not exists:
4c35281
 			raise ValueError("user %s is not defined" % name)
cdca00d
+		else:
cdca00d
+			(rc,exists) = semanage_user_exists_local(self.sh, k)
cdca00d
+			if not exists:
cdca00d
+				raise ValueError("user %s is not defined locally, can not delete " % name)
cdca00d
+			
4c35281
 		semanage_begin_transaction(self.sh)
f1e361e
 		semanage_user_del_local(self.sh, k)
cdca00d
 		if semanage_commit(self.sh) < 0:
cdca00d
@@ -211,12 +210,9 @@
cdca00d
 					roles += " " + char_by_idx(rlist, ridx)
cdca00d
 			print "%-15s %-10s %-15s %s" % (semanage_user_get_name(u), semanage_user_get_mlslevel(u), semanage_user_get_mlsrange(u), roles)
cdca00d
 
cdca00d
-class portRecords:
cdca00d
+class portRecords(semanageRecords):
cdca00d
 	def __init__(self):
cdca00d
-		self.sh = semanage_handle_create()
cdca00d
-		self.semanaged = semanage_is_managed(self.sh)
cdca00d
-		if self.semanaged:
cdca00d
-			semanage_connect(self.sh)
cdca00d
+		semanageRecords.__init__(self)
cdca00d
 
cdca00d
 	def __genkey(self, port, proto):
cdca00d
 		if proto == "tcp":
cdca00d
@@ -236,7 +232,7 @@
cdca00d
 		else:
cdca00d
 			low=string.atoi(ports[0])
f1e361e
 			high=string.atoi(ports[1])
cdca00d
-			
cdca00d
+
f1e361e
 		(rc,k) = semanage_port_key_create(self.sh, low, high, proto_d)
cdca00d
 		if rc < 0:
f1e361e
 			raise ValueError("Could not create a key for %s/%s" % (proto, port))
cdca00d
@@ -255,10 +251,6 @@
cdca00d
 		if exists:
cdca00d
 			raise ValueError("Port %s/%s already defined" % (proto, port))
f1e361e
 
cdca00d
-		(rc,exists) = semanage_port_exists_local(self.sh, k)
cdca00d
-		if exists:
cdca00d
-			raise ValueError("Port %s/%s already defined locally" % (proto, port))
cdca00d
-
f1e361e
 		(rc,p) = semanage_port_create(self.sh)
cdca00d
 		if rc < 0:
f1e361e
 			raise ValueError("Could not create port for %s/%s" % (proto, port))
cdca00d
@@ -273,8 +265,8 @@
cdca00d
 		semanage_context_set_role(self.sh, con, "object_r")
cdca00d
 		semanage_context_set_type(self.sh, con, type)
cdca00d
 		semanage_context_set_mls(self.sh, con, serange)
cdca00d
-		semanage_port_set_con(p, con)
25eeaee
 		semanage_begin_transaction(self.sh)
cdca00d
+		semanage_port_set_con(p, con)
f1e361e
 		semanage_port_add_local(self.sh, k, p)
cdca00d
 		if semanage_commit(self.sh) < 0:
4c35281
 			raise ValueError("Failed to add port")
cdca00d
@@ -285,25 +277,23 @@
4c35281
 
cdca00d
 		( k, proto_d, low, high ) = self.__genkey(port, proto)
f1e361e
 
cdca00d
-		(rc,exists) = semanage_port_exists_local(self.sh, k)
cdca00d
+		(rc,exists) = semanage_port_exists(self.sh, k)
cdca00d
 		if exists:
cdca00d
-			(rc,p) = semanage_port_query_local(self.sh, k)
cdca00d
-			(rc,exists) = semanage_port_exists(self.sh, k)
cdca00d
-			if exists:
cdca00d
-				(rc,p) = semanage_port_query(self.sh, k)
cdca00d
-			else:
cdca00d
-				raise ValueError("port %s/%s is not defined." % (proto,port))
cdca00d
+			(rc,p) = semanage_port_query(self.sh, k)
cdca00d
+		else:
cdca00d
+			raise ValueError("port %s/%s is not defined." % (proto,port))
cdca00d
 
cdca00d
 		if rc < 0:
f1e361e
 			raise ValueError("Could not query port for %s/%s" % (proto, port))
f1e361e
 
f1e361e
 		con = semanage_port_get_con(p)
cdca00d
-		semanage_context_set_mls(self.sh, con, serange)	
cdca00d
+		if rc < 0:
cdca00d
+			raise ValueError("Could not get port context for %s/%s" % (proto, port))
cdca00d
+			
cdca00d
 		if serange != "":
cdca00d
 			semanage_context_set_mls(self.sh, con, serange)	
cdca00d
 		if setype != "":
cdca00d
 			semanage_context_set_type(self.sh, con, setype)
cdca00d
-		semanage_port_set_con(p, con)
25eeaee
 		semanage_begin_transaction(self.sh)
f1e361e
 		semanage_port_modify_local(self.sh, k, p)
cdca00d
 		if semanage_commit(self.sh) < 0:
cdca00d
@@ -311,9 +301,13 @@
4c35281
 		
f1e361e
 	def delete(self, port, proto):
cdca00d
 		( k, proto_d, low, high ) = self.__genkey(port, proto)
cdca00d
-		(rc,exists) = semanage_port_exists_local(self.sh, k)
cdca00d
+		(rc,exists) = semanage_port_exists(self.sh, k)
cdca00d
 		if not exists:
cdca00d
-			raise ValueError("port %s/%s is not defined localy." % (proto,port))
cdca00d
+			raise ValueError("port %s/%s is not defined." % (proto,port))
cdca00d
+		else:
cdca00d
+			(rc,exists) = semanage_port_exists_local(self.sh, k)
cdca00d
+			if not exists:
cdca00d
+				raise ValueError("port %s/%s is not defined localy, can not be deleted." % (proto,port))
4c35281
 
f1e361e
 		semanage_begin_transaction(self.sh)
f1e361e
 		semanage_port_del_local(self.sh, k)
cdca00d
@@ -338,27 +332,116 @@
cdca00d
 				dict[(name,proto)].append("%d" % low)
cdca00d
 			else:
cdca00d
 				dict[(name,proto)].append("%d-%d" % (low, high))
cdca00d
-		(status, self.plist, self.psize) = semanage_port_list_local(self.sh)
cdca00d
-		for idx in range(self.psize):
cdca00d
-			u = semanage_port_by_idx(self.plist, idx)
cdca00d
-			con = semanage_port_get_con(u)
cdca00d
-			name = semanage_context_get_type(con)
cdca00d
-			proto=semanage_port_get_proto_str(u)
cdca00d
-			low=semanage_port_get_low(u)
cdca00d
-			high = semanage_port_get_high(u)
cdca00d
-			if (name, proto) not in dict.keys():
cdca00d
-				dict[(name,proto)]=[]
cdca00d
-			if low == high:
cdca00d
-				dict[(name,proto)].append("%d" % low)
cdca00d
-			else:
cdca00d
-				dict[(name,proto)].append("%d-%d" % (low, high))
cdca00d
-		for i in dict.keys():
cdca00d
+		keys=dict.keys()
cdca00d
+		keys.sort()
cdca00d
+		for i in keys:
cdca00d
 			rec = "%-30s %-8s " % i
cdca00d
 			rec += "%s" % dict[i][0]
cdca00d
 			for p in dict[i][1:]:
cdca00d
 				rec += ", %s" % p
cdca00d
 			print rec
cdca00d
 			
cdca00d
+class interfaceRecords(semanageRecords):
cdca00d
+	def __init__(self):
cdca00d
+		semanageRecords.__init__(self)
cdca00d
+
cdca00d
+	def add(self, interface, serange, type):
cdca00d
+		if serange == "":
cdca00d
+			serange="s0"
cdca00d
+			
cdca00d
+		if type == "":
cdca00d
+			raise ValueError("Type is required")
cdca00d
+
cdca00d
+		(rc,k) = semanage_iface_key_create(self.sh, interface)
cdca00d
+		if rc < 0:
cdca00d
+			raise ValueError("Can't create key for %s" % interface)
cdca00d
+		(rc,exists) = semanage_iface_exists(self.sh, k)
cdca00d
+		if exists:
cdca00d
+			raise ValueError("Interface %s already defined" % interface)
cdca00d
+
cdca00d
+		(rc,iface) = semanage_iface_create(self.sh)
cdca00d
+		if rc < 0:
cdca00d
+			raise ValueError("Could not create interface for %s" % (interface))
cdca00d
+		
cdca00d
+		rc = semanage_iface_set_name(self.sh, iface, interface)
cdca00d
+		(rc, con) = semanage_context_create(self.sh)
cdca00d
+		if rc < 0:
cdca00d
+			raise ValueError("Could not create context for %s" % interface)
cdca00d
+
cdca00d
+		semanage_context_set_user(self.sh, con, "system_u")
cdca00d
+		semanage_context_set_role(self.sh, con, "object_r")
cdca00d
+		semanage_context_set_type(self.sh, con, type)
cdca00d
+		semanage_context_set_mls(self.sh, con, serange)
cdca00d
+		semanage_begin_transaction(self.sh)
cdca00d
+		semanage_iface_set_ifcon(iface, con)
cdca00d
+		semanage_iface_set_msgcon(iface, con)
cdca00d
+		semanage_iface_add_local(self.sh, k, iface)
cdca00d
+		if semanage_commit(self.sh) < 0:
cdca00d
+			raise ValueError("Failed to add interface")
cdca00d
+
cdca00d
+	def modify(self, interface, serange, setype):
cdca00d
+		if serange == "" and setype == "":
cdca00d
+			raise ValueError("Requires, setype or serange")
cdca00d
+
cdca00d
+		(rc,k) = semanage_iface_key_create(self.sh, interface)
cdca00d
+		if rc < 0:
cdca00d
+			raise ValueError("Can't creater key for %s" % interface)
cdca00d
+		(rc,exists) = semanage_iface_exists(self.sh, k)
cdca00d
+		if exists:
cdca00d
+			(rc,p) = semanage_iface_query(self.sh, k)
cdca00d
+		else:
cdca00d
+			raise ValueError("interface %s is not defined." % interface)
cdca00d
+
cdca00d
+		if rc < 0:
cdca00d
+			raise ValueError("Could not query interface for %s" % interface)
cdca00d
+
cdca00d
+		con = semanage_iface_get_ifcon(p)
cdca00d
+		if rc < 0:
cdca00d
+			raise ValueError("Could not get interface context for %s" % interface)
cdca00d
+			
cdca00d
+		if serange != "":
cdca00d
+			semanage_context_set_mls(self.sh, con, serange)	
cdca00d
+		if setype != "":
cdca00d
+			semanage_context_set_type(self.sh, con, setype)
cdca00d
+
cdca00d
+		semanage_begin_transaction(self.sh)
cdca00d
+		semanage_iface_modify_local(self.sh, k, p)
cdca00d
+		if semanage_commit(self.sh) < 0:
cdca00d
+			raise ValueError("Failed to add interface")
cdca00d
+		
cdca00d
+	def delete(self, interface):
cdca00d
+		(rc,k) = semanage_iface_key_create(self.sh, interface)
cdca00d
+		if rc < 0:
cdca00d
+			raise ValueError("Can't create key for %s" % interface)
cdca00d
+		(rc,exists) = semanage_iface_exists(self.sh, k)
cdca00d
+		if not exists:
cdca00d
+			raise ValueError("interface %s is not defined." % interface)
cdca00d
+		else:
cdca00d
+			(rc,exists) = semanage_iface_exists_local(self.sh, k)
cdca00d
+			if not exists:
cdca00d
+				raise ValueError("interface %s is not defined localy, can not be deleted." % interface)
cdca00d
+
cdca00d
+		semanage_begin_transaction(self.sh)
cdca00d
+		semanage_iface_del_local(self.sh, k)
f1e361e
+		if semanage_commit(self.sh) < 0:
cdca00d
+			raise ValueError("Interface %s not defined" % interface)
cdca00d
+		
cdca00d
+	def list(self, heading=1):
cdca00d
+		(status, self.plist, self.psize) = semanage_iface_list(self.sh)
cdca00d
+		if status < 0:
cdca00d
+			raise ValueError("Unable to list interfaces")
cdca00d
+			
cdca00d
+		if heading:
cdca00d
+			print "%-30s %s\n" % ("SELinux Interface", "Context")
cdca00d
+		dict={}
cdca00d
+		for idx in range(self.psize):
cdca00d
+			iface = semanage_iface_by_idx(self.plist, idx)
cdca00d
+			name = semanage_iface_get_name(iface)
cdca00d
+			con = semanage_iface_get_ifcon(iface)
cdca00d
+
cdca00d
+
cdca00d
+			print "%-30s %s:%s:%s:%s " % (name,semanage_context_get_user(con), semanage_context_get_role(con), semanage_context_get_type(con), semanage_context_get_mls(con))
cdca00d
+			
cdca00d
 if __name__ == '__main__':
cdca00d
 
cdca00d
 	def usage(message = ""):
cdca00d
@@ -366,6 +449,7 @@
cdca00d
 semanage user [-admsRrh] SELINUX_USER\n\
cdca00d
 semanage login [-admsrh] LOGIN_NAME\n\
cdca00d
 semanage port [-admth] PORT | PORTRANGE\n\
cdca00d
+semanage interface [-admth] INTERFACE\n\
cdca00d
 	-a, --add        Add a OBJECT record NAME\n\
cdca00d
 	-d, --delete     Delete a OBJECT record NAME\n\
cdca00d
 	-h, --help       display this message\n\
cdca00d
@@ -391,7 +475,7 @@
cdca00d
 	# 
cdca00d
 	#
cdca00d
 	try:
cdca00d
-		objectlist = ("login", "user", "port")
cdca00d
+		objectlist = ("login", "user", "port", "interface")
cdca00d
 		input = sys.stdin
cdca00d
 		output = sys.stdout
cdca00d
 		serange = ""
cdca00d
@@ -482,6 +566,9 @@
cdca00d
 		if object == "port":
cdca00d
 			OBJECT = portRecords()
4c35281
 		
cdca00d
+		if object == "interface":
cdca00d
+			OBJECT = interfaceRecords()
cdca00d
+		
cdca00d
 		if list:
cdca00d
 			OBJECT.list(heading)
cdca00d
 			sys.exit(0);
cdca00d
@@ -504,6 +591,9 @@
cdca00d
 			if object == "port":
cdca00d
 				OBJECT.add(target, proto, serange, setype)
cdca00d
 
cdca00d
+			if object == "interface":
cdca00d
+				OBJECT.add(target, serange, setype)
cdca00d
+
cdca00d
 			sys.exit(0);
cdca00d
 			
cdca00d
 		if modify:
cdca00d
@@ -516,7 +606,10 @@
cdca00d
 
cdca00d
 			if object == "port":
cdca00d
 				OBJECT.modify(target, proto, serange, setype)
cdca00d
-				sys.exit(0);
cdca00d
+
cdca00d
+			if object == "interface":
cdca00d
+				OBJECT.modify(target, serange, setype)
cdca00d
+
cdca00d
 			sys.exit(0);
cdca00d
 
cdca00d
 		if delete: