Initial snapshot
This commit is contained in:
commit
fee4dd4e6d
373 changed files with 62144 additions and 0 deletions
382
environment/profile/host/host.py
Normal file
382
environment/profile/host/host.py
Normal file
|
|
@ -0,0 +1,382 @@
|
|||
#
|
||||
# ---------- header -----------------------------------------------------------
|
||||
#
|
||||
# project kaneton
|
||||
#
|
||||
# license kaneton
|
||||
#
|
||||
# file /home/mycure/kaneton/environment/profile/host/host.py
|
||||
#
|
||||
# created julien quintard [tue may 8 13:03:40 2007]
|
||||
# updated julien quintard [mon mar 7 16:36:27 2011]
|
||||
#
|
||||
|
||||
#
|
||||
# ---------- information ------------------------------------------------------
|
||||
#
|
||||
# this file contains generic stuff about the python interface including
|
||||
# options and general functions.
|
||||
#
|
||||
# since the python scripting language was designed to provide portable
|
||||
# operations, the following operations are considered as generic, making
|
||||
# work easier for host sub-profiles.
|
||||
#
|
||||
|
||||
#
|
||||
# ---------- imports ----------------------------------------------------------
|
||||
#
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import tempfile
|
||||
import shutil
|
||||
import time
|
||||
|
||||
#
|
||||
# ---------- options ----------------------------------------------------------
|
||||
#
|
||||
|
||||
HEADER_NONE = 0
|
||||
HEADER_OK = 1
|
||||
HEADER_ERROR = 2
|
||||
HEADER_INTERACTIVE = 4
|
||||
|
||||
COLOR_NONE = 0
|
||||
COLOR_BLACK = 1
|
||||
COLOR_RED = 2
|
||||
COLOR_GREEN = 3
|
||||
COLOR_YELLOW = 4
|
||||
COLOR_BLUE = 5
|
||||
COLOR_MAGENTA = 6
|
||||
COLOR_CYAN = 7
|
||||
COLOR_WHITE = 8
|
||||
|
||||
OPTION_NONE = 0
|
||||
|
||||
OPTION_QUIET = 1
|
||||
|
||||
OPTION_NO_NEWLINE = 1
|
||||
OPTION_FLICKERING = 2
|
||||
OPTION_BOLD = 4
|
||||
|
||||
OPTION_FILE = 1
|
||||
OPTION_DIRECTORY = 2
|
||||
OPTION_LINK = 4
|
||||
OPTION_RECURSIVE = 8
|
||||
OPTION_EXIST = 16
|
||||
OPTION_HIDDEN = 32
|
||||
OPTION_ALL = OPTION_FILE | OPTION_DIRECTORY | OPTION_LINK
|
||||
|
||||
OPTION_DEVICE = 1
|
||||
OPTION_IMAGE = 2
|
||||
|
||||
OPTION_CURRENT_DIRECTORY = 1
|
||||
|
||||
#
|
||||
# ---------- functions --------------------------------------------------------
|
||||
#
|
||||
|
||||
#
|
||||
# display()
|
||||
#
|
||||
# this function prints a kaneton message.
|
||||
#
|
||||
def display(header, text, options):
|
||||
if header == HEADER_NONE:
|
||||
sys.stdout.write(colorize(text, COLOR_NONE, OPTION_NONE))
|
||||
elif header == HEADER_OK:
|
||||
sys.stdout.write(colorize("[", COLOR_BLUE, OPTION_BOLD))
|
||||
sys.stdout.write(colorize("+", COLOR_GREEN, OPTION_BOLD))
|
||||
sys.stdout.write(colorize("]", COLOR_BLUE, OPTION_BOLD))
|
||||
sys.stdout.write(" ")
|
||||
sys.stdout.write(colorize(text, COLOR_NONE, OPTION_NONE))
|
||||
elif header == HEADER_ERROR:
|
||||
sys.stdout.write(colorize("[", COLOR_BLUE, OPTION_BOLD))
|
||||
sys.stdout.write(colorize("!", COLOR_RED, OPTION_BOLD))
|
||||
sys.stdout.write(colorize("]", COLOR_BLUE, OPTION_BOLD))
|
||||
sys.stdout.write(" ")
|
||||
sys.stdout.write(colorize(text, COLOR_NONE, OPTION_NONE))
|
||||
elif header == HEADER_INTERACTIVE:
|
||||
sys.stdout.write(colorize("[", COLOR_BLUE, OPTION_BOLD))
|
||||
sys.stdout.write(colorize("?",
|
||||
COLOR_YELLOW,
|
||||
OPTION_FLICKERING | OPTION_BOLD))
|
||||
sys.stdout.write(colorize("]", COLOR_BLUE, OPTION_BOLD))
|
||||
sys.stdout.write(" ")
|
||||
sys.stdout.write(colorize(text, COLOR_NONE, OPTION_NONE))
|
||||
|
||||
if not options & OPTION_NO_NEWLINE:
|
||||
sys.stdout.write("\n")
|
||||
|
||||
|
||||
|
||||
#
|
||||
# pull()
|
||||
#
|
||||
# this function reads the content of a single file.
|
||||
#
|
||||
def pull(file, options):
|
||||
handle = None
|
||||
line = None
|
||||
|
||||
if not os.path.exists(file):
|
||||
return None
|
||||
|
||||
try:
|
||||
handle = open(file, "r")
|
||||
except IOError:
|
||||
return None
|
||||
|
||||
content = ""
|
||||
for line in handle.readlines():
|
||||
content += line
|
||||
|
||||
handle.close()
|
||||
|
||||
return content
|
||||
|
||||
|
||||
|
||||
#
|
||||
# push()
|
||||
#
|
||||
# this function writes the content of a single file.
|
||||
#
|
||||
def push(file, content, options):
|
||||
handle = None
|
||||
|
||||
handle = open(file, "w")
|
||||
|
||||
handle.write(content)
|
||||
|
||||
handle.close()
|
||||
|
||||
|
||||
|
||||
#
|
||||
# temporary()
|
||||
#
|
||||
# this function provides an easy way to create a temporary file or directory.
|
||||
#
|
||||
def temporary(options):
|
||||
location = None
|
||||
|
||||
if options == OPTION_FILE:
|
||||
tuple = tempfile.mkstemp()
|
||||
|
||||
os.close(tuple[0])
|
||||
|
||||
location = tuple[1]
|
||||
elif options == OPTION_DIRECTORY:
|
||||
location = tempfile.mkdtemp()
|
||||
|
||||
return location
|
||||
|
||||
|
||||
|
||||
#
|
||||
# cwd()
|
||||
#
|
||||
# this function returns the current working directory.
|
||||
#
|
||||
def cwd(options):
|
||||
return os.getcwd()
|
||||
|
||||
|
||||
|
||||
#
|
||||
# input()
|
||||
#
|
||||
# this function waits for an input.
|
||||
#
|
||||
def input(options):
|
||||
return input()
|
||||
|
||||
|
||||
|
||||
#
|
||||
# copy()
|
||||
#
|
||||
# this function copies a file or a directory.
|
||||
#
|
||||
def copy(source, destination, options):
|
||||
if os.path.isdir(source):
|
||||
shutil.copytree(source, destination, True)
|
||||
else:
|
||||
shutil.copy2(source, destination)
|
||||
|
||||
|
||||
|
||||
#
|
||||
# move()
|
||||
#
|
||||
# this function moves a file or a directory.
|
||||
#
|
||||
def move(source, destination, options):
|
||||
copy(source, destination, options)
|
||||
remove(source, options)
|
||||
|
||||
|
||||
|
||||
#
|
||||
# link()
|
||||
#
|
||||
# this function builds a link name source to the file destination.
|
||||
#
|
||||
def link(source, destination, options):
|
||||
os.symlink(destination, source)
|
||||
|
||||
|
||||
|
||||
#
|
||||
# remove()
|
||||
#
|
||||
# this function removes the targets.
|
||||
#
|
||||
def remove(target, options):
|
||||
entries = None
|
||||
entry = None
|
||||
|
||||
if os.path.isfile(target) or os.path.islink(target):
|
||||
os.unlink(target)
|
||||
|
||||
if os.path.isdir(target):
|
||||
entries = os.listdir(target)
|
||||
for entry in entries:
|
||||
remove(target + "/" + entry, OPTION_NONE)
|
||||
os.rmdir(target)
|
||||
|
||||
|
||||
|
||||
#
|
||||
# list()
|
||||
#
|
||||
# this function lists the entries of a directory.
|
||||
#
|
||||
def list(directory, options):
|
||||
elements = []
|
||||
entries = None
|
||||
entry = None
|
||||
|
||||
entries = os.listdir(directory)
|
||||
|
||||
for entry in entries:
|
||||
if not (options & OPTION_HIDDEN) and \
|
||||
(entry[0:1] == "."):
|
||||
continue
|
||||
if (options & OPTION_LINK) and \
|
||||
(os.path.islink(directory + "/" + entry)):
|
||||
elements += [ entry ]
|
||||
if (options & OPTION_FILE) and \
|
||||
(os.path.isfile(directory + "/" + entry)) and \
|
||||
(not os.path.islink(directory + "/" + entry)):
|
||||
elements += [ entry ]
|
||||
if (options & OPTION_DIRECTORY) and \
|
||||
(os.path.isdir(directory + "/" + entry)) and \
|
||||
(not os.path.islink(directory + "/" + entry)):
|
||||
elements += [ entry ]
|
||||
|
||||
return elements
|
||||
|
||||
|
||||
|
||||
#
|
||||
# cd()
|
||||
#
|
||||
# this function changes the current working directory.
|
||||
#
|
||||
def cd(directory, options):
|
||||
os.chdir(directory)
|
||||
|
||||
|
||||
|
||||
#
|
||||
# search()
|
||||
#
|
||||
# this function searches for file names matching the given pattern.
|
||||
#
|
||||
def search(directory, pattern, options):
|
||||
elements = []
|
||||
entries = None
|
||||
entry = None
|
||||
|
||||
entries = os.listdir(directory)
|
||||
|
||||
for entry in entries:
|
||||
if (options & OPTION_FILE) and \
|
||||
(os.path.isfile(directory + "/" + entry)) and \
|
||||
(re.search(pattern, entry)):
|
||||
elements += [ directory + "/" + entry ]
|
||||
|
||||
if (os.path.isdir(directory + "/" + entry)):
|
||||
if (options & OPTION_DIRECTORY) and \
|
||||
(re.search(pattern, entry)):
|
||||
elements += [ directory + "/" + entry ]
|
||||
|
||||
if (options & OPTION_RECURSIVE) and \
|
||||
(not os.path.islink(directory + "/" + entry)):
|
||||
elements += search(directory + "/" + entry, pattern, options)
|
||||
|
||||
return elements
|
||||
|
||||
|
||||
|
||||
#
|
||||
# mkdir()
|
||||
#
|
||||
# this function creates a directory.
|
||||
#
|
||||
def mkdir(directory, options):
|
||||
path = None
|
||||
steps = None
|
||||
step = None
|
||||
|
||||
steps = directory.strip("/").split("/")
|
||||
|
||||
for step in steps:
|
||||
if not path:
|
||||
path = "/" + step
|
||||
else:
|
||||
path = path + "/" + step
|
||||
|
||||
if not os.path.exists(path):
|
||||
os.mkdir(path)
|
||||
|
||||
|
||||
|
||||
#
|
||||
# stamp()
|
||||
#
|
||||
# this function returns the current formatted date.
|
||||
#
|
||||
def stamp(options):
|
||||
return time.strftime("%Y%m%d")
|
||||
|
||||
|
||||
|
||||
#
|
||||
# path()
|
||||
#
|
||||
# this function returns information on a path: file, directory etc.
|
||||
#
|
||||
def path(path, options):
|
||||
if options == OPTION_FILE:
|
||||
return os.path.basename(path)
|
||||
if options == OPTION_DIRECTORY:
|
||||
return os.path.dirname(path)
|
||||
if options == OPTION_EXIST:
|
||||
return os.path.exists(path)
|
||||
|
||||
return None
|
||||
|
||||
|
||||
|
||||
#
|
||||
# info()
|
||||
#
|
||||
# this function returns information on the system.
|
||||
#
|
||||
def info(options):
|
||||
if (options & OPTION_CURRENT_DIRECTORY):
|
||||
return os.path.curdir
|
||||
Reference in a new issue