Giter Club home page Giter Club logo

gisobuild's Introduction

gisobuild toolkit for IOS-XR

Usage

usage: gisobuild.py [-h] [--iso ISO] [--repo REPO [REPO ...]]
                    [--bridging-fixes BRIDGE_FIXES [BRIDGE_FIXES ...]]
                    [--xrconfig XRCONFIG] [--ztp-ini ZTP_INI] [--label LABEL]
                    [--no-label] [--out-directory OUT_DIRECTORY]
                    [--create-checksum] [--yamlfile CLI_YAML] [--clean]
                    [--pkglist PKGLIST [PKGLIST ...]]
                    [--key-requests KEY_REQUESTS [KEY_REQUESTS ...]]
                    [--script SCRIPT] [--docker] [--x86-only] [--migration]
                    [--optimize] [--full-iso]
                    [--remove-packages REMOVE_PACKAGES [REMOVE_PACKAGES ...]]
                    [--skip-usb-image] [--copy-dir COPY_DIRECTORY]
                    [--clear-bridging-fixes] [--verbose-dep-check] [--debug]
                    [--isoinfo ISOINFO] [--image-script IMAGE_SCRIPT]
                    [--only-support-pids ONLY_SUPPORT_PIDS [ONLY_SUPPORT_PIDS ...]]
                    [--remove-all-key-requests]
                    [--remove-key-requests REMOVE_KEY_REQUESTS [REMOVE_KEY_REQUESTS ...]]
                    [--no-buildinfo] [--version]

Utility to build Golden ISO for IOS-XR.

optional arguments:
  -h, --help            show this help message and exit
  --iso ISO             Path to an input LNT ISO, EXR mini/full ISO, or a
                        GISO.
  --repo REPO [REPO ...]
                        Path to RPM repository. For LNT, user can specify
                        .rpm, .tgz, .tar filenames, or directories. RPMs are
                        only used if already included in the ISO, or specified
                        by the user via the --pkglist option.
  --bridging-fixes BRIDGE_FIXES [BRIDGE_FIXES ...]
                        Bridging rpms to package. For EXR, takes from-release
                        or rpm names; for LNT, the user can specify the same
                        file types as for the --repo option.
  --xrconfig XRCONFIG   Path to XR config file
  --ztp-ini ZTP_INI     Path to user ztp ini file
  --label LABEL, -l LABEL
                        Golden ISO Label
  --no-label            Indicates that no label at all should be added to the
                        GISO
  --out-directory OUT_DIRECTORY
                        Output Directory
  --create-checksum     Write a file with the checksum and size of the output
                        file(s)
  --yamlfile CLI_YAML   Cli arguments via yaml
  --clean               Delete output dir before proceeding
  --pkglist PKGLIST [PKGLIST ...]
                        Packages to be added to the output GISO. For eXR:
                        optional rpm or smu to package. For LNT: either full
                        package filenames or package names for user
                        installable packages can be specified. Full package
                        filenames can be specified to choose a particular
                        version of a package, the rest of the block that the
                        package is in will be included as well. Package names
                        can be specified to include optional packages in the
                        output GISO.
  --key-requests KEY_REQUESTS [KEY_REQUESTS ...]
                        Key requests to package to be used when validating
                        customer and partner RPMs.
  --docker, --use-container
                        Build GISO in container environment.Pulls and run pre-
                        built container image to build GISO.
  --version             Print version of this script and exit

EXR only build options:
  --script SCRIPT       Path to user executable script executed as part of
                        bootup post activate.
  --x86-only            Use only x86_64 rpms even if other architectures are
                        applicable.
  --migration           To build Migration tar only for ASR9k
  --optimize            Optimize GISO by recreating and resigning initrd
  --full-iso            To build full iso only for xrv9k

LNT only build options:
  --remove-packages REMOVE_PACKAGES [REMOVE_PACKAGES ...]
                        Remove RPMs, specified in a space separated list.
                        These are matched against user installable package
                        names, and must be the whole package name, e.g: xr-bgp
  --skip-usb-image      Do not build the USB image
  --copy-dir COPY_DIRECTORY
                        Copy built artefacts to specified directory if
                        provided. The specified directory must already exist,
                        be writable by the builder and must not contain a
                        previously built artefact with the same name.
  --clear-bridging-fixes
                        Remove all bridging bugfixes from the input ISO
  --verbose-dep-check   Verbose output for the dependency check.
  --debug               Output debug logs to console
  --isoinfo ISOINFO     User specified isoinfo executable to use instead of
                        the default version
  --image-script IMAGE_SCRIPT
                        User specified image.py script to be used for
                        packing/unpacking instead of the version extracted
                        from the ISO. It will not be inserted into the GISO.
                        Intended for debugging purposes only.
  --only-support-pids ONLY_SUPPORT_PIDS [ONLY_SUPPORT_PIDS ...]
                        Support only these hardware PIDs in the output ISO
                        (e.g. '8800-RP' '8800-LC-36FH' '8800-LC-48H'); other
                        PIDs from the input ISO will be removed. This option
                        is generally used to reduce the size of the output
                        ISO. Do not use this option before discussing with
                        Cisco support.
  --remove-all-key-requests
                        Remove all key requests from the input ISO
  --remove-key-requests REMOVE_KEY_REQUESTS [REMOVE_KEY_REQUESTS ...]
                        Remove key requests, specified in a space separated
                        list. These are matched against the filename, e.g.
                        key_request.kpkg
  --no-buildinfo        Do not update the build metadata in mdata.json with
                        the GISO build information

Description

Typically, Cisco releases IOS-XR software as a mini/base ISO, which contains mandatory IOS-XR packages for a given platform and, separately, a set of optional packages and software patches for any bug fixes (SMU). Optional packages and SMUs are in RPM packaging format.

The Golden ISO tool creates an ISO containing the full contents of the mini/base ISO, together with optional packages and SMU of the user's choice. Once the Golden ISO is created, it can be used either for iPXE booting a router or for SU (system upgrade) from the current running version to a new version of IOS-XR.

Reducing ISO size

The tool also supports the creation of an ISO with certain hardware PIDs removed (via --only-support-pids), which can be used to reduce the size of the ISO. This option should be used with the following considerations:

  • The list of PIDs to support must all be supported by the input ISO. You can check the supported PIDs with the isols.py --dump-mdata command.
  • If a distributed Route Processor PID is specified, then you must also specify a distributed Line Card to support (and vice versa), otherwise the system may not boot. Again, isols.py --dump-mdata can give you information about a PID's card class.
  • Once support for a PID has been removed from an image, support cannot be re-added to the output ISO - it's a one-way operation.
  • You should only remove support for hardware PIDs that you know won't ever be present in the system that the GISO is intended for. Using such a GISO on a system with unsupported hardware PIDs can lead to the system being unbootable.

With this in mind, it is not recommended to use this option unless you have discussed it with Cisco support.

Key requests

Key requests (AKA key packages) that should be onboarded for validating owner and partner RPMs can be specified using the --key-requests <file1> <file2> argument and removed using --remove-all-key-requests or --remove-key-requests <file1> <file2>.

For instructions on creating and verifying key requests, see the key-package-scripts repo.

Requirements

This tool has the following executable requirements:

  • python3 >= 3.6
  • rpm >= 4.14
  • cpio >= 2.10
  • gzip >= 1.9
  • createrepo_c
  • file
  • isoinfo
  • mkisofs
  • mksquashfs
  • openssl
  • unsquashfs
  • 7z (Optional - but functionality may be reduced without)
  • iso-read (Optional - but functionality may be reduced without)
  • zip (Optional - but functionality may be reduced without)
  • unzip (Optional - but functionality may be reduced without)

It also requires the following Python (>= 3.6) modules:

  • dataclasses
  • defusedxml
  • distutils
  • packaging
  • rpm
  • yaml

Invocation

This tool can be run natively on a Linux host if the dependencies above are met. Alternatively, the tool can also be run on a Linux system with Docker enabled and the ability to pull the published 'cisco-xr-gisobuild' image from Docker Hub, in which case the above dependencies are met by the published image.

To run natively on a Linux host, the following distributions have been tested.

  • Alma Linux 8
  • Fedora 34
  • Debian 11.2

On a native Linux system, which does not have all dependencies met, the tool dependencies can be installed on supported distributions above by running the following command (possibly via sudo)

./setup/prep_dependency.sh

To load and run the pre-built cisco-xr-gisobuild docker image, ensure that the docker service is enabled and it's possible to pull and run published docker images.

Run the following command to check docker service parameters.

docker info

Running the tool:

To run natively on a linux host which has dependency requirements met:

./src/gisobuild.py --iso <input iso> --repo <rpm repo1 rpm_repo2> \
    --pkglist <pkg1 pkg2 pkg3> --bridging-fixes <smu1 smu2 smu3> \
    --xrconfig <config.cfg> --ztp-ini <ztp.ini> --script <user_script.sh> \
    --label <label> --out-directory <out_directory> --clean

The tool has a helpful usage info which lists down the options supported.

When user does not want to specify the inputs via cli, an alternate would be to populate the yaml file template provided in the toolkit and pass the same via:

./src/gisobuild.py --yamlfile <input_yaml_cfg>

To override any input in the yaml config file, please use the corresponding cli option and parameter.

./src/gisobuild.py --yamlfile <input_yaml_cfg> --label <new_label>

The above command will override the label specified in yaml file with new option provided via cli option --label.

When the host machine does not have its dependency met, but allows pulling and running docker images, enable docker option in yaml file to true and run as (possible with GISO for eXR variants of IOS-XR):

./src/gisobuild.py --yamlfile <input_yaml_cfg>

where input_yaml_cfg has:

docker: true

Output:

The corresponding GISO and build logs are available under the directory specified in --out-directory. The default if not specified is <pwd>/output_gisobuild.

Tips

Specifying LNT bugfixes and packages

In the context of the LNT gisobuild tool, and LNT install operations, an XR package name refers to the "user installable" RPM and is the string prefix common to all RPMs associated with a block.

You can put all your bugfixes and any optional packages in the same repository, and pass that to the CLI using the --repo flag. The tool will pick the correct RPMs to add to the GISO using the following logic:

  1. If no packages are specified via the --pkglist flag, then the latest of any packages in the repository that upgrade packages already in the input ISO will be included in the output GISO. Other optional packages, including those part of bugfixes that were incorporated into the GISO, will not be added to the output GISO.
  2. If any optional package names are given via the --pkglist flag, where the package is not part of the input ISO, the latest version of the package in the specified repository will be added to the output GISO. For XR packages all other RPMs in the same block will also be added to the output GISO.
  3. If full package filenames are given via the --pkglist flag, the specific version passed in will be included in the output GISO. If the package is part of a block, then all the packages in the block are added.

Note that to specify a package in the way described by option 2, you just need to give the beginning part of the RPM filename that provides the package name, for example, if you have the following RPMs:

$ ls /path/to/repo/optional-rpms/cdp/
xr-cdp-0deb3755978fea2a-24.3.1v1.0.0-1.x86_64.rpm*
xr-cdp-1b7551b6d2623937-24.3.1v1.0.0-1.x86_64.rpm*
xr-cdp-24.3.1v1.0.0-1.x86_64.rpm*
xr-cdp-734eb3104a06f199-24.3.1v1.0.0-1.x86_64.rpm*
xr-cdp-8101-32h-24.3.1v1.0.0-1.x86_64.rpm*
<snip>

instead of specifying each one, you can just run the gisobuild command as shown below:

./gisobuild.py --iso /path/to/iso/8000-x64-24.1.2.iso --repo /path/to/repo/ --pkglist xr-cdp

Note that you do not need to provide the whole file name, or manually filter the RPMs added to the provided repository, as the script will do this for you.

Regardless of what specific PIDs your devices include it is the default to include all RPMs in the GISOs built so there is no need to try to select for particular PIDs. You can create the GISO with the full set of RPMs, and when you come to installing the GISO on your router, the correct packages for the PIDs available will be installed, and any unsuitable ones will be ignored.

Bugfixes can be included in the same repository as your packages.

$ ls /path/to/repo/bugfixes/
8000-x64-24.3.1-CSCab12345.tar.gz
8000-x64-24.3.1-CSCzy54321.tar.gz

They do not need to be manually unpacked before building the GISO. Any bugfixes present in the given repository will be included in the GISO without needing to specify them.

./gisobuild.py --iso /path/to/iso/8000-x64-24.3.1.iso --repo /path/to/repo/

Both RPMs and bugfixes can included in the GISO in a single command, as long as they are all in the repository. So the command above would also work if my repository looked like:

$ tree /path/to/repo/
/path/to/repo/
├── bugfixes
│   ├── 8000-x64-24.3.1-CSCab12345.tar.gz
│   ├── 8000-x64-24.3.1-CSCzy54321.tar.gz
│   ...
└── optional-rpms
    ├── cdp
    │   ├── xr-cdp-0deb3755978fea2a-24.3.1v1.0.0-1.x86_64.rpm*
    │   ├── xr-cdp-1b7551b6d2623937-24.3.1v1.0.0-1.x86_64.rpm*
    │   ├── xr-cdp-24.3.1v1.0.0-1.x86_64.rpm*
    │       ...
    ├── telnet
    │   ├── xr-telnet-0deb3755978fea2a-24.3.1.22Iv1.0.0-1.x86_64.rpm
    │   ├── xr-telnet-24.3.1.22Iv1.0.0-1.x86_64.rpm
    │       ...
        ...

## Note: older version of the tool

The legacy eXR python2-based gisobuild utility is available at:

 https://github.com/ios-xr/gisobuild/tree/gisobuild-exr-legacy

The command to pull the above code base is:

    git clone  --branch gisobuild-exr-legacy https://github.com/ios-xr/gisobuild/

gisobuild's People

Contributors

akshshar avatar cmohapat avatar psmears-cisco avatar syaragat avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gisobuild's Issues

RuntimeError("Error CMD=%s returned --->%s" % (cmd, out))

Need some help with the GISO creation.

Have earlier successfully created GISO on WSL. But when i have installed a new virtual debian machine and trying to run the script i get a runtime error. Isn't the script checking in the wrong tmp-directory for the isis rpm?

sadada@server1:~$ sudo python3 /home/sadada/gisobuild/src/gisobuild.py --iso 5500_762_software/ncs5500-mini-x-7.6.2.iso --repo /home/sadada/5500_762_software/ --pkglist ncs5500-isis-2.1.0.0-r762.x86_64.rpm --label v1
System requirements check [PASS]

Platform: ncs5500 Version: 7.6.2

Scanning repository [/home/sadada/5500_762_software]...

Building RPM Database...
Traceback (most recent call last):
File "/home/sadada/gisobuild/src/gisobuild.py", line 532, in
main()
File "/home/sadada/gisobuild/src/gisobuild.py", line 528, in main
execute_build(cli_args)
File "/home/sadada/gisobuild/src/exrmod/isotools_exr.py", line 40, in execute_build
system_build_main (cli_args, infile)
File "/home/sadada/gisobuild/src/exrmod/gisobuild_exr.py", line 193, in main
rpm_db.populate_rpmdb(fs_root, argv.rpmRepo, pkglist,
File "/home/sadada/gisobuild/src/exrmod/gisobuild_exr_engine.py", line 748, in populate_rpmdb
rpm.populate_mdata(fs_root, os.path.basename(file_name),
File "/home/sadada/gisobuild/src/exrmod/gisobuild_exr_engine.py", line 321, in populate_mdata
group_info = run_cmd("chroot "+fs_root+" rpm -qp --qf '%{GROUP}' "+rpm)
File "/home/sadada/gisobuild/src/exrmod/gisobuild_exr_engine.py", line 114, in run_cmd
raise RuntimeError("Error CMD=%s returned --->%s" % (cmd, out))
RuntimeError: Error CMD=chroot /home/sadada/output_gisobuild/tmp4xywesm2 rpm -qp --qf '%{GROUP}' ncs5500-isis-2.1.0.0-r762.x86_64.rpm returned --->

sadada@server1:~/output_gisobuild$ ls
logs tmp9_y6q13q

root@server1:/home/sadada/output_gisobuild/tmp9_y6q13q# ls
ncs5500-isis-2.1.0.0-r762.x86_64.rpm

sadada@server1:~/output_gisobuild/logs$ more gisobuild.log-2023-01-13:08:19:04.198732
2023-01-13 08:19:04:: Performing System requirements check...
2023-01-13 08:19:04:: Available space 25.50180435180664 GB
2023-01-13 08:19:04:: Required space 17.534122467041016 GB
2023-01-13 08:19:04:: System requirements check [PASS]
2023-01-13 08:19:52:: Golden ISO RPM_PATH: giso/
2023-01-13 08:19:52:: Skipping the top level iso wrapper
2023-01-13 08:22:03:: ISO ncs5500-mini-x extract path /home/sadada/output_gisobuild/tmp106otls0
2023-01-13 08:22:03:: Iso top initrd path /home/sadada/output_gisobuild/tmp106otls0
2023-01-13 08:22:16:: Intermal System_image.iso /home/sadada/5500_762_software/ncs5500-mini-x-7.6.2.iso
2023-01-13 08:22:16:: Cleaning Iso
2023-01-13 08:22:16:: iso extract path /home/sadada/output_gisobuild/tmp106otls0
2023-01-13 08:23:02::
Found Bundle ISO: /home/sadada/5500_762_software/ncs5500-mini-x-7.6.2.iso
2023-01-13 08:23:02::
Platform: ncs5500 Version: 7.6.2
2023-01-13 08:25:55:: ISO ncs5500-mini-x extract path /home/sadada/output_gisobuild/tmp4xywesm2
2023-01-13 08:25:55::
Scanning repository [/home/sadada/5500_762_software]...

2023-01-13 08:25:55::
File list After Unification [['/home/sadada/5500_762_software/ncs5500-isis-2.1.0.0-r762.x86_64.rpm']]

2023-01-13 08:25:55:: Building RPM Database...
2023-01-13 08:25:56:: Cleaning Iso
2023-01-13 08:25:56:: iso extract path /home/sadada/output_gisobuild/tmp4xywesm2

NCS540- Gisobuild failed: Missing environment requirements packaging

Hi,
I am trying to build a GISO for NCS 540 platform , ang getting this error "Gisobuild failed: Missing environment requirements packaging"
Just wondering what is the issue and possible solution for that?
I used the same script for ASR9k platform and successfully built the GISO image.

Not working with 6.6.25

Hi, we have tried to use it with XR 6.6.25 but it wont load in the configuration then.

We get it to work with XR 6.5.3 perfectly

Is there some features that are unsupported in 6.6.25 that is making it break?

GISO build failed with tar files including sysadmin in repo and pkglist has list of tar file names

When put tar files under repo and pkglist specify list of tar file name, if the it has sysadmin SMU tar file, the GISO build for eXR failed. I think validate_and_return_list() in gisobuild_exr_engine.py require similar logic for "if pkg.endswith('.tar'):" as "elif pkg.endswith('.rpm'):" to treat sysadmin SMUs.

The below is error message. I've put some debug lines so the line numbers in below error are not aligned with original source code.

Traceback (most recent call last):
  File "/opt/giso/./gisobuild/src/gisobuild.py", line 532, in <module>
    main()
  File "/opt/giso/./gisobuild/src/gisobuild.py", line 528, in main
    execute_build(cli_args)
  File "/opt/giso/gisobuild/src/exrmod/isotools_exr.py", line 40, in execute_build
    system_build_main (cli_args, infile)
  File "/opt/giso/gisobuild/src/exrmod/gisobuild_exr.py", line 193, in main
    rpm_db.populate_rpmdb(fs_root, argv.rpmRepo, pkglist,
  File "/opt/giso/gisobuild/src/exrmod/gisobuild_exr_engine.py", line 703, in populate_rpmdb
    self.tmp_smu_repo_path, repo_files = Rpmdb.validate_and_return_list(platform, repo_paths, pkglist)
  File "/opt/giso/gisobuild/src/exrmod/gisobuild_exr_engine.py", line 551, in validate_and_return_list
    result = run_cmd(cmd)
  File "/opt/giso/gisobuild/src/exrmod/gisobuild_exr_engine.py", line 114, in run_cmd
    raise RuntimeError("Error CMD=%s returned --->%s" % (cmd, out))
RuntimeError: Error CMD=rpm -qpR /opt/giso/output/R08_ISO_01/tmppo67pzdn/ncs5500-sysadmin-hostos-7.2.1.1-r721.CSCvv89835.host.arm.rpm | grep -e ncs5500 | grep  ' = ' returned --->warning: /opt/giso/output/R08_ISO_01/tmppo67pzdn/ncs5500-sysadmin-hostos-7.2.1.1-r721.CSCvv89835.host.arm.rpm: Header V4 RSA/SHA256 Signature, key ID 5746bd08: NOKEY

the output name of the tar files

the name of the output file is different than in the documentation:

output:
asr9k-goldenk9-x64-6.5.3-v1-migrate_to_eXR

Cisco documentation:
asr9k-goldenk9-x64-migrate_to_eXR.tar-6.5.3.v1

Enhancement to Generate warning for GISOs bigger than 1.8GB which are not supported

GISOs above 1.8GB in size are not supported as per CSCvw23760 and the Limitations section in the Customize Installation using Golden ISO chapter of the System Setup and Software Installation Guide for NCS 5500 (and similarly for ASR 9000). Systems can upgrade successfully using GISOs bigger than 1.8GB but then later run into problems the first time there is a hardware failure and replacement hardware needs to PXE boot to reimage/synchronise its software packages with the rest of the system.

This is an enhancement request so gisobuild refuses to build a GISO bigger than 1.8GB unless a force option is used or generates a warning that needs to be acknowledged for the GiSO build to complete.

Similarly when building GISOs for asr9k platform, warn for GISOs bigger than 1.599GB that they are not supported on RSP880-LT-SE/TR as per System Setup and Software Installation Guide for Cisco ASR 9000 Series Routers.

Minimum 15 GB of free disk space is required for building Golden ISO.

Hi team ,

I very aprecciated your development its a very good tool .

I have been build the Golden ISO for eXR 7.7.2 and when I run the script :

--clean: ./src/gisobuild.py --yamlfile /app/gisobuild/repo/< NAME OF MY YAML FILE >

The app show me the following log :

Minimum 15 GB of free disk space is required for building Golden ISO.
Error: System requirements check [FAIL]

My HD in VM have a 17GB of memory and avaliable 9.G . The questions are :

Why does the app need so much available space to build the goldeniso ?
Is it possible to modify the available space validation to a lower value? xr isos and rpm packages are generally no larger than 5 GB.

I very aprecciated your time , thanks in advance.

chroot: failed to run command No such file or directory\n"

('\n', 'Exception:', <type 'exceptions.RuntimeError'>, RuntimeError("Error CMD=chroot /mnt/hgfs/aaa/tmpfMc211 rpm -qp --qf '%{NAME};%{VERSION};%{RELEASE};%{ARCH};%{PACKAGETYPE};%{PACKAGEPRESENCE};%{PIPD};%{CISCOHW};%{CARDTYPE};%{BUILDTIME};%{GROUP};%{VMTYPE};%{SUPPCARDS};%{PREFIXES};%{XRRELEASE};' asr9k-bng-x64-1.0.0.0-r702.x86_64.rpm returned --->chroot: failed to run command \xe2\x80\x98rpm\xe2\x80\x99: No such file or directory\n",))
Detail logs: /mnt/hgfs/aaa/Giso_build.log-2020-07-27:17:17:50.748757

Anyone knows how to solve this issue?

Include check for generated files to avoid running into cXR file size limitation of 2 GB for a single file

cXR has a file size limitation of maximum 2 GB size for a single file. If you include lots of SMUs into the GISO or migration TAR then you end up with an error message when you try to copy that file to the harddisk of the ASR9k.

Please either stop the GISO build process with an error if the generated file exceeds that limiation or at least drop a warning at the end to avoid unnecessary service requests.

Thanks!

iosls.py index error

Running the following helper script for LNT isols.py
located at src/lntmod

The command referenced in this guide fails on python3.6

https://xrdocs.io/8000/tutorials/8000-software-xr7-giso/#giso-verification

root@NA----DEV-Machine:~/gisobuild/src/lntmod# ./isols.py /root/gisobuild/nsight_builds/builds/N540L_752_v4/giso/ncs540l-golden-x86_64-7.5.2-N540L_752_v4.iso --optional-packages
Traceback (most recent call last):
File "./isols.py", line 28, in
sys.path.append(str(pathlib.Path(file).parents[1]))
File "/usr/lib/python3.6/pathlib.py", line 594, in getitem
raise IndexError(idx)
IndexError: 1

Changing the script to the following works

#!/usr/bin/env python3
# ----------------------------------------------------------------

""" Wrapper script to extract ISO information.

Copyright (c) 2022 Cisco and/or its affiliates.
This software is licensed to you under the terms of the Cisco Sample
Code License, Version 1.1 (the "License"). You may obtain a copy of the
License at

        https://developer.cisco.com/docs/licenses

All use of the material herein must be in accordance with the terms of
the License. All rights not expressly granted by the License are
reserved. Unless required by applicable law or agreed to separately in
writing, software distributed under the License is distributed on an "AS
IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
or implied.

"""

__all__ = ()

from pathlib import Path
import sys

sys.path.append(str(Path(__file__).resolve().parents[1]))
from lnt import tools


if __name__ == "__main__":
    tools.isols(sys.argv[1:])

iso-read tool on line 160

On line 160, in function create_migration_tar. You reference a command "iso-read" which is not found in the dependencies. After some research, it seems that this tool is deprecated. Please replace this with mkisofs.

FileNotFound Error or File already exists

either it kills itself cause there is already such a directory or it kills itself when there isnt the "GisoMountDir" whatever that is... (when u run without --clean)

cc@matze-vm-001:~/golden_iso_generation/gisobuild$ ./src/gisobuild.py --iso ncs540-mini-x-6.6.3.iso --out-directory test --clean
Traceback (most recent call last):
  File "/home/cc/golden_iso_generation/gisobuild/./src/gisobuild.py", line 531, in <module>
    main()
  File "/home/cc/golden_iso_generation/gisobuild/./src/gisobuild.py", line 527, in main
    execute_build(cli_args)
  File "/home/cc/golden_iso_generation/gisobuild/src/exrmod/isotools_exr.py", line 38, in execute_build
    system_resource_check (cli_args)
  File "/home/cc/golden_iso_generation/gisobuild/src/exrmod/gisobuild_exr.py", line 71, in system_resource_check
    disk = os.statvfs(args.out_directory)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'test'

cc@matze-vm-001:~/golden_iso_generation/gisobuild$ 
cc@matze-vm-001:~/golden_iso_generation/gisobuild$ ./src/gisobuild.py --iso ncs540-mini-x-6.6.3.iso --out-directory ./test --clean
Traceback (most recent call last):
  File "/home/cc/golden_iso_generation/gisobuild/./src/gisobuild.py", line 531, in <module>
    main()
  File "/home/cc/golden_iso_generation/gisobuild/./src/gisobuild.py", line 527, in main
    execute_build(cli_args)
  File "/home/cc/golden_iso_generation/gisobuild/src/exrmod/isotools_exr.py", line 38, in execute_build
    system_resource_check (cli_args)
  File "/home/cc/golden_iso_generation/gisobuild/src/exrmod/gisobuild_exr.py", line 71, in system_resource_check
    disk = os.statvfs(args.out_directory)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: './test'
cc@matze-vm-001:~/golden_iso_generation/gisobuild$ ./src/gisobuild.py --iso ncs540-mini-x-6.6.3.iso --label test
Error: Tool chroot not found.
Failed to find pre-req tools, Check PATH Env variable or install required tools.
Error: System requirements check [FAIL]
cc@matze-vm-001:~/golden_iso_generation/gisobuild$ sudo ./src/gisobuild.py --iso ncs540-mini-x-6.6.3.iso --label test
Output directory /home/cc/golden_iso_generation/gisobuild/output_gisobuild exists. 
Consider passing --clean as input or remove directory and rerun.
[Errno 17] File exists: '/home/cc/golden_iso_generation/gisobuild/output_gisobuild'
cc@matze-vm-001:~/golden_iso_generation/gisobuild$ sudo ./src/gisobuild.py --iso ncs540-mini-x-6.6.3.iso --label test --clean
System requirements check [PASS]
Traceback (most recent call last):
  File "/home/cc/golden_iso_generation/gisobuild/./src/gisobuild.py", line 531, in <module>
    main()
  File "/home/cc/golden_iso_generation/gisobuild/./src/gisobuild.py", line 527, in main
    execute_build(cli_args)
  File "/home/cc/golden_iso_generation/gisobuild/src/exrmod/isotools_exr.py", line 40, in execute_build
    system_build_main (cli_args, infile)
  File "/home/cc/golden_iso_generation/gisobuild/src/exrmod/gisobuild_exr.py", line 168, in main
    giso.set_giso_info(argv.bundle_iso)
  File "/home/cc/golden_iso_generation/gisobuild/src/exrmod/gisobuild_exr_engine.py", line 2263, in set_giso_info
    self.do_extend_giso(self.bundle_iso.iso_mount_path)
  File "/home/cc/golden_iso_generation/gisobuild/src/exrmod/gisobuild_exr_engine.py", line 2331, in do_extend_giso
    with open(GisoMountDir+"/giso_info.txt", 'r') as fd:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/home/cc/golden_iso_generation/gisobuild/output_gisobuild/tmpbnuruukb/giso_info.txt'

Problem creating giso for 7.11.2

I'm running into an issue where the script is seeing different hashes when comparing the rpm in the repo to the rpm in the output_gisobuild/ directory:

python3 gisobuild.py --iso /home/admin/7.11.2iso/ncs540l-x64-7.11.2.iso --repo /home/admin/7.11.2repo/ --clean
Building GISO...
Gisobuild script failed, see /home/admin/gisobuild/src/output_gisobuild/logs/gisobuild.log for more info: Packages have been found in multiple locations with different hashes:
These RPMs for xr-track-n540x-16z8q2c-7.11.2v1.0.0-1.x86_64 are not identical: /home/admin/gisobuild/src/output_gisobuild/giso/groups/group.main/packages/xr-track-n540x-16z8q2c-7.11.2v1.0.0-1.x86_64.rpm, /home/admin/7.11.2repo/xr-track-n540x-16z8q2c-7.11.2v1.0.0-1.x86_64.rpm
These RPMs for xr-track-n540x-16z4g8q2c-7.11.2v1.0.0-1.x86_64 are not identical: /home/admin/gisobuild/src/output_gisobuild/giso/groups/group.main/packages/xr-track-n540x-16z4g8q2c-7.11.2v1.0.0-1.x86_64.rpm, /home/admin/7.11.2repo/xr-track-n540x-16z4g8q2c-7.11.2v1.0.0-1.x86_64.rpm
These RPMs for xr-track-n540x-12z16g-7.11.2v1.0.0-1.x86_64 are not identical: /home/admin/gisobuild/src/output_gisobuild/giso/groups/group.main/packages/xr-track-n540x-12z16g-7.11.2v1.0.0-1.x86_64.rpm, /home/admin/7.11.2repo/xr-track-n540x-12z16g-7.11.2v1.0.0-1.x86_64.rpm
...

ISO build inside Podman container fails

When running the script inside rootless Podman container ( $UID = 0) causes the script to hang.
There is a workaround to use Podman run parameter '--userns=keep-id' :

2021-02-10 12:56:47:: ISO /home/git/gisobuild/tmpbz8bv034/iso/host.iso vm_type HOST searchkey HOST.ISO
2021-02-10 12:56:51:: Cleaning Iso
2021-02-10 12:56:51:: iso extract path /home/git/gisobuild/tmpphdrdw8f
2021-02-10 12:56:51:: Cleaning Iso
2021-02-10 12:56:51:: iso extract path /home/git/gisobuild/tmpbz8bv034
2021-02-10 12:56:52:: Exiting with exception
2021-02-10 12:56:52:: TB:
Traceback (most recent call last):
File "/home/git/gisobuild/./gisobuild.py", line 3235, in
main(args)
File "/home/git/gisobuild/./gisobuild.py", line 3039, in main
supp_arch = giso.get_supp_arch(vm_type)
File "/home/git/gisobuild/./gisobuild.py", line 1859, in get_supp_arch
fs_root = iso.get_iso_extract_path()
File "/home/git/gisobuild/./gisobuild.py", line 1425, in get_iso_extract_path
run_cmd("zcat -f %s%s | cpio -id" % (self.iso_mount_path,
File "/home/git/gisobuild/./gisobuild.py", line 76, in run_cmd
raise RuntimeError("Error CMD=%s returned --->%s" % (cmd, out))
RuntimeError: Error CMD=zcat -f /home/git/gisobuild/tmplrxzonj8/boot/initrd.img | cpio -id returned --->cpio: var: C
annot change ownership to uid 434115, gid 25: Invalid argument
cpio: var/backups: Cannot change ownership to uid 434115, gid 25: Invalid argument
cpio: var/lib: Cannot change ownership to uid 434115, gid 25: Invalid argument
.
.
.

eXR GISO: CLI option can't override item in yaml file

The below behaviour explained in README is not working

To override any input in the yaml config file, please use the corresponding cli option and parameter.
./src/gisobuild.py --yamlfile <input_yaml_cfg> --label <new_label>
The above command will override the label specified in yaml file with new option provided via cli option --label.

Builds failing since v0.35: boot.catalog returned --->/bin/sh: 1: Syntax error: redirection unexpected

Tool broken since version 0.35.

Environment:

$ cat /etc/issue
Ubuntu 20.04.3 LTS \n \l

Version 0.34 works:

$ ./gisobuild-0.34.py -v
gisobuild-0.34.py (version 0.34)
$ sudo ./gisobuild-0.34.py -l v0 -i ncs5500-mini-x-7.1.2.iso -r ncs5500-sysadmin-7.1.2.CSCvx16766

System requirements check [PASS]
Golden ISO build process starting...

Platform: ncs5500 Version: 7.1.2

Scanning repository [/usr/local/giso/giso-ncs5500-712/ncs5500-sysadmin-7.1.2.CSCvx16766]...

Building RPM Database...

Total 4 RPM(s) present in the repository path provided in CLI
[ 1] ncs5500-sysadmin-system-7.1.2.3-r712.CSCvx16766.x86_64.rpm
[ 2] ncs5500-sysadmin-ncs5500-7.1.2.3-r712.CSCvx16766.arm.rpm
[ 3] ncs5500-sysadmin-ncs5500-7.1.2.3-r712.CSCvx16766.x86_64.rpm
[ 4] ncs5500-sysadmin-system-7.1.2.3-r712.CSCvx16766.arm.rpm

Following SYSADMIN x86_64 rpm(s) will be used for building Golden ISO:

	(+) ncs5500-sysadmin-system-7.1.2.3-r712.CSCvx16766.x86_64.rpm
	(+) ncs5500-sysadmin-ncs5500-7.1.2.3-r712.CSCvx16766.x86_64.rpm

Following SYSADMIN arm rpm(s) will be used for building Golden ISO:

	(+) ncs5500-sysadmin-ncs5500-7.1.2.3-r712.CSCvx16766.arm.rpm
	(+) ncs5500-sysadmin-system-7.1.2.3-r712.CSCvx16766.arm.rpm

	...RPM signature check [PASS]

	...RPM compatibility check [PASS]

Building Golden ISO...
Summary .....

SYSADMIN rpms:
	ncs5500-sysadmin-system-7.1.2.3-r712.CSCvx16766.x86_64.rpm
	ncs5500-sysadmin-ncs5500-7.1.2.3-r712.CSCvx16766.x86_64.rpm
	ncs5500-sysadmin-ncs5500-7.1.2.3-r712.CSCvx16766.arm.rpm
	ncs5500-sysadmin-system-7.1.2.3-r712.CSCvx16766.arm.rpm

	...Golden ISO creation SUCCESS.

Golden ISO Image Location: /usr/local/giso/giso-ncs5500-712/ncs5500-golden-x-7.1.2-v0.iso

Version 0.35 broken:

$ gisobuild.py -v
gisobuild.py (version 0.35)
$ gisobuild.py -l v0 -i ncs5500-mini-x-7.1.2.iso -r ncs5500-sysadmin-7.1.2.CSCvx16766

System requirements check [PASS]
Golden ISO build process starting...

 Exception: <class 'RuntimeError'> Error CMD=IFS='[] ' read -a a <<< $(isoinfo -i ncs5500-mini-x-7.1.2.iso -R -l | grep " boot.catalog") && dd bs=2048 skip=${a[8]} if=ncs5500-mini-x-7.1.2.iso | head -${a[4]}c > /usr/local/giso/giso-ncs5500-712/tmpq7k5uzsq/boot.catalog returned --->/bin/sh: 1: Syntax error: redirection unexpected

Detailed logs:

2021-09-09 08:18:13::  ##############START#####################
2021-09-09 08:18:13::  Tool version is 0.35
2021-09-09 08:18:13::  Info: XR Congifuration file not specified.
2021-09-09 08:18:13::  Info: Golden ISO will not have XR configuration file
2021-09-09 08:18:13::  Info: User script is not specified.
2021-09-09 08:18:13::  Argument passed to /usr/local/bin/gisobuild.py : Namespace(bundle_iso=['ncs5500-mini-x-7.1.2.iso'], fullISO=False, gisoExtend=False, gisoInfo=False, gisoLabel=['v0'], migTar=False, pkglist=None, rpmRepo=[['ncs5500-sysadmin-7.1.2.CSCvx16766']], script=None, skipDepCheck=False, x86_only=False, xrConfig=None, ztp_ini=None)
2021-09-09 08:18:13::
Performing System requirements check...
2021-09-09 08:18:13::
System requirements check [PASS]
2021-09-09 08:18:13::  Golden ISO build process starting...
2021-09-09 08:18:13::  Cleaning Iso
2021-09-09 08:18:13::  Exiting with exception
2021-09-09 08:18:13::  TB:
Traceback (most recent call last):
 File "/usr/local/bin/gisobuild.py", line 3702, in <module>
   main(args)
 File "/usr/local/bin/gisobuild.py", line 3367, in main
   giso.set_giso_info(argv.bundle_iso[0])
 File "/usr/local/bin/gisobuild.py", line 2016, in set_giso_info
   self.bundle_iso.set_iso_info(iso_path)
 File "/usr/local/bin/gisobuild.py", line 1699, in set_iso_info
   readiso(self.iso_path, self.iso_mount_path)
 File "/usr/local/bin/gisobuild.py", line 3665, in readiso
   run_cmd(cmd)
 File "/usr/local/bin/gisobuild.py", line 94, in run_cmd
   raise RuntimeError("Error CMD=%s returned --->%s" % (cmd, out))
RuntimeError: Error CMD=IFS='[] ' read -a a <<< $(isoinfo -i ncs5500-mini-x-7.1.2.iso -R -l | grep " boot.catalog") && dd bs=2048 skip=${a[8]} if=ncs5500-mini-x-7.1.2.iso | head -${a[4]}c > /usr/local/giso/giso-ncs5500-712/tmpq7k5uzsq/boot.catalog returned --->/bin/sh: 1: Syntax error: redirection unexpected

Where can I get RPM 5.0?

Anyone can provide RPM 5.0 packet? I can't find a proper one and many errors occurred after I upgrade it(seems I downloaded a wrong one)

RPM packages missing from the giso.

Hi,
I've built an iso using a repository that had around 50 RPMs in it. While the iso was built without any warning or error, the image installed on the router has significantly less RPMs than what it should have.

As an example: ncs5500-dpa-3.0.0.8-r7721.CSCwi35880.x86_64.rpm was inside of the repository but I cannot see that installed, when on the router I issue the "show install active summary" on the router I see:

Active Packages: 17
ncs5500-xr-7.7.21 version=7.7.21 [Boot image]
libpci3-3.6.4.p1-r0.r7721.CSCwe49269.xr
ncs5500-mpls-2.1.0.0-r7721
ncs5500-mpls-te-rsvp-3.1.0.0-r7721
ncs5500-ospf-2.0.0.0-r7721
ncs5500-mgbl-3.0.0.0-r7721
ncs5500-mcast-3.0.0.0-r7721
ncs5500-k9sec-3.1.0.0-r7721
ncs5500-infra-5.1.0.6-r7721.CSCwi09344
ncs5500-parser-2.0.0.1-r7721.CSCwf53989
ncs5500-iosxr-fwding-4.0.0.8-r7721.CSCwh79153
ncs5500-ospf-2.0.0.1-r7721.CSCwi08034
ncs5500-bgp-2.0.0.4-r7721.CSCwe14754
ncs5500-dpa-3.0.0.9-r7721.CSCwf98671
ncs5500-dpa-fwding-4.0.0.7-r7721.CSCwf57277
ncs5500-mpls-te-rsvp-3.1.0.1-r7721.CSCwe78378
ncs5500-os-support-4.0.0.2-r7721.CSCwi26163

and in admin:

ncs5500-sysadmin-7.7.21 version=7.7.21 [Boot image]
libpci3-3.6.4.p1-r0.r7721.CSCwe49269.admin
ncs5500-sysadmin-ncs5500-7.7.21.2-r7721.CSCwe59739
libpci3-3.6.4.p1-r0.r7721.CSCwe49269.host

Is the giso script skipping all RPMs not listed or, they're being merged into others? Could you please advise?

Thank you
rpms_packaged_in_giso.txt
gisobuild.log-2024-02-29%3A16%3A55%3A41.log

gisobuild not working

╭─lab at netdevops in ~/github/gisobuild/src on master✔ 24-03-27 - 15:45:52
╰─(vntdvops) ⠠⠵ ./gisobuild.py --iso ~/cisco7_11_1/asr9k-mini-x64-7.11.1.iso --repo ~/cisco7_11_1/*.rpm --pkglist ~/cisco7_11_1/asr9k-isis-x64-1.0.0.0-r7111.x86_64.rpm
Traceback (most recent call last):
  File "/home/lab/github/gisobuild/src/utils/gisoutils.py", line 181, in is_platform_exr
    files_top = _subprocs.execute(
                ^^^^^^^^^^^^^^^^^^
  File "/home/lab/github/gisobuild/src/utils/_subprocs.py", line 106, in execute
    return _execute_internal(
           ^^^^^^^^^^^^^^^^^^
  File "/home/lab/github/gisobuild/src/utils/_subprocs.py", line 70, in _execute_internal
    proc = subprocess.run(
           ^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/subprocess.py", line 548, in run
    with Popen(*popenargs, **kwargs) as process:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/subprocess.py", line 1026, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/lib/python3.11/subprocess.py", line 1950, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'isoinfo'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/lab/github/gisobuild/src/./gisobuild.py", line 531, in <module>
    main()
  File "/home/lab/github/gisobuild/src/./gisobuild.py", line 448, in main
    cli_args = validate_and_setup_args(cli_args)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/lab/github/gisobuild/src/./gisobuild.py", line 320, in validate_and_setup_args
    args.exriso = gisoutils.is_platform_exr (args.iso)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/lab/github/gisobuild/src/utils/gisoutils.py", line 191, in is_platform_exr
    raise AssertionError(
AssertionError: Failed to determine input ISO image type.
╭─lab at netdevops in ~/github/gisobuild/src on master✔ 24-03-27 - 15:46:28
╰─(vntdvops) ⠠⠵ ll ~/cisco7_11_1
total 1.7G
-rw-r--r-- 1 lab lab 3.7M Mar 27 15:04 asr9k-isis-x64-1.0.0.0-r7111.x86_64.rpm
-rw-r--r-- 1 lab lab 1.6M Mar 27 15:04 asr9k-k9sec-x64-1.0.0.0-r7111.x86_64.rpm
-rw-r--r-- 1 lab lab  13M Mar 27 15:04 asr9k-mcast-x64-1.0.0.0-r7111.x86_64.rpm
-rw-r--r-- 1 lab lab  21M Mar 27 15:04 asr9k-mgbl-x64-1.0.0.0-r7111.x86_64.rpm
-rw-r--r-- 1 lab lab 1.7G Mar 27 15:04 asr9k-mini-x64-7.11.1.iso
-rw-r--r-- 1 lab lab 8.6M Mar 27 15:04 asr9k-mpls-te-rsvp-x64-1.0.0.0-r7111.x86_64.rpm
-rw-r--r-- 1 lab lab 2.2M Mar 27 15:04 asr9k-mpls-x64-1.0.0.0-r7111.x86_64.rpm
-rw-r--r-- 1 lab lab 4.0M Mar 27 15:04 asr9k-ospf-x64-1.0.0.0-r7111.x86_64.rpm
╭─lab at netdevops in ~/github/gisobuild/src on master✔ 24-03-27 - 15:46:33
╰─(vntdvops) ⠠⠵

usb-boot support for asr9000

When creating an giso for asr9906. I get this unsupported message below on the latest public gisobuild: https://github.com/ios-xr/gisobuild/tree/d447e9e83cbe71b836dd2e64ee54f63019432885:

        ...Golden ISO creation SUCCESS.

Golden ISO Image Location: /var/gisobuild/7921/asr9k-goldenk9-x64-7.9.21-iso.iso
Creating USB Boot zip...
Skipping USB Boot Zip creation: Not supported for platform: asr9k
USB BOOT ZIP NEEDED?: Contact asr9k team to add support.

Please add support for usb boot zip for the asr9k platform.

Unable to create GISO

Hi
I try to create the GISO on a Ubuntu 22.04.
System requirements check passed, but creation fails.
Any help is appreciated
thanks in advance for your help

root@tzhpemac-ubu20:/home/tzhpemac/GISO# sudo ./gisobuild/src/gisobuild.py --iso /home/tzhpemac/GISO/RPM/ASR9K-x64-iosxr-7.4.2/asr9k-mini-x64-7.4.2.iso --repo /home/tzhpemac/GISO/RPM/7.4.2_SMU/ --clean
System requirements check [PASS]
Traceback (most recent call last):
File "/home/tzhpemac/GISO/./gisobuild/src/gisobuild.py", line 513, in
main()
File "/home/tzhpemac/GISO/./gisobuild/src/gisobuild.py", line 509, in main
execute_build(cli_args)
File "/home/tzhpemac/GISO/gisobuild/src/exrmod/isotools_exr.py", line 40, in execute_build
system_build_main (cli_args, infile)
File "/home/tzhpemac/GISO/gisobuild/src/exrmod/gisobuild_exr.py", line 101, in main
giso.set_giso_info(argv.bundle_iso)
File "/home/tzhpemac/GISO/gisobuild/src/exrmod/gisobuild_exr_engine.py", line 2056, in set_giso_info
if not args.optimize:
AttributeError: 'Namespace' object has no attribute 'optimize'

root@tzhpemac-ubu20:/home/tzhpemac/GISO# sudo ./gisobuild/src/gisobuild.py --version
gisobuild.py (version 1.0)

root@tzhpemac-ubu20:/home/tzhpemac/GISO# more /home/tzhpemac/GISO/gisobuild/src/output_gisobuild/logs/gisobuild.log-2022-06-21:11:03:19.032310
2022-06-21 11:03:19:: Performing System requirements check...
2022-06-21 11:03:19:: Available space 30.58446502685547 GB
2022-06-21 11:03:19:: Required space 14.372596740722656 GB
2022-06-21 11:03:19:: System requirements check [PASS]
2022-06-21 11:03:42:: Cleaning Iso

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

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

Recommend Topics

  • javascript

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

  • web

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

  • server

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

  • Machine learning

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

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.