1#!/usr/bin/python3 2from __future__ import print_function 3 4import sys 5import getopt 6import semanage 7 8 9usage = "\ 10Choose one of the following tests:\n\ 11-m for modules\n\ 12-u for users\n\ 13-U for add user (warning this will write!)\n\ 14-s for seusers\n\ 15-S for add seuser (warning this will write!)\n\ 16-p for ports\n\ 17-P for add port (warning this will write!)\n\ 18-f for file contexts \n\ 19-F for add file context (warning this will write!)\n\ 20-i for network interfaces \n\ 21-I for add network interface (warning this will write!)\n\ 22-b for booleans \n\ 23-B for add boolean (warning this will write!)\n\ 24-c for aCtive booleans\n\ 25-C for set aCtive boolean (warning this will write!)\n\n\ 26-n for network nodes\n\ 27-N for add node (warning this will write!)\n\n\ 28Other options:\n\ 29-h for this help\n\ 30-v for verbose output\ 31" 32 33 34class Usage(Exception): 35 def __init__(self, msg): 36 Exception.__init__(self) 37 self.msg = msg 38 39 40class Status(Exception): 41 def __init__(self, msg): 42 Exception.__init__(self) 43 self.msg = msg 44 45 46class Error(Exception): 47 def __init__(self, msg): 48 Exception.__init__(self) 49 self.msg = msg 50 51 52class Tests: 53 def __init__(self): 54 self.all = False 55 self.users = False 56 self.writeuser = False 57 self.seusers = False 58 self.writeseuser = False 59 self.ports = False 60 self.writeport = False 61 self.fcontexts = False 62 self.writefcontext = False 63 self.interfaces = False 64 self.writeinterface = False 65 self.booleans = False 66 self.writeboolean = False 67 self.abooleans = False 68 self.writeaboolean = False 69 self.nodes = False 70 self.writenode = False 71 self.modules = False 72 self.verbose = False 73 74 def selected(self): 75 return ( 76 self.all or 77 self.users or 78 self.modules or 79 self.seusers or 80 self.ports or 81 self.fcontexts or 82 self.interfaces or 83 self.booleans or 84 self.abooleans or 85 self.writeuser or 86 self.writeseuser or 87 self.writeport or 88 self.writefcontext or 89 self.writeinterface or 90 self.writeboolean or 91 self.writeaboolean or 92 self.nodes or 93 self.writenode) 94 95 def run(self, handle): 96 if self.users or self.all: 97 self.test_users(handle) 98 print("") 99 if self.seusers or self.all: 100 self.test_seusers(handle) 101 print("") 102 if self.ports or self.all: 103 self.test_ports(handle) 104 print("") 105 if self.modules or self.all: 106 self.test_modules(handle) 107 print("") 108 if self.fcontexts or self.all: 109 self.test_fcontexts(handle) 110 print("") 111 if self.interfaces or self.all: 112 self.test_interfaces(handle) 113 print("") 114 if self.booleans or self.all: 115 self.test_booleans(handle) 116 print("") 117 if self.abooleans or self.all: 118 self.test_abooleans(handle) 119 print("") 120 if self.nodes or self.all: 121 self.test_nodes(handle) 122 print("") 123 if self.writeuser or self.all: 124 self.test_writeuser(handle) 125 print("") 126 if self.writeseuser or self.all: 127 self.test_writeseuser(handle) 128 print("") 129 if self.writeport or self.all: 130 self.test_writeport(handle) 131 print("") 132 if self.writefcontext or self.all: 133 self.test_writefcontext(handle) 134 print("") 135 if self.writeinterface or self.all: 136 self.test_writeinterface(handle) 137 print("") 138 if self.writeboolean or self.all: 139 self.test_writeboolean(handle) 140 print("") 141 if self.writeaboolean or self.all: 142 self.test_writeaboolean(handle) 143 print("") 144 if self.writenode or self.all: 145 self.test_writenode(handle) 146 print("") 147 148 def test_modules(self, sh): 149 print("Testing modules...") 150 151 (trans_cnt, mlist, mlist_size) = semanage.semanage_module_list(sh) 152 153 print("Transaction number: %s" % trans_cnt) 154 print("Module list size: %s" % mlist_size) 155 if self.verbose: 156 print("List reference: %s" % mlist) 157 158 if mlist_size == 0: 159 print("No modules installed!") 160 print("This is not necessarily a test failure.") 161 return 162 for idx in range(mlist_size): 163 module = semanage.semanage_module_list_nth(mlist, idx) 164 if self.verbose: 165 print("Module reference: %s" % module) 166 print("Module name: %s" % semanage.semanage_module_get_name(module)) 167 168 def test_seusers(self, sh): 169 print("Testing seusers...") 170 171 (status, slist) = semanage.semanage_seuser_list(sh) 172 if status < 0: 173 raise Error("Could not list seusers") 174 print("Query status (commit number): %s" % status) 175 176 if len(slist) == 0: 177 print("No seusers found!") 178 print("This is not necessarily a test failure.") 179 return 180 for seuser in slist: 181 if self.verbose: 182 print("seseuser reference: %s" % seuser) 183 print("seuser name: %s" % semanage.semanage_seuser_get_name(seuser)) 184 print(" seuser mls range: %s" % semanage.semanage_seuser_get_mlsrange(seuser)) 185 print(" seuser sename: %s" % semanage.semanage_seuser_get_sename(seuser)) 186 semanage.semanage_seuser_free(seuser) 187 188 def test_users(self, sh): 189 print("Testing users...") 190 191 (status, ulist) = semanage.semanage_user_list(sh) 192 if status < 0: 193 raise Error("Could not list users") 194 print("Query status (commit number): %s" % status) 195 196 if len(ulist) == 0: 197 print("No users found!") 198 print("This is not necessarily a test failure.") 199 return 200 for user in ulist: 201 if self.verbose: 202 print("User reference: %s" % user) 203 print("User name: %s" % semanage.semanage_user_get_name(user)) 204 print(" User labeling prefix: %s" % semanage.semanage_user_get_prefix(user)) 205 print(" User mls level: %s" % semanage.semanage_user_get_mlslevel(user)) 206 print(" User mls range: %s" % semanage.semanage_user_get_mlsrange(user)) 207 print(" User number of roles: %s" % semanage.semanage_user_get_num_roles(user)) 208 print(" User roles: ") 209 (status, rlist) = semanage.semanage_user_get_roles(sh, user) 210 if status < 0: 211 raise Error("Could not get user roles") 212 213 for role in rlist: 214 print(" %s" % role) 215 216 semanage.semanage_user_free(user) 217 218 def test_ports(self, sh): 219 print("Testing ports...") 220 221 (status, plist) = semanage.semanage_port_list(sh) 222 if status < 0: 223 raise Error("Could not list ports") 224 print("Query status (commit number): %s" % status) 225 226 if len(plist) == 0: 227 print("No ports found!") 228 print("This is not necessarily a test failure.") 229 return 230 for port in plist: 231 if self.verbose: 232 print("Port reference: %s" % port) 233 low = semanage.semanage_port_get_low(port) 234 high = semanage.semanage_port_get_high(port) 235 con = semanage.semanage_port_get_con(port) 236 proto = semanage.semanage_port_get_proto(port) 237 proto_str = semanage.semanage_port_get_proto_str(proto) 238 if low == high: 239 range_str = str(low) 240 else: 241 range_str = str(low) + "-" + str(high) 242 (rc, con_str) = semanage.semanage_context_to_string(sh, con) 243 if rc < 0: 244 con_str = "" 245 print("Port: %s %s Context: %s" % (range_str, proto_str, con_str)) 246 semanage.semanage_port_free(port) 247 248 def test_fcontexts(self, sh): 249 print("Testing file contexts...") 250 251 (status, flist) = semanage.semanage_fcontext_list(sh) 252 if status < 0: 253 raise Error("Could not list file contexts") 254 print("Query status (commit number): %s" % status) 255 256 if len(flist) == 0: 257 print("No file contexts found!") 258 print("This is not necessarily a test failure.") 259 return 260 for fcon in flist: 261 if self.verbose: 262 print("File Context reference: %s" % fcon) 263 expr = semanage.semanage_fcontext_get_expr(fcon) 264 type = semanage.semanage_fcontext_get_type(fcon) 265 type_str = semanage.semanage_fcontext_get_type_str(type) 266 con = semanage.semanage_fcontext_get_con(fcon) 267 if not con: 268 con_str = "<<none>>" 269 else: 270 (rc, con_str) = semanage.semanage_context_to_string(sh, con) 271 if rc < 0: 272 con_str = "" 273 print("File Expr: %s [%s] Context: %s" % (expr, type_str, con_str)) 274 semanage.semanage_fcontext_free(fcon) 275 276 def test_interfaces(self, sh): 277 print("Testing network interfaces...") 278 279 (status, ilist) = semanage.semanage_iface_list(sh) 280 if status < 0: 281 raise Error("Could not list interfaces") 282 print("Query status (commit number): %s" % status) 283 284 if len(ilist) == 0: 285 print("No network interfaces found!") 286 print("This is not necessarily a test failure.") 287 return 288 for iface in ilist: 289 if self.verbose: 290 print("Interface reference: %s" % iface) 291 name = semanage.semanage_iface_get_name(iface) 292 msg_con = semanage.semanage_iface_get_msgcon(iface) 293 if_con = semanage.semanage_iface_get_ifcon(iface) 294 (rc, msg_con_str) = semanage.semanage_context_to_string(sh, msg_con) 295 if rc < 0: 296 msg_con_str = "" 297 (rc, if_con_str) = semanage.semanage_context_to_string(sh, if_con) 298 if rc < 0: 299 if_con_str = "" 300 print("Interface: %s Context: %s Message Context: %s" % (name, if_con_str, msg_con_str)) 301 semanage.semanage_iface_free(iface) 302 303 def test_booleans(self, sh): 304 print("Testing booleans...") 305 306 (status, blist) = semanage.semanage_bool_list(sh) 307 if status < 0: 308 raise Error("Could not list booleans") 309 print("Query status (commit number): %s" % status) 310 311 if len(blist) == 0: 312 print("No booleans found!") 313 print("This is not necessarily a test failure.") 314 return 315 for pbool in blist: 316 if self.verbose: 317 print("Boolean reference: %s" % pbool) 318 name = semanage.semanage_bool_get_name(pbool) 319 value = semanage.semanage_bool_get_value(pbool) 320 print("Boolean: %s Value: %s" % (name, value)) 321 semanage.semanage_bool_free(pbool) 322 323 def test_abooleans(self, sh): 324 print("Testing active booleans...") 325 326 (status, ablist) = semanage.semanage_bool_list_active(sh) 327 if status < 0: 328 raise Error("Could not list active booleans") 329 print("Query status (commit number): %s" % status) 330 331 if len(ablist) == 0: 332 print("No active booleans found!") 333 print("This is not necessarily a test failure.") 334 return 335 for abool in ablist: 336 if self.verbose: 337 print("Active boolean reference: %s" % abool) 338 name = semanage.semanage_bool_get_name(abool) 339 value = semanage.semanage_bool_get_value(abool) 340 print("Active Boolean: %s Value: %s" % (name, value)) 341 semanage.semanage_bool_free(abool) 342 343 def test_nodes(self, sh): 344 print("Testing network nodes...") 345 346 (status, nlist) = semanage.semanage_node_list(sh) 347 if status < 0: 348 raise Error("Could not list network nodes") 349 print("Query status (commit number): %s" % status) 350 351 if len(nlist) == 0: 352 print("No network nodes found!") 353 print("This is not necessarily a test failure.") 354 return 355 for node in nlist: 356 if self.verbose: 357 print("Network node reference: %s" % node) 358 359 (status, addr) = semanage.semanage_node_get_addr(sh, node) 360 if status < 0: 361 addr = "" 362 363 (status, mask) = semanage.semanage_node_get_mask(sh, node) 364 if status < 0: 365 mask = "" 366 367 proto = semanage.semanage_node_get_proto(node) 368 proto_str = semanage.semanage_node_get_proto_str(proto) 369 con = semanage.semanage_node_get_con(node) 370 371 (status, con_str) = semanage.semanage_context_to_string(sh, con) 372 if status < 0: 373 con_str = "" 374 375 print("Network Node: %s/%s (%s) Context: %s" % (addr, mask, proto_str, con_str)) 376 semanage.semanage_node_free(node) 377 378 def test_writeuser(self, sh): 379 print("Testing user write...") 380 381 (status, user) = semanage.semanage_user_create(sh) 382 if status < 0: 383 raise Error("Could not create user object") 384 if self.verbose: 385 print("User object created") 386 387 status = semanage.semanage_user_set_name(sh, user, "testPyUser") 388 if status < 0: 389 raise Error("Could not set user name") 390 if self.verbose: 391 print("User name set: %s" % semanage.semanage_user_get_name(user)) 392 393 status = semanage.semanage_user_add_role(sh, user, "user_r") 394 if status < 0: 395 raise Error("Could not add role") 396 397 status = semanage.semanage_user_set_prefix(sh, user, "user") 398 if status < 0: 399 raise Error("Could not set labeling prefix") 400 if self.verbose: 401 print("User prefix set: %s" % semanage.semanage_user_get_prefix(user)) 402 403 status = semanage.semanage_user_set_mlsrange(sh, user, "s0") 404 if status < 0: 405 raise Error("Could not set MLS range") 406 if self.verbose: 407 print("User mlsrange: %s" % semanage.semanage_user_get_mlsrange(user)) 408 409 status = semanage.semanage_user_set_mlslevel(sh, user, "s0") 410 if status < 0: 411 raise Error("Could not set MLS level") 412 if self.verbose: 413 print("User mlslevel: %s" % semanage.semanage_user_get_mlslevel(user)) 414 415 (status, key) = semanage.semanage_user_key_extract(sh, user) 416 if status < 0: 417 raise Error("Could not extract user key") 418 if self.verbose: 419 print("User key extracted: %s" % key) 420 421 (status, exists) = semanage.semanage_user_exists_local(sh, key) 422 if status < 0: 423 raise Error("Could not check if user exists") 424 if self.verbose: 425 print("Exists status (commit number): %s" % status) 426 427 if exists: 428 (status, old_user) = semanage.semanage_user_query_local(sh, key) 429 if status < 0: 430 raise Error("Could not query old user") 431 if self.verbose: 432 print("Query status (commit number): %s" % status) 433 434 print("Starting transaction..") 435 status = semanage.semanage_begin_transaction(sh) 436 if status < 0: 437 raise Error("Could not start semanage transaction") 438 439 status = semanage.semanage_user_modify_local(sh, key, user) 440 if status < 0: 441 raise Error("Could not modify user") 442 443 status = semanage.semanage_commit(sh) 444 if status < 0: 445 raise Error("Could not commit test transaction") 446 print("Commit status (transaction number): %s" % status) 447 448 status = semanage.semanage_begin_transaction(sh) 449 if status < 0: 450 raise Error("Could not start semanage transaction") 451 452 if not exists: 453 print("Removing user...") 454 status = semanage.semanage_user_del_local(sh, key) 455 if status < 0: 456 raise Error("Could not delete test user") 457 if self.verbose: 458 print("User delete: %s" % status) 459 else: 460 print("Resetting user...") 461 status = semanage.semanage_user_modify_local(sh, key, old_user) 462 if status < 0: 463 raise Error("Could not reset test user") 464 if self.verbose: 465 print("User modify: %s" % status) 466 467 status = semanage.semanage_commit(sh) 468 if status < 0: 469 raise Error("Could not commit reset transaction") 470 print("Commit status (transaction number): %s" % status) 471 472 semanage.semanage_user_key_free(key) 473 semanage.semanage_user_free(user) 474 if exists: 475 semanage.semanage_user_free(old_user) 476 477 def test_writeseuser(self, sh): 478 print("Testing seuser write...") 479 480 (status, seuser) = semanage.semanage_seuser_create(sh) 481 if status < 0: 482 raise Error("Could not create SEUser object") 483 if self.verbose: 484 print("SEUser object created.") 485 486 status = semanage.semanage_seuser_set_name(sh, seuser, "testPySEUser") 487 if status < 0: 488 raise Error("Could not set name") 489 if self.verbose: 490 print("SEUser name set: %s" % semanage.semanage_seuser_get_name(seuser)) 491 492 status = semanage.semanage_seuser_set_sename(sh, seuser, "root") 493 if status < 0: 494 raise Error("Could not set sename") 495 if self.verbose: 496 print("SEUser seuser: %s" % semanage.semanage_seuser_get_sename(seuser)) 497 498 status = semanage.semanage_seuser_set_mlsrange(sh, seuser, "s0:c0.c255") 499 if status < 0: 500 raise Error("Could not set MLS range") 501 if self.verbose: 502 print("SEUser mlsrange: %s" % semanage.semanage_seuser_get_mlsrange(seuser)) 503 504 (status, key) = semanage.semanage_seuser_key_extract(sh, seuser) 505 if status < 0: 506 raise Error("Could not extract SEUser key") 507 if self.verbose: 508 print("SEUser key extracted: %s" % key) 509 510 (status, exists) = semanage.semanage_seuser_exists_local(sh, key) 511 if status < 0: 512 raise Error("Could not check if SEUser exists") 513 if self.verbose: 514 print("Exists status (commit number): %s" % status) 515 516 if exists: 517 (status, old_seuser) = semanage.semanage_seuser_query_local(sh, key) 518 if status < 0: 519 raise Error("Could not query old SEUser") 520 if self.verbose: 521 print("Query status (commit number): %s" % status) 522 523 print("Starting transaction...") 524 status = semanage.semanage_begin_transaction(sh) 525 if status < 0: 526 raise Error("Could not start semanage transaction") 527 528 status = semanage.semanage_seuser_modify_local(sh, key, seuser) 529 if status < 0: 530 raise Error("Could not modify SEUser") 531 532 status = semanage.semanage_commit(sh) 533 if status < 0: 534 raise Error("Could not commit test transaction") 535 print("Commit status (transaction number): %s" % status) 536 537 status = semanage.semanage_begin_transaction(sh) 538 if status < 0: 539 raise Error("Could not start semanage transaction") 540 541 if not exists: 542 print("Removing seuser...") 543 status = semanage.semanage_seuser_del_local(sh, key) 544 if status < 0: 545 raise Error("Could not delete test SEUser") 546 if self.verbose: 547 print("Seuser delete: %s" % status) 548 else: 549 print("Resetting seuser...") 550 status = semanage.semanage_seuser_modify_local(sh, key, old_seuser) 551 if status < 0: 552 raise Error("Could not reset test SEUser") 553 if self.verbose: 554 print("Seuser modify: %s" % status) 555 556 status = semanage.semanage_commit(sh) 557 if status < 0: 558 raise Error("Could not commit reset transaction") 559 print("Commit status (transaction number): %s" % status) 560 561 semanage.semanage_seuser_key_free(key) 562 semanage.semanage_seuser_free(seuser) 563 if exists: 564 semanage.semanage_seuser_free(old_seuser) 565 566 def test_writeport(self, sh): 567 print("Testing port write...") 568 569 (status, port) = semanage.semanage_port_create(sh) 570 if status < 0: 571 raise Error("Could not create SEPort object") 572 if self.verbose: 573 print("SEPort object created.") 574 575 semanage.semanage_port_set_range(port, 150, 200) 576 low = semanage.semanage_port_get_low(port) 577 high = semanage.semanage_port_get_high(port) 578 if self.verbose: 579 print("SEPort range set: %s-%s" % (low, high)) 580 581 semanage.semanage_port_set_proto(port, semanage.SEMANAGE_PROTO_TCP) 582 if self.verbose: 583 print("SEPort protocol set: %s" % semanage.semanage_port_get_proto_str(semanage.SEMANAGE_PROTO_TCP)) 584 585 (status, con) = semanage.semanage_context_create(sh) 586 if status < 0: 587 raise Error("Could not create SEContext object") 588 if self.verbose: 589 print("SEContext object created (for port).") 590 591 status = semanage.semanage_context_set_user(sh, con, "system_u") 592 if status < 0: 593 raise Error("Could not set context user") 594 if self.verbose: 595 print("SEContext user: %s" % semanage.semanage_context_get_user(con)) 596 597 status = semanage.semanage_context_set_role(sh, con, "object_r") 598 if status < 0: 599 raise Error("Could not set context role") 600 if self.verbose: 601 print("SEContext role: %s" % semanage.semanage_context_get_role(con)) 602 603 status = semanage.semanage_context_set_type(sh, con, "http_port_t") 604 if status < 0: 605 raise Error("Could not set context type") 606 if self.verbose: 607 print("SEContext type: %s" % semanage.semanage_context_get_type(con)) 608 609 status = semanage.semanage_context_set_mls(sh, con, "s0:c0.c255") 610 if status < 0: 611 raise Error("Could not set context MLS fields") 612 if self.verbose: 613 print("SEContext mls: %s" % semanage.semanage_context_get_mls(con)) 614 615 status = semanage.semanage_port_set_con(sh, port, con) 616 if status < 0: 617 raise Error("Could not set SEPort context") 618 if self.verbose: 619 print("SEPort context set: %s" % con) 620 621 (status, key) = semanage.semanage_port_key_extract(sh, port) 622 if status < 0: 623 raise Error("Could not extract SEPort key") 624 if self.verbose: 625 print("SEPort key extracted: %s" % key) 626 627 (status, exists) = semanage.semanage_port_exists_local(sh, key) 628 if status < 0: 629 raise Error("Could not check if SEPort exists") 630 if self.verbose: 631 print("Exists status (commit number): %s" % status) 632 633 if exists: 634 (status, old_port) = semanage.semanage_port_query_local(sh, key) 635 if status < 0: 636 raise Error("Could not query old SEPort") 637 if self.verbose: 638 print("Query status (commit number): %s" % status) 639 640 print("Starting transaction...") 641 status = semanage.semanage_begin_transaction(sh) 642 if status < 0: 643 raise Error("Could not start semanage transaction") 644 645 status = semanage.semanage_port_modify_local(sh, key, port) 646 if status < 0: 647 raise Error("Could not modify SEPort") 648 649 status = semanage.semanage_commit(sh) 650 if status < 0: 651 raise Error("Could not commit test transaction") 652 print("Commit status (transaction number): %s" % status) 653 654 status = semanage.semanage_begin_transaction(sh) 655 if status < 0: 656 raise Error("Could not start semanage transaction") 657 658 if not exists: 659 print("Removing port range...") 660 status = semanage.semanage_port_del_local(sh, key) 661 if status < 0: 662 raise Error("Could not delete test SEPort") 663 if self.verbose: 664 print("Port range delete: %s" % status) 665 else: 666 print("Resetting port range...") 667 status = semanage.semanage_port_modify_local(sh, key, old_port) 668 if status < 0: 669 raise Error("Could not reset test SEPort") 670 if self.verbose: 671 print("Port range modify: %s" % status) 672 673 status = semanage.semanage_commit(sh) 674 if status < 0: 675 raise Error("Could not commit reset transaction") 676 print("Commit status (transaction number): %s" % status) 677 678 semanage.semanage_context_free(con) 679 semanage.semanage_port_key_free(key) 680 semanage.semanage_port_free(port) 681 if exists: 682 semanage.semanage_port_free(old_port) 683 684 def test_writefcontext(self, sh): 685 print("Testing file context write...") 686 687 (status, fcon) = semanage.semanage_fcontext_create(sh) 688 if status < 0: 689 raise Error("Could not create SEFcontext object") 690 if self.verbose: 691 print("SEFcontext object created.") 692 693 status = semanage.semanage_fcontext_set_expr(sh, fcon, "/test/fcontext(/.*)?") 694 if status < 0: 695 raise Error("Could not set expression") 696 if self.verbose: 697 print("SEFContext expr set: %s" % semanage.semanage_fcontext_get_expr(fcon)) 698 699 semanage.semanage_fcontext_set_type(fcon, semanage.SEMANAGE_FCONTEXT_REG) 700 if self.verbose: 701 ftype = semanage.semanage_fcontext_get_type(fcon) 702 print("SEFContext type set: %s" % semanage.semanage_fcontext_get_type_str(ftype)) 703 704 (status, con) = semanage.semanage_context_create(sh) 705 if status < 0: 706 raise Error("Could not create SEContext object") 707 if self.verbose: 708 print("SEContext object created (for file context).") 709 710 status = semanage.semanage_context_set_user(sh, con, "system_u") 711 if status < 0: 712 raise Error("Could not set context user") 713 if self.verbose: 714 print("SEContext user: %s" % semanage.semanage_context_get_user(con)) 715 716 status = semanage.semanage_context_set_role(sh, con, "object_r") 717 if status < 0: 718 raise Error("Could not set context role") 719 if self.verbose: 720 print("SEContext role: %s" % semanage.semanage_context_get_role(con)) 721 722 status = semanage.semanage_context_set_type(sh, con, "default_t") 723 if status < 0: 724 raise Error("Could not set context type") 725 if self.verbose: 726 print("SEContext type: %s" % semanage.semanage_context_get_type(con)) 727 728 status = semanage.semanage_context_set_mls(sh, con, "s0:c0.c255") 729 if status < 0: 730 raise Error("Could not set context MLS fields") 731 if self.verbose: 732 print("SEContext mls: %s" % semanage.semanage_context_get_mls(con)) 733 734 status = semanage.semanage_fcontext_set_con(sh, fcon, con) 735 if status < 0: 736 raise Error("Could not set SEFcontext context") 737 if self.verbose: 738 print("SEFcontext context set: %s" % con) 739 740 (status, key) = semanage.semanage_fcontext_key_extract(sh, fcon) 741 if status < 0: 742 raise Error("Could not extract SEFcontext key") 743 if self.verbose: 744 print("SEFcontext key extracted: %s" % key) 745 746 (status, exists) = semanage.semanage_fcontext_exists_local(sh, key) 747 if status < 0: 748 raise Error("Could not check if SEFcontext exists") 749 750 if self.verbose: 751 print("Exists status (commit number): %s" % status) 752 if exists: 753 (status, old_fcontext) = semanage.semanage_fcontext_query_local(sh, key) 754 if status < 0: 755 raise Error("Could not query old SEFcontext") 756 if self.verbose: 757 print("Query status (commit number): %s" % status) 758 759 print("Starting transaction...") 760 status = semanage.semanage_begin_transaction(sh) 761 if status < 0: 762 raise Error("Could not start semanage transaction") 763 764 status = semanage.semanage_fcontext_modify_local(sh, key, fcon) 765 if status < 0: 766 raise Error("Could not modify SEFcontext") 767 768 status = semanage.semanage_commit(sh) 769 if status < 0: 770 raise Error("Could not commit test transaction") 771 print("Commit status (transaction number): %s" % status) 772 773 status = semanage.semanage_begin_transaction(sh) 774 if status < 0: 775 raise Error("Could not start semanage transaction") 776 777 if not exists: 778 print("Removing file context...") 779 status = semanage.semanage_fcontext_del_local(sh, key) 780 if status < 0: 781 raise Error("Could not delete test SEFcontext") 782 if self.verbose: 783 print("File context delete: %s" % status) 784 else: 785 print("Resetting file context...") 786 status = semanage.semanage_fcontext_modify_local(sh, key, old_fcontext) 787 if status < 0: 788 raise Error("Could not reset test FContext") 789 if self.verbose: 790 print("File context modify: %s" % status) 791 792 status = semanage.semanage_commit(sh) 793 if status < 0: 794 raise Error("Could not commit reset transaction") 795 print("Commit status (transaction number): %s" % status) 796 797 semanage.semanage_context_free(con) 798 semanage.semanage_fcontext_key_free(key) 799 semanage.semanage_fcontext_free(fcon) 800 if exists: 801 semanage.semanage_fcontext_free(old_fcontext) 802 803 def test_writeinterface(self, sh): 804 print("Testing network interface write...") 805 806 (status, iface) = semanage.semanage_iface_create(sh) 807 if status < 0: 808 raise Error("Could not create SEIface object") 809 if self.verbose: 810 print("SEIface object created.") 811 812 status = semanage.semanage_iface_set_name(sh, iface, "test_iface") 813 if status < 0: 814 raise Error("Could not set SEIface name") 815 if self.verbose: 816 print("SEIface name set: %s" % semanage.semanage_iface_get_name(iface)) 817 818 (status, con) = semanage.semanage_context_create(sh) 819 if status < 0: 820 raise Error("Could not create SEContext object") 821 if self.verbose: 822 print("SEContext object created (for network interface)") 823 824 status = semanage.semanage_context_set_user(sh, con, "system_u") 825 if status < 0: 826 raise Error("Could not set interface context user") 827 if self.verbose: 828 print("SEContext user: %s" % semanage.semanage_context_get_user(con)) 829 830 status = semanage.semanage_context_set_role(sh, con, "object_r") 831 if status < 0: 832 raise Error("Could not set interface context role") 833 if self.verbose: 834 print("SEContext role: %s" % semanage.semanage_context_get_role(con)) 835 836 status = semanage.semanage_context_set_type(sh, con, "default_t") 837 if status < 0: 838 raise Error("Could not set interface context type") 839 if self.verbose: 840 print("SEContext type: %s" % semanage.semanage_context_get_type(con)) 841 842 status = semanage.semanage_context_set_mls(sh, con, "s0:c0.c255") 843 if status < 0: 844 raise Error("Could not set interface context MLS fields") 845 if self.verbose: 846 print("SEContext mls: %s" % semanage.semanage_context_get_mls(con)) 847 848 status = semanage.semanage_iface_set_ifcon(sh, iface, con) 849 if status < 0: 850 raise Error("Could not set SEIface interface context") 851 if self.verbose: 852 print("SEIface interface context set: %s" % con) 853 854 status = semanage.semanage_iface_set_msgcon(sh, iface, con) 855 if status < 0: 856 raise Error("Could not set SEIface message context") 857 if self.verbose: 858 print("SEIface message context set: %s" % con) 859 860 (status, key) = semanage.semanage_iface_key_extract(sh, iface) 861 if status < 0: 862 raise Error("Could not extract SEIface key") 863 if self.verbose: 864 print("SEIface key extracted: %s" % key) 865 866 (status, exists) = semanage.semanage_iface_exists_local(sh, key) 867 if status < 0: 868 raise Error("Could not check if SEIface exists") 869 if self.verbose: 870 print("Exists status (commit number): %s" % status) 871 872 if exists: 873 (status, old_iface) = semanage.semanage_iface_query_local(sh, key) 874 if status < 0: 875 raise Error("Could not query old SEIface") 876 if self.verbose: 877 print("Query status (commit number): %s" % status) 878 879 print("Starting transaction...") 880 status = semanage.semanage_begin_transaction(sh) 881 if status < 0: 882 raise Error("Could not begin semanage transaction") 883 884 status = semanage.semanage_iface_modify_local(sh, key, iface) 885 if status < 0: 886 raise Error("Could not modify SEIface") 887 888 status = semanage.semanage_commit(sh) 889 if status < 0: 890 raise Error("Could not commit test transaction") 891 print("Commit status (transaction number): %s" % status) 892 893 status = semanage.semanage_begin_transaction(sh) 894 if status < 0: 895 raise Error("Could not begin semanage transaction") 896 897 if not exists: 898 print("Removing interface...") 899 status = semanage.semanage_iface_del_local(sh, key) 900 if status < 0: 901 raise Error("Could not delete test SEIface") 902 if self.verbose: 903 print("Interface delete: %s" % status) 904 else: 905 print("Resetting interface...") 906 status = semanage.semanage_iface_modify_local(sh, key, old_iface) 907 if status < 0: 908 raise Error("Could not reset test SEIface") 909 if self.verbose: 910 print("Interface modify: %s" % status) 911 912 status = semanage.semanage_commit(sh) 913 if status < 0: 914 raise Error("Could not commit reset transaction") 915 print("Commit status (transaction number): %s" % status) 916 917 semanage.semanage_context_free(con) 918 semanage.semanage_iface_key_free(key) 919 semanage.semanage_iface_free(iface) 920 if exists: 921 semanage.semanage_iface_free(old_iface) 922 923 def test_writeboolean(self, sh): 924 print("Testing boolean write...") 925 926 (status, pbool) = semanage.semanage_bool_create(sh) 927 if status < 0: 928 raise Error("Could not create SEBool object") 929 if self.verbose: 930 print("SEBool object created.") 931 932 status = semanage.semanage_bool_set_name(sh, pbool, "allow_execmem") 933 if status < 0: 934 raise Error("Could not set name") 935 if self.verbose: 936 print("SEBool name set: %s" % semanage.semanage_bool_get_name(pbool)) 937 938 semanage.semanage_bool_set_value(pbool, 0) 939 if self.verbose: 940 print("SEbool value set: %s" % semanage.semanage_bool_get_value(pbool)) 941 942 (status, key) = semanage.semanage_bool_key_extract(sh, pbool) 943 if status < 0: 944 raise Error("Could not extract SEBool key") 945 if self.verbose: 946 print("SEBool key extracted: %s" % key) 947 948 (status, exists) = semanage.semanage_bool_exists_local(sh, key) 949 if status < 0: 950 raise Error("Could not check if SEBool exists") 951 if self.verbose: 952 print("Exists status (commit number): %s" % status) 953 954 if exists: 955 (status, old_bool) = semanage.semanage_bool_query_local(sh, key) 956 if status < 0: 957 raise Error("Could not query old SEBool") 958 if self.verbose: 959 print("Query status (commit number): %s" % status) 960 961 print("Starting transaction...") 962 status = semanage.semanage_begin_transaction(sh) 963 if status < 0: 964 raise Error("Could not start semanage transaction") 965 966 status = semanage.semanage_bool_modify_local(sh, key, pbool) 967 968 if status < 0: 969 raise Error("Could not modify SEBool") 970 971 status = semanage.semanage_commit(sh) 972 if status < 0: 973 raise Error("Could not commit test transaction") 974 print("Commit status (transaction number): %s" % status) 975 976 status = semanage.semanage_begin_transaction(sh) 977 if status < 0: 978 raise Error("Could not start semanage transaction") 979 980 if not exists: 981 print("Removing boolean...") 982 status = semanage.semanage_bool_del_local(sh, key) 983 if status < 0: 984 raise Error("Could not delete test SEBool") 985 if self.verbose: 986 print("Boolean delete: %s" % status) 987 else: 988 print("Resetting boolean...") 989 status = semanage.semanage_bool_modify_local(sh, key, old_bool) 990 if status < 0: 991 raise Error("Could not reset test SEBool") 992 if self.verbose: 993 print("Boolean modify: %s" % status) 994 995 status = semanage.semanage_commit(sh) 996 if status < 0: 997 raise Error("Could not commit reset transaction") 998 print("Commit status (transaction number): %s" % status) 999 1000 semanage.semanage_bool_key_free(key) 1001 semanage.semanage_bool_free(pbool) 1002 if exists: 1003 semanage.semanage_bool_free(old_bool) 1004 1005 def test_writeaboolean(self, sh): 1006 print("Testing active boolean write...") 1007 1008 (status, key) = semanage.semanage_bool_key_create(sh, "allow_execmem") 1009 if status < 0: 1010 raise Error("Could not create SEBool key") 1011 if self.verbose: 1012 print("SEBool key created: %s" % key) 1013 1014 (status, old_bool) = semanage.semanage_bool_query_active(sh, key) 1015 if status < 0: 1016 raise Error("Could not query old SEBool") 1017 if self.verbose: 1018 print("Query status (commit number): %s" % status) 1019 1020 (status, abool) = semanage.semanage_bool_create(sh) 1021 if status < 0: 1022 raise Error("Could not create SEBool object") 1023 if self.verbose: 1024 print("SEBool object created.") 1025 1026 status = semanage.semanage_bool_set_name(sh, abool, "allow_execmem") 1027 if status < 0: 1028 raise Error("Could not set name") 1029 if self.verbose: 1030 print("SEBool name set: %s" % semanage.semanage_bool_get_name(abool)) 1031 1032 semanage.semanage_bool_set_value(abool, 0) 1033 if self.verbose: 1034 print("SEbool value set: %s" % semanage.semanage_bool_get_value(abool)) 1035 1036 print("Starting transaction...") 1037 status = semanage.semanage_begin_transaction(sh) 1038 if status < 0: 1039 raise Error("Could not start semanage transaction") 1040 1041 status = semanage.semanage_bool_set_active(sh, key, abool) 1042 if status < 0: 1043 raise Error("Could not modify SEBool") 1044 1045 status = semanage.semanage_commit(sh) 1046 if status < 0: 1047 raise Error("Could not commit test transaction") 1048 print("Commit status (transaction number): %s" % status) 1049 1050 print("Resetting old active boolean...") 1051 status = semanage.semanage_begin_transaction(sh) 1052 if status < 0: 1053 raise Error("Could not start semanage transaction") 1054 1055 status = semanage.semanage_bool_set_active(sh, key, old_bool) 1056 if status < 0: 1057 raise Error("Could not reset test SEBool") 1058 if self.verbose: 1059 print("SEBool active reset: %s" % status) 1060 1061 status = semanage.semanage_commit(sh) 1062 if status < 0: 1063 raise Error("Could not commit reset transaction") 1064 print("Commit status (transaction number): %s" % status) 1065 1066 semanage.semanage_bool_key_free(key) 1067 semanage.semanage_bool_free(abool) 1068 semanage.semanage_bool_free(old_bool) 1069 1070 def test_writenode(self, sh): 1071 print("Testing network node write...") 1072 1073 (status, node) = semanage.semanage_node_create(sh) 1074 if status < 0: 1075 raise Error("Could not create SENode object") 1076 if self.verbose: 1077 print("SENode object created.") 1078 1079 status = semanage.semanage_node_set_addr(sh, node, semanage.SEMANAGE_PROTO_IP6, "ffee:dddd::bbbb") 1080 if status < 0: 1081 raise Error("Could not set SENode address") 1082 1083 status = semanage.semanage_node_set_mask(sh, node, semanage.SEMANAGE_PROTO_IP6, "::ffff:ffff:abcd:0000") 1084 if status < 0: 1085 raise Error("Could not set SENode netmask") 1086 1087 semanage.semanage_node_set_proto(node, semanage.SEMANAGE_PROTO_IP6) 1088 if self.verbose: 1089 print("SENode protocol set: %s" % semanage.semanage_node_get_proto_str(semanage.SEMANAGE_PROTO_IP6)) 1090 1091 (status, con) = semanage.semanage_context_create(sh) 1092 if status < 0: 1093 raise Error("Could not create SEContext object") 1094 if self.verbose: 1095 print("SEContext object created (for node).") 1096 1097 status = semanage.semanage_context_set_user(sh, con, "system_u") 1098 if status < 0: 1099 raise Error("Could not set context user") 1100 if self.verbose: 1101 print("SEContext user: %s" % semanage.semanage_context_get_user(con)) 1102 1103 status = semanage.semanage_context_set_role(sh, con, "object_r") 1104 if status < 0: 1105 raise Error("Could not set context role") 1106 if self.verbose: 1107 print("SEContext role: %s" % semanage.semanage_context_get_role(con)) 1108 1109 status = semanage.semanage_context_set_type(sh, con, "lo_node_t") 1110 if status < 0: 1111 raise Error("Could not set context type") 1112 if self.verbose: 1113 print("SEContext type: %s" % semanage.semanage_context_get_type(con)) 1114 1115 status = semanage.semanage_context_set_mls(sh, con, "s0:c0.c255") 1116 if status < 0: 1117 raise Error("Could not set context MLS fields") 1118 if self.verbose: 1119 print("SEContext mls: %s" % semanage.semanage_context_get_mls(con)) 1120 1121 status = semanage.semanage_node_set_con(sh, node, con) 1122 if status < 0: 1123 raise Error("Could not set SENode context") 1124 if self.verbose: 1125 print("SENode context set: %s" % con) 1126 1127 (status, key) = semanage.semanage_node_key_extract(sh, node) 1128 if status < 0: 1129 raise Error("Could not extract SENode key") 1130 if self.verbose: 1131 print("SENode key extracted: %s" % key) 1132 1133 (status, exists) = semanage.semanage_node_exists_local(sh, key) 1134 if status < 0: 1135 raise Error("Could not check if SENode exists") 1136 if self.verbose: 1137 print("Exists status (commit number): %s" % status) 1138 1139 if exists: 1140 (status, old_node) = semanage.semanage_node_query_local(sh, key) 1141 if status < 0: 1142 raise Error("Could not query old SENode") 1143 if self.verbose: 1144 print("Query status (commit number): %s" % status) 1145 1146 print("Starting transaction...") 1147 status = semanage.semanage_begin_transaction(sh) 1148 if status < 0: 1149 raise Error("Could not start semanage transaction") 1150 1151 status = semanage.semanage_node_modify_local(sh, key, node) 1152 if status < 0: 1153 raise Error("Could not modify SENode") 1154 1155 status = semanage.semanage_commit(sh) 1156 if status < 0: 1157 raise Error("Could not commit test transaction") 1158 print("Commit status (transaction number): %s" % status) 1159 1160 status = semanage.semanage_begin_transaction(sh) 1161 if status < 0: 1162 raise Error("Could not start semanage transaction") 1163 1164 if not exists: 1165 print("Removing network node...") 1166 status = semanage.semanage_node_del_local(sh, key) 1167 if status < 0: 1168 raise Error("Could not delete test SENode") 1169 if self.verbose: 1170 print("Network node delete: %s" % status) 1171 else: 1172 print("Resetting network node...") 1173 status = semanage.semanage_node_modify_local(sh, key, old_node) 1174 if status < 0: 1175 raise Error("Could not reset test SENode") 1176 if self.verbose: 1177 print("Network node modify: %s" % status) 1178 1179 status = semanage.semanage_commit(sh) 1180 if status < 0: 1181 raise Error("Could not commit reset transaction") 1182 print("Commit status (transaction number): %s" % status) 1183 1184 semanage.semanage_context_free(con) 1185 semanage.semanage_node_key_free(key) 1186 semanage.semanage_node_free(node) 1187 if exists: 1188 semanage.semanage_node_free(old_node) 1189 1190 1191def main(argv=None): 1192 if argv is None: 1193 argv = sys.argv 1194 try: 1195 try: 1196 opts, args = getopt.getopt( 1197 argv[1:], "hvmuspfibcUSPFIBCanN", 1198 [ 1199 "help", 1200 "verbose", 1201 "modules", 1202 "users", 1203 "seusers", 1204 "ports", 1205 "file contexts", 1206 "network interfaces", 1207 "booleans", 1208 "active booleans", 1209 "network nodes", 1210 "writeuser", 1211 "writeseuser", 1212 "writeport", 1213 "writefcontext", 1214 "writeinterface", 1215 "writeboolean", 1216 "writeaboolean", 1217 "writenode", 1218 "all", 1219 ]) 1220 tests = Tests() 1221 for o, a in opts: 1222 if o == "-v": 1223 tests.verbose = True 1224 print("Verbose output selected.") 1225 if o == "-a": 1226 tests.all = True 1227 if o == "-u": 1228 tests.users = True 1229 if o == "-U": 1230 tests.writeuser = True 1231 if o == "-s": 1232 tests.seusers = True 1233 if o == "-S": 1234 tests.writeseuser = True 1235 if o == "-p": 1236 tests.ports = True 1237 if o == "-P": 1238 tests.writeport = True 1239 if o == "-f": 1240 tests.fcontexts = True 1241 if o == "-F": 1242 tests.writefcontext = True 1243 if o == "-i": 1244 tests.interfaces = True 1245 if o == "-I": 1246 tests.writeinterface = True 1247 if o == "-b": 1248 tests.booleans = True 1249 if o == "-B": 1250 tests.writeboolean = True 1251 if o == "-c": 1252 tests.abooleans = True 1253 if o == "-C": 1254 tests.writeaboolean = True 1255 if o == "-n": 1256 tests.nodes = True 1257 if o == "-N": 1258 tests.writenode = True 1259 if o == "-m": 1260 tests.modules = True 1261 if o == "-h": 1262 raise Usage(usage) 1263 1264 if not tests.selected(): 1265 raise Usage("Please select a valid test.") 1266 1267 except getopt.error as msg: 1268 raise Usage(msg) 1269 1270 sh = semanage.semanage_handle_create() 1271 1272 if semanage.semanage_is_managed(sh) != 1: 1273 raise Status("Unmanaged!") 1274 1275 status = semanage.semanage_connect(sh) 1276 if status < 0: 1277 raise Error("Could not establish semanage connection") 1278 1279 tests.run(sh) 1280 1281 status = semanage.semanage_disconnect(sh) 1282 if status < 0: 1283 raise Error("Could not disconnect") 1284 1285 semanage.semanage_handle_destroy(sh) 1286 1287 except Usage as err: 1288 print(err.msg, file=sys.stderr) 1289 except Status as err: 1290 print(err.msg, file=sys.stderr) 1291 except Error as err: 1292 print(err.msg, file=sys.stderr) 1293 1294 return 2 1295 1296 1297if __name__ == "__main__": 1298 sys.exit(main()) 1299