Compare commits

..

14 Commits
1.5.2 ... main

Author SHA1 Message Date
Natalia Serrano 961d84db86 Merge pull request 'refs #2860 fix doxygen comments, remove old bash stuff' (#128) from doxygen into main
ogclient/pipeline/head This commit looks good Details
ogclient/pipeline/tag This commit looks good Details
Reviewed-on: #128
2025-10-13 15:52:04 +02:00
Natalia Serrano 631c3093c5 refs #2860 fix doxygen comments, remove old bash stuff 2025-10-13 15:50:17 +02:00
Natalia Serrano 8daaefffd1 Merge pull request 'refs #2858 improve detection of BCD files for the menu entries' (#127) from winloader-menu-entry into main
ogclient/pipeline/head This commit looks good Details
ogclient/pipeline/tag This commit looks good Details
Reviewed-on: #127
2025-10-02 14:26:03 +02:00
Natalia Serrano ae48530b95 refs #2858 improve detection of BCD files for the menu entries 2025-10-02 14:23:15 +02:00
Natalia Serrano ab552d571d Merge pull request 'refs #2856 allow to create images in regular ogLive (not ogLiveAdmin)' (#126) from crearimagen-oglive-no-admin into main
ogclient/pipeline/head There was a failure building this commit Details
ogclient/pipeline/tag There was a failure building this commit Details
Reviewed-on: #126
2025-10-02 10:26:56 +02:00
Natalia Serrano 9a0a3c2223 refs #2856 allow to create images in regular ogLive (not ogLiveAdmin) 2025-10-02 10:25:41 +02:00
Natalia Serrano 458c18a8d8 Merge pull request 'refs #2850 add cgi error page' (#125) from browser-err into main
ogclient/pipeline/head This commit looks good Details
ogclient/pipeline/tag This commit looks good Details
Reviewed-on: #125
2025-09-29 15:36:20 +02:00
Natalia Serrano de5d4bc04b refs #2850 add cgi error page 2025-09-29 15:35:46 +02:00
Natalia Serrano bcf69b6bfe Merge pull request 'refs #2848 log less stuff' (#124) from log-less-stuff into main
ogclient/pipeline/head This commit looks good Details
ogclient/pipeline/tag This commit looks good Details
Reviewed-on: #124
2025-09-26 10:51:04 +02:00
Natalia Serrano 616885376d refs #2848 log less stuff 2025-09-26 10:50:43 +02:00
Natalia Serrano 88fe209510 Merge pull request 'refs #2229 #2844 #2846 fix three bugs' (#123) from fix-2-bugs into main
ogclient/pipeline/head This commit looks good Details
ogclient/pipeline/tag This commit looks good Details
Reviewed-on: #123
2025-09-25 13:29:56 +02:00
Natalia Serrano c2bbe97ca1 refs #2229 #2844 #2846 fix three bugs 2025-09-25 13:29:14 +02:00
Natalia Serrano b9e3559039 Merge pull request 'refs #2229 send gitlib progress to ogcore' (#122) from gitlib-progress into main
ogclient/pipeline/head This commit looks good Details
ogclient/pipeline/tag This commit looks good Details
Reviewed-on: #122
2025-09-23 13:15:24 +02:00
Natalia Serrano f338f950e4 refs #2229 send gitlib progress to ogcore 2025-09-23 13:13:06 +02:00
56 changed files with 1034 additions and 14818 deletions

View File

@ -5,6 +5,48 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.7.3] - 2025-10-13
### Fixed
- Fixed doxygen comments
## [1.7.2] - 2025-10-02
### Fixed
- Improve detection of BCD files for the menu entries
## [1.7.1] - 2025-10-02
### Fixed
- Allow to create images in regular ogLive (not ogLiveAdmin)
## [1.7.0] - 2025-09-29
### Added
- Add CGI error page
## [1.6.2] - 2025-09-26
### Fixed
- Have gitlib log less stuff, to prevent the execution from getting stuck
## [1.6.1] - 2025-09-25
### Fixed
- Fix three bugs
## [1.6.0] - 2025-09-23
### Added
- Send gitlib progress to ogcore
## [1.5.2] - 2025-09-12
### Fixed

439
Doxyfile Normal file
View File

@ -0,0 +1,439 @@
# Doxyfile 1.9.8
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "My Project"
PROJECT_NUMBER =
PROJECT_BRIEF =
PROJECT_LOGO =
OUTPUT_DIRECTORY =
CREATE_SUBDIRS = NO
CREATE_SUBDIRS_LEVEL = 8
ALLOW_UNICODE_NAMES = NO
OUTPUT_LANGUAGE = English
BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES
ABBREVIATE_BRIEF = "The $name class" \
"The $name widget" \
"The $name file" \
is \
provides \
specifies \
contains \
represents \
a \
an \
the
ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = YES
STRIP_FROM_PATH =
STRIP_FROM_INC_PATH =
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = NO
JAVADOC_BANNER = NO
QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
PYTHON_DOCSTRING = YES
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 4
ALIASES =
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = YES
OPTIMIZE_FOR_FORTRAN = NO
OPTIMIZE_OUTPUT_VHDL = NO
OPTIMIZE_OUTPUT_SLICE = NO
EXTENSION_MAPPING =
MARKDOWN_SUPPORT = YES
TOC_INCLUDE_HEADINGS = 5
MARKDOWN_ID_STYLE = DOXYGEN
AUTOLINK_SUPPORT = YES
BUILTIN_STL_SUPPORT = NO
CPP_CLI_SUPPORT = NO
SIP_SUPPORT = NO
IDL_PROPERTY_SUPPORT = YES
DISTRIBUTE_GROUP_DOC = NO
GROUP_NESTED_COMPOUNDS = NO
SUBGROUPING = YES
INLINE_GROUPED_CLASSES = NO
INLINE_SIMPLE_STRUCTS = NO
TYPEDEF_HIDES_STRUCT = NO
LOOKUP_CACHE_SIZE = 0
NUM_PROC_THREADS = 1
TIMESTAMP = NO
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_ALL = NO
EXTRACT_PRIVATE = NO
EXTRACT_PRIV_VIRTUAL = NO
EXTRACT_PACKAGE = NO
EXTRACT_STATIC = NO
EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = NO
EXTRACT_ANON_NSPACES = NO
RESOLVE_UNNAMED_PARAMS = YES
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
CASE_SENSE_NAMES = SYSTEM
HIDE_SCOPE_NAMES = NO
HIDE_COMPOUND_REFERENCE= NO
SHOW_HEADERFILE = YES
SHOW_INCLUDE_FILES = YES
SHOW_GROUPED_MEMB_INC = NO
FORCE_LOCAL_INCLUDES = NO
INLINE_INFO = YES
SORT_MEMBER_DOCS = YES
SORT_BRIEF_DOCS = NO
SORT_MEMBERS_CTORS_1ST = NO
SORT_GROUP_NAMES = NO
SORT_BY_SCOPE_NAME = NO
STRICT_PROTO_MATCHING = NO
GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES
GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
SHOW_FILES = YES
SHOW_NAMESPACES = YES
FILE_VERSION_FILTER =
LAYOUT_FILE =
CITE_BIB_FILES =
#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------
QUIET = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_IF_INCOMPLETE_DOC = YES
WARN_NO_PARAMDOC = NO
WARN_IF_UNDOC_ENUM_VAL = NO
WARN_AS_ERROR = NO
WARN_FORMAT = "$file:$line: $text"
WARN_LINE_FORMAT = "at line $line of file $file"
WARN_LOGFILE =
#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = ./ogclient
INPUT_ENCODING = UTF-8
INPUT_FILE_ENCODING =
FILE_PATTERNS = *.c \
*.cc \
*.cxx \
*.cxxm \
*.cpp \
*.cppm \
*.c++ \
*.c++m \
*.java \
*.ii \
*.ixx \
*.ipp \
*.i++ \
*.inl \
*.idl \
*.ddl \
*.odl \
*.h \
*.hh \
*.hxx \
*.hpp \
*.h++ \
*.ixx \
*.l \
*.cs \
*.d \
*.php \
*.php4 \
*.php5 \
*.phtml \
*.inc \
*.m \
*.markdown \
*.md \
*.mm \
*.dox \
*.py \
*.pyw \
*.f90 \
*.f95 \
*.f03 \
*.f08 \
*.f18 \
*.f \
*.for \
*.vhd \
*.vhdl \
*.ucf \
*.qsf \
*.ice
RECURSIVE = YES
EXCLUDE =
EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS =
EXCLUDE_SYMBOLS =
EXAMPLE_PATH =
EXAMPLE_PATTERNS = *
EXAMPLE_RECURSIVE = NO
IMAGE_PATH =
INPUT_FILTER =
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
FILTER_SOURCE_PATTERNS =
USE_MDFILE_AS_MAINPAGE =
FORTRAN_COMMENT_AFTER = 72
#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------
SOURCE_BROWSER = NO
INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = NO
REFERENCES_RELATION = NO
REFERENCES_LINK_SOURCE = YES
SOURCE_TOOLTIPS = YES
USE_HTAGS = NO
VERBATIM_HEADERS = YES
CLANG_ASSISTED_PARSING = NO
CLANG_ADD_INC_PATHS = YES
CLANG_OPTIONS =
CLANG_DATABASE_PATH =
#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
ALPHABETICAL_INDEX = YES
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML = YES
HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
HTML_HEADER =
HTML_FOOTER =
HTML_STYLESHEET =
HTML_EXTRA_STYLESHEET =
HTML_EXTRA_FILES =
HTML_COLORSTYLE = AUTO_LIGHT
HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80
HTML_DYNAMIC_MENUS = YES
HTML_DYNAMIC_SECTIONS = NO
HTML_CODE_FOLDING = YES
HTML_INDEX_NUM_ENTRIES = 100
GENERATE_DOCSET = NO
DOCSET_FEEDNAME = "Doxygen generated docs"
DOCSET_FEEDURL =
DOCSET_BUNDLE_ID = org.doxygen.Project
DOCSET_PUBLISHER_ID = org.doxygen.Publisher
DOCSET_PUBLISHER_NAME = Publisher
GENERATE_HTMLHELP = NO
CHM_FILE =
HHC_LOCATION =
GENERATE_CHI = NO
CHM_INDEX_ENCODING =
BINARY_TOC = NO
TOC_EXPAND = NO
SITEMAP_URL =
GENERATE_QHP = NO
QCH_FILE =
QHP_NAMESPACE = org.doxygen.Project
QHP_VIRTUAL_FOLDER = doc
QHP_CUST_FILTER_NAME =
QHP_CUST_FILTER_ATTRS =
QHP_SECT_FILTER_ATTRS =
QHG_LOCATION =
GENERATE_ECLIPSEHELP = NO
ECLIPSE_DOC_ID = org.doxygen.Project
DISABLE_INDEX = NO
GENERATE_TREEVIEW = NO
FULL_SIDEBAR = NO
ENUM_VALUES_PER_LINE = 4
TREEVIEW_WIDTH = 250
EXT_LINKS_IN_WINDOW = NO
OBFUSCATE_EMAILS = YES
HTML_FORMULA_FORMAT = png
FORMULA_FONTSIZE = 10
FORMULA_MACROFILE =
USE_MATHJAX = NO
MATHJAX_VERSION = MathJax_2
MATHJAX_FORMAT = HTML-CSS
MATHJAX_RELPATH =
MATHJAX_EXTENSIONS =
MATHJAX_CODEFILE =
SEARCHENGINE = YES
SERVER_BASED_SEARCH = NO
EXTERNAL_SEARCH = NO
SEARCHENGINE_URL =
SEARCHDATA_FILE = searchdata.xml
EXTERNAL_SEARCH_ID =
EXTRA_SEARCH_MAPPINGS =
#---------------------------------------------------------------------------
# Configuration options related to the LaTeX output
#---------------------------------------------------------------------------
GENERATE_LATEX = YES
LATEX_OUTPUT = latex
LATEX_CMD_NAME =
MAKEINDEX_CMD_NAME = makeindex
LATEX_MAKEINDEX_CMD = makeindex
COMPACT_LATEX = NO
PAPER_TYPE = a4
EXTRA_PACKAGES =
LATEX_HEADER =
LATEX_FOOTER =
LATEX_EXTRA_STYLESHEET =
LATEX_EXTRA_FILES =
PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
LATEX_BIB_STYLE = plain
LATEX_EMOJI_DIRECTORY =
#---------------------------------------------------------------------------
# Configuration options related to the RTF output
#---------------------------------------------------------------------------
GENERATE_RTF = NO
RTF_OUTPUT = rtf
COMPACT_RTF = NO
RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# Configuration options related to the man page output
#---------------------------------------------------------------------------
GENERATE_MAN = NO
MAN_OUTPUT = man
MAN_EXTENSION = .3
MAN_SUBDIR =
MAN_LINKS = NO
#---------------------------------------------------------------------------
# Configuration options related to the XML output
#---------------------------------------------------------------------------
GENERATE_XML = NO
XML_OUTPUT = xml
XML_PROGRAMLISTING = YES
XML_NS_MEMB_FILE_SCOPE = NO
#---------------------------------------------------------------------------
# Configuration options related to the DOCBOOK output
#---------------------------------------------------------------------------
GENERATE_DOCBOOK = NO
DOCBOOK_OUTPUT = docbook
#---------------------------------------------------------------------------
# Configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO
GENERATE_SQLITE3 = NO
SQLITE3_OUTPUT = sqlite3
SQLITE3_RECREATE_DB = YES
#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
#---------------------------------------------------------------------------
GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO
PERLMOD_PRETTY = YES
PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = NO
EXPAND_ONLY_PREDEF = NO
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
PREDEFINED =
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration options related to external references
#---------------------------------------------------------------------------
TAGFILES =
GENERATE_TAGFILE =
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
EXTERNAL_PAGES = YES
#---------------------------------------------------------------------------
# Configuration options related to diagram generator tools
#---------------------------------------------------------------------------
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = YES
DOT_NUM_THREADS = 0
DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10"
DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10"
DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4"
DOT_FONTPATH =
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES
UML_LOOK = NO
UML_LIMIT_NUM_FIELDS = 10
DOT_UML_DETAILS = NO
DOT_WRAP_THRESHOLD = 17
TEMPLATE_RELATIONS = NO
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
CALL_GRAPH = NO
CALLER_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DIR_GRAPH_MAX_DEPTH = 1
DOT_IMAGE_FORMAT = png
INTERACTIVE_SVG = NO
DOT_PATH =
DOTFILE_DIRS =
DIA_PATH =
DIAFILE_DIRS =
PLANTUML_JAR_PATH =
PLANTUML_CFG_FILE =
PLANTUML_INCLUDE_PATH =
DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 0
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
MSCGEN_TOOL =
MSCFILE_DIRS =

View File

@ -156,7 +156,8 @@ else:
sys.exit (1)
## si no nos definen partición de cache y el disco tiene una, hay que borrarla
if not cache_seen:
## pero solo cuando check_sizes es falso! si check_sizes es true no hay que tocar nada
if not cache_seen and not check_sizes:
c = CacheLib.ogFindCache()
if c:
cache_disk, cache_part = c.split()
@ -187,6 +188,7 @@ if not recreate_partition_table and not CacheLib.ogCheckNewCacheSize (dis, tch):
## size check: check that the newly defined partitions fit in the disk
disk_sectors = DiskLib.ogGetLastSector (dis)
if disk_sectors is None: disk_sectors = 1e15 ## if None, then the disk is empty--for the purposes of size checks, treat it as if it were arbitrarily large
IOSIZE = DiskLib.ogGetIoSize (dis)
if not IOSIZE:
SystemLib.ogRaiseError (['session', 'log'], ogGlobals.OG_ERR_FORMAT, f'Failed to get disk sector size')

View File

@ -73,7 +73,7 @@ if 'REPO' == repo or ogCheckIpAddress (repo):
sys.exit (1)
# Si el destino es REPO y el cliente no está en modo "admin"; activar repositorio para escritura,
if 'REPO' == repo and 'admin' != env_boot:
if 'admin' != env_boot:
retval = subprocess.run ([f'{dirname}/CambiarAcceso', 'admin']).returncode
if retval:
sys.exit (retval)

View File

@ -1,16 +1,14 @@
#!/usr/bin/env python3
import sys
import resource
import logging
import argparse
import ogGlobals
import SystemLib
import DiskLib
import NetLib
from GitLib import OpengnsysGitLibrary, NTFSImplementation, OgProgressPrinterWeb
@ -33,10 +31,8 @@ class OgLogger(logging.StreamHandler):
SystemLib.ogEcho(log_types, log_level, record.getMessage())
def create_image(disk_num, partition_num, repo, image_name, commit_message):
print ('[10] begin')
ntfs_impl = NTFSImplementation.NTFS3G
og_git = OpengnsysGitLibrary(ntfs_implementation = ntfs_impl)
og_git.progress_callback = OgProgressPrinterWeb()
@ -46,14 +42,15 @@ def create_image(disk_num, partition_num, repo, image_name, commit_message):
if device is None:
sys.exit(SystemLib.ogRaiseError([], ogGlobals.OG_ERR_FORMAT, f"Failed to translate disk {disk_num} partition {partition_num} to a device"))
print ('[50] initRepo')
if og_git.initRepo(device, image_name, message = commit_message):
print ('[100] done')
return 0
else:
print ('[100] done')
return 1
def main():
soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
try:
# Usamos el mínimo entre 65536 y el límite hard disponible
@ -63,7 +60,6 @@ def main():
except ValueError as e:
print(f"No se pudo aumentar el límite de archivos abiertos: {e}")
parser = argparse.ArgumentParser(
prog = "OpenGnsys Git Image Create",
description = "Creates a git repository from a partition"
@ -75,14 +71,11 @@ def main():
parser.add_argument("--image-name", type=str, metavar="REPO", required=True, help="Name of the new image at the repository")
parser.add_argument("--tag", type=str, metavar="TAG", required=False, help="Tag to automatically create")
parser.add_argument("--message", type=str, metavar="MSG", required=False, default="", help="Commit message")
parser.add_help = True
args = parser.parse_args()
#disk_num, partition_num, image_name, repo, tag = sys.argv[1:6]
logFilePath = "/var/log/opengnsys.CrearImagenGit.log"
ogLog = OgLogger()
@ -100,7 +93,6 @@ def main():
logger.addHandler(fileLog)
logger.addHandler(ogLog)
logger.info("Starting CrearImagenGit")
# TODO:
@ -108,9 +100,6 @@ def main():
# image = nombre repo
retval = create_image(args.disk, args.partition, args.repository, args.image_name, args.message)
sys.exit(retval)
if __name__ == "__main__":

View File

@ -1,4 +1,5 @@
#!/usr/bin/env python3
import os
import subprocess
import sys
@ -6,7 +7,6 @@ import time
import resource
import argparse
soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
try:
# Usamos el mínimo entre 65536 y el límite hard disponible
@ -22,17 +22,14 @@ extra_paths = [
"/opt/opengnsys/ogrepository/oggit/lib/"
]
# Si estás completamente seguro de que esta ruta no interfiere con la stdlib
# y contiene todos los módulos necesarios, puedes añadirla AL FINAL del path.
path_maybe_problematic = "/opt/oglive/rootfs/opt/opengnsys/lib/python3/"
if os.path.isdir(path_maybe_problematic):
sys.path.append(path_maybe_problematic)
for path in extra_paths:
if os.path.isdir(path):
sys.path.append(path)
#path_maybe_problematic = "/opt/oglive/rootfs/opt/opengnsys/lib/python3/"
#if os.path.isdir(path_maybe_problematic):
# sys.path.append(path_maybe_problematic)
# for path in extra_paths:
# if os.path.isdir(path):
# sys.path.append(path)
import NetLib
import ogGlobals
@ -40,12 +37,8 @@ import SystemLib
import logging
import DiskLib
import NetLib
from GitLib import OpengnsysGitLibrary, NTFSImplementation, OgProgressPrinterWeb
class OgLogger(logging.StreamHandler):
def emit(self, record):
log_types = ["command"]
@ -65,10 +58,8 @@ class OgLogger(logging.StreamHandler):
SystemLib.ogEcho(log_types, log_level, record.getMessage())
def commit_image(disk_num, partition_num, repository, branch, options, msg):
print ('[10] begin')
ntfs_impl = NTFSImplementation.NTFS3G
og_git = OpengnsysGitLibrary(ntfs_implementation = ntfs_impl)
og_git.progress_callback = OgProgressPrinterWeb()
@ -92,17 +83,17 @@ def commit_image(disk_num, partition_num, repository, branch, options, msg):
if not og_git.create_branch(device = device, name = branch):
sys.exit(SystemLib.ogRaiseError([], ogGlobals.OG_ERR_FORMAT, f"Failed to create branch"))
print ('[30] commit')
og_git.commit(device = device, message = msg)
print ('[50] push')
og_git.push(device = device, force = force_push)
except Exception as ex:
sys.exit(SystemLib.ogRaiseError([], ogGlobals.OG_ERR_FORMAT, f"Exception during commit: {ex}"))
print ('[100] done')
return 0
def main():
parser = argparse.ArgumentParser(
prog = "OpenGnsys Git Image Modify",
description = "Commits changes to a partition to a git repository"
@ -111,11 +102,9 @@ def main():
parser.add_argument("--disk", type=int, metavar="DISK", required=True, help="Disk ID")
parser.add_argument("--partition", type=int, metavar="PART", required=True, help="Disk partition")
parser.add_argument("--repository", type=str, metavar="REPO", required=True, help="Address of the Git repository to clone")
parser.add_argument("--branch", type=str, metavar="BRANCH", required=False, help="Branch to automatically create")
parser.add_argument("--options", type=str, metavar="OPTS", required=False, help="Options to branch creation (forcepush)")
parser.add_argument("--message", type=str, metavar="MSG", required=False, default="", help="Commit message")
parser.add_help = True
args = parser.parse_args()
@ -123,7 +112,7 @@ def main():
logFilePath = "/var/log/opengnsys.ModificarImagenGit.log"
ogLog = OgLogger()
ogLog.setLevel(logging.DEBUG)
ogLog.setLevel(logging.INFO)
fileLog = logging.FileHandler(logFilePath)
fileLog.setLevel(logging.DEBUG)
@ -139,10 +128,8 @@ def main():
logger.info("Starting ModificarImagenGit")
retval = commit_image(args.disk, args.partition, args.repository, args.branch, args.options, args.message)
logger.info("ModificarImagenGit done, return code %i", retval)
sys.exit(retval)

View File

@ -1,20 +1,17 @@
#!/usr/bin/env python3
import sys
import resource
import logging
import subprocess
import argparse
import NetLib
import ogGlobals
import SystemLib
import DiskLib
from GitLib import OpengnsysGitLibrary, NTFSImplementation, OgProgressPrinterWeb
import argparse
class OgLogger(logging.StreamHandler):
def emit(self, record):
log_types = ["command"]
@ -34,8 +31,6 @@ class OgLogger(logging.StreamHandler):
SystemLib.ogEcho(log_types, log_level, record.getMessage())
if __name__ == "__main__":
soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
try:
@ -46,8 +41,6 @@ if __name__ == "__main__":
except ValueError as e:
print(f"No se pudo aumentar el límite de archivos abiertos: {e}")
parser = argparse.ArgumentParser(
prog = "OpenGnsys Git Image Restore",
description = "Restores an image from Git"
@ -57,19 +50,16 @@ if __name__ == "__main__":
parser.add_argument("--partition", type=int, metavar="PART", required=True, help="Disk partition")
parser.add_argument("--repository", type=str, metavar="REPO", required=True, help="Address of the Git repository to clone")
parser.add_argument("--image-name", type=str, metavar="REPO", required=True, help="Name of the new image at the repository")
parser.add_argument("--branch", type=str, metavar="BRANCH", required=True, help="Branch to check out")
parser.add_argument("--commit", type=str, metavar="COMMIT_ID", required=True, help="Commit to check out")
parser.add_help = True
args = parser.parse_args()
logFilePath = "/var/log/opengnsys.RestaurarImagenGit.log"
ogLog = OgLogger()
ogLog.setLevel(logging.DEBUG)
fileLog = logging.FileHandler(logFilePath)
fileLog.setLevel(logging.DEBUG)
@ -85,8 +75,7 @@ if __name__ == "__main__":
logger.info("Starting RestaurarImagenGit")
print ('[10] begin')
ntfs_impl = NTFSImplementation.NTFS3G
og_git = OpengnsysGitLibrary(ntfs_implementation = ntfs_impl)
og_git.progress_callback = OgProgressPrinterWeb()
@ -98,10 +87,9 @@ if __name__ == "__main__":
if args.repository:
og_git.repo_server = args.repository
print ('[50] cloneRepo')
og_git.cloneRepo(args.image_name, destination = device, boot_device = device, ref = args.commit, branch = args.branch)
print ('[80] configureOs')
subprocess.run(["/opt/opengnsys/scripts/configureOs", str(args.disk), str(args.partition)], check=True)
print ('[100] done')
logger.info("RestaurarImagenGit Finished.")

File diff suppressed because it is too large Load Diff

View File

@ -1,439 +0,0 @@
#!/bin/bash
#/**
#@file Cache.lib
#@brief Librería o clase Cache
#@class Cache
#@brief Funciones para gestión de la caché local de disco.
#@version 1.1.1
#@warning License: GNU GPLv3+
#*/
#/**
# ogCreateCache [int_ndisk] int_partsize
#@brief Define la caché local, por defecto en partición 4 del disco 1.
#@param int_ndisk numero de disco donde crear la cache, si no se indica es el 1 por defecto
#@param int_npart número de partición (opcional, 4 por defecto)
#@param int_partsize tamaño de la partición (en KB)
#@return (nada, por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
#@note Requisitos: sfdisk, parted, awk, sed
#@warning El tamaño de caché debe estar entre 50 MB y la mitad del disco.
#@warning La caché no puede solaparse con las particiones de datos.
#@version 0.9.1 - Definición de caché local.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010/03/09
#@version 0.9.2 - Corrección definición de límites.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010/06/01
#@version 1.0.4 - Soporte para discos GPT.
#@author Universidad de Huelva
#@date 2012/03/13
#@version 1.0.5 - Posibilidad de crear la cache en cualquier disco duro
#@author Universidad de Huelva
#@date 2012/09/18
#@version 1.1.0 - Posibilidad de crear la caché en cualquier partición.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2016/05/25
#@version 1.1.0 - Soporte discos con sectores de 4k
#@date 2017/01/09
#@version 1.0.6b - Al crear las particiones ordenamos los dispositivos en el fichero auxiliar.
#@author Irina Gomez, ETSII Universidad de Sevilla
#@date 2017/01/09
#*/ ##
function ogCreateCache ()
{
# Variables locales.
local FINDCACHE IOSIZE NDSK SIZECACHE PART DISK START END ENDPREVPART SIZE MINSIZE MAXSIZE
local PTTYPE ID TMPFILE NVME_PREFIX
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [int_ndisk [int_npart]] int_partsize" \
"$FUNCNAME 10000000" "$FUNCNAME 1 10000000" "$FUNCNAME 1 4 10000000"
return
fi
# Si se recibe un parametro, sera el tamano de la cache
case $# in
1) # Error, si no es un entero positivo
[[ $1 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $?
NDSK=1
PART=4
SIZECACHE=$1
;;
2) # Error, si no son enteros positivos
[[ $1 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $?
[[ $2 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$2" || return $?
NDSK=$1
PART=4
SIZECACHE=$2
;;
3) # Error, si no son enteros positivos
[[ $1 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $?
[[ $2 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$2" || return $?
[[ $3 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$3" || return $?
NDSK=$1
PART=$2
SIZECACHE=$3
;;
*) ogRaiseError $OG_ERR_FORMAT
return $?
;;
esac
TMPFILE=/tmp/sfdisk$$
DISK=$(ogDiskToDev $NDSK) || return $?
# PATCH Para discos nvme la particion debe ser p1, p2, etc...en lugar de 1,2, sino falla sfdisk
NVME_PREFIX=""
if [[ $DISK == *"nvme"* ]]; then
NVME_PREFIX="p"
fi
END=$[$(ogGetLastSector $NDSK 2>/dev/null)] # Sector final del disco.
SIZE=$[$SIZECACHE*2] # Tamaño en sectores de 512 B.
# Inicio partición cache según el disco tenga sectores de 4k o menores
IOSIZE=$(fdisk -l $DISK | awk '/I\/O/ {print $4}')
if [ $IOSIZE -eq 4096 ]; then
END=$[$END-8192]
START=$[END-SIZE+2048-(END-SIZE)%2048]
else
START=$[END-SIZE+1]
fi
ENDPREVPART=$[$(ogGetLastSector $NDSK $[PART-1] 2>/dev/null)]
# Error si tamaño no está entre límites permitidos o si se solapa con la partición anterior.
MINSIZE=25000 # Error de formateo si tamaño < 50 MB.
MAXSIZE=$END # Para restringir tamaño > mitad del disco: MAXSIZE=$[END/2]
if [ $SIZE -lt $MINSIZE -o $SIZE -gt $MAXSIZE -o $START -le $ENDPREVPART ]; then
ogRaiseError $OG_ERR_FORMAT "$1" || return $?
fi
# Desmontar todos los sistemas de archivos del disco.
ogUnmountAll $NDSK 2>/dev/null
# Definir particiones y notificar al kernel.
# En el caso de ser disco GPT, de momento se borra la particion y se vuelve a crear,
# por lo que se pierden los datos.
PTTYPE=$(ogGetPartitionTableType $NDSK)
if [ -z "$PTTYPE" ]; then
PTTYPE="MSDOS" # Por defecto para discos vacíos.
ogCreatePartitionTable $NDSK $PTTYPE
fi
case "$(ogGetPartitionTableType $NDSK)" in
GPT)
# Si la tabla de particiones no es valida, volver a generarla.
[ ! $(sgdisk -p $DISK &>/dev/null) ] || echo -e "2\nw\nY\n" | gdisk $DISK
# Si existe la cache se borra previamente
[ -n "$(ogFindCache)" ] && ogDeleteCache
# Capturamos el codigo de particion GPT para cache
# PATCH - Cuando es GPT, la particion con codigo CACHE (CA00) no existe y no puede crearse, se cambia por LINUX (8300)
ID=$(ogTypeToId LINUX GPT)
sgdisk $DISK -n$PART:$START:$END -c$PART:CACHE -t$PART:$ID 2>/dev/null
;;
MSDOS)
# Si la tabla de particiones no es valida, volver a generarla.
parted -s $DISK print &>/dev/null || fdisk $DISK <<< "w"
# Definir particiones y notificar al kernel.
ID=$(ogTypeToId CACHE MSDOS)
# Salvamos la configuración de las particiones e incluimos la cache.
trap "rm -f $TMPFILE" 1 2 3 9 15
sfdisk --dump $DISK | grep -v $DISK$PART > $TMPFILE
echo "$DISK$NVME_PREFIX$PART : start= $START, size= $SIZE, Id=$ID" >> $TMPFILE
# Ordenamos las líneas de los dispositivos
UNIT=$(grep unit $TMPFILE)
grep ^/dev $TMPFILE|sort -o $TMPFILE
sed -i "1i $UNIT\n" $TMPFILE
# Guardamos nueva configuración en el disco.
sfdisk --no-reread $DISK < $TMPFILE
rm -f $TMPFILE
;;
esac
# Actualiza la tabla de particiones en el kernel.
ogUpdatePartitionTable
}
#/**
# ogDeleteCache
#@brief Elimina la partición de caché local.
#@return (nada, por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
#@note Requisitos: fdisk, sgdisk, partprobe
#@version 0.91 - Definición de caché local.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010/03/11
#@version 1.0.4 - Soporte para discos GPT.
#@author Universidad de Huelva
#@date 2012/03/13
#@version 1.0.6b - llamada correcta a ogUpdatePartitionTable
#@author Antonio Doblas Universidad de Málaga
#@date 2016/11/16
#@version 1.1.0 - Sustituir "sfdisk" por "fdisk" para discos MSDOS.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2016/05/25
#*/ ##
function ogDeleteCache ()
{
# Variables locales.
local NDISK NPART DISK
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME"
return
fi
# Error si no se encuentra partición de caché.
read NDISK NPART <<<"$(ogFindCache)"
[ -n "$NDISK" -a -n "$NPART" ] || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
DISK=$(ogDiskToDev $NDISK)
# Desmontar todos los sistemas de archivos del disco.
ogUnmountAll $NDISK 2>/dev/null
case "$(ogGetPartitionTableType $NDISK)" in
GPT)
# Si la tabla de particiones no es valida, volver a generarla.
[ ! $(sgdisk -p $DISK 2>&1 >/dev/null) ] || echo -e "2\nw\nY\n" | gdisk $DISK
sgdisk $DISK -d$NPART 2>/dev/null
;;
MSDOS)
# Si la tabla de particiones no es valida, volver a generarla.
parted -s $DISK print &>/dev/null || fdisk $DISK <<< "w"
# Eliminar la partición de caché.
echo -e "d\n$NPART\nw" | fdisk $DISK 2>/dev/null
;;
esac
# Borrar etiqueta de la caché.
rm -f /dev/disk/by-label/CACHE
#Actualiza la tabla de particiones en el kernel.
ogUpdatePartitionTable $NDISK
}
#/**
# ogFindCache
#@brief Detecta la partición caché local.
#@param No requiere parametros
#@return int_ndisk int_npart - devuelve el par nº de disco-nº de partición .
#@warning Si no hay cache no devuelve nada
#@version 0.1 - Integracion para Opengnsys - EAC: FindCache() en ATA.lib - HIDRA: DetectarCache.sh
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@Date 2008/06/19
#@author Antonio J. Doblas Viso. Universidad de Malaga
#@Date 2008/10/27
#@version 0.91 - Adaptacion a la cache local de OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010/03/16
#@version 1.0.5 - Obtener caché en discos GPT.
#@author Alberto García, Universidad de Málaga y Ramon Gomez, ETSII Universidad de Sevilla
#@date 2014/05/28
#*/ ##
function ogFindCache ()
{
# Variables locales
local DISK PART
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 1 4"
return
fi
# Obtener el dispositivo del sistema de archivos etiquetado como "CACHE".
PART=$(blkid -L "CACHE")
# En discos nvme con particiones GPT la partición se detecta usando el tag PARTLABEL
PART=${PART:-$(blkid -t PARTLABEL=CACHE | awk -F: '{print $1}')}
# Si no se detecta, obtener particiones marcadas de tipo caché en discos MSDOS.
PART=${PART:-$(sfdisk -l 2>/dev/null | awk '$6~/ca|a7/ {print $1}')}
# Por último revisar todos los discos GPT y obtener las particiones etiquetadas como caché.
if [ -z "$PART" ]; then
for DISK in $(ogDiskToDev); do
# Nota: se añade espacio separador solo si existe valor previo.
PART="${PART:+"$PART "}$(sgdisk -p $DISK 2>/dev/null | awk -v d=$DISK '$7~/CACHE/ {printf "%s%s",d,$1;}')"
done
fi
# Devolver número de disco y número de partición de la 1ª partición encontrada.
ogDevToDisk ${PART%% *} 2>/dev/null
}
#/**
# ogFormatCache
#@brief Formatea el sistema de ficheros para la caché local.
#@return (por determinar)
#@warning Prueba con formato Reiser.
#@attention
#@note El sistema de archivos de la caché se queda montado.
#@version 0.1 - Integracion para Opengnsys - EAC: FormatCache() en ATA.lib
#@author Antonio J. Doblas Viso. Universidad de Malaga
#@date 2008/10/27
#@version 0.91 - Creacion cache local.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010-03-11
#@version 1.1.0 - llamada a updateBootCache.
#@author Antonio J. Doblas Viso. Universidad de Malaga
#@date 2018-01-21
#*/ ##
function ogFormatCache ()
{
# Variables locales.
local DEV MNTDIR OPTIONS
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME"
return
fi
# Error si no hay definida partición de caché.
DEV=$(ogFindCache) || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
DEV=$(ogDiskToDev $DEV) || return $?
# Formatear sistema de ficheros.
ogUnmountCache 2>/dev/null
OPTIONS="extent,large_file"
[[ $(uname -r) =~ ^5 ]] && OPTIONS+=",uninit_bg,^metadata_csum,^64bit"
mkfs.ext4 -q -F $DEV -L "CACHE" -O "$OPTIONS" 2>/dev/null || ogRaiseError $OG_ERR_PARTITION "CACHE" || return $?
# Crear estructura básica.
MNTDIR=$(ogMountCache)
mkdir -p $MNTDIR/$OGIMG
# Incluir kernel e Initrd del ogLive
updateBootCache 2>&1>/dev/null
}
#/**
# ogGetCacheSize
#@brief Devuelve el tamaño definido para la partición de caché.
#@return int_partsize tamaño de la partición (en KB)
#@exception OG_ERR_PARTITION No existe partición de caché.
#@version 0.1 - Integracion para Opengnsys - EAC: InfoCache() en FileSystem.lib
#@author Antonio J. Doblas Viso. Universidad de Malaga
#@date 2008/10/27
#@version 0.91 - Definicion de cache local.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010/03/09
#*/ ##
function ogGetCacheSize ()
{
# Variables locales
local PART
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 10000000"
return
fi
# Error si no se encuentra partición de caché.
PART=$(ogFindCache) || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
# Devuelve tamaño de la partición de caché.
ogGetPartitionSize $PART
}
#/**
# ogGetCacheSpace
#@brief Devuelve el espacio de disco disponible para la partición de caché.
#@return int_size tamaño disponible (en KB)
#@note El espacio disponible es el que hay entre el límite superior de la partición 3 del disco 1 y el final de dicho disco, y no puede ser superior a la mitad de dicho disco.
#@version 0.1 - Integracion para Opengnsys - EAC: InfoCache() en FileSystem.lib
#@author Antonio J. Doblas Viso. Universidad de Malaga
#@date 2008/10/27
#@version 0.91 - Definicion de cache local.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010/03/09
#@version 1.0.5 - Uso de ogFindCache para detectar disco y particion
#@author Universidad de Huelva
#@date 2012/09/18
#*/ ##
function ogGetCacheSpace ()
{
# Variables locales.
local NDISK DISK NPART SECTORS CYLS ENDPART3
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 23165386"
return
fi
# Parche UHU para usar ogFindCache en lugar de 1
# Error si no se encuentra partición de caché.
read NDISK NPART <<<"$(ogFindCache)"
[ -n "$NDISK" -a -n "$NPART" ] || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
DISK=$(ogDiskToDev $NDISK) || return $?
SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions)
CYLS=$(sfdisk -g $DISK | cut -f2 -d" ")
SECTORS=$[SECTORS/CYLS*CYLS-1]
ENDPART3=$(sfdisk -uS -l $DISK | awk -v P="${DISK}3" '{if ($1==P) print $3}')
# Mostrar espacio libre en KB (1 KB = 2 sectores)
if [ $ENDPART3 -gt $[SECTORS/2] ]; then
echo $[(SECTORS-ENDPART3)/2]
else
echo $[SECTORS/4]
fi
}
#/**
# ogMountCache
#@brief Monta la partición Cache y exporta la variable $OGCAC
#@param sin parametros
#@return path_mountpoint - Punto de montaje del sistema de archivos de cache.
#@warning Salidas de errores no determinada
#@version 0.1 - Integracion para Opengnsys - EAC: MountCache() en FileSystem.lib - HIDRA: MontarCache.sh
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2008/06/19
#@author Antonio J. Doblas Viso. Universidad de Malaga
#@Date 2008/10/27
#@version 0.91 - Adaptacion a la cache local de OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010/03/16
#@version 1.0 - Correccion multiples montajes de cache.
#@author Antonio J. Doblas Viso, Universidad de Malaga
#@date 2011/02/24
#*/ ##
function ogMountCache ()
{
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME ==> /mnt/sda4"
return
fi
ogMountFs $(ogFindCache) 2>/dev/null || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
}
#/**
# ogUnmountCache
#@brief Desmonta la particion Cache y elimina la variable $OGCAC
#@param sin parametros
#@return nada
#@warning Salidas de errores no determinada
#@version 0.1 - Integracion para Opengnsys - EAC: UmountCache() en FileSystem.lib
#@author Antonio J. Doblas Viso. Universidad de Malaga
#@Date 2008/10/27
#@version 0.91 - Adaptacion a la cache local de OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010/03/16
#@version 1.0 - Correccion multiples montajes de cache.
#@author Antonio J. Doblas Viso, Universidad de Malaga
#@date 2011/02/24
#*/ ##
function ogUnmountCache ()
{
# Variables locales.
local CACHE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME"
return
fi
CACHE=$(ogFindCache) || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE"
ogIsMounted $CACHE || return 0
ogUnmountFs $CACHE
# Borrar enlace simbólico de /mnt/ParticiónCache.
rm -f $(ogDiskToDev $CACHE | sed 's/dev/mnt/')
}

File diff suppressed because it is too large Load Diff

View File

@ -1,422 +0,0 @@
#!/bin/bash
#/**
#@file File.lib
#@brief Librería o clase File
#@class File
#@brief Funciones para gestión de archivos y directorios.
#@version 1.0.4
#@warning License: GNU GPLv3+
#*/
#/**
# ogCalculateChecksum [ str_repo | int_ndisk int_npart ] path_filepath
#@brief Devuelve la suma de comprobación (checksum) de un fichero.
#@param path_filepath camino del fichero (independiente de mayúsculas)
#@param str_repo repositorio de ficheros
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@return hex_checksum Checksum del fichero
#@version 0.9.2 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010-07-24
#@version 1.0.4 - Calcula solo el checksum del último MB del fichero.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2012-03-16
#*/ ##
function ogCalculateChecksum ()
{
# Variables locales.
local FILE
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \
"$FUNCNAME REPO ubuntu.img ==> ef899299caf8b517ce36f1157a93d8bf"
return
fi
# Comprobar que existe el fichero y devolver sus datos.
FILE=$(ogGetPath "$@")
[ -n "$FILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
tail -c1M "$FILE" | md5sum -b 2>&1 | cut -f1 -d" "
}
#/**
# ogCompareChecksumFiles [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
#@brief Metafunción que compara las sumas de comprobación almacenadas de 2 ficheros.
#@return bool_compare Valor de comparación.
#@warning No es necesario especificar la extensión ".sum".
#@version 0.9.2 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010-07-24
#*/ ##
function ogCompareChecksumFiles ()
{
# Variables locales.
local ARGS SOURCE TARGET
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \
"if $FUNCNAME REPO ubuntu.img CACHE ubuntu.img; then ...; fi"
return
fi
ARGS="$@"
case "$1" in
/*) # Camino completo. */ (Comentrio Doxygen)
SOURCE=$(ogGetPath "$1")
shift ;;
[1-9]*) # ndisco npartición.
SOURCE=$(ogGetPath "$1" "$2" "$3")
shift 3 ;;
*) # Otros: repo, cache, cdrom (no se permiten caminos relativos).
SOURCE=$(ogGetPath "$1" "$2")
shift 2 ;;
esac
TARGET=$(ogGetPath "$@")
# Comparar los ficheros de checksum.
test "$(cat "$SOURCE.sum" 2>/dev/null)" == "$(cat "$TARGET.sum" 2>/dev/null)"
}
#/**
# ogCalculateFullChecksum [ str_repo | int_ndisk int_npart ] path_filepath
#@brief Devuelve la suma COMPLETA de comprobación (checksum) de un fichero.
#@param path_filepath camino del fichero (independiente de mayúsculas)
#@param str_repo repositorio de ficheros
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@return hex_checksum Checksum del fichero
#@version 1.0.5 - Primera versión para OpenGnSys.
#@author Antonio Doblas Viso, EVLT Universidad de Málaga
#@date 2014-07-09
#*/ ##
function ogCalculateFullChecksum ()
{
# Variables locales.
local FILE
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \
"$FUNCNAME REPO ubuntu.img ==> ef899299caf8b517ce36f1157a93d8bf"
return
fi
# Comprobar que existe el fichero y devolver sus datos.
FILE=$(ogGetPath "$@")
[ -n "$FILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
#ADV
md5sum "$FILE" -b 2>&1 | cut -f1 -d" "
# tail -c1M "$FILE" | md5sum -b 2>&1 | cut -f1 -d" "
}
#/**
# ogCopyFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
#@brief Metafunción para copiar un fichero de sistema OpenGnSys a un directorio.
#@see ogGetPath
#@return Progreso de la copia.
#@warning Deben existir tanto el fichero origen como el directorio destino.
#@version 0.9 - Pruebas con OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-10-20
#@version 1.0.4 - Copiar usando rsync.
#@author Universidad de Huelva
#@date 2012-07-06
#*/ ##
function ogCopyFile ()
{
# Variables locales.
local ARGS SOURCE TARGET
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_source [ str_repo | int_ndisk int_npartition ] path_target" \
"$FUNCNAME REPO newfile.txt 1 2 /tmp/newfile.txt"
return
fi
ARGS="$@"
case "$1" in
/*) # Camino completo. */ (Comentrio Doxygen)
SOURCE="$(ogGetPath "$1")"
shift ;;
[1-9]*) # ndisco npartición.
SOURCE="$(ogGetPath "$1" "$2" "$3")"
shift 3 ;;
*) # Otros: repo, cache, cdrom (no se permiten caminos relativos).
SOURCE="$(ogGetPath "$1" "$2")"
shift 2 ;;
esac
# Comprobar fichero origen y directorio destino.
[ -n "$SOURCE" ] || ogRaiseError $OG_ERR_NOTFOUND "${ARGS% $*}" || return $?
TARGET="$(ogGetPath "$@")"
[ -n "$TARGET" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
# Copiar fichero (para evitar problemas de comunicaciones las copias se hacen con rsync en vez de cp).
rsync --progress --inplace -avh "$SOURCE" "$TARGET"
}
#/**
# ogDeleteFile [ str_repo | int_ndisk int_npartition ] path_filepath
#@brief Metafunción que borra un fichero de un dispositivo.
#@see ogGetPath
#@version 0.9 - Pruebas con OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-09-29
#*/ ##
function ogDeleteFile ()
{
# Variables locales.
local FILE
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_file" \
"$FUNCNAME 1 2 /tmp/newfile.txt"
return
fi
# Comprobar que existe el fichero y borrarlo.
FILE="$(ogGetPath "$@")"
[ -n "$FILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
rm -f "$FILE" || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
}
#/**
# ogDeleteTree [ str_repo | int_ndisk int_npartition ] path_dirpath
#@brief Metafunción que borra todo un subárbol de directorios de un dispositivo.
#@see ogGetPath
#@version 0.9 - Pruebas con OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-09-29
#*/ ##
function ogDeleteTree ()
{
# Variables locales.
local DIR
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_dir" \
"$FUNCNAME 1 2 /tmp/newdir"
return
fi
# Comprobar que existe el directorio y borrarlo con su contenido.
DIR="$(ogGetPath "$@")"
[ -n "$DIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
rm -fr "$DIR" || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
}
#/**
# ogGetPath [ str_repo | int_ndisk int_npartition ] path_filepath
#@brief Inicia el proceso de arranque de un sistema de archivos.
#@param path_filepath camino del fichero (independiente de mayúsculas)
#@param str_repo repositorio de ficheros
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@return path_file - camino completo real del fichero.
#@note repo = { REPO, CACHE, CDROM }
#@note Requisitos: \c grep \c sed
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero o dispositivo no encontrado.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#@warning En caso de error, sólo devuelve el código y no da mensajes.
#@todo Terminar de definir parámetros para acceso a repositorios.
#@version 0.1 - Integracion para Opengnsys - HIDRA: CaminoWindows.sh; EAC: GetPath(), FormatSintaxSpacePath(), FormatSintaxBackSlashPath (), en FileSystem.lib
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@Date 2008/10/10
#@author Antonio J. Doblas Viso. Universidad de Malaga
#@date 2008/10/27
#@version 0.9 - Pruebas con OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-09-15
#@version 1.1.1 - Correccion comentarios autodocumentacion doxygen .
#@author Antonio J. Doblas Viso. Universidad de Malaga
#@date 2018-07-05
#*/ ##
function ogGetPath ()
{
# Variables locales.
local MNTDIR FILE PREVFILE FILEPATH CURRENTDIR
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \
"$FUNCNAME \"/mnt/sda1/windows/system32\" ==> /mnt/sda1/WINDOWS/System32" \
"$FUNCNAME REPO /etc/fstab ==> /opt/opengnsys/images/etc/fstab" \
"$FUNCNAME 1 1 \"/windows/system32\" ==> /mnt/sda1/WINDOWS/System32"
return
fi
# Procesar camino según el número de parámetros.
case $# in
1) FILE="$1" ;;
2) case "${1^^}" in
REPO)
FILE="$OGIMG/$2" ;;
CACHE)
MNTDIR="$(ogMountCache)" || return $?
FILE="$MNTDIR/$OGIMG/$2" ;;
CDROM)
MNTDIR="$(ogMountCdrom)" || return $?
FILE="$MNTDIR/$2" ;;
*) ogRaiseError $OG_ERR_FORMAT
return $? ;;
esac ;;
3) MNTDIR="$(ogMount $1 $2)" || return $?
FILE="$MNTDIR/$3" ;;
*) ogRaiseError $OG_ERR_FORMAT
return $? ;;
esac
# Eliminar caracteres \c / duplicados y finales.
FILE="$(echo $FILE|sed -e 's/\(\/\)*\1/\//g; s/\/$//')"
# Comprobar si existe el fichero para reducir tiempos.
if [ -e "$FILE" ]; then
FILEPATH="$FILE"
else
# Buscar el nombre correcto en cada subdirectorio del camino.
FILEPATH="/"
while [ "$FILE" != "$PREVFILE" ]; do
FILEPATH="$(ls -d "${FILEPATH%/}/${FILE%%/*}" 2>/dev/null || find "$FILEPATH" -maxdepth 1 -iname "${FILE%%/*}" -print 2>/dev/null)" #*/ (Comentario Doxygen)
PREVFILE="$FILE"
FILE="${FILE#*/}"
done
fi
[ -n "$FILEPATH" ] && echo "$FILEPATH"
return 0
}
#/**
# ogGetParentPath [ str_repo | int_ndisk int_npartition ] path_filepath
#@brief Metafunción que devuelve el camino del directorio padre.
#@see ogGetPath
#@version 0.9 - Pruebas con OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-09-29
#*/ ##
function ogGetParentPath ()
{
local PARENT
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \
"$FUNCNAME \"/mnt/sda1/windows/system32\" ==> /mnt/sda1/WINDOWS" \
"$FUNCNAME REPO /etc/fstab ==> /opt/opengnsys/images/etc" \
"$FUNCNAME 1 1 \"/windows/system32\" ==> /mnt/sda1/WINDOWS"
return
fi
case $# in
1) PARENT="$(dirname "$1")" ;;
2) PARENT="$1 $(dirname "/$2")" ;;
3) PARENT="$1 $2 $(dirname "/$3")" ;;
*) ogRaiseError $OG_ERR_FORMAT
return $? ;;
esac
ogGetPath $PARENT
}
#/**
# ogIsNewerFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
#@brief Metafunción que indica se un fichero es más nuevo que otro.
#@see ogGetPath
#@return Código de salida: 0 - nuevo, 1 - antiguo o error
#@warning Deben existir tanto el fichero origen como el destino.
#@version 0.9.2 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010-07-24
#@version 1.0.1 - Devolver falso en caso de error.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-05-18
#*/ ##
function ogIsNewerFile ()
{
# Variables locales.
local ARGS SOURCE TARGET
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_source [ str_repo | int_ndisk int_npartition ] path_target" \
"if $FUNCNAME REPO ubuntu.img CACHE ubuntu.img; then ... fi"
return
fi
ARGS="$@"
case "$1" in
/*) # Camino completo. */ (Comentrio Doxygen)
SOURCE="$(ogGetPath "$1")"
shift ;;
[1-9]*) # ndisco npartición.
SOURCE="$(ogGetPath "$1" "$2" "$3")"
shift 3 ;;
*) # Otros: repo, cache, cdrom (no se permiten caminos relativos).
SOURCE="$(ogGetPath "$1" "$2")"
shift 2 ;;
esac
# Comprobar que existen los ficheros origen y destino.
[ -n "$SOURCE" ] || ogRaiseError $OG_ERR_NOTFOUND "${ARGS% $*}" || return 1
TARGET=$(ogGetPath "$@")
[ -n "$TARGET" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return 1
# Devolver si el primer fichero se ha modificado después que el segundo.
test "$SOURCE" -nt "$TARGET"
}
#/**
# ogMakeChecksumFile [ str_repo | int_ndisk int_npart ] path_filepath
#@brief Metafunción que guarda el valor de comprobación de un fichero.
#@see ogCalculateChecksum
#@warning Genera un fichero con extensión ".sum".
#@version 0.9.2 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010-07-24
#*/ ##
function ogMakeChecksumFile ()
{
# Variables locales.
local FILE
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \
"$FUNCNAME REPO ubuntu.img"
return
fi
# Comprobar que existe el fichero y guardar su checksum.
FILE="$(ogGetPath "$@")"
[ -n "$FILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
ogCalculateChecksum "$FILE" > "$FILE.sum"
}
#/**
# ogMakeDir [ str_repo | int_ndisk int_npartition ] path_dirpath
#@brief Metafunción que crea un subdirectorio vacío en un dispositivo.
#@see ogGetParentPath
#@version 0.1 - Integracion para Opengnsys - HIDRA: CrearDirectorio.sh, EAC: MkdirPath() en FileSystem.lib
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@Date 2008/10/10
#@author Antonio J. Doblas Viso. Universidad de Malaga
#@date 2008/10/27
#@version 0.9 - Pruebas con OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-09-29
#*/ ##
function ogMakeDir ()
{
local PARENT DIR
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_dir" \
"$FUNCNAME 1 2 /tmp/newdir"
return
fi
PARENT="$(ogGetParentPath "$@")" || return $?
DIR="$(basename "${!#}")"
mkdir -p "$PARENT/$DIR" || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,528 +0,0 @@
#!/bin/bash
#/**
#@file Inventory.lib
#@brief Librería o clase Inventory
#@class Inventory
#@brief Funciones para recogida de datos de inventario de hardware y software de los clientes.
#@version 1.1.0
#@warning License: GNU GPLv3+
#*/
#/**
# ogGetArch
#@brief Devuelve el tipo de arquitectura del cliente.
#@return str_arch - Arquitectura (i386 para 32 bits, x86_64 para 64 bits).
#@version 0.9.2 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010-07-17
#*/
function ogGetArch ()
{
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => x86_64"
return
fi
[ -d /lib64 ] && echo "x86_64" || echo "i386"
}
#/**
# ogGetOsType int_ndisk int_npartition
#@brief Devuelve el tipo del sistema operativo instalado.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@return OSType - Tipo de sistema operativo.
#@see ogGetOsVersion
#*/ ##
function ogGetOsType ()
{
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
"$FUNCNAME 1 2 => Linux"
return
fi
ogGetOsVersion "$@" | cut -sf1 -d:
}
#/**
# ogGetOsUuid int_ndisk int_nfilesys
#@brief Devuelve el UUID del sistema operativo instalado en un sistema de archivos.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden de la partición
#@return str_uuid - UUID del sistema operativo.
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositiv
#@version 1.1.0 - Primera versión para OpenGnsys
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2015-09-09
#*/ ##
function ogGetOsUuid ()
{
# Variables locales.
local MNTDIR
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
"$FUNCNAME 1 2 => 540e47c6-8e78-4178-aa46-042e4803fb16"
return
fi
# Error si no se reciben 2 parametros.
[ $# = 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Montar la particion, si no lo estaba previamente.
MNTDIR=$(ogMount $1 $2) || return $?
# Obtener UUID según el tipo de sistema operativo.
case "$(ogGetOsType $1 $2)" in
Linux)
# Leer el UUID del sistema de ficheros raíz o el fichero de identificador.
findmnt -no UUID $MNTDIR 2>/dev/null || cat $MNTDIR/etc/machine-id 2>/dev/null
;;
Windows)
# Leer identificador en clave de registro.
ogGetRegistryValue $MNTDIR SOFTWARE '\Microsoft\Cryptography\MachineGuid' 2>/dev/null
;;
esac
}
#/**
# ogGetSerialNumber
#@brief Obtiene el nº de serie del cliente.
#@version 1.1.0 - Primeras versión con OpenGnsys
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2015-06-08
#*/ ##
function ogGetSerialNumber ()
{
# Variables locales.
local SERIALNO
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 123456"
return
fi
# Obtener nº de serie (ignorar los no especificados).
SERIALNO=$(dmidecode -s system-serial-number | egrep -vi "(^[ 0]+$|not specified|to be filled|invalid entry|default string)")
# Quitar espacios y truncar cadena si >25 caracteres.
SERIALNO="${SERIALNO// /}"
[ ${#SERIALNO} -gt 25 ] && SERIALNO="${SERIALNO:0:22}..."
[ -n "$SERIALNO" ] && echo "$SERIALNO"
return 0
}
#/**
# ogIsEfiActive
#@brief Comprueba si el sistema tiene activo el arranque EFI.
#*/ ##
function ogIsEfiActive ()
{
test -d /sys/firmware/efi
}
#/**
# ogListHardwareInfo
#@brief Lista el inventario de hardware de la máquina cliente.
#@return TipoDispositivo:Modelo (por determinar)
#@warning Se ignoran los parámetros de entrada.
#@note TipoDispositivo = { bio, boa, bus, cha, cdr, cpu, dis, fir, mem, mod, mul, net, sto, usb, vga }
#@note Requisitos: dmidecode, lshw, awk
#@version 0.1 - Primeras pruebas con OpenGnSys
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-07-28
#@version 1.1.0 - Incluir nuevos componentes al inventario.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2014-04-23
#*/ ##
function ogListHardwareInfo ()
{
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME"
return
fi
# Recopilación de dispositivos procesando la salida de \c lshw
ogEcho info "$MSG_HARDWAREINVENTORY}"
echo "cha=$(dmidecode -s chassis-type)" | grep -v "Other"
[ -e /sys/firmware/efi ] && echo "boo=UEFI" || echo "boo=BIOS"
lshw | awk 'BEGIN {type="mod";}
/product:/ {sub(/ *product: */,""); prod=$0;}
/vendor:/ {sub(/ *vendor: */,""); vend=$0;}
/version:/ {sub(/ *version: */,"v.");vers=$0;}
/size:/ {size=$2;}
/clock:/ {clock=$2;}
/slot:/ {sub(/ *slot: */,""); slot=$0;}
/\*-/ {if (type=="mem"){
if (size!=""){
numbank++;
print type"="vend,prod,size,clock" ("slot")";}
}else{
if (type=="totalmem"){
if (size!=""){
totalmemory="mem="size;}
}else{
if (type!="" && prod!=""){
if (prod=="v."vers)
vers="";
print type"="vend,prod,size,vers;} }
}
type=prod=vend=vers=size=clock=slot="";}
$1~/-core/ {type="boa";}
$1~/-firmware/ {type="bio";}
$1~/-cpu/ {type="cpu";}
$1~/-bank/ {type="mem";}
$1~/-memory/ {type="totalmem";}
$1~/-ide/ {type="ide";}
$1~/-storage/ {type="sto";}
$1~/-disk/ {type="dis";}
$1~/-cdrom/ {type="cdr";}
$1~/-display/ {type="vga";}
$1~/-network/ {type="net";}
$1~/-multimedia/ {type="mul";}
$1~/-usb/ {type="usb";}
$1~/-firewire/ {type="fir";}
$1~/-serial/ {type="bus";}
END {if (type!="" && prod!="")
print type"="vend,prod,size,vers;
if (length(numbank)==0 && length(totalmemory)>=4)
print totalmemory; }
'
# */ (comentario para Doxygen)
}
#/**
# ogListSoftware int_ndisk int_npartition
#@brief Lista el inventario de software instalado en un sistema operativo.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@return programa versión ...
#@warning Se ignoran los parámetros de entrada.
#@note Requisitos: ...
#@todo Detectar software en Linux
#@version 0.1 - Primeras pruebas con OpenGnSys
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-09-23
#@version 1.0.5 - Aproximación para inventario de software de Mac OS.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2013-10-08
#@version 1.0.6 - Proceso depende del tipo de SO y soporte para FreeBSD.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2014-11-13
#@version 1.1.0 - Se muestra el sistema operativo en la primera línea de la salida
#@author Irina Gomez, ETSII Universidad de Sevilla
#@date 2016-04-26
#*/ ##
function ogListSoftware ()
{
# Variables locales.
local APPS HIVE k KEYS KEYS32 MNTDIR PKGDIR PROG VERS TMPFILE TYPE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME 1 1"
return
fi
# Error si no se reciben 2 parametros.
[ $# = 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Obtener tipo de sistema de archivos y montarlo.
MNTDIR=$(ogMount $1 $2) || return $?
TYPE=$(ogGetOsType $1 $2) || return $?
# Ficheros temporales.
APPS=$(mktemp /tmp/apps.XXXXX)
TMPFILE=$(mktemp /tmp/tmp.XXXXX)
trap "rm -f $APPS $TMPFILE" 1 2 3 9 15
case "$TYPE" in
Linux) # Software de GNU/Linux.
# Procesar paquetes dpkg.
PKGDIR="${MNTDIR}/var/lib/dpkg"
if [ -r $PKGDIR ]; then
# Proceso de fichero en sistemas de 64 bits.
awk '/Package:/ {if (pack!="") print pack,vers;
sub(/-dev$/,"",$2);
pack=$2}
/Version:/ {sub(/^.*:/,"",$2); sub(/-.*$/,"",$2);
vers=$2}
/Status:/ {if ($2!="install") pack=vers=""}
END {if (pack!="") print pack,vers}
' $PKGDIR/status > $APPS
fi
# Procesar paquetes RPM.
PKGDIR="${MNTDIR}/var/lib/rpm"
if [ -r $PKGDIR ]; then
# Listar si está instalado el paquete "rpm" en el cliente.
if which rpm &>/dev/null; then
rm -f ${PKGDIR}/__db.*
rpm --dbpath $PKGDIR -qa --qf "%{NAME} %{VERSION}\n" 2>/dev/null | \
awk '$1!~/-devel$/ {sub(/-.*$/,"",$2); print $0}' > $APPS
rm -f ${PKGDIR}/__db.*
else
# Obtener el nombre de cada paquete en la BD de RPM.
python <<<"
import re;
import bsddb;
db=bsddb.hashopen('$PKGDIR/Name','r');
for k in db.keys():
print re.sub('-devel$','',k);" > $APPS
fi
fi
# Procesar paquetes pacman.
PKGDIR="${MNTDIR}/var/lib/pacman/local"
if [ -r $PKGDIR ]; then
ls $PKGDIR | awk -F- '/-/ {print gensub(/-/, " ", NF-2);}' > $APPS
fi
# Procesar aplicaciones Snappy.
PKGDIR="${MNTDIR}/snap"
find $PKGDIR/*/current/meta -name snap.yaml -exec \
awk '/name:/ {pack=$2}
/version:/ {vers=$2}
END {if (pack!="") print pack,"(snap)",vers}' {} 2>/dev/null \; >> $APPS
# Procesar aplicaciones Flatpak.
PKGDIR="${MNTDIR}/var/lib/flatpak"
ls -1 $PKGDIR/app/*/current/active/deploy 2> /dev/null | python -c "
import sys
for f in sys.stdin:
p = open(f.strip()).read().split('\0')
try:
if(p[0] != 'flathub'):
raise ValueError
print('{} (flatpak) {}'.format(p[p.index('appdata-name') + 4], p[p.index('appdata-version') + 1]))
except ValueError:
pass
" >> $APPS
;;
Windows) # Software de Windows.
# Comprobar tipo de proceso del registro de Windows.
if which hivexregedit &>/dev/null; then
# Nuevo proceso más rápido basado en "hivexregedit".
HIVE=$(ogGetHivePath $MNTDIR software 2>/dev/null)
if [ -n "$HIVE" ]; then
# Claves de registro para programas instalados.
hivexregedit --unsafe-printable-strings --export "$HIVE" '\Microsoft\Windows\CurrentVersion\Uninstall' > $TMPFILE 2>/dev/null
hivexregedit --unsafe-printable-strings --export "$HIVE" '\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall' >> $TMPFILE 2>/dev/null
# Mostrar los valores "DisplayName" y "DisplayVersion" para cada clave.
awk -F\" '$1~/^\[/ {n=""}
$2~/DisplayName/ {n=$4}
$2~/DisplayVersion/ {print n,$4}
' $TMPFILE > $APPS
fi
else
# Compatibilidad con clientes ogLive antiguos.
# Claves de registro para programas instalados: formato "{clave}".
KEYS=$(ogListRegistryKeys $MNTDIR software '\Microsoft\Windows\CurrentVersion\Uninstall')
KEYS32=$(ogListRegistryKeys $MNTDIR software '\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall')
# Mostrar los valores "DisplayName" y "DisplayVersion" para cada clave.
for k in $KEYS; do
PROG=$(ogGetRegistryValue $MNTDIR software "\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$k\\DisplayName")
if [ -n "$PROG" ]; then
VERS=$(ogGetRegistryValue $MNTDIR software "\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$k\\DisplayVersion")
echo "$PROG $VERS"
fi
done > $APPS
for k in $KEYS32; do
PROG=$(ogGetRegistryValue $MNTDIR software "\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$k\\DisplayName")
if [ -n "$PROG" ]; then
VERS=$(ogGetRegistryValue $MNTDIR software "\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$k\\DisplayVersion")
echo "$PROG $VERS"
fi
done >> $APPS
fi
;;
MacOS) # Software de Mac OS.
# Listar directorios de aplicaciones e intentar obtener la versión del fichero .plist (tanto original como descomprimido).
find "${MNTDIR}/Applications" -type d -name "*.app" -prune -print | \
while read k; do
FILE="$k/Contents/version.plist"
[ -s "$FILE" ] || FILE="$k/Contents/version.plist.uncompress"
[ -s "$FILE" ] && VERSION=$(awk -F"[<>]" '/ShortVersionString/ {getline;v=$3}
END {print v}' "$FILE")
echo "$(basename "$k" .app) $VERSION"
done > $APPS
;;
BSD) # Software de FreeBSD.
sqlite3 $MNTDIR/var/db/pkg/local.sqlite <<<"SELECT name FROM pkg_search;" 2>/dev/null | \
sed 's/\(.*\)-\(.*\)/\1 \2/g' > $APPS
;;
*) ogRaiseError $OG_ERR_NOTOS "$1, $2 ${TYPE+($TYPE)}"
return $? ;;
esac
# Mostrar sistema Operativo y aplicaciones.
ogGetOsVersion $1 $2 | awk -F: '{print $2}'
sort $APPS | uniq | iconv -ct utf-8
rm -f $APPS $TMPFILE
}
#/**
# ogGetOsVersion int_ndisk int_nfilesys
#@brief Devuelve la versión del sistema operativo instalado en un sistema de archivos.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden de la partición
#@return OSType:OSVersion - tipo y versión del sistema operativo.
#@note OSType = { Android, BSD, GrubLoader, Hurd, Linux, MacOS, Solaris, Windows, WinLoader }
#@note Requisitos: awk, head, chroot
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositiv
#@exception OG_ERR_PARTITION Fallo al montar el sistema de archivos.
#@version 0.9 - Primera versión para OpenGnSys
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-09-15
#@version 1.0.4 - Incluir tipos BSD, MacOS y Solaris.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2012-06-29
#@version 1.0.5 - Incluir tipos GrubLoader, Hurd y WinLoader, leer por defecto fichero /etc/os-release.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2013-10-07
#@version 1.0.6 - Detectar GrubLoader al final y sistemas basados en EFI.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2014-08-27
#*/ ##
function ogGetOsVersion ()
{
# Variables locales.
local MNTDIR TYPE DISTRIB VERSION IS64BIT FILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
"$FUNCNAME 1 2 => Linux:Ubuntu precise (12.04 LTS) 64 bits"
return
fi
# Error si no se reciben 2 parametros.
[ $# = 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Montar la particion, si no lo estaba previamente.
MNTDIR=$(ogMount $1 $2) || return $?
# Buscar tipo de sistema operativo.
# Para GNU/Linux: leer descripción.
TYPE="Linux"
FILE="$MNTDIR/etc/os-release"
[ -r $FILE ] && VERSION="$(awk -F= '$1~/PRETTY_NAME/ {gsub(/\"/,"",$2); print $2}' $FILE)"
# Si no se puede obtener, buscar en ficheros del sistema.
if [ -z "$VERSION" ]; then
FILE="$MNTDIR/etc/lsb-release"
[ -r $FILE ] && VERSION="$(awk -F= '$1~/DESCRIPTION/ {gsub(/\"/,"",$2); print $2}' $FILE)"
for DISTRIB in redhat SuSE mandrake gentoo; do
FILE="$MNTDIR/etc/${DISTRIB}-release"
[ -r $FILE ] && VERSION="$(head -1 $FILE)"
done
FILE="$MNTDIR/etc/arch-release"
[ -r $FILE ] && VERSION="Arch Linux"
FILE="$MNTDIR/etc/slackware-version"
[ -r $FILE ] && VERSION="Slackware $(cat $FILE)"
fi
# Si no se encuentra, intentar ejecutar "lsb_release".
[ -z "$VERSION" ] && VERSION=$(chroot $MNTDIR lsb_release -d 2>/dev/null | awk -F":\t" '{print $2}')
# Comprobar Linux de 64 bits.
[ -n "$VERSION" ] && [ -e $MNTDIR/lib64 ] && IS64BIT="$MSG_64BIT"
# Para Android, leer fichero de propiedades.
if [ -z "$VERSION" ]; then
TYPE="Android"
FILE="$MNTDIR/android*/system/build.prop"
[ -r $FILE ] && VERSION="Android $(awk -F= '$1~/(product.brand|build.version.release)/ {print $2}' $FILE | tr '\n' ' ')"
[ -e $MNTDIR/lib64 ] && IS64BIT="$MSG_64BIT"
fi
# Para GNU/Hurd, comprobar fichero de inicio (basado en os-prober).
if [ -z "$VERSION" ]; then
TYPE="Hurd"
FILE="$MNTDIR/hurd/init"
[ -r $FILE ] && VERSION="GNU/Hurd"
fi
# Para Windows: leer la version del registro.
if [ -z "$VERSION" ]; then
TYPE="Windows"
FILE="$(ogGetHivePath $MNTDIR SOFTWARE)"
if [ -n "$FILE" ]; then
# Nuevo método más rápido para acceder al registro de Windows..
VERSION=$(echo $(hivexsh << EOT 2>/dev/null
load $FILE
cd \Microsoft\Windows NT\CurrentVersion
lsval ProductName
lsval ReleaseId
EOT
))
[ -n "$(reglookup -H -p "Microsoft/Windows/CurrentVersion/ProgramW6432Dir" "$FILE" 2>/dev/null)" ] && IS64BIT="$MSG_64BIT"
if [ -z "$VERSION" ]; then
# Compatibilidad con métrodo antiguo y más lento de acceder al registro.
VERSION=$(ogGetRegistryValue $MNTDIR software '\Microsoft\Windows NT\CurrentVersion\ProductName' 2>/dev/null)
[ -n "$(ogGetRegistryValue $MNTDIR software '\Microsoft\Windows\CurrentVersion\ProgramW6432Dir' 2>/dev/null)" ] && IS64BIT="$MSG_64BIT"
fi
fi
fi
# Para cargador Windows: buscar versión en fichero BCD (basado en os-prober).
if [ -z "$VERSION" ]; then
TYPE="WinLoader"
FILE="$(ogGetPath $MNTDIR/boot/bcd)"
[ -z "$FILE" ] && FILE="$(ogGetPath $MNTDIR/EFI/Microsoft/boot/bcd)"
if [ -n "$FILE" ]; then
for DISTRIB in "Windows Recovery" "Windows Boot"; do
if grep -aqs "$(echo "$DISTRIB" | sed 's/./&./g')" $FILE; then
VERSION="$DISTRIB loader"
fi
done
fi
fi
# Para macOS: detectar kernel y completar con fichero plist de información del sistema.
if [ -z "$VERSION" ]; then
TYPE="MacOS"
# Kernel de Mac OS (no debe ser fichero de texto).
FILE="$MNTDIR/mach_kernel"
if [ -z "$(file -b $FILE | grep 'text')" ]; then
# Obtener tipo de kernel.
[ -n "$(file -b $FILE | grep 'Mach-O')" ] && VERSION="macOS"
[ -n "$(file -b $FILE | grep 'Mach-O 64-bit')" ] && IS64BIT="$MSG_64BIT"
# Datos de configuración de versión de Mac OS.
FILE="$MNTDIR/System/Library/CoreServices/SystemVersion.plist"
[ -r $FILE ] && VERSION=$(awk -F"[<>]" '
/ProductName/ {getline;s=$3}
/ProductVersion/ {getline;v=$3}
END {print s,v}' $FILE)
# Datos de recuperación de macOS.
FILE="$MNTDIR/com.apple.recovery.boot"
[ -r $FILE -a -n "$VERSION" ] && VERSION="$VERSION recovery"
fi
fi
# Para FreeBSD: obtener datos del Kernel.
### TODO Revisar solución.
if [ -z "$VERSION" ]; then
TYPE="BSD"
FILE="$MNTDIR/boot/kernel/kernel"
if [ -r $FILE ]; then
VERSION="$(strings $FILE|awk '/@.*RELEASE/ {sub(/@\(#\)/,""); print $1,$2}')"
[ -n "$(file -b $FILE | grep 'x86-64')" ] && IS64BIT="$MSG_64BIT"
fi
fi
# Para Solaris: leer el fichero de versión.
### TODO Revisar solución.
if [ -z "$VERSION" ]; then
TYPE="Solaris"
FILE="$MNTDIR/etc/release"
[ -r $FILE ] && VERSION="$(head -1 $FILE)"
fi
# Para cargador GRUB, comprobar fichero de configuración.
if [ -z "$VERSION" ]; then
TYPE="GrubLoader"
for FILE in $MNTDIR/{,boot/}grub/menu.lst; do
[ -r $FILE ] && VERSION="GRUB Loader"
done
#/* (comentario Doxygen)
for FILE in $MNTDIR/{,boot/}{grub{,2},EFI/*}/grub.cfg; do
[ -r $FILE ] && VERSION="GRUB2 Loader"
done
fi
#*/ (Comentario Doxygen)
# Mostrar resultado y salir sin errores.
[ -n "$VERSION" ] && echo "$TYPE:$VERSION $IS64BIT"
return 0
}

View File

@ -1,345 +0,0 @@
#!/bin/bash
#/**
#@file Net.lib
#@brief Librería o clase Net
#@class Net
#@brief Funciones básicas de red.
#@version 1.0.6
#@warning License: GNU GPLv3+
#*/
#/**
# ogChangeRepo IPREPO [ OgUnit ]
#@brief Cambia el repositorio para el recurso remoto images.
#@param 1 Ip Repositorio
#@param 2 Abreviatura Unidad Organizativa
#@return Cambio recurso remoto en OGIMG.
#@version 1.1 - Primera versión para OpenGnSys.
#@author Irina Gomez, ETSII Universidad de Sevilla
#@date 2015-06-16
#*/
function ogChangeRepo ()
{
local SRCIMG NEWREPO REPO OGUNIT
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME IPREPO [ OgUnit ]" \
"$FUNCNAME 10.1.120.3" \
"$FUNCNAME 10.1.120.3 cdc"
return
fi
if [ $# -lt 1 ]; then
ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME IPREPO [ OgUnit ]"
return $?
fi
# Opciones de montaje: lectura o escritura
mount |grep "ogimages.*rw," &>/dev/null && RW=",rw" || RW=",ro"
# Si REPO tomamos el repositorio y la unidad organizativa actual
REPO=$(ogGetRepoIp)
OGUNIT="$(df | awk -F " " '/ogimages/ {sub("//.*/ogimages","",$1); sub("/","",$1); print $1}')"
# Parametros de entrada. Si $1 = "REPO" dejo el repositorio actual
[ "${1^^}" == "REPO" ] && NEWREPO="$REPO" || NEWREPO="${1}"
# Si $1 y $2 son el repositorio y la OU actual me salgo
[ "$NEWREPO" == "$REPO" ] && [ "$2" == "$OGUNIT" ] && return 0
source /scripts/functions
source /scripts/ogfunctions
umount $OGIMG
[ "$2" == "" ] && SRCIMG="ogimages" || SRCIMG="ogimages/$2"
eval $(grep "OPTIONS=" /scripts/ogfunctions)
ogEcho session log "$MSG_HELP_ogChangeRepo $NEWREPO ${2%/}"
ogConnect $NEWREPO $ogprotocol $SRCIMG $OGIMG $RW
# Si da error volvemos a montar el inicial
if [ $? -ne 0 ]; then
ogConnect $REPO $ogprotocol $SRCIMG $OGIMG $RW
ogRaiseError session $OG_ERR_REPO "$NEWREPO"
return $?
fi
}
#/**
# ogGetGroupDir [ str_repo ]
#@brief Devuelve el camino del directorio para el grupo del cliente.
#@param str_repo repositorio de imágenes (opcional)
#@return path_dir - Camino al directorio del grupo.
#@note repo = { REPO, CACHE } REPO por defecto
#@exception OG_ERR_FORMAT formato incorrecto.
#@version 1.0.2 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-10-03
#*/
function ogGetGroupDir ()
{
local REPO DIR GROUP
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME str_repo" \
"$FUNCNAME REPO ==> /opt/opengnsys/images/groups/Grupo1"
return
fi
# Error si se recibe más de 1 parámetro.
case $# in
0) REPO="REPO" ;;
1) REPO="$1" ;;
*) ogRaiseError $OG_ERR_FORMAT "$*"
return $? ;;
esac
GROUP="$(ogGetGroupName)"
if [ -n "$GROUP" ]; then
DIR=$(ogGetPath "$REPO" "/groups/$GROUP" 2>/dev/null)
[ -d "$DIR" ] && echo "$DIR"
fi
# Para que no haya error al fallar la condición anterior
return 0
}
#/**
# ogGetGroupName
#@brief Devuelve el nombre del grupo al que pertenece el cliente.
#@return str_group - Nombre de grupo.
#@version 1.0.2 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-10-03
#*/
function ogGetGroupName ()
{
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => Grupo1"
return
fi
[ -n "$group" ] && echo "$group"
}
#/**
# ogGetHostname
#@brief Muestra el nombre del cliente.
#@return str_host - nombre de máquina
#@version 0.10 - Integración en OpenGnSys 0.10
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010-02-11
#*/ ##
function ogGetHostname ()
{
local HOST
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => pc1"
return
fi
# Tomar nombre de la variable HOSTNAME
HOST="$HOSTNAME"
# Si no, tomar del DHCP, opción host-name /* (comentario para Doxygen)
[ -z "$HOST" ] && HOST=$(awk -F\" '/option host-name/ {gsub(/;/,""); host=$2}
END {print host}
' /var/lib/dhcp3/dhclient.leases)
# Si no, leer el parámetro del kernel hostname (comentario para Doxygen) */
[ -z "$HOST" ] && HOST=$(awk 'BEGIN {RS=""; FS="="}
$1~/hostname/ {print $2}' /proc/cmdline)
[ "$HOSTNAME" != "$HOST" ] && export HOSTNAME="$HOST"
[ -n "$HOST" ] && echo $HOST
}
#/**
# ogGetIpAddress
#@brief Muestra la dirección IP del sistema
#@return str_ip - Dirección IP
#@version 0.10 - Integración en OpenGnSys 0.10
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010-02-11
#@version 1.0 - Integración OpenGnSys 0.10 Opengnsys 0.10-testing
#@note Usa las variables utilizadas por el initrd "/etc/net-ethX.conf
#@author Antonio J. Doblas Viso. Universidad de Malaga.
#@date 2011-02-24
#@version 1.0.2 - Soporte para varias tarjetas de red
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-06-17
#*/ ##
function ogGetIpAddress ()
{
local IP
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 192.168.0.10"
return
fi
if [ -n "$IPV4ADDR" ]; then
IP="$IPV4ADDR"
else
# Obtener direcciones IP.
if [ -n "$DEVICE" ]; then
IP=$(ip -o address show up dev "$DEVICE" 2>/dev/null | awk '{if ($3~/inet$/) {printf ("%s ", $4)}}')
else
IP=$(ip -o address show up | awk '$2!~/lo/ {if ($3~/inet$/) {printf ("%s ", $4)}}')
fi
fi
# Mostrar solo la primera.
echo "${IP%%/*}" # (comentario para Doxygen) */
}
#/**
# ogGetMacAddress
#@brief Muestra la dirección Ethernet del cliente.
#@return str_ether - Dirección Ethernet
#@version 0.10 - Integración en OpenGnSys 0.10
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010-02-11
#@version 1.0.2 - Soporte para varias tarjetas de red
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-06-17
#*/ ##
function ogGetMacAddress ()
{
local MAC
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 00:11:22:33:44:55"
return
fi
# Obtener direcciones Ethernet.
if [ -n "$DEVICE" ]; then
MAC=$(ip -o link show up dev "$DEVICE" 2>/dev/null | awk '{sub (/.*\\/, ""); if ($1~/ether/) printf ("%s ", toupper($2));}')
else
MAC=$(ip -o link show up | awk '$2!~/lo/ {sub (/.*\\/, ""); if ($1~/ether/) printf ("%s ", toupper($2));}')
fi
# Mostrar sólo la primera.
echo ${MAC%% *}
}
#/**
# ogGetNetInterface
#@brief Muestra la interfaz de red del sistema
#@return str_interface - interfaz de red
#@version 1.0 - Integración OpenGnSys 0.10 Opengnsys 0.10-testing
#@note Usa las variables utilizadas por el initrd "/etc/net-ethX.conf
#@author Antonio J. Doblas Viso. Universidad de Malaga.
#@date 2011-02-24
#*/ ##
function ogGetNetInterface ()
{
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => eth0"
return
fi
[ -n "$DEVICE" ] && echo "$DEVICE"
}
#/**
# ogGetRepoIp
#@brief Muestra la dirección IP del repositorio de datos.
#@return str_ip - Dirección IP
#@version 0.10 - Integración en OpenGnSys 0.10
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-01-13
#@version 1.0 - Integración OpenGnSys 0.10 Opengnsys 0.10-testing
#@note Comprobacion segun protocolo de conexion al Repo
#@author Antonio J. Doblas Viso. Universidad de Malaga.
#@date 2011-02-24
#@version 1.0.6 - Obtener datos del punto de montaje, evitando fallo si $ogprotocol está vacía.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2014-08-27
#*/ ##
function ogGetRepoIp ()
{
# Variables locales.
local SOURCE FSTYPE
# Mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 192.168.0.2"
return
fi
# Obtener direcciones IP, según el tipo de montaje.
eval $(findmnt -P -o SOURCE,FSTYPE $OGIMG)
case "$FSTYPE" in
nfs) echo "$SOURCE" | cut -f1 -d: ;;
cifs) echo "$SOURCE" | cut -f3 -d/ ;;
esac
}
#/**
# ogGetServerIp
#@brief Muestra la dirección IP del Servidor de OpenGnSys.
#@return str_ip - Dirección IP
#@version 0.10 - Integración en OpenGnSys 0.10
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-01-13
#@version 1.0 - Integración OpenGnSys 0.10 Opengnsys 0.10-testing
#@note Comprobacion segun protocolo de conexion al Repo
#@author Antonio J. Doblas Viso. Universidad de Malaga.
#@date 2011-02-24
#@version 1.0.6 - Obtener datos del punto de montaje, evitando fallo si $ogprotocol está vacía.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2014-08-27
#*/ ##
function ogGetServerIp ()
{
# Variables locales.
local SOURCE FSTYPE
# Mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 192.168.0.2"
return
fi
# Obtener direcciones IP, según el tipo de montaje.
eval $(findmnt -P -o SOURCE,FSTYPE $OPENGNSYS)
case "$FSTYPE" in
nfs) echo "$SOURCE" | cut -f1 -d: ;;
cifs) echo "$SOURCE" | cut -f3 -d/ ;;
esac
}
#/**
# ogMakeGroupDir [ str_repo ]
#@brief Crea el directorio para el grupo del cliente.
#@param str_repo repositorio de imágenes (opcional)
#@return (nada)
#@note repo = { REPO, CACHE } REPO por defecto
#@exception OG_ERR_FORMAT formato incorrecto.
#@version 1.0.5 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2013-09-26
#*/
function ogMakeGroupDir ()
{
local REPO DIR GROUP
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME str_repo" \
"$FUNCNAME" "$FUNCNAME REPO"
return
fi
# Error si se recibe más de 1 parámetro.
case $# in
0) REPO="REPO" ;;
1) REPO="$1" ;;
*) ogRaiseError $OG_ERR_FORMAT "$*"
return $? ;;
esac
# Comprobar tipo de repositorio.
DIR=$(ogGetPath "$REPO" / 2>/dev/null)
[ -n "$DIR" ] || ogRaiseError $OG_ERR_FORMAT "$1"
GROUP="$(ogGetGroupName)"
if [ -n "$GROUP" ]; then
mkdir -p "$DIR/groups/$GROUP" 2>/dev/null
fi
}

View File

@ -1,543 +0,0 @@
#!/bin/bash
#/**
#@file PostConf.lib
#@brief Librería o clase PostConf
#@class PostConf
#@brief Funciones para la postconfiguración de sistemas operativos.
#@version 1.1.0
#@warning License: GNU GPLv3+
#*/
#/**
# ogCleanOs int_ndisk int_nfilesys
#@brief Elimina los archivos que no son necesarios en el sistema operativo.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
#@note Antes incluido en la funcion ogReduceFs
#@author Irina Gomez. Universidad de Sevilla.
#@return (nada)
#@date 2014-10-27
#*/ ##
function ogCleanOs ()
{
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
"$FUNCNAME 1 1"
return
fi
# Error si no se reciben 2 parámetros.
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_nfilesys" || return $?
case "$(ogGetOsType $1 $2)" in
Linux)
# Borramos los ficheros de dispositivos y los temporales.
ogCleanLinuxDevices $1 $2
rm -rf $(ogMount $1 $2)/tmp/* #*/ Comentario Doxygen
;;
Windows)
# Borrar ficheros de hibernación y paginación de Windows.
[ -n "$(ogGetPath $1 $2 pagefile.sys)" ] && ogDeleteFile $1 $2 pagefile.sys
[ -n "$(ogGetPath $1 $2 hiberfil.sys)" ] && ogDeleteFile $1 $2 hiberfil.sys
[ -n "$(ogGetPath $1 $2 swapfile.sys)" ] && ogDeleteFile $1 $2 swapfile.sys
;;
esac
}
#/**
# ogInstallMiniSetup int_ndisk int_npartition str_filename [str_admuser str_admpassword bool_autologin [str_autouser str_autopassword] ]
#@brief Metafunción para instalar archivo que se ejecutará en el arranque de Windows.
#@see ogInstallFirstBoot ogInstallRunonce
#*/ ##
function ogInstallMiniSetup ()
{
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$MSG_SEE ogInstallFirstBoot ogInstallRunonce"
return
fi
case $# in
3) # Ejecución en el primer arranque de la máquina.
ogInstallFirstBoot "$@" ;;
6|8) # Ejecución en el "runonce".
ogInstallRunonce "$@" ;;
*) ogRaiseError $OG_ERR_FORMAT
return $? ;;
esac
}
#/**
# ogInstallFirstBoot int_ndisk int_npartition str_filename
#@brief Crea unas claves del registro y el archivo cmd que se ejecutara en el primer arranque estando la maquina en un estado bloqueado
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@param str_filename nombre del archivo .cmd a ejecutar en el arranque
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@note El archivo estará en system32 y será visible por el sistema.
#@version 1.0.2 - Nueva función
#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona
#@date 2011-06-29
#@version 1.0.4 - Heredada de antigua función ogInstallMiniSetup.
#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona
#@date 2012-04-16
#*/ ##
function ogInstallFirstBoot ()
{
local MNTDIR DIR CMDDIR CMDFILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_filename" \
"$FUNCNAME 1 1 filename.cmd"
return
fi
# Error si no se reciben 3 parámetros.
[ $# == 3 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
# Comprobar que existe el directorio del fichero de comandos.
MNTDIR=$(ogMount "$1" "$2") || return $?
for i in winnt windows; do
DIR=$(ogGetPath $MNTDIR/$i/system32)
[ -n "$DIR" ] && CMDDIR=$DIR
done
[ -n "$CMDDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$MNTDIR/windows/system32" || return $?
CMDFILE="$CMDDIR/$3"
# Creamos el archivo cmd y creamos un par de comandos para que una vez acabe la
# postconfiguracion resetee el mini setup, sino lo haria en cada arranque.
cat > "$CMDFILE" << EOF
REG ADD HKLM\System\Setup /v SystemSetupInProgress /t REG_DWORD /d 0 /f
REG ADD HKLM\System\Setup /v CmdLine /t REG_SZ /d "" /f
EOF
# Crear los valores de registro necesarios para que se haga la ejecución del .cmd al aranque.
ogSetRegistryValue "$MNTDIR" SYSTEM "\Setup\SystemSetupInProgress" 1
ogSetRegistryValue "$MNTDIR" SYSTEM "\Setup\SetupType" 4
#ogDeleteRegistryValue "$MNTDIR" SYSTEM "\Setup\CmdLine"
ogAddRegistryValue "$MNTDIR" SYSTEM "\Setup\CmdLine"
ogSetRegistryValue "$MNTDIR" SYSTEM "\Setup\CmdLine" "cmd.exe /c $(basename $CMDFILE)"
}
#/**
# ogInstallRunonce int_ndisk int_npartition str_filename str_adm_user str_adm_password bool_autologin [str_auto_user str_auto_password]
#@brief Crea el archivo cmd que se ejecutara en el runonce de un usuario administrador
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@param str_filename nombre del archivo .cmd a ejecutar en el arranque (estara en system32 y sera visible por el sistema)
#@param str_adm_user usuario administrador para hacer autologin y ejecutar el runonce
#@param str_adm_password password del usuario administrador
#@param bool_autologin si despues de la postconfiguracion queremos que la maquina haga autologin (0 o 1)
#@param str_auto_user Usuario con el que queremos que haga autologin despues de la postconfiguracion
#@param str_auto_password Password del usuario que hara autologin
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@version 1.0.2 - Nueva función
#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona
#@date 2011-06-29
#@version 1.0.4 - Heredado de antigua función ogInstallMiniSetup
#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona
#@date 2012-04-16
#@version 1.1.0 - Resuelve problemas a partir de Windows 10
#@author Carmelo Cabezuelo Aguilar - Universidad Politécnica de Valencia
#@date 2018-02-20
#*/ ##
function ogInstallRunonce ()
{
local MOUNTPOINT DIR CMDDIR CMDFILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_filename str_adm_user str_adm_password bool_autologin [str_auto_user str_auto_password]" \
"$FUNCNAME 1 1 filename.cmd administrator passadmin 1 userauto passuserauto" \
"$FUNCNAME 1 1 filename.cmd administrator passadmin 0"
return
fi
# Error si no se reciben 6 u 8 parámetros.
[ $# == 6 -o $# == 8 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
# Punto de montaje.
MOUNTPOINT="$(ogGetPath "$1" "$2" /)"
# Comprobar que existe el directorio del fichero de comandos.
for i in winnt windows; do
DIR=$(ogGetPath $MOUNTPOINT/$i/system32)
[ -n "$DIR" ] && CMDDIR=$DIR
done
[ -n "$CMDDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$MOUNTPOINT/Windows/System32" || return $?
CMDFILE="$CMDDIR/$3"
if [ $6 == 0 ]; then
# Si no queremos hacer autologin despues de la postconfiguracion lo indicamos en las claves de registro
cat > "$CMDFILE" << EOF
DEL C:\ogboot.*
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 0 /f
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName /t REG_SZ /d "" /f
REG DELETE "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /f
EOF
else
# Si queremos hacer autologin despues de la postconfiguracion introducimos la informacion en las claves de registro
cat > "$CMDFILE" << EOF
DEL C:\ogboot.*
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 1 /f
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName /t REG_SZ /d "$7" /f
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /t REG_SZ /d "$8" /f
EOF
fi
#Creamos las claves de registro necesarias para que meter el cmd en el runonce del usuario y este haga autologin
ogAddRegistryValue $MOUNTPOINT software '\Microsoft\Windows\CurrentVersion\RunOnce\PostConfiguracion' 2>/dev/null
ogSetRegistryValue $MOUNTPOINT software '\Microsoft\Windows\CurrentVersion\RunOnce\PostConfiguracion' "C:\windows\system32\\$3" 2>/dev/null
ogAddRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogon' 2>/dev/null
ogSetRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogon' 1 2>/dev/null
ogAddRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName' 2>/dev/null
ogSetRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName' "$4" 2>/dev/null
ogAddRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultDomainName' 2>/dev/null
ogSetRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultDomainName' ".\\" 2>/dev/null
ogAddRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultPassword' 2>/dev/null
ogSetRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultPassword' "$5" 2>/dev/null
ogDeleteRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\ForceAutoLockOnLogon' 2>/dev/null
ogDeleteRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoLogonCount' 2>/dev/null
}
#/**
# ogAddCmd int_ndisk int_npartition str_filename str_commands
#@brief Añade comandos al cmd creado por ogInstalMiniSetup
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@param str_filename nombre del fichero cmd (siempre se guardara en windows\system32\para que sea visible por el sistema
#@param str_commands comando o comandos que se añadiran al fichero
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#@version 1.0.2 - Nueva función
#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona
#@date 2011-06-29
#@version 1.0.4 - Cambios en los parametros de entrada de la funcion
#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona
#@date 2012-04-16
#*/ ##
function ogAddCmd ()
{
local MOUNTPOINT CMDFILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_filename str_commands" \
"$FUNCNAME 1 1 filename.cmd command"
return
fi
# Error si no se reciben 4 parámetros.
[ $# == 4 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
# Punto de montaje
MOUNTPOINT="$(ogMount "$1" "$2")" || return $?
# Crear fichero de comandos, si no existe.
CMDFILE="$(ogGetPath "$MOUNTPOINT/windows/system32")/$3"
[ -n "$CMDFILE" ] || ogInstallMiniSetup "$1" "$2" "$3"
[ -n "$CMDFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$MOUNTPOINT/windows/system32/$3" || return $?
# Concatenamos el comando en el fichero de comandos
cat >> "$CMDFILE" << EOF
$4
EOF
}
#/**
# ogDomainScript int_ndisk int_npartition str_domain str_user str_password
#@brief Crea un script .vbs para unir al dominio una maquina windows y el comando adequado en el archivo cmd creado por ogInstallMiniSetup
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@param str_filename nombre del fichero cmd donde deberemos introducir el comando de ejecutar el script vbs
#@param str_domain dominio donde se quiere conectar
#@param str_user usuario con privilegios para unir al dominio
#@param str_password password del usuario con privilegios
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@version 1.0.2 - Nueva función
#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona
#@date 2011-06-29
#@version 1.0.4 - Cambios en los parametros de entrada de la funcion
#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona
#@date 2012-04-16
#*/ ##
function ogDomainScript ()
{
local CMDDIR
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" \
"$FUNCNAME int_ndisk int_npartition str_filename str_domain str_user str_password" \
"$FUNCNAME 1 1 filename.cmd domain user password_user"
return
fi
# Error si no se reciben 6 parámetros.
[ $# == 6 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
# Punto de montaje
MOUNTPOINT="$(ogMount "$1" "$2")" || return $?
# Comprobar que existe el directorio de comandos.
CMDDIR=$(ogGetPath "$MOUNTPOINT/windows/system32")
[ -n "$CMDDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1/windows/system32" || return $?
# Añadimos en el cmd que se ejecutara al arranque, el comando de ejecutar el script que añade al dominio.
ogAddCmd $1 $2 "$3" "CSCRIPT joindomain.vbs"
# Eliminamos el script porque tiene el usuario de administrador de dominio en claro
ogAddCmd $1 $2 "$3" "DEL /Q C:\Windows\System32\joindomain.vbs"
# Metemos unas claves de registro para que el dominio salga seleccionado por defecto
ogAddCmd $1 $2 "$3" "REG ADD \"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\" /v DefaultDomainName /t REG_SZ /d \"$4\" /f"
# Creamos el archivo joindomain.vbs que nos introduce la maquina en el dominio
cat > "$CMDDIR/joindomain.vbs" << EOF
Const JOIN_DOMAIN = 1
Const ACCT_CREATE = 2
Const ACCT_DELETE = 4
Const WIN9X_UPGRADE = 16
Const DOMAIN_JOIN_IF_JOINED = 32
Const JOIN_UNSECURE = 64
Const MACHINE_PASSWORD_PASSED = 128
Const DEFERRED_SPN_SET = 256
Const INSTALL_INVOCATION = 262144
strDomain = "$4"
strUser = "$5"
strPassword = "$6"
Set objNetwork = CreateObject("WScript.Network")
strComputer = objNetwork.ComputerName
Set objComputer = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\\" & _
strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" & strComputer & "'")
ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain, strPassword, _
strDomain & "\" & strUser, NULL, JOIN_DOMAIN + ACCT_CREATE)
EOF
#*/ " (comentario Doxygen)
}
### PRUEBAS.
#/**
# ogConfigureOgagent int_ndisk int_filesys
#@brief Modifica el fichero de configuración del nuevo agente OGAent para sistemas operativos.
#@param int_ndisk nº de orden del disco
#@param int_filesys nº de orden del sistema de archivos
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero o dispositivo no encontrado.
#@exception OG_ERR_LOCKED Sistema de archivos bloqueado.
#@version 1.1.0 - Primera adaptación para OpenGnsys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2016-07-15
#*/ ##
function ogConfigureOgagent ()
{
# Variables locales.
local MNTDIR AGENTDIR CFGFILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys" \
"$FUNCNAME 1 1"
return
fi
# Error si no se reciben 2 parámetros.
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Obtener sistema de archvios.
MNTDIR=$(ogMount $1 $2) || return $?
# Comprobar si existe el fichero de configuración de OGAgent.
for AGENTDIR in usr/share/OGAgent "Program Files/OGAgent" "Program Files (x86)/OGAgent" Applications/OGAgent.app; do
CFGFILE=$(ogGetPath "$MNTDIR/$AGENTDIR/cfg/ogagent.cfg")
[ -n "$CFGFILE" ] && break
done
[ -n "$CFGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "ogagent.cfg" || return $?
# Parchear dirección del servidor OpenGnsys en el fichero de configuración de OGAgent.
sed -i "0,/remote=/ s,remote=.*,remote=https://$(ogGetServerIp):8443/opengnsys/rest/," "$CFGFILE"
}
#/**
# ogInstallLaunchDaemon int_ndisk int_nfilesys str_filename
#@brief Instala archivo que se ejecutará en el arranque de macOS.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
#@param str_filename nombre del script
#return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero o directorio no encontrado.
#@npte Crea ficheros de configuración /Library/LaunchDaemon/es.opengnsys.Script.plist.
#@version 1.0.6 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2014-10-06
#*/ ##
function ogInstallLaunchDaemon ()
{
# Variables locales.
local LAUNCHDIR SCRIPTDIR
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys str_scriptname" \
"$FUNCNAME 1 2 postconf"
return
fi
# Error si no se reciben 3 parámetros.
[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Comprobar directorios.
LAUNCHDIR=$(ogGetPath $1 $2 /Library/LaunchDaemons)
[ -n "$LAUNCHDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 /Library/LaunchDaemons" || return $?
SCRIPTDIR=$(ogGetPath $1 $2 /usr/share)
[ -n "$SCRIPTDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 /usr/share" || return $?
# Crear fichero de configuración del servicio de arranque.
cat << EOT $LAUNCHDIR/es.opengnsys.$3.plist
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>es.opengnsys.$3</string>
<key>ProgramArguments</key>
<array>
<string>$SCRIPTDIR/$3.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StandardOutPath</key>
<string>/var/log/$3.log</string>
<key>StandardErrorPath</key>
<string>/var/log/$3.err</string>
<true/>
</dict>
</plist>
EOT
# Crear un fichero de script vacío.
rm -f $SCRIPTDIR/$3.sh
touch $SCRIPTDIR/$3.sh
chmod +x $SCRIPTDIR/$3.sh
}
### PRUEBAS.
#/**
# ogAddToLaunchDaemon int_ndisk int_nfilesys str_filename str_commands
#@brief Añade comandos al script creado por ogInstalLaunchDaemon.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
#@param str_filename nombre del script (siempre se guardará en /usr/share para que sea visible por el sistema
#@param str_commands comando o comandos que se añadiran al fichero
#return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero o directorio no encontrado.
#@version 1.0.6 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2014-10-06
#*/ ##
function ogAddToLaunchDaemon ()
{
# Variables locales.
local SCRIPTFILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys str_scriptname" \
"$FUNCNAME 1 2 postconf \"diskutil enableJournal disk0s2\""
return
fi
# Error si no se reciben 4 parámetros.
[ $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Comprobar que existe el fichero de comandos.
SCRIPTFILE=$(ogGetPath $1 $2 "/usr/share/$3.sh")
[ -n "$SCRIPTFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 /usr/share/$3" || return $?
# Concatenamos el comando en el fichero de comandos
cat >> "$SCRIPTFILE" << EOT
$4
EOT
}
#/**
# ogUninstallLinuxClient int_ndisk int_filesys
#@brief Desinstala el cliente OpenGnSys para sistemas operativos GNU/Linux.
#@param int_ndisk nº de orden del disco
#@param int_filesys nº de orden del sistema de archivos
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Paritición o sistema de archivos incorrectos.
#@exception OG_ERR_LOCKED Sistema de archivos bloqueado.
#@version 1.1.0 - Primera adaptación para OpenGnsys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2016-08-22
#*/ ##
function ogUninstallLinuxClient ()
{
# Variables locales.
local MNTDIR
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys" \
"$FUNCNAME 1 1"
return
fi
# Error si no se reciben 2 parámetros.
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Obtener sistema de archvios.
MNTDIR=$(ogMount $1 $2) || return $?
# Borrar ficheros y quitar llamada al cliente durante el proceso de inicio.
rm -f $MNTDIR/{usr/sbin,sbin,usr/local/sbin}/ogAdmLnxClient
rm -f $MNTDIR/{etc,usr/local/etc}/ogAdmLnxClient.cfg
sed -i -e '/ogAdmLnxClient/ d' $MNTDIR/{etc,usr/local/etc}/{rc.local,rc.d/rc.local} 2>/dev/null
}
#/**
# ogUninstallWindowsClient int_ndisk int_filesys str_filename
#@brief Desinstala el cliente OpenGnSys para sistemas operativos Windows.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@param str_filename nombre del fichero cmd donde deberemos introducir el comando de ejecutar el script vbs
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Paritición o sistema de archivos incorrectos.
#@exception OG_ERR_LOCKED Sistema de archivos bloqueado.
#@version 1.1.0 - Primera adaptación para OpenGnsys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2016-08-22
#*/ ##
function ogUninstallWindowsClient ()
{
# Variables locales.
local MNTDIR
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys str_filename" \
"$FUNCNAME 1 1 filename.cmd"
return
fi
# Error si no se reciben 3 parámetros.
[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Obtener sistema de archvios.
MNTDIR=$(ogMount "$1" "$2") || return $?
# Crear órdenes para desinstalar servicio y borrar ejecutable del cliente.
if [ -n "$(ogGetPath $MNTDIR/windows/ogAdmWinClient.exe)" -o -n "$(ogGetPath $MNTDIR/winnt/ogAdmWinClient.exe)" ]; then
ogAddCmd $1 $2 "$3" 'ogAdmWinClient -remove'
ogAddCmd $1 $2 "$3" 'DEL C:\Windows\ogAdmWinClient.exe'
ogAddCmd $1 $2 "$3" 'DEL C:\Winnt\ogAdmWinClient.exe'
fi
}

View File

@ -1,699 +0,0 @@
#!/bin/bash
# ogLoadHiveWindows int_ndisk int_partiton
#@brief Localiza los hive del registro de windows (de sistema y usuarios)
#@param int_ndisk nº de orden del disco
#@param int_partition nº de particion
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#@version 0.9 - Adaptación a OpenGNSys.
#@author Antonio J. Doblas Viso. Universidad de Málaga
#@date 2009-09-24
#*/ ##
function ogLoadHiveWindows () {
# Variables locales.
local PART DISK
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_partition" \
"$FUNCNAME 1 1 "
return
fi
# Error si no se reciben 2 parámetros.
[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
DISK=$1; PART=$2;
#Comprobaciones redundantes: borrar"
#ogDiskToDev $DISK $PART || return $(ogRaiseError $OG_ERR_PARTITION "particion de windows no detectada"; echo $?)
#ogGetOsType $DISK $PART | grep "Windows" || return $(ogRaiseError $OG_ERR_NOTOS "no es windows"; echo $?)
#VERSION=$(ogGetOsVersion $DISK $PART)
#Fin Comprobaciones redundantes: borrar"
# primera fase, carga de los hive del sistema
if ogGetPath $DISK $PART WINDOWS
then
SYSTEMROOT="Windows"
elif ogGetPath $DISK $PART WINNT
then
SYSTEMROOT="winnt"
else
return $(ogRaiseError $OG_ERR_NOTOS "version windows no detectada"; echo $?)
fi
hiveSAM=$(ogGetPath $DISK $PART /${SYSTEMROOT}/system32/config/SAM)
[ -n "$hiveSAM" ] && export hiveSAM || return $(ogRaiseError $OG_ERR_NOTOS " hive SAM no detectada"; echo $?)
hiveSYSTEM=$(ogGetPath $DISK $PART /${SYSTEMROOT}/system32/config/system)
[ -n "$hiveSYSTEM" ] && export hiveSYSTEM || return $(ogRaiseError $OG_ERR_NOTOS "hive SYSTEM no detectada"; echo $?)
hiveSOFTWARE=$(ogGetPath $DISK $PART /${SYSTEMROOT}/system32/config/software)
[ -n "$hiveSOFTWARE" ] && export hiveSOFTWARE || return $(ogRaiseError $OG_ERR_NOTOS "hive SOFTWARE no detectada"; echo $?)
export TEMPhive=/tmp/tmpregistry
# segunda fase, carga de los hive de usuarios windows.
declare -i COUNT
COUNT=3
#TODO WINDOWS XP WINDOWS7
BASEHOMEDIR=$(ogGetPath $DISK $PART /"Documents and Settings")
TMPUSERFILE="/tmp/WuserRegAndDAT.tmp"
find "$BASEHOMEDIR/" -type f -name NTUSER.DAT > $TMPUSERFILE
LISTUSERS=$(drbl-chntpw -l $hiveSAM | grep RID | awk -F"<" '{print $2}' | awk -F">" '{print $1}')
#echo "$BASEHOMEDIR" $LISTUSERS
for user in $LISTUSERS
do
# Comprobamos que el usuario registrado tiene .DAT
if HOMEDIR=$(cat $TMPUSERFILE | grep -w $user)
then
#echo "$user exportamos los usuarios de windows como variables, y como valor hiveUSERX; donde la X es 3 4 5 6 ... X"
export `echo $user=hiveUSER$COUNT`
#echo "$user exportamos la variable hiveUSERX con el valor del home de la variable-usuario_windows"
##export `echo hiveUSER$COUNT`="$(echo $HOMEDIR | sed -e 's/ /\\ /'g | sed -e 's/\\/\\\\/g')"
export `echo hiveUSER$COUNT`="$(echo $HOMEDIR)"
#echo " estas variables \$USUARIO -> Identificador del HIVE ; \${!USUARIO} -> path del HIVE "
COUNT=${COUNT}+1
fi
done
COUNT=0
}
# ogUpdateHiveWindows
#@brief Actualiza los hive de windows.
#@param int_ndisk
#@param int_partition
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#@version 0.9 - Adaptación a OpenGNSys.
#@author Antonio J. Doblas Viso. Universidad de Málaga
#@date 2009-09-24
#*/ ##
function ogUpdateHiveWindows (){
# Variables locales.
local PART DISK FILE
#TODO detectar llamada a ogLoadHiveWindows
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME " \
"$FUNCNAME "
return
fi
echo drbl-chntpw -f $TEMPhive $hiveSAM $hiveSYSTEM $hiveSOFTWARE \"${hiveUSER3}\" \"${hiveUSER4}\" \"${hiveUSER5}\" \"${hiveUSER6}\" \"${hiveUSER7}\" \"${hiveUSER8}\" \"${hiveUSER9}\" > /tmp/run.sh
cat /tmp/run.sh; sh /tmp/run.sh; rm -fr $TEMPhive; rm /tmp/run.sh
unset hiveSAM hiveSYSTEM hiveSOFTWARE TEMPhive hiveUSER3 hiveUSER4 hiveUSER5 hiveUSER6 hiveUSER7 hiveUSER8 hiveUSER9
}
function ogHiveNTRunMachine () {
#echo sintaxis: PathScripts idScripts
#echo ejemplo: c:\\\\WINDOSWS\\\\crearusuarios.bat scripts1
#echo IMPORTANTE: el path debe llevar dos barras \\, pero como se deben 'escapar' debes poner cuatro \\\\
#echo "identifica 0=$hiveSAM 1=$hiveSystem 2=$hiveSoftware 3=$HiveUser3"
local PART DISK FILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME PathScripts|command keyName " \
"$FUNCNAME c:\\\\Windows\\\\crearusuarios.cmd scripts_crearUsuarios "\
"$FUNCNAME "cmd /c del c:\ogboot.*" ogcleanboot "\
"$FUNCNAME Requiere la previa ejecución de ogLoadHive int_disk int_part"\
"$FUNCNAME Despues requiere el ogUpdateHive"
return
fi
# Error si no se reciben al menos 1 parámetros.
[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
cat >> $TEMPhive << EOF
h 2
cd \Microsoft\Windows\CurrentVersion\Run
nv 1 $2
ed $2
$1
EOF
#ogGetRegistryValue /mnt/sda1 software '\Microsoft\Windows\CurrentVersion\Run\og3'
}
function ogNTPolUserOn () {
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME id_hive_user " \
"$FUNCNAME NombreUsuario"\
"$FUNCNAME "
return
fi
# TODO: error si no se ha llamado previamente a ogLoadHiveWindows
[ -n $hiveSAM ] || return $(ogRaiseError $OG_ERR_FORMAT "se debe utilizar primero la utilidad ogLoadHiveWindows"; echo $?)
# TODO: error si el usuario no tiene cuenta en windows.
drbl-chntpw -l $hiveSAM | grep RID | grep -w $1 || return $(ogRaiseError $OG_ERR_FORMAT "el usuario $1 no tiene cuenta en este windows: Compruebe mayusculas o minusculas"; echo $?)
# TODO: error si no el usario no no tiene HIVE asociado.
[ -n "${!1}" ] || return $(ogRaiseError $OG_ERR_FORMAT "el usuario no tiene hive creado"; echo $?)
HIVEID=$(echo ${!1} | tr -d "hiveUSER")
#echo "IMPORTANTE: la variable HiveUser3=/mnt/windows/Document/\ and/\ Seeting\alumnmos\NTUSER.dat"
echo $HIVEID
#cp /var/EAC/admin/utilswin/Fondo.BMP ${particion}/WINDOWS/
cat >> $TEMPhive << EOF
h $HIVEID
cd \Control Panel\Desktop
ed Wallpaper
C:\\WINDOWS\\fondo.bmp
cd \Software\Microsoft\Windows\CurrentVersion\Policies
nk Explorer
cd Explorer
nv 4 NoDesktop
ed NoDesktop
1
nv 4 NoSimpleStartMenu
ed NoSimpleStartMenu
1
nv 4 NoWindowsUpdate
ed NoWindowsUpdate
1
nv 4 NoSMConfigurePrograms
ed NoSMConfigurePrograms
1
nv 4 NoChangeStartMenu
ed NoChangeStartMenu
1
nv 4 Intellimenus
ed Intellimenus
1
nv 4 NoRun
ed NoRun
1
nv 4 NoRecentDocsHistory
ed NoRecentDocsHistory
1
EOF
}
##########################################################
##########################################################
#####librerias de PostConfiguracion v0.1para Advanced Deploy enViorenment###########
# Liberado bajo licencia GPL <http://www.gnu.org/licenses/gpl.html>################
############# 2008 Antonio Jes<65>s Doblas Viso adv@uma.es ##########################
########### Universidad de Malaga (Spain)############################
##########################################################
function NTChangeName () {
if [ $# = 0 ]
then
echo sintaxis: NTChangeNAME str_$var
echo ejemplos: NTCHangeName adi${IPcuatro}-xp
fi
cat >> $temporal << EOF
h 1
ed ControlSet001\Control\ComputerName\ComputerName\ComputerName
$1
ed ControlSet001\Services\Tcpip\Parameters\Hostname
$1
ed ControlSet001\Services\Tcpip\Parameters\NV Hostname
$1
h 2
cd \Microsoft\Windows NT\CurrentVersion\Winlogon
ed DefaultDomainName
$1
EOF
}
function NTSetGroupName () {
if [ $# = 0 ]
then
echo sintaxis: NTSetGroupName str_$var
echo ejemplos: NTSetGroupName adi
fi
cat >> $temporal << EOF
h 2
ed \Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultDomainName
$1
EOF
}
function NTSetOwner (){
if [ $# = 0 ]
then
echo sintaxis: NtSetOwner str_propietario str_organizacion
echo ejemplos: NTSetOwner eu\ politecnica universidad\ de\ malaga
fi
cat >> $temporal << EOF
h 2
ed \Microsoft\Windows NT\CurrentVersion\RegisteredOwner
$1
ed \Microsoft\Windows NT\CurrentVersion\RegisteredOrganization
$2
EOF
}
function NTAutoLogon (){
if [ $# = 0 ]
then
echo sintaxis: Int_Activar Int_nves str_usuario str_passwd str_equipo
echo ejemplos: 1 2 administrador 3451 $equipo
echo IMPORTANTE: cuando AutoLogonCount llegue a 0, activa el AutoAdminLogon a 0. Pero no borra los valores de DefaultPassword
return 2
fi
#echo la pass es $4
export temporal=/tmp/tmpregistry
cat >> $temporal << EOF
hive 2
cd \Microsoft\Windows NT\CurrentVersion\Winlogon
nv 1 AutoAdminLogon
ed AutoAdminLogon
$1
nv 1 AutoLogonCount
ed AutoLogonCount
$2
nv 1 DefaultUserName
ed DefaultUserName
$3
nv 1 DefaultDomainName
ed DefaultDomainName
$5
EOF
if [ "$4" == none ]
then
echo "debe aparecer done" $4
cat >> $temporal << EOF
dv DefaultPassword
EOF
else
cat >> $temporal << EOF
nv 1 DefaultPassword
ed DefaultPassword
$4
EOF
fi
}
function NTStatusRatonTeclado (){
if [ $# = 0 ]
then
echo sintaxis: Int-StatusRaton Int-StatusTeclado
echo ejemplos: int=1 activo int=4 desactivado
return 2
fi
cat >> $temporal << EOF
hive 1
cd \ControlSet001\Services\Mouclass
ed Start
$1
cd \ControlSet001\Services\Kbdclass
ed Start
$2
EOF
}
function NTRunOnceMachine () {
if [ $# = 0 ]
then
echo sintaxis: PathScripts idScripts
echo "ejemplo: c:\\\\WINDOSWS\\\\crearusuarios.bat scripts1"
echo "IMPORTANTE: el path debe llevar dos barras \\, pero como se deben 'escapar' debes poner cuatro \\\\"
return 2
fi
export temporal=/tmp/tmpregistry
cat >> $temporal << EOF
h 2
cd \Microsoft\Windows\CurrentVersion\RunOnce
nv 1 $2
ed $2
$1
EOF
}
function NTRunMachine () {
if [ $# = 0 ]
then
echo sintaxis: PathScripts idScripts
echo ejemplo: c:\\\\WINDOSWS\\\\crearusuarios.bat scripts1
echo IMPORTANTE: el path debe llevar dos barras \\, pero como se deben 'escapar' debes poner cuatro \\\\
return 2
fi
export temporal=/tmp/tmpregistry
cat >> $temporal << EOF
h 2
cd \Microsoft\Windows\CurrentVersion\Run
nv 1 $2
ed $2
$1
EOF
}
function NTRunUser () {
if [ $# = 0 ]
then
echo sintaxis: str_PathWINScripts str_idScripts Int_hive||\$usuario
echo ejemplo: c:\\\\WINDOSWS\\\\crearusuarios.bat scripts1 3
echo IMPORTANTE: el pathWIN debe llevar dos barras \\, pero como se deben 'escapar' debes poner cuatro \\\\
echo IMPORTANTE: el pathLinux si lleva espacios debe escaparse con una barra \\
echo IMPORTANTE Int_hive: 3 para el primer usuario, 4 para el segundo usuario
echo requiere export un HiveUser3=/mnt/windows/Document\ and\ Seeting\alumnmos\NTUSER.dat
return 2
fi
cat >> $temporal << EOF
h $3
cd \Software\Microsoft\Windows\CurrentVersion\Run
nv 1 $2
ed $2
$1
EOF
}
function NTPolUserOn () {
if [ $# = 0 ]
then
Msg "requiere LoadRegistryUser str_user1 str_user2..." orange
echo "sintaxis: Int_hive"
echo "ejemplo: NTPolUserOn 3"
echo "IMPORTANTE: la variable HiveUser3=/mnt/windows/Document/\ and/\ Seeting\alumnmos\NTUSER.dat"
return 2
fi
cp /var/EAC/admin/utilswin/Fondo.BMP ${particion}/WINDOWS/
cat >> $temporal << EOF
h $1
cd \Control Panel\Desktop
ed Wallpaper
C:\\WINDOWS\\fondo.bmp
cd \Software\Microsoft\Windows\CurrentVersion\Policies
nk Explorer
cd Explorer
nv 4 NoDesktop
ed NoDesktop
1
nv 4 NoSimpleStartMenu
ed NoSimpleStartMenu
1
nv 4 NoWindowsUpdate
ed NoWindowsUpdate
1
nv 4 NoSMConfigurePrograms
ed NoSMConfigurePrograms
1
nv 4 NoChangeStartMenu
ed NoChangeStartMenu
1
nv 4 Intellimenus
ed Intellimenus
1
nv 4 NoRun
ed NoRun
1
nv 4 NoRecentDocsHistory
ed NoRecentDocsHistory
1
EOF
}
function NTPolUserOFF () {
if [ $# = 0 ]
then
Msg "requiere LoadRegistryUser str_user1 str_user2..." orange
echo "sintaxis: Int_hive"
echo "ejemplo: NTPolUserOFF 3"
echo "IMPORTANTE: la variable HiveUser3=/mnt/windows/Document/\ and/\ Seeting\alumnmos\NTUSER.dat"
return 2
fi
cat >> $temporal << EOF
h $1
cd \Control Panel\Desktop
ed Wallpaper
C:\\WINDOWS\\web\\wallpaper\\Felicidad.bmp
cd \Software\Microsoft\Windows\CurrentVersion\
rdel Policies
nk Policies
1
EOF
}
function ogSetWindowsChkdisk() {
if [ $# = 0 ]
then
echo sintaxis: true|TRUE|0 false|false|1
echo ejemplos: int=0 desactivado int=1 activado
return 2
fi
case $1 in
0|true|TRUE)
valor="autocheck autochk *";;
1|false|FALSE)
valor="none";;
*)
return 0 ;;
esac
cat >> $TEMPhive << EOF
hive 1
cd \ControlSet001\Control\Session Manager
ed BootExecute
$valor
--n
EOF
}
### FASE DE PRUEBAS NO FUNCIONA
function NTStartRecovery () {
if [ $# = 0 ]
then
echo sintaxis: Int-Status
echo ejemplos: int=0 desactivado int=1 activado
return 2
fi
[ $1 = 0 ] && valor="none"
[ $1 = 1 ] && valor="00000000"
cat >> $TEMPhive << EOF
hive 2
#cd \Policies\Microsoft\Windows\WinRE
#ed DisableSetup
cd \Policies\Microsoft\Windows
nk WinRE
nv 4 DisableSetup
ed DisableSetup
$valor
--n
EOF
#Activado
#[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WinRE]
#"DisableSetup"=-
# Desactivado
#[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WinRE]
#"DisableSetup"=dword:00000000
}
function ogSchrootLinux () {
# Variables locales.
local PART DISK DIRCONF SCHROOTDEVICE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_partition" \
"$FUNCNAME 1 1 "
return
fi
# Error si no se reciben 2 parámetros.
[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
DISK=$1; PART=$2; DIRCONF="/etc/schroot"
VERSION=$(ogGetOsVersion $DISK $PART)
echo $VERSION | grep "Linux" || return $(ogRaiseError $OG_ERR_NOTOS "no es linux"; echo $?)
ogUnmount $DISK $PART || return $(ogRaiseError $OG_ERR_NOTOS "no es linux"; echo $?)
SCHROOTDEVICE=$(ogDiskToDev $DISK $PART)
rm ${DIRCONF}/mount-defaults
rm ${DIRCONF}/schroot.conf
cat >> ${DIRCONF}/mount-defaults << EOF
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev /dev none rw,bind 0 0
/dev/pts /dev/pts none rw,bind 0 0
/dev/shm /dev/shm none rw,bind 0 0
EOF
cat >> ${DIRCONF}/schroot.conf << EOF
[linux]
description=$VERSION
type=block-device
device=$SCHROOTDEVICE
EOF
schroot -c linux
schroot -end-sessiona --all-sessions
}
#/** @function ogDiskToRelativeDev: @brief Traduce los ID de discos o particiones EAC a ID Linux relativos, es decir 1 1 => sda1
#@param Admite 1 parametro: $1 int_numdisk
#@param Admite 2 parametro: $1 int_numdisk $2 int_partition
#@return Para 1 parametros traduce Discos Duros: Devuelve la ruta relativa linux del disco duro indicado con nomenclatura EAC.........ejemplo: IdPartition 1 => sda
#@return Para 2 parametros traduce Particiones: Devuelve la ruta relativa linux de la particion indicado con nomenclatura EAC........... ejemplo: IdPartition 2 1 => sdb1
#@warning No definidas
#@attention
#@note Notas sin especificar
#@version 0.1 - Integracion para Opengnsys - EAC: IdPartition en ATA.lib
#@author Antonio J. Doblas Viso. Universidad de Malaga
#@date 27/10/2008
#*/
function ogDiskToRelativeDev () {
if [ $# = 0 ]
then
Msg "Info: Traduce el identificador del dispositivo EAC a dispositivo linux \n" info
Msg "Sintaxis1: IdPartition int_disk -----------------Ejemplo1: IdPartition 1 -> sda " example
Msg "Sintaxis2: IdPartition int_disk int_partition --Ejemplo2: IdPartition 1 2 -> sda2 " example
return
fi
#PART="$(Disk|cut -f$1 -d' ')$2" # se comenta esta linea porque doxygen no reconoce la funcion disk y no crea los enlaces y referencias correctas.
PART=$(ogDiskToDev|cut -f$1 -d' ')$2
echo $PART | cut -f3 -d \/
}
#/** @function ogDeletePartitionsLabels: @brief Elimina la informacion que tiene el kernel del cliente og sobre los labels de los sistemas de archivos
#@param No requiere
#@return Nada
#@warning
#@attention Requisitos: comando interno linux rm
#@note
#@version 0.1 - Integracion para Opengnsys - EAC: DeletePartitionTable() en ATA.lib
#@author Antonio J. Doblas Viso. Universidad de Malaga
#@date 27/10/2008
#*/
function ogDeletePartitionsLabels () {
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME " \
"$FUNCNAME "
return
fi
rm /dev/disk/by-label/* # */ COMENTARIO OBLIGATORIO PARA DOXYGEN
}
#/** @function ogInfoCache: @brief muestra la informacion de la CACHE.
#@param sin parametros
#@return texto que se almacena en $IP.-InfoCache. punto_montaje, tama?oTotal, TamanioOcupado, TaminioLibre, imagenes dentro de la cahce
#@warning Salidas de errores no determinada
#@warning printf no soportado por busybox
#@attention
#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga
#*/
function ogInfoCache ()
{
local info infoFilesystem infoSize infoUsed infoUsedPorcet infoMountedOn content
if ogMountCache
then
info=`df -h | grep $OGCAC`
infoFilesystem=`echo $info | cut -f1 -d" "`
infoSize=`echo $info | cut -f2 -d" "`
infoUsed=`echo $info | cut -f3 -d" "`
infoAvail=`echo $info | cut -f4 -d" "`
infoUsedPorcet=`echo $info | cut -f5 -d" "`
infoMountedOn=`echo $info | cut -f2 -d" "`
if `ls ${OGCAC}$OGIMG > /dev/null 2>&1`
then
cd ${OGCAC}${OPENGNSYS}
#content=`find images/ -type f -printf "%h/ %f %s \n"` busybox no soporta printf
content=`find images/ -type f`
cd /
echo $info
echo -ne $content
echo " "
#echo "$info" > ${OGLOG}/${IP}-InfoCache
#echo "$content" >> {$OGLOG}/${IP}-InfoCache
else
echo $info
#echo "$info" > {$OGLOG}/${IP}-InfoCache
fi
ogUnmountCache
else
echo " "
#echo " " > {$OGLOG}/${IP}-InfoCache
fi
}

File diff suppressed because it is too large Load Diff

View File

@ -1,455 +0,0 @@
#!/bin/bash
#/**
#@file Registry.lib
#@brief Librería o clase Registry
#@class Boot
#@brief Funciones para gestión del registro de Windows.
#@version 1.1.0
#@warning License: GNU GPLv3+
#*/
# Función ficticia para lanzar chntpw con timeout de 5 s., evitando cuelgues del programa.
function chntpw ()
{
local CHNTPW
CHNTPW=$(which drbl-chntpw)
CHNTPW=${CHNTPW:-$(which chntpw)}
timeout --foreground 5s $CHNTPW -e "$@"
}
#/**
# ogAddRegistryKey path_mountpoint str_hive str_keyname
#@brief Añade una nueva clave al registro de Windows.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
#@param str_keyname nombre de la clave
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado.
#@note hive = { default, sam, security, software, system, components }
#@warning Requisitos: chntpw
#@warning El sistema de archivos de Windows debe estar montada previamente.
#@version 1.0.1 - Nueva función
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-05-25
#*/ ##
function ogAddRegistryKey ()
{
# Variables locales.
local FILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_key" \
"$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey'"
return
fi
# Error si no se reciben 3 parámetros.
[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Camino del fichero de registro.
FILE=$(ogGetHivePath "$1" "$2") || return $?
# Añadir nueva clave.
chntpw "$FILE" << EOT &> /dev/null
cd ${3%\\*}
nk ${3##*\\}
q
y
EOT
}
#/**
# ogAddRegistryValue path_mountpoint str_hive str_valuename [str_valuetype]
#@brief Añade un nuevo valor al registro de Windows, indicando su tipo de datos.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
#@param str_valuename nombre del valor
#@param str_valuetype tipo de datos del valor (opcional)
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado.
#@note hive = { DEFAULT, SAM, SECURITY, SOFTWARE, SYSTEM, COMPONENTS }
#@note valuetype = { STRING, BINARY, DWORD }, por defecto: STRING
#@warning Requisitos: chntpw
#@warning El sistema de archivos de Windows debe estar montada previamente.
#@version 1.0.1 - Nueva función
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-05-25
#*/ ##
function ogAddRegistryValue ()
{
# Variables locales.
local FILE TYPE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename [str_valuetype]" \
"$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1'" \
"$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1' DWORD"
return
fi
# Error si no se reciben 3 o 4 parámetros.
[ $# == 3 -o $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Camino del fichero de registro.
FILE=$(ogGetHivePath "$1" "$2") || return $?
case "${4^^}" in
STRING|"") TYPE=1 ;;
BINARY) TYPE=3 ;;
DWORD) TYPE=4 ;;
*) ogRaiseError $OG_ERR_OUTOFLIMIT "$4"
return $? ;;
esac
# Devolver el dato del valor de registro.
# /* (comentario Doxygen)
chntpw "$FILE" << EOT &> /dev/null
cd ${3%\\*}
nv $TYPE ${3##*\\}
q
y
EOT
# (comentario Doxygen) */
}
#/**
# ogDeleteRegistryKey path_mountpoint str_hive str_keyname
#@brief Elimina una clave del registro de Windows con todo su contenido.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
#@param str_keyname nombre de la clave
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado.
#@note hive = { default, sam, security, software, system, components }
#@warning Requisitos: chntpw
#@warning El sistema de archivos de Windows debe estar montada previamente.
#@warning La clave debe estar vacía para poder ser borrada.
#@version 1.0.1 - Nueva función
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-05-25
#*/ ##
function ogDeleteRegistryKey ()
{
# Variables locales.
local FILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_key" \
"$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey'"
return
fi
# Error si no se reciben 3 parámetros.
[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Camino del fichero de registro.
FILE=$(ogGetHivePath "$1" "$2") || return $?
# Añadir nueva clave.
chntpw "$FILE" << EOT &> /dev/null
cd ${3%\\*}
dk ${3##*\\}
q
y
EOT
}
#/**
# ogDeleteRegistryValue path_mountpoint str_hive str_valuename
#@brief Elimina un valor del registro de Windows.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
#@param str_valuename nombre del valor
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado.
#@note hive = { default, sam, security, software, system, components }
#@warning Requisitos: chntpw
#@warning El sistema de archivos de Windows debe estar montada previamente.
#@version 1.0.1 - Nueva función
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-05-25
#*/ ##
function ogDeleteRegistryValue ()
{
# Variables locales.
local FILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename" \
"$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1'"
return
fi
# Error si no se reciben 3 parámetros.
[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Camino del fichero de registro.
FILE=$(ogGetHivePath "$1" "$2") || return $?
# Devolver el dato del valor de registro.
# /* (comentario Doxygen)
chntpw "$FILE" << EOT &> /dev/null
cd ${3%\\*}
dv ${3##*\\}
q
y
EOT
# (comentario Doxygen) */
}
#/**
# ogGetHivePath path_mountpoint [str_hive|str_user]
#@brief Función básica que devuelve el camino del fichero con una sección del registro.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
#@return str_path - camino del fichero de registro
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado.
#@note hive = { DEFAULT, SAM, SECURITY, SOFTWARE, SYSTEM, COMPONENTS, NombreDeUsuario }
#@warning El sistema de archivos de Windows debe estar montada previamente.
#@version 1.0.1 - Nueva función
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-05-18
#@version 1.1.0 - Soportar registro de un usuario local.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2015-10-14
#*/ ##
function ogGetHivePath ()
{
# Variables locales.
local FILE HIVE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint [str_hive|str_user]" \
"$FUNCNAME /mnt/sda1 SOFTWARE => /mnt/sda1/WINDOWS/System32/config/SOFTWARE" \
"$FUNCNAME /mnt/sda1 user1 => /mnt/sda1/Users/user1/NTUSER.DAT"
return
fi
# Error si no se reciben 2 parámetros.
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Camino del fichero de registro de usuario o de sistema (de menor a mayor prioridad).
FILE="$(ogGetPath "/$1/Windows/System32/config/$2")"
[ -z "$FILE" ] && FILE="$(ogGetPath "/$1/Users/$2/NTUSER.DAT")"
[ -z "$FILE" ] && FILE="$(ogGetPath "/$1/winnt/system32/config/$2")"
[ -z "$FILE" ] && FILE="$(ogGetPath "/$1/Documents and Settings/$2/NTUSER.DAT")"
[ -f "$FILE" ] && echo "$FILE" || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
}
#/**
# ogGetRegistryValue path_mountpoint str_hive str_valuename
#@brief Devuelve el dato de un valor del registro de Windows.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
#@param str_valuename nombre del valor
#@return str_valuedata - datos del valor.
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado.
#@note hive = { default, sam, security, software, system, components }
#@warning Requisitos: chntpw, awk
#@warning El sistema de archivos de Windows debe estar montado previamente.
#@version 0.9 - Adaptación para OpenGNSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-09-11
#@version 1.1.0 - Soportar tipos BINARY (parejas hexadecimales separadas por espacio).
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2015-09-28
#*/ ##
function ogGetRegistryValue ()
{
# Variables locales.
local FILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename" \
"$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1' ==> 1"
return
fi
# Error si no se reciben 3 parámetros.
[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Camino del fichero de registro.
FILE=$(ogGetHivePath "$1" "$2") || return $?
# Devolver el dato del valor de registro.
# /* (comentario Doxygen)
chntpw "$FILE" << EOT 2> /dev/null | awk '/> Value/ {if (index($0, "REG_BINARY") > 0)
{data=""}
else
{getline; data=$0;} }
/^:[0-9A-F]+ / {data=data""substr($0, 9, 48);}
END {print data;}'
cd ${3%\\*}
cat ${3##*\\}
q
EOT
# (comentario Doxygen) */
}
#/**
# ogListRegistryKeys path_mountpoint str_hive str_key
#@brief Lista los nombres de subclaves de una determinada clave del registro de Windows.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
#@param str_key clave de registro
#@return str_subkey ... - lista de subclaves
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado.
#@note hive = { default, sam, security, software, system, components }
#@warning Requisitos: chntpw, awk
#@warning El sistema de archivos de Windows debe estar montado previamente.
#@version 0.9 - Adaptación para OpenGNSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-09-23
#*/ ##
function ogListRegistryKeys ()
{
# Variables locales.
local FILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_key" \
"$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\Windows\CurrentVersion'"
return
fi
# Error si no se reciben 3 parámetros.
[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Camino del fichero de registro.
FILE=$(ogGetHivePath "$1" "$2") || return $?
# Devolver la lista de claves de registro.
chntpw "$FILE" << EOT 2> /dev/null | awk 'BEGIN {FS="[<>]"} $1~/^ $/ {print $2}'
ls $3
q
EOT
}
#/**
# ogListRegistryValues path_mountpoint str_hive str_key
#@brief Lista los nombres de valores de una determinada clave del registro de Windows.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
#@param str_key clave de registro
#@return str_value ... - lista de valores
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado.
#@note hive = { default, sam, security, software, system, components }
#@warning Requisitos: chntpw, awk
#@warning El sistema de archivos de Windows debe estar montado previamente.
#@version 1.0.1 - Nueva función.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-05-26
#*/ ##
function ogListRegistryValues ()
{
# Variables locales.
local FILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_key" \
"$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\Windows\CurrentVersion'"
return
fi
# Error si no se reciben 3 parámetros.
[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Camino del fichero de registro.
FILE=$(ogGetHivePath "$1" "$2") || return $?
# Devolver la lista de claves de registro.
chntpw "$FILE" << EOT 2> /dev/null | awk 'BEGIN {FS="[<>]"} $1~/REG_/ {print $2}'
ls $3
q
EOT
}
#/**
# ogSetRegistryValue path_mountpoint str_hive str_valuename str_valuedata
#@brief Establece el dato asociado a un valor del registro de Windows.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
#@param str_valuename nombre del valor de registro
#@param str_valuedata dato del valor de registro
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado.
#@note hive = { default, sam, security, software, system, components }
#@warning Requisitos: chntpw
#@warning El sistema de archivos de Windows debe estar montado previamente.
#@version 0.9 - Adaptación para OpenGNSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-09-24
#@version 1.1.0 - Soportar tipos BINARY (parejas hexadecimales separadas por espacio).
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2015-09-28
#*/ ##
function ogSetRegistryValue ()
{
# Variables locales.
local FILE i n tmpfile
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename str_data" \
"$FUNCNAME /mnt/sda1 SOFTWARE '\Key\SubKey\StringValue' \"Abcde Fghij\"" \
"$FUNCNAME /mnt/sda1 SOFTWARE '\Key\SubKey\DwordValue' 1" \
"$FUNCNAME /mnt/sda1 SOFTWARE '\Key\SubKey\BinaryValue' \"04 08 0C 10\""
return
fi
# Error si no se reciben 4 parámetros.
[ $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Camino del fichero de registro.
FILE=$(ogGetHivePath "$1" "$2") || return $?
# Fichero temporal para componer la entrada al comando "chntpw".
tmpfile=/tmp/chntpw$$
trap "rm -f $tmpfile" 1 2 3 9 15
# Comprobar tipo de datos del valor del registro.
cat << EOT >$tmpfile
ls ${3%\\*}
q
EOT
if [ -n "$(chntpw "$FILE" < $tmpfile 2> /dev/null | grep "BINARY.*<${3##*\\}>")" ]; then
# Procesar tipo binario (incluir nº de bytes y líneas de 16 parejas hexadecimales).
[[ "$4 " =~ ^([0-9A-F]{2} )*$ ]] || ogRaiseError $OG_ERR_FORMAT "\"$4\"" || return $?
let n=${#4}+1
cat << EOT >$tmpfile
cd ${3%\\*}
ed ${3##*\\}
$[n/3]
EOT
# Formato de líneas hexadecimales: :OFFSET XX YY ZZ ... (hasta 16 parejas).
for (( i=0; i<n; i+=48 )); do
printf ":%05x %s\n" $[i/3] "${4:$i:48}" >> $tmpfile
done
echo -e "s\nq\ny" >> $tmpfile
else
# Cambiar el dato del valor de registro para cadenas y bytes.
cat << EOT >$tmpfile
cd ${3%\\*}
ed ${3##*\\}
$4
q
y
EOT
fi
# Aplicar cambios.
chntpw "$FILE" < $tmpfile &> /dev/null
rm -f $tmpfile
}

View File

@ -1,122 +0,0 @@
#!/bin/bash
#/**
# ogCheckStringInGroup
#@brief Función para determinar si el elemento pertenece a un conjunto
#@param 1 elemento a comprobar
#@param 2 grupo de elementos para comprobar tipo "valor1 valor2 valor3"
#@return 0 si pertenece al grupo
#@return 1 si NO pertenece al grupo
#@exception OG_ERR_FORMAT formato incorrecto.
#@note
#@todo
#@version 0.91 - Definición de
#@author Antonio Doblas Viso, Universidad de Málaga
#@date 2010/05/09
#*/ ##
function ogCheckStringInGroup ()
{
local i
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME str_elemento str_grupo" \
"$FUNCNAME full-duplex \"full-duplex half-duplex broadcast\" "
return
fi
# Error si no se recibe 2 parámetro.
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
for i in `echo $2`
do
if [ "$1" == "$i" ]
then
return 0
fi
done
return 1
}
#/**
# ogCheckStringInReg
#@brief Función para determinar si el elemento contiene una "expresión regular"
#@param 1 elemento a comprobar
#@param 2 expresión regular"
#@return 0 si coincide con la expresión
#@return 1 si NO coincide con la expresión
#@exception OG_ERR_FORMAT formato incorrecto.
#@note
#@todo
#@version 0.91 - Definición de
#@author Antonio Doblas Viso, Universidad de Málaga
#@date 2010/05/09
#*/ ##
function ogCheckStringInReg()
{
local REG
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME str_elemento str_expresión_regular" \
"$FUNCNAME 50M \"^[0-9]{1,2}\M$\" "
return
fi
# Error si no se recibe 2 parámetro.
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
REG=$2
[[ $1 =~ $REG ]] && return 0 || return 1
}
#/**
# ogCheckIpAddress
#@brief Función para determinar si una cadena es una dirección ipv4 válida
#@param 1 string de la ip a comprobar
#@return 0 si es una dirección válida
#@return 1 si NO es una dirección válida
#@exception OG_ERR_FORMAT formato incorrecto.
#@note
#@todo
#@version 0.91 - Definición de
#@author Antonio Doblas Viso, Universidad de Málaga
#@date 2010/05/09
#*/ ##
function ogCheckIpAddress()
{
local REG IP arrIP
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME str_IpAddressToCheck" \
"$FUNCNAME 192.18.35.3"
return
fi
# Error si no se recibe 1 parámetro.
[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
IP=$1
REG="^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"
if [[ "$IP" =~ $REG ]]
then
OIFS=$IFS;
IFS='.' ;
arrIP=($IP)
IFS=$OIFS
if [[ ${arrIP[0]} -le 255 && ${arrIP[1]} -le 255 && ${arrIP[2]} -le 255 && ${arrIP[3]} -le 255 ]]
then
return 0
fi
fi
return 1
}

View File

@ -1,339 +0,0 @@
#!/bin/bash
#/**
#@file System.lib
#@brief Librería o clase System
#@class System
#@brief Funciones básicas del sistema.
#@version 1.1.0
#@warning License: GNU GPLv3+
#*/
#/**
# ogEcho [str_logtype ...] [str_loglevel] "str_message" ...
#@brief Muestra mensajes en consola y lo registra en fichero de incidencias.
#@param str_logtype tipo de registro de incidencias.
#@param str_loglevel nivel de registro de incidencias.
#@param str_message mensaje (puede recibir más de 1 parámetro.
#@return Mensaje mostrado.
#@warning Si no se indica nivel de registro, solo muestra mensaje en pantalla.
#@warning Si DEBUG="no", no se registran mensajes de error.
#@note logfile = { log, command, session }; usa "log" si se indica nivel de registro.
#@note loglevel = { help, info, warning, error }
#@note El nivel de ayuda \c (help) no se registra en el fichero de incidencias.
#@version 0.9 - Primera versión para OpenGnSys
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-07-23
#@version 1.0.5 - Elegir fichero de log.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2014-03-17
#@version 1.1.0 - Posibilidad de no registrar mensajes en ficheros.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2015-11-10
#*/
function ogEcho () {
# Variables locales
local CONT=1 LOGS LOGLEVEL DATETIME
# Selección de ficheros de rgistro de incidencias.
while [ $CONT ]; do
case "${1,,}" in
log) LOGS="$LOGS $OGLOGFILE"; shift ;;
command) LOGS="$LOGS $OGLOGCOMMAND"; shift ;;
session) LOGS="$LOGS $OGLOGSESSION"; shift ;;
*) CONT= ;;
esac
done
# Selección del nivel de registro (opcional).
case "${1,,}" in
help) shift ;;
info) LOGLEVEL="$1"; shift ;;
warning) LOGLEVEL="$1"; shift ;;
error) LOGLEVEL="$1"; shift ;;
*) ;;
esac
if [ -n "$LOGLEVEL" ]; then
DATETIME=$(date +"%F %T")
# Registrar mensajes en fichero de log si la depuración no está desactivada.
[ "${DEBUG,,}" != "no" ] && LOGS="$OGLOGFILE $LOGS"
echo "OpenGnsys $LOGLEVEL" "$DATETIME $*" 2>&1 | tee -a $LOGS
else
echo "$*" | tee -a $LOGS
fi
}
#/**
# ogExecAndLog str_logfile ... str_command ...
#@brief Ejecuta un comando y guarda su salida en fichero de registro.
#@param str_logfile fichero de registro (pueden ser varios).
#@param str_command comando y comandos a ejecutar.
#@return Salida de ejecución del comando.
#@note str_logfile = { LOG, SESSION, COMMAND }
#@version 1.0.6 - Primera versión para OpenGnSys
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2013-07-02
#*/
function ogExecAndLog () {
# Variables locales
local ISCOMMAND ISLOG ISSESSION COMMAND CONTINUE=1 FILES REDIREC
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME str_logfile ... str_command ..." \
"$FUNCNAME COMMAND ls -al /"
return
fi
# Procesar parámetros.
while [ $CONTINUE ]; do
case "${1,,}" in
command) ISCOMMAND=1; shift ;;
log) ISLOG=1; shift ;;
session) ISSESSION=1; shift ;;
*) COMMAND="$@"
CONTINUE= ;;
esac
done
# Error si no se recibe un comando que ejecutar.
[ -n "$COMMAND" ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Componer lista de ficheros de registro.
if [ $ISCOMMAND ]; then
FILES="$OGLOGCOMMAND"
> $FILES
REDIREC="2>&1"
fi
[ $ISLOG ] && FILES="$FILES $OGLOGFILE"
[ $ISSESSION ] && FILES="$FILES $OGLOGSESSION"
# Ejecutar comando.
eval $COMMAND $REDIREC | tee -a $FILES
# Salida de error del comando ejecutado.
return ${PIPESTATUS[0]}
}
#/**
# ogGetCaller
#@brief Devuelve nombre del programa o script ejecutor (padre).
#@param No.
#@return str_name - Nombre del programa ejecutor.
#@version 0.10 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-01-17
#*/
function ogGetCaller () {
# Obtener el nombre del programa o del script que ha llamado al proceso actual.
basename "$(COLUMNS=200 ps hp $PPID -o args | \
awk '{if ($1~/bash/ && $2!="") { print $2; }
else { sub(/^-/,"",$1); print $1; } }')"
}
#/**
# ogHelp ["str_function" ["str_format" ["str_example" ... ]]]
#@brief Muestra mensaje de ayuda para una función determinda.
#@param str_function Nombre de la función.
#@param str_format Formato de ejecución de la función.
#@param str_example Ejemplo de ejecución de la función.
#@return str_help - Salida de ayuda.
#@note Si no se indican parámetros, la función se toma de la variable \c $FUNCNAME
#@note La descripción de la función se toma de la variable compuesta por \c MSG_FUNC_$función incluida en el fichero de idiomas.
#@note Pueden especificarse varios mensajes con ejemplos.
#@version 0.9 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-07-27
#*/
function ogHelp () {
# Variables locales.
local FUNC MSG
# Mostrar función, descripción y formato.
FUNC="${1:-${FUNCNAME[${#FUNCNAME[*]}-1]}}"
MSG="MSG_HELP_$FUNC"
ogEcho help "$MSG_FUNCTION $FUNC: ${!MSG}"
[ -n "$2" ] && ogEcho help " $MSG_FORMAT: $2"
# Mostrar ejemplos (si existen).
shift 2
while [ $# -gt 0 ]; do
ogEcho help " $MSG_EXAMPLE: $1"
shift
done
}
#/**
# ogRaiseError [str_logtype ...] int_errcode ["str_errmessage" ...]
#@brief Devuelve el mensaje y el código de error correspondiente.
#@param str_logtype tipo de registro de incidencias.
#@param int_errcode código de error.
#@param str_errmessage mensajes complementarios de error.
#@return str_message - Mensaje de error, incluyendo las funciones relacionadas.
#@warning No definidas
#@note Mensajes internacionales del fichero de idiomas.
#@version 0.9 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-07-21
#@version 1.0.5 - Muestra en el mensaje todas las funciones relacionadas (separadas por <-).
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2014-03-17
#*/
function ogRaiseError () {
# Variables locales
local CONT=1 LOGS MSG CODE FUNCS
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [str_logfile ...] int_errorcode str_errormessage"
return
fi
# Selección de rgistros de incidencias.
while [ $CONT ]; do
case "${1,,}" in
log|command|session) LOGS="$LOGS $1"; shift ;;
*) CONT= ;;
esac
done
# Obtener código y mensaje de error.
CODE="$1"
case "$CODE" in
$OG_ERR_FORMAT) MSG="$MSG_ERR_FORMAT \"$2\"" ;;
$OG_ERR_NOTFOUND) MSG="$MSG_ERR_NOTFOUND \"$2\"" ;;
$OG_ERR_OUTOFLIMIT) MSG="$MSG_ERR_OUTOFLIMIT \"$2\"" ;;
$OG_ERR_PARTITION) MSG="$MSG_ERR_PARTITION \"$2\"" ;;
$OG_ERR_LOCKED) MSG="$MSG_ERR_LOCKED \"$2\"" ;;
$OG_ERR_CACHE) MSG="$MSG_ERR_CACHE \"$2\"" ;;
$OG_ERR_NOGPT) MSG="$MSG_ERR_NOGPT \"$2\"" ;;
$OG_ERR_REPO) MSG="$MSG_ERR_REPO \"$2\"" ;;
$OG_ERR_FILESYS) MSG="$MSG_ERR_FILESYS \"$2\"" ;;
$OG_ERR_IMAGE) MSG="$MSG_ERR_IMAGE \"$2\"" ;;
$OG_ERR_NOTOS) MSG="$MSG_ERR_NOTOS \"$2\"" ;;
$OG_ERR_NOTEXEC) MSG="$MSG_ERR_NOTEXEC \"$2\"" ;;
$OG_ERR_NOTWRITE) MSG="$MSG_ERR_NOTWRITE \"$2\"" ;;
$OG_ERR_NOTCACHE) MSG="$MSG_ERR_NOTCACHE \"$2\"" ;;
$OG_ERR_CACHESIZE) MSG="$MSG_ERR_CACHESIZE \"$2\"" ;;
$OG_ERR_REDUCEFS) MSG="$MSG_ERR_REDUCEFS \"$2\"" ;;
$OG_ERR_EXTENDFS) MSG="$MSG_ERR_EXTENDFS \"$2\"" ;;
$OG_ERR_IMGSIZEPARTITION) MSG="$MSG_ERR_IMGSIZEPARTITION \"$2\"" ;;
$OG_ERR_UPDATECACHE) MSG="$MSG_ERR_UPDATECACHE \"$2\"" ;;
$OG_ERR_DONTFORMAT) MSG="$MSG_ERR_DONTFORMAT \"$2\"" ;;
$OG_ERR_IMAGEFILE) MSG="$MSG_ERR_IMAGEFILE \"$2\"" ;;
$OG_ERR_UCASTSYNTAXT) MSG="$MSG_ERR_UCASTSYNTAXT \"$2\"" ;;
$OG_ERR_UCASTSENDPARTITION) MSG="$MSG_ERR_UCASTSENDPARTITION \"$2\"" ;;
$OG_ERR_UCASTSENDFILE) MSG="$MSG_ERR_UCASTSENDFILE \"$2\"" ;;
$OG_ERR_UCASTRECEIVERPARTITION) MSG="$MSG_ERR_UCASTRECEIVERPARTITION \"$2\"" ;;
$OG_ERR_UCASTRECEIVERFILE) MSG="$MSG_ERR_UCASTRECEIVERFILE \"$2\"" ;;
$OG_ERR_MCASTSYNTAXT) MSG="$MSG_ERR_MCASTSYNTAXT \"$2\"" ;;
$OG_ERR_MCASTSENDFILE) MSG="$MSG_ERR_MCASTSENDFILE \"$2\"" ;;
$OG_ERR_MCASTRECEIVERFILE) MSG="$MSG_ERR_MCASTRECEIVERFILE \"$2\"" ;;
$OG_ERR_MCASTSENDPARTITION) MSG="$MSG_ERR_MCASTSENDPARTITION \"$2\"" ;;
$OG_ERR_MCASTRECEIVERPARTITION) MSG="$MSG_ERR_MCASTRECEIVERPARTITION \"$2\"" ;;
$OG_ERR_PROTOCOLJOINMASTER) MSG="$MSG_ERR_PROTOCOLJOINMASTER \"$2\"" ;;
$OG_ERR_DONTMOUNT_IMAGE) MSG="$MSG_ERR_DONTMOUNT_IMAGE \"$2\"" ;;
$OG_ERR_DONTUNMOUNT_IMAGE) MSG="$MSG_ERR_DONTUNMOUNT_IMAGE \"$2\"" ;;
$OG_ERR_DONTSYNC_IMAGE) MSG="$MSG_ERR_DONTSYNC_IMAGE \"$2\"" ;;
$OG_ERR_NOTDIFFERENT) MSG="$MSG_ERR_NOTDIFFERENT \"$2\"" ;;
$OG_ERR_SYNCHRONIZING) MSG="$MSG_ERR_SYNCHRONIZING \"$2\"" ;;
$OG_ERR_NOTUEFI) MSG="$MSG_ERR_NOTUEFI \"$2\"" ;;
$OG_ERR_NOMSDOS) MSG="$MSG_ERR_NOMSDOS \"$2\"" ;;
$OG_ERR_NOTBIOS) MSG="$MSG_ERR_NOTBIOS \"$2\"" ;;
*) MSG="$MSG_ERR_GENERIC"; CODE=$OG_ERR_GENERIC ;;
esac
# Obtener lista de funciones afectadas, incluyendo el script que las llama.
FUNCS="${FUNCNAME[@]:1}"
FUNCS="${FUNCS/main/$(basename $0 2>/dev/null)}"
# Mostrar mensaje de error si es función depurable y salir con el código indicado.
if [ $CODE == $OG_ERR_FORMAT ] || ogCheckStringInGroup "$FUNCS" "$NODEBUGFUNCTIONS" || ! ogCheckStringInGroup "${FUNCS%% *}" "$NODEBUGFUNCTIONS"; then
ogEcho $LOGS error "${FUNCS// /<-}: $MSG" >&2
fi
return $CODE
}
#/**
# ogIsRepoLocked
#@brief Comprueba si el repositorio está siendo usado (tiene ficheros abiertos).
#@param No.
#@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error.
#@version 0.10 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-01-17
#@version 1.0.1 - Devolver falso en caso de error.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2011-05-18
#*/
function ogIsRepoLocked ()
{
# Variables locales.
local f FILES
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "if $FUNCNAME; then ...; fi"
return
fi
# No hacer nada, si no está definido el punto de montaje del repositorio.
[ -z "$OGIMG" ] && return 1
# Comprobar si alguno de los ficheros abiertos por los procesos activos está en el
# punto de montaje del repositorio de imágenes.
FILES=$(for f in /proc/[0-9]*/fd/*; do readlink -f "$f"; done | grep "^$OGIMG") # */ (comentario Doxygen)
test -n "$FILES"
}
function ogCheckProgram ()
{
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME \"str_program ...\"" \
"$FUNCNAME \"partimage partclone mbuffer\""
return
fi
# Error si no se recibe 1 parámetro.
[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
local PERROR PLOG i
PERROR=0
PLOG=" "
for i in `echo $1`
do
if [ ! `which $i` ]
then
PERROR=1
PLOG="$PLOG $i"
fi
done
if [ "$PERROR" == "1" ]
then
ogRaiseError $OG_ERR_NOTEXEC "$PLOG" || return $?
else
return 0
fi
}
#### PRUEBA
function ogIsVirtualMachine() {
case "$(dmidecode -s system-product-name)" in
KVM|VirtualBox)
return 1 ;;
*) return 0 ;;
esac
}

View File

@ -1,679 +0,0 @@
#!/bin/bash
# Libreria provisional para uso de UEFI
# Las funciones se incluirán las librerías ya existentes
#/**
# ogNvramActiveEntry
#@brief Activa entrada de la NVRAM identificada por la etiqueta o el orden
#@param Num_order_entry | Label_entry Número de orden o la etiqueta de la entrada a borrar.
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTUEFI UEFI no activa.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#*/ ##
function ogNvramActiveEntry () {
local NUMENTRY
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ Num_order_entry | Label_entry ] " \
"$FUNCNAME 2" \
"$FUNCNAME \"Windows Boot Manager\""
return
fi
# Error si no se recibe 1 parámetro.
[ $# -eq 1 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME [ Num_order_entry | Label_entry ]" || return $?
# Si no es equipo UEFI salir con error
ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $?
# Distingo si es número de orden o etiqueta
if [[ $1 =~ ^([0-9a-fA-F]+)$ ]]; then
NUMENTRY=$( efibootmgr |awk -v NUM="$(printf %04x 0x$1|tr '[:lower:]' '[:upper:]')" '{ if($1~NUM) print substr($1,5,4)}')
else
NUMENTRY=$(efibootmgr |awk -v LABEL="$1" '{ if(substr($0, index($0,$2))==LABEL) print substr($1,5,4)}')
fi
[ "$NUMENTRY" == "" ] && return $(ogRaiseError $OG_ERR_NOTFOUND "NVRAM entry '$1'")
efibootmgr -a -b $NUMENTRY &>/dev/null
}
#/**
# ogNvramAddEntry
#@brief Crea nueva entrada en el gestor de arranque (NVRAM), opcionalmente la incluye al final del orden de arranque.
#@param Str_Label_entry Número de disco o etiqueta de la entrada a crear.
#@param Str_BootLoader Número de partición o cargador de arranque.
#@param Bool_Incluir_Arranque Incluir en el orden de arranque (por defecto FALSE) (opcional)
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTUEFI UEFI no activa.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#*/ ##
function ogNvramAddEntry () {
local EFIDISK EFIPART BOOTLABEL BOOTLOADER ADDORDER
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME Str_label_entry Str_boot_loader [ Bool_add_bootorder ]" \
"$FUNCNAME 1 2 TRUE" \
"$FUNCNAME grub /EFI/grub/grubx64.efi TRUE" \
"$FUNCNAME Windows /EFI/Microsoft/Boot/bootmgfw.efi"
return
fi
# Error si no se recibe 1 parámetro.
[ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME Str_label_entry Str_boot_locader" || return $?
# Si no es equipo UEFI salir con error
ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $?
read -e EFIDISK EFIPART <<<"$(ogGetEsp)"
[ -n "$EFIPART" ] || ogRaiseError $OG_ERR_NOTFOUND "ESP" || return $?
# Recogemos parámetros
# Distinguimos si es disco/partición o etiqueta/cargador
if [[ "$1$2" =~ ^([0-9]+)$ ]]; then
BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2)
BOOTLOADER="/EFI/$BOOTLABEL/Boot/ogloader.efi"
else
BOOTLABEL="$1"
BOOTLOADER="$2"
fi
# Si existe entrada con la misma etiqueta la borramos
ogNvramDeleteEntry "$BOOTLABEL" 2>/dev/null
efibootmgr -C -d $(ogDiskToDev $EFIDISK) -p $EFIPART -L "$BOOTLABEL" -l "$BOOTLOADER" &>/dev/null
# Incluimos la entrada en el orden de arranque (opcional)
if [ "${3^^}" == "TRUE" ]; then
NUMENTRY=$(efibootmgr |awk -v LABEL="$BOOTLABEL" '{ if(substr($0, index($0,$2))==LABEL) print substr($1,5,4)}')
ogNvramSetOrder $(ogNvramGetOrder |tr , " ") $NUMENTRY
fi
}
#/**
# ogCopyEfiBootLoader int_ndisk str_repo path_image
#@brief Copia el cargador de arranque desde la partición EFI a la de sistema.
#@param int_ndisk nº de orden del disco
#@param int_part nº de partición
#@return (nada, por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#@note Si existe el cargador en la partición de sistema no es válido
#*/ ##
function ogCopyEfiBootLoader () {
# Variables locales
local MNTDIR EFIDIR BOOTLABEL OSVERSION LOADER f
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part" \
"$FUNCNAME 1 2"
return
fi
# Error si no se reciben 2 arámetros.
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part" || return $?
# Comprobamos que exista partición de sistema y la ESP
MNTDIR=$(ogMount $1 $2) || ogRaiseError $OG_ERR_PARTITION "$DISK $PART" || return $?
EFIDIR=$(ogMount $(ogGetEsp)) || ogRaiseError $OG_ERR_PARTITION "ESP" || return $?
# Comprobamos que exista el cargador
BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2)
OSVERSION=$(ogGetOsVersion $1 $2)
case $OSVERSION in
*Windows\ 10*)
for f in $EFIDIR/EFI/{Microsoft,$BOOTLABEL}/Boot/bootmgfw.efi; do
[ -r $f ] && LOADER=$f
done
[ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($OSVERSION, EFI)" || return $?
# Si existe el directorio Boot lo borramos
[ -d $MNTDIR/ogBoot ] && rm -rf $MNTDIR/ogBoot
DIRLOADER=$(realpath "${LOADER%/*}/..")
cp -r ${DIRLOADER}/Boot $MNTDIR/ogBoot
;;
esac
}
#/**
# ogNvramDeleteEntry
#@brief Borra entrada de la NVRAM identificada por la etiqueta o el orden
#@param Num_order_entry | Label_entry Número de orden o la etiqueta de la entrada a borrar.
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTUEFI UEFI no activa.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado (entrada en NVRAM).
#*/ ##
function ogNvramDeleteEntry () {
local NUMENTRY n
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ Num_order_entry | Label_entry ] " \
"$FUNCNAME 2" \
"$FUNCNAME \"Windows Boot Manager\""
return
fi
# Error si no se recibe 1 parámetro.
[ $# -eq 1 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME [ Num_order_entry | Label_entry ]" || return $?
# Si no es equipo UEFI salir con error
ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $?
# Distingo si es número de orden o etiqueta
if [[ $1 =~ ^([0-9a-fA-F]+)$ ]]; then
NUMENTRY=$( efibootmgr |awk -v NUM="$(printf %04x 0x$1|tr '[:lower:]' '[:upper:]')" '{ if($1~NUM) print substr($1,5,4)}')
else
NUMENTRY=$(efibootmgr |awk -v LABEL="$1" '{ if(substr($0, index($0,$2))==LABEL) print substr($1,5,4)}')
fi
[ "$NUMENTRY" == "" ] && return $(ogRaiseError $OG_ERR_NOTFOUND "NVRAM entry '$1'")
for n in $NUMENTRY; do
efibootmgr -B -b $n &>/dev/null
done
}
#/**
# ogNvramGetCurrent
#@brief Muestra la entrada del gestor de arranque (NVRAM) que ha iniciado el equipo.
#@return Entrada con la que se ha iniciado el equipo
#@exception OG_ERR_NOTUEFI UEFI no activa.
#*/ ##
function ogNvramGetCurrent () {
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" \
"$FUNCNAME"
return
fi
# Si no es equipo UEFI salir con error
ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $?
efibootmgr| awk -v bootentry=99999 '{if ($1~/BootCurrent/) bootentry=$2; if ($1~bootentry) printf "%s %s %s\n", gensub(/^0{1,3}/,"",1,substr($1,5,4))," ", substr($0, index($0,$2))}'
}
# ogNvramGetNext
#@brief Muestra la entrada del gestor de arranque (NVRAM) que se utilizará en el próximo arranque.
#@return Entrada que se utilizará en el próximo arranque
#@exception OG_ERR_NOTUEFI UEFI no activa.
#*/ ##
function ogNvramGetNext () {
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" \
"$FUNCNAME"
return
fi
# Si no es equipo UEFI salir con error
ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $?
efibootmgr|awk '{ if ($1 == "BootNext:") print $2}'
}
# ogNvramGetOrder
#@brief Muestra el orden de las entradas del gestor de arranque (NVRAM)
#@return Orden de las entradas
#@exception OG_ERR_NOTUEFI UEFI no activa.
#*/ ##
function ogNvramGetOrder () {
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" \
"$FUNCNAME"
return
fi
# Si no es equipo UEFI salir con error
ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $?
efibootmgr|awk '{ if ($1 == "BootOrder:") print $2}'
}
#/**
# ogNvramGetTimeout
#@brief Muestra el tiempo de espera del gestor de arranque (NVRAM)
#@return Timeout de la NVRAM
#@exception OG_ERR_NOTUEFI UEFI no activa.
#*/ ##
function ogNvramGetTimeout () {
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" \
"$FUNCNAME"
return
fi
# Si no es equipo UEFI salir con error
ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $?
efibootmgr|awk '{ if ($1 == "Timeout:") print substr($0, index($0,$2))}'
}
#/**
# ogGrubUefiConf int_ndisk int_part str_dir_grub
#@brief Genera el fichero grub.cfg de la ESP
#@param int_ndisk nº de orden del disco
#@param int_part nº de partición
#@param str_dir_grub prefijo del directorio de grub en la partición de sistema. ej: /boot/grubPARTITION
#@return (nada, por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#@TODO Confirmar si el fichero "$EFIDIR/EFI/$BOOTLABEL/grub.cfg" es necesario.
#*/ ##
function ogGrubUefiConf () {
local EFIDIR BOOTLABEL GRUBEFI UUID DEVICE PREFIXSECONDSTAGE EFIGRUBDIR
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part [ str_dir_grub ]" \
"$FUNCNAME 1 2" \
"$FUNCNAME 1 3 /boot/grubPARTITION"
return
fi
# Error si no se reciben al menos 2 parámetros.
[ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part [ str_dir_grub ]" || return $?
# Directorio del grub en la partición de sistema
PREFIXSECONDSTAGE="$3"
EFIDIR=$(ogMount $(ogGetEsp)) || ogRaiseError $OG_ERR_PARTITION "ESP" || return $?
BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2)
EFIGRUBDIR="$EFIDIR/EFI/$BOOTLABEL/boot/grub"
# Comprobamos que existe directorio
[ -d "$EFIGRUBDIR" ] || mkdir -p "$EFIGRUBDIR"
# Parcheamos uuid y particion en grub.cfg
UUID=$(blkid -o value -s UUID $(ogDiskToDev $1 $2))
DEVICE="hd$(expr $1 - 1 ),gpt$2"
cat << EOT > $EFIGRUBDIR/grub.cfg
set root='$DEVICE'
set prefix=(\$root)'${PREFIXSECONDSTAGE}/boot/grub'
configfile \$prefix/grub.cfg
EOT
# Provisional: confirmar si el segundo archivo se utiliza
cp $EFIGRUBDIR/grub.cfg "$EFIDIR/EFI/$BOOTLABEL/grub.cfg"
}
#/**
# ogNvramInactiveEntry
#@brief Inactiva entrada de la NVRAM identificada por la etiqueta o el orden
#@param Num_order_entry | Label_entry Número de orden o la etiqueta de la entrada a borrar.
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#@exception OG_ERR_NOTUEFI UEFI no activa.
#*/ ##
function ogNvramInactiveEntry () {
local NUMENTRY
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ Num_order_entry | Label_entry ] " \
"$FUNCNAME 2" \
"$FUNCNAME \"Windows Boot Manager\""
return
fi
# Error si no se recibe 1 parámetro.
[ $# -eq 1 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME [ Num_order_entry | Label_entry ]" || return $?
# Si no es equipo UEFI salir con error
ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $?
# Distingo si es número de orden o etiqueta
if [[ $1 =~ ^([0-9a-fA-F]+)$ ]]; then
NUMENTRY=$( efibootmgr |awk -v NUM="$(printf %04x 0x$1|tr '[:lower:]' '[:upper:]')" '{ if($1~NUM) print substr($1,5,4)}')
else
NUMENTRY=$(efibootmgr |awk -v LABEL="$1" '{ if(substr($0, index($0,$2))==LABEL) print substr($1,5,4)}')
fi
[ "$NUMENTRY" == "" ] && return $(ogRaiseError $OG_ERR_NOTFOUND "NVRAM entry '$1'")
efibootmgr -A -b $NUMENTRY &>/dev/null
}
#/**
# ogNvramList
#@brief Lista las entradas de la NVRAN (sólo equipos UEFI)
#@return Entradas de la NVRAM con el formato: orden etiqueta [* (si está activa) ]
#@exception OG_ERR_NOTUEFI UEFI no activa.
#*/ ##
function ogNvramList () {
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" \
"$FUNCNAME"
return
fi
# Si no es equipo UEFI salir con error
ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $?
efibootmgr |awk '{if($1~/Boot[[:digit:]]/) ; active="" ;if ($1~/*/) active="*"; if($1~/Boot[[:digit:]]/) printf "%4s %s %s %s\n", gensub(/^0{1,3}/,"",1,substr($1,5,4))," ", substr($0, index($0,$2)), active}'
}
#/**
# ogNvramPxeFirstEntry
#@brief Sitúa la entrada de la tarjeta de red en el primer lugar en la NVRAM.
#@return (nada)
#@exception OG_ERR_NOTUEFI UEFI no activa.
#*/ ##
function ogNvramPxeFirstEntry (){
local NUMENTRY ORDER
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" \
"$FUNCNAME"
return
fi
# Si no es equipo UEFI salir con error
ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $?
NUMENTRY=$(printf %04X 0x$(efibootmgr|awk '/IP[vV]{0,1}4/ {print gensub(/^0{1,3}/,"",1,substr($1,5,4))}'))
# Si la entrada es la primera nos salimos.
[[ $(ogNvramGetOrder) =~ ^$NUMENTRY ]] && return
# Si la entrada ya existe la borramos.
ORDER="$NUMENTRY $(ogNvramGetOrder| sed -e s/$NUMENTRY//g -e s/,/' '/g)"
ogNvramSetOrder $ORDER
}
#/**
# ogRestoreEfiBootLoader int_ndisk str_repo
#@brief Copia el cargador de arranque de la partición de sistema a la partición EFI.
#@param int_ndisk nº de orden del disco
#@param int_part nº de partición
#@return (nada, por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado (partición de sistema o EFI).
#@exception OG_ERR_NOTOS sin sistema operativo.
#*/ ##
function ogRestoreEfiBootLoader () {
# Variables locales
local MNTDIR EFIDIR BOOTLABEL OSVERSION LOADER f UUID DEVICE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part" \
"$FUNCNAME 1 2"
return
fi
# Error si no se reciben 2 arámetros.
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part" || return $?
# Comprobamos que exista partición de sistema y la ESP
MNTDIR=$(ogMount $1 $2) || ogRaiseError $OG_ERR_PARTITION "$DISK $PART" || return $?
EFIDIR=$(ogMount $(ogGetEsp))
if [ "$EFIDIR" == "" ]; then
ogFormat $(ogGetEsp) FAT32
EFIDIR=$(ogMount $(ogGetEsp)) || ogRaiseError $OG_ERR_PARTITION "ESP" || return $?
fi
# Comprobamos que exista el cargador
#BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2)
OSVERSION=$(ogGetOsVersion $1 $2)
case $OSVERSION in
*Windows\ 10*)
BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2)
LOADER=$(ogGetPath $MNTDIR/ogBoot/bootmgfw.efi)
[ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($OSVERSION, EFI)" || return $?
[ -r $EFIDIR/EFI/$BOOTLABEL ] && rm -rf $EFIDIR/EFI/$BOOTLABEL
mkdir -p $EFIDIR/EFI/$BOOTLABEL
cp -r "${LOADER%/*}" $EFIDIR/EFI/$BOOTLABEL/Boot
# Nombre OpenGnsys para cargador
cp $LOADER $EFIDIR/EFI/$BOOTLABEL/Boot/ogloader.efi
# Si existe subcarpeta Microsoft en la partición EFI la renombramos
[ "$(ogGetPath $EFIDIR/EFI/Microsoft)" == "" ] || mv $EFIDIR/EFI/{Microsoft,Microsoft.backup.og}
;;
esac
}
#/**
# ogRestoreUuidPartitions
#@brief Restaura los uuid de las particiones y la tabla de particiones
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
#@param REPO|CACHE repositorio
#@param str_imgname nombre de la imagen
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND No encontrado fichero de información de la imagen (con uuid)
#*/ ##
function ogRestoreUuidPartitions () {
local DISK PART IMGNAME INFOFILE DEVICE DATA GUID UUID IMGGUID
local EFIDEVICE EFIDATA EFIGUID EFIUUID EFIUUID IMGEFIGUID
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME REPO|CACHE str_imgname int_ndisk int_npart" \
"$FUNCNAME REPO Windows 1 2"
return
fi
# Error si no se reciben 4 parámetros.
[ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME REPO|CACHE str_imgname int_ndisk int_npart" || return $?
# Sólo se ejecuta si es UEFI
ogIsEfiActive || return
# Parámetros de entrada
IMGNAME="$2"
INFOFILE="$OGIMG/.$IMGNAME.img.json"
[ "${1^^}" == "CACHE" ] && INFOFILE="$OGCAC$INFOFILE"
# TODO: que la función getPath soporte archivos ocultos
ls $INFOFILE &>/dev/null || ogRaiseError $OG_ERR_NOTFOUND "$INFOFILE" || return $?
DISK=$3
PART=$4
DEVICE=$(ogDiskToDev $DISK)
read -e EFIDISK EFIPART <<<"$(ogGetEsp)"
# Datos de la imagen
IMGGUID=$(jq .guid $INFOFILE|tr -d \")
IMGEFIGUID=$(jq .espguid $INFOFILE|tr -d \")
# Datos actuales
DATA=$(sfdisk -J $DEVICE)
GUID=$(echo $DATA|jq ".partitiontable|.id"|tr -d \")
if [ "$IMGGUID" != "$GUID" ]; then
echo sgdisk -U "$IMGGUID" "$DEVICE"
sgdisk -U "$IMGGUID" "$DEVICE"
partprobe
fi
if [ $DISK -eq $EFIDISK ]; then
EFIDATA=$DATA
EFIDEVICE=$DEVICE
else
EFIDEVICE=$(ogDiskToDev $EFIDISK) || return $?
EFIDATA=$(sfdisk -J $EFIDEVICE)
EFIGUID=$(echo $EFIDATA|jq ".partitiontable|.id"|tr -d \")
if [ "$IMGEFIGUID" != "$EFIGUID" ]; then
echo sgdisk -U "$IMGEFIGUID" "$EFIDEVICE"
sgdisk -U "$IMGEFIGUID" "$EFIDEVICE"
partprobe
fi
fi
}
#/**
# ogNvramSetNext
#@brief Configura el próximo arranque con la entrada del gestor de arranque (NVRAM) identificada por la etiqueta o el orden.
#@param Num_order_entry | Label_entry Número de orden o la etiqueta de la entrada a borrar.
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTUEFI UEFI no activa.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#*/ ##
function ogNvramSetNext () {
local NUMENTRY
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME [ Num_order_entry | Label_entry ] " \
"$FUNCNAME 2" \
"$FUNCNAME \"Windows Boot Manager\""
return
fi
# Error si no se recibe 1 parámetro.
[ $# -eq 1 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME [ Num_order_entry | Label_entry ]" || return $?
# Si no es equipo UEFI salir con error
ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $?
# Distingo si es número de orden o etiqueta
if [[ $1 =~ ^([0-9a-fA-F]+)$ ]]; then
NUMENTRY=$( efibootmgr |awk -v NUM="$(printf %04x 0x$1|tr '[:lower:]' '[:upper:]')" '{ if($1~NUM) print substr($1,5,4)}')
else
NUMENTRY=$(efibootmgr | awk -v LABEL="$1" '$0 ~ LABEL { print substr($1,5,4) }')
fi
[ "$NUMENTRY" == "" ] && return $(ogRaiseError $OG_ERR_NOTFOUND "NVRAM entry '$1'")
efibootmgr -n $NUMENTRY &>/dev/null
}
#/**
# ogNvramSetOrder
#@brief Configura el orden de las entradas de la NVRAM
#@param Orden de las entradas separadas por espacios
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTUEFI UEFI no activa.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado (entrada NVRAM).
#*/ ##
function ogNvramSetOrder () {
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME Num_order1 [ Num_order2 ] ... " \
"$FUNCNAME 1 3"
return
fi
#
# Error si no se recibe al menos 1 parámetro.
[ $# -ge 1 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME Num_order1 [ Num_order2 ] ..." || return $?
# Si no es equipo UEFI salir con error
ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $?
# Comprobamos que sean números
[[ "$@" =~ ^([0-9a-fA-F ]+)$ ]] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME Num_order1 [ Num_order2 ] ..." || return $?
# Entradas de la NVRAM actuales
NUMENTRYS=$(efibootmgr|awk '{ if ($1~/Boot[0-9a-fA-F]{4}/) printf "0%s ", substr($1,5,4)}')
ORDER=""
for ARG in $@; do
# Si no existe la entrada me salgo
ARG=$(printf %04X 0x$ARG)
echo $NUMENTRYS | grep "$ARG" &>/dev/null || ogRaiseError $OG_ERR_NOTFOUND "NVRAM entry order \"$ARG\"" || return $?
ORDER=${ORDER},$ARG
done
# Cambiamos el orden
efibootmgr -o ${ORDER#,} &>/dev/null
}
#/**
# ogNvramSetTimeout
#@brief Configura el tiempo de espera de la NVRAM
#@param Orden de las entradas separadas por espacios
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#*/ ##
function ogNvramSetTimeout () {
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_Timeout (seg)" \
"$FUNCNAME 2"
return
fi
#
# Si no es equipo UEFI salir con error
ogIsEfiActive || ogRaiseError $OG_ERR_NOTUEFI || return $?
# Error si no se recibe 1 parámetro.
[ $# -eq 1 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_Timeout (seg)" || return $?
# Comprobamos que sea un número
[[ "$1" =~ ^([0-9 ]+)*$ ]] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_Timeout (seg)" || return $?
# Cambiamos el orden
efibootmgr -t $1 &>/dev/null
}
#/**
# ogUuidChange int_ndisk str_repo
#@brief Reemplaza el UUID de un sistema de ficheros.
#@param int_ndisk nº de orden del disco
#@param int_part nº de partición
#@return (nada, por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#*/ ##
function ogUuidChange () {
local MNTDIR DEVICE UUID NEWUUID f
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part" \
"$FUNCNAME 1 2"
return
fi
# Error si no se reciben al menos 2 parámetros.
[ $# -eq 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part" || return $?
# Comprobamos que exista la partición
MNTDIR=$(ogMount $1 $2) || ogRaiseError $OG_ERR_NOTFOUND "Device $1 $2" || return $?
DEVICE=$(ogDiskToDev $1 $2)
UUID=$(blkid -o value -s UUID $DEVICE)
NEWUUID=$(cat /proc/sys/kernel/random/uuid)
# Cambiamos UUID a la partición
ogUnmount $1 $2
tune2fs $DEVICE -U $NEWUUID
# Cambiamos UUID en la configuración (fstab y grub)
ogMount $1 $2
for f in $MNTDIR/etc/fstab $MNTDIR/{,boot/}{{grubMBR,grubPARTITION}/boot/,}{grub{,2},{,efi/}EFI/*}/{menu.lst,grub.cfg}; do
[ -r $f ] && sed -i s/$UUID/$NEWUUID/g $f
done
}

View File

@ -1,93 +0,0 @@
Test de comprobacion de la librería Cache.lib y los script relacionados
=======================================================================
Este test destruye la cache
Necesita que las particiones sean tres como máximo
=================================================
$ ogUnmountCache 2>/dev/null ; df|grep cache
$ ogCreateCache 10000000 1>/dev/null 2>&1
$ AUX=$(ogListPartitions 1) ; echo ${AUX##*CACHE:} | sed s/\ .*\$//g
10000000
# Comprobamos que no esta formateada
$ ogCheckFs 1 4
OpenGnsys error: ogCheckFs: "1, 4, CACHE"
$ ogFormatCache|tail -1
ReiserFS is successfully created on /dev/sda4.
$ ogMountCache
/opt/opengnsys/cache
$ echo $OGCAC
/opt/opengnsys/cache
$ touch $OGCAC$OGIMG/lll
$ ls $OGCAC$OGIMG
lll
$ rm $OGCAC$OGIMG/lll
$ ogFindCache
1 4
$ ogGetCacheSize
10000000
$ ogDeleteCache >/dev/null 2>&1
$ ogFindCache
$ initCache 2000000 1>/dev/null 2>&1
$ touch $OGCAC$OGIMG/lll
$ ls $OGCAC$OGIMG
lll
$ rm $OGCAC$OGIMG/lll
#################################################33
# No permite unicast
#################################################33
#$ echo ooo > $OGCAC$OGIMG/_test_.img
#$ echo jjjjjjjjjjjjjjjjjjjjjjjjjjjjjj > $OGIMG/_test_.img
#$ touch $OGIMG/_test_.torrent
#$ updateCache REPO _test_ UNICAST
Comprobamos los errores de las entradas de datos
================================================
$ ogCreateCache
OpenGnsys error: ogCreateCache: ""
$ ogCreateCache -1
OpenGnsys error: ogCreateCache: "-1"
$ ogCreateCache 0
OpenGnsys error: ogCreateCache: "0"
# cuando se está usando la cuarta partitión no debe crearse la cache
#$ ogCreatePartition 1 NTFS:200000 EXT3:2000000 EXT3:2000000 NTFS:30000000
#$ ogListPartitions 1
#NTFS:200000 EXT3:2000000 EXT3:2000000 EXTENDED:20000000 LINUX-SWAP:199999
#$ ogCreateCache 1000000
#$ ogFindCache
# si hay cache no podemos
$ ogDeleteCache 1>/dev/null 2>&1
$ ogCreatePartitions 1 NTFS:200000 EXT3:2000000 EXT3:2000000 1>/dev/null 2>&1
$ ogCreateCache 1000000 1>/dev/null 2>&1
$ ogCreatePartitions 1 NTFS:200000 EXT2:2000000 EXT2:2000000 LINUX-SWAP:200000 1>/dev/null 2>&1; echo $?
1
FALTA
====
ogGetCacheSpace
updateCache
Error
=====
Al crear la cache no se comprueba si existe una cuarta particion. La machaca

View File

@ -1,75 +0,0 @@
Test de compribación de la libreria File No modifica nada
========================================
Este test NECESITA LA CACHE
Comprobamos que existe CACHE
$ ls -d $OGCAC$OGIMG # Este test NECESITA LA CACHE ##############################
/opt/opengnsys/cache/opt/opengnsys/images
$ ogMakeDir CACHE prueba
$ ls -d $OGCAC$OGIMG/prueba
/opt/opengnsys/cache/opt/opengnsys/images/prueba
$ touch $OGCAC$OGIMG/fichero_prueba
$ ogCopyFile CACHE fichero_prueba CACHE prueba
$ ls $OGCAC$OGIMG/prueba
fichero_prueba
$ ogGetPath CACHE fichero_prueba
/opt/opengnsys/cache/opt/opengnsys/images/fichero_prueba
# Si no existe el fichero
$ ogGetPath CACHE fichero_prueba3; echo $?
1
$ ogGetParentPath CACHE fichero_prueba
/opt/opengnsys/cache/opt/opengnsys/images
# si el fichero no existe
$ ogGetParentPath CACHE prueba/fichero_prueba3q23
/opt/opengnsys/cache/opt/opengnsys/images/prueba
# Si dir padre no existe
$ ogGetParentPath CACHE pruebaNO/fichero_prueba3; echo $?
1
$ AUX=$(ogCalculateChecksum $OGCAC$OGIMG/fichero_prueba); AUX2=$(md5sum $OGCAC$OGIMG/fichero_prueba| cut -f1 -d\ ); if [ "$AUX" == "$AUX2" ]; then echo si; else echo no; fi
si
$ ogCompareChecksumFiles CACHE fichero_prueba CACHE prueba/fichero_prueba; echo $?
0
$ echo 333 >> $OGCAC$OGIMG/fichero_prueba2
$ ogMakeChecksumFile CACHE fichero_prueba2
$ ls $OGCAC$OGIMG/fichero_prueba2.sum
/opt/opengnsys/cache/opt/opengnsys/images/fichero_prueba2.sum
$ ogMakeChecksumFile CACHE prueba/fichero_prueba
$ ogCompareChecksumFiles CACHE fichero_prueba2 CACHE prueba/fichero_prueba; echo $?
1
$ ogIsNewerFile CACHE fichero_prueba2 CACHE prueba/fichero_prueba; echo $?
0
$ ogIsNewerFile CACHE prueba/fichero_prueba CACHE fichero_prueba2; echo $?
1
$ ogIsNewerFile CACHE fichero_prueba CACHE prueba/fichero_prueba; echo $?
1
$ ogDeleteTree CACHE prueba
$ ls -d $OGCAC$OGIMG/prueba
ls: cannot access /opt/opengnsys/cache/opt/opengnsys/images/prueba: No such file or directory
$ ogDeleteFile CACHE fichero_prueba
$ ls $OGCAC$OGIMG/fichero_prueba
ls: cannot access /opt/opengnsys/cache/opt/opengnsys/images/fichero_prueba: No such file or directory
# Limpiamos el directorio
$ rm -rf $OGCAC$OGIMG/fichero_prueba2* $OGCAC$OGIMG/prueba2
MEJORAS
=======
ogCompareChecksumFiles -> si no existen los ficheros de Checksum da verdadero. Deberia dar falso

View File

@ -1,85 +0,0 @@
€jemplo de test de funciones de bloqueo de particiones e imagenes
=================================================================
# Funciones de bloqueo
$ ogLock 1 1
$ ls /var/lock/lock-dev-sda1
/var/lock/lock-dev-sda1
$ if ogIsLocked 1 1; then echo si; else echo no; fi
si
$ ls /var/lock/lock-dev-sda1
/var/lock/lock-dev-sda1
$ ogUnlock 1 1
$ if ogIsLocked 1 1; then echo si; else echo no; fi
no
$ ogLockPartition 1 1
$ if ogIsLocked 1 1; then echo si; else echo no; fi
si
$ ogUnlockPartition 1 1
$ if ogIsLocked 1 1; then echo si; else echo no; fi
no
# Es necesario desmontar para probar ogCheck
$ ogUnmount 1 1 >/dev/null 2>&1
$ ogLock 1 1
$ ogCheckFs 1 1
OpenGnsys error: ogCheckFs: "1 1"
$ ogUnlock 1 1
$ ogCheckFs 1 1 >/dev/null 2>&1; echo $?
0
# Bloqueo del repositorio
$ ogIsRepoLocked; echo $?
1
# FALTA: test bloqueo repo cuando esta bloqueado
# bloqueo de imagenes
# Creo una imagen ficticia
$ touch $OGIMG/_test_.img
$ ogLockImage REPO _test_
$ ls $OGIMG/_test_.lock
/opt/opengnsys/images/_test_.lock
$ if ogIsImageLocked REPO _test_ ; then echo si; else echo no; fi
si
$ ogUnlockImage REPO _test_
$ if ogIsImageLocked REPO _test_ ; then echo si; else echo no; fi
no
$ rm $OGIMG/_test_.*
# Comprobando los errores (FALTA)
$ ogLock
OpenGnsys error: ogLockPartition: ""
$ ogLock 1 10
OpenGnsys error: ogDiskToDev: ""
$ ogIsLocked
OpenGnsys error: ogIsLocked: ""
$ ogIsLocked 1 10
OpenGnsys error: ogDiskToDev: ""

View File

@ -1,21 +0,0 @@
Test para la librería Net.lib No modifica
=========================================
$ if [ "$(ogGetHostname)" == "$(hostname)" ] ; then echo si; else echo no; fi
si
$ if [ "$(ogGetNetInterface)" == "$(ifconfig|head -1|cut -d\ -f1 )" ]; then echo si; else echo no; fi
si
$ AUX=$(ifconfig eth0|grep 'inet addr'|cut -dB -f1|sed s/\ //g); if [ "$(ogGetIpAddress)" == "${AUX#*:}" ]; then echo si; else echo no; fi
si
$ AUX=$(ifconfig |head -1|sed s/\ //g| tr '[a-z]' '[A-Z]'); if [ "$(ogGetMacAddress)" == "${AUX##*HWADDR}" ]; then echo si; else echo no; fi
si
$ AUX=$(df|grep $OGIMG); if [ "//$(ogGetRepoIp)" == "${AUX%/ogimages*}" ]; then echo si; else echo no; fi
si
$ AUX=$(df|grep $OGIMG); if [ "//$(ogGetServerIp)" == "${AUX%/ogimages*}" ]; then echo si; else echo no; fi
si

View File

@ -1,6 +0,0 @@
Separamos los test que no modifican el cliente y los que sí lo hacen (pueden modificar la partitiones, imagenes, etc) en dos directorios distintos.
Ademas los numeramos diferentes por si los queremos mover de sitio:
Los test acabados en 1x no modifican nada
Los test acabados en 2x modifican el cliente

View File

@ -1,160 +0,0 @@
#!/bin/bash
# Descripcion: Crea un test no destructivo de la libreria Disk.lib conficurandolo
# para un cliente concreto.
# Se ejecuta en el servidor y el test creado se utiliza en el cliente
# Los datos los toma de la base de administración.
# Uso: creaTestDisk1 NombreCliente
#
# Falta: la bd no tiene información de las particiones lógicas (el script sí esta preparado para ellas)
# la bd no tiene datos del tamaño del disco
# Variables.
PROG=$(basename $0)
OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
SERVERCONF=$OPENGNSYS/etc/ogAdmServer.cfg
TESTDIR="$OPENGNSYS/client/lib/engine/tests/NoModify"
TESTFILE="$TESTDIR/Disk1-$1.shtest "
# Control básico de errores.
if [ $# -ne 1 ]; then
echo "$PROG: Error de ejecución"
echo "Formato: $PROG NOMBRE_PC"
exit 1
fi
# Obtener datos de acceso a la Base de datos.
source $SERVERCONF
# Comprobar si se recibe nombre de aula o de equipo.
PARTICIONES=$(mysql -u "$USUARIO" -p"$PASSWORD" -D "$CATALOG" -N -e \
"SELECT ordenadores_particiones.numpar, tipospar.tipopar, ordenadores_particiones.tamano
FROM tipospar INNER JOIN ordenadores_particiones INNER JOIN ordenadores
WHERE tipospar.codpar=ordenadores_particiones.codpar
AND ordenadores.idordenador=ordenadores_particiones.idordenador
AND nombreordenador='$1'
ORDER By ordenadores_particiones.numpar;")
# Si la cadena esta vacia, error
if [ -z "$PARTICIONES" ]; then
echo "El equipo $1 no existe en la base de datos"
exit 2
fi
# Ejemplo para añadir partitiones lógicas
#PARTICIONES="$PARTICIONES 5 LINUX-SWAP 1999999"
PRI=$( echo ${PARTICIONES%%\ 5\ *}|awk '{print $2"_"$3" "$5"_"$6" "$8"_"$9" "$11"_"$12}' |sed s/\ _//g |sed s/\ //g)
if $(echo $PARTICIONES |grep " 5 " >/dev/null); then
LOG=$( echo ${PARTICIONES##*\ 5\ }|awk '{print $1"_"$2" "$4"_"$5" "$7"_"$8" "$10"_"$11" "}' |sed s/\ _//g |sed s/\ //g)
else
LOG=""
fi
AUX=$(echo $PARTICIONES| wc -w)
let NUMPART=AUX/3
P1SIZE=$(echo $PARTICIONES|cut -d\ -f3)
P1TYPE=$(echo $PARTICIONES|cut -d\ -f2)
case "$P1TYPE" in
EMPTY) P1ID=0 ;;
FAT12) P1ID=1 ;;
EXTENDED) P1ID=5 ;;
FAT16) P1ID=6 ;;
NTFS|EXFAT) P1ID=7 ;;
FAT32) P1ID=b ;;
HFAT12) P1ID=11 ;;
HFAT16) P1ID=16 ;;
HNTFS) P1ID=17 ;;
HFAT32) P1ID=1b ;;
LINUX-SWAP) P1ID=82 ;;
EXT[234]|REISERFS|REISER4|XFS|JFS)
P1ID=83 ;;
LINUX-LVM) P1ID=8e ;;
SOLARIS) P1ID=bf ;;
CACHE) P1ID=ca ;;
LINUX-RAP1ID) P1ID=fd ;;
*) P1ID="" ;;
esac
cat > $TESTFILE << EOF
Ejemplo de test funciones de particionado no destrutivo
=======================================================
# Desmontamos antes de empezar
$ ogUnmountAll 1 2>/dev/null
$ ogUnmountCache 2>/dev/null
# Cambio de formato
$ ogDevToDisk /dev/sda
1
$ ogDevToDisk /dev/sda1
1 1
$ ogDiskToDev
/dev/sda
$ ogDiskToDev 1
/dev/sda
$ ogDiskToDev 1 1
/dev/sda1
$ ogTypeToId NTFS
7
$ ogTypeToId LINUX
83
$ ogTypeToId LINUX GPT
8300
# Tamaño de disco (cuando haya informacion en la base de datos)
#$ ogGetDiskSize 1
#312571224
# Tamaño de la particion
$ ogGetPartitionSize 1 1
$P1SIZE
# Información de las particiones
$ ogListPartitions 1 | tr : _ | sed s/EXT[234]/LINUX/g | sed s/\ //g
$PRI$LOG
$ ogListPrimaryPartitions 1 | tr : _ | sed s/EXT[234]/LINUX/g | sed s/\ //g
$PRI
$ ogListLogicalPartitions 1 | tr : _ | sed s/EXT[234]/LINUX/g
$LOG
$ ogGetPartitionsNumber
$NUMPART
# Partición activa
$ ogSetPartitionActive 1 2 >/dev/null
$ ogGetPartitionActive 1
2
$ ogSetPartitionActive 1 1 >/dev/null
$ ogGetPartitionActive 1
1
# Tipo de particiones
$ ogGetPartitionId 1 1
$P1ID
# Montamos la cache al final
$ ogMountCache >/dev/null 2>&1
EOF
echo "Test creado en $TESTFILE"
echo "Las particiones logicas hay que incluirlas a mano, porque no hay información de las mismas en la base de datos."

View File

@ -1,82 +0,0 @@
#!/bin/bash
# Descripcion: Crea un test DESTRUCTIVO de los bloqueos de particiones y de imagenes
# Se ejecuta en el servidor y el test creado se utiliza en el cliente
# La imagen de prueba puede sufrir daños
# Uso: creaTestLock2 NombreImagen
# Variables.
PROG=$(basename $0)
OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
SERVERCONF=$OPENGNSYS/etc/ogAdmServer.cfg
TESTDIR="$OPENGNSYS/client/lib/engine/tests/Modify"
TESTFILE="$TESTDIR/Lock2-img$1.shtest "
# Control básico de errores.
if [ $# -ne 1 ]; then
echo "$PROG: Error de ejecución"
echo "Formato: $PROG NOMBRE_IMAGEN"
echo " La imagen de prueba puede sufrir daños"
exit 1
fi
IMG=$1
cat > $TESTFILE << EOF
Test de bloqueos Destructivos
=============================================================================
# Bloqueo de particiones
$ ogUnmountAll 1 2>/dev/null
$ ogLock 1 1
$ ogExtendFs 1 1
OpenGnsys error: ogExtendFs: "1 1"
$ ogFormatFs 1 1
OpenGnsys error: ogFormatFs: "1 1"
#############################################################################
# Los dos comandos siguientes dan error. Los comentamos por ahora
#############################################################################
#$ ogMount 1 1
#$ ogUnmount 1 1; df|grep sda1
$ ogUnlock 1 1
$ ogExtendFs 1 1 >/dev/null 2>&1; echo $?
0
$ ogFormatFs 1 1 >/dev/null 2>&1; echo $?
0
$ ogMount 1 1
/mnt/sda1
$ ogUnmount 1 1; df|grep sda1
# Bloqueo de imagenes
#############################################################################
# Los tres comandos siguientes dan error. Los comentamos por ahora
#############################################################################
#$ ogLockImage REPO $IMG
#$ ogRestoreImage REPO $IMG 1 1 >/dev/null 2>&1; echo $?
#$ ogCreateImage 1 1 REPO $IMG >/dev/null 2>&1; echo $?
$ ogUnlockImage REPO $IMG
# Lo mismo con la imagen desbloqueada.
$ ogRestoreImage REPO $IMG 1 1 >/dev/null 2>&1; echo $?
0
$ ogCreateImage 1 1 REPO $IMG >/dev/null 2>&1; echo $?
0
EOF
echo "Test creado en $TESTFILE"
echo " La imagen de $IMG prueba puede quedar dañada despues de realizar el test"
echo " Hay cinco comandos comentados porque por ahora dan error"

View File

@ -0,0 +1,12 @@
#!/bin/bash
echo "Content-type: text/html"
echo ""
echo "<html><head><title>OpenGnsys Client $(/opt/opengnsys/functions/ogGetIpAddress)</title>"
echo " <meta charset='utf-8'>"
echo "</head><body>"
echo "<h1>Ocurrió un error durante el arranque del agente</h1>"
echo "<p>Consulte el log del agente para más información</p>"
echo "</body></html>"

View File

@ -14,4 +14,4 @@ echo "<IFRAME SRC='cache.sh' WIDTH=590 HEIGHT=90><A HREF="cache.sh">link</a>
echo "<IFRAME SRC='LogSession.sh' WIDTH=850 HEIGHT=230> <A HREF="LogSession.sh">link</A> </IFRAME>"
echo "<IFRAME SRC='LogCommand.sh' WIDTH=850 HEIGHT=280> <A HREF="LogCommand.sh">link</A> </IFRAME>"
echo "</body>
echo "</body></html>"

View File

@ -10,5 +10,4 @@ echo "<html><head><title>OpenGnsys Client</title></head><body>"
$(wget http://172.17.9.205/opengnsys/varios/menubrowser.php -O /tmp/menu.tmp)
echo "$(cat /tmp/menu.tmp)"
echo "</body>
echo "</body></html>"

View File

@ -1,10 +1,8 @@
#/**
#@file BootLib.py
##@file BootLib.py
#@brief Librería o clase Boot
#@class Boot
#@brief Funciones para arranque y post-configuración de sistemas de archivos.
#@warning License: GNU GPLv3+
#*/
import os
import re
@ -24,8 +22,7 @@ import FileLib
import UEFILib
import CacheLib
#/**
# ogBoot int_ndisk int_nfilesys [ NVRAMPERM ] [str_kernel str_initrd str_krnlparams]
## ogBoot int_ndisk int_nfilesys [ NVRAMPERM ] [str_kernel str_initrd str_krnlparams]
#@brief Inicia el proceso de arranque de un sistema de archivos.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -38,7 +35,6 @@ import CacheLib
#@exception OG_ERR_NOTOS La partición no tiene instalado un sistema operativo.
#@note En Linux, si no se indican los parámetros de arranque se detectan de la opción por defecto del cargador GRUB.
#@note En Linux, debe arrancarse la partición del directorio \c /boot
#*/ ##
def ogBoot (disk, par, nvramperm=False, params=''):
# Detectar tipo de sistema de archivos y montarlo.
part = DiskLib.ogDiskToDev (disk, par)
@ -228,8 +224,7 @@ def ogBoot (disk, par, nvramperm=False, params=''):
return None
#/**
# ogGetWindowsName int_ndisk int_nfilesys
## ogGetWindowsName int_ndisk int_nfilesys
#@brief Muestra el nombre del equipo en el registro de Windows.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -237,7 +232,6 @@ def ogBoot (disk, par, nvramperm=False, params=''):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#*/ ##
def ogGetWindowsName (disk, par):
mntdir = FileSystemLib.ogMount (disk, par)
if not mntdir: return None
@ -246,8 +240,7 @@ def ogGetWindowsName (disk, par):
return RegistryLib.ogGetRegistryValue (mntdir, 'system', r'\ControlSet001\Control\ComputerName\ComputerName\ComputerName')
#/**
# ogLinuxBootParameters int_ndisk int_nfilesys
## ogLinuxBootParameters int_ndisk int_nfilesys
#@brief Muestra los parámetros de arranque de un sistema de archivos Linux.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -256,7 +249,6 @@ def ogGetWindowsName (disk, par):
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#@warning Función básica usada por \c ogBoot
#*/ ##
def ogLinuxBootParameters (disk, par):
# Detectar id. de tipo de partición y codificar al mnemonico.
mntdir = FileSystemLib.ogMount (disk, par)
@ -305,8 +297,7 @@ def ogLinuxBootParameters (disk, par):
return awk_out
#/**
# ogSetWindowsName int_ndisk int_nfilesys str_name
## ogSetWindowsName int_ndisk int_nfilesys str_name
#@brief Establece el nombre del equipo en el registro de Windows.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -316,7 +307,6 @@ def ogLinuxBootParameters (disk, par):
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#@exception OG_ERR_OUTOFLIMIT Nombre Netbios con más de 15 caracteres.
#*/ ##
def ogSetWindowsName (disk, par, name):
if len (name) > 15:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_OUTOFLIMIT, f'"{name[0:15]}..."')
@ -335,8 +325,7 @@ def ogSetWindowsName (disk, par, name):
#/**
# ogSetWinlogonUser int_ndisk int_npartition str_username
## ogSetWinlogonUser int_ndisk int_npartition str_username
#@brief Establece el nombre de usuario por defecto en la entrada de Windows.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -345,37 +334,30 @@ def ogSetWindowsName (disk, par, name):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#*/ ##
def ogSetWinlogonUser (disk, par, username):
mntdir = FileSystemLib.ogMount (disk, par)
if not mntdir: return None
RegistryLib.ogSetRegistryValue (mntdir, 'SOFTWARE', r'\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName', username)
#/**
# ogBootMbrXP int_ndisk
## ogBootMbrXP int_ndisk
#@brief Genera un nuevo Master Boot Record en el disco duro indicado, compatible con los SO tipo Windows
#@param int_ndisk nº de orden del disco
#@return salida del programa my-sys
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#*/ ##
def ogBootMbrXP (disk):
DISK = DiskLib.ogDiskToDev (disk)
if not DISK: return None
subprocess.run (['ms-sys', '-z', '-f', DISK])
subprocess.run (['ms-sys', '-m', '-f', DISK])
#/**
# ogBootMbrGeneric int_ndisk
## ogBootMbrGeneric int_ndisk
#@brief Genera un nuevo Codigo de arranque en el MBR del disco indicado, compatible con los SO tipo Windows, Linux.
#@param int_ndisk nº de orden del disco
#@return salida del programa my-sys
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Tipo de partición desconocido o no se puede montar.
#*/ ##
def ogBootMbrGeneric (disk):
DISK = DiskLib.ogDiskToDev (disk)
if not DISK: return None
@ -390,15 +372,12 @@ def ogBootMbrGeneric (disk):
#/**
# ogFixBootSector int_ndisk int_parition
## ogFixBootSector int_ndisk int_parition
#@brief Corrige el boot sector de una particion activa para MS windows/dos -fat-ntfs
#@param int_ndisk nº de orden del disco
#@param int_partition nº de particion
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#*/ ##
def ogFixBootSector (disk, par):
partype = DiskLib.ogGetPartitionId (disk, par)
if partype not in [ '1', '4', '6', '7', 'b', 'c', 'e', 'f', '17', '700', 'EF00' ]:
@ -422,29 +401,23 @@ fix_first_sector=yes
os.remove (tmpfile)
#/**
# ogGetBootMbr int_ndisk
## ogGetBootMbr int_ndisk
#@brief Obtiene el contenido del sector de arranque de un disco.
#@param int_ndisk nº de orden del disco
#@return str_MBR Descripción del contenido del MBR.
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Dispositivo de disco no encontrado.
#*/ ##
def ogGetBootMbr (disk):
DISK = DiskLib.ogDiskToDev (disk)
if not DISK: return None
subprocess.run (['ms-sys', '-f', DISK])
#/**
# ogWindowsBootParameters int_ndisk int_parition
## ogWindowsBootParameters int_ndisk int_parition
#@brief Configura el gestor de arranque de windows 7 / vista / XP / 2000
#@param int_ndisk nº de orden del disco
#@param int_partition nº de particion
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#*/ ##
def ogWindowsBootParameters (disk, par):
if not DiskLib.ogDiskToDev (disk, par):
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, '')
@ -498,7 +471,7 @@ def ogWindowsBootParameters (disk, par):
return
#Preparando instruccion Windows Resume Application
#Preparando instruccion Windows Resume Application
with open (tmpfile, 'w') as fd:
fd.write (f"""boot_disk={bootdisk}
boot_main_part={bootpar}
@ -510,7 +483,7 @@ boot_entry=Windows Resume Application
subprocess.run (['timeout', '--foreground', '--signal=SIGKILL', '5s', 'spartlnx.run', '-cui', '-nm', '-w', '-f', tmpfile], stdin=subprocess.DEVNULL)
#Preparando instruccion tipo windows
#Preparando instruccion tipo windows
with open (tmpfile, 'w') as fd:
fd.write (f"""boot_disk={bootdisk}
boot_main_part={bootpar}
@ -521,7 +494,7 @@ boot_entry={winver}
""")
subprocess.run (['timeout', '--foreground', '--signal=SIGKILL', '5s', 'spartlnx.run', '-cui', '-nm', '-w', '-f', tmpfile], stdin=subprocess.DEVNULL)
##Preparando instruccion Ramdisk Options
##Preparando instruccion Ramdisk Options
with open (tmpfile, 'w') as fd:
fd.write (f"""boot_disk={bootdisk}
boot_main_part={bootpar}
@ -532,7 +505,7 @@ boot_entry=Ramdisk Options
""")
subprocess.run (['timeout', '--foreground', '--signal=SIGKILL', '5s', 'spartlnx.run', '-cui', '-nm', '-w', '-f', tmpfile], stdin=subprocess.DEVNULL)
##Preparando instruccion Recovery Environment
##Preparando instruccion Recovery Environment
with open (tmpfile, 'w') as fd:
fd.write (f"""boot_disk={bootdisk}
boot_main_part={bootpar}
@ -543,7 +516,7 @@ boot_entry=Windows Recovery Environment
""")
subprocess.run (['timeout', '--foreground', '--signal=SIGKILL', '5s', 'spartlnx.run', '-cui', '-nm', '-w', '-f', tmpfile], stdin=subprocess.DEVNULL)
##Preparando instruccion Recovery
##Preparando instruccion Recovery
with open (tmpfile, 'w') as fd:
fd.write (f"""boot_disk={bootdisk}
boot_main_part={bootpar}
@ -554,7 +527,7 @@ boot_entry=Windows Recovery
""")
subprocess.run (['timeout', '--foreground', '--signal=SIGKILL', '5s', 'spartlnx.run', '-cui', '-nm', '-w', '-f', tmpfile], stdin=subprocess.DEVNULL)
#Preparando instruccion Windows Boot Manager
#Preparando instruccion Windows Boot Manager
with open (tmpfile, 'w') as fd:
fd.write (f"""boot_disk={bootdisk}
boot_main_part={bootpar}
@ -565,7 +538,7 @@ boot_entry=Windows Boot Manager
""")
subprocess.run (['timeout', '--foreground', '--signal=SIGKILL', '5s', 'spartlnx.run', '-cui', '-nm', '-w', '-f', tmpfile], stdin=subprocess.DEVNULL)
#Preparando instruccion Herramienta de diagnóstico de memoria de Windows
#Preparando instruccion Herramienta de diagnóstico de memoria de Windows
with open (tmpfile, 'w') as fd:
fd.write (f"""boot_disk={bootdisk}
boot_main_part={bootpar}
@ -576,7 +549,7 @@ boot_entry=Herramienta de diagnóstico de memoria de Windows
""")
subprocess.run (['timeout', '--foreground', '--signal=SIGKILL', '5s', 'spartlnx.run', '-cui', '-nm', '-w', '-f', tmpfile], stdin=subprocess.DEVNULL)
#Preparando instruccion Herramienta de diagnóstico de memoria de Windows
#Preparando instruccion Herramienta de diagnóstico de memoria de Windows
with open (tmpfile, 'w') as fd:
fd.write (f"""boot_disk={bootdisk}
boot_main_part={bootpar}
@ -591,20 +564,17 @@ boot_entry=Herramienta de diagn<f3>stico de memoria de Windows
#/**
# ogWindowsRegisterPartition int_ndisk int_partiton str_volume int_disk int_partition
## ogWindowsRegisterPartition int_ndisk int_partiton str_volume int_disk int_partition
#@brief Registra una partición en windows con un determinado volumen.
#@param int_ndisk nº de orden del disco a registrar
#@param int_partition nº de particion a registrar
#@param str_volumen volumen a resgistar
#@param int_ndisk_windows nº de orden del disco donde esta windows
#@param int_partition_windows nº de particion donde esta windows
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#*/ ##
#ogWindowsRegisterPartition ("1", "1", "c:", "1", "1")
def ogWindowsRegisterPartition (registered_disk, registered_par, registered_vol, disk, par):
#ogWindowsRegisterPartition ("1", "1", "c:", "1", "1")
registered_vol = registered_vol[0].upper()
tmpfile = tempfile.NamedTemporaryFile (prefix='ogWRP-', mode='w').name
@ -649,19 +619,15 @@ part_letter={registered_vol}
os.remove (tmpfile)
#/**
# ogGrubInstallMbr int_disk_GRUBCFG int_partition_GRUBCFG
## ogGrubInstallMbr int_disk_GRUBCFG int_partition_GRUBCFG
#@brief Instala el grub el el MBR del primer disco duro (FIRSTSTAGE). El fichero de configuración grub.cfg ubicado según parametros disk y part(SECONDSTAGE). Admite sistemas Windows.
#@param int_disk_SecondStage
#@param int_part_SecondStage
#@param bolean_Check_Os_installed_and_Configure_2ndStage true | false[default]
#@return
#@param int_disk_SecondStage
#@param int_part_SecondStage
#@param bolean_Check_Os_installed_and_Configure_2ndStage true | false[default]
#@exception OG_ERR_FORMAT Formato incorrecto.
#*/ ##
#ogGrubInstallMbr ('1', '1', 'FALSE')
#ogGrubInstallMbr ('1', '1', 'TRUE', 'nomodeset irqpoll pci=noacpi quiet splash')
def ogGrubInstallMbr (disk, par, checkos='FALSE', kernelparam=''):
#ogGrubInstallMbr ('1', '1', 'FALSE')
#ogGrubInstallMbr ('1', '1', 'TRUE', 'nomodeset irqpoll pci=noacpi quiet splash')
backupname = '.backup.og'
#error si no es linux.
@ -764,20 +730,16 @@ def ogGrubInstallMbr (disk, par, checkos='FALSE', kernelparam=''):
return not eval ## negate shell success code
#/**
# ogGrubInstallPartition int_disk_SECONDSTAGE int_partition_SECONDSTAGE bolean_Check_Os_installed_and_Configure_2ndStage
## ogGrubInstallPartition int_disk_SECONDSTAGE int_partition_SECONDSTAGE bolean_Check_Os_installed_and_Configure_2ndStage
#@brief Instala y actualiza el gestor grub en el bootsector de la particion indicada
#@param int_disk_SecondStage
#@param int_part_SecondStage
#@param bolean_Check_Os_installed_and_Configure_2ndStage true | false[default]
#@param str "kernel param "
#@return
#@param int_disk_SecondStage
#@param int_part_SecondStage
#@param bolean_Check_Os_installed_and_Configure_2ndStage true | false[default]
#@param str "kernel param "
#@exception OG_ERR_FORMAT Formato incorrecto.
#*/ ##
#ogGrubInstallPartition ('1', '1', 'FALSE')
#ogGrubInstallPartition ('1', '1', 'TRUE', 'nomodeset irqpoll pci=noacpi quiet splash')
def ogGrubInstallPartition (disk, par, checkos='FALSE', kernelparam=''):
#ogGrubInstallPartition ('1', '1', 'FALSE')
#ogGrubInstallPartition ('1', '1', 'TRUE', 'nomodeset irqpoll pci=noacpi quiet splash')
backupname = '.backup.og'
#error si no es linux.
@ -843,7 +805,7 @@ def ogGrubInstallPartition (disk, par, checkos='FALSE', kernelparam=''):
with open (f'{secondstage}{prefixsecondstage}/boot/grub/grub.cfg', 'a') as fd:
fd.write (out + '\n')
#Instalar el grub
#Instalar el grub
eval = subprocess.run (['grub-install', '--force'] + efioptgrub + [f'--root-directory={secondstage}{prefixsecondstage}', firststage]).returncode
# Movemos el grubx64.efi
@ -860,16 +822,14 @@ def ogGrubInstallPartition (disk, par, checkos='FALSE', kernelparam=''):
#/**
# ogConfigureFstab int_ndisk int_nfilesys
#@brief Configura el fstab según particiones existentes
## ogConfigureFstab int_ndisk int_nfilesys
#@brief Configura el fstab según particiones existentes
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND No se encuentra el fichero fstab a procesar.
#@warning Puede haber un error si hay más de 1 partición swap.
#*/ ##
def ogConfigureFstab (disk, par):
fstab = FileLib.ogGetPath (src=f'{disk} {par}', file='/etc/fstab')
if not fstab:
@ -927,8 +887,7 @@ def ogConfigureFstab (disk, par):
#/**
# ogSetLinuxName int_ndisk int_nfilesys [str_name]
## ogSetLinuxName int_ndisk int_nfilesys [str_name]
#@brief Establece el nombre del equipo en los ficheros hostname y hosts.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -938,7 +897,6 @@ def ogConfigureFstab (disk, par):
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#@note Si no se indica nombre, se asigna un valor por defecto.
#*/ ##
def ogSetLinuxName (disk, par, hostname='pc'):
# Montar el sistema de archivos.
mntdir = FileSystemLib.ogMount (disk, par)
@ -947,12 +905,12 @@ def ogSetLinuxName (disk, par, hostname='pc'):
etc = FileLib.ogGetPath (src=f'{disk} {par}', file='/etc')
if os.path.isdir (etc):
#cambio de nombre en hostname
#cambio de nombre en hostname
with open (f'{etc}/hostname', 'w') as fd:
fd.write (f'{hostname}\n')
#Opcion A para cambio de nombre en hosts
#sed "/127.0.1.1/ c\127.0.1.1 \t $HOSTNAME" $ETC/hosts > /tmp/hosts && cp /tmp/hosts $ETC/ && rm /tmp/hosts
#Opcion B componer fichero de hosts
#Opcion A para cambio de nombre en hosts
#sed "/127.0.1.1/ c\127.0.1.1 \t $HOSTNAME" $ETC/hosts > /tmp/hosts && cp /tmp/hosts $ETC/ && rm /tmp/hosts
#Opcion B componer fichero de hosts
with open (f'{etc}/hosts', 'w') as fd:
fd.write ('127.0.0.1 localhost\n')
fd.write (f'127.0.1.1 {hostname}\n')
@ -966,8 +924,7 @@ def ogSetLinuxName (disk, par, hostname='pc'):
#/**
# ogCleanLinuxDevices int_ndisk int_nfilesys
## ogCleanLinuxDevices int_ndisk int_nfilesys
#@brief Limpia los dispositivos del equipo de referencia. Interfaz de red ...
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -975,9 +932,8 @@ def ogSetLinuxName (disk, par, hostname='pc'):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#*/ ##
#ogCleanLinuxDevices (1, 1)
def ogCleanLinuxDevices (disk, par):
#ogCleanLinuxDevices (1, 1)
mntdir = FileSystemLib.ogMount (disk, par)
if not mntdir: return None
@ -988,8 +944,7 @@ def ogCleanLinuxDevices (disk, par):
if os.path.exists (f'{mntdir}/etc/initramfs-tools/conf.d/resume'):
os.unlink ( f'{mntdir}/etc/initramfs-tools/conf.d/resume')
#/**
# ogGrubAddOgLive num_disk num_part [ timeout ] [ offline ]
## ogGrubAddOgLive num_disk num_part [ timeout ] [ offline ]
#@brief Crea entrada de menu grub para ogclient, tomando como paramentros del kernel los actuales del cliente.
#@param 1 Numero de disco
#@param 2 Numero de particion
@ -1000,9 +955,6 @@ def ogCleanLinuxDevices (disk, par):
#@exception OG_ERR_NOTFOUND No existe kernel o initrd en cache.
#@exception OG_ERR_NOTFOUND No existe archivo de configuracion del grub.
# /// FIXME: Solo para el grub instalado en MBR por Opengnsys, ampliar para más casos.
#*/ ##
def ogGrubAddOgLive (disk, par, timeout=None, offline=''):
oglivedir = os.environ.get ('oglivedir', 'ogLive')
# Error si no existe el kernel y el initrd en la cache.
@ -1078,16 +1030,13 @@ def ogGrubAddOgLive (disk, par, timeout=None, offline=''):
if timeout:
subprocess.run (['sed', '-i', f's/timeout=.*$/timeout={timeout}/g', grubcfg])
#/**
# ogGrubHidePartitions num_disk num_part
## ogGrubHidePartitions num_disk num_part
#@brief ver ogBootLoaderHidePartitions
#@see ogBootLoaderHidePartitions
#*/ ##
def ogGrubHidePartitions (disk, par, datadisk=None, datapar=None):
return ogBootLoaderHidePartitions (disk, par, datadisk, datapar)
#/**
# ogBootLoaderHidePartitions num_disk num_part
## ogBootLoaderHidePartitions num_disk num_part
#@brief Configura el grub/burg para que oculte las particiones de windows que no se esten iniciando.
#@param 1 Numero de disco
#@param 2 Numero de particion
@ -1096,8 +1045,6 @@ def ogGrubHidePartitions (disk, par, datadisk=None, datapar=None):
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception No existe archivo de configuracion del grub/burg.
#*/
def ogBootLoaderHidePartitions (disk, par, datadisk=None, datapar=None):
# Nombre de la función que llama a esta.
func = inspect.stack()[1][3]
@ -1174,16 +1121,14 @@ def ogBootLoaderHidePartitions (disk, par, datadisk=None, datapar=None):
subprocess.run (['sed', '-i', f'{line}a\\ {text}', cfgfile])
# Activamos la particion que se inicia en todas las entradas de windows.
subprocess.run (['sed', '-i', '/chainloader/i\\\tparttool ${root} boot+', cfgfile])
#/**
# ogGrubDeleteEntry num_disk num_part num_disk_delete num_part_delete
## ogGrubDeleteEntry num_disk num_part num_disk_delete num_part_delete
#@brief ver ogBootLoaderDeleteEntry
#@see ogBootLoaderDeleteEntry
#*/
#@see ogBootLoaderDeleteEntry
def ogGrubDeleteEntry (disk, par, diskdel, pardel):
return ogBootLoaderDeleteEntry (disk, par, diskdel, pardel)
#/**
# ogBootLoaderDeleteEntry num_disk num_part num_part_delete
## ogBootLoaderDeleteEntry num_disk num_part num_part_delete
#@brief Borra en el grub las entradas para el inicio en una particion.
#@param 1 Numero de disco donde esta el grub
#@param 2 Numero de particion donde esta el grub
@ -1194,8 +1139,6 @@ def ogGrubDeleteEntry (disk, par, diskdel, pardel):
#@exception OG_ERR_FORMAT Use ogGrubDeleteEntry
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND No existe archivo de configuracion del grub.
#*/ ##
def ogBootLoaderDeleteEntry (disk, par, diskdel, pardel):
# Nombre de la función que llama a esta.
func = inspect.stack()[1][3]
@ -1249,27 +1192,23 @@ def ogBootLoaderDeleteEntry (disk, par, diskdel, pardel):
subprocess.run (['sed', '-i', '-e', f'{entry},{endentry}d', cfgfile])
# Guardamos el número de línea de la entrada, que sera el final de la siguiente.
endentry = entry
#/**
# ogGrubDefaultEntry int_disk_GRUGCFG int_partition_GRUBCFG int_disk_default_entry int_npartition_default_entry
## ogGrubDefaultEntry int_disk_GRUGCFG int_partition_GRUBCFG int_disk_default_entry int_npartition_default_entry
#@brief ver ogBootLoaderDefaultEntry
#@see ogBootLoaderDefaultEntry
#*/ ##
def ogGrubDefaultEntry (disk, par, diskdefault, pardefault):
return ogBootLoaderDefaultEntry (disk, par, diskdefault, pardefault)
#/**
# ogBootLoaderDefaultEntry int_disk_CFG int_partition_CFG int_disk_default_entry int_npartition_default_entry
## ogBootLoaderDefaultEntry int_disk_CFG int_partition_CFG int_disk_default_entry int_npartition_default_entry
#@brief Configura la entrada por defecto de Burg
#@param int_disk_SecondStage
#@param int_part_SecondStage
#@param int_disk_SecondStage
#@param int_part_SecondStage
#@param int_disk_default_entry
#@param int_part_default_entry
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Partición errónea o desconocida (ogMount).
#@exception OG_ERR_OUTOFLIMIT Param $3 no es entero.
#@exception OG_ERR_NOTFOUND Fichero de configuración no encontrado: burg.cfg.
#*/ ##
def ogBootLoaderDefaultEntry (disk, par, diskdefault, pardefault):
# Nombre de la función que llama a esta.
func = inspect.stack()[1][3]
@ -1321,26 +1260,20 @@ def ogBootLoaderDefaultEntry (disk, par, diskdefault, pardefault):
print (f'{MSG}: {disk} {par} {diskdefault} {pardefault}')
return True
#/**
# ogGrubOgliveDefaultEntry num_disk num_part
## ogGrubOgliveDefaultEntry num_disk num_part
#@brief ver ogBootLoaderOgliveDefaultEntry
#@see ogBootLoaderOgliveDefaultEntry
#*/ ##
def ogGrubOgliveDefaultEntry (disk, par):
return ogBootLoaderOgliveDefaultEntry (disk, par)
#/**
# ogBootLoaderOgliveDefaultEntry
## ogBootLoaderOgliveDefaultEntry
#@brief Configura la entrada de ogLive como la entrada por defecto de Burg.
#@param int_disk_SecondStage
#@param int_part_SecondStage
#@return
#@param int_disk_SecondStage
#@param int_part_SecondStage
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Partición errónea o desconocida (ogMount).
#@exception OG_ERR_NOTFOUND Fichero de configuración no encontrado: burg.cfg.
#@exception OG_ERR_NOTFOUND Entrada de OgLive no encontrada en burg.cfg.
#*/ ##
def ogBootLoaderOgliveDefaultEntry (disk, par):
# Nombre de la función que llama a esta.
func = inspect.stack()[1][3]
@ -1386,8 +1319,7 @@ def ogBootLoaderOgliveDefaultEntry (disk, par):
return True
#/**
# ogGrubSecurity int_disk_GRUBCFG int_partition_GRUBCFG [user] [password]
## ogGrubSecurity int_disk_GRUBCFG int_partition_GRUBCFG [user] [password]
#@brief Configura grub.cfg para que sólo permita editar entrada o acceder a línea de comandos al usuario especificado
#@param int_disk_SecondStage
#@param int_part_SecondStage
@ -1397,7 +1329,6 @@ def ogBootLoaderOgliveDefaultEntry (disk, par):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar (ogMount).
#@exception OG_ERR_NOTFOUND No encuentra archivo de configuración del grub.
#*/ ##
def ogGrubSecurity (disk, par, user='root', passwd=''):
#localizar disco segunda etapa del grub
secondstage = FileSystemLib.ogMount (disk, par)
@ -1438,71 +1369,21 @@ def ogGrubSecurity (disk, par, user='root', passwd=''):
subprocess.run (['sed', '-i', '/menuentry /s/{/--unrestricted {/', file])
#/**
# ogGrubSetTheme num_disk num_part str_theme
#@brief ver ogBootLoaderSetTheme
#@see ogBootLoaderSetTheme
#*/ ##
#/**
# ogBootLoaderSetTheme
#@brief asigna un tema al BURG
#@param int_disk_SecondStage
#@param int_part_SecondStage
#@param str_theme_name
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Partición errónea o desconocida (ogMount).
#@exception OG_ERR_NOTFOUND Fichero de configuración no encontrado: grub.cfg burg.cfg refind.conf.
#@exception OG_ERR_NOTFOUND Entrada deltema no encontrada en burg.cfg.
#@exception OG_ERR_NOTFOUND Fichero de configuración del tema no encontrado: theme.conf (sólo refind).
#@note El tema debe situarse en OGLIB/BOOTLOADER/themes
#*/ ##
#/**
# ogGrubSetAdminKeys num_disk num_part str_theme
#@brief ver ogBootLoaderSetTheme
#@see ogBootLoaderSetTheme
#*/ ##
#/**
# ogBootLoaderSetAdminKeys
#@brief Activa/Desactica las teclas de administracion
#@param int_disk_SecondStage
#@param int_part_SecondStage
#@param Boolean TRUE/FALSE
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Partición errónea o desconocida (ogMount).
#@exception OG_ERR_NOTFOUND Fichero de configuración no encontrado: grub.cfg burg.cfg.
#@exception OG_ERR_NOTFOUND Entrada deltema no encontrada en burg.cfg.
#*/ ##
#/**
# ogGrubSetTimeOut num_disk num_part int_timeout_seconds
## ogGrubSetTimeOut num_disk num_part int_timeout_seconds
#@brief ver ogBootLoaderSetTimeOut
#@see ogBootLoaderSetTimeOut
#*/ ##
def ogGrubSetTimeOut (disk, par, timeout):
return ogBootLoaderSetTimeOut (disk, par, timeout)
#/**
# ogBootLoaderSetTimeOut
#@brief Define el tiempo (segundos) que se muestran las opciones de inicio
#@param int_disk_SecondStage
#@param int_part_SecondStage
#@param int_timeout_seconds
#@return
## ogBootLoaderSetTimeOut
#@brief Define el tiempo (segundos) que se muestran las opciones de inicio
#@param int_disk_SecondStage
#@param int_part_SecondStage
#@param int_timeout_seconds
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Partición errónea o desconocida (ogMount).
#@exception OG_ERR_NOTFOUND Fichero de configuración no encontrado: grub.cfg burg.cfg.
#@exception OG_ERR_NOTFOUND Entrada deltema no encontrada en burg.cfg.
#*/ ##
def ogBootLoaderSetTimeOut (disk, par, timeout):
# Nombre de la función que llama a esta.
func = inspect.stack()[1][3]
@ -1528,53 +1409,16 @@ def ogBootLoaderSetTimeOut (disk, par, timeout):
subprocess.run (['sed', '-i', f's/timeout=.*$/timeout={timeout}/g', cfgfile])
#/**
# ogGrubSetResolution num_disk num_part int_resolution
#@brief ver ogBootLoaderSetResolution
#@see ogBootLoaderSetResolution
#*/ ##
#/**
# ogBootLoaderSetResolution
#@brief Define la resolucion que usuara el thema del gestor de arranque
#@param int_disk_SecondStage
#@param int_part_SecondStage
#@param str_resolution (Opcional)
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Partición errónea o desconocida (ogMount).
#@exception OG_ERR_NOTFOUND Fichero de configuración no encontrado: grub.cfg burg.cfg.
#*/ ##
#/**
# ogBootLoaderSetResolution
#@brief Define la resolucion que usuara el thema del gestor de arranque
#@param int_resolution1
#@param int_resolution2 (Opcional)
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Partición errónea o desconocida (ogMount).
#@exception OG_ERR_NOTFOUND Fichero de configuración no encontrado: grub.cfg burg.cfg.
#*/ ##
#/**
# ogGrub4dosInstallMbr int_ndisk
## ogGrub4dosInstallMbr int_ndisk
#@brief Genera un nuevo Codigo de arranque en el MBR del disco indicado, compatible con los SO tipo Windows, Linux.
#@param int_ndisk nº de orden del disco
#@param int_ndisk nº de orden del particion
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Tipo de partición desconocido o no se puede montar.
#@exception OG_ERR_NOTBIOS Equipo no firmware BIOS legacy
#@exception OG_ERR_NOMSDOS Disco duro no particioniado en modo msdos
#@exception OG_ERR_NOTWRITE Particion no modificable.
#*/ ##
def ogGrub4dosInstallMbr (disk, par):
#Controlar existencia de disco y particion
device = DiskLib.ogDiskToDev (disk)

View File

@ -1,3 +1,9 @@
##@file CacheLib.py
#@brief Librería o clase Cache
#@class Cache
#@brief Funciones relativas al cache de OG
#@warning License: GNU GPLv3+
import os
import re
import subprocess
@ -10,8 +16,7 @@ import SystemLib
import DiskLib
import FileSystemLib
#/**
# ogCreateCache [int_ndisk] int_partsize
## ogCreateCache [int_ndisk] int_partsize
#@brief Define la caché local, por defecto en partición 4 del disco 1.
#@param int_ndisk numero de disco donde crear la cache, si no se indica es el 1 por defecto
#@param int_npart número de partición (opcional, 4 por defecto)
@ -21,7 +26,6 @@ import FileSystemLib
#@note Requisitos: sfdisk, parted, awk, sed
#@warning El tamaño de caché debe estar entre 50 MB y la mitad del disco.
#@warning La caché no puede solaparse con las particiones de datos.
#*/ ##
def ogCreateCache (ndsk=1, part=4, sizecache=0):
if not sizecache:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, '')
@ -121,13 +125,11 @@ def ogCreateCache (ndsk=1, part=4, sizecache=0):
#/**
# ogDeleteCache
## ogDeleteCache
#@brief Elimina la partición de caché local.
#@return (nada, por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
#@note Requisitos: fdisk, sgdisk, partprobe
#*/ ##
def ogDeleteCache():
cachepart = ogFindCache()
if not cachepart:
@ -158,13 +160,11 @@ def ogDeleteCache():
#Actualiza la tabla de particiones en el kernel.
DiskLib.ogUpdatePartitionTable()
#/**
# ogFindCache
## ogFindCache
#@brief Detecta la partición caché local.
#@param No requiere parametros
#@return int_ndisk int_npart - devuelve el par nº de disco-nº de partición .
#@warning Si no hay cache no devuelve nada
#*/ ##
def ogFindCache():
# Obtener el dispositivo del sistema de archivos etiquetado como "CACHE".
PART = subprocess.run (['blkid', '-L', 'CACHE'], capture_output=True, text=True).stdout.strip()
@ -200,14 +200,12 @@ def ogFindCache():
return DiskLib.ogDevToDisk (PART.split()[0]) # usar la 1ª partición encontrada.
#/**
# ogFormatCache
## ogFormatCache
#@brief Formatea el sistema de ficheros para la caché local.
#@return (por determinar)
#@warning Prueba con formato Reiser.
#@attention
#@note El sistema de archivos de la caché se queda montado.
#*/ ##
def ogFormatCache():
cachepart = ogFindCache()
if cachepart is None:
@ -239,12 +237,10 @@ def ogFormatCache():
subprocess.run ([f'{ogGlobals.OGSCRIPTS}/updateBootCache'])
#/**
# ogGetCacheSize
## ogGetCacheSize
#@brief Devuelve el tamaño definido para la partición de caché.
#@return int_partsize tamaño de la partición (en KB)
#@exception OG_ERR_PARTITION No existe partición de caché.
#*/ ##
def ogGetCacheSize():
cachepart = ogFindCache()
if cachepart is None:
@ -254,12 +250,10 @@ def ogGetCacheSize():
disk, par = cachepart.split()
return DiskLib.ogGetPartitionSize (disk, par)
#/**
# ogGetCacheSpace
## ogGetCacheSpace
#@brief Devuelve el espacio de disco disponible para la partición de caché.
#@return int_size tamaño disponible (en KB)
#@note El espacio disponible es el que hay entre el límite superior de la partición 3 del disco 1 y el final de dicho disco, y no puede ser superior a la mitad de dicho disco.
#*/ ##
def ogGetCacheSpace():
cachepart = ogFindCache()
if not cachepart:
@ -308,13 +302,11 @@ def ogGetCacheSpace():
return sectors // 4
#/**
# ogMountCache
## ogMountCache
#@brief Monta la partición Cache y exporta la variable $OGCAC
#@param sin parametros
#@return path_mountpoint - Punto de montaje del sistema de archivos de cache.
#@warning Salidas de errores no determinada
#*/ ##
def ogMountCache():
c = ogFindCache()
if not c:
@ -329,13 +321,11 @@ def ogMountCache():
return m
#/**
# ogUnmountCache
## ogUnmountCache
#@brief Desmonta la particion Cache y elimina la variable $OGCAC
#@param sin parametros
#@return nada
#@warning Salidas de errores no determinada
#*/ ##
def ogUnmountCache():
cachepart = ogFindCache()
if cachepart is None:
@ -352,24 +342,20 @@ def ogUnmountCache():
if os.path.exists (dev): os.remove (dev)
#/**
# initCache
## initCache
#@brief Simplemente llama al script initCache
#@brief Es necesario tener una función para poder pasársela a ogExecAndLog
#@param los mismos parametros que initCache
#@return lo mismo que devuelve initCache
#*/ ##
def initCache (*args):
p = subprocess.run ([f'{ogGlobals.OGSCRIPTS}/initCache'] + list(args))
return not p.returncode ## negate shell return code
#/**
# ogCheckNewCacheSize
## ogCheckNewCacheSize
#@brief Comprueba si un cache de X tamaño cabe en el hueco que dejan las demás particiones
#@param Tamaño de la nueva hipotética cache
#@return Boolean, True si la nueva cache cabría, False si no
#*/ ##
def ogCheckNewCacheSize (disk, kB):
DISK = DiskLib.ogDiskToDev (disk)
if not DISK: return None

View File

@ -1,10 +1,8 @@
#/**
#@file DiskLib.py
##@file DiskLib.py
#@brief Librería o clase Disk
#@class Disk
#@brief Funciones para gestión de discos y particiones.
#@warning License: GNU GPLv3+
#*/
import filecmp
import subprocess
@ -38,12 +36,10 @@ def parted(*args):
return "Error: 'parted' command not found"
#/**
# ogGetIoSize int_ndisk
## ogGetIoSize int_ndisk
#@brief Devuelve el tamaño de sector de un disco
#@param int_ndisk nº de orden del disco
#@return Tamaño de sector
#*/ ##
def ogGetIoSize (disk):
DISK = ogDiskToDev (disk)
if not DISK: return None
@ -64,8 +60,7 @@ def ogGetIoSize (disk):
return int (IOSIZE)
#/**
# ogCreatePartitions int_ndisk str_parttype:int_partsize ...
## ogCreatePartitions int_ndisk str_parttype:int_partsize ...
#@brief Define el conjunto de particiones de un disco.
#@param int_ndisk nº de orden del disco
#@param str_parttype mnemónico del tipo de partición
@ -79,7 +74,6 @@ def ogGetIoSize (disk):
#@attention No puede definirse partición de cache y no se modifica si existe.
#@note Requisitos: sfdisk, parted, partprobe, awk
#@todo Definir atributos (arranque, oculta) y tamaños en MB, GB, etc.
#*/ ##
def ogCreatePartitions (disk, parts):
ND = disk
DISK = ogDiskToDev (ND)
@ -241,8 +235,7 @@ def ogCreatePartitions (disk, parts):
return not p.returncode
#/**
# ogCreatePartitionTable int_ndisk [str_tabletype]
## ogCreatePartitionTable int_ndisk [str_tabletype]
#@brief Genera una tabla de particiones en caso de que no sea valida, si es valida no hace nada.
#@param int_ndisk nº de orden del disco
#@param str_tabletype tipo de tabla de particiones (opcional)
@ -251,7 +244,6 @@ def ogCreatePartitions (disk, parts):
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@note tabletype: { MSDOS, GPT }, MSDOS por defecto
#@note Requisitos: fdisk, gdisk, parted
#*/ ##
def ogCreatePartitionTable (disk, createptt=None):
DISK = ogDiskToDev (disk)
if not DISK: return None
@ -296,12 +288,10 @@ def ogCreatePartitionTable (disk, createptt=None):
return None
#/**
# ogDeletePartitionTable ndisk
## ogDeletePartitionTable ndisk
#@brief Borra la tabla de particiones del disco.
#@param int_ndisk nº de orden del disco
#@return la informacion propia del fdisk
#*/ ##
def ogDeletePartitionTable (disk):
DISK = ogDiskToDev (disk)
if not DISK: return None
@ -313,8 +303,7 @@ def ogDeletePartitionTable (disk):
subprocess.run (['fdisk', DISK], input='o\nw', text=True)
return
#/**
# ogDevToDisk path_device | LABEL="str_label" | UUID="str_uuid"
## ogDevToDisk path_device | LABEL="str_label" | UUID="str_uuid"
#@brief Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo o a la etiqueta o UUID del sistema de archivos asociado.
#@param path_device Camino del fichero de dispositivo.
#@param str_label etiqueta de sistema de archivos.
@ -324,7 +313,6 @@ def ogDeletePartitionTable (disk):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
#@note Solo se acepta en cada llamada 1 de los 3 tipos de parámetros.
#*/ ##
def ogDevToDisk(arg_dev):
CACHEFILE = "/var/cache/disks.cfg"
@ -413,8 +401,7 @@ def _getAllZFSVols():
zfsvols = subprocess.run(['blkid'], capture_output=True, text=True).stdout.splitlines()
return [line.split(":")[0] for line in zfsvols if "zfs" in line]
#/**
# ogDiskToDev [int_ndisk [int_npartition]]
## ogDiskToDev [int_ndisk [int_npartition]]
#@brief Devuelve la equivalencia entre el nº de orden del dispositivo (dicso o partición) y el nombre de fichero de dispositivo correspondiente.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -423,7 +410,6 @@ def _getAllZFSVols():
#@return Para 2 parametros: Devuelve la ruta de la particion indicada.
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
#*/ ##
def ogDiskToDev (arg_disk=None, arg_part=None):
CACHEFILE = "/var/cache/disks.cfg"
@ -555,15 +541,13 @@ def ogDiskToDev (arg_disk=None, arg_part=None):
return part
#/**
# ogGetDiskSize int_ndisk
## ogGetDiskSize int_ndisk
#@brief Muestra el tamaño en KB de un disco.
#@param int_ndisk nº de orden del disco
#@return int_size - Tamaño en KB del disco.
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
#@note Requisitos: sfdisk, awk
#*/ ##
def ogGetDiskSize (disk):
DISK = ogDiskToDev (disk)
if not DISK: return None
@ -587,14 +571,12 @@ def ogGetDiskSize (disk):
return SIZE
#/**
# ogGetDiskType path_device
## ogGetDiskType path_device
#@brief Muestra el tipo de disco (real, RAID, meta-disco, USB, etc.).
#@param path_device Dispositivo
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND disco no detectado o no es un dispositivo de bloques.
#@note Requisitos: udevadm
#*/ ##
def ogGetDiskType (dev):
DEV = os.path.basename (dev)
@ -648,10 +630,8 @@ def ogGetDiskType (dev):
return TYPE
#/**
# ogGetEsp
## ogGetEsp
#@brief Devuelve números de disco y partición para la partición EFI (ESP).
#*/ ##
def ogGetEsp():
devices = subprocess.run (['blkid', '-o', 'device'], capture_output=True, text=True).stdout.splitlines()
devices.sort()
@ -672,8 +652,7 @@ def ogGetEsp():
return None
#/**
# ogGetLastSector int_ndisk [int_npart]
## ogGetLastSector int_ndisk [int_npart]
#@brief Devuelve el último sector usable del disco o de una partición.
#@param int_ndisk nº de orden del disco
#@param int_npart nº de orden de la partición (opcional)
@ -681,7 +660,6 @@ def ogGetEsp():
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o partición no corresponde con un dispositivo.
#@note Requisitos: sfdisk, sgdisk
#*/ ##
def ogGetLastSector (disk, par=None):
DISK = ogDiskToDev (disk)
if not DISK: return None
@ -709,15 +687,13 @@ def ogGetLastSector (disk, par=None):
return last
#/**
# ogGetPartitionActive int_ndisk
## ogGetPartitionActive int_ndisk
#@brief Muestra que particion de un disco esta marcada como de activa.
#@param int_ndisk nº de orden del disco
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@note Requisitos: parted
#@todo Queda definir formato para atributos (arranque, oculta, ...).
#*/ ##
def ogGetPartitionActive (disk):
DISK = ogDiskToDev (disk)
if DISK is None: return
@ -743,8 +719,7 @@ def ogGetPartitionActive (disk):
return ret
#/**
# ogGetPartitionId int_ndisk int_npartition
## ogGetPartitionId int_ndisk int_npartition
#@brief Devuelve el mnemónico con el tipo de partición.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -752,7 +727,6 @@ def ogGetPartitionActive (disk):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o partición no corresponde con un dispositivo.
#@note Requisitos: sfdisk
#*/ ##
def ogGetPartitionId (disk, par):
DISK = ogDiskToDev (disk)
if DISK is None: return
@ -779,8 +753,7 @@ def ogGetPartitionId (disk, par):
return fsid
#/**
# ogGetPartitionSize int_ndisk int_npartition
## ogGetPartitionSize int_ndisk int_npartition
#@brief Muestra el tamano en KB de una particion determinada.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -788,7 +761,6 @@ def ogGetPartitionId (disk, par):
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
#@note Requisitos: sfdisk, awk
#*/ ##
def ogGetPartitionSize (disk, par):
PART = ogDiskToDev (disk, par)
if PART is None: return
@ -802,15 +774,13 @@ def ogGetPartitionSize (disk, par):
return FileSystemLib.ogGetFsSize (disk, par)
#/**
# ogGetPartitionsNumber int_ndisk
## ogGetPartitionsNumber int_ndisk
#@brief Detecta el numero de particiones del disco duro indicado.
#@param int_ndisk nº de orden del disco
#@return Devuelve el numero paritiones del disco duro indicado
#@warning Salidas de errores no determinada
#@attention Requisitos: parted
#@note Notas sin especificar
#*/ ##
def ogGetPartitionsNumber (disk):
DISK = ogDiskToDev (disk)
if not DISK: return None
@ -841,15 +811,13 @@ def ogGetPartitionsNumber (disk):
return int (out)
#/**
# ogGetPartitionTableType int_ndisk
## ogGetPartitionTableType int_ndisk
#@brief Devuelve el tipo de tabla de particiones del disco (GPT o MSDOS)
#@param int_ndisk nº de orden del disco
#@return str_tabletype - Tipo de tabla de paritiones
#@warning Salidas de errores no determinada
#@note tabletype = { MSDOS, GPT }
#@note Requisitos: blkid, parted, vgs
#*/ ##
def ogGetPartitionTableType (disk):
DISK = ogDiskToDev (disk)
if DISK is None: return
@ -875,8 +843,7 @@ def ogGetPartitionTableType (disk):
return type
#/**
# ogGetPartitionType int_ndisk int_npartition
## ogGetPartitionType int_ndisk int_npartition
#@brief Devuelve el mnemonico con el tipo de partición.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -884,7 +851,6 @@ def ogGetPartitionTableType (disk):
#@note Mnemonico: valor devuelto por ogIdToType.
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#*/ ##
def ogGetPartitionType (disk, par):
ID = ogGetPartitionId (disk, par)
if ID is None: return None
@ -892,8 +858,7 @@ def ogGetPartitionType (disk, par):
return ogIdToType (ID)
#/**
# ogHidePartition int_ndisk int_npartition
## ogHidePartition int_ndisk int_npartition
#@brief Oculta un apartición visible.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -901,7 +866,6 @@ def ogGetPartitionType (disk, par):
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
#@exception OG_ERR_PARTITION tipo de partición no reconocido.
#*/ ##
def ogHidePartition (disk, par):
PART = ogDiskToDev (disk, par)
if not PART: return None
@ -919,13 +883,11 @@ def ogHidePartition (disk, par):
ogSetPartitionType (disk, par, NEWTYPE)
#/**
# ogIdToType int_idpart
## ogIdToType int_idpart
#@brief Devuelve el identificador correspondiente a un tipo de partición.
#@param int_idpart identificador de tipo de partición.
#@return str_parttype mnemónico de tipo de partición.
#@exception OG_ERR_FORMAT Formato incorrecto.
#*/ ##
def ogIdToType (ID):
# Obtener valor hexadecimal de 4 caracteres rellenado con 0 por delante.
ID = ID.zfill(4).lower()
@ -996,20 +958,18 @@ def ogIdToType (ID):
return 'UNKNOWN'
# ogIsDiskLocked int_ndisk
## ogIsDiskLocked int_ndisk
#@brief Comprueba si un disco está bloqueado por una operación de uso exclusivo.
#@param int_ndisk nº de orden del disco
#@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error.
#@note Los ficheros de bloqueo se localizan en \c /var/lock/dev, siendo \c dev el dispositivo de la partición o de su disco, sustituyendo el carácter "/" por "-".
#*/ ##
def ogIsDiskLocked (disk):
DISK = ogDiskToDev (disk)
if not DISK: return False
return os.path.isfile (f'/var/lock/lock{DISK.replace("/", "-")}')
#/**
# ogListPartitions int_ndisk
## ogListPartitions int_ndisk
#@brief Lista las particiones definidas en un disco.
#@param int_ndisk nº de orden del disco
#@return str_parttype:int_partsize ...
@ -1018,7 +978,6 @@ def ogIsDiskLocked (disk):
#@note Requisitos: \c parted \c awk
#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
#@attention Las tuplas de valores están separadas por espacios.
#*/ ##
def ogListPartitions (disk):
DISK = ogDiskToDev (disk)
if not DISK: return None
@ -1034,12 +993,10 @@ def ogListPartitions (disk):
return p
#/**
# ogListPrimaryPartitions int_ndisk
## ogListPrimaryPartitions int_ndisk
#@brief Metafunción que lista las particiones primarias no vacías de un disco.
#@param int_ndisk nº de orden del disco
#@see ogListPartitions
#*/ ##
def ogListPrimaryPartitions (disk):
PTTYPE = ogGetPartitionTableType (disk)
if not PTTYPE: return None
@ -1058,12 +1015,10 @@ def ogListPrimaryPartitions (disk):
return PARTS[0:4]
#/**
# ogListLogicalPartitions int_ndisk
## ogListLogicalPartitions int_ndisk
#@brief Metafunción que lista las particiones lógicas de una tabla tipo MSDOS.
#@param int_ndisk nº de orden del disco
#@see ogListPartitions
#*/ ##
def ogListLogicalPartitions (disk):
PTTYPE = ogGetPartitionTableType (disk)
if not PTTYPE: return None
@ -1074,23 +1029,20 @@ def ogListLogicalPartitions (disk):
return PARTS[4:]
#/**
# ogLockDisk int_ndisk
## ogLockDisk int_ndisk
#@brief Genera un fichero de bloqueo para un disco en uso exlusivo.
#@param int_ndisk nº de orden del disco
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@note El fichero de bloqueo se localiza en \c /var/lock/disk, siendo \c disk el dispositivo del disco, sustituyendo el carácter "/" por "-".
#*/ ##
def ogLockDisk (disk):
DISK = ogDiskToDev (disk)
if not DISK: return None
open (f'/var/lock/lock{DISK.replace("/", "-")}', 'a').close()
#/**
# ogSetPartitionActive int_ndisk int_npartition
## ogSetPartitionActive int_ndisk int_npartition
#@brief Establece cual es la partición activa de un disco.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -1098,7 +1050,6 @@ def ogLockDisk (disk):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo.
#@note Requisitos: parted
#*/ ##
def ogSetPartitionActive (disk, par):
if InventoryLib.ogIsEfiActive():
SystemLib.ogEcho (['session', 'log'], 'warning', f'EFI: {ogGlobals.lang.MSG_DONTUSE} ogSetPartitionActive')
@ -1114,8 +1065,7 @@ def ogSetPartitionActive (disk, par):
return
#/**
# ogSetPartitionId int_ndisk int_npartition hex_partid
## ogSetPartitionId int_ndisk int_npartition hex_partid
#@brief Cambia el identificador de la partición.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -1126,9 +1076,8 @@ def ogSetPartitionActive (disk, par):
#@exception OG_ERR_OUTOFLIMIT Valor no válido.
#@exception OG_ERR_PARTITION Error al cambiar el id. de partición.
#@attention Requisitos: fdisk, sgdisk
#*/ ##
## for GPT partitions, id must be one of the valid types as reported by 'sgdisk --list-types', eg. 0700 or 8200
def ogSetPartitionId (disk, par, id):
## for GPT partitions, id must be one of the valid types as reported by 'sgdisk --list-types', eg. 0700 or 8200
DISK = ogDiskToDev (disk)
if not DISK: return None
@ -1159,8 +1108,7 @@ def ogSetPartitionId (disk, par, id):
return None
#/**
# ogSetPartitionSize int_ndisk int_npartition int_size
## ogSetPartitionSize int_ndisk int_npartition int_size
#@brief Muestra el tamano en KB de una particion determinada.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -1170,7 +1118,6 @@ def ogSetPartitionId (disk, par, id):
#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
#@note Requisitos: sfdisk, awk
#@todo Compruebar que el tamaño sea numérico positivo y evitar que pueda solaparse con la siguiente partición.
#*/ ##
def ogSetPartitionSize (disk, par, size):
DISK = ogDiskToDev (disk)
if not DISK: return None
@ -1188,15 +1135,13 @@ def ogSetPartitionSize (disk, par, size):
subprocess.run (['partprobe', DISK])
#/**
# ogSetPartitionType int_ndisk int_npartition str_type
## ogSetPartitionType int_ndisk int_npartition str_type
#@brief Cambia el identificador de la partición.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@param str_type mnemónico de tipo de partición
#@return (nada)
#@attention Requisitos: fdisk, sgdisk
#*/ ##
def ogSetPartitionType (disk, par, t):
DISK = ogDiskToDev (disk)
if not DISK: return None
@ -1215,18 +1160,16 @@ def ogSetPartitionType (disk, par, t):
ogSetPartitionId (disk, par, ID)
#/**
# ogTypeToId str_parttype [str_tabletype]
## ogTypeToId str_parttype [str_tabletype]
#@brief Devuelve el identificador correspondiente a un tipo de partición.
#@param str_parttype mnemónico de tipo de partición.
#@param str_tabletype mnemónico de tipo de tabla de particiones (MSDOS por defecto).
#@return int_idpart identificador de tipo de partición.
#@exception OG_ERR_FORMAT Formato incorrecto.
#@note tabletype = { MSDOS, GPT }, (MSDOS, por defecto)
#*/ ##
#ogTypeToId ('LINUX') => "83"
#ogTypeToId ('LINUX', 'MSDOS') => "83"
def ogTypeToId (type, pttype='MSDOS'):
#ogTypeToId ('LINUX') => "83"
#ogTypeToId ('LINUX', 'MSDOS') => "83"
data = {
'GPT_GUID': {
## https://en.wikipedia.org/wiki/GUID_Partition_Table?useskin=vector
@ -1338,8 +1281,7 @@ def ogTypeToId (type, pttype='MSDOS'):
return data[pttype.upper()][type.upper()]
#/**
# ogUnhidePartition int_ndisk int_npartition
## ogUnhidePartition int_ndisk int_npartition
#@brief Hace visible una partición oculta.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -1347,7 +1289,6 @@ def ogTypeToId (type, pttype='MSDOS'):
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
#@exception OG_ERR_PARTITION tipo de partición no reconocido.
#*/ ##
def ogUnhidePartition (disk, par):
PART = ogDiskToDev (disk, par)
if not PART: return None
@ -1365,29 +1306,25 @@ def ogUnhidePartition (disk, par):
ogSetPartitionType (disk, par, NEWTYPE)
#/**
# ogUnlockDisk int_ndisk
## ogUnlockDisk int_ndisk
#@brief Elimina el fichero de bloqueo para un disco.
#@param int_ndisk nº de orden del disco
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@note El fichero de bloqueo se localiza en \c /var/lock/disk, siendo \c disk el dispositivo del disco, sustituyendo el carácter "/" por "-".
#*/ ##
def ogUnlockDisk (disk):
DISK = ogDiskToDev (disk)
if not DISK: return None
os.remove (f'/var/lock/lock{DISK.replace("/", "-")}')
#/**
# ogUpdatePartitionTable
## ogUpdatePartitionTable
#@brief Fuerza al kernel releer la tabla de particiones de los discos duros
#@param no requiere
#@return informacion propia de la herramienta
#@note Requisitos: \c partprobe
#@warning pendiente estructurar la funcion a opengnsys
#*/ ##
def ogUpdatePartitionTable():
for disk in ogDiskToDev():
subprocess.run(["partprobe", disk])

View File

@ -1,10 +1,8 @@
#/**
#@file FileLib.py
##@file FileLib.py
#@brief Librería o clase File
#@class File
#@brief Funciones para gestión de archivos y directorios.
#@warning License: GNU GPLv3+
#*/
import subprocess
import os
@ -16,19 +14,17 @@ import SystemLib
import CacheLib
import FileSystemLib
#/**
# ogCalculateChecksum [ str_repo | int_ndisk int_npart ] path_filepath
## ogCalculateChecksum [ str_repo | int_ndisk int_npart ] path_filepath
#@brief Devuelve la suma de comprobación (checksum) de un fichero.
#@param path_filepath camino del fichero (independiente de mayúsculas)
#@param str_repo repositorio de ficheros
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@return hex_checksum Checksum del fichero
#*/ ##
#ogCalculateChecksum ([ str_repo | int_ndisk int_npartition ] path_filepath")
#ogCalculateChecksum (container='REPO', file='ubuntu.img') ==> ef899299caf8b517ce36f1157a93d8bf
#ogCalculateChecksum (disk=1, par=1, file='ubuntu.img') ==> ef899299caf8b517ce36f1157a93d8bf
def ogCalculateChecksum (disk=None, par=None, container=None, file=None):
#ogCalculateChecksum ([ str_repo | int_ndisk int_npartition ] path_filepath")
#ogCalculateChecksum (container='REPO', file='ubuntu.img') ==> ef899299caf8b517ce36f1157a93d8bf
#ogCalculateChecksum (disk=1, par=1, file='ubuntu.img') ==> ef899299caf8b517ce36f1157a93d8bf
if file is None:
raise TypeError ('missing required argument: "file"')
@ -70,12 +66,10 @@ def ogCalculateChecksum (disk=None, par=None, container=None, file=None):
return md5
#/**
# ogCompareChecksumFiles [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
## ogCompareChecksumFiles [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
#@brief Metafunción que compara las sumas de comprobación almacenadas de 2 ficheros.
#@return bool_compare Valor de comparación.
#@warning No es necesario especificar la extensión ".sum".
#*/ ##
def ogCompareChecksumFiles(*args):
# Variables locales.
ARGS = args
@ -110,15 +104,13 @@ def ogCompareChecksumFiles(*args):
return False
#/**
# ogCalculateFullChecksum [ str_repo | int_ndisk int_npart ] path_filepath
## ogCalculateFullChecksum [ str_repo | int_ndisk int_npart ] path_filepath
#@brief Devuelve la suma COMPLETA de comprobación (checksum) de un fichero.
#@param path_filepath camino del fichero (independiente de mayúsculas)
#@param str_repo repositorio de ficheros
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@return hex_checksum Checksum del fichero
#*/ ##
def ogCalculateFullChecksum (disk=None, par=None, container=None, file=None):
if file is None:
raise TypeError ('missing required argument: "file"')
@ -159,17 +151,15 @@ def ogCalculateFullChecksum (disk=None, par=None, container=None, file=None):
#/**
# ogCopyFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
## ogCopyFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
#@brief Metafunción para copiar un fichero de sistema OpenGnSys a un directorio.
#@see ogGetPath
#@return Progreso de la copia.
#@warning Deben existir tanto el fichero origen como el directorio destino.
#*/ ##
#ogCopyFile (src, dst)
#ogCopyFile ({container='REPO', file='newfile.txt'}, {disk=1, par=2, file='/tmp/newfile.txt'})
#ogCopyFile ({disk=1, par=2, file='/tmp/newfile.txt'}, {container='REPO', file='newfile.txt'})
def ogCopyFile (src, dst):
#ogCopyFile (src, dst)
#ogCopyFile ({container='REPO', file='newfile.txt'}, {disk=1, par=2, file='/tmp/newfile.txt'})
#ogCopyFile ({disk=1, par=2, file='/tmp/newfile.txt'}, {container='REPO', file='newfile.txt'})
for elem in src, dst:
if elem == src: which = 'source'
else: which = 'target'
@ -219,18 +209,16 @@ def ogCopyFile (src, dst):
return not result.returncode ## negate shell result
#/**
# ogDeleteFile [ str_repo | int_ndisk int_npartition ] path_filepath
## ogDeleteFile [ str_repo | int_ndisk int_npartition ] path_filepath
#@brief Metafunción que borra un fichero de un dispositivo.
#@see ogGetPath
#@version 0.9 - Pruebas con OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-09-29
#*/ ##
#ogDeleteFile ([ str_repo | int_ndisk int_npartition ] path_file)
#ogDeleteFile (container='REPO', file='/tmp/newfile.txt')
#ogDeleteFile (disk=1, par=2, file='/tmp/newfile.txt')
def ogDeleteFile (disk=None, par=None, container=None, file=None):
#ogDeleteFile ([ str_repo | int_ndisk int_npartition ] path_file)
#ogDeleteFile (container='REPO', file='/tmp/newfile.txt')
#ogDeleteFile (disk=1, par=2, file='/tmp/newfile.txt')
if file is None:
raise TypeError ('missing required argument: "file"')
@ -260,14 +248,12 @@ def ogDeleteFile (disk=None, par=None, container=None, file=None):
return
#/**
# ogDeleteTree [ str_repo | int_ndisk int_npartition ] path_dirpath
## ogDeleteTree [ str_repo | int_ndisk int_npartition ] path_dirpath
#@brief Metafunción que borra todo un subárbol de directorios de un dispositivo.
#@see ogGetPath
#*/ ##
#ogDeleteTree (container='REPO', file='/tmp/newdir')
#ogDeleteTree (disk=1, par=2, file='/tmp/newdir')
def ogDeleteTree (disk=None, par=None, container=None, file=None):
#ogDeleteTree (container='REPO', file='/tmp/newdir')
#ogDeleteTree (disk=1, par=2, file='/tmp/newdir')
if file is None:
raise TypeError ('missing required argument: "file"')
@ -297,8 +283,7 @@ def ogDeleteTree (disk=None, par=None, container=None, file=None):
return
#/**
# ogGetPath [ str_repo | int_ndisk int_npartition ] path_filepath
## ogGetPath [ str_repo | int_ndisk int_npartition ] path_filepath
#@brief Inicia el proceso de arranque de un sistema de archivos.
#@param path_filepath camino del fichero (independiente de mayúsculas)
#@param str_repo repositorio de ficheros
@ -312,11 +297,10 @@ def ogDeleteTree (disk=None, par=None, container=None, file=None):
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#@warning En caso de error, sólo devuelve el código y no da mensajes.
#@todo Terminar de definir parámetros para acceso a repositorios.
#*/ ##
#ogGetPath (file='/mnt/sda1/windows/system32') ==> '/mnt/sda1/WINDOWS/System32'
#ogGetPath (src='REPO', file='/etc/fstab') ==> '/opt/opengnsys/images/etc/fstab'
#ogGetPath (src='1 1', file='/windows/system32') ==> '/mnt/sda1/WINDOWS/System32'
def ogGetPath (src=None, file=None):
#ogGetPath (file='/mnt/sda1/windows/system32') ==> '/mnt/sda1/WINDOWS/System32'
#ogGetPath (src='REPO', file='/etc/fstab') ==> '/opt/opengnsys/images/etc/fstab'
#ogGetPath (src='1 1', file='/windows/system32') ==> '/mnt/sda1/WINDOWS/System32'
if file is None:
raise TypeError ('missing required argument: "file"')
@ -374,17 +358,14 @@ def ogGetPath (src=None, file=None):
return filepath
#/**
# ogGetParentPath [ str_repo | int_ndisk int_npartition ] path_filepath
## ogGetParentPath [ str_repo | int_ndisk int_npartition ] path_filepath
#@brief Metafunción que devuelve el camino del directorio padre.
#@see ogGetPath
#*/ ##
#ogGetParentPath ([ str_repo | int_ndisk int_npartition ] path_filepath
#ogGetParentPath ( file='/mnt/sda1/windows/system32') ==> '/mnt/sda1/WINDOWS'
#ogGetParentPath (src='REPO', file='/etc/fstab') ==> '/opt/opengnsys/images/etc'
#ogGetParentPath (src='1 1', file='/windows/system32') ==> '/mnt/sda1/WINDOWS'
def ogGetParentPath (src=None, file=None):
#ogGetParentPath ([ str_repo | int_ndisk int_npartition ] path_filepath
#ogGetParentPath ( file='/mnt/sda1/windows/system32') ==> '/mnt/sda1/WINDOWS'
#ogGetParentPath (src='REPO', file='/etc/fstab') ==> '/opt/opengnsys/images/etc'
#ogGetParentPath (src='1 1', file='/windows/system32') ==> '/mnt/sda1/WINDOWS'
if file is None:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, '')
return
@ -394,13 +375,11 @@ def ogGetParentPath (src=None, file=None):
else:
return ogGetPath (src=src, file=os.path.dirname('/'+file))
#/**
# ogIsNewerFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
## ogIsNewerFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
#@brief Metafunción que indica se un fichero es más nuevo que otro.
#@see ogGetPath
#@return Código de salida: 0 - nuevo, 1 - antiguo o error
#@warning Deben existir tanto el fichero origen como el destino.
#*/ ##
def ogIsNewerFile(*args):
# Variables locales.
ARGS = args
@ -443,12 +422,10 @@ def ogIsNewerFile(*args):
# Devolver si el primer fichero se ha modificado después que el segundo.
return os.path.getmtime(SOURCE) > os.path.getmtime(TARGET)
#/**
# ogMakeChecksumFile [ str_repo | int_ndisk int_npart ] path_filepath
## ogMakeChecksumFile [ str_repo | int_ndisk int_npart ] path_filepath
#@brief Metafunción que guarda el valor de comprobación de un fichero.
#@see ogCalculateChecksum
#@warning Genera un fichero con extensión ".sum".
#*/ ##
def ogMakeChecksumFile(*args):
# Variables locales.
FILE = None
@ -470,14 +447,12 @@ def ogMakeChecksumFile(*args):
f.write(checksum)
#/**
# ogMakeDir [ str_repo | int_ndisk int_npartition ] path_dirpath
## ogMakeDir [ str_repo | int_ndisk int_npartition ] path_dirpath
#@brief Metafunción que crea un subdirectorio vacío en un dispositivo.
#@see ogGetParentPath
#*/ ##
#ogMakeDir (container='REPO', file='/tmp/newdir')
#ogMakeDir (disk='1', par='2', file='/tmp/newdir')
def ogMakeDir (container=None, disk=None, par=None, file=None):
#ogMakeDir (container='REPO', file='/tmp/newdir')
#ogMakeDir (disk='1', par='2', file='/tmp/newdir')
if file is None:
raise TypeError ('missing required argument: "file"')

View File

@ -1,10 +1,8 @@
#/**
#@file FileSystemLib.py
##@file FileSystemLib.py
#@brief Librería o clase FileSystem
#@class FileSystem
#@brief Funciones para gestión de sistemas de archivos.
#@warning License: GNU GPLv3+
#*/
import subprocess
import sys
@ -16,8 +14,7 @@ import DiskLib
import CacheLib
#/**
# ogCheckFs int_ndisk int_nfilesys
## ogCheckFs int_ndisk int_nfilesys
#@brief Comprueba el estado de un sistema de archivos.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -28,7 +25,6 @@ import CacheLib
#@note Requisitos: *fsck*
#@warning No se comprueban sistemas de archivos montados o bloqueados.
#@todo Definir salidas.
#*/ ##
def ogCheckFs (disk, par):
PART = DiskLib.ogDiskToDev (disk, par)
if not PART: return
@ -87,8 +83,7 @@ def ogCheckFs (disk, par):
return not errcode ## reverse to indicate success
#/**
# ogExtendFs int_ndisk int_nfilesys
## ogExtendFs int_ndisk int_nfilesys
#@brief Extiende un sistema de archivos al tamaño de su partición.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -97,7 +92,6 @@ def ogCheckFs (disk, par):
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
#@note Requisitos: *resize*
#*/ ##
def ogExtendFs (disk, par):
PART = DiskLib.ogDiskToDev (disk, par)
if not PART: return
@ -166,11 +160,8 @@ def ogExtendFs (disk, par):
return not rc ## reverse to indicate success
#/**
# ogFormat int_ndisk int_nfilesys | CACHE
## ogFormat int_ndisk int_nfilesys | CACHE
#@see ogFormatFs ogFormatCache
#*/ ##
def ogFormat (disk, par=None, fs=None, label=None):
if disk.lower() == "cache":
return CacheLib.ogFormatCache()
@ -178,8 +169,7 @@ def ogFormat (disk, par=None, fs=None, label=None):
return ogFormatFs (disk, par, fs=fs, label=label)
#/**
# ogFormatFs int_ndisk int_nfilesys [type_fstype] [str_label]
## ogFormatFs int_ndisk int_nfilesys [type_fstype] [str_label]
#@brief Formatea un sistema de ficheros según el tipo de su partición.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -189,10 +179,9 @@ def ogFormat (disk, par=None, fs=None, label=None):
#@exception OG_ERR_FORMAT Formato de ejecución incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@exception OG_ERR_PARTITION Partición no accesible o desconocida.
#@note Requisitos: mkfs*
#@note Requisitos: mkfs*
#@warning No formatea particiones montadas ni bloqueadas.
#@todo Definir salidas.
#*/ ##
def ogFormatFs (disk, par, fs=None, label=None):
PART = DiskLib.ogDiskToDev (disk, par)
if not PART: return
@ -266,17 +255,15 @@ def ogFormatFs (disk, par, fs=None, label=None):
return not errcode ## reverse to indicate success
#/**
# ogGetFsSize int_ndisk int_npartition [str_unit]
## ogGetFsSize int_ndisk int_npartition [str_unit]
#@brief Muestra el tamanio del sistema de archivos indicado, permite definir la unidad de medida, por defecto GB
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@param str_unit unidad (opcional, por defecto: KB)
#@return float_size - Tamaño del sistema de archivos
#@note str_unit = { KB, MB, GB, TB }
#@note str_unit = { KB, MB, GB, TB }
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo.
#*/ ##
def ogGetFsSize (disk, par, unit='KB'):
factor = 1
if unit.upper() == "MB":
@ -302,16 +289,14 @@ def ogGetFsSize (disk, par, unit='KB'):
return int (sz)
#/**
# ogGetFsType int_ndisk int_nfilesys
## ogGetFsType int_ndisk int_nfilesys
#@brief Devuelve el mnemonico con el tipo de sistema de archivos.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
#@return Mnemonico
#@note Mnemonico: { EXT2, EXT3, EXT4, BTRFS, REISERFS, XFS, JFS, FAT12, FAT16, FAT32, NTFS, LINUX-SWAP, LINUX-LVM, LINUX-RAID, HFS, HFSPLUS, CACHE }
#@note Mnemonico: { EXT2, EXT3, EXT4, BTRFS, REISERFS, XFS, JFS, FAT12, FAT16, FAT32, NTFS, LINUX-SWAP, LINUX-LVM, LINUX-RAID, HFS, HFSPLUS, CACHE }
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#*/ ##
def ogGetFsType(disk, part):
PART = DiskLib.ogDiskToDev(disk, part)
if not PART: return
@ -364,8 +349,7 @@ def ogGetFsType(disk, part):
return TYPE
#/**
# ogGetMountPoint int_ndisk int_nfilesys
## ogGetMountPoint int_ndisk int_nfilesys
#@brief Devuelve el punto de montaje de un sistema de archivos.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -373,8 +357,6 @@ def ogGetFsType(disk, part):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@note Requisitos: \c mount* \c awk
#*/ ##
def ogGetMountPoint(disk, par):
PART = DiskLib.ogDiskToDev(disk, par)
if not PART: return
@ -383,13 +365,11 @@ def ogGetMountPoint(disk, par):
#/**
# ogIsFormated int_ndisk int_nfilesys
## ogIsFormated int_ndisk int_nfilesys
#@brief Comprueba si un sistema de archivos está formateado.
#@param int_ndisk nº de orden del disco o volumen.
#@param int_nfilesys nº de orden del sistema de archivos
#@return Código de salida: True - formateado, False - sin formato o error.
#*/ ##
def ogIsFormated(disk, part):
PART = DiskLib.ogDiskToDev (disk, part)
if not PART:
@ -407,23 +387,18 @@ def ogIsFormated(disk, part):
#/**
# ogIsLocked int_ndisk int_npartition
## ogIsLocked int_ndisk int_npartition
#@see ogIsPartitionLocked
#*/
def ogIsLocked(disk, par):
return ogIsPartitionLocked(disk, par)
#/**
# ogIsPartitionLocked int_ndisk int_npartition
## ogIsPartitionLocked int_ndisk int_npartition
#@brief Comprueba si una partición o su disco están bloqueados por una operación de uso exclusivo.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error.
#@note Los ficheros de bloqueo se localizan en \c /var/lock/dev, siendo \c dev el dispositivo de la partición o de su disco, sustituyendo el carácter "/" por "-".
#*/ ##
def ogIsPartitionLocked(disk, par):
DISK = DiskLib.ogDiskToDev(disk)
PART = DiskLib.ogDiskToDev(disk, par)
@ -434,19 +409,16 @@ def ogIsPartitionLocked(disk, par):
rc = os.path.isfile(LOCKDISK) or os.path.isfile(LOCKPART)
return rc
#/**
# ogIsMounted int_ndisk int_nfilesys
## ogIsMounted int_ndisk int_nfilesys
#@brief Comprueba si un sistema de archivos está montado.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
#@return Código de salida: 0 - montado, 1 - sin montar o error.
#*/ ##
def ogIsMounted (disk, par):
return bool (ogGetMountPoint (disk, par))
#/**
# ogIsReadonly int_ndisk int_nfilesys
## ogIsReadonly int_ndisk int_nfilesys
#@brief Comprueba si un sistema de archivos está montado solo de lectura.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -454,8 +426,6 @@ def ogIsMounted (disk, par):
#@version 1.1.0 - Primera versión para OpenGnsys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2016-01-20
#*/ ##
def ogIsReadonly(disk, par):
PART = DiskLib.ogDiskToDev(disk, par)
if not PART: return
@ -465,13 +435,11 @@ def ogIsReadonly(disk, par):
return "ro" in options
#/**
# ogIsWritable int_ndisk int_nfilesys
## ogIsWritable int_ndisk int_nfilesys
#@brief Comprueba si un sistema de archivos está montado de lectura y escritura.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
#@return Código de salida: 0 - lectura y escritura, 1 - solo lectura o no montado.
#*/ ##
def ogIsWritable (disk, par):
PART = DiskLib.ogDiskToDev (disk, par)
if not PART: return
@ -481,15 +449,12 @@ def ogIsWritable (disk, par):
return "rw" in options
#/**
# ogLock int_ndisk int_npartition
## ogLock int_ndisk int_npartition
#@see ogLockPartition
#*/
def ogLock(disk, par):
return ogLockPartition(disk, par)
#/**
# ogLockPartition int_ndisk int_npartition
## ogLockPartition int_ndisk int_npartition
#@brief Genera un fichero de bloqueo para una partición en uso exlusivo.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -497,7 +462,6 @@ def ogLock(disk, par):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@note El fichero de bloqueo se localiza en \c /var/lock/part, siendo \c part el dispositivo de la partición, sustituyendo el carácter "/" por "-".
#*/ ##
def ogLockPartition (disk, par):
PART = DiskLib.ogDiskToDev (disk, par)
if not PART: return
@ -510,10 +474,8 @@ def ogLockPartition (disk, par):
return True
#/**
# ogMount int_ndisk int_nfilesys
## ogMount int_ndisk int_nfilesys
#@see ogMountFs ogMountCache ogMountCdrom
#*/ ##
def ogMount(*args):
if 1 == len (args):
if 'cache' == args[0].lower():
@ -524,12 +486,10 @@ def ogMount(*args):
return ogMountFs(args[0], args[1])
#/**
# ogMountFirstFs int_ndisk
## ogMountFirstFs int_ndisk
#@brief Monta el primer sistema de archivos disponible en el disco.
#@param int_ndisk nº de orden del disco
#@return Punto de montaje del primer sistema de archivos detectado
#*/ ##
def ogMountFirstFs (disk):
NPARTS = DiskLib.ogGetPartitionsNumber (disk)
for PART in range (1, NPARTS + 1):
@ -539,8 +499,7 @@ def ogMountFirstFs (disk):
SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_NOTFOUND, f'{disk}')
return ogGlobals.OG_ERR_NOTFOUND
#/**
# ogMountFs int_ndisk int_nfilesys
## ogMountFs int_ndisk int_nfilesys
#@brief Monta un sistema de archivos.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -548,7 +507,6 @@ def ogMountFirstFs (disk):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@exception OG_ERR_PARTITION Tipo de particion desconocido o no se puede montar.
#*/ ##
def ogMountFs (disk, par):
dev = DiskLib.ogDiskToDev (disk, par)
if not dev: return
@ -609,8 +567,7 @@ def ogMountFs (disk, par):
#/**
# ogMountCdrom
## ogMountCdrom
#@brief Monta dispositivo óptico por defecto
#@return Punto de montaje
#@exception OG_ERR_FORMAT Formato incorrecto.
@ -618,7 +575,6 @@ def ogMountFs (disk, par):
#@version
#@author
#@date
#*/ ##
def ogMountCdrom():
DEV = '/dev/cdrom' # Por defecto
outlines = subprocess.run (['mount'], capture_output=True, text=True).stdout.split ('\n')
@ -641,8 +597,7 @@ def ogMountCdrom():
return mntdir
#/**
# ogReduceFs int_ndisk int_nfilesys
## ogReduceFs int_ndisk int_nfilesys
#@brief Reduce el tamaño del sistema de archivos, sin tener en cuenta el espacio libre.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -652,8 +607,7 @@ def ogMountCdrom():
#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
#@warning En Windows, se borran los ficheros de hiberanción y de paginación.
#@warning El sistema de archivos se amplía al mínimo + 10%.
#@note Requisitos: *resize*
#*/ ##
#@note Requisitos: *resize*
def ogReduceFs (disk, par):
PART = DiskLib.ogDiskToDev (disk, par)
if not PART: return
@ -731,15 +685,12 @@ def ogReduceFs (disk, par):
return ogGetFsSize (disk, par)
#/**
# ogUnlock int_ndisk int_npartition
## ogUnlock int_ndisk int_npartition
#@see ogUnlockPartition
#*/ ##
def ogUnlock (disk, par):
return ogUnlockPartition (disk, par)
#/**
# ogUnlockPartition int_ndisk int_npartition
## ogUnlockPartition int_ndisk int_npartition
#@brief Elimina el fichero de bloqueo para una particion.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -747,7 +698,6 @@ def ogUnlock (disk, par):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@note El fichero de bloqueo se localiza en \c /var/lock/part, siendo \c part el dispositivo de la partición, sustituyendo el carácter "/" por "-".
#*/ ##
def ogUnlockPartition (disk, par):
PART = DiskLib.ogDiskToDev (disk, par)
if not PART: return
@ -757,15 +707,12 @@ def ogUnlockPartition (disk, par):
os.remove (LOCKFILE)
#/**
# ogUnmount int_ndisk int_npartition
## ogUnmount int_ndisk int_npartition
#@see ogUnmountFs
#*/ ##
def ogUnmount (disk, par):
return ogUnmountFs (disk, par)
#/**
# ogUnmountFs int_ndisk int_nfilesys
## ogUnmountFs int_ndisk int_nfilesys
#@brief Desmonta un sistema de archivos.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -773,8 +720,6 @@ def ogUnmount (disk, par):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@warning La partición no está previamente montada o no se puede desmontar.
#*/ ##
def ogUnmountFs(disk, par):
PART = DiskLib.ogDiskToDev (disk, par)
if not PART: return
@ -805,15 +750,13 @@ def ogUnmountFs(disk, par):
return True
#/**
# ogUnmountAll int_ndisk
## ogUnmountAll int_ndisk
#@brief Desmonta todos los sistema de archivos de un disco, excepto el caché local.
#@param int_ndisk nº de orden del disco
#@return Nada
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@warning No se desmonta la partición marcada como caché local.
#*/ ##
def ogUnmountAll (disk):
DISK = DiskLib.ogDiskToDev (disk)
n = DiskLib.ogGetPartitionsNumber (disk)
@ -823,14 +766,12 @@ def ogUnmountAll (disk):
ogUnmount (disk, PART)
#/**
# ogUnsetDirtyBit int_ndisk int_npart
## ogUnsetDirtyBit int_ndisk int_npart
#@brief Inhabilita el Dirty Bit del sistema de ficheros NTFS para evitar un CHKDSK en el primer arranque
#@param int_ndisk nº de orden del disco
#@param int_npart nº de orden de partición
#@return Nada
#@exception OG_ERR_FORMAT Formato incorrecto.
#*/ ##
def ogUnsetDirtyBit (disk, par):
PART = DiskLib.ogDiskToDev (disk, par)
if not PART: return None
@ -841,8 +782,7 @@ def ogUnsetDirtyBit (disk, par):
subprocess.run (['ntfsfix', '--clear-dirty', PART])
#/**
# ogGetFreeSize int_disco int_partition str_SizeOutput
## ogGetFreeSize int_disco int_partition str_SizeOutput
#@brief muestra informacion del tamaño total, datos y libre.
#@param int_ndisk nº de orden del disco
#@param int_npart nº de orden de partición
@ -850,8 +790,6 @@ def ogUnsetDirtyBit (disk, par):
#@return int_size:int_data:int_free
#@TODO Componer corretcamente esta función.
#@exception OG_ERR_FORMAT Formato incorrecto.
#*/ ##
def ogGetFreeSize(disk, part, unit='KB'):
PART = DiskLib.ogDiskToDev (disk, part)
if not PART: return

View File

@ -7,31 +7,19 @@
# python3-git
# python3.8
# Must have working locales, or unicode strings will fail. Install 'locales', configure /etc/locale.gen, run locale-gen.
#
import os
import sys
import shutil
import argparse
import tempfile
import logging
import subprocess
import json
from pathlib import Path
import base64
import stat
import time
import git
import libarchive
import xattr
@ -41,33 +29,22 @@ import re
import uuid
from tqdm import tqdm
from GitLib.filesystem import *
from GitLib.disk import *
from GitLib.ntfs import *
from GitLib.kernel import parse_kernel_cmdline
import CacheLib
#import requests
from CacheLib import ogMountCache
def _git_op_to_string(op):
op = op & git.RemoteProgress.OP_MASK
if op == git.RemoteProgress.COMPRESSING:
return "Compressing", "Obj"
elif op == git.RemoteProgress.CHECKING_OUT:
return "Checking out", "Obj"
elif op == git.RemoteProgress.COUNTING:
return "Counting", "Obj"
elif op == git.RemoteProgress.RECEIVING:
return "Receiving", "B"
elif op == git.RemoteProgress.WRITING:
return "Writing", "B"
elif op == git.RemoteProgress.RESOLVING:
return "Resolving deltas", "Obj"
if op == git.RemoteProgress.COMPRESSING: return "Compressing", "Obj"
elif op == git.RemoteProgress.CHECKING_OUT: return "Checking out", "Obj"
elif op == git.RemoteProgress.COUNTING: return "Counting", "Obj"
elif op == git.RemoteProgress.RECEIVING: return "Receiving", "B"
elif op == git.RemoteProgress.WRITING: return "Writing", "B"
elif op == git.RemoteProgress.RESOLVING: return "Resolving deltas", "Obj"
return "Unknown", "?"
@ -97,60 +74,44 @@ class OgProgressPrinterWeb(git.RemoteProgress):
"""
def __init__(self):
super().__init__()
#self.ogcore_ip = get_IPcore()
#self.endpoint_url = f"https://{ogcore_ip}:8443/og-repository/webhook"
self.logger = logging.getLogger(f"{__package__}.{self.__class__.__name__}")
#self.jobId = jobId
self.last_ts = time.time()
"""Total stages of the git process. This comes from Git itself."""
self.total_stages = 6
self.simple_progress = 0
self.prev_progress = -1
def _get_stage_number(self, op):
op = op & git.RemoteProgress.OP_MASK
if op == git.RemoteProgress.COUNTING: return 0
elif op == git.RemoteProgress.COMPRESSING: return 1
elif op == git.RemoteProgress.WRITING: return 2
elif op == git.RemoteProgress.CHECKING_OUT: return 3
elif op == git.RemoteProgress.RECEIVING: return 4
elif op == git.RemoteProgress.RESOLVING: return 5
if op == git.RemoteProgress.COUNTING:
return 0
elif op == git.RemoteProgress.COMPRESSING:
return 1
elif op == git.RemoteProgress.WRITING:
return 2
elif op == git.RemoteProgress.CHECKING_OUT:
return 3
elif op == git.RemoteProgress.RECEIVING:
return 4
elif op == git.RemoteProgress.RESOLVING:
return 5
def _send_progress(self, p):
i = int (100*p)
print (f'[{i}] {i}% done')
def update(self, op_code, cur_count, max_count=None, message=""):
# This shouldn't normally fail, but if it ever does, we don't want to fail the entire
# Git operation just because we're unable to report the status.
now = time.time()
if now - self.last_ts < 1: return
stage_portion = (100 / self.total_stages)
stage_portion = (1 / self.total_stages)
if max_count:
self.simple_progress = int((stage_portion * self._get_stage_number(op_code)) + ((stage_portion / max_count) * cur_count))
if self.prev_progress != self.simple_progress:
print(f"[{self.simple_progress}]")
self.prev_progress = self.simple_progress
self.simple_progress = stage_portion * self._get_stage_number(op_code) + (stage_portion * cur_count/max_count)
op_text, _ = _git_op_to_string(op_code)
self.logger.debug(f"Progress: {op_text} ({op_code}) {cur_count}/{max_count}: {message}")
self._send_progress (self.simple_progress)
self.last_ts = now
#try:
# data = json.dumps({"job_id" : self.jobId, "progress" : progress})
# headers = {'Content-Type': 'application/json'}
#
# response = requests.post(self.endpoint_url, data=data, headers=headers, verify=False)
#except Exception as e:
# self.logger.error("Exception %s while trying to report progress", e)
def __del__(self):
self._send_progress (1.0)
class OgProgressPrinterConsole(git.RemoteProgress):
"""
@ -304,7 +265,7 @@ class OpengnsysGitLibrary:
self.repo_image_path = "oggit"
self.ntfs_implementation = ntfs_implementation
self.cache_dir = CacheLib.ogMountCache()
self.cache_dir = ogMountCache()
# Si no hay cache, se va a crear el .git en el FS directamente
@ -464,14 +425,22 @@ class OpengnsysGitLibrary:
if result.returncode == 0:
self.logger.debug("Completed, return code %i", result.returncode)
self.logger.debug("STDOUT: %s", result.stdout)
self.logger.debug("STDERR: %s", result.stderr)
#self.logger.debug("STDOUT: %s", result.stdout)
#self.logger.debug("STDERR: %s", result.stderr)
else:
# An error return code can be returned for reasons like missing files, so we deal this
# as non-fatal.
self.logger.error("Completed, return code %i", result.returncode)
self.logger.error("STDOUT: %s", result.stdout)
#self.logger.error("STDOUT: %s", result.stdout)
fd = open ('/tmp/ntfssecaudit.stdout', 'wb')
fd.write (result.stdout)
fd.close()
self.logger.error("STDERR: %s", result.stderr)
fd = open ('/tmp/ntfssecaudit.stderr', 'wb')
fd.write (result.stderr)
fd.close()
self.fs.temp_remount(mountdata)
@ -541,6 +510,9 @@ class OpengnsysGitLibrary:
boot_device = self.fs.find_boot_device()
boot_mount = self.fs.find_mountpoint(boot_device)
if boot_mount is None:
self.logger.warning(f"Not installing EFI files--boot_mount is None")
return
self.logger.info(f"Installing EFI files in {boot_mount}")
meta_dir = os.path.join(root_directory, ".opengnsys-metadata")
@ -572,6 +544,9 @@ class OpengnsysGitLibrary:
def _efi_copy(self, root_directory, system_specific = False, config_name = None):
meta_dir = os.path.join(root_directory, ".opengnsys-metadata")
boot_device = self.fs.find_boot_device()
if boot_device is None:
self.logger.warning("Not copying EFI--boot_device is None")
return
boot_mount = self.fs.find_mountpoint(boot_device)
efi_files_dir = ""
@ -657,7 +632,7 @@ class OpengnsysGitLibrary:
self.logger.debug(f"Archive: {metadata}")
for entry in metadata:
self.logger.debug(entry)
#self.logger.debug(entry)
if entry.pathname in wanted_files:
self.logger.debug(f"Extracting {entry}")
data = bytearray()
@ -1149,7 +1124,7 @@ class OpengnsysGitLibrary:
with open(os.path.join(meta_dir, "empty_directories.jsonl"), "r", encoding='utf-8') as empties_file:
for line in empties_file:
if line.isspace():
self.logger.debug("Empty line, skipping")
#self.logger.debug("Empty line, skipping")
continue
empties_data = json.loads(line)
@ -1161,12 +1136,12 @@ class OpengnsysGitLibrary:
empty_dir_keep = os.path.join(path, empty_dir, ".opengnsys-keep")
self.logger.debug(f"Empty directory: {empty_dir}")
#self.logger.debug(f"Empty directory: {empty_dir}")
full_empty_dir = os.path.join(path, empty_dir)
Path(full_empty_dir).mkdir(parents=True, exist_ok=True)
if os.path.exists(empty_dir_keep):
self.logger.debug(f"Deleting: {empty_dir_keep}")
#self.logger.debug(f"Deleting: {empty_dir_keep}")
os.unlink(empty_dir_keep)
if not destructive_only:
@ -1763,6 +1738,7 @@ class OpengnsysGitLibrary:
origin = repo.remotes["origin"]
repo.heads.main.set_tracking_branch(origin.refs.main)
#repo.heads["main"].set_tracking_branch(origin.refs["main"])
ret = origin.push(progress=self.progress_callback, force = force)
ret.raise_if_error()
@ -1876,7 +1852,7 @@ if __name__ == '__main__':
logger.setLevel(logging.DEBUG)
streamLog = logging.StreamHandler()
streamLog.setLevel(logging.INFO)
streamLog.setLevel(logging.WARNING)
if not os.path.exists(opengnsys_log_dir):
os.mkdir(opengnsys_log_dir)

View File

@ -1,4 +1,8 @@
#!/usr/bin/python3
##@file ImageLib.py
#@brief Librería o clase Image
#@class Image
#@brief Funciones para gestionar imágenes
#@warning License: GNU GPLv3+
import shutil
import subprocess
@ -29,17 +33,14 @@ import NetLib
if not shutil.which ('mbuffer'):
raise FileNotFoundError ('"mbuffer" utility must be present')
#/**
#@file ImageLib.py
#@brief Librería o clase Image
#@class Image
#@brief Funciones para creación, restauración y clonación de imágenes de sistemas.
#@warning License: GNU GPLv3+
#*/
#/**
# ogCreateImageSyntax path_device path_filename [str_tool] [str_compressionlevel]
## ogCreateImageSyntax path_device path_filename [str_tool] [str_compressionlevel]
#@brief Genera una cadena de texto con la instrucción para crear un fichero imagen
#@param path_device dispositivo Linux del sistema de archivos
#@param path_fileneme path absoluto del fichero imagen
@ -48,10 +49,9 @@ if not shutil.which ('mbuffer'):
#@return str_command - cadena con el comando que se debe ejecutar.
#@warning Salida nula si se producen errores.
#@TODO introducir las herramientas fsarchiver, dd
#*/ ##
#ogCreateImageSyntax /dev/sda1 /opt/opengnsys/images/prueba.img partclone lzop
#ogCreateImageSyntax /dev/sda1 /opt/opengnsys/images/prueba.img
def ogCreateImageSyntax (dev, imgfile, tool='partclone', level='gzip'):
#ogCreateImageSyntax /dev/sda1 /opt/opengnsys/images/prueba.img partclone lzop
#ogCreateImageSyntax /dev/sda1 /opt/opengnsys/images/prueba.img
if 'ntfsclone' == tool:
param1 = f'ntfsclone --force --save-image -O - {dev}'
@ -109,8 +109,7 @@ def ogCreateImageSyntax (dev, imgfile, tool='partclone', level='gzip'):
if param1: return f'{param1} {param2} {param3} {imgfile}'
#/**
# ogRestoreImageSyntax path_filename path_device [str_tools] [str_compressionlevel]
## ogRestoreImageSyntax path_filename path_device [str_tools] [str_compressionlevel]
#@brief Genera una cadena de texto con la instrucción para crear un fichero imagen
#@param path_device dispositivo Linux del sistema de archivos
#@param path_fileneme path absoluto del fichero imagen
@ -121,9 +120,8 @@ def ogCreateImageSyntax (dev, imgfile, tool='partclone', level='gzip'):
#@warning En pruebas iniciales
#@TODO introducir las herramientas fsarchiver, dd
#@TODO introducir el nivel de compresion gzip
#*/ ##
#ogRestoreImageSyntax /opt/opengnsys/images/prueba.img /dev/sda1 [partclone] [lzop]
def ogRestoreImageSyntax (imgfile, part, tool=None, level=None):
#ogRestoreImageSyntax /opt/opengnsys/images/prueba.img /dev/sda1 [partclone] [lzop]
if not os.path.exists (imgfile):
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, imgfile)
## original bash code is broken: 'return' is never called
@ -183,28 +181,7 @@ def ogRestoreImageSyntax (imgfile, part, tool=None, level=None):
#/**
# ogCreateDiskImage int_ndisk str_repo path_image [str_tools] [str_compressionlevel]
#@brief Crea una imagen (copia de seguridad) de un disco completo.
#@param int_ndisk nº de orden del disco
#@param str_repo repositorio de imágenes (remoto o caché local)
#@param path_image camino de la imagen (sin extensión)
#@return (nada, por determinar)
#@note repo = { REPO, CACHE }
#@note Esta primera versión crea imágenes con dd comprimidas con gzip.
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#@exception OG_ERR_LOCKED particion bloqueada por otra operación.
#@exception OG_ERR_IMAGE error al crear la imagen del sistema.
#@warning En pruebas iniciales
#@todo Gestión de bloqueos de disco
#@todo Comprobar si debe desmontarse la caché local
#@todo Comprobar que no se crea la imagen en el propio disco
#*/ ##
#/**
# ogCreateImage int_ndisk int_npartition str_repo path_image [str_tools] [str_compressionlevel]
## ogCreateImage int_ndisk int_npartition str_repo path_image [str_tools] [str_compressionlevel]
#@brief Crea una imagen a partir de una partición.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -220,7 +197,6 @@ def ogRestoreImageSyntax (imgfile, part, tool=None, level=None):
#@exception OG_ERR_LOCKED particion bloqueada por otra operación.
#@exception OG_ERR_IMAGE error al crear la imagen del sistema.
#@todo Comprobaciones, control de errores, definir parámetros, etc.
#*/ ##
def ogCreateImage (disk, par, container, imgfile, tool='partclone', level='gzip'):
PART = DiskLib.ogDiskToDev (disk, par)
if not PART: return None
@ -269,38 +245,10 @@ def ogCreateImage (disk, par, container, imgfile, tool='partclone', level='gzip'
return not errcode ## reverse to indicate success
#/**
# ogCreateMbrImage int_ndisk str_repo path_image
#@brief Crea una imagen a partir del sector de arranque de un disco.
#@param int_ndisk nº de orden del disco
#@param str_repo repositorio de imágenes (remoto o caché local)
#@param path_image camino de la imagen (sin extensión)
#@return (nada, por determinar)
#@note repo = { REPO, CACHE }
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#@exception OG_ERR_IMAGE error al crear la imagen del sistema.
#*/ ##
#/**
# ogCreateBootLoaderImage int_ndisk str_repo path_image
#@brief Crea una imagen del boot loader a partir del sector de arranque de un disco.
#@param int_ndisk nº de orden del disco
#@param str_repo repositorio de imágenes (remoto o caché local)
#@param path_image camino de la imagen (sin extensión)
#@return (nada, por determinar)
#@note repo = { REPO, CACHE }
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#@exception OG_ERR_IMAGE error al crear la imagen del sistema.
#*/ ##
#/**
# ogGetSizeParameters int_num_disk int_num_part str_repo [monolit|sync|diff]
## ogGetSizeParameters int_num_disk int_num_part str_repo [monolit|sync|diff]
#@brief Devuelve el tamaño de los datos de un sistema de ficheros, el espacio necesario para la imagen y si cabe en el repositorio elegido.
#@param int_disk numero de disco
#@param int_part numero de particion
#@param int_part numero de particion
#@param str_repo repositorio de imágenes { REPO, CACHE }
#@param str_imageName Nombre de la imagen
#@param str_imageType Tipo de imagen: monolit (por defecto), sync o diff. (parametro opcional)
@ -308,9 +256,8 @@ def ogCreateImage (disk, par, container, imgfile, tool='partclone', level='gzip'
#@note si str_imageType= diff necesario /tmp/ogimg.info, que es creado por ogCreateInfoImage.
#@note para el tamaño de la imagen no sigue enlaces simbólicos.
#@exception OG_ERR_FORMAT formato incorrecto.
#*/ ##
#SIZEDATA, SIZEREQUIRED, SIZEFREE, ISENOUGHSPACE = ogGetSizeParameters (1, 1, 'REPO', 'myimg')
def ogGetSizeParameters (disk, par, repo, imgname, imgtype=None):
#SIZEDATA, SIZEREQUIRED, SIZEFREE, ISENOUGHSPACE = ogGetSizeParameters (1, 1, 'REPO', 'myimg')
repo = repo.upper()
## imgtype se soporta como parametro pero se ignora
@ -381,18 +328,16 @@ def ogGetSizeParameters (disk, par, repo, imgname, imgtype=None):
return sizedata, sizerequired, sizefree, isenoughspace
#/**
# ogIsImageLocked [str_repo] path_image
## ogIsImageLocked [str_repo] path_image
#@brief Comprueba si una imagen está bloqueada para uso exclusivo.
#@param str_repo repositorio de imágenes (opcional)
#@param path_image camino de la imagen (sin extensión)
#@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error.
#@note repo = { REPO, CACHE }
#@exception OG_ERR_FORMAT formato incorrecto.
#*/ ##
#ogIsImageLocked ('/opt/opengnsys/images/aula1/win7.img')
#ogIsImageLocked ('REPO', '/aula1/win7.img')
def ogIsImageLocked (container=None, imgfile=None):
#ogIsImageLocked ('/opt/opengnsys/images/aula1/win7.img')
#ogIsImageLocked ('REPO', '/aula1/win7.img')
if container and imgfile:
p = FileLib.ogGetPath (src=container, file=f'{imgfile}.lock')
elif imgfile:
@ -403,8 +348,7 @@ def ogIsImageLocked (container=None, imgfile=None):
return os.path.exists (p)
#/**
# ogLockImage [str_repo] path_image
## ogLockImage [str_repo] path_image
#@brief Bloquea una imagen para uso exclusivo.
#@param str_repo repositorio de imágenes (opcional)
#@param path_image camino de la imagen (sin extensión)
@ -412,7 +356,6 @@ def ogIsImageLocked (container=None, imgfile=None):
#@note Se genera un fichero con extensión .lock
#@note repo = { REPO, CACHE }
#@exception OG_ERR_FORMAT formato incorrecto.
#*/ ##
def ogLockImage (container=None, imgfile=None):
if not imgfile:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, '')
@ -432,26 +375,7 @@ def ogLockImage (container=None, imgfile=None):
return None
#/**
# ogRestoreDiskImage str_repo path_image int_npartition
#@brief Restaura (recupera) una imagen de un disco completo.
#@param str_repo repositorio de imágenes o caché local
#@param path_image camino de la imagen
#@param int_ndisk nº de orden del disco
#@return (por determinar)
#@warning Primera versión en pruebas
#@todo Gestionar bloqueos de disco
#@todo Comprobar que no se intenta restaurar de la caché sobre el mismo disco
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados.
#@exception OG_ERR_LOCKED partición bloqueada por otra operación.
#@exception OG_ERR_IMAGE error al restaurar la imagen del sistema.
#@exception OG_ERR_IMGSIZEPARTITION Tamaño de la particion es menor al tamaño de la imagen.
#*/ ##
#/**
# ogRestoreImage str_repo path_image int_ndisk int_npartition
## ogRestoreImage str_repo path_image int_ndisk int_npartition
#@brief Restaura una imagen de sistema de archivos en una partición.
#@param str_repo repositorio de imágenes o caché local
#@param path_image camino de la imagen
@ -460,13 +384,11 @@ def ogLockImage (container=None, imgfile=None):
#@return (por determinar)
#@exception OG_ERR_FORMAT 1 formato incorrecto.
#@exception OG_ERR_NOTFOUND 2 fichero de imagen o partición no detectados.
#@exception OG_ERR_PARTITION 3 # Error en partición de disco.
#@exception OG_ERR_PARTITION 3 # Error en partición de disco.
#@exception OG_ERR_LOCKED 4 partición bloqueada por otra operación.
#@exception OG_ERR_IMAGE 5 error al restaurar la imagen del sistema.
#@exception OG_ERR_IMGSIZEPARTITION 30 Tamaño de la particion es menor al tamaño de la imagen.
#@todo Comprobar incongruencias partición-imagen, control de errores, definir parámetros, caché/repositorio, etc.
#*/ ##
#ogRestoreImage ('REPO', '/aula1/win7', '1', '1')
def ogRestoreImage (repo, imgpath, disk, par):
PART = DiskLib.ogDiskToDev (disk, par)
if not PART:
@ -528,33 +450,7 @@ def ogRestoreImage (repo, imgpath, disk, par):
#/**
# ogRestoreMbrImage str_repo path_image int_ndisk
#@brief Restaura la imagen del sector de arranque de un disco.
#@param str_repo repositorio de imágenes o caché local
#@param path_image camino de la imagen
#@param int_ndisk nº de orden del disco
#@return (por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados.
#@exception OG_ERR_IMAGE error al restaurar la imagen del sistema.
#*/ ##
#/**
# ogRestoreBootLoaderImage str_repo path_image int_ndisk
#@brief Restaura la imagen del boot loader del sector de arranque de un disco.
#@param str_repo repositorio de imágenes o caché local
#@param path_image camino de la imagen
#@param int_ndisk nº de orden del disco
#@return (por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados.
#@exception OG_ERR_IMAGE error al restaurar la imagen del sistema.
#*/ ##
#/**
# ogUnlockImage [str_repo] path_image
## ogUnlockImage [str_repo] path_image
#@brief Desbloquea una imagen con uso exclusivo.
#@param str_repo repositorio de imágenes (opcional)
#@param path_image camino de la imagen (sin extensión)
@ -562,8 +458,6 @@ def ogRestoreImage (repo, imgpath, disk, par):
#@note repo = { REPO, CACHE }
#@note Se elimina el fichero de bloqueo con extensión .lock
#@exception OG_ERR_FORMAT formato incorrecto.
#*/ ##
#ogUnlockImage REPO /cucu.img
def ogUnlockImage (container=None, imgfile=None):
f = f'{imgfile}.lock'
if container:
@ -575,8 +469,7 @@ def ogUnlockImage (container=None, imgfile=None):
os.unlink (p)
#/**
# ogGetImageInfo filename
## ogGetImageInfo filename
#@brief muestra información sobre la imagen monolitica.
#@param 1 filename path absoluto del fichero imagen
#@return cadena compuesta por clonacion:compresor:sistemaarchivos:tamañoKB
@ -587,9 +480,8 @@ def ogUnlockImage (container=None, imgfile=None):
#@TODO Definir sintaxis de salida (herramienta y compresor en minuscula)
#@TODO Arreglar loop para ntfsclone
#@TODO insertar parametros entrada tipo OG
#*/ ##
#ogGetImageInfo /opt/opengnsys/images/prueba.img ==> PARTCLONE:LZOP:NTFS:5642158"
def ogGetImageInfo (imgfile):
#ogGetImageInfo /opt/opengnsys/images/prueba.img ==> PARTCLONE:LZOP:NTFS:5642158"
if not os.path.exists (imgfile):
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, imgfile)
return
@ -726,8 +618,7 @@ def ogGetImageInfo (imgfile):
compressor = compressor.upper()
return ':'.join ([tools, compressor, fs, str (size)])
#/**
# ogGetImageProgram str_REPO str_imagen
## ogGetImageProgram str_REPO str_imagen
#@brief muestra información sobre la imagen monolitica.
#@see ogGetImageInfo
#@param 1 REPO o CACHE contenedor de la imagen
@ -736,9 +627,6 @@ def ogGetImageInfo (imgfile):
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero no encontrado.
#@note ogGetImageProgram REPO imagenA -> partclone
#*/ ##
#ogGetImageProgram ('REPO', 'prueba') ==> 'PARTCLONE'
def ogGetImageProgram (container, filename):
imgfile = FileLib.ogGetPath (container, f'{filename}.img')
if not os.path.exists (imgfile):
@ -747,8 +635,7 @@ def ogGetImageProgram (container, filename):
i = ogGetImageInfo (imgfile)
return i.split (':')[0]
#/**
# ogGetImageCompressor str_REPO str_imagen
## ogGetImageCompressor str_REPO str_imagen
#@brief muestra información sobre la imagen monolitica.
#@see ogGetImageInfo
#@param 1 REPO o CACHE contenedor de la imagen
@ -757,9 +644,6 @@ def ogGetImageProgram (container, filename):
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero no encontrado.
#@note ogGetImageCompressor REPO imagenA -> lzop
#*/ ##
#ogGetImageCompressor ('REPO', 'prueba') ==> 'LZOP'
def ogGetImageCompressor (container, filename):
imgfile = FileLib.ogGetPath (container, f'{filename}.img')
if not os.path.exists (imgfile):
@ -769,8 +653,7 @@ def ogGetImageCompressor (container, filename):
return i.split (':')[1]
#/**
# ogGetImageType str_REPO str_imagen
## ogGetImageType str_REPO str_imagen
#@brief muestra información sobre el sistema de archivos de imagen monolitica.
#@see ogGetImageInfo
#@param 1 REPO o CACHE contenedor de la imagen
@ -779,10 +662,9 @@ def ogGetImageCompressor (container, filename):
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero no encontrado.
#@note ogGetImageType REPO imagenA -> NTFS
#*/ ##
#ogGetImageType ('REPO', 'imgprueba') ==> 'NTFS'
#ogGetImageType ('CACHE', 'testimg') ==> 'EXTFS'
def ogGetImageType (repo, imgname):
#ogGetImageType ('REPO', 'imgprueba') ==> 'NTFS'
#ogGetImageType ('CACHE', 'testimg') ==> 'EXTFS'
imgfile = FileLib.ogGetPath (src=repo, file=f'{imgname}.img')
if not os.path.exists (imgfile):
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, imgfile)
@ -793,8 +675,7 @@ def ogGetImageType (repo, imgname):
#/**
# ogGetImageSize str_REPO str_imagen
## ogGetImageSize str_REPO str_imagen
#@brief muestra información sobre el tamaño (KB) del sistema de archivos de imagen monolitica.
#@see ogGetImageInfo
#@param 1 REPO o CACHE contenedor de la imagen
@ -803,8 +684,6 @@ def ogGetImageType (repo, imgname):
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero no encontrado.
#@note ogGetImagesize REPO imagenA -> 56432234 > Kb
#*/ ##
#ogGetImageSize ('REPO', 'prueba') ==> '5642158'
def ogGetImageSize (repo, imgname):
imgfile = FileLib.ogGetPath (src=repo, file=f'{imgname}.img')
if not os.path.exists (imgfile):
@ -813,29 +692,3 @@ def ogGetImageSize (repo, imgname):
i = ogGetImageInfo (imgfile)
return i.split (':')[3]
#/**
# ogCreateGptImage int_ndisk str_repo path_image
#@brief Crea una imagen de la tabla de particiones GPT de un disco.
#@param int_ndisk nº de orden del disco
#@param str_repo repositorio de imágenes (remoto o caché local)
#@param path_image camino de la imagen (sin extensión)
#@return (nada, por determinar)
#@note repo = { REPO, CACHE }
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#@exception OG_ERR_IMAGE error al crear la imagen del sistema.
#*/ ##
#/**
# ogRestoreGptImage str_repo path_image int_ndisk
#@brief Restaura la imagen de la tabla de particiones GPT de un disco.
#@param str_repo repositorio de imágenes o caché local
#@param path_image camino de la imagen
#@param int_ndisk nº de orden del disco
#@return (por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados.
#@exception OG_ERR_IMAGE error al restaurar la imagen del sistema.
#*/ ##

View File

@ -1,10 +1,8 @@
#/**
#@file InventoryLib.py
##@file InventoryLib.py
#@brief Librería o clase Inventory
#@class Inventory
#@brief Funciones para recogida de datos de inventario de hardware y software de los clientes.
#@warning License: GNU GPLv3+
#*/
import platform
import sys
@ -24,11 +22,9 @@ import RegistryLib
import FileLib
#/**
# ogGetArch
## ogGetArch
#@brief Devuelve el tipo de arquitectura del cliente.
#@return str_arch - Arquitectura (i386 para 32 bits, x86_64 para 64 bits).
#*/
def ogGetArch():
if os.path.isdir ('/lib64'):
return 'x86_64'
@ -36,14 +32,12 @@ def ogGetArch():
return 'i386'
#/**
# ogGetOsType int_ndisk int_npartition
## ogGetOsType int_ndisk int_npartition
#@brief Devuelve el tipo del sistema operativo instalado.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@return OSType - Tipo de sistema operativo.
#@see ogGetOsVersion
#*/ ##
def ogGetOsType(disk, partition):
try:
os_version = ogGetOsVersion(disk, partition)
@ -56,15 +50,13 @@ def ogGetOsType(disk, partition):
return "Unknown"
#/**
# ogGetOsUuid int_ndisk int_nfilesys
## ogGetOsUuid int_ndisk int_nfilesys
#@brief Devuelve el UUID del sistema operativo instalado en un sistema de archivos.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden de la partición
#@return str_uuid - UUID del sistema operativo.
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositiv
#*/ ##
def ogGetOsUuid (disk, par):
mntdir = FileSystemLib.ogMount (disk, par)
if not mntdir: return None
@ -83,10 +75,8 @@ def ogGetOsUuid (disk, par):
return uuid
#/**
# ogGetSerialNumber
## ogGetSerialNumber
#@brief Obtiene el nº de serie del cliente.
#*/ ##
def ogGetSerialNumber():
SERIALNO = subprocess.check_output(["dmidecode", "-s", "system-serial-number"]).decode().strip()
SERIALNO = re.sub(r"(not specified|to be filled|invalid entry|default string)", "", SERIALNO, flags=re.IGNORECASE)
@ -96,22 +86,18 @@ def ogGetSerialNumber():
return None
#/**
# ogIsEfiActive
## ogIsEfiActive
#@brief Comprueba si el sistema tiene activo el arranque EFI.
#*/ ##
def ogIsEfiActive():
return os.path.isdir("/sys/firmware/efi")
#/**
# ogListHardwareInfo
## ogListHardwareInfo
#@brief Lista el inventario de hardware de la máquina cliente.
#@return TipoDispositivo:Modelo (por determinar)
#@warning Se ignoran los parámetros de entrada.
#@note TipoDispositivo = { bio, boa, bus, cha, cdr, cpu, dis, fir, mem, mod, mul, net, sto, usb, vga }
#@note Requisitos: dmidecode, lshw, awk
#*/ ##
def ogListHardwareInfo():
ret = ''
@ -176,8 +162,7 @@ def ogListHardwareInfo():
return ret
#/**
# ogListSoftware int_ndisk int_npartition
## ogListSoftware int_ndisk int_npartition
#@brief Lista el inventario de software instalado en un sistema operativo.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -185,7 +170,6 @@ def ogListHardwareInfo():
#@warning Se ignoran los parámetros de entrada.
#@note Requisitos: ...
#@todo Detectar software en Linux
#*/ ##
def ogListSoftware (disk, par):
mntdir = FileSystemLib.ogMount (disk, par)
if not mntdir: return None
@ -332,8 +316,7 @@ def _find_key_recursive(plist_dict, key_substr):
return value
return ''
#/**
# ogGetOsVersion int_ndisk int_nfilesys
## ogGetOsVersion int_ndisk int_nfilesys
#@brief Devuelve la versión del sistema operativo instalado en un sistema de archivos.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden de la partición
@ -343,9 +326,8 @@ def _find_key_recursive(plist_dict, key_substr):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositiv
#@exception OG_ERR_PARTITION Fallo al montar el sistema de archivos.
#*/ ##
#ogGetOsVersion ("1", "2") => "Linux:Ubuntu precise (12.04 LTS) 64 bits"
def ogGetOsVersion(disk, part):
#ogGetOsVersion ("1", "2") => "Linux:Ubuntu precise (12.04 LTS) 64 bits"
mntdir = FileSystemLib.ogMount (disk, part)
if not mntdir:
return None
@ -462,15 +444,14 @@ def ogGetOsVersion(disk, part):
# Para cargador Windows: buscar versión en fichero BCD (basado en os-prober).
if not version:
type = 'WinLoader'
file = FileLib.ogGetPath (file=f'{mntdir}/boot/bcd')
if not file:
file = FileLib.ogGetPath (file=f'{mntdir}/EFI/Microsoft/boot/bcd')
if file:
find_out = subprocess.run (['find', mntdir, '-type', 'f'], capture_output=True, text=True).stdout
bcd_files = list (filter (lambda x: 'Boot/BCD' in x, find_out.splitlines()))
if bcd_files:
for distrib in 'Windows Recovery', 'Windows Boot':
with open (file, 'rb') as fd:
contents = fd.read()
distrib_utf16_regex = re.sub (r'(.)', '\\1.', distrib)
distrib_utf16_regex = bytes (distrib_utf16_regex, 'ascii')
with open (bcd_files[0], 'rb') as fd:
contents = fd.read()
if re.search (distrib_utf16_regex, contents):
version = f'{distrib} loader'
# Para macOS: detectar kernel y completar con fichero plist de información del sistema.

View File

@ -1,10 +1,8 @@
#/**
#@file NetLib.py
##@file NetLib.py
#@brief Librería o clase Net
#@class Net
#@brief Funciones básicas de red.
#@warning License: GNU GPLv3+
#*/
import subprocess
import sys
@ -32,13 +30,11 @@ def _ogConnect (server, protocol, src, dst, options, readonly):
return not subprocess.run (['mount.cifs', f'//{server}/{src}', dst] + options.split()).returncode
#/**
# ogChangeRepo IPREPO [ OgUnit ]
## ogChangeRepo IPREPO [ OgUnit ]
#@brief Cambia el repositorio para el recurso remoto images.
#@param 1 Ip Repositorio
#@param 2 Abreviatura Unidad Organizativa
#@return Cambio recurso remoto en OGIMG.
#*/
def ogChangeRepo (ip_repo):
ogprotocol = os.environ.get ('ogprotocol', 'smb')
@ -67,14 +63,12 @@ def ogChangeRepo (ip_repo):
SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_GENERIC, f'Error executing ogChangeRepo: {e}')
return None
#/**
# ogGetGroupDir [ str_repo ]
## ogGetGroupDir [ str_repo ]
#@brief Devuelve el camino del directorio para el grupo del cliente.
#@param str_repo repositorio de imágenes (opcional)
#@return path_dir - Camino al directorio del grupo.
#@note repo = { REPO, CACHE } REPO por defecto
#@exception OG_ERR_FORMAT formato incorrecto.
#*/
def ogGetGroupDir(repo=None):
try:
repo = repo or "REPO"
@ -95,11 +89,9 @@ def ogGetGroupDir(repo=None):
)
return None
#/**
# ogGetGroupName
## ogGetGroupName
#@brief Devuelve el nombre del grupo al que pertenece el cliente.
#@return str_group - Nombre de grupo.
#*/
def ogGetGroupName():
try:
group = globals().get("group", None)
@ -108,11 +100,9 @@ def ogGetGroupName():
print(f"Error in ogGetGroupName: {e}")
return None
#/**
# ogGetHostname
## ogGetHostname
#@brief Muestra el nombre del cliente.
#@return str_host - nombre de máquina
#*/ ##
def ogGetHostname():
# Tomar nombre de la variable HOSTNAME
host = os.getenv("HOSTNAME", "").strip()
@ -135,12 +125,10 @@ def ogGetHostname():
return entry.split("=")[1].strip()
#/**
# ogGetIpAddress
## ogGetIpAddress
#@brief Muestra la dirección IP del sistema
#@return str_ip - Dirección IP
#@note Usa las variables utilizadas por el initrd "/etc/net-ethX.conf
#*/ ##
def ogGetIpAddress():
if "IPV4ADDR" in os.environ:
ip = os.environ["IPV4ADDR"]
@ -167,11 +155,9 @@ def ogGetIpAddress():
return addresses[0]
#/**
# ogGetMacAddress
## ogGetMacAddress
#@brief Muestra la dirección Ethernet del cliente.
#@return str_ether - Dirección Ethernet
#*/ ##
def ogGetMacAddress():
try:
if "DEVICE" in os.environ:
@ -211,27 +197,9 @@ def ogGetMacAddress():
print(f"Unexpected error: {str(e)}")
return None
#/**
# ogGetNetInterface
#@brief Muestra la interfaz de red del sistema
#@return str_interface - interfaz de red
#@note Usa las variables utilizadas por el initrd "/etc/net-ethX.conf
#*/ ##
#def ogGetNetInterface():
# if len(sys.argv) >= 2 and sys.argv[1] == "help":
# SystemLib.ogHelp("ogGetNetInterface", "ogGetNetInterface", "ogGetNetInterface => eth0")
# return
#
# if "DEVICE" in os.environ:
# print(os.environ["DEVICE"])
#
# return 0
#/**
# ogGetRepoIp
## ogGetRepoIp
#@brief Muestra la dirección IP del repositorio de datos.
#@return str_ip - Dirección IP
#*/ ##
def ogGetRepoIp():
out = subprocess.run (["findmnt", "--json", "--output", "SOURCE,FSTYPE", ogGlobals.OGIMG], capture_output=True, text=True).stdout
try:
@ -248,48 +216,15 @@ def ogGetRepoIp():
return None
#/**
# ogGetServerIp
## ogGetServerIp
#@brief Muestra la dirección IP del Servidor de OpenGnSys.
#@return str_ip - Dirección IP
#@note Comprobacion segun protocolo de conexion al Repo
#*/ ##
def ogGetServerIp():
return os.environ.get ('ogcore', '')
#/**
# ogGetServerPort
## ogGetServerPort
#@brief Muestra el puerto del Servidor de OpenGnSys.
#@return str_port - Puerto
#*/ ##
def ogGetServerPort():
return os.environ.get ('ogcore_port', '8443')
#/**
# ogMakeGroupDir [ str_repo ]
#@brief Crea el directorio para el grupo del cliente.
#@param str_repo repositorio de imágenes (opcional)
#@return (nada)
#@note repo = { REPO, CACHE } REPO por defecto
#@exception OG_ERR_FORMAT formato incorrecto.
#*/
#def ogMakeGroupDir():
# REPO = ""
# DIR = ""
# GROUP = ""
#
# if len(sys.argv) < 2:
# SystemLib.ogHelp("ogMakeGroupDir", "ogMakeGroupDir str_repo", "ogMakeGroupDir", "ogMakeGroupDir REPO")
# return
#
# if len(sys.argv) == 1:
# REPO = "REPO"
# else:
# REPO = sys.argv[1]
#
# DIR = FileLib.ogGetPath(REPO, "/groups/" + ogGetGroupName(), stderr=subprocess.DEVNULL)
# if DIR:
# subprocess.run(["mkdir", "-p", DIR], stderr=subprocess.DEVNULL)
#
# return 0

View File

@ -1,10 +1,8 @@
#/**
#@file PostConfLib.py
##@file PostConfLib.py
#@brief Librería o clase PostConf
#@class PostConf
#@brief Funciones para la postconfiguración de sistemas operativos.
#@warning License: GNU GPLv3+
#*/
import os
import re
@ -20,8 +18,7 @@ import RegistryLib
import InventoryLib
import BootLib
#/**
# ogCleanOs int_ndisk int_nfilesys
## ogCleanOs int_ndisk int_nfilesys
#@brief Elimina los archivos que no son necesarios en el sistema operativo.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
@ -30,8 +27,6 @@ import BootLib
#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
#@note Antes incluido en la funcion ogReduceFs
#@return (nada)
#*/ ##
#ogCleanOs (1, 1)
def ogCleanOs (disk, par):
t = InventoryLib.ogGetOsType (disk, par)
if 'Linux' == t:
@ -46,11 +41,9 @@ def ogCleanOs (disk, par):
#/**
# ogInstallMiniSetup int_ndisk int_npartition str_filename [str_admuser str_admpassword bool_autologin [str_autouser str_autopassword] ]
## ogInstallMiniSetup int_ndisk int_npartition str_filename [str_admuser str_admpassword bool_autologin [str_autouser str_autopassword] ]
#@brief Metafunción para instalar archivo que se ejecutará en el arranque de Windows.
#@see ogInstallFirstBoot ogInstallRunonce
#*/ ##
def ogInstallMiniSetup (disk, par, cmdfile, user=None, pwd=None, autologin=False, userauto=None, pwdauto=None):
if user:
ogInstallRunonce (disk, par, cmdfile, user, pwd, autologin, userauto, pwdauto)
@ -58,8 +51,7 @@ def ogInstallMiniSetup (disk, par, cmdfile, user=None, pwd=None, autologin=False
ogInstallFirstBoot (disk, par, cmdfile)
#/**
# ogInstallFirstBoot int_ndisk int_npartition str_filename
## ogInstallFirstBoot int_ndisk int_npartition str_filename
#@brief Crea unas claves del registro y el archivo cmd que se ejecutara en el primer arranque estando la maquina en un estado bloqueado
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -67,8 +59,6 @@ def ogInstallMiniSetup (disk, par, cmdfile, user=None, pwd=None, autologin=False
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@note El archivo estará en system32 y será visible por el sistema.
#*/ ##
#ogInstallFirstBoot ('1', '1', 'filename.cmd')
def ogInstallFirstBoot (disk, par, cmdfile):
mntdir = FileSystemLib.ogMount (disk, par)
if not mntdir: return
@ -95,8 +85,7 @@ def ogInstallFirstBoot (disk, par, cmdfile):
RegistryLib.ogSetRegistryValue (mntdir, 'SYSTEM', r'\Setup\CmdLine', f'cmd.exe /c {bn}')
#/**
# ogInstallRunonce int_ndisk int_npartition str_filename str_adm_user str_adm_password bool_autologin [str_auto_user str_auto_password]
## ogInstallRunonce int_ndisk int_npartition str_filename str_adm_user str_adm_password bool_autologin [str_auto_user str_auto_password]
#@brief Crea el archivo cmd que se ejecutara en el runonce de un usuario administrador
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -108,10 +97,9 @@ def ogInstallFirstBoot (disk, par, cmdfile):
#@param str_auto_password Password del usuario que hara autologin
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#*/ ##
#ogInstallRunonce ('1', '1', 'filename.cmd', 'administrator', 'passadmin', '1', 'userauto', 'pwdauto')
#ogInstallRunonce ('1', '1', 'filename.cmd', 'administrator', 'passadmin', '0')
def ogInstallRunonce (disk, par, cmdfile, user, pwd, autologin, userauto=None, pwdauto=None):
#ogInstallRunonce ('1', '1', 'filename.cmd', 'administrator', 'passadmin', '1', 'userauto', 'pwdauto')
#ogInstallRunonce ('1', '1', 'filename.cmd', 'administrator', 'passadmin', '0')
mountpoint = FileLib.ogGetPath (src=f'{disk} {par}', file='/')
for i in ['winnt', 'windows']:
dir = FileLib.ogGetPath (file=f'{mountpoint}/{i}/system32')
@ -148,18 +136,14 @@ def ogInstallRunonce (disk, par, cmdfile, user, pwd, autologin, userauto=None, p
RegistryLib.ogDeleteRegistryValue (mountpoint, 'software', r'\Microsoft\Windows NT\CurrentVersion\Winlogon\ForceAutoLockOnLogon')
RegistryLib.ogDeleteRegistryValue (mountpoint, 'software', r'\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoLogonCount')
#/**
# ogAddCmd int_ndisk int_npartition str_filename str_commands
## ogAddCmd int_ndisk int_npartition str_filename str_commands
#@brief Añade comandos al cmd creado por ogInstalMiniSetup
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@param str_filename nombre del fichero cmd (siempre se guardara en windows\system32\para que sea visible por el sistema
#@param str_commands comando o comandos que se añadiran al fichero
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#*/ ##
#ogAddCmd ('1', '1', 'filename.cmd', 'command')
def ogAddCmd (disk, par, cmdfile, cmd):
mountpoint = FileSystemLib.ogMount (disk, par)
if not mountpoint: return
@ -175,24 +159,7 @@ def ogAddCmd (disk, par, cmdfile, cmd):
fd.write (cmd + '\n')
#/**
# ogDomainScript int_ndisk int_npartition str_domain str_user str_password
#@brief Crea un script .vbs para unir al dominio una maquina windows y el comando adequado en el archivo cmd creado por ogInstallMiniSetup
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
#@param str_filename nombre del fichero cmd donde deberemos introducir el comando de ejecutar el script vbs
#@param str_domain dominio donde se quiere conectar
#@param str_user usuario con privilegios para unir al dominio
#@param str_password password del usuario con privilegios
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#*/ ##
### PRUEBAS.
#/**
# ogConfigureOgagent int_ndisk int_filesys
## ogConfigureOgagent int_ndisk int_filesys
#@brief Modifica el fichero de configuración del nuevo agente OGAent para sistemas operativos.
#@param int_ndisk nº de orden del disco
#@param int_filesys nº de orden del sistema de archivos
@ -200,7 +167,6 @@ def ogAddCmd (disk, par, cmdfile, cmd):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero o dispositivo no encontrado.
#@exception OG_ERR_LOCKED Sistema de archivos bloqueado.
#*/ ##
def ogConfigureOgagent (disk, par, imgname=''):
mntdir = FileSystemLib.ogMount (disk, par)
if not mntdir:
@ -238,36 +204,7 @@ def ogConfigureOgagent (disk, par, imgname=''):
os.rename (cfgfile_patched, cfgfile)
#/**
# ogInstallLaunchDaemon int_ndisk int_nfilesys str_filename
#@brief Instala archivo que se ejecutará en el arranque de macOS.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
#@param str_filename nombre del script
#return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero o directorio no encontrado.
#@npte Crea ficheros de configuración /Library/LaunchDaemon/es.opengnsys.Script.plist.
#*/ ##
### PRUEBAS.
#/**
# ogAddToLaunchDaemon int_ndisk int_nfilesys str_filename str_commands
#@brief Añade comandos al script creado por ogInstalLaunchDaemon.
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
#@param str_filename nombre del script (siempre se guardará en /usr/share para que sea visible por el sistema
#@param str_commands comando o comandos que se añadiran al fichero
#return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Fichero o directorio no encontrado.
#*/ ##
#/**
# ogUninstallLinuxClient int_ndisk int_filesys
## ogUninstallLinuxClient int_ndisk int_filesys
#@brief Desinstala el cliente OpenGnSys para sistemas operativos GNU/Linux.
#@param int_ndisk nº de orden del disco
#@param int_filesys nº de orden del sistema de archivos
@ -275,7 +212,6 @@ def ogConfigureOgagent (disk, par, imgname=''):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Paritición o sistema de archivos incorrectos.
#@exception OG_ERR_LOCKED Sistema de archivos bloqueado.
#*/ ##
def ogUninstallLinuxClient (disk, par):
mntdir = FileSystemLib.ogMount (disk, par)
if not mntdir:
@ -300,8 +236,7 @@ def ogUninstallLinuxClient (disk, par):
subprocess.run (['sed', '-i', '-e', '/ogAdmLnxClient/ d', f], stderr=subprocess.DEVNULL)
#/**
# ogUninstallWindowsClient int_ndisk int_filesys str_filename
## ogUninstallWindowsClient int_ndisk int_filesys str_filename
#@brief Desinstala el cliente OpenGnSys para sistemas operativos Windows.
#@param int_ndisk nº de orden del disco
#@param int_npartition nº de orden de la partición
@ -310,7 +245,6 @@ def ogUninstallLinuxClient (disk, par):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_PARTITION Paritición o sistema de archivos incorrectos.
#@exception OG_ERR_LOCKED Sistema de archivos bloqueado.
#*/ ##
#ogUninstallWindowsClient ('1', '1', 'filename.cmd')
def ogUninstallWindowsClient (disk, par, cmdfile):
mntdir = FileSystemLib.ogMount (disk, par)

View File

@ -1,4 +1,8 @@
#!/usr/bin/python3
##@file ProtocolLib.py
#@brief Librería o clase Protocol
#@class Protocol
#@brief Funciones de protocolo de red
#@warning License: GNU GPLv3+
import subprocess
import re
@ -16,19 +20,16 @@ import DiskLib
import FileLib
import CacheLib
#/**
#@file ProtocolLib.py
#@brief Librería o clase Protocol
#@class Protocol
#@brief Funciones para transmisión de datos
#@warning License: GNU GPLv3+
#*/
##################### FUNCIONES UNICAST ################
#/**
# ogUcastSyntax
## ogUcastSyntax
#@brief Función para generar la instrucción de transferencia de datos unicast
#@param 1 Tipo de operación [ SENDPARTITION RECEIVERPARTITION SENDFILE RECEIVERFILE ]
#@param 2 Sesion Unicast
@ -40,15 +41,11 @@ import CacheLib
#@exception OG_ERR_UCASTSYNTAXT formato de la sesion unicast incorrecta.
#@note Requisitos: mbuffer
#@todo: controlar que mbuffer esta disponible para los clientes.
#*/ ##
#ogUcastSyntax SENDPARTITION 8000:172.17.36.11:172.17.36.12 device tool level
#ogUcastSyntax RECEIVERPARTITION 8000:172.17.36.249 device tool level
#ogUcastSyntax SENDFILE 8000:172.17.36.11:172.17.36.12 file
#ogUcastSyntax RECEIVERFILE 8000:172.17.36.249 file
def ogUcastSyntax (op, sess, file=None, device=None, tool=None, level=None):
#ogUcastSyntax SENDPARTITION 8000:172.17.36.11:172.17.36.12 device tool level
#ogUcastSyntax RECEIVERPARTITION 8000:172.17.36.249 device tool level
#ogUcastSyntax SENDFILE 8000:172.17.36.11:172.17.36.12 file
#ogUcastSyntax RECEIVERFILE 8000:172.17.36.249 file
if 'SENDPARTITION' == op or 'RECEIVERPARTITION' == op:
if device is None:
raise TypeError ('missing required argument: "device"')
@ -106,22 +103,19 @@ def ogUcastSyntax (op, sess, file=None, device=None, tool=None, level=None):
pass ## shouldn't happen
#/**
# ogUcastSendPartition
## ogUcastSendPartition
#@brief Función para enviar el contenido de una partición a multiples particiones remotas usando UNICAST.
#@param 1 disk
#@param 2 partition
#@param 3 sesionUcast
#@param 4 tool image
#@param 5 tool compresor
#@return
#@exception $OG_ERR_FORMAT
#@exception $OG_ERR_UCASTSENDPARTITION
#@note
#@todo: ogIsLocked siempre devuelve 1
#*/ ##
#ogUcastSendPartition 1 2 8001:192.168.1.113 partclone lzop
def ogUcastSendPartition (disk, par, sess, tool, level):
#ogUcastSendPartition 1 2 8001:192.168.1.113 partclone lzop
PART = DiskLib.ogDiskToDev (disk, par)
if not PART: return None
@ -137,22 +131,19 @@ def ogUcastSendPartition (disk, par, sess, tool, level):
#/**
# ogUcastReceiverPartition
## ogUcastReceiverPartition
#@brief Función para recibir directamente en la partición el contenido de un fichero imagen remoto enviado por UNICAST.
#@param 1 disk
#@param 2 partition
#@param 3 session unicast
#@param 4 tool image
#@param 5 tool compresor
#@return
#@exception OG_ERR_FORMAT
#@exception OG_ERR_UCASTRECEIVERPARTITION
#@note
#@todo:
#*/ ##
#ogUcastReceiverPartition 1 1 8001:192.168.1.111 partclone lzop
def ogUcastReceiverPartition (disk, par, sess, tool, level):
#ogUcastReceiverPartition 1 1 8001:192.168.1.111 partclone lzop
PART = DiskLib.ogDiskToDev (disk, par)
if not PART: return None
@ -168,32 +159,25 @@ def ogUcastReceiverPartition (disk, par, sess, tool, level):
#/**
# ogUcastSendFile [ str_repo | int_ndisk int_npart ] /Relative_path_file sessionMulticast
## ogUcastSendFile [ str_repo | int_ndisk int_npart ] /Relative_path_file sessionMulticast
#@brief Envía un fichero por unicast ORIGEN(fichero) DESTINO(sessionmulticast)
#@param (2 parámetros) $1 path_aboluto_fichero $2 sesionMcast
#@param (3 parámetros) $1 Contenedor REPO|CACHE $2 path_absoluto_fichero $3 sesionMulticast
#@param (4 parámetros) $1 disk $2 particion $3 path_absoluto_fichero $4 sesionMulticast
#@return
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception $OG_ERR_NOTFOUND
#@exception OG_ERR_UCASTSENDFILE
#@note Requisitos:
#*/ ##
#
## TODO esta función es idéntica a ogMcastSendFile pero con s/Ucast/Mcast/;
#ogUcastSendFile ([str_REPOSITORY] [int_ndisk int_npart] /Relative_path_file sesionMcast(puerto:ip:ip:ip)" \
#ogUcastSendFile (disk=1, par=1, file='/aula1/winxp.img', sess='8000:172.17.36.11:172.17.36.12')
#ogUcastSendFile (container='REPO', file='/aula1/ubuntu.iso', sess='sesionUcast')
#ogUcastSendFile (container='CACHE', file='/aula1/winxp.img', sess='sesionUcast')
#ogUcastSendFile ( file='/opt/opengnsys/images/aula1/hd500.vmx', sess='sesionUcast')
#ogUcastSendFile 1 2 /boot/vmlinuz-6.8.0-51-generic 8000:192.168.1.113
#ogUcastSendFile 1 4 /swapfile.sys 8000:192.168.1.111
#ogUcastSendFile REPO /ubu24.img 8000:192.168.1.111
def ogUcastSendFile (disk=None, par=None, container=None, file=None, sess=None):
## TODO esta función es idéntica a ogMcastSendFile pero con s/Ucast/Mcast/;
#ogUcastSendFile ([str_REPOSITORY] [int_ndisk int_npart] /Relative_path_file sesionMcast(puerto:ip:ip:ip)" \
#ogUcastSendFile (disk=1, par=1, file='/aula1/winxp.img', sess='8000:172.17.36.11:172.17.36.12')
#ogUcastSendFile (container='REPO', file='/aula1/ubuntu.iso', sess='sesionUcast')
#ogUcastSendFile (container='CACHE', file='/aula1/winxp.img', sess='sesionUcast')
#ogUcastSendFile ( file='/opt/opengnsys/images/aula1/hd500.vmx', sess='sesionUcast')
#ogUcastSendFile 1 2 /boot/vmlinuz-6.8.0-51-generic 8000:192.168.1.113
#ogUcastSendFile 1 4 /swapfile.sys 8000:192.168.1.111
#ogUcastSendFile REPO /ubu24.img 8000:192.168.1.111
if file is None:
raise TypeError ('missing required argument: "file"')
if sess is None:
@ -258,8 +242,7 @@ def _binary_ip (ip):
break
return match
#/**
# ogMcastSyntax
## ogMcastSyntax
#@brief Función para generar la instrucción de ejucción la transferencia de datos multicast
#@param 1 Tipo de operación [ SENDPARTITION RECEIVERPARTITION SENDFILE RECEIVERFILE ]
#@param 2 Sesión Mulicast
@ -272,17 +255,13 @@ def _binary_ip (ip):
#@exception OG_ERR_MCASTSYNTAXT
#@note Requisitos: upd-cast 2009 o superior
#@todo localvar check versionudp
#*/ ##
#
#ogMcastSyntax SENDPARTITION 9000:full-duplex|half-duplex|broadcast:239.194.17.36:80M:50:60 device tools level
#ogMcastSyntax RECEIVERPARTITION 9000 device tools level
#ogMcastSyntax RECEIVERPARTITION 9000:172.17.88.161:40:120 device tools level
#ogMcastSyntax SENDFILE 9000:full-duplex|half-duplex|broadcast:239.194.17.36:80M:50:60 file
#ogMcastSyntax RECEIVERFILE 9000 file
#ogMcastSyntax RECEIVERFILE 9000:172.17.88.161:40:120 file
def ogMcastSyntax (op, sess, file=None, device=None, tool=None, level=None):
#ogMcastSyntax SENDPARTITION 9000:full-duplex|half-duplex|broadcast:239.194.17.36:80M:50:60 device tools level
#ogMcastSyntax RECEIVERPARTITION 9000 device tools level
#ogMcastSyntax RECEIVERPARTITION 9000:172.17.88.161:40:120 device tools level
#ogMcastSyntax SENDFILE 9000:full-duplex|half-duplex|broadcast:239.194.17.36:80M:50:60 file
#ogMcastSyntax RECEIVERFILE 9000 file
#ogMcastSyntax RECEIVERFILE 9000:172.17.88.161:40:120 file
if 'SENDPARTITION' == op or 'RECEIVERPARTITION' == op:
if device is None:
raise TypeError ('missing required argument: "device"')
@ -431,29 +410,23 @@ def ogMcastSyntax (op, sess, file=None, device=None, tool=None, level=None):
#/**
# ogMcastSendFile [ str_repo | int_ndisk int_npart ] /Relative_path_file sessionMulticast
## ogMcastSendFile [ str_repo | int_ndisk int_npart ] /Relative_path_file sessionMulticast
#@brief Envía un fichero por multicast ORIGEN(fichero) DESTINO(sessionmulticast)
#@param (2 parámetros) $1 path_aboluto_fichero $2 sesionMcast
#@param (3 parámetros) $1 Contenedor REPO|CACHE $2 path_absoluto_fichero $3 sesionMulticast
#@param (4 parámetros) $1 disk $2 particion $3 path_absoluto_fichero $4 sesionMulticast
#@return
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception $OG_ERR_NOTFOUND
#@exception OG_ERR_MCASTSENDFILE
#*/ ##
#
#ogMcastSendFile [str_REPOSITORY] [int_ndisk int_npart] /Relative_path_file sesionMcast" \
#ogMcastSendFile (disk=1, par=1, file='/aula1/winxp.img', sess='sesionMcast')
#ogMcastSendFile (container='REPO', file='/aula1/ubuntu.iso', sess='sesionMcast')
#ogMcastSendFile (container='CACHE', file='/aula1/winxp.img', sess='sesionMcast')
#ogMcastSendFile ( file='/opt/opengnsys/images/aula1/hd500.vmx', sess='sesionMcast')
#ogMcastSendFile 1 2 /boot/vmlinuz-6.8.0-51-generic 9000:full-duplex:239.194.37.31:50M:20:10
#ogMcastSendFile REPO /ubu24.img 9000:full-duplex:239.194.37.31:50M:20:10
#ogMcastSendFile /usr/lib64/ld-linux-x86-64.so.2 9000:full-duplex:239.194.37.31:50M:20:10
def ogMcastSendFile (disk=None, par=None, container=None, file=None, sess=None):
#ogMcastSendFile [str_REPOSITORY] [int_ndisk int_npart] /Relative_path_file sesionMcast" \
#ogMcastSendFile (disk=1, par=1, file='/aula1/winxp.img', sess='sesionMcast')
#ogMcastSendFile (container='REPO', file='/aula1/ubuntu.iso', sess='sesionMcast')
#ogMcastSendFile (container='CACHE', file='/aula1/winxp.img', sess='sesionMcast')
#ogMcastSendFile ( file='/opt/opengnsys/images/aula1/hd500.vmx', sess='sesionMcast')
#ogMcastSendFile 1 2 /boot/vmlinuz-6.8.0-51-generic 9000:full-duplex:239.194.37.31:50M:20:10
#ogMcastSendFile REPO /ubu24.img 9000:full-duplex:239.194.37.31:50M:20:10
#ogMcastSendFile /usr/lib64/ld-linux-x86-64.so.2 9000:full-duplex:239.194.37.31:50M:20:10
if file is None:
raise TypeError ('missing required argument: "file"')
if sess is None:
@ -498,26 +471,20 @@ def ogMcastSendFile (disk=None, par=None, container=None, file=None, sess=None):
#/**
# ogMcastReceiverFile sesion Multicast [ str_repo | int_ndisk int_npart ] /Relative_path_file
## ogMcastReceiverFile sesion Multicast [ str_repo | int_ndisk int_npart ] /Relative_path_file
#@brief Recibe un fichero multicast ORIGEN(sesionmulticast) DESTINO(fichero)
#@param (2 parámetros) $1 sesionMcastCLIENT $2 path_aboluto_fichero_destino
#@param (3 parámetros) $1 sesionMcastCLIENT $2 Contenedor REPO|CACHE $3 path_absoluto_fichero_destino
#@param (4 parámetros) $1 sesionMcastCLIENT $2 disk $3 particion $4 path_absoluto_fichero_destino
#@return
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception $OG_ERR_MCASTRECEIVERFILE
#@note Requisitos:
#*/ ##
#
#ogMcastReceiverFile ([ str_portMcast] [ [Relative_path_file] | [str_REPOSITORY path_file] | [int_ndisk int_npart path_file ] ]" \
#ogMcastReceiverFile ( file='/PS1_PH1.img', sess='9000')
#ogMcastReceiverFile (container='CACHE', file='/aula1/PS2_PH4.img', sess='9000')
#ogMcastReceiverFile (disk=1, par=1, file='/isos/linux.iso', sess='9000')
#ogMcastReceiverFile 9000:full-duplex:239.194.37.31 1 4 /hola
def ogMcastReceiverFile (disk=None, par=None, container=None, file=None, sess=None):
#ogMcastReceiverFile ([ str_portMcast] [ [Relative_path_file] | [str_REPOSITORY path_file] | [int_ndisk int_npart path_file ] ]" \
#ogMcastReceiverFile ( file='/PS1_PH1.img', sess='9000')
#ogMcastReceiverFile (container='CACHE', file='/aula1/PS2_PH4.img', sess='9000')
#ogMcastReceiverFile (disk=1, par=1, file='/isos/linux.iso', sess='9000')
#ogMcastReceiverFile 9000:full-duplex:239.194.37.31 1 4 /hola
if file is None:
raise TypeError ('missing required argument: "file"')
if sess is None:
@ -558,25 +525,21 @@ def ogMcastReceiverFile (disk=None, par=None, container=None, file=None, sess=No
return True
#/**
# ogMcastSendPartition
## ogMcastSendPartition
#@brief Función para enviar el contenido de una partición a multiples particiones remotas.
#@param 1 disk
#@param 2 partition
#@param 3 session multicast
#@param 4 tool clone
#@param 5 tool compressor
#@return
#@exception OG_ERR_FORMAT
#@exception OG_ERR_MCASTSENDPARTITION
#@note
#@todo: ogIsLocked siempre devuelve 1. crear ticket
#*/ ##
#ogMcastSendPartition (disk, par, SessionMulticastSERVER, tools, compresor)
#ogMcastSendPartition (1, 1, '9000:full-duplex:239.194.37.31:50M:20:2', 'partclone', 'lzop')
#ogMcastSendPartition 1 2 9000:full-duplex:239.194.37.31:50M:20:10 partclone lzop
def ogMcastSendPartition (disk, par, sess, tool, compressor):
#ogMcastSendPartition (disk, par, SessionMulticastSERVER, tools, compresor)
#ogMcastSendPartition (1, 1, '9000:full-duplex:239.194.37.31:50M:20:2', 'partclone', 'lzop')
#ogMcastSendPartition 1 2 9000:full-duplex:239.194.37.31:50M:20:10 partclone lzop
PART = DiskLib.ogDiskToDev (disk, par)
if not PART: return
@ -589,19 +552,16 @@ def ogMcastSendPartition (disk, par, sess, tool, compressor):
return None
return True
#/**
# ogMcastReceiverPartition
## ogMcastReceiverPartition
#@brief Función para recibir directamente en la partición el contenido de un fichero imagen remoto enviado por multicast.
#@param 1 disk
#@param 2 partition
#@param 3 session multicast
#@param 4 tool clone
#@param 5 tool compressor
#@return
#@exception $OG_ERR_FORMAT
#*/ ##
#ogMcastReceiverPartition 1 1 9000:full-duplex:239.194.37.31 partclone lzop
def ogMcastReceiverPartition (disk, par, sess, tool, compressor):
#ogMcastReceiverPartition 1 1 9000:full-duplex:239.194.37.31 partclone lzop
PART = DiskLib.ogDiskToDev (disk, par)
if not PART: return
@ -615,10 +575,7 @@ def ogMcastReceiverPartition (disk, par, sess, tool, compressor):
return True
##########################################
############## funciones torrent
#/**
# ogTorrentStart [ str_repo | int_ndisk int_npart ] Relative_path_file.torrent | SessionProtocol
## ogTorrentStart [ str_repo | int_ndisk int_npart ] Relative_path_file.torrent | SessionProtocol
#@brief Función iniciar P2P - requiere un tracker para todos los modos, y un seeder para los modos peer y leecher y los ficheros .torrent.
#@param str_pathDirectory str_Relative_path_file
#@param int_disk int_partition str_Relative_path_file
@ -626,16 +583,14 @@ def ogMcastReceiverPartition (disk, par, sess, tool, compressor):
#@param (2 parámetros) $1 path_aboluto_fichero_torrent $2 Parametros_Session_Torrent
#@param (3 parámetros) $1 Contenedor CACHE $2 path_absoluto_fichero_Torrent $3 Parametros_Session_Torrent
#@param (4 parámetros) $1 disk $2 particion $3 path_absoluto_fichero_Torrent 4$ Parametros_Session_Torrent
#@return
#@note protocoloTORRENT=mode:time mode=seeder -> Dejar el equipo seedeando hasta que transcurra el tiempo indicado o un kill desde consola, mode=peer -> seedear mientras descarga mode=leecher -> NO seedear mientras descarga time tiempo que una vez descargada la imagen queremos dejar al cliente como seeder.
#*/ ##
#ogTorrentStart ( torrentfile='/opt/opengnsys/cache/linux.iso', torrentsess='peer:60')
#ogTorrentStart (container='CACHE', torrentfile='/PS1_PH1.img.torrent', torrentsess='seeder:10000')
#ogTorrentStart (disk=1, par=1, torrentfile='/linux.iso.torrent', torrentsess='leecher:60')
#ogTorrentStart /opt/opengnsys/cache/opt/opengnsys/images/ubu24.EXTFS.torrent seeder:10000
#ogTorrentStart 1 4 /opt/opengnsys/images/ubu24.EXTFS.torrent seeder:10000
#ogTorrentStart CACHE /ubu24.EXTFS.torrent seeder:10000
def ogTorrentStart (disk=None, par=None, container=None, torrentfile=None, torrentsess=None):
#ogTorrentStart ( torrentfile='/opt/opengnsys/cache/linux.iso', torrentsess='peer:60')
#ogTorrentStart (container='CACHE', torrentfile='/PS1_PH1.img.torrent', torrentsess='seeder:10000')
#ogTorrentStart (disk=1, par=1, torrentfile='/linux.iso.torrent', torrentsess='leecher:60')
#ogTorrentStart /opt/opengnsys/cache/opt/opengnsys/images/ubu24.EXTFS.torrent seeder:10000
#ogTorrentStart 1 4 /opt/opengnsys/images/ubu24.EXTFS.torrent seeder:10000
#ogTorrentStart CACHE /ubu24.EXTFS.torrent seeder:10000
if torrentfile is None:
raise TypeError ('missing required argument: "torrentfile"')
if torrentsess is None:
@ -698,22 +653,22 @@ def ogTorrentStart (disk=None, par=None, container=None, torrentfile=None, torre
OPTION = None
cwd = os.getcwd()
# si No fichero .aria2, y Si fichero destino imagen ya descargada y su chequeo fue comprobado en su descarga inicial.
if not os.path.exists (f'{target}.aria2') and os.path.exists (target):
print ('imagen ya descargada')
if 'seeder' != mode: return 'success' ## return any true value
print ('MODE seeder aria2c')
os.chdir (dirsource)
aria2_cmd = [
"aria2c",
"--check-integrity=true",
"--bt-seed-unverified=true",
"aria2c",
"--check-integrity=true",
"--bt-seed-unverified=true",
"--disable-ipv6",
"--seed-ratio=0.0",
f"--seed-time={time}",
"--enable-dht=false",
"--enable-peer-exchange=false",
f"--dir={dirsource}",
"--seed-ratio=0.0",
f"--seed-time={time}",
"--enable-dht=false",
"--enable-peer-exchange=false",
f"--dir={dirsource}",
f"{source}"
]
subprocess.run (aria2_cmd)
@ -737,12 +692,12 @@ def ogTorrentStart (disk=None, par=None, container=None, torrentfile=None, torre
print ('Donwloading Torrent as peer')
SystemLib.ogEcho(["session","log"],"warning",f'Starting PeerTorrent download in PEER mode')
aria2_cmd = [
"aria2c",
"--enable-dht=false",
"--enable-peer-exchange=false",
"--disable-ipv6" ,
f"--seed-time={time}",
f"--dir={dirsource}",
"aria2c",
"--enable-dht=false",
"--enable-peer-exchange=false",
"--disable-ipv6" ,
f"--seed-time={time}",
f"--dir={dirsource}",
f"{source}"
]
@ -750,12 +705,12 @@ def ogTorrentStart (disk=None, par=None, container=None, torrentfile=None, torre
print ('Donwloading Torrent as leecher')
SystemLib.ogEcho(["session","log"],"warning",f'Starting PeerTorrent download in LEECHER mode')
aria2_cmd = [
"aria2c",
"--enable-dht=false",
"--enable-peer-exchange=false",
"--disable-ipv6" ,
"--seed-time=0",
f"--dir={dirsource}",
"aria2c",
"--enable-dht=false",
"--enable-peer-exchange=false",
"--disable-ipv6" ,
"--seed-time=0",
f"--dir={dirsource}",
f"{source}"
]
@ -763,14 +718,14 @@ def ogTorrentStart (disk=None, par=None, container=None, torrentfile=None, torre
print ('MODE seeder aria2c')
SystemLib.ogEcho(["session","log"],"warning",f'Starting PeerTorrent download in SEEDER mode')
aria2_cmd = [
"aria2c",
"--check-integrity=true",
"--bt-seed-unverified=true",
"--disable-ipv6" ,
"--seed-ratio=0.0",
f"--seed-time={time}",
"--enable-dht=false",
"--enable-peer-exchange=false",
"aria2c",
"--check-integrity=true",
"--bt-seed-unverified=true",
"--disable-ipv6" ,
"--seed-ratio=0.0",
f"--seed-time={time}",
"--enable-dht=false",
"--enable-peer-exchange=false",
f"--dir={dirsource}", f"{source}"
]
@ -783,24 +738,20 @@ def ogTorrentStart (disk=None, par=None, container=None, torrentfile=None, torre
os.chdir (cwd)
#/**
# ogCreateTorrent [ str_repo | int_ndisk int_npart ] Relative_path_file
## ogCreateTorrent [ str_repo | int_ndisk int_npart ] Relative_path_file
#@brief Función para crear el fichero torrent.
#@param str_pathDirectory str_Relative_path_file
#@param int_disk int_partition str_Relative_path_file
#@param str_REPOSITORY(CACHE - LOCAL) str_Relative_path_file
#@return
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar.
#@exception OG_ERR_NOTOS La partición no tiene instalado un sistema operativo.
#*/ ##
#ogCreateTorrent ([str_REPOSITORY] [int_ndisk int_npart] Relative_path_file IpBttrack)
#ogCreateTorrent (disk=1, par=1, file='/aula1/winxp', ip_bttrack='10.1.15.23')
#ogCreateTorrent (container='REPO', file='/aula1/winxp', ip_bttrack='10.1.15.45')
#ogCreateTorrent (container='CACHE', file='/aula1/winxp', ip_bttrack='10.1.15.45')
def ogCreateTorrent (disk=None, par=None, container=None, file=None, ip_bttrack=None):
#ogCreateTorrent ([str_REPOSITORY] [int_ndisk int_npart] Relative_path_file IpBttrack)
#ogCreateTorrent (disk=1, par=1, file='/aula1/winxp', ip_bttrack='10.1.15.23')
#ogCreateTorrent (container='REPO', file='/aula1/winxp', ip_bttrack='10.1.15.45')
#ogCreateTorrent (container='CACHE', file='/aula1/winxp', ip_bttrack='10.1.15.45')
if file is None:
raise TypeError ('missing required argument: "file"')
if ip_bttrack is None:
@ -856,8 +807,7 @@ def ogCreateTorrent (disk=None, par=None, container=None, file=None, ip_bttrack=
#/**
# ogUpdateCacheIsNecesary [ str_repo ] Relative_path_file_OGIMG_with_/
## ogUpdateCacheIsNecesary [ str_repo ] Relative_path_file_OGIMG_with_/
#@brief Comprueba que el fichero que se desea almacenar en la cache del cliente, no esta.
#@param 1 str_REPO
#@param 2 str_Relative_path_file_OGIMG_with_/
@ -868,11 +818,10 @@ def ogCreateTorrent (disk=None, par=None, container=None, file=None, ip_bttrack=
#@note
#@todo: Proceso en el caso de que el fichero tenga el mismo nombre, pero su contenido sea distinto.
#@todo: Se dejan mensajes mientras se confirma su funcionamiento.
#*/ ##
#ogUpdateCacheIsNecesary ('REPO', '/PS1_PH1.img', 'UNICAST')
#ogUpdateCacheIsNecesary ('REPO', '/ogclient.sqfs', 'FULL')
#ogUpdateCacheIsNecesary ('REPO', '/ogclient.sqfs', 'TORRENT')
def ogUpdateCacheIsNecesary (repo, file, proto):
#ogUpdateCacheIsNecesary ('REPO', '/PS1_PH1.img', 'UNICAST')
#ogUpdateCacheIsNecesary ('REPO', '/ogclient.sqfs', 'FULL')
#ogUpdateCacheIsNecesary ('REPO', '/ogclient.sqfs', 'TORRENT')
if not CacheLib.ogFindCache():
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTCACHE, '')
return None

View File

@ -1,10 +1,8 @@
#/**
#@file RegistryLib.py
##@file RegistryLib.py
#@brief Librería o clase Registry
#@class Boot
#@class Registry
#@brief Funciones para gestión del registro de Windows.
#@warning License: GNU GPLv3+
#*/
import subprocess
import os
@ -32,8 +30,7 @@ def _split_k (k):
k_basename = k_elems[-1]
return k_dirname, k_basename
#/**
# ogAddRegistryKey path_mountpoint str_hive str_keyname
## ogAddRegistryKey path_mountpoint str_hive str_keyname
#@brief Añade una nueva clave al registro de Windows.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
@ -44,7 +41,6 @@ def _split_k (k):
#@note hive = { default, sam, security, software, system, components }
#@warning Requisitos: chntpw
#@warning El sistema de archivos de Windows debe estar montada previamente.
#*/ ##
def ogAddRegistryKey (mntpt, hive, k):
hivefile = ogGetHivePath (mntpt, hive)
if not hivefile: return
@ -59,8 +55,7 @@ def ogAddRegistryKey (mntpt, hive, k):
chntpw (hivefile, f.name)
os.remove (f.name)
#/**
# ogAddRegistryValue path_mountpoint str_hive str_valuename [str_valuetype]
## ogAddRegistryValue path_mountpoint str_hive str_valuename [str_valuetype]
#@brief Añade un nuevo valor al registro de Windows, indicando su tipo de datos.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
@ -73,12 +68,11 @@ def ogAddRegistryKey (mntpt, hive, k):
#@note valuetype = { STRING, BINARY, DWORD }, por defecto: STRING
#@warning Requisitos: chntpw
#@warning El sistema de archivos de Windows debe estar montada previamente.
#*/ ##
#ogAddRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Microsoft\NewKey\Value1') ## type STRING by default
#ogAddRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Microsoft\NewKey\Value1', 'STRING')
#ogAddRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Microsoft\NewKey\Value1', 'BINARY')
#ogAddRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Microsoft\NewKey\Value1', 'DWORD')
def ogAddRegistryValue (mntpt, hive, k, vtype='STRING'):
#ogAddRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Microsoft\NewKey\Value1') ## type STRING by default
#ogAddRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Microsoft\NewKey\Value1', 'STRING')
#ogAddRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Microsoft\NewKey\Value1', 'BINARY')
#ogAddRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Microsoft\NewKey\Value1', 'DWORD')
hivefile = ogGetHivePath (mntpt, hive)
if not hivefile: return
@ -101,8 +95,7 @@ def ogAddRegistryValue (mntpt, hive, k, vtype='STRING'):
os.remove (f.name)
#/**
# ogDeleteRegistryKey path_mountpoint str_hive str_keyname
## ogDeleteRegistryKey path_mountpoint str_hive str_keyname
#@brief Elimina una clave del registro de Windows con todo su contenido.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
@ -114,7 +107,6 @@ def ogAddRegistryValue (mntpt, hive, k, vtype='STRING'):
#@warning Requisitos: chntpw
#@warning El sistema de archivos de Windows debe estar montada previamente.
#@warning La clave debe estar vacía para poder ser borrada.
#*/ ##
def ogDeleteRegistryKey (mntpt, hive, k):
hivefile = ogGetHivePath (mntpt, hive)
if not hivefile: return
@ -130,8 +122,7 @@ def ogDeleteRegistryKey (mntpt, hive, k):
os.remove (f.name)
#/**
# ogDeleteRegistryValue path_mountpoint str_hive str_valuename
## ogDeleteRegistryValue path_mountpoint str_hive str_valuename
#@brief Elimina un valor del registro de Windows.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
@ -142,8 +133,6 @@ def ogDeleteRegistryKey (mntpt, hive, k):
#@note hive = { default, sam, security, software, system, components }
#@warning Requisitos: chntpw
#@warning El sistema de archivos de Windows debe estar montada previamente.
#*/ ##
#ogDeleteRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Microsoft\NewKey\Value1')
def ogDeleteRegistryValue (mntpt, hive, k):
hivefile = ogGetHivePath (mntpt, hive)
if not hivefile: return
@ -159,8 +148,7 @@ def ogDeleteRegistryValue (mntpt, hive, k):
os.remove(f.name)
#/**
# ogGetHivePath path_mountpoint [str_hive|str_user]
## ogGetHivePath path_mountpoint [str_hive|str_user]
#@brief Función básica que devuelve el camino del fichero con una sección del registro.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
@ -169,11 +157,10 @@ def ogDeleteRegistryValue (mntpt, hive, k):
#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado.
#@note hive = { DEFAULT, SAM, SECURITY, SOFTWARE, SYSTEM, COMPONENTS, NombreDeUsuario }
#@warning El sistema de archivos de Windows debe estar montada previamente.
#*/ ##
#ogGetHivePath ('/mnt/sda1', 'user1') => /mnt/sda1/Users/user1/NTUSER.DAT
#ogGetHivePath ('/mnt/sda1', 'SYSTEM') => //mnt/sda1/Windows/System32/config/SYSTEM
#ogGetHivePath ('/mnt/sda1', 'IEUser') => //mnt/sda1/Users/IEUser/NTUSER.DAT
def ogGetHivePath(mntpt, hive):
#ogGetHivePath ('/mnt/sda1', 'user1') => /mnt/sda1/Users/user1/NTUSER.DAT
#ogGetHivePath ('/mnt/sda1', 'SYSTEM') => //mnt/sda1/Windows/System32/config/SYSTEM
#ogGetHivePath ('/mnt/sda1', 'IEUser') => //mnt/sda1/Users/IEUser/NTUSER.DAT
# Camino del fichero de registro de usuario o de sistema (de menor a mayor prioridad).
FILE = FileLib.ogGetPath(file=f"/{mntpt}/Windows/System32/config/{hive}")
if not FILE: FILE = FileLib.ogGetPath(file=f"/{mntpt}/Users/{hive}/NTUSER.DAT")
@ -197,8 +184,7 @@ def _grep_A1 (strings, search_term):
return results
#/**
# ogGetRegistryValue path_mountpoint str_hive str_valuename
## ogGetRegistryValue path_mountpoint str_hive str_valuename
#@brief Devuelve el dato de un valor del registro de Windows.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
@ -209,7 +195,6 @@ def _grep_A1 (strings, search_term):
#@note hive = { default, sam, security, software, system, components }
#@warning Requisitos: chntpw, awk
#@warning El sistema de archivos de Windows debe estar montado previamente.
#*/ ##
def ogGetRegistryValue (mntpt, hive, k):
hivefile = ogGetHivePath(mntpt, hive)
if not hivefile: return
@ -238,8 +223,7 @@ def ogGetRegistryValue (mntpt, hive, k):
return ret
#/**
# ogListRegistryKeys path_mountpoint str_hive str_key
## ogListRegistryKeys path_mountpoint str_hive str_key
#@brief Lista los nombres de subclaves de una determinada clave del registro de Windows.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
@ -250,8 +234,6 @@ def ogGetRegistryValue (mntpt, hive, k):
#@note hive = { default, sam, security, software, system, components }
#@warning Requisitos: chntpw, awk
#@warning El sistema de archivos de Windows debe estar montado previamente.
#*/ ##
#ogListRegistryKeys ('/mnt/sda1', 'SOFTWARE', '\Microsoft\Windows\CurrentVersion')
def ogListRegistryKeys (mntpt, hive, k):
hivefile = ogGetHivePath(mntpt, hive)
if not hivefile: return
@ -273,8 +255,7 @@ def ogListRegistryKeys (mntpt, hive, k):
return ret
#/**
# ogListRegistryValues path_mountpoint str_hive str_key
## ogListRegistryValues path_mountpoint str_hive str_key
#@brief Lista los nombres de valores de una determinada clave del registro de Windows.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
@ -285,8 +266,6 @@ def ogListRegistryKeys (mntpt, hive, k):
#@note hive = { default, sam, security, software, system, components }
#@warning Requisitos: chntpw, awk
#@warning El sistema de archivos de Windows debe estar montado previamente.
#*/ ##
#ogListRegistryValues ('/mnt/sda1', 'SOFTWARE', '\Microsoft\Windows\CurrentVersion')
def ogListRegistryValues (mntpt, hive, k):
hivefile = ogGetHivePath(mntpt, hive)
if not hivefile: return
@ -327,8 +306,7 @@ def _format_hex (hex_string):
return '\n'.join (result)
#/**
# ogSetRegistryValue path_mountpoint str_hive str_valuename str_valuedata
## ogSetRegistryValue path_mountpoint str_hive str_valuename str_valuedata
#@brief Establece el dato asociado a un valor del registro de Windows.
#@param path_mountpoint directorio donde está montado el sistema Windows
#@param str_hive sección del registro
@ -340,11 +318,10 @@ def _format_hex (hex_string):
#@note hive = { default, sam, security, software, system, components }
#@warning Requisitos: chntpw
#@warning El sistema de archivos de Windows debe estar montado previamente.
#*/ ##
#ogSetRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Key\SubKey\StringValue', 'Abcde Fghij')
#ogSetRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Key\SubKey\DwordValue', 1)
#ogSetRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Key\SubKey\BinaryValue', '04 08 0C 10')
def ogSetRegistryValue (mntpt, hive, k, v):
#ogSetRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Key\SubKey\StringValue', 'Abcde Fghij')
#ogSetRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Key\SubKey\DwordValue', 1)
#ogSetRegistryValue ('/mnt/sda1', 'SOFTWARE', '\Key\SubKey\BinaryValue', '04 08 0C 10')
hivefile = ogGetHivePath (mntpt, hive)
if not hivefile: return

View File

@ -1,9 +1,12 @@
##@file StringLib.py
#@brief Librería o clase String
#@class String
#@brief Funciones para gestionar cadenas de texto
#@warning License: GNU GPLv3+
import re
#/**
# ogCheckIpAddress
## ogCheckIpAddress
#@brief Función para determinar si una cadena es una dirección ipv4 válida
#@param 1 string de la ip a comprobar
#@return 0 si es una dirección válida
@ -11,7 +14,6 @@ import re
#@exception OG_ERR_FORMAT formato incorrecto.
#@note
#@todo
#*/ ##
def ogCheckIpAddress(ip):
"""
Función para determinar si una cadena es una dirección ipv4 válida.

View File

@ -1,3 +1,9 @@
##@file SystemLib.py
#@brief Librería o clase System
#@class System
#@brief Funciones genéricas de sistema
#@warning License: GNU GPLv3+
import subprocess
import datetime
from zoneinfo import ZoneInfo
@ -18,14 +24,13 @@ def _logtype2logfile (t):
elif 'command' == t.lower(): return ogGlobals.OGLOGCOMMAND
elif 'session' == t.lower(): return ogGlobals.OGLOGSESSION
else: raise Exception (f'unknown log type ({t})')
#/**
# ogEcho [str_logtype ...] [str_loglevel] "str_message" ...
## ogEcho [str_logtype ...] [str_loglevel] "str_message" ...
#@brief Muestra mensajes en consola y lo registra en fichero de incidencias.
#@param str_logtype tipo de registro de incidencias ("log", "command", "session")
#@param str_loglevel nivel de registro de incidencias ("info", "warning", "error")
#@param str_message mensaje (puede recibir más de 1 parámetro.
#@return Mensaje mostrado.
#*/
def ogEcho (logtypes, loglevel, msg):
logfiles = ['/dev/stdout']
if type (logtypes) is list:
@ -68,20 +73,18 @@ def ogEcho (logtypes, loglevel, msg):
raise Exception (f'unknown loglevel ({loglevel})')
#/**
# ogExecAndLog str_logfile ... str_command ...
## ogExecAndLog str_logfile ... str_command ...
#@brief Ejecuta un comando y guarda su salida en fichero de registro.
#@param str_logfile fichero de registro (pueden ser varios).
#@param str_command comando y comandos a ejecutar.
#@return Salida de ejecución del comando.
#@note str_logfile = { LOG, SESSION, COMMAND }
#*/
#ogExecAndLog (str_logfile ... str_command ...",
#ogExecAndLog ([], ['/path/to/script', *args])
#ogExecAndLog ('command', ['/path/to/script', *args])
#ogExecAndLog (['command'], ['/path/to/script', *args])
#ogExecAndLog (['log', 'command'], ['/path/to/script', *args])
def ogExecAndLog (logtypes, script_and_args):
#ogExecAndLog (str_logfile ... str_command ...",
#ogExecAndLog ([], ['/path/to/script', *args])
#ogExecAndLog ('command', ['/path/to/script', *args])
#ogExecAndLog (['command'], ['/path/to/script', *args])
#ogExecAndLog (['log', 'command'], ['/path/to/script', *args])
logfiles = ['/dev/stdout']
if type (logtypes) is list:
for l in logtypes:
@ -155,11 +158,9 @@ def ogExecAndLog (logtypes, script_and_args):
rc = p.returncode
return not rc ## negate shell return code
#/**
# ogGetCaller
## ogGetCaller
#@brief Devuelve nombre del programa o script ejecutor (padre).
#@return str_name - Nombre del programa ejecutor.
#*/
def ogGetCaller():
if 'COLUMNS' in os.environ:
cols = os.environ['COLUMNS']
@ -184,8 +185,7 @@ def ogGetCaller():
return os.path.basename(caller)
#/**
# ogHelp ["str_function" ["str_format" ["str_example" ... ]]]
## ogHelp ["str_function" ["str_format" ["str_example" ... ]]]
#@brief Muestra mensaje de ayuda para una función determinda.
#@param str_function Nombre de la función.
#@param str_format Formato de ejecución de la función.
@ -194,7 +194,6 @@ def ogGetCaller():
#@note Si no se indican parámetros, la función se toma de la variable \c $FUNCNAME
#@note La descripción de la función se toma de la variable compuesta por \c MSG_FUNC_$función incluida en el fichero de idiomas.
#@note Pueden especificarse varios mensajes con ejemplos.
#*/
def ogHelp (fname, fmt=None, examples=[]):
FUNC = fname or inspect.stack()[1][3]
MSG = f'ogGlobals.lang.MSG_HELP_{FUNC}'
@ -212,14 +211,12 @@ def ogHelp (fname, fmt=None, examples=[]):
else: ## string
ogEcho([], "help", f" {ogGlobals.lang.MSG_EXAMPLE}: {examples}")
#/**
# ogRaiseError [str_logtype ...] int_errcode ["str_errmessage" ...]
## ogRaiseError [str_logtype ...] int_errcode ["str_errmessage" ...]
#@brief Devuelve el mensaje y el código de error correspondiente.
#@param str_logtype tipo de registro de incidencias.
#@param int_errcode código de error.
#@param str_errmessage mensajes complementarios de error.
#@return str_code - código de error
#*/
def ogRaiseError (logtypes, code, msg):
if code == ogGlobals.OG_ERR_FORMAT: MSG = f'{ogGlobals.lang.MSG_ERR_FORMAT} "{msg}"'
elif code == ogGlobals.OG_ERR_NOTFOUND: MSG = f'{ogGlobals.lang.MSG_ERR_NOTFOUND} "{msg}"'
@ -280,12 +277,10 @@ def ogRaiseError (logtypes, code, msg):
return code
#/**
# ogIsRepoLocked
## ogIsRepoLocked
#@brief Comprueba si el repositorio está siendo usado (tiene ficheros abiertos).
#@param No.
#@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error.
#*/
def ogIsRepoLocked():
# No hacer nada, si no está definido el punto de montaje del repositorio.
if not ogGlobals.OGIMG:
@ -313,7 +308,7 @@ def ogIsRepoLocked():
# return
#
# return 0
def ogIsVirtualMachine():
output = subprocess.run (["dmidecode", "-s", "system-product-name"], capture_output=True, text=True).stdout
return "KVM" in output or "VirtualBox" in output

View File

@ -1,3 +1,9 @@
##@file UEFILib.py
#@brief Librería o clase UEFI
#@class UEFI
#@brief Funciones para sistemas EFI
#@warning License: GNU GPLv3+
import os.path
import re
import subprocess
@ -10,22 +16,16 @@ import DiskLib
import FileLib
import InventoryLib
#!/bin/bash
# Libreria provisional para uso de UEFI
# Las funciones se incluirán las librerías ya existentes
#/**
# ogNvramActiveEntry
## ogNvramActiveEntry
#@brief Activa entrada de la NVRAM identificada por la etiqueta o el orden
#@param Num_order_entry | Label_entry Número de orden o la etiqueta de la entrada a borrar.
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTUEFI UEFI no activa.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#*/ ##
#ogNvramActiveEntry ('2')
#ogNvramActiveEntry ('Windows Boot Manager')
def ogNvramActiveEntry (entry):
#ogNvramActiveEntry ('2')
#ogNvramActiveEntry ('Windows Boot Manager')
if not InventoryLib.ogIsEfiActive():
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTUEFI, '')
return
@ -57,8 +57,7 @@ def ogNvramActiveEntry (entry):
subprocess.run (['efibootmgr', '-a', '-b', numentries[0]], capture_output=True, text=True)
#/**
# ogNvramAddEntry
## ogNvramAddEntry
#@brief Crea nueva entrada en el gestor de arranque (NVRAM), opcionalmente la incluye al final del orden de arranque.
#@param Str_Label_entry Número de disco o etiqueta de la entrada a crear.
#@param Str_BootLoader Número de partición o cargador de arranque.
@ -67,11 +66,10 @@ def ogNvramActiveEntry (entry):
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTUEFI UEFI no activa.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#*/ ##
#ogNvramAddEntry ('1', '2', True)
#ogNvramAddEntry ('grub', '/EFI/grub/grubx64.efi', True)
#ogNvramAddEntry ('Windows', '/EFI/Microsoft/Boot/bootmgfw.efi')
def ogNvramAddEntry (bootlbl, bootldr, nvram_set=False):
#ogNvramAddEntry ('1', '2', True)
#ogNvramAddEntry ('grub', '/EFI/grub/grubx64.efi', True)
#ogNvramAddEntry ('Windows', '/EFI/Microsoft/Boot/bootmgfw.efi')
if not InventoryLib.ogIsEfiActive():
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTUEFI, '')
return
@ -109,8 +107,7 @@ def ogNvramAddEntry (bootlbl, bootldr, nvram_set=False):
#/**
# ogCopyEfiBootLoader int_ndisk str_repo path_image
## ogCopyEfiBootLoader int_ndisk str_repo path_image
#@brief Copia el cargador de arranque desde la partición EFI a la de sistema.
#@param int_ndisk nº de orden del disco
#@param int_part nº de partición
@ -118,7 +115,6 @@ def ogNvramAddEntry (bootlbl, bootldr, nvram_set=False):
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#@note Si existe el cargador en la partición de sistema no es válido
#*/ ##
def ogCopyEfiBootLoader (disk, par):
mntdir = FileSystemLib.ogMount (disk, par)
if not mntdir:
@ -152,18 +148,16 @@ def ogCopyEfiBootLoader (disk, par):
shutil.copytree (f'{dirloader}/Boot', f'{mntdir}/ogBoot')
#/**
# ogNvramDeleteEntry
## ogNvramDeleteEntry
#@brief Borra entrada de la NVRAM identificada por la etiqueta o el orden
#@param Num_order_entry | Label_entry Número de orden o la etiqueta de la entrada a borrar.
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTUEFI UEFI no activa.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado (entrada en NVRAM).
#*/ ##
#ogNvramDeleteEntry ('2')
#ogNvramDeleteEntry ('Windows Boot Manager')
def ogNvramDeleteEntry (entry):
#ogNvramDeleteEntry ('2')
#ogNvramDeleteEntry ('Windows Boot Manager')
if not InventoryLib.ogIsEfiActive():
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTUEFI, '')
return
@ -197,12 +191,10 @@ def ogNvramDeleteEntry (entry):
#/**
# ogNvramGetCurrent
## ogNvramGetCurrent
#@brief Muestra la entrada del gestor de arranque (NVRAM) que ha iniciado el equipo.
#@return Entrada con la que se ha iniciado el equipo
#@exception OG_ERR_NOTUEFI UEFI no activa.
#*/ ##
def ogNvramGetCurrent():
if not InventoryLib.ogIsEfiActive():
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTUEFI, '')
@ -223,11 +215,10 @@ def ogNvramGetCurrent():
return ret
# ogNvramGetNext
## ogNvramGetNext
#@brief Muestra la entrada del gestor de arranque (NVRAM) que se utilizará en el próximo arranque.
#@return Entrada que se utilizará en el próximo arranque
#@exception OG_ERR_NOTUEFI UEFI no activa.
#*/ ##
def ogNvramGetNext():
if not InventoryLib.ogIsEfiActive():
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTUEFI, '')
@ -243,11 +234,10 @@ def ogNvramGetNext():
return ret
# ogNvramGetOrder
## ogNvramGetOrder
#@brief Muestra el orden de las entradas del gestor de arranque (NVRAM)
#@return Array, orden de las entradas
#@exception OG_ERR_NOTUEFI UEFI no activa.
#*/ ##
def ogNvramGetOrder():
if not InventoryLib.ogIsEfiActive():
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTUEFI, '')
@ -263,12 +253,10 @@ def ogNvramGetOrder():
return ret
#/**
# ogNvramGetTimeout
## ogNvramGetTimeout
#@brief Muestra el tiempo de espera del gestor de arranque (NVRAM)
#@return Timeout de la NVRAM
#@exception OG_ERR_NOTUEFI UEFI no activa.
#*/ ##
def ogNvramGetTimeout():
if not InventoryLib.ogIsEfiActive():
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTUEFI, '')
@ -284,31 +272,16 @@ def ogNvramGetTimeout():
return ret
#/**
# ogGrubUefiConf int_ndisk int_part str_dir_grub
#@brief Genera el fichero grub.cfg de la ESP
#@param int_ndisk nº de orden del disco
#@param int_part nº de partición
#@param str_dir_grub prefijo del directorio de grub en la partición de sistema. ej: /boot/grubPARTITION
#@return (nada, por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#@TODO Confirmar si el fichero "$EFIDIR/EFI/$BOOTLABEL/grub.cfg" es necesario.
#*/ ##
#/**
# ogNvramInactiveEntry
## ogNvramInactiveEntry
#@brief Inactiva entrada de la NVRAM identificada por la etiqueta o el orden
#@param Num_order_entry | Label_entry Número de orden o la etiqueta de la entrada a borrar.
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#@exception OG_ERR_NOTUEFI UEFI no activa.
#*/ ##
#ogNvramInactiveEntry ('2')
#ogNvramInactiveEntry ('Windows Boot Manager')
def ogNvramInactiveEntry (entry):
#ogNvramInactiveEntry ('2')
#ogNvramInactiveEntry ('Windows Boot Manager')
if not InventoryLib.ogIsEfiActive():
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTUEFI, '')
return
@ -341,12 +314,10 @@ def ogNvramInactiveEntry (entry):
subprocess.run (['efibootmgr', '-A', '-b', numentries[0]], capture_output=True, text=True)
#/**
# ogNvramList
## ogNvramList
#@brief Lista las entradas de la NVRAN (sólo equipos UEFI)
#@return Multiline string: entradas de la NVRAM con el formato: orden etiqueta [* (si está activa) ]
#@exception OG_ERR_NOTUEFI UEFI no activa.
#*/ ##
def ogNvramList():
if not InventoryLib.ogIsEfiActive():
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTUEFI, '')
@ -364,12 +335,10 @@ def ogNvramList():
return ret
#/**
# ogNvramPxeFirstEntry
## ogNvramPxeFirstEntry
#@brief Sitúa la entrada de la tarjeta de red en el primer lugar en la NVRAM.
#@return (nada)
#@exception OG_ERR_NOTUEFI UEFI no activa.
#*/ ##
def ogNvramPxeFirstEntry():
if not InventoryLib.ogIsEfiActive():
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTUEFI, '')
@ -398,8 +367,7 @@ def ogNvramPxeFirstEntry():
return True
#/**
# ogRestoreEfiBootLoader int_ndisk str_repo
## ogRestoreEfiBootLoader int_ndisk str_repo
#@brief Copia el cargador de arranque de la partición de sistema a la partición EFI.
#@param int_ndisk nº de orden del disco
#@param int_part nº de partición
@ -407,7 +375,6 @@ def ogNvramPxeFirstEntry():
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado (partición de sistema o EFI).
#@exception OG_ERR_NOTOS sin sistema operativo.
#*/ ##
def ogRestoreEfiBootLoader (disk, par):
mntdir = FileSystemLib.ogMount (disk, par)
if not mntdir:
@ -441,36 +408,22 @@ def ogRestoreEfiBootLoader (disk, par):
shutil.copytree (os.path.dirname (loader), f'{efi_bl}/Boot', symlinks=True)
shutil.copy (loader, f'{efi_bl}/Boot/ogloader.efi')
if '' != FileLib.ogGetPath (file=f'{efidir}/EFI/Microsoft'):
os.rename (f'{efidir}/EFI/Microsoft', f'{efidir}/EFI/Microsoft.backup.og')
if not os.path.exists (f'{efidir}/EFI/Microsoft.backup.og'):
os.rename (f'{efidir}/EFI/Microsoft', f'{efidir}/EFI/Microsoft.backup.og')
return
#/**
# ogRestoreUuidPartitions
#@brief Restaura los uuid de las particiones y la tabla de particiones
#@param int_ndisk nº de orden del disco
#@param int_nfilesys nº de orden del sistema de archivos
#@param REPO|CACHE repositorio
#@param str_imgname nombre de la imagen
#@return (nada)
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND No encontrado fichero de información de la imagen (con uuid)
#*/ ##
#/**
# ogNvramSetNext
## ogNvramSetNext
#@brief Configura el próximo arranque con la entrada del gestor de arranque (NVRAM) identificada por la etiqueta o el orden.
#@param Num_order_entry | Label_entry Número de orden o la etiqueta de la entrada a borrar.
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTUEFI UEFI no activa.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#*/ ##
#ogNvramSetNext ('2')
#ogNvramSetNext ('Windows Boot Manager')
def ogNvramSetNext (entry):
#ogNvramSetNext ('2')
#ogNvramSetNext ('Windows Boot Manager')
if not InventoryLib.ogIsEfiActive():
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTUEFI, '')
return
@ -503,17 +456,15 @@ def ogNvramSetNext (entry):
SystemLib.ogEcho ([], 'info', f'setting "{numentries[0]}" as next entry in NVRAM')
subprocess.run (['efibootmgr', '-n', numentries[0]], capture_output=True, text=True)
#/**
# ogNvramSetOrder
## ogNvramSetOrder
#@brief Configura el orden de las entradas de la NVRAM
#@param Orden de las entradas separadas por espacios
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTUEFI UEFI no activa.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado (entrada NVRAM).
#*/ ##
#ogNvramSetOrder (['1', '3'])
def ogNvramSetOrder (order):
#ogNvramSetOrder (['1', '3'])
if not InventoryLib.ogIsEfiActive():
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTUEFI, '')
return
@ -545,15 +496,12 @@ def ogNvramSetOrder (order):
subprocess.run (['efibootmgr', '-o', ','.join (new_order)])
#/**
# ogNvramSetTimeout
## ogNvramSetTimeout
#@brief Configura el tiempo de espera de la NVRAM
#@param Orden de las entradas separadas por espacios
#@return (nada)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#*/ ##
#ogNvramSetTimeout ('2')
def ogNvramSetTimeout (t):
if not InventoryLib.ogIsEfiActive():
@ -567,14 +515,3 @@ def ogNvramSetTimeout (t):
return
subprocess.run (['efibootmgr', '-t', t])
#/**
# ogUuidChange int_ndisk str_repo
#@brief Reemplaza el UUID de un sistema de ficheros.
#@param int_ndisk nº de orden del disco
#@param int_part nº de partición
#@return (nada, por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
#*/ ##

View File

@ -1,13 +1,8 @@
#!/usr/bin/python3
#/**
# bootOsCustomTemplate
#@brief Plantilla para script de configuración personalizada de sistema operativo restaurado.
#@param $1 nº de disco
#@param $2 nº de partición
#@warning Renombrar este fichero como "bootOsCustom" para personalizar el script estándar "bootOs".
#@note La partición a inicializar debe estar montada
#**/
# bootOsCustomTemplate
# Plantilla para script de configuración personalizada de sistema operativo restaurado.
# bootOsCustomTemplate $disk $part
import sys

View File

@ -1,15 +1,8 @@
#!/usr/bin/python3
#/**
# configureOs
#@brief Script para realizar la configuracion del sistema operativo restaurado.
#@param 1 disco
#@param 2 particion
#@param 3 nombre imagen
#@return
#@TODO comprobar que el tipo de particion corresponde con el sistema de archivos.
#@exception OG_ERR_FORMAT # 1 formato incorrecto.
#*/ ##
# configureOs
# Script para realizar la configuracion del sistema operativo restaurado.
# configureOs $disk $par $nombre
import sys
import os

View File

@ -1,14 +1,8 @@
#!/usr/bin/python3
#/**
# configureOsCustom
#@brief Plantilla para scirpt de configuracion personalizada de sistema operativo restaurado.
#@param $1 nº de disco
#@param $2 nº de partición
#@param $3 Repositorio: CACHE, REPO o dirección IP (opcional)
#@param $4 Nombre canónico de la imagen sin extensión (opcional)
#@warning Renombrar este fichero como "configureOsCustom" para sustituir al script estándar "configureOs".
#@note Los parámetros disco y partición son obligatorios y opcionalmente puede recibir también el repositorio y la imagen usada para en el despliegue.
#**/
# configureOsCustom
# Plantilla para scirpt de configuracion personalizada de sistema operativo restaurado.
# configureOsCustom $disk $part $repo $nombre
import sys
import subprocess

View File

@ -1,5 +1,10 @@
#!/usr/bin/python3
# createImage
# Scirpt de ejemplo para crear una imagen de un sistema de archivos.
# Se usa como base para el programa de creación de imágenes de OpenGnsys Admin).
# createImage $disk $par $repo $imagen
import os
import sys
import time
@ -18,34 +23,6 @@ import FileSystemLib
import InventoryLib
import UEFILib
#/**
#@file createImage
#@brief Scirpt de ejemplo para crear una imagen de un sistema de archivos.
#@brief Se usa como base para el programa de creación de imágenes de OpenGnsys Admin).
#@param 1 disco
#@param 2 particion
#@param 3 REPO|CACHE
#@param 4 imagen
#@return
#@exception OG_ERR_FORMAT # 1 formato incorrecto.
#@exception OG_ERR_PARTITION # 3 Error en partición de disco o en su sistema de archivos
#@exception OG_ERR_IMAGE # 5 Error en funcion ogCreateImage o ogRestoreImage.
#@exception OG_ERR_NOTWRITE # 14 error de escritura
#@exception OG_ERR_NOTCACHE # 15 si cache no existe 15
#@exception OG_ERR_CACHESIZE # 16 si espacio de la cache local o remota no tiene espacio 16
#@exception OG_ERR_REDUCEFS # 17 error al reducir sistema de archivos.
#@exception OG_ERR_EXTENDFS # 18 Errror al expandir el sistema de archivos.
#@note
#@todo: que hacer, si el tamaño de la cache es sufciente, pero no tiene espacio libre
#@todo: que hacer, si hay una imagen con igual nombre en la cache
#*/ ##
# Test 1. crear una imagen en un REPO sin espacio libre.
# test 2. crear una imagen en un REPO en modo solo lectura.
# test 3. intentar crear una imagen en la cache de un equipo que no la disponga.
# test 4. crear una imagen en la Cache sin espacio sufiente.
# test 5. intentar crear una imagen, en la que no se puede reducir el FS.
prog = os.path.basename (sys.argv[0])
def main (disk, par, repo, imgname):

View File

@ -1,13 +1,8 @@
#!/usr/bin/python3
#/**
# createImageCustom
#@brief Plantilla para scirpt de creación personalizada de imagen.
#@param $1 nº de disco
#@param $2 nº de partición
#@param $3 Repositorio: CACHE, REPO o dirección IP
#@param $4 Nombre canónico de la imagen sin extensión
#@warning Renombrar este fichero como "createImageCustom" para sustituir al script estándar "createImage".
#**/
# createImageCustom
# Plantilla para scirpt de creación personalizada de imagen.
# createImageCustom $disk $par $repo $nombre
import sys
import subprocess

View File

@ -1,20 +1,9 @@
#!/usr/bin/python3
#/**
#@file restoreImage
#@brief Script de ejemplo para restaurar una imagen.
#@param $1 Repositorio (CACHE, REPO o dirección IP)
#@param $2 Nombre canónico de la imagen (sin extensión)
#@param $3 Número de disco
#@param $4 Número de particion
#@param $5 Protocolo (UNICAST, UNICAST-DIRECT, MULTICAST o MULTICAST-DIRECT)
#@param $6 Opciones del protocolo
#@ejemplo restoreImage REPO imgname 2 2 unicast
#@exception OG_ERR_FORMAT 1 formato incorrecto.
#@exception OG_ERR_NOTFOUND 2 cambio de repositorio: repositorio no encontrado
#@exception OG_ERR_NOTFOUND 2 fichero de imagen o partición no detectados.
#@exception $OG_ERR_MCASTRECEIVERFILE 57 Error en la recepción Multicast de un fichero
#@exception $OG_ERR_PROTOCOLJOINMASTER 60 Error en la conexión de una sesión Unicast|Multicast con el Master
#**/
# restoreImage
# Script de ejemplo para restaurar una imagen.
# restoreImage $repo $nombre $disk $par $proto $protoopts
# restoreImage REPO imgname 2 2 unicast
import os
import os.path

View File

@ -1,13 +1,8 @@
#!/usr/bin/python3
#/**
# restoreImageCustom
#@brief Plantilla para scirpt de rastauración personalizada de imagen.
#@param $1 nº de disco
#@param $2 nº de partición
#@param $3 Repositorio: CACHE, REPO o dirección IP
#@param $4 Nombre canónico de la imagen sin extensión
#@warning Renombrar este fichero como "restoreImageCustom" para sustituir al script estándar "restoreImage".
#**/
# restoreImageCustom
# Plantilla para scirpt de rastauración personalizada de imagen.
# restoreImageCustom $disk $par $repo $nombre
import sys
import subprocess

View File

@ -8,17 +8,8 @@ import ogGlobals
import SystemLib
import CacheLib
#/**
# updateBootCache
#@brief acelerador arranque pxe. incorpora a la cache el initrd y el kernel.
#@param 1
#@param ejemplo:
#@return
#@exception OG_ERR_NOTCACHE # 15 si cache no existe 15
#@exception OG_ERR_NOTFOUND=2 # Fichero o dispositivo no encontrado.
#@note
#@todo:
#*/ ##
# updateBootCache
# acelerador arranque pxe. incorpora a la cache el initrd y el kernel.
oglivedir = os.environ.get ('oglivedir', 'ogLive')
ogbtftp = f'/opt/oglive/tftpboot/{oglivedir}'

View File

@ -1,22 +1,9 @@
#!/usr/bin/python3
#/**
# updateCache
#@brief Actualiza la cache del cliente con imagen o fichero iso.
#@param 1 REPO Origen del fichero. -accesible por nfs-samba-
#@param 2 str_fichero nombre del fichero a actualizar.
#@param 3 str_protoco. TORRENT | MULTICAST | UNICAST.
#@param 4 str_opcionesprotocolo
#@param 4 str_opcionesupdatecache
#@ejemplo: updateCache REPO imgname.img UNICAST 8042:42
#@return
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTCACHE No existe cache -15-
#@exception $OG_ERR_CACHESIZE Tamaño de la paticion menor al archivo a descargar -16-
#@exception $OG_ERR_MCASTRECEIVERFILE Error en la recepción Multicast de un fichero -57-
#@exception $OG_ERR_PROTOCOLJOINMASTER Error en la conexión de una sesión Unicast|Multicast con el Master -60-
#@note
#@todo:
#*/ ##
# updateCache
# Actualiza la cache del cliente con imagen o fichero iso.
# updateCache $repo $file $proto $protoopt $opciones_updatecache
# updateCache REPO imgname.img UNICAST 8042:42
import os.path
import sys