
dysolve
Novice
Jul 17, 2009, 7:44 AM
Post #2 of 8
(453 views)
|
|
Re: [dysolve] writing to .pl file
[In reply to]
|
Can't Post
|
|
the script is: #!/usr/bin/perl # netgps.pl # Robert Pepper <robert@peppernet.org> # Version 1.1 # Use at your own risk. Email problems to root@127.0.0.1 # ----- User defined my $filedir = '/cgi/'; # NOT in the webroot! my $maxlength = 10; # max length of usernames # ----- Other variables, don't mess with them my $username = ''; my $password = ''; my $mode = ''; my $result = 1; my $returncode = ''; my $coords = ''; my $filename = ''; my %FORM = ''; #----------------------------------- print "Content-type: text/plain\n\n"; &parseget(); ($username,$password) = &getid($FORM{'un'},$FORM{'pw'}); # Filename controlled for security, can modify pre/suffix. $filename = "ng-".$username.".txt"; # Decide what to do if ($FORM{'cds'}) { $mode = 'remote'; $coords = &validateNMEA($FORM{'cds'}); &remote; $result = 'GPSOK'; } else { $mode = 'recv'; $result = &receiver($username); $result = "GPSOK$coords"; } print "$result"; #---------------------------------- # ** Subs ** #---------------------------------- #---------------------------------- # It's all gone wrong! sub failed() { my $error = shift; print "GPSERROR:$error:\n\n"; exit 0; } #---------------------------------- # Remote is calling, supplying coords. sub remote() { if (-e "$filedir$filename") { my $filecont = ''; my $pwd2 = ''; open FNAME, "$filedir$filename" or &failed("Proc error: RCV-FN1"); $filecont = <FNAME> or &failed("Proc error: RCV-FN2"); close FNAME or &failed("Proc error: RCV-FN3"); ($pwd2,) = split /\@/, $filecont; if ($pwd2 ne $password) { &failed("Incorrect password/unknown username."); } } open FNAME, ">$filedir$filename" or &failed("{Proc error: REM-FN1"); print FNAME "$password\@$coords\n" or &failed("Proc error: REM-FN2"); close FNAME or &failed("Proc error: REM-FN3"); } #---------------------------------- # Receiver is calling, wanting coords. Also validate password. sub receiver() { my $filecont = ''; my $pwd2 = ''; open FNAME, "$filedir$filename" or &failed("Proc error: RCV-FN1"); $filecont = <FNAME> or &failed("Proc error: RCV-FN2"); close FNAME or &failed("Proc error: RCV-FN3"); ($pwd2,$coords) = split /\@/, $filecont; if ($pwd2 ne $password) { &failed("Incorrect password/unknown username."); } } #---------------------------------- # Validate username sub getid() { ($uname,$pwd) = @_; # we don't want overly long names for security. if (length($uname) > $maxlength or length($pwd) > $maxlength) { &failed("Incorrect password/unknown username."); } # only allow a-z, A-Z and 0-9 as usernames. if ($uname!~/^[a-zA-Z0-9]+$/) { &failed("Incorrect password/unknown username."); } # be a bit more generous for passwords if ($pwd!~/^[a-zA-Z0-9\-]+$/) { &failed("Incorrect password/unknown username."); } return ($uname,$pwd); } #ERR:Invalid NMEA data: '$GPRMC,143238,V,3731.0466,S,14523.8828,E,37.8,191.0,201202,11.8,E,S*0B' Code IV: #---------------------------------- # Validate NMEA string sub validateNMEA() { my $cds = shift; # NMEA sentences should be no more than 82 chars if (length($cds) > 82) { &failed("Invalid NMEA data: '$cds' Code L"); } # Regex to match four NMEA sentences #if ( $cds=~/^(\$GP(RMC|GSA|GSV|GGA)[ABCDFVMNESW0-9\,\*\.]+)$/ ) { if ( $cds=~/^(\$GP(RMC|GSA|GSV|GGA)[AVMNESW0-9\,\.]+\*[ABCDEF0-9][ABCDEF0-9]?)$/ ) { return $1; } else { &failed("Invalid NMEA data: '$cds' Code IV"); } } #---------------------------------- # Parse GET data sub parseget() { my @pairs; my $name, $value; @pairs = split(/&/, $ENV{'QUERY_STRING'}); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/<(([^>])*)>//g; $FORM{$name} = $value; } } thanks any any help would be great
|