#!/usr/bin/perl -w # ## ptkppp # ## a Perl/Tk PPP dialer frontend # ## (c) 1999 Lukas Ertl <lukas.ertl@gmx.at> # use Tk; ######################################################### # Configuration ## adjust to your needs # The path to the pppd(8) daemon $pppd = "/usr/sbin/pppd"; # Your modem device $device = "your modem device"; # The path to the chat(8) program $chat = "/usr/bin/chat"; # The phone number to dial $phone = "your phone number"; # $user and $remotename are usually defined in /etc/ppp/pap-secrets, i +n the # form: # username serveralias <password> $user = "your username to login"; $serveralias = "your serveralias as defined in /etc/ppp/pap-secrets"; # This is the full dial command, you may need to adjust it, see pppd(8 +) # and chat(8) $dialcommand = <<EOT; $pppd $device connect '$chat -v "" at\\&f1 OK atdt$phone CONNECT' 1152 +00 modem crtscts defaultroute user $user remotename $serveralias EOT $hangupcommand = "killall pppd"; # The file where connections are logged $logfile = "your logfile"; # The file that lists holidays, like # ... # Dec 25 # Dec 26 # ... # and so on $holidayfile = "your holidays file"; # The hour where 'cheap' time begins, in Austria this is 18h. $cheapbegin = 18; # The hour until 'cheap' time lasts. In Austria this is 8h, but we hav +e to # define 7, because we calculate until 7:59:59 h. $cheapend = 7; # The delay in seconds between impulses, during 'cheap' time. $impulse_delay_long = 360; # The delay in seconds between impulses, during normal time. $impulse_delay_short = 120; # Number of initial impulses that are counted when a connection is est +ablished $initial_impulse = 1; # Costs of one impulse. $impulse_cost = 1.116; # Your currency shorthand, fill in whatever you like. $currency = "ATS"; ## Configuration end # You don't need to change anything beyond. ######################################################### $credits = "-- Perl/Tk PPP --\nPPP dialer frontend"; $message = "Idle."; my $mw = MainWindow->new; %counter = ( 'window' => $mw, 'hrs' => 0, 'min' => 0, 'sec' => 0, 'time' => '00:00:00', 'stop' => 1 ); $program_name = $mw->Label(-textvariable => \$credits)->pack; $status = $mw->Label(-textvariable => \$message)->pack; $count = $mw->Label(-textvariable => \$counter{'time'})->pack; $dial_button = $mw->Button(-text => "Dial", -command => \&dial)->pack; $hangup_button = $mw->Button(-text => "Hangup", -command => \&hangup)->pack; $log_view_button = $mw->Button(-text => "Logfile", -command => \&logview)->pack; $exit_button = $mw->Button(-text => "Quit", -command => sub {exit} )->pack; $dial_button->configure(-width => 8); $hangup_button->configure(-width => 8); $log_view_button->configure(-width => 8); $exit_button->configure(-width => 8); MainLoop; sub dial { $counter{'hrs'} = $counter{'min'} = $counter{'sec'} = 0; $status = system("$dialcommand"); die $! unless ($status == 0); $message = "Running..."; if ($counter{'stop'}) { $counter{'stop'} = 0; &switch; } } sub hangup { open (LOG, ">> $logfile") || die $!; $status = system("$hangupcommand"); die $! unless ($status == 0); $counter{'stop'} = 1; $today = localtime; print LOG "$today : hangup after $counter{'time'}\n"; $message = "Inactive..."; close (LOG); } sub switch { return if $counter{'stop'}; if ($counter{'sec'} > 59) { $counter{'sec'} = 0; $counter{'min'}++; } if ($counter{'min'} > 59) { $counter{'min'} = 0; $counter{'hrs'}++; } $counter{'time'} = sprintf("%02d:%02d:%02d", $counter{'hrs'}, $counter{'min'}, $counter{'sec'}); $counter{'window'}->after(1000, \&switch); $counter{'sec'}++; } sub logview { my ($total_hrs, $total_min, $total_sec, $impuls_sum) = 0; my @lines = (); my $logview = $mw->Toplevel(); my $top = $logview->Frame()->pack; my $bottom = $logview->Frame()->pack; my $clear_button = $bottom->Button(-text => "Clear log", -command => \&clear_log)->pack; open (LOG, "$logfile") || die $!; while (<LOG>) { next if /^\n/; chomp; if (/^(\w+)\s+(\w+)\s+(\d+)\s+(\d+):.+after\s+(\d+):(\d+):(\d+ +)$/) { $wday = $1; $month = $2; $day = $3; $downtime = $4; $total_hrs += $5; $total_min += $6; $total_sec += $7; checktime($downtime); checkday($wday, $month, $day); calc_impulse($5, $6, $7, $freizeit); $impuls_sum += $impulse; push @lines, $_; } } close (LOG) || die $!; my $listbox = $top->Scrolled('Listbox', -scrollbars => 'oe'); $listbox->insert('end', @lines); $listbox->configure(-width => 45); $listbox->pack; if ($total_sec > 59) { $sec = $total_sec % 60; $min_from_sec = int($total_sec / 60); $total_min += $min_from_sec; } if ($total_min > 59) { $min = $total_min % 60; $hrs_from_min = int($total_min / 60); $total_hrs += $hrs_from_min; } else { $min = $total_min; } $money = $impuls_sum * $impulse_cost; $output = sprintf("Total online time:\t%d:%02d:%02d\n\nTotal costs +: %d %s", $total_hrs, $min, $sec, $money, $currency); my $label = $bottom->Label(-textvariable => \$output)->pack; my $quit_button = $bottom->Button(-text => "Close", -command => sub { $logview->destroy })->pack; } sub clear_log { system("cp $logfile $logfile.old"); unlink("$logfile") || die $!; } sub checkday { my ($wday, $month, $day) = @_; if ($wday eq "Sat" || $wday eq "Sun") { return $freizeit = 1; } else { my $date = "$month $day"; open (HOLIDAYS, "$holidayfile") or die $!; while ($x = <HOLIDAYS>) { chomp $x; $x =~ /$month/ ? return $freizeit = 1 : return $freize +it = 0; } close (HOLIDAYS); } } sub checktime { my $time = shift; ($time >= $cheapbegin || $time <= $cheapend) ? return $freizeit = +1 : return $freizeit = 0; } sub calc_impulse { my $hours = shift; my $minutes = shift; my $seconds = shift; my $factor = shift; $minutes += $hours * 60; $seconds += $minutes * 60; if ($factor == 1) { $impulse = int($seconds / $impulse_delay_long) + $initial_impu +lse; return $impulse; } else { $impulse = int($seconds / $impulse_delay_short) + $initial_imp +ulse; return $impulse; } }

In reply to PTkPPP by le

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.