Advertisement
rs232

p2partisan 2.32

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