{"id":15010011,"url":"https://github.com/adriansev/jalien_py","last_synced_at":"2025-07-16T03:46:12.479Z","repository":{"id":143309529,"uuid":"165256113","full_name":"adriansev/jalien_py","owner":"adriansev","description":"Python interface to web-socket based interface to ALICE Grid Services","archived":false,"fork":false,"pushed_at":"2025-07-12T12:32:26.000Z","size":1434,"stargazers_count":5,"open_issues_count":0,"forks_count":6,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-07-12T14:40:44.761Z","etag":null,"topics":["python","python-3","python-3-6","websockets","websockets-client"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/adriansev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-01-11T14:25:00.000Z","updated_at":"2025-07-12T12:32:29.000Z","dependencies_parsed_at":"2023-06-25T23:31:37.540Z","dependency_job_id":"cf311ee5-a1dd-4ff0-873f-8d46aeda5341","html_url":"https://github.com/adriansev/jalien_py","commit_stats":{"total_commits":1095,"total_committers":6,"mean_commits":182.5,"dds":"0.019178082191780854","last_synced_commit":"a3e4c1f1f34ef87f6e8dab3db867b4699383aa48"},"previous_names":[],"tags_count":66,"template":false,"template_full_name":null,"purl":"pkg:github/adriansev/jalien_py","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adriansev%2Fjalien_py","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adriansev%2Fjalien_py/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adriansev%2Fjalien_py/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adriansev%2Fjalien_py/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adriansev","download_url":"https://codeload.github.com/adriansev/jalien_py/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adriansev%2Fjalien_py/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265479852,"owners_count":23773627,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["python","python-3","python-3-6","websockets","websockets-client"],"created_at":"2024-09-24T19:29:31.859Z","updated_at":"2025-07-16T03:46:12.470Z","avatar_url":"https://github.com/adriansev.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"![PyPI](https://img.shields.io/pypi/v/alienpy?style=plastic)  \n\n## alien.py - Python interface to websocket endpoint of [ALICE](https://alice-collaboration.web.cern.ch) Grid Services  \n\nQuick containerized testing:   \n`singularity run library://adriansev/default/alienpy:latest [cmd]`   \nor   \n`singularity run oras://registry.cern.ch/asevcenc/alienpy:latest [cmd]`   \n\n`latest` _usually_ would point to master but not always.(if desired and needed, request by email a new latest tag)   \nsee [here](https://cloud.sylabs.io/library/_container/6124dbd7d63fe43757facc7e) what tags are available and their dates of creation.   \n\nThe docker images can be found @[DockerHub](https://hub.docker.com/r/adriansevcenco/alienpy.dock/tags)   \n```\ndocker run -it \\\n--user $(id -u):$(id -g) \\\n--workdir=\"/home/$USER\" \\\n--env TMPDIR=\"${TMPDIR:-/tmp}\" \\\n--volume=\"/etc/group:/etc/group:ro\" \\\n--volume=\"/etc/passwd:/etc/passwd:ro\" \\\n--volume=\"/etc/shadow:/etc/shadow:ro\" \\\n--volume=\"/home:/home\" \\\nadriansevcenco/alienpy.dock:latest [cmd]\n```\n\nif no cmd is passed, the shell form will start\n\n### Basic usage\nCan be used as command mode and interactive mode :  \n1. Command mode :  \n`alien.py \u003ccommand\u003e  `\ne.g :  \n`alien.py pwd  `  \n**N.B.** command/arguments must be quoted to avoid being interpreted by the shell:  \n`alien.py 'rm my_alien_dir/*'`\n\n2. Interactive/shell mode e.g :  \n```\nalien.py\nWelcome to the ALICE GRID\nsupport mail: adrian.sevcenco@cern.ch\n\nAliEn[asevcenc]:/alice/cern.ch/user/a/asevcenc/ \u003epwd\n/alice/cern.ch/user/a/asevcenc/\nAliEn[asevcenc]:/alice/cern.ch/user/a/asevcenc/ \u003ewhoami\nasevcenc\nAliEn[asevcenc]:/alice/cern.ch/user/a/asevcenc/ \u003e\n```\n* For both command and shell mode multiple commands can be issued separated by `;`  \n* The interactive mode save the command history in `${HOME}/.alienpy_history` and it can be navigated with Up/Down keys  \n* `!` is understood as running into shell whatever command follows  \n* `|` pipe whatever output of AliEn command to a shell command (that follows after the first(only the first) `|`)\n\n### Environment steering\n\nThere are a few environment variables that influence the mechanics of the script :  \n* JALIEN_TOKEN_CERT, JALIEN_TOKEN_KEY - will overwrite the defaults; they are either full path certificate,key token files OR their respective contents  \n* If set the following will be honored: X509_USER_CERT, X509_USER_KEY, X509_CERT_DIR or X509_CERT_FILE  \n* ALIENPY_TIMEOUT will change the interval for keep-alive mechanics.\n* ALIENPY_CONNECT_TRIES - default = 3 : number of connect trials\n* ALIENPY_CONNECT_TRIES_INTERVAL - default = 0.5 : seconds between connection trials\n\n---\nFor debugging purposes there are a few environment toggles :  \n* ALIENPY_JSON - print the unprocessed json message from the server   \n* ALIENPY_JSONRAW - print the unprocessed byte stream message from the server   \n---\n* ALIENPY_JCENTRAL - it will connect to this server, ignoring any other options   \n* ALIENPY_NO_STAGGER - disable staggered parallel host resolution and socket creation (see [RFC8305](https://tools.ietf.org/html/rfc8305))\n---\n* ALIENPY_DEBUG - detailed debug messages will be found in ALIENPY_DEBUG_FILE\n* ALIENPY_DEBUG_FILE - set the location of log file\n* ALIENPY_DEBUG_APPEND - is set the output will be appended to the present log file. if not the file will be overwritten.\n* ALIENPY_TIMECONNECT - if set will report time for websocket creation - e.g. `ALIENPY_TIMECONNECT=1 alien.py pwd`\n* ALIENPY_TIMING - report detailed operation timing in the log file.\n\n---\nDEBUG file copy operations:\n* ALIENPY_KEEP_META - keep the metafile generated for download operations. Can be directly used with xrdcp.\n* XRD_LOGLEVEL='Dump'\n* XRD_LOGFILE=xrdlog.txt\n   \nSee also the native XRootD environment toggles: [docs](https://xrootd.slac.stanford.edu/doc/man/xrdcp.1.html#ENVIRONMENT \"XRootD xrdcopy documentation\")   \n\n## Authentication\nThe authentication process needs the presence of a X509 certificate (enrolled into ALICE VO, see [here](https://alien.web.cern.ch/content/vo/alice/userregistration))\nand of a CA certificates directory for verification.\nThe default CA location that will be searched is within alice.cern.ch cvmfs repository\nIf not found, the CApath will default to /etc/grid-security/certificates\nIf these locations are not available, one _must_ set X509_CERT_DIR to a valid location\n\n\n## Command usage and examples  \n\nThe list of available commands can seen with: `?` or `help`   \nCommand help can be listed with: `? command`, `help command`, `command -h`  \n\n### Storage related operations\nThis section refer to any copy to/from grid or file interactions.   \n\n`cat/more/less` will download the target lfn to a temporary file and will act upon it while  \n`vi/nano/mcedit/edit` will, after the modification of downloaded temporary, backup the existing lfn, and upload the modified file  \nThe target file upload can support grid specifiers like those described in `cp` command e.g. `edit my_file@disk:2,SE1`  \n\n#### ```cp``` option  \n\ncp can take as arguments both files and directories and have the following options:  \n```\nalien.py cp -h\nCommand format is of the form of (with the strict order of arguments):\ncp \u003coptions\u003e src dst\nor\ncp \u003coptions\u003e -input input_file\n\nlocation prefixes are: file: | file:// | alien: | alien://\nif one prefix is specified the other operator is considered of the other kind (no local -\u003e local, or grid-\u003egrid operations allowed)\nif no prefix is specified, the src will be _first_ checked if local and then if remote.\n\n-input argument is a file with \u003esrc dst\u003c pairs\n\nafter each src,dst can be added comma separated specifiers in the form of: @disk:N,SE1,SE2,!SE3\nwhere disk selects the number of replicas and the following specifiers add (or remove) storage endpoints from the received list\noptions are the following :\n-h : print help\n-f : replace destination file (if destination is local it will be replaced only if integrity check fails)\n-P : enable persist on successful close semantic\n-cksum : check hash sum of the file; for downloads the central catalogue md5 will be verified;\nfor uploads (for xrootd client \u003e 4.12.0) a hash type will be negotiated with remote and transfer will be validated\n-y \u003cnr_sources\u003e : use up to the number of sources specified in parallel (N.B. Ignored as it breaks download of files stored in archives)\n-S \u003cadditional TPC streams\u003e : uses num additional parallel streams to do the transfer. (max = 15)\n-chunks \u003cnr chunks\u003e : number of chunks that should be requested in parallel\n-chunksz \u003cbytes\u003e : chunk size (bytes)\n-T \u003cnr_copy_jobs\u003e : number of parallel copy jobs from a set (for recursive copy); defaults to 8 for downloads\n-noxrdzip: circumvent the XRootD mechanism of zip member copy and download the archive and locally extract the intended member.\nN.B.!!! for recursive copy (all files) the same archive will be downloaded for each member.\nIf there are problems with native XRootD zip mechanism, download only the zip archive and locally extract the contents\n\nfor the recursive copy of directories the following options (of the find command) can be used:\n-glob \u003cglobbing pattern\u003e : this is the usual AliEn globbing format; N.B. this is NOT a REGEX!!! defaults to all \"*\"\n-select \u003cpattern\u003e : select only these files to be copied; N.B. this is a REGEX applied to full path!!!\n-name \u003cpattern\u003e : select only these files to be copied; N.B. this is a REGEX applied to a directory or file name!!!\n-name \u003cverb\u003e_string : where verb = begin|contain|ends|ext and string is the text selection criteria.\nverbs are aditive : -name begin_myf_contain_run1_ends_bla_ext_root\nN.B. the text to be filtered cannot have underline \u003c_\u003e within!!!\n-parent \u003cparent depth\u003e : in destination use this \u003cparent depth\u003e to add to destination ; defaults to 0\n-a : copy also the hidden files .* (for recursive copy)\n-j \u003cqueue_id\u003e : select only the files created by the job with \u003cqueue_id\u003e  (for recursive copy)\n-l \u003ccount\u003e : copy only \u003ccount\u003e nr of files (for recursive copy)\n-o \u003coffset\u003e : skip first \u003coffset\u003e files found in the src directory (for recursive copy)\n```\n\n`.`, `..` are interpreted for all grid names (lfns)  \n`%ALIEN` is converted to user AliEn home directory  \nlfns that don't start with a `/` will have the current directory appended before being processed\n\n### Miscellaneous\n\n#### The shell prompt\nIt can show date and/or local directory:   \n* `prompt date` will toggle on/off the date  \n* `prompt pwd` will toggle on/off the local current directory  \nFor permanent setting the following are env variables are available : ALIENPY_PROMPT_DATE, ALIENPY_PROMPT_CWD   \n```\nAliEn[asevcenc]:/alice/cern.ch/user/a/asevcenc/ \u003eprompt date\n2020-02-07T16:49:05 AliEn[asevcenc]:/alice/cern.ch/user/a/asevcenc/ \u003e\n\nAliEn[asevcenc]:/alice/cern.ch/user/a/asevcenc/ \u003eprompt pwd\nAliEn[asevcenc]:/alice/cern.ch/user/a/asevcenc/ local:/home.hdd/adrian/work-GRID/jalien_py \u003e\n```\n\n---\n##### CWD persistence\nDefault behaviour is to save (and then restore) the last used CWD.   \nThis bevahiour can be disabled with the env var ALIENPY_NO_CWD_RESTORE   \n\n---\n##### `ls` aliases\n`ll`, `la`, `lla` are aliases to `ls -l`, `ls -a`, `ls -la`\n\n---\n##### Custom aliases   \nA fixed file `${HOME}/.alienpy_aliases` can be used to define alias=string pairs that will be used(translated) in the usage of alien.py. One can do `myalias=cmd1;cmd2;cmd3` and the `myalias` string will be replaced by it's value when used.   \n\n---\n##### Python shell\n`term` command will open an _Python_ shell within the context of alien.py and with a session object loaded\n\n---\n##### API usage\nsee examples directory\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadriansev%2Fjalien_py","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadriansev%2Fjalien_py","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadriansev%2Fjalien_py/lists"}