Git Product home page Git Product logo

pypacer's Introduction

Generate auto proxy config files (PAC) from a declaration

Tests


This package aims to make it possible to create simple proxy scripts declaratively. It will never cover all the subtleties. If you have unusual requirements, it is better to write the proxy script directly in JavaScript

Usage

You can install the package with pip.

pip install paccreator

You can also load the script directly from github with pip.

pip install git+https://github.com/73h/paccreator.git@main#egg=paccreator

Create a file called myproxy.yaml and define your proxy rules in it like this.

description: A description of proxy script # (optional, default=pac file for my company)
version: The version of proxy script # (optional, default=0.1)
proxies:
  - route: DIRECT
    description: A description of proxy # (optional, default=use this proxy)
    tags: # (optional) Here you can add any comments you like, which you can use to filter later. However, there are also standard annotations.
      - default # (optional) This marks the proxy as default if no other condition applies. if no default proxy is available, the first one is used.
      - catch-plain-hostnames # (optional) This proxy applies if there is no domain name in the hostname (no dots). You should not annotate this on several proxies.
    targets:
      - example.com
      - foo.example.com
      - .example.net
      # You can also use a network mask, ip-addresses, hosts or strings
  - route: PROXY proxy1.example.com:80; DIRECT
    targets:
      - 10.0.0.0/8

Run this in python.

import os
from paccreator import PacCreator

p = PacCreator()
with open(os.path.join("myproxy.yaml"), "r") as f:
    p.load_from_yaml(f.read())
    print(p.output())

You can also use with contextmanager.

import os
from paccreator import load_from_yaml

with open(os.path.join("myproxy.yaml"), "r") as f:
    with load_from_yaml(f.read()) as p:
        print(p.output())

Examples

A simple Example for a random company

yaml file

description: Simple proxy
proxies:
  - description: use direct connection
    route: DIRECT
    targets:
      - 10.0.0.0/8
      - .my-company.com
  - description: use my proxy
    route: PROXY proxy.my-company.com:80
    tags:
      - default
    targets:
      - www.my-company.com
      - contact.my-company.com
  - description: use the special proxy
    route: PROXY proxy.my-company.com:8080
    targets:
      - datacenter.my-company.com

As a result, you can see that it has resolved the overlap between .my-company.com and, for example, contact.my-company.com by first evaluating the exact subdomains. The network mask 10.0.0.0/8 was placed at the end to avoid DNS queries when they are not necessary.

function FindProxyForURL(url, host) {
    /*
        Description: Simple proxy
        Version: 0.1
    */
    host = host.toLowerCase();
    if (
        localHostOrDomainIs(host, "www.my-company.com")
        || localHostOrDomainIs(host, "contact.my-company.com")
    ) {
        /* use my proxy */
        return "PROXY proxy.my-company.com:80";
    }
    if (
        localHostOrDomainIs(host, "datacenter.my-company.com")
    ) {
        /* use the special proxy */
        return "PROXY proxy.my-company.com:8080";
    }
    if (
        dnsDomainIs(host, ".my-company.com")
    ) {
        /* use direct connection */
        return "DIRECT";
    }
    if (
        isInNet(host, "10.0.0.0", "255.0.0.0")
    ) {
        /* use direct connection */
        return "DIRECT";
    }
    /* Default: use my proxy */
    return "PROXY proxy.my-company.com:80";
}

Unit Tests Example

You can see all the options supported so far in the test examples.

pypacer's People

Contributors

73h avatar

Stargazers

 avatar ‮rekcäH nitraM‮ avatar

Watchers

 avatar

Forkers

dwt

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.