Advertisement
Guest User

Untitled

a guest
Jan 20th, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.50 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use Tk;
  3. use strict;
  4.  
  5. my $global_home_directory;
  6. my $global_start_group;
  7. my $global_shell;
  8. my $global_login;
  9. my $global_UID;
  10. my $logger="/var/log/tk_users.log";
  11.  
  12. my $mw = new MainWindow;
  13. fill_window($mw, 'Main');
  14.  
  15. # create menu
  16. my $menu = $mw -> Frame(-relief => 'groove', -borderwidth => 3, -background => 'white') -> pack(-side => 'top', -fill => 'x');
  17. my $file_button = $menu -> Menubutton(-text => 'File', -background => 'white' , -foreground => 'black') -> pack(-side => 'left');
  18. my $user_button = $menu -> Menubutton(-text => 'User', -background => 'white' , -foreground => 'black') -> pack(-side => 'left');
  19. my $group_button = $menu -> Menubutton(-text => 'Group', -background => 'white' , -foreground => 'black') -> pack(-side => 'left');
  20.  
  21. # create options in menu
  22. $user_button -> command(-label => 'Add User', -command => \&add_user);
  23. $user_button -> command(-label => 'Change User', -command => \&modify_user);
  24. $user_button -> command(-label => 'Remove User', -command => \&remove_user);
  25. $group_button -> command(-label => 'View User Group', -command => \&modify_group);
  26. $group_button -> command(-label => 'View Groups', -command => \&view_gruop_users);
  27. $file_button -> command(-label => 'Exit', -command => \&finito );
  28.  
  29. # user list
  30. my $frame = $mw -> Frame(-background => "blue") -> pack();
  31. my $list = $frame -> Scrolled('Listbox', -scrollbars => 'osoe', -setgrid => 'yes', -width => 40, -height => 20) -> pack();
  32. $list -> grid(-row => 2, -column => 1);
  33.  
  34. sub load_users {
  35. $list->delete(0,'end');
  36. open(OUT, "<", "/etc/passwd");
  37. while(<OUT>)
  38. {
  39. my @line_data = split(/:/, $_);
  40. if ( $line_data[2] >= 1000 && $line_data[2] < 65534){
  41. $list->insert('end', $line_data[0]);
  42. }
  43. }
  44. close OUT;
  45. }
  46.  
  47. # do that now
  48. load_users();
  49. # now all the other callbacks
  50.  
  51. sub check_available_uid {
  52. my($my_UID) = @_;
  53. my $available;
  54.  
  55. open(OUT, "<", "/etc/passwd");
  56.  
  57. while(<OUT>)
  58. {
  59. my @line_data = split(/:/, $_);
  60. if($line_data[2] == $my_UID)
  61. {
  62. return $available = "false";
  63. }
  64. }
  65. close OUT;
  66. return $available = "true";
  67. }
  68.  
  69. sub check_available_login {
  70. my($my_UID) = @_;
  71. my $available;
  72.  
  73. open(OUT, "<", "/etc/passwd");
  74.  
  75. while(<OUT>)
  76. {
  77. my @line_data = split(/:/, $_);
  78. if($line_data[0] eq $my_UID)
  79. {
  80. return $available = "false";
  81. }
  82. }
  83. close OUT;
  84. return $available = "true";
  85. }
  86.  
  87. sub get_available_uid {
  88. my $last_UID_value = 1000;
  89. open(OUT, "<", "/etc/passwd");
  90.  
  91. while(<OUT>)
  92. {
  93. my @line_data = split(/:/, $_);
  94. my $val = $line_data[2];
  95. if($val >= 1000 && $val <= 6000 &&
  96. $val>=$last_UID_value)
  97. {
  98. $last_UID_value = $line_data[2];
  99. }
  100. }
  101. close OUT;
  102. return $last_UID_value;
  103. }
  104.  
  105. sub fill_window {
  106. my ($window, $header) = @_;
  107. $window->Label(-text => $header)->pack;
  108. $window->Button(
  109. -text => 'close',
  110. -command => [$window => 'destroy']
  111. )->pack(-side => 'bottom');
  112. }
  113.  
  114. sub load_user_data {
  115. my($user_login) = @_;
  116. open(OUT, "<", "/etc/passwd");
  117. while(<OUT>)
  118. {
  119. my @line_data = split(/:/, $_);
  120. if ( $line_data[0] eq $user_login){
  121. return @line_data;
  122. }
  123. }
  124. return "";
  125. }
  126.  
  127. sub add_user {
  128. my $mwlocal = MainWindow->new();
  129. $mwlocal->Label(-text => "Add User");
  130. my $label_login = $mwlocal-> Label(-text => "Login");
  131. my $entry_login = $mwlocal-> Entry();
  132.  
  133. my $label_uid = $mwlocal-> Label(-text => "UID");
  134. my $entry_uid = $mwlocal-> Entry();
  135.  
  136. $global_UID = get_available_uid() + 1;
  137. $entry_uid -> insert(0, $global_UID);
  138.  
  139. my $label_home = $mwlocal-> Label(-text => "Home dir");
  140. my $entry_home = $mwlocal-> Entry();
  141. my $label_shell = $mwlocal-> Label(-text => "Shell");
  142. my $entry_shell = $mwlocal-> Entry();
  143. my $label_group = $mwlocal-> Label(-text => "Group");
  144. my $entry_group = $mwlocal-> Entry();
  145.  
  146. my $label_warning = $mwlocal-> Label(-text => "Warnings:");
  147. my $entry_warning = $mwlocal-> Entry();
  148.  
  149. $global_login = $entry_login->get();
  150. $global_shell = "/bin/sh";
  151.  
  152. my $send_button = $mwlocal -> Button(-text => "Create", -command => sub {
  153.  
  154. if ( $entry_login->get() eq "" ){
  155. $entry_warning->delete(0,999);
  156. $entry_warning->insert(0, "No login entered");
  157. return;
  158. }
  159.  
  160. my $myVar1 = check_available_login($entry_login->get());
  161. if ( $myVar1 ne "true" ){
  162. $entry_warning->delete(0,999);
  163. $entry_warning->insert(0, "This login is already taken");
  164. return;
  165. }
  166.  
  167. my $Tuid = $entry_uid->get();
  168. if ( $Tuid eq "" || $Tuid !~ /^\d+$/ ){
  169. $entry_warning->delete(0,999);
  170. $entry_warning->insert(0, $Tuid eq "" ? "UID not set" : "UID not a number");
  171. return;
  172. }
  173.  
  174. my $myVar2 = check_available_uid($Tuid);
  175. if ( $myVar2 ne "true" ){
  176. $entry_warning->delete(0,999);
  177. $entry_warning->insert(0, "UID already exists");
  178. return;
  179. }
  180.  
  181. $entry_warning->delete(0,999);
  182.  
  183. my $genPW=`pwgen -1`;
  184. my $pass = crypt("$genPW","salt");
  185.  
  186. $global_home_directory = "/home/$global_login";
  187. $global_UID = $entry_uid->get();
  188. $global_login = $entry_login->get();
  189. $global_shell = "/bin/sh";
  190.  
  191. `useradd -u $global_UID -s $global_shell -m -p $pass $global_login`;
  192.  
  193. save_user_to_root_file("$global_login","$global_UID","$genPW");
  194.  
  195. # change for production use?
  196. print "$global_login has password ($genPW)\n";
  197. load_users();
  198. }) -> pack();
  199.  
  200. my $cancel_button = $mwlocal-> Button(
  201. -text=>'Cancel',
  202. -command=> sub { $mwlocal -> destroy; }
  203. ) -> pack();
  204.  
  205. $label_login -> grid(-row => 2, -column => 1);
  206. $entry_login -> grid(-row => 2, -column => 2);
  207. $label_uid -> grid(-row => 3, -column => 1);
  208. $entry_uid -> grid(-row => 3, -column => 2);
  209. $label_home -> grid(-row => 5, -column => 1);
  210. $entry_home -> grid(-row => 5, -column => 2);
  211. $label_group -> grid(-row => 6, -column => 1);
  212. $entry_group -> grid(-row => 6, -column => 2);
  213. $label_shell -> grid(-row => 7, -column => 1);
  214. $entry_shell -> grid(-row => 7, -column => 2);
  215. $label_warning -> grid(-row => 8, -column => 1);
  216. $entry_warning -> grid(-row => 8, -column => 2);
  217. $send_button -> grid(-row => 9, -column => 1);
  218. $cancel_button -> grid(-row => 9, -column => 2);
  219.  
  220. MainLoop;
  221. }
  222.  
  223. sub remove_user {
  224. my $sel=$list->curselection();
  225.  
  226. if ($sel eq ""){
  227. my $ftp_warn = $mw->messageBox(
  228. -title => 'NOT RLY',
  229. -message => "Select user first!",
  230. -type => 'ok',
  231. -icon => 'error',
  232. );
  233. return;
  234. }
  235.  
  236. my $ftp_warn = $mw->messageBox(
  237. -title => 'SERIOUSLY?',
  238. -message => "Are you sure?",
  239. -type => 'YesNo',
  240. -icon => 'question',
  241. );
  242. if ( $ftp_warn eq 'No' ) {
  243. return;
  244. }
  245.  
  246. my $value=$list->get($sel);
  247. `deluser $value --remove-home`;
  248. rem($list->get($sel));
  249. load_users();
  250. }
  251.  
  252. sub modify_user {
  253.  
  254. my $sel=$list->curselection();
  255.  
  256. if ($sel eq ""){
  257. my $ftp_warn = $mw->messageBox(
  258. -title => 'NOT RLY',
  259. -message => "Select user first!",
  260. -type => 'ok',
  261. -icon => 'error',
  262. );
  263. return;
  264. }
  265. my $value=$list->get($sel);
  266. my @data=load_user_data($value);
  267.  
  268. my $mwlocal = MainWindow->new();
  269. $mwlocal->Label(-text =>"Modify User");
  270. my $label_login = $mwlocal-> Label(-text=>"Login");
  271. my $entry_login = $mwlocal-> Entry();
  272. $entry_login->insert(0,$data[0]);
  273.  
  274. my $label_uid = $mwlocal-> Label(-text=>"UID");
  275. my $entry_uid = $mwlocal-> Entry();
  276. $entry_uid -> insert(0,$data[2]);
  277.  
  278. my $label_home = $mwlocal-> Label(-text=>"Home dir");
  279. my $entry_home = $mwlocal-> Entry();
  280. $entry_home->insert(0,$data[5]);
  281.  
  282. my $label_shell = $mwlocal-> Label(-text=>"Shell");
  283. my $entry_shell = $mwlocal-> Entry();
  284. $entry_shell->insert(0,$data[6]);
  285.  
  286. my $label_group = $mwlocal-> Label(-text=>"Group");
  287. my $entry_group = $mwlocal-> Entry();
  288. $entry_group -> insert(0,$data[3]);
  289.  
  290. my $label_warning = $mwlocal-> Label(-text=>"Warnings:");
  291. my $entry_warning = $mwlocal-> Entry();
  292.  
  293. my $send_button = $mwlocal -> Button(-text=>"Modify",-command=> sub {
  294. $value=$list->get($sel);
  295. @data=load_user_data($value);
  296.  
  297. if ( $entry_login->get() eq "" ){
  298. $entry_warning->delete(0,999);
  299. $entry_warning->insert(0,"Nie podano loginu!");
  300. return;
  301. }
  302.  
  303. my $myVar1=check_available_login($entry_login->get());
  304.  
  305. my $aaa=$entry_login->get();
  306. print "#### LOGIN = $aaa #### DATA = $data[0] ###\n";
  307. if ($entry_login->get() ne $data[0] ){
  308. if ( $myVar1 ne "true" ){
  309. $entry_warning->delete(0,999);
  310. $entry_warning->insert(0,"Podany login jest zajety");
  311. return;
  312. }
  313. }
  314.  
  315. my $Tuid=$entry_uid->get();
  316. if($Tuid ne $data[2]){
  317. if ( $Tuid eq "" || $Tuid == /^\d+$/ ){
  318. $entry_warning->delete(0,999);
  319. $entry_warning->insert(0,"Nie podano UID!");
  320. return;
  321. }
  322.  
  323. my $myVar2=check_available_uid($Tuid);
  324. if ( $myVar2 ne "true" ){
  325. $entry_warning->delete(0,999);
  326. $entry_warning->insert(0,"Podany UID istnieje");
  327. return;
  328. }
  329.  
  330. }
  331.  
  332. my $gidT=$entry_group->get();
  333. if ( $gidT < 1000 || $gidT >= 65534 ){
  334. $entry_warning->delete(0,999);
  335. $entry_warning->insert(0,"GID musi byc > 1000 !");
  336. return;
  337. }
  338.  
  339. $entry_warning->delete(0,999);
  340.  
  341. print "\n\nMODIFY DONE\n\n";
  342. #modify
  343. my $oldLogin=$data[0];
  344. my $oldUID=$data[2];
  345. my $login=$entry_login->get();
  346. my $uid=$entry_uid->get();
  347. my $gid=$entry_group->get();
  348. my $hdir=$entry_home->get();
  349. my $shell=$entry_shell->get();
  350. $shell =~ s/^\s+//; #remove leading spaces
  351. $shell =~ s/\s+$//; #remove trailing spaces
  352. `usermod -d $hdir -s $shell --uid $uid --login $login -m $oldLogin`;
  353.  
  354. update($oldUID,$login,$uid);
  355.  
  356. load_users();
  357. } ) -> pack();
  358.  
  359. my $cancle_button = $mwlocal-> Button(
  360. -text=>'Cancel',
  361. -command=> sub { $mwlocal -> destroy; }
  362. ) -> pack();
  363.  
  364. $label_login -> grid(-row=>2, -column=>1);
  365. $entry_login -> grid(-row=>2, -column=>2);
  366. $label_uid -> grid(-row=>3, -column=>1);
  367. $entry_uid -> grid(-row=>3, -column=>2);
  368. $label_home -> grid(-row=>5, -column=>1);
  369. $entry_home -> grid(-row=>5, -column=>2);
  370. $label_group -> grid(-row=>6, -column=>1);
  371. $entry_group -> grid(-row=>6, -column=>2);
  372. $label_shell -> grid(-row=>7, -column=>1);
  373. $entry_shell -> grid(-row=>7, -column=>2);
  374. $label_warning -> grid(-row=>8, -column=>1);
  375. $entry_warning -> grid(-row=>8, -column=>2);
  376.  
  377. $send_button -> grid(-row=>9, -column=>1);
  378. $cancle_button -> grid(-row=>9, -column=>2);
  379.  
  380. MainLoop;
  381.  
  382. }
  383.  
  384. sub save_user_to_root_file {
  385. my($user,$uid,$pass) = @_;
  386.  
  387. my $ch=0;
  388. if ( ! -e $logger ){
  389. $ch=1;
  390. }
  391. open(LOG,">>",$logger);
  392.  
  393. if ( $ch == 1 ){
  394. `chmod 700 $logger`;
  395. }
  396.  
  397. print LOG "$user:$uid:$pass\n";
  398. close LOG;
  399.  
  400. }
  401.  
  402. sub update {
  403. my($old_uid,$user,$uid) = @_;
  404.  
  405. local @ARGV = ($logger);
  406. local $^I = '.bac';
  407.  
  408. while(<>){
  409. chomp;
  410. my @line = split(/:/,$_);
  411. my $uid_prev = $line[1];
  412. my $user_prev = $line[0];
  413.  
  414. if($old_uid eq $uid_prev){
  415. s/:$uid_prev:/:$uid:/;
  416. s/$user_prev:/$user:/;
  417.  
  418. print $_ ."\n";
  419. }else{
  420. print $_ ."\n";
  421. }
  422. }
  423. }
  424.  
  425. sub rem {
  426. my($user) = @_;
  427.  
  428. local @ARGV = ($logger);
  429. local $^I = '.bac';
  430.  
  431. while(<>){
  432. chomp;
  433. my @line = split(/:/,$_);
  434. my $uid = $line[1];
  435. my $muser = $line[0];
  436. my $pass = $line[2];
  437.  
  438. if($user == $muser){
  439. s/$muser:$uid:$pass//;
  440. print $_ ."";
  441. }else{
  442. print $_ ."\n";
  443. }
  444. }
  445. }
  446.  
  447. sub view_gruop_users {
  448.  
  449. my $mwlocal = MainWindow->new();
  450. $mwlocal->Label(-text =>"Group Users");
  451. my $label_uid = $mwlocal-> Label(-text=>"Grupy i Userzy");
  452. my $entry_uid = $mwlocal-> Entry();
  453.  
  454. $label_uid -> grid(-row=>1, -column=>1);
  455. $entry_uid -> grid(-row=>1, -column=>2);
  456.  
  457. # gid list
  458. my $list3 = $mwlocal -> Scrolled('Listbox', -scrollbars=> 'osoe', -setgrid=> 'yes', -width=>20, -height=>10) -> pack();
  459. $list3 -> grid(-row=>2, -column=>1);
  460.  
  461. #user list
  462. my $list4 = $mwlocal -> Scrolled('Listbox', -scrollbars=> 'osoe', -setgrid=> 'yes', -width=>20, -height=>10) -> pack();
  463. $list4 -> grid(-row=>2, -column=>2);
  464.  
  465. load_groups($list3);
  466. my $show = $mwlocal-> Button(
  467. -text=>'Show Users',
  468. -command=> sub {
  469.  
  470.  
  471. my $sel=$list3->curselection();
  472.  
  473. if ($sel eq ""){
  474. my $ftp_warn = $mw->messageBox(
  475. -title => 'NOT RLY',
  476. -message => "Select group first!",
  477. -type => 'ok',
  478. -icon => 'error',
  479. );
  480. return;
  481. }
  482. my $value=$list3->get($sel);
  483.  
  484. $list4->delete(0,'end');
  485. group_users("$value",$list4);
  486.  
  487. }
  488. ) -> pack();
  489. $show->grid(-row=>3, -column=>2);
  490.  
  491.  
  492. my $rem_button = $mwlocal-> Button(
  493. -text=>'Remove users with GID',
  494. -command=> sub {
  495.  
  496. my $ftp_warn = $mw->messageBox(
  497. -title => 'SERIOUSLY?',
  498. -message => "Are you sure?",
  499. -type => 'YesNo',
  500. -icon => 'question',
  501. );
  502. if ( $ftp_warn eq 'No' ) {
  503. return;
  504. }
  505.  
  506.  
  507. foreach ( $list4->get(0,'end') ){
  508. print "removing user $_ ...\n";
  509. #UNCOMMENT
  510. #`deluser $_ --remove-home`;
  511. #rem($_);
  512. }
  513.  
  514. }
  515. ) -> pack();
  516. $rem_button->grid(-row=>4, -column=>2);
  517.  
  518.  
  519. my $cancle_button = $mwlocal-> Button(
  520. -text=>'Cancel',
  521. -command=> sub { $mwlocal -> destroy; }
  522. ) -> pack();
  523. $cancle_button->grid(-row=>5, -column=>2);
  524.  
  525. MainLoop;
  526.  
  527. }
  528.  
  529. sub load_groups {
  530. my($list) = @_;
  531.  
  532. open(OUT, "<", "/etc/group");
  533.  
  534. while(<OUT>)
  535. {
  536. my @line_data = split(/:/, $_);
  537. if($line_data[2] > 1000 && $line_data[2] < 65534)
  538. {
  539. $list->insert('end',$line_data[2]);
  540. }
  541. }
  542. close OUT;
  543. }
  544.  
  545. sub modify_group {
  546.  
  547. my $sel=$list->curselection();
  548.  
  549. if ($sel eq ""){
  550. my $ftp_warn = $mw->messageBox(
  551. -title => 'NOT RLY',
  552. -message => "Select user first!",
  553. -type => 'ok',
  554. -icon => 'error',
  555. );
  556. return;
  557. }
  558.  
  559. my $value=$list->get($sel);
  560. my @data=load_user_data($value);
  561.  
  562. my $gid_show=$data[3];
  563.  
  564. print "@data\n\n";
  565.  
  566. my $mwlocal = MainWindow->new();
  567. $mwlocal->Label(-text =>"Add User");
  568. my $label_uid = $mwlocal-> Label(-text=>"Userzy dla GID = $gid_show");
  569. my $entry_uid = $mwlocal-> Entry();
  570.  
  571. #my $add_button
  572.  
  573. $label_uid -> grid(-row=>1, -column=>1);
  574. $entry_uid -> grid(-row=>1, -column=>2);
  575.  
  576. # gid list
  577. my $list2 = $mwlocal -> Scrolled('Listbox', -scrollbars=> 'osoe', -setgrid=> 'yes', -width=>20, -height=>10) -> pack();
  578. $list2 -> grid(-row=>2, -column=>2);
  579.  
  580. my $rem_button = $mwlocal-> Button(
  581. -text=>'Remove users with GID',
  582. -command=> sub {
  583.  
  584. my $ftp_warn = $mw->messageBox(
  585. -title => 'SERIOUSLY?',
  586. -message => "Are you sure?",
  587. -type => 'YesNo',
  588. -icon => 'question',
  589. );
  590. if ( $ftp_warn eq 'No' ) {
  591. return;
  592. }
  593.  
  594.  
  595.  
  596. foreach ( $list2->get(0,'end') ){
  597. my $value=$list->get($sel);
  598. print "removing user $_ ...\n";
  599. #UNCOMMENT
  600. #`deluser $_ --remove-home`;
  601. #rem($_);
  602. }
  603.  
  604. }
  605. ) -> pack();
  606. $rem_button->grid(-row=>3, -column=>2);
  607.  
  608. my $add_button = $mwlocal-> Button(
  609. -text=>'Add user to group',
  610. -command=> sub {
  611.  
  612. my $myUID=$entry_uid->get();
  613. if ($myUID eq ""){
  614. my $ftp_warn = $mw->messageBox(
  615. -title => 'NOT RLY',
  616. -message => "UID is empty!",
  617. -type => 'ok',
  618. -icon => 'error',
  619. );
  620. return;
  621. }
  622.  
  623. if ($myUID < 1000 || $myUID > 65533){
  624. my $ftp_warn = $mw->messageBox(
  625. -title => 'NOT RLY',
  626. -message => "Cant use that UID!",
  627. -type => 'ok',
  628. -icon => 'error',
  629. );
  630. return;
  631. }
  632.  
  633.  
  634.  
  635.  
  636. `usermod -G $myUID $data[0]`;
  637.  
  638. }
  639. ) -> pack();
  640. $add_button->grid(-row=>4, -column=>2);
  641.  
  642. my $cancle_button = $mwlocal-> Button(
  643. -text=>'Cancel',
  644. -command=> sub { $mwlocal -> destroy; }
  645. ) -> pack();
  646. $cancle_button->grid(-row=>5, -column=>2);
  647.  
  648. group_users("$gid_show",$list2);
  649. MainLoop;
  650.  
  651. }
  652.  
  653. sub group_users {
  654. my($gid,$list) = @_;
  655.  
  656. open(OUT, "<", "/etc/group");
  657.  
  658. while(<OUT>)
  659. {
  660. my @line_data = split(/:/, $_);
  661. if($line_data[2] eq $gid)
  662. {
  663. my $count = 0;
  664. my @groups = split(/,/, $line_data[3]);
  665. for ( $count ; $count <= @groups - 1 ; $count++){
  666. chomp($groups[$count]);
  667. if("$groups[$count]" eq ""){
  668. next;
  669. }
  670. $list->insert('end',$groups[$count]);
  671. }
  672. $list->insert('end',$line_data[0]);
  673. last;
  674. }
  675. }
  676. close OUT;
  677. }
  678.  
  679. sub finito {
  680. exit;
  681. }
  682.  
  683. # let's start the GUI
  684. MainLoop;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement