SUMMARY: Script help with read

From: Karyn Williams (karyn_at_calarts.edu)
Date: 02/24/05

  • Next message: egold_at_fsa.com: "need to create a gui front end for my scripts."
    Date: Thu, 24 Feb 2005 13:03:20 -0800
    To: sunmanagers@sunmanagers.org
    
    

    Thanks to:

    Chris Schroen
    Christ Clark
    Michael DeSimone
    Matthew Stier
    David DEAVES
    SteinAxt
    Rob McMahon
    John F Wall
    Alex Stade
    John Julian
    Stephen Barnett
    John Leadeham
    Damir Delija
    Mats Oberg
    Jonathan Birchall
    Alan Crosby
    Hutin Bertrand
    Doc G (Tim)
    Luc Suryo
    Thad MacMillan
    Reggie Beavers

    The problem with the original script was that read was running in a
    subshell and the variables do not survive when it closes. ksh handles this
    differently than sh and bash which are the shells I tested before posting.
    David Deaves and Christ Clark said it well "In bourne shell (/bin/sh) the
    head of the pipeline is the current shell, and the tail is a sub shell. So
    in this case, the sub shell happily evaluates the input and allocates it to
    it's environment variables, then exits." and "Being part of a pipe, the
    'read' is executed in a subshell. The variables it sets are lost when the
    subshell terminates and not propagated back to the parent shell."

    The solution for sh I chose to use is from Chris Schroen and it is to use
    set and then the positional parameters ($1 $2 ..$9) to pull the data that I
    wanted.

    #!/bin/sh
    while read i
    do
            set `quota -v $i | tail -1`
            mailx -s "subject line" -r address $i <<EOT

    You have $5 $6 left until your mail will stop being delivered to your
    mailbox. Your quota is $3 Kb and you
    r current usage is $2 Kb.
    EOT
    done </usr/local/tools/gtest.users

    A variation on this is:

    line="`quota -v $i | tail -1`"
    set - $line
    fs=$1; usage=$2; etc...

    Another solution add a while/do:

    #!/bin/sh
    for i in `cat /usr/local/tools/gtest.users` ; do
     
          quota -v $i | tail -1 | while read fs usage qta limit time left files
    quota limit1
              do
                  mailx -s "subject line" -r address $i <<EOT
     
    You have $time $left left until your mail will stop being delivered to your
    mailbox. Your quota is $qta Kb and you
    r current usage is $usage Kb.
    EOT
              done
    done

    Another workaround is to run everything in a subshell,

    for ...; do
            quota -v $i | tail -1 | ( read fs usage qta limit time left files
                mailx -s "subject line" -r address $i <<EOT
    You have $time $left left until your mail will stop being delivered to your
    mailbox. Your quota is $qta Kb and you
    r current usage is $usage Kb.
    EOT
            )
    done

    A couple of web sites recommended with good info on scripting:

    http://www.unixguide.net/
    http://laku19.adsl.netsonic.fi/era/unix/award.html

    Mats Oberg and Alex Stade sent versions in Perl. I have not tested them.

    #!/path/to/perl

    $name=$ARGV[0];
    if ( $name eq "" ) {die "Usage: $0 <filesystem>\n";}

    open(QUOTA,"/usr/sbin/repquota $name |") or die "Unable to execute the
    repquota command...\n";
    $i=0;
    print "$name \n";
    while(<QUOTA>)
            {
            @A=split;
            if( $A[1]=~/\+\-/ ) {
                    if ( $A[5]=~/EXPIRED/ ) {
                            open(MAIL,"|mailx -s \"$A[0], Your quota gracetime
    has expired\" $A[0]");
                            print MAIL "You have exceeded the quota limit for
    your unix home-directory. \nThe limit of your home-directory is: $A[3] kb,
    you currently occupy: $A[2] kb\n\n";
                            print MAIL "The gracetime has expired, until you
    have decreased the data to less than $A[3] kilobytes, you can no longer
    write anything to your home-directory.\n(If you can't remove enough data on
    your own, please contact the helpdesk)\n";
                            }
                    elsif ( $A[5]=~/NOT/ ) {
                            open(MAIL,"|mailx -s \"$A[0], is over the quota
    limit\" obergmat");
                            print MAIL "You still have time to decrease the
    amount of data.\nWhen the gracetime expires you will not be able to write
    anything to your home-directory.\n(You could possibly be thrown out and be
    unable to log in.)\n";
                            }
                    else {
                            open(MAIL,"|mailx -s \"$A[0], You are over the
    quota limit\" $A[0]");
                            print MAIL "You have exceeded the quota limit for
    your unix home-directory. \nThe limit of your home-directory is: $A[3] kb,
    you currently occupy: $A[2] kb\n\n";
                            print MAIL "You still have $A[5] $A[6] to decrease
    the amount of data.\nWhen the gracetime expires you will not be able to
    write anything to your home-directory.\n(You could possibly be thrown out
    and be unable to log in.)\n";
                            }
                    print MAIL "\n\nFor more info about quotas see
    http://some.adress.com ---- Servicedesk tel: our phonenr...\n\n";
                    close(MAIL);
                    }
            }
    close(QUOTA);

    #!/usr/bin/perl -w

    $file = "/usr/local/tools/gtest.users";

    die "Can't open $file: $!\n"
             unless open (FILE, "$file");

    while ($line = <FILE>)
    {
             chomp $line;
             my @junk = `quota -v $line`;
             @quota = split (/\s+/, $junk[2]);
             if ($quota[1] >= $quota[2])
             {
                     open (MAIL, "| Mail \"Your account on Muse is
    over-quota\" $line");
                     print MAIL "You are over your quota on Muse. You are
    currently in the grace period which still allows for delivery of your
    e-mail. Please remove files or delete old mail. Lack of action will
    result in lost e-mail and the inability to upload files to your account.
    You have $quota[5] day(s) left until your e-mail will stop being
    delivered to your mailbox.\nThe Helpdesk can be reached at (661)
    253-7887 or at helpdesk\@calarts.edu.\nThank you.";
             }
    }

    A few others gave general tip s for scripting which I will keep for future
    reference. Thanks again to all who replied.

    Original message:

    >Below is a script I am trying to make work but I just can't seem to make it
    >right. The purpose is to send an e-mail to a user who is over their quota
    >and still in the grace period to alert them. I want to include some user
    >specific details like timeleft usage and quota. The catted file is just
    >some test names I set up.
    >
    >I do not seem to get any values using read. Everything seems to be null.
    >This user is over-quota (I made it so). Below is the output to quota -v
    >user. The echos were just to test the vars. Solaris 8. Any help would be
    >appreciated.
    >
    >#!/bin/sh
    >
    > for i in `cat /usr/local/tools/gtest.users` ; do
    >
    > quota -v $i | tail -1 | read fs usage qta limit timeleft files
    >quota limit1
    >
    > echo "$REPLY"
    > echo "$fs"
    > echo `$usage`
    > echo '$qta'
    > echo ${limit}
    > echo $timeleft
    > echo $files
    >
    > mailx -s "Your account on Muse is over-quota" -r
    >helpdesk@calarts.edu $i <<EOT
    >
    >You are over your quota on Muse. You are currently in the grace period
    >which still allows delivery of your e-mail. Please remove files or delete
    >old mail. Lack of action will result in lost e-mail and the inability to
    >upload files to your account. You have $timeleft left until your mail will
    >stop being delivered to your mailbox.
    >
    >The Helpdesk can be reached at 661 253 7887 or at helpdesk@calarts.edu.
    >Thank you.
    >
    >EOT
    >
    >done
    >
    >
    >
    ># quota -v jcraford
    >Disk quotas for jcraford (uid 2709):
    >Filesystem usage quota limit timeleft files quota limit
    >timeleft
    >/export 25734 20000 55000 6.9 days 73 0 0

    -- 
    Karyn Williams
    Network Services Manager
    California Institute of the Arts
    karyn@calarts.edu
    http://www.calarts.edu/network
    _______________________________________________
    sunmanagers mailing list
    sunmanagers@sunmanagers.org
    http://www.sunmanagers.org/mailman/listinfo/sunmanagers
    

  • Next message: egold_at_fsa.com: "need to create a gui front end for my scripts."

    Relevant Pages

    • Re: Other ways than quotas to limit mail files size ??
      ... Exim can do quotas. ... I've never actually used the quota system myself in Exim but it sounds ... mailboxes, of course, an interlock is a necessity. ... before it changes uid for the delivery. ...
      (freebsd-questions)
    • Re: inbox of last resort (uw-imap)
      ... creation + append to INBOX). ... This is because the IMAP-style append call (used by both dmail and tmail) requires knowledge of the size of the message being delivered; thus, the entire message needs to be collected. ... If delivery fails to a non-INBOX destination, a retry is done to INBOX. ... The bottom line is to spend the extra $.05 to double the user's disk quota and get the message through. ...
      (comp.mail.imap)
    • Wrong Quota Usage calculation
      ... I'm having a strange problem where disk usage in the Quota Report shows the wrong amount. ... Another users have more extreme differences. ...
      (microsoft.public.win2000.general)
    • Re: Elastic Quota File System (EQFS)
      ... A is using 20 megs and user B is running out of his quota. ... D disk threshold; thats the amount of disk space admin wants to allow the ... the usage pattern followed by the users. ... admin can allocate different quotas for different ...
      (Linux-Kernel)
    • Re: Not enough free space, disk full
      ... Check their usage and disk quotas (right-click the disk, properties, Quota ... click Quota Entries near the bottom to see all usage - you can double ...
      (microsoft.public.windows.server.sbs)