home *** CD-ROM | disk | FTP | other *** search
/ ftp.urbanrage.com / 2015-02-07.ftp.urbanrage.com.tar / ftp.urbanrage.com / pub / perl / tkCyrus < prev    next >
Text File  |  2002-04-21  |  10KB  |  372 lines

  1. #!/usr/local/bin/perl -- #-*- perl -*- for emacs
  2.  
  3. use strict;
  4.  
  5. use Tk;
  6. use Tk::NoteBook;
  7. use Tk::LabEntry;
  8. use Tk::Label;
  9.  
  10. use IMAP::Admin 0.8.0;
  11. use ConfFile 0.6 qw(array insert_order);
  12.  
  13. if (scalar(@ARGV) != 1) {
  14.     print "usage: $0 configuration_file\n";
  15.     exit;
  16. }
  17.  
  18. # declare vars
  19. my ($top, %info, $domain, $conf, %dev);
  20.  
  21. %dev = (
  22.     tcp =>  ["11", "42"],
  23.     udp =>  ["11", "41"],
  24.     zero => ["13", "12"],
  25.     ticotsord => ["105", "1"]
  26.     );
  27.  
  28. # read configuration file
  29. $conf = ConfFile->new($ARGV[0]);
  30. $domain = $conf->get("Domain");
  31. # setup initial window
  32. $top = MainWindow->new;
  33.  
  34. ¬ebook_setup($top);
  35. MainLoop;
  36.  
  37. sub notebook_setup($$) {
  38.     my ($top) = @_;
  39.     my ($note, %note, $key, $item);
  40.  
  41.     $note = $top->NoteBook(-ipadx => 6, -ipady => 6);
  42.     $note{'add'} = $note->add("add", -label => "Add/Modify", -underline => 0);
  43.     $note{'delete'} = $note->add("del", -label => "Delete", -underline => 0);
  44. #    $note{'mass_add'} = $note->add("mad", -label => "Mass Add", -underline => 0);
  45.     $note{'exit'} = $note->add("exit", -label => "Exit", -underline => 0);
  46.     $note{'debug'} = $note->add("debug", -label => "Debug",
  47.                 -raisecmd => sub { exec "$0 @ARGV"; });
  48.  
  49.  
  50.     &create_note($note{'add'}, "add");
  51.     &create_note($note{'delete'}, "del");
  52. #    &create_note($note{'mass_add'}, "mad");
  53.  
  54.     $note{'exit'}->Button(-command => [\&clean_up],
  55.               -text => "Exit"
  56.               )->pack(-side => "top", -expand => "yes", -fill => 'both');
  57.     $note->pack;
  58. }
  59.  
  60. sub create_note($$) {
  61.     my ($note, $type) = @_;
  62.     my ($opt, $frame); 
  63.  
  64.     if ($type ne "mad") {
  65.     $note->LabEntry(-label => "Mailbox:", 
  66.             -labelPack => [-side => "left", -anchor => "w"],
  67.             -width => 33,
  68.             -textvariable => \$info{'mailbox'}
  69.             )->pack(-side => "top", -anchor => "nw");
  70.     
  71.     $note->LabEntry(-label => "ACL:", 
  72.             -labelPack => [-side => "left", -anchor => "w"],
  73.             -width => 36,
  74.             -textvariable => \$info{'acl'}
  75.             )->pack(-side => "top", -anchor => "nw");
  76.     
  77.     $frame = $note->Frame()->pack(-side => "top", -anchor => "nw");
  78.     $frame->LabEntry(-label => "Quota:", 
  79.              -labelPack => [-side => "left", -anchor => "w"],
  80.              -width => 14,
  81.              -textvariable => \$info{'quota'}
  82.              )->pack(-side => "left", -anchor => "nw");
  83.     $frame->LabEntry(-label => "Used:", 
  84.              -labelPack => [-side => "left", -anchor => "w"],
  85.              -width => 13,
  86.              -textvariable => \$info{'quota_used'}
  87.              )->pack(-side => "left", -anchor => "nw");
  88.     } else {
  89.     $note->LabEntry(-label => "File:", 
  90.                     -labelPack => [-side => "left", -anchor => "w"],
  91.                     -width => 40,
  92.                     -textvariable => \$info{'file'}
  93.                     )->pack(-side => "top", -anchor => "nw");
  94.     }
  95.     $frame = $note->Frame()->pack(-side => "top", -anchor => "nw");
  96.     $frame->Label(-text => "Domain:")->pack(-side => "left");
  97.     $opt = $frame->Optionmenu(-variable => \$info{'domain'});
  98.     $opt->addOptions("huh?", insert_order($domain));
  99.     $opt->pack(-side => "left", -anchor => "nw");
  100.     
  101.     $frame = $note->Frame();
  102.     if ($type ne "mad") {
  103.     $frame->Button(-command => [\&get_user, \%info],
  104.                -text => "Get Info"
  105.                )->pack(-side => "left", -anchor => "s");
  106.     }
  107.     if ($type eq 'add') {
  108.     $frame->Button(-command => [\&add_user, \%info],
  109.                -text => "Nike"
  110.                )->pack(-side => "left", -anchor => "e",
  111.                    -expand => 'yes');
  112.     } elsif ($type eq 'del') {
  113.     $frame->Button(-command => [\&del_user, \%info],
  114.                -text => "Nike"
  115.                )->pack(-side => "left", -anchor => "e",
  116.                    -expand => 'yes');
  117.     }  elsif ($type eq 'mad') {
  118.     $frame->Button(-command => [\&mass_add, \%info],
  119.                -text => "Nike"
  120.                )->pack(-side => "left", -anchor => "e",
  121.                    -expand => 'yes');
  122.     }
  123.     $frame->pack(-side => "bottom", -anchor => "s", -expand => 'yes', -fill => 'x');
  124. }
  125.  
  126. sub ged { # generic_error_dialog
  127.     my ($text) = @_;
  128.  
  129.     my $dialog = $top->Dialog(-title => "An error occurred",
  130.                   -text => $text,
  131.                   -justify => 'center');
  132.     $dialog->Show;
  133.     
  134. }
  135.  
  136. sub get_user {
  137.     my ($ref) = @_;
  138.     my (@info, @acl, $acl_string, @quota, $the_domain, $imap, $key, @list);
  139.  
  140.     if (length($ref->{'mailbox'}) == 0) {
  141.     &ged("no mailbox information specified");
  142.     return;
  143.     }
  144.     if ($ref->{'domain'} eq "huh?") {
  145.     &ged("no domain selected [$ref->{'domain'}]");
  146.     return;
  147.     } else {
  148.     $the_domain = $domain->{$ref->{'domain'}};
  149.     if (!defined($the_domain->{'Server'})) {
  150.         &ged("Server not defined for $ref->{'domain'}, check your configuration file");
  151.         return;
  152.     }
  153.     if (!defined($the_domain->{'Login'})) {
  154.         &ged("Login not defined for $ref->{'domain'}, check your configuration file");
  155.         return;
  156.     }
  157.     if (!defined($the_domain->{'Password'})) {
  158.         &ged("Password not defined for $ref->{'domain'}, check your configuration file");
  159.         return;
  160.     }
  161.     }
  162.     if (!eval { $imap = IMAP::Admin->new('Server' => $the_domain->{'Server'},
  163.                      'Login' => $the_domain->{'Login'},
  164.                      'Password' => $the_domain->{'Password'});}){
  165.     &ged("Couldn't open imap connection to $the_domain->{'Server'}");
  166.     # delete user ?
  167.     return;
  168.     }
  169.     $ref->{'acl'} = "";
  170.     $ref->{'quota'} = "";
  171.     $ref->{'quota_used'} = "";
  172.     undef @list;
  173.     @list = $imap->list($ref->{'mailbox'});
  174.     if (scalar (@list) == 0) {
  175.     &ged ("Mailbox doesn't exist");
  176.     $imap->close;
  177.     return;
  178.     }
  179.     if (scalar (@list) != 1) {
  180.     print "@list\n";
  181.     &ged("Mailbox has more than one matching entry");
  182.     $imap->close;
  183.     return;
  184.     }
  185.     $list[0] =~ tr/\"//d; # " to balance quotes for emacs
  186.     $ref->{'mailbox'} = $list[0];
  187.     undef @acl;
  188.     @acl = $imap->get_acl($ref->{'mailbox'});
  189.     $ref->{'acl'} = join(" ", @acl);
  190.     undef @quota;
  191.     @quota = $imap->get_quota($ref->{'mailbox'});
  192.     $ref->{'quota'} = "";
  193.     if (scalar(@quota) > 0) {
  194.     $ref->{'quota_used'} = $quota[1];
  195.     $ref->{'quota'} = $quota[2];
  196.     }
  197.     $imap->close;
  198.     return;
  199. }
  200.  
  201. sub mass_add {
  202.     my ($ref) = @_;
  203.     my (@info);
  204.  
  205.     if (length($ref->{'file'}) == 0) {
  206.     &ged("no file specified");
  207.     return;
  208.     }
  209.     if ($ref->{'domain'} eq "huh?") {
  210.     &ged("no domain selected [$ref->{'domain'}]");
  211.     return;
  212.     }
  213.     open (FILE, $ref->{'file'}) || do {
  214.     &ged("Couldn't open $ref->{'file'} : $!");
  215.     return;
  216.     };
  217.     while(<FILE>) {
  218.     chomp;
  219.     @info = split ':';
  220.     $ref->{'mailbox'} = $info[0];
  221.     $ref->{'acl'} = $info[1];
  222.     $ref->{'quota'} = $info[2];
  223.     &add_user($ref);
  224.     }
  225.     close FILE;
  226.     return;
  227. }
  228.  
  229. sub add_user {
  230.     my ($ref) = @_;
  231.     my (@info, @acl, @list, $the_domain, $imap, $err, $user, $crmod, $index);
  232.  
  233.     if (length($ref->{'mailbox'}) == 0) {
  234.     &ged("no login information specified");
  235.     return;
  236.     }
  237.     if ($ref->{'domain'} eq "huh?") {
  238.     &ged("no domain selected [$ref->{'domain'}]");
  239.     return;
  240.     } else {
  241.     $the_domain = $domain->{$ref->{'domain'}};
  242.     if (!defined($the_domain->{'Server'})) {
  243.         &ged("Server not defined for $ref->{'domain'}, check your configuration file");
  244.         return;
  245.     }
  246.     if (!defined($the_domain->{'Login'})) {
  247.         &ged("Login not defined for $ref->{'domain'}, check your configuration file");
  248.         return;
  249.     }
  250.     if (!defined($the_domain->{'Password'})) {
  251.         &ged("Password not defined for $ref->{'domain'}, check your configuration file");
  252.         return;
  253.     }
  254.     }
  255.     undef @info;
  256.     if (!eval { $imap = IMAP::Admin->new('Server' => $the_domain->{'Server'},
  257.                      'Login' => $the_domain->{'Login'},
  258.                      'Password' => $the_domain->{'Password'});}){
  259.     &ged("Couldn't open imap connection to $the_domain->{'Server'}");
  260.     # delete user ?
  261.     return;
  262.     }
  263.     $crmod = 0; # 0 equal modify, 1 = create
  264.     @list = $imap->list($ref->{'mailbox'});
  265.     if (scalar (@list) == 0) {
  266.     $crmod = 1;
  267.     } elsif (scalar (@list) != 1) {
  268.     print "@list\n";
  269.     &ged("Mailbox has more than one matching entry");
  270.     $imap->close;
  271.     return;
  272.     } else {
  273.     $list[0] =~ tr/\"//d; # " to balance quotes for emacs
  274.     $ref->{'mailbox'} = $list[0];
  275.     }
  276.     $user = substr($ref->{'mailbox'}, rindex($ref->{'mailbox'}, ".")+1);
  277.     if ($crmod == 1) {
  278.     $err = $imap->create($ref->{'mailbox'});
  279.     if ($err != 0) {
  280.         &ged($imap->{'Error'});
  281.         $imap->close;
  282.         # delete user ?
  283.         return;
  284.     }
  285.     }
  286.     undef @acl;
  287.     @acl = $imap->get_acl($ref->{'mailbox'});
  288.     if (scalar(@acl) > 2) {
  289.     for ($index = 2; $index < scalar(@acl); $index += 2) {
  290.         $err = $imap->delete_acl($ref->{'mailbox'}, $acl[$index]);
  291.     }
  292.     }
  293.     @acl = split(' ', $ref->{'acl'});
  294.     if (scalar(@acl) == 0) {
  295.     $err = $imap->set_acl($ref->{'mailbox'}, $user,
  296.                   $the_domain->{'ACL'}, $the_domain->{'Login'}, "d");
  297.     } else {
  298.     $err = $imap->set_acl($ref->{'mailbox'}, @acl);
  299.     }
  300.     if ($err != 0) {
  301.     &ged($imap->{'Error'});
  302.     }
  303.     $err = 0;
  304.     if (length($ref->{'quota'}) == 0) {
  305.     if (defined($the_domain->{'Quota'})) {
  306.         $err = $imap->set_quota($ref->{'mailbox'}, $the_domain->{'Quota'});
  307.         if ($err != 0) {
  308.         &ged($imap->{'Error'});
  309.         }
  310.     }
  311.     } else {
  312.     $err = $imap->set_quota($ref->{'mailbox'}, $ref->{'quota'});
  313.     }
  314.     if ($err != 0) {
  315.     &ged($imap->{'Error'});
  316.     }
  317.     $imap->close;
  318.     &get_user($ref);
  319.     return;
  320. }
  321. sub del_user {
  322.     my ($ref) = @_;
  323.     my (@info, $the_domain, $imap, $err, $database);
  324.  
  325.     if (length($ref->{'mailbox'}) == 0) {
  326.     &ged("no mailbox information specified");
  327.     return;
  328.     }
  329.     if ($ref->{'domain'} eq "huh?") {
  330.     &ged("no domain selected [$ref->{'domain'}]");
  331.     return;
  332.     } else {
  333.     $the_domain = $domain->{$ref->{'domain'}};
  334.     if (!defined($the_domain->{'Server'})) {
  335.         &ged("Server not defined for $ref->{'domain'}, check your configuration file");
  336.         return;
  337.     }
  338.     if (!defined($the_domain->{'Login'})) {
  339.         &ged("Login not defined for $ref->{'domain'}, check your configuration file");
  340.         return;
  341.     }
  342.     if (!defined($the_domain->{'Password'})) {
  343.         &ged("Password not defined for $ref->{'domain'}, check your configuration file");
  344.         return;
  345.     }
  346.     }
  347.     if (!eval { $imap = IMAP::Admin->new('Server' => $the_domain->{'Server'},
  348.                      'Login' => $the_domain->{'Login'},
  349.                      'Password' => $the_domain->{'Password'});}){
  350.     &ged("Couldn't open imap connection to $the_domain->{'Server'}");
  351.     return;
  352.     }
  353.     $err = $imap->delete($ref->{'mailbox'});
  354.     if ($err != 0) {
  355.     &ged($imap->{'Error'});
  356.     } else {
  357.     $ref->{'acl'} = "";
  358.     $ref->{'quota'} = "";
  359.     $ref->{'quota_used'} = "";
  360.     }
  361.     $imap->close;
  362.     return;
  363. }
  364.  
  365. sub clean_up {
  366.     exit;
  367. }
  368.  
  369. sub reload {
  370.     exec $0 @ARGV;
  371. }
  372.