You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
330 lines
7.4 KiB
Python
330 lines
7.4 KiB
Python
6 years ago
|
"""
|
||
|
Main program for Net2Scripting.
|
||
|
"""
|
||
|
import os
|
||
|
import sys
|
||
|
import settings
|
||
|
import traceback
|
||
|
|
||
|
# This is just to force py2exe to include these packages
|
||
|
if False == True:
|
||
|
import net2xs
|
||
|
import net2dbxs
|
||
|
import network
|
||
|
# Not required but nice to have
|
||
|
import abc
|
||
|
import aifc
|
||
|
import antigravity
|
||
|
import argparse
|
||
|
import ast
|
||
|
import asynchat
|
||
|
import asyncio
|
||
|
import asyncore
|
||
|
import base64
|
||
|
import bdb
|
||
|
import binhex
|
||
|
import bisect
|
||
|
import bz2
|
||
|
import cProfile
|
||
|
import calendar
|
||
|
import cgi
|
||
|
import cgitb
|
||
|
import chunk
|
||
|
import cmd
|
||
|
import code
|
||
|
import codecs
|
||
|
import codeop
|
||
|
import collections
|
||
|
import colorsys
|
||
|
import compileall
|
||
|
import concurrent
|
||
|
import configparser
|
||
|
import contextlib
|
||
|
import copy
|
||
|
import copyreg
|
||
|
# import crypt
|
||
|
import csv
|
||
|
import ctypes
|
||
|
# import curses
|
||
|
import datetime
|
||
|
# import dbm
|
||
|
import decimal
|
||
|
import difflib
|
||
|
import dis
|
||
|
import distutils
|
||
|
import doctest
|
||
|
import threading
|
||
|
import email
|
||
|
import encodings
|
||
|
# import ensurepip
|
||
|
import enum
|
||
|
import filecmp
|
||
|
import fileinput
|
||
|
import fnmatch
|
||
|
import formatter
|
||
|
import fractions
|
||
|
import ftplib
|
||
|
import functools
|
||
|
import genericpath
|
||
|
import getopt
|
||
|
import getpass
|
||
|
import gettext
|
||
|
import glob
|
||
|
import gzip
|
||
|
import hashlib
|
||
|
import heapq
|
||
|
import hmac
|
||
|
import html
|
||
|
import http
|
||
|
import idlelib
|
||
|
import imaplib
|
||
|
import imghdr
|
||
|
import imp
|
||
|
import importlib
|
||
|
import inspect
|
||
|
import io
|
||
|
import ipaddress
|
||
|
import json
|
||
|
import keyword
|
||
|
import lib2to3
|
||
|
import linecache
|
||
|
import locale
|
||
|
import logging
|
||
|
import lzma
|
||
|
# import macpath
|
||
|
# import macurl2path
|
||
|
import mailbox
|
||
|
import mailcap
|
||
|
import mimetypes
|
||
|
import modulefinder
|
||
|
import msilib
|
||
|
# import multiprocessing
|
||
|
import netrc
|
||
|
import nntplib
|
||
|
import ntpath
|
||
|
import nturl2path
|
||
|
import numbers
|
||
|
import opcode
|
||
|
import operator
|
||
|
import optparse
|
||
|
import os
|
||
|
import pathlib
|
||
|
import pdb
|
||
|
import pickle
|
||
|
import pickletools
|
||
|
import pipes
|
||
|
import pkgutil
|
||
|
import platform
|
||
|
import plistlib
|
||
|
import poplib
|
||
|
import posixpath
|
||
|
import pprint
|
||
|
import profile
|
||
|
import pstats
|
||
|
import pty
|
||
|
import pyclbr
|
||
|
import pydoc
|
||
|
import pydoc_data
|
||
|
import queue
|
||
|
import quopri
|
||
|
import random
|
||
|
import re
|
||
|
import reprlib
|
||
|
import rlcompleter
|
||
|
import runpy
|
||
|
import sched
|
||
|
import selectors
|
||
|
import shelve
|
||
|
import shlex
|
||
|
import shutil
|
||
|
import site
|
||
|
# import smtpd
|
||
|
import smtplib
|
||
|
import sndhdr
|
||
|
import socket
|
||
|
import socketserver
|
||
|
import sqlite3
|
||
|
# import compile
|
||
|
# import constants
|
||
|
# import parse
|
||
|
import ssl
|
||
|
import stat
|
||
|
import statistics
|
||
|
import string
|
||
|
import stringprep
|
||
|
import struct
|
||
|
import subprocess
|
||
|
import sunau
|
||
|
import symbol
|
||
|
import symtable
|
||
|
import sysconfig
|
||
|
import tabnanny
|
||
|
import tarfile
|
||
|
import telnetlib
|
||
|
import tempfile
|
||
|
import test
|
||
|
import textwrap
|
||
|
import this
|
||
|
import threading
|
||
|
import timeit
|
||
|
import tkinter
|
||
|
import token
|
||
|
import tokenize
|
||
|
import trace
|
||
|
import traceback
|
||
|
import tracemalloc
|
||
|
import tty
|
||
|
import turtle
|
||
|
import turtledemo
|
||
|
import types
|
||
|
import unittest
|
||
|
import urllib
|
||
|
import uu
|
||
|
import uuid
|
||
|
import venv
|
||
|
import warnings
|
||
|
import wave
|
||
|
import weakref
|
||
|
import webbrowser
|
||
|
import wsgiref
|
||
|
import xdrlib
|
||
|
import xml
|
||
|
import xmlrpc
|
||
|
import zipfile
|
||
|
|
||
|
|
||
|
# Setup logging first
|
||
|
from pylog4net import Log4Net
|
||
|
try:
|
||
|
Log4Net.read_config(settings.CONFIG_FILE)
|
||
|
except Exception as e:
|
||
|
print('Log error: %s' % (str(e)))
|
||
|
sys.exit(1)
|
||
|
|
||
|
from config import Config
|
||
|
try:
|
||
|
cfg = Config(settings.CONFIG_FILE)
|
||
|
except Exception as e:
|
||
|
print('Config error: %s' % (str(e)))
|
||
|
sys.exit(1)
|
||
|
|
||
|
# Running as py2exe: check if linecache should be enabled
|
||
|
# if hasattr(sys, 'frozen'):
|
||
|
# if cfg.get("enable_linecache", True, bool):
|
||
|
# # Monkey patch it back to the original value
|
||
|
# import linecache
|
||
|
# linecache.getline = linecache.orig_getline
|
||
|
# del linecache
|
||
|
|
||
|
# Log4net logger
|
||
|
logger = Log4Net.get_logger('Net2Scripting')
|
||
|
|
||
|
|
||
|
def run(script_file):
|
||
|
"""Run script file
|
||
|
"""
|
||
|
try:
|
||
|
if not os.path.isfile(script_file):
|
||
|
raise Exception("User script '%s' does not exist!" % (script_file))
|
||
|
|
||
|
# Get script dir and add it to the module search path
|
||
|
sys.path.insert(0, os.path.dirname(script_file))
|
||
|
|
||
|
print("Press '<ctrl> C' to quit...")
|
||
|
logger.Debug("Calling user script '%s'" % (script_file))
|
||
|
try:
|
||
|
# Strip Net2Scripting param from arguments
|
||
|
sys.argv = sys.argv[1:]
|
||
|
# Explicitly provide dict, to prevent scope issues
|
||
|
with open(script_file) as f:
|
||
|
code = compile(f.read(), script_file, 'exec')
|
||
|
exec(code,
|
||
|
{"__name__": "__main__",
|
||
|
"__file__": script_file,
|
||
|
"__scripting_version__": settings.VERSION})
|
||
|
except KeyboardInterrupt:
|
||
|
logger.Debug("User interrupt")
|
||
|
|
||
|
except Exception as ex:
|
||
|
|
||
|
msg = "Fatal error: " + str(ex)
|
||
|
if cfg.get("log_stacktrace", default=False, vtype=bool):
|
||
|
msg += "\n" + traceback.format_exc()
|
||
|
logger.Fatal(msg)
|
||
|
return 1
|
||
|
|
||
|
|
||
|
def run_key(script_key):
|
||
|
"""Run file referenced by setting keyword
|
||
|
"""
|
||
|
try:
|
||
|
script_key = script_key.strip()
|
||
|
if not script_key:
|
||
|
raise "The provided script keyword is empty!"
|
||
|
|
||
|
# Fetch setting from config
|
||
|
cfg.check_required([(script_key, str)])
|
||
|
|
||
|
return run(cfg.get(script_key))
|
||
|
|
||
|
except Exception as ex:
|
||
|
logger.Fatal("Fatal error: " + str(ex))
|
||
|
return 1
|
||
|
|
||
|
|
||
|
def confirm_wait():
|
||
|
"""Wait for user confirmation
|
||
|
"""
|
||
|
# Fetch setting from config
|
||
|
wait = cfg.get("confirm_wait", default=False, vtype=bool)
|
||
|
if wait:
|
||
|
print()
|
||
|
input("Press enter to continue: ")
|
||
|
|
||
|
|
||
|
# Main program entry
|
||
|
if __name__ == '__main__':
|
||
|
|
||
|
ret_val = 0
|
||
|
|
||
|
try:
|
||
|
if len(sys.argv) > 1:
|
||
|
arg = sys.argv[1]
|
||
|
|
||
|
if arg == "/?":
|
||
|
print()
|
||
|
print("Net2Scripting V%s, by Net2 Solutions" % (settings.VERSION))
|
||
|
print()
|
||
|
print(" /? = help")
|
||
|
print(" /k:keyword = run script referenced by appSettings keyword")
|
||
|
print(" <script file path> = run given script")
|
||
|
print()
|
||
|
print(" By default, the script referenced by the 'user_script' setting is run.")
|
||
|
print(" Settings are located in the 'Net2Scripting.exe.config' file.")
|
||
|
print(" Also modify this file if you prefer different log settings.")
|
||
|
print
|
||
|
ret_val = 1
|
||
|
|
||
|
# Run by keyword
|
||
|
elif arg.startswith("/k:"):
|
||
|
ret_val = run_key(arg.split(":", 1)[1])
|
||
|
|
||
|
# Run as file
|
||
|
elif not arg.startswith("/"):
|
||
|
ret_val = run(arg)
|
||
|
|
||
|
# Unknown option
|
||
|
else:
|
||
|
print("Unknown parameter: " + arg)
|
||
|
ret_val = 1
|
||
|
else:
|
||
|
# Run as default
|
||
|
ret_val = run_key("user_script")
|
||
|
|
||
|
finally:
|
||
|
# Wait for user confirmation when required
|
||
|
confirm_wait()
|
||
|
|
||
|
# Return with value
|
||
|
sys.exit(ret_val)
|