Advertisement
rs232

p2partisan 2.40

Jul 7th, 2014
442
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 17.15 KB | None | 0 0
  1. #!/bin/sh
  2. #
  3. # p2partisan v2.40 (07/07/2014)
  4. #
  5. # <CONFIGURATION> ###########################################
  6. # Adjust location where the files are kept
  7. P2Partisandir=/cifs1/p2partisan
  8. #
  9. # Edit the file "blacklists" to customise if needed
  10. # Edit the "whitelist" to overwrite the blacklist if needed
  11. #
  12. # Enable logging? Use only for troubleshooting. 0=off 1=on
  13. syslogs=1
  14. # Maximum number of logs to be recorded in a given 60 min
  15. # Consider set this very low (like 3 or 6) once your are
  16. # happy with the installation. To troubleshoot blocked
  17. # connection close all the secondary traffic e.g. p2p
  18. # and try a connection to the blocked site/port you should
  19. # find a reference in the logs.
  20. maxloghour=1
  21. #
  22. # What do you want to block?
  23. # 1) Input (Router only, does your generate P2P traffic?)
  24. # 2) LAN (LAN clients only)
  25. # 3) Both *default
  26. protection=3
  27. #
  28. # ports to be whitelisted. Whitelisted ports will never be
  29. # blocked no matter what the source/destination IP is.
  30. # This is very important if you're running a service like
  31. # e.g. SMTP/HTTP/IMAP/else. Separate value in the list below
  32. # with commas - NOTE: Leave 80 and 443 untouched, add custom ports only
  33. # you might want to add remote admin and VPN ports here if any.
  34. # Standard iptables syntax, number divided by "," or ":" for a range
  35. # e.g. 80,443,2100:21300. Note: maximum 15 references as per
  36. # iptables --multiport limitation
  37. whiteports="21,25,53,80,443,1194:1196"
  38. #
  39. # Fastrouting will process the IP classes very quickly but use
  40. # Lot of resources. If you disable the effect is transparent
  41. # but the full process will take minutes rather than seconds
  42. # 0=disabled 1=enabled
  43. fastroutine=1
  44. #
  45. # Enable check on script availability to help autorun
  46. # E.g. wait for the file to be available in cifs before run it
  47. # instead of quit with a file missing error
  48. autorun_availability_check=1
  49. #
  50. # Schedule updates? (once a week is plenty)
  51. schedule="30 4 * * 1"
  52. #
  53. testip="8.8.8.8"
  54. # </CONFIGURATION> ###########################################
  55.  
  56. # Wait until Internet is available
  57.     while :
  58.     do
  59.         ping -c 3 $testip >/dev/null 2>&1
  60.         if [ $? = 0 ]; then
  61.             break
  62.         fi
  63.         sleep 2
  64.     done
  65.  
  66. pidfile=/var/run/p2partisan.pid
  67. cd $P2Partisandir
  68. version=`head -3 ./p2partisan.sh | tail -1 | cut -f 3- -d " "`
  69.  
  70. alias ipset='/bin/nice -n19 /usr/sbin/ipset'
  71. alias sed='/bin/nice -n19 /bin/sed'
  72. alias iptables='/usr/sbin/iptables'
  73. alias service='/sbin/service'
  74. alias plog='logger -t P2PARTISAN -s'
  75. now=`date +"%H:%M:%S - %d/%m/%y"`
  76. wanif=`nvram get wan_ifname`
  77.  
  78.  
  79. psoftstop() {
  80.     ./iptables-del 2> /dev/null
  81.     plog "Stopping P2Partisan"
  82.     [ -f $pidfile ] && rm -f "$pidfile" 2> /dev/null
  83. }
  84.  
  85. pblock() {
  86.     plog "P2PArtisan: Applying paranoia block"
  87.     iptables -N PARANOIA-DROP 2> /dev/null
  88.     iptables -A PARANOIA-DROP -p tcp --match multiport --sports $whiteports -j ACCEPT 2> /dev/null
  89.     iptables -A PARANOIA-DROP -p udp --match multiport --sports $whiteports -j ACCEPT 2> /dev/null
  90.     iptables -A PARANOIA-DROP -p tcp --match multiport --dports $whiteports -j ACCEPT 2> /dev/null
  91.     iptables -A PARANOIA-DROP -p udp --match multiport --dports $whiteports -j ACCEPT 2> /dev/null
  92.     iptables -A PARANOIA-DROP -m limit --limit $maxloghour/hour --limit-burst 5 -j LOG --log-prefix "P2Partisan Dropped (paranoia): " --log-level 1 2> /dev/null
  93.     iptables -A PARANOIA-DROP -j DROP 2> /dev/null
  94.     iptables -I wanin 1 -i $wanif -m state --state NEW -j PARANOIA-DROP 2> /dev/null
  95.     iptables -I wanout 1 -o $wanif -m state --state NEW -j PARANOIA-DROP 2> /dev/null
  96.     iptables -I INPUT 1 -i $wanif -m state --state NEW -j PARANOIA-DROP 2> /dev/null
  97.     iptables -I OUTPUT 1 -o $wanif -m state --state NEW -j PARANOIA-DROP 2> /dev/null
  98. }
  99.  
  100. punblock() {
  101.     while iptables -L wanin 2> /dev/null | grep "PARANOIA-DROP"
  102.     do
  103.         iptables -D wanin -i $wanif -m state --state NEW -j PARANOIA-DROP 2> /dev/null
  104.     done
  105.     while iptables -L wanout 2> /dev/null | grep "PARANOIA-DROP"
  106.     do
  107.         iptables -D wanout -o $wanif -m state --state NEW -j PARANOIA-DROP 2> /dev/null
  108.     done
  109.     while iptables -L INPUT 2> /dev/null | grep "PARANOIA-DROP"
  110.     do
  111.         iptables -D INPUT -i $wanif -m state --state NEW -j PARANOIA-DROP 2> /dev/null
  112.     done
  113.     while iptables -L OUTPUT 2> /dev/null | grep "PARANOIA-DROP"
  114.     do
  115.         iptables -D OUTPUT -o $wanif -m state --state NEW -j PARANOIA-DROP 2> /dev/null
  116.     done
  117.     iptables -F PARANOIA-DROP 2> /dev/null && plog "P2PArtisan: Removing paranoia block"
  118.     iptables -X PARANOIA-DROP 2> /dev/null
  119. }
  120.  
  121. pforcestop() {
  122.     while iptables -L wanin 2> /dev/null | grep P2PARTISAN-IN
  123.     do
  124.         iptables -D wanin -i $wanif -m state --state NEW -j P2PARTISAN-IN 2> /dev/null
  125.     done
  126.     while iptables -L wanout 2> /dev/null | grep P2PARTISAN-OUT
  127.     do
  128.         iptables -D wanout -o $wanif -m state --state NEW -j P2PARTISAN-OUT 2> /dev/null
  129.     done
  130.     while iptables -L INPUT | grep P2PARTISAN-IN
  131.     do
  132.         iptables -D INPUT -i $wanif -m state --state NEW -j P2PARTISAN-IN 2> /dev/null
  133.     done
  134.     while iptables -L OUTPUT | grep P2PARTISAN-OUT
  135.     do
  136.         iptables -D OUTPUT -o $wanif -m state --state NEW -j P2PARTISAN-OUT 2> /dev/null
  137.     done
  138.     iptables -F P2PARTISAN-DROP 2> /dev/null
  139.     iptables -F P2PARTISAN-IN 2> /dev/null
  140.     iptables -F P2PARTISAN-OUT 2> /dev/null
  141.     iptables -X P2PARTISAN-DROP 2> /dev/null   
  142.     iptables -X P2PARTISAN-IN 2> /dev/null
  143.     iptables -X P2PARTISAN-OUT 2> /dev/null
  144.     ipset -F
  145.     for i in `ipset --list | grep Name | cut -f2 -d ":" `; do
  146.         ipset -X $i
  147.     done
  148.     chmod 777 ./*.gz
  149.     [ -f iptables-add ] && rm iptables-add
  150.     [ -f iptables-del ] && rm iptables-del
  151.     [ -f ipset-del ] && rm ipset-del
  152.     [ -f $pidfile ] && rm -f "$pidfile" 2> /dev/null
  153. plog "Unloading ipset modules"
  154.     lsmod | grep "ipt_set" > /dev/null 2>&1 && sleep 2 ; rmmod -f ipt_set 2> /dev/null
  155.     lsmod | grep "ip_set_iptreemap" > /dev/null 2>&1 && sleep 2 ; rmmod -f ip_set_iptreemap 2> /dev/null
  156.     lsmod | grep "ip_set" > /dev/null 2>&1 && sleep 2 ; rmmod -f ip_set 2> /dev/null
  157. plog "Stopping P2Partisan"
  158. }
  159.  
  160. pstatus() {
  161.     running3=`iptables -L | grep P2PARTISAN-IN  2> /dev/null | wc -l`
  162.     running4=`[ -f $pidfile ] && echo 1 || echo 0`
  163.     running5=`nvram get script_fire | grep p2partisan >/dev/null && echo Yes || echo No`
  164.     running6=`cru l | grep P2Partisan-update >/dev/null && echo Yes || echo No`
  165.     running7=`tail -200 /var/log/messages | grep Dropped | tail -1`
  166.    
  167.     from=`head -1 ./iptables-add 2> /dev/null | cut -c3-`
  168.     drop_packet_count=`iptables -vL P2PARTISAN-DROP 2> /dev/null| grep " DROP " | awk '{print $1}'`
  169.    
  170.     if [[ $running3 -eq "0" ]] && [[ $running4 -eq "0" ]]; then
  171.         running8=No
  172.     elif [[ $running3 -eq "0" ]] && [[ $running4 -eq "1" ]]; then
  173.         running8=Loading...
  174.     elif [[ $running3 -gt "0" ]] && [[ $running4 -eq "0" ]]; then
  175.         running8=Not quite... try to run \"p2partisan.sh update\"
  176.     else
  177.         running8=Yes
  178.     fi
  179.    
  180.     echo "################### P2Partisan ##########################
  181. #   Release version: $version
  182. ################# P2Partisan status #####################
  183. #   P2Partisan running:   $running8
  184. #   P2Partisan autorun:   $running5
  185. #   P2Partisan scheduled: $running6
  186. #########################################################
  187. #   P2Partisan activity since: $from
  188. #   Dropped connections: $drop_packet_count
  189. ################# Last log recorded #####################
  190. #   Remember your max logs per hour is set to: $maxloghour
  191. $running7
  192. #########################################################"
  193. }
  194.  
  195. if [ $autorun_availability_check = 1 ]; then
  196. av="while true; do [ -f $P2Partisandir/p2partisan.sh ] && break || sleep 5; done ;"
  197. fi
  198.  
  199. pautorunset() {
  200.     p=`nvram get script_fire | grep "p2partisan.sh" | grep -v cru | wc -l`
  201.     if [ $p -eq "0" ] ; then
  202.         t=`nvram get script_fire`; t=`printf "$t\n$av$P2Partisandir/p2partisan.sh\n"` ; nvram set "script_fire=$t"
  203.     fi
  204.     plog "P2Partisan AUTO RUN is ON"
  205.     nvram commit
  206. }
  207.  
  208. pautorununset() {
  209.     p=`nvram get script_fire | grep "p2partisan.sh" | grep -v cru | wc -l`
  210.     if [ $p -eq "1" ]; then
  211.     t=`nvram get script_fire`; t=`printf "$t\n$P2Partisandir/p2partisan.sh\n" | grep -v p2partisan` ; nvram set "script_fire=$t"
  212.     fi
  213.     plog "P2Partisan AUTO RUN is OFF"
  214.     nvram commit
  215. }
  216.  
  217. pscheduleset() {
  218.     cru d P2Partisan-update
  219.     cru a P2Partisan-update "$schedule $P2Partisandir/p2partisan.sh paranoia-update"
  220.     pp=`nvram get script_fire | grep "p2partisan.sh" | grep -v cru | wc -l`
  221.     p=`nvram get script_fire | grep "cru a P2Partisan-update" | wc -l`
  222.     if [ $p -eq "0" ] ; then
  223.         if [ $pp -eq "0" ]; then
  224.         t=`nvram get script_fire`; t=`printf "$t\ncru a P2Partisan-update \"$schedule $P2Partisandir/p2partisan.sh paranoia-update\"\n"` ; nvram set "script_fire=$t"
  225.         else
  226.         pautorununset
  227.         t=`nvram get script_fire`; t=`printf "$t\ncru a P2Partisan-update \"$schedule $P2Partisandir/p2partisan.sh paranoia-update\"\n"` ; nvram set "script_fire=$t"
  228.         pautorunset
  229.         fi
  230.     fi
  231.     plog "P2Partisan AUTO UPDATE is ON"
  232.     nvram commit
  233. }
  234.  
  235. pscheduleunset() {
  236.     cru d P2Partisan-update
  237.     p=`nvram get script_fire | grep "cru a P2Partisan-update" | wc -l`
  238.     if [ $p -eq "1" ] ; then
  239.     t=`nvram get script_fire`; t=`printf "$t\ncru a P2Partisan-update \"$schedule $P2Partisandir/p2partisan.sh paranoia-update\"\n" | grep -v "cru a P2Partisan-update"` ; nvram set "script_fire=$t"
  240.     fi
  241.     plog "P2Partisan AUTO UPDATE is OFF"
  242.     nvram commit
  243. }
  244.  
  245. pstart() {
  246.     running3=`iptables -L | grep P2PARTISAN-IN  2> /dev/null | wc -l`
  247.     running4=`[ -f $pidfile ] && echo 1 || echo 0`
  248.     if [[ $running3 -eq "0" ]] || [[ $running4 -eq "0" ]] ; then
  249.  
  250.     echo $$ > $pidfile
  251.  
  252.     sleep 2
  253.    
  254.     [ -f iptables-add ] && rm iptables-add
  255.     [ -f iptables-del ] && rm iptables-del
  256.     [ -f ipset-del ] && rm ipset-del
  257.      
  258.     echo "### PREPARATION ###"
  259.     echo "Loading the ipset modules"
  260.     lsmod | grep "ip_set" > /dev/null 2>&1 || insmod ip_set
  261.     lsmod | grep "ip_set_iptreemap" > /dev/null 2>&1 || insmod ip_set_iptreemap
  262.     lsmod | grep "ipt_set" > /dev/null 2>&1 || insmod ipt_set
  263.  
  264. counter=0
  265. pos=1
  266.         echo "loading ports $whiteports exemption"
  267.  
  268.    
  269.         echo "# $now
  270. iptables -N P2PARTISAN-IN 2> /dev/null
  271. iptables -N P2PARTISAN-OUT 2> /dev/null
  272. iptables -N P2PARTISAN-DROP 2> /dev/null
  273. iptables -F P2PARTISAN-IN 2> /dev/null
  274. iptables -F P2PARTISAN-OUT 2> /dev/null
  275. iptables -F P2PARTISAN-DROP 2> /dev/null
  276. iptables -A P2PARTISAN-IN -p tcp --match multiport --sports $whiteports -j ACCEPT 2> /dev/null
  277. iptables -A P2PARTISAN-IN -p udp --match multiport --sports $whiteports -j ACCEPT 2> /dev/null
  278. iptables -A P2PARTISAN-IN -p tcp --match multiport --dports $whiteports -j ACCEPT 2> /dev/null
  279. iptables -A P2PARTISAN-IN -p udp --match multiport --dports $whiteports -j ACCEPT 2> /dev/null
  280. iptables -A P2PARTISAN-OUT -p tcp --match multiport --sports $whiteports -j ACCEPT 2> /dev/null
  281. iptables -A P2PARTISAN-OUT -p udp --match multiport --sports $whiteports -j ACCEPT 2> /dev/null
  282. iptables -A P2PARTISAN-OUT -p tcp --match multiport --dports $whiteports -j ACCEPT 2> /dev/null
  283. iptables -A P2PARTISAN-OUT -p udp --match multiport --dports $whiteports -j ACCEPT 2> /dev/null" >> iptables-add
  284.  
  285.  
  286.         echo "# $now
  287. iptables -D wanin -i $wanif -m state --state NEW -j P2PARTISAN-IN 2> /dev/null
  288. iptables -D wanout -o $wanif -m state --state NEW -j P2PARTISAN-OUT 2> /dev/null
  289. iptables -D INPUT -i $wanif -m state --state NEW -j P2PARTISAN-IN 2> /dev/null
  290. iptables -D OUTPUT -o $wanif -m state --state NEW -j P2PARTISAN-OUT 2> /dev/null
  291. iptables -F P2PARTISAN-DROP 2> /dev/null
  292. iptables -F P2PARTISAN-IN 2> /dev/null
  293. iptables -F P2PARTISAN-OUT 2> /dev/null
  294. iptables -X P2PARTISAN-IN 2> /dev/null
  295. iptables -X P2PARTISAN-OUT 2> /dev/null
  296. iptables -X P2PARTISAN-DROP 2> /dev/null" >> iptables-del
  297.  
  298.  
  299. echo "### WHITELIST ###"
  300. echo "loading the whitelist"
  301. #Load the whitelist
  302. if [ "$(ipset --swap whitelist whitelist 2>&1 | grep 'Unknown set')" != "" ]
  303.     then
  304.     ipset --create whitelist iptreemap
  305.     cat whitelist | grep -v "^10." | grep -v "^172.16." | grep -v "^192.168." |
  306.     (
  307.     while read IP
  308.     do
  309.             echo "$IP" | grep "^#" >/dev/null 2>&1 && continue
  310.             echo "$IP" | grep "^$" >/dev/null 2>&1 && continue
  311.                     ipset -A whitelist $IP
  312.             done
  313.     )
  314. fi
  315.         echo "# $now
  316. ipset -F
  317. ipset -X whitelist" > ipset-del
  318.  
  319.             echo "Preparing the whitelist for the iptables"
  320.             echo "iptables -A P2PARTISAN-IN -m set --set whitelist src -j ACCEPT 2> /dev/null
  321. iptables -A P2PARTISAN-OUT -m set --set whitelist dst -j ACCEPT 2> /dev/null" >> iptables-add
  322.  
  323.         if [ $syslogs -eq "1" ]; then        
  324.             echo "iptables -A P2PARTISAN-DROP -m limit --limit $maxloghour/hour --limit-burst 1 -j LOG --log-prefix \"P2Partisan Dropped: \" --log-level 1 2> /dev/null" >> iptables-add
  325.         fi
  326.         echo "iptables -A P2PARTISAN-DROP -j DROP 2> /dev/null"  >> iptables-add
  327.  
  328.  
  329. echo "### BLACKLISTs ###"
  330.  
  331.  
  332.    
  333. cat blacklists |
  334.    (
  335.     while read line
  336.     do
  337.             echo "$line" | grep "^#" >/dev/null 2>&1 && continue
  338.             echo "$line" | grep "^$" >/dev/null 2>&1 && continue
  339.             counter=`expr $counter + 1`
  340.             name=`echo $line |cut -d ' ' -f1`
  341.             url=`echo $line |cut -d ' ' -f2`
  342.             echo "loading blacklist #$counter --> ***$name***"
  343.      
  344.     if [ $fastroutine -eq "1" ]; then
  345.      
  346.     if [ "$(ipset --swap $name $name 2>&1 | grep 'Unknown set')" != "" ]
  347.       then
  348.       [ -e $name.gz ] || wget -q -O $name.gz "$url"
  349.       { echo "-N $name iptreemap"
  350.         gunzip -c  $name.gz | \
  351.         sed -e "/^[\t ]*#.*\|^[\t ]*$/d;s/^.*:/-A $name /"
  352.         echo COMMIT
  353.       } | ipset -R
  354.     fi
  355.      
  356.     else
  357.      
  358.         if [ "$(ipset --swap $name $name 2>&1 | grep 'Unknown set')" != "" ]
  359.             then
  360.             ipset --create $name iptreemap
  361.             [ -e $name.lst ] || wget -q -O - "$url" | gunzip | cut -d: -f2 | grep -E "^[-0-9.]+$" > $name.lst
  362.             for IP in $(cat $name.lst)
  363.                     do
  364.                     ipset -A $name $IP
  365.                     done
  366.             fi
  367.              
  368.     fi
  369.  
  370.                 echo "ipset -X $name " >> ipset-del
  371.                 echo "iptables -A P2PARTISAN-IN -m set --set $name src -j P2PARTISAN-DROP 2> /dev/null
  372. iptables -A P2PARTISAN-OUT -m set --set $name dst -j P2PARTISAN-DROP 2> /dev/null" >> iptables-add 
  373.             done
  374.     )
  375.  
  376.  
  377.         if [ $protection -eq "1" ]; then
  378.             echo "iptables -I INPUT $pos -i $wanif -m state --state NEW -j P2PARTISAN-IN 2> /dev/null
  379. iptables -I OUTPUT $pos -o $wanif -m state --state NEW -j P2PARTISAN-OUT 2> /dev/null" >> iptables-add
  380.         elif [ $protection -eq "2" ]; then
  381.             echo "iptables -I wanin $pos -i $wanif -m state --state NEW -j P2PARTISAN-IN 2> /dev/null
  382. iptables -I wanout $pos -o $wanif -m state --state NEW -j P2PARTISAN-OUT 2> /dev/null" >> iptables-add
  383.         elif [ $protection -eq "3" ]; then
  384.             echo "iptables -I INPUT $pos -i $wanif -m state --state NEW -j P2PARTISAN-IN 2> /dev/null
  385. iptables -I OUTPUT $pos -o $wanif -m state --state NEW -j P2PARTISAN-OUT 2> /dev/null
  386. iptables -I wanin $pos -i $wanif -m state --state NEW -j P2PARTISAN-IN 2> /dev/null
  387. iptables -I wanout $pos -o $wanif -m state --state NEW -j P2PARTISAN-OUT 2> /dev/null" >> iptables-add
  388.         fi
  389.  
  390. chmod 777 ./iptables-*
  391. chmod 777 ./ipset-*
  392. ./iptables-add  #protecting
  393.  
  394. plog "... P2Partisan started."
  395.  
  396. p=`nvram get dnsmasq_custom | grep log-async | wc -l`
  397. if [ $p -eq "1" ]; then
  398.     plog "log-async found under dnsmasq -> OK"
  399. else
  400.     plog "
  401. It appears like you don't have a log-async parameter
  402. in your dnsmasq config. This is strongly suggested
  403. due to the amount of logs involved. please consider
  404. adding the following command under Advanced/DHCP/DNS
  405. /Dnsmasq Custom configuration
  406.  
  407. log-async=10
  408. "
  409. fi
  410.  
  411. punblock  #remove paranoia DROPs if any
  412.  
  413. else
  414.         echo "
  415.     It appears like P2Partisan is already running. Skipping...
  416.            
  417.     If this is not what you expected? Try:
  418.     p2partisan.sh update
  419.         "
  420.     fi
  421. }
  422.  
  423.  
  424. for p in $1
  425. do
  426. case "$p" in
  427.         "start")
  428.                 pstart
  429.                 exit
  430.                 ;;     
  431.         "stop")
  432.                 pforcestop
  433.                 exit
  434.                 ;;
  435.         "restart")
  436.                 pscheduleunset
  437.                 psoftstop
  438.                 pscheduleset
  439.                 ;;
  440.         "status")
  441.                 pstatus
  442.                 exit               
  443.                 ;;     
  444.         "update")
  445.                 pscheduleunset
  446.                 pforcestop
  447.                 pscheduleset
  448.                 ;;
  449.         "paranoia-update")
  450.                 pscheduleunset
  451.                 pblock
  452.                 pforcestop
  453.                 pscheduleset
  454.                 ;;
  455.         "autorun-on")
  456.                 pautorunset
  457.                 exit
  458.                 ;;
  459.         "autorun-off")
  460.                 pautorununset
  461.                 exit
  462.                 ;;
  463.         "autoupdate-on")
  464.                 pscheduleset
  465.                 exit
  466.                 ;;
  467.         "autoupdate-off")
  468.                 pscheduleunset
  469.                 exit
  470.                 ;;
  471.         "help")
  472.                 echo
  473. P2Partisan parameters:
  474.                
  475.     help        Display this text      
  476.     start       Starts the process (this runs also if no option
  477.             is provided)
  478.     stop        Stops P2Partisan
  479.     restart     Soft restart, quick, updates iptables only
  480.     update      Hard restart, slow removes p2partisan, updates
  481.             the lists and does a fresh start
  482.     paranoia-update Like update but blocks any new connection until
  483.             P2Partisan is running again
  484.     status      Display P2Partisan running status + extra info
  485.     autorun-on  Sets P2Partisan to boot with the router
  486.     autorun-off Sets P2Partisan not to boot with the router
  487.     autoupdate-on   Sets automatic updates on
  488.     autoupdate-off  Sets automatic updates off
  489.                 "
  490.                 exit
  491.                 ;;
  492.         *)
  493.                 echo "parameter not valid. please run:
  494.                
  495.     p2partisan.sh help
  496.     "
  497.                 exit
  498.             ;;
  499.  
  500. esac
  501. done
  502.  
  503. pstart
  504.  
  505. exit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement