Skip to content

Instantly share code, notes, and snippets.

@poberwong
Forked from VincentSit/update_gfwlist.sh
Created September 20, 2016 03:10
Show Gist options
  • Save poberwong/afdc6bcfda83eedb6ad4e906c07977e7 to your computer and use it in GitHub Desktop.
Save poberwong/afdc6bcfda83eedb6ad4e906c07977e7 to your computer and use it in GitHub Desktop.
Automatically update the PAC for ShadowsocksX. Only tested on OS X.
#!/bin/bash
# update_gfwlist.sh
# Author : VincentSit
# Copyright (c) http://xuexuefeng.com
#
# Example usage
#
# ./whatever-you-name-this.sh
#
# Task Scheduling (Optional)
#
# crontab -e
#
# add:
# 30 9 * * * sh /path/whatever-you-name-this.sh
#
# Now it will update the PAC at 9:30 every day.
#
# Remember to chmod +x the script.
GFWLIST="https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"
PROXY="127.0.0.1:1080"
USER_RULE_NAME="user-rule.txt"
check_module_installed()
{
pip list | grep gfwlist2pac &> /dev/null
if [ $? -eq 1 ]; then
echo "Installing gfwlist2pac."
pip install gfwlist2pac
fi
}
update_gfwlist()
{
echo "Downloading gfwlist."
curl -s "$GFWLIST" --fail --socks5-hostname "$PROXY" --output /tmp/gfwlist.txt
if [[ $? -ne 0 ]]; then
echo "abort due to error occurred."
exit 1
fi
cd ~/.ShadowsocksX || exit 1
if [ -f "gfwlist.js" ]; then
mv gfwlist.js ~/.Trash
fi
if [ ! -f $USER_RULE_NAME ]; then
touch $USER_RULE_NAME
fi
/usr/local/bin/gfwlist2pac \
--input /tmp/gfwlist.txt \
--file gfwlist.js \
--proxy "SOCKS5 $PROXY; SOCKS $PROXY; DIRECT" \
--user-rule $USER_RULE_NAME \
--precise
rm -f /tmp/gfwlist.txt
echo "Updated."
}
check_module_installed
update_gfwlist
@poberwong
Copy link
Author

poberwong commented Sep 20, 2016

  1. install gfwlist2pac
    sudo easy_install pip
    sudo pip install gfwlist2pac
  2. run script to generate gfwlist.js
    sudo ./update_gfwlist.sh
  3. use gfwlist2pac to generate PAC from gfwlist.js
    gfwlist2pac -i gfwlist.js -f PAC -p PROXY (Of course you can find the command in 1)

Note: All of above paths are relative paths,you should use specific path which depends on where you are

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment