Advertisement
Guest User

Untitled

a guest
Jan 17th, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.90 KB | None | 0 0
  1. #!/usr/bin/perl -w
  2.  
  3. use Tk;
  4. use warnings;
  5. use strict;
  6. use Getopt::Std;
  7. use File::HomeDir;
  8. use File::Copy;
  9. use Switch;
  10. require Tk::Dialog;
  11. use POSIX qw(strftime);
  12. my $buttonWidth = 30;
  13. my $buttonHeight = 20;
  14. my $Mw;
  15. our($opt_g,$opt_h,$opt_d,$opt_u,$opt_p,$opt_i,$opt_v,$opt_c,$opt_r);
  16. my $date = strftime "%m%d%Y", localtime;
  17. my $logFileName = 'Logs.txt';
  18.  
  19. getopts('ghd:u:p:i:v') or die "Options error";
  20. if($opt_h && !$opt_g){
  21. printHelpText();
  22. }
  23. if ($opt_g){
  24. $Mw = MainWindow->new;
  25. getStartWindow();
  26. }
  27. if($opt_d && !$opt_g){
  28. deleteUserInline();
  29. }
  30. if($opt_u && !$opt_g){
  31. addUserInline();
  32. }
  33.  
  34. MainLoop;
  35. sub saveLogAndPrint{
  36. my $msg = shift;
  37. if($opt_v)
  38. {
  39. print $msg;
  40. }
  41. my $logDir = '/home/Logs';
  42. if (!(-e $logDir and -d $logDir)) {
  43. system qq(sudo mkdir $logDir);
  44. print "Created Log Folder";
  45. }
  46. if(open(my $fileHandle, ">>", $logDir.'/'.$logFileName)){
  47.  
  48. print $fileHandle $msg;
  49.  
  50. close $fileHandle;
  51. } else {
  52. warn "Could not open file $!";
  53. }
  54. }
  55. sub printHelpText{
  56. print "To delete users, use -d option followed by UID.\nTo Add users, use -u options followed by username.\nOptions for adding :\n -r random password -i specify uid(if not free then ignored)\n -p specify password \n -v for terminal output.\n";
  57. }
  58. sub deleteUserInline{
  59. my $UID = $opt_d;
  60. if(checkUID($UID) == 1){
  61. saveLogAndPrint("User with UID $UID does not exist.Aborting delete\n");
  62. }
  63. else{
  64. my $Username = getpwuid($UID);
  65. saveLogAndPrint("Deleted user $Username with UID $UID");
  66. deleteUser($UID);
  67. }
  68. }
  69. sub addUserInline{
  70. my $UID = '';
  71. my $username = $opt_u;
  72. my $password = '';
  73. if($opt_i){
  74. $UID = $opt_i;
  75. if(checkUID($UID) == 0){
  76. $UID = getFreeUID();
  77. saveLogAndPrint("\nUID Taken - Autogenerated UID = $UID\n");
  78. }
  79. }
  80. else{
  81. $UID = getFreeUID();
  82. }
  83. if($opt_r){
  84. $password = randomizePassword();
  85. }
  86. if($opt_p){
  87. $password = $opt_p
  88. }
  89.  
  90. createUser($UID,$username,$password);
  91. }
  92.  
  93. sub copyFiles{
  94. my $source = shift;
  95. saveLogAndPrint("Copying files, ");
  96. saveLogAndPrint("source : $source");
  97. my $destination = shift;
  98. saveLogAndPrint(", destination : $destination\n");
  99. system "sudo cp $source $destination" or die "Error copying files";
  100. saveLogAndPrint("Finished Copying \n\n");
  101. }
  102. sub deleteUser{
  103. my $UID = shift;
  104. my $username = getpwuid($UID);
  105. saveLogAndPrint("\nDeleting user with UID : $UID and username $username \n");
  106. my $deluser = '/usr/sbin/userdel';
  107. my $cmd = qq(sudo $deluser $username);
  108. system $cmd;
  109. }
  110. sub createUser{
  111. my $UID = shift;
  112. my $username = shift;
  113. my $password = shift;
  114. $UID = getFreeUID() if checkUID($UID) ==0;
  115. my $encryptedPasswd = crypt($password,"lk");
  116. saveLogAndPrint("Creating user with UID : " . $UID .", username ". $username ." and password $password\n");
  117. my $adduser = '/usr/sbin/useradd';
  118. my $cmd = qq(sudo $adduser -p $encryptedPasswd -u $UID \"$username\");
  119. copyFiles("/etc/skel","/home/$username");
  120. system $cmd;
  121. }
  122.  
  123. sub deleteFromGroup{
  124. my $username = shift;
  125. my $groupname = shift;
  126. my $cmd = qq(sudo /usr/sbin/deluser $username $groupname );
  127.  
  128. print $cmd;
  129. system $cmd;
  130. }
  131.  
  132. sub addToGroup{
  133. my $username = shift;
  134. my $groupname = shift;
  135. my $cmd = qq(sudo /usr/sbin/usermod -a -G $groupname $username);
  136. system $cmd;
  137. }
  138.  
  139. sub getShells{
  140. my $shellMenu = shift;
  141. my $cmd = qq(sudo /bin/cat /etc/shells);
  142. my $opts = `$cmd`;
  143. my @options = split /\n/,$opts;
  144. shift @options;
  145. foreach my $option (@options){
  146. $shellMenu->addOptions($option);
  147. print "Available Shell = " . $option . "\n";
  148. }
  149. }
  150.  
  151. sub checkUID{
  152. my $uidToCheck = shift;
  153. my $isTaken = 0;
  154. my $nameTaken = "";
  155. while((my $name,my $passwd,my $uid,my $gid,my $gcos,my $dir,my $shell) = getpwent( )){
  156. if($uid eq $uidToCheck){
  157. $isTaken = 1;
  158. $nameTaken = $name;
  159. last;
  160. }
  161. }
  162. endpwent( );
  163.  
  164. if($isTaken == 1){
  165. $Mw->Dialog(-title => "Uid Taken!", -text => "UID $uidToCheck is already taken by user " . $nameTaken)->Show if $opt_g;
  166. return 0 ;#if $opt_u || $opt_d;
  167. }
  168. else{
  169. $Mw->Dialog(-title => "Uid Free!", -text => "Yay! Uid $uidToCheck is Free!")->Show if $opt_g;
  170. return 1 ;#if $opt_u || $opt_d;
  171. }
  172.  
  173. }
  174. sub getFreeUID{
  175. my $uidSelected = 0;
  176.  
  177. while((my $name,my $passwd,my $uid,my $gid,my $gcos,my $dir,my $shell) = getpwent( )){
  178. if($uid>=1000 && $uid<60000){
  179. $uidSelected = ($uidSelected < $uid )? $uid : $uidSelected ;
  180.  
  181. }
  182. }
  183. endpwent( );
  184.  
  185. return ++$uidSelected;
  186.  
  187. }
  188.  
  189. sub listUsersPage{
  190. $Mw->destroy;
  191. $Mw = MainWindow->new;
  192. $Mw->geometry("500x300");
  193. $Mw->title("User List");
  194. my $height = 120;
  195. my $uid;
  196. my $deleteMenu=$Mw ->Optionmenu(-variable=> \$uid);
  197. $Mw->Label(-text=>"Users Present in the system")->grid();
  198. while((my $name,my $passwd,my $uid,my $gid,my $gcos,my $dir,my $shell) = getpwent( )){
  199. if($uid>=1000 && $uid<=60000){
  200. $deleteMenu->addOptions($uid);
  201. $Mw->Label(-text=>$name)->grid($Mw->Label(-text=>$uid));
  202. $height+=30;
  203. }
  204. }
  205. $Mw->geometry("500x$height");
  206. $Mw->Label(-text=>"Delete User with provided UID")->grid();
  207. $Mw->Button(-text=>"Delete user" ,-command=>sub{deleteUser($uid)} ,-width => 15)->grid( $deleteMenu);
  208. $Mw->Button(-text=>"Back to Main Menu", -command =>sub{getStartWindow()})->grid( $Mw->Button(-text=>"Refresh", -command =>sub{listUsersPage()}));
  209. endpwent( );
  210. }
  211.  
  212. sub randomizePassword{
  213. my @chars = ("A".."Z", "a".."z");
  214. my $string;
  215. $string .= $chars[rand @chars] for 1..8;
  216. return $string;
  217. }
  218.  
  219. sub createUserPage{
  220. $Mw->destroy;
  221. $Mw = MainWindow->new;
  222. $Mw->geometry("500x300");
  223. $Mw->title("Create User");
  224.  
  225. my $uid = getFreeUID;
  226. my $uspasswd = randomizePassword;
  227. my $usname = 'UsernameHere';
  228.  
  229. my $username = $Mw->Entry(-textvariable=> \$usname )->grid($Mw->Label(-text => 'Username'));
  230. my $UID = $Mw->Entry(-textvariable=> \$uid )->grid($Mw->Label(-text => 'UID'));
  231. my $password = $Mw ->Entry(-textvariable=> \$uspasswd)->grid($Mw->Label(-text => 'Password'));
  232.  
  233. $Mw->Button(-text=>"Create User", -command =>sub{createUser($uid,$usname,$uspasswd)},-width => $buttonWidth)->grid();
  234. $Mw->Button(-text=>"Check If UID is free", -command =>sub{checkUID($uid)},-width => $buttonWidth)->grid();
  235. $Mw->Button(-text=>"Get Random Password", -command =>sub{$uspasswd = randomizePassword()},-width => $buttonWidth)->grid();
  236.  
  237. $Mw->Button(-text=>"Back to Main Menu", -command =>sub{getStartWindow()},-width => $buttonWidth)->grid();
  238.  
  239. }
  240.  
  241. sub groupsPage{
  242. $Mw->destroy;
  243. $Mw = MainWindow->new;
  244. $Mw->geometry("500x400");
  245. $Mw->title("My Groups");
  246. my $height = 300;
  247. my $username = shift;
  248. my $un = $username;
  249. my $usernameMenu=$Mw ->Optionmenu(-variable=> \$username);
  250.  
  251. while((my $name,my $passwd,my $uid,my $gid,my $gcos,my $dir,my $shell) = getpwent( )){
  252. if($uid>=1000 && $uid<=60000){
  253. $usernameMenu->addOptions($name);
  254. }
  255. }
  256. $Mw->geometry("500x$height");
  257. $username =$un;
  258. endpwent();
  259. my $grName = '';
  260. my $groupToAdd = '';
  261. my $groupToDel = '';
  262. my $agroups = `getent group | grep -v $username `;
  263. my $mgroups = `getent group | grep $username `;
  264.  
  265. my @allGroups = split /\n/,$agroups;
  266. my @myGroups = split /\n/,$mgroups;
  267.  
  268. my %groupMap;
  269.  
  270. my $menuAdd=$Mw ->Optionmenu(-variable=> \$groupToAdd);
  271. my $menuDel=$Mw ->Optionmenu(-variable=> \$groupToDel);
  272.  
  273. $Mw->Label(-text=>"User : ")->grid($usernameMenu,$Mw->Button(-text=>"Refresh list", -command =>sub{groupsPage($username)}));
  274. $Mw->Label(-text=>"GID")->grid($Mw->Label(-text=>"Group Name"));
  275.  
  276. foreach my $group(@allGroups){
  277. $grName = join ':', (split(':',$group))[0];
  278. $group = join ':', (split(':',$group))[0 .. 2];
  279. $group =~ s/.*\://;
  280. next if $group <1000;
  281. $groupMap{$grName} = $group;
  282. $menuAdd->addOptions($grName);
  283. }
  284. foreach my $group(@myGroups){
  285. $height+=30;
  286. $grName = join ':', (split(':',$group))[0];
  287. $group = join ':', (split(':',$group))[0 .. 2];
  288. $group =~ s/.*\://;
  289. next if $group <1000;
  290. $menuDel->addOptions($grName);
  291. $groupMap{$grName} = $group;
  292. $Mw->Label(-text=>$group)->grid($Mw->Label(-text=>$grName));
  293. }
  294. $Mw->Button( -command =>sub{addToGroup($username,$groupToAdd)},-width => $buttonWidth,-text=>"Add to a group")->grid($menuAdd);
  295. $Mw->Button( -command =>sub{deleteFromGroup($username,$groupToDel)},-width => $buttonWidth,-text=>"Remove from a group")->grid($menuDel);
  296. $Mw->Button(-text=>"Back to Main Menu", -command =>sub{getStartWindow()},-width => $buttonWidth)->grid();
  297.  
  298. }
  299.  
  300. sub getStartWindow{
  301. $Mw->destroy;
  302. $Mw = MainWindow->new;
  303. $Mw->geometry("270x180");
  304. $Mw->title("User Managment Tool");
  305.  
  306. $Mw->Label(-text => 'User Administration')->pack();
  307.  
  308. $Mw->Button(-text=>"Create User", -command =>sub{createUserPage()} ,-width => $buttonWidth)->pack();
  309. $Mw->Button(-text=>"List and delete the users", -command =>sub{listUsersPage()},-width => $buttonWidth)->pack();
  310. $Mw->Button(-text=>"My Groups", -command =>sub{groupsPage(getpwuid($>))},-width => $buttonWidth)->pack();
  311.  
  312. $Mw->Button(-text=>"Close", -command =>sub{exit()})->pack();
  313.  
  314. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement