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
"""
|
|
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)
|