Repository: PBSPro/pbspro
Branch: master
Commit: cd7ab5edaf03
Files: 1196
Total size: 17.5 MB
Directory structure:
gitextract_2t7z1zdf/
├── .clang-format
├── .github/
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── checkclang
│ ├── checkpep8
│ └── runchecks
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── COPYRIGHT
├── INSTALL
├── LICENSE
├── Makefile.am
├── PBS_License.txt
├── README.md
├── autogen.sh
├── azure-pipelines.yml
├── buildutils/
│ ├── Makefile.am
│ └── attr_parser.py
├── ci/
│ ├── README.md
│ ├── ci
│ └── etc/
│ ├── build-pbs-packages.sh
│ ├── ci-script-wrapper.service
│ ├── configure_node.sh
│ ├── container-env-setup.sh
│ ├── container-init
│ ├── do.sh
│ ├── do_sanitize_mode.sh
│ ├── docker-entrypoint
│ ├── gen_ptl_json.sh
│ ├── id_rsa
│ ├── id_rsa.pub
│ ├── install-system-packages
│ ├── killit.sh
│ ├── macros
│ └── sudoers-overrides
├── configure.ac
├── doc/
│ ├── Makefile.am
│ ├── man1/
│ │ ├── pbs_hook_attributes.7B
│ │ ├── pbs_job_attributes.7B
│ │ ├── pbs_login.1B
│ │ ├── pbs_module.7B
│ │ ├── pbs_node_attributes.7B
│ │ ├── pbs_professional.7B
│ │ ├── pbs_python.1B
│ │ ├── pbs_queue_attributes.7B
│ │ ├── pbs_ralter.1B
│ │ ├── pbs_rdel.1B
│ │ ├── pbs_release_nodes.1B
│ │ ├── pbs_resources.7B
│ │ ├── pbs_resv_attributes.7B
│ │ ├── pbs_rstat.1B
│ │ ├── pbs_rsub.1B
│ │ ├── pbs_sched_attributes.7B
│ │ ├── pbs_server_attributes.7B
│ │ ├── pbsdsh.1B
│ │ ├── qalter.1B
│ │ ├── qdel.1B
│ │ ├── qhold.1B
│ │ ├── qmove.1B
│ │ ├── qmsg.1B
│ │ ├── qorder.1B
│ │ ├── qrerun.1B
│ │ ├── qrls.1B
│ │ ├── qselect.1B
│ │ ├── qsig.1B
│ │ ├── qstat.1B
│ │ └── qsub.1B
│ ├── man3/
│ │ ├── pbs_alterjob.3B
│ │ ├── pbs_asyrunjob.3B
│ │ ├── pbs_confirmresv.3B
│ │ ├── pbs_connect.3B
│ │ ├── pbs_default.3B
│ │ ├── pbs_deljob.3B
│ │ ├── pbs_delresv.3B
│ │ ├── pbs_disconnect.3B
│ │ ├── pbs_geterrmsg.3B
│ │ ├── pbs_holdjob.3B
│ │ ├── pbs_locjob.3B
│ │ ├── pbs_manager.3B
│ │ ├── pbs_modify_resv.3B
│ │ ├── pbs_movejob.3B
│ │ ├── pbs_msgjob.3B
│ │ ├── pbs_orderjob.3B
│ │ ├── pbs_preempt_jobs.3B
│ │ ├── pbs_relnodesjob.3B
│ │ ├── pbs_rerunjob.3B
│ │ ├── pbs_rescquery.3B
│ │ ├── pbs_rescreserve.3B
│ │ ├── pbs_rlsjob.3B
│ │ ├── pbs_runjob.3B
│ │ ├── pbs_selectjob.3B
│ │ ├── pbs_selstat.3B
│ │ ├── pbs_sigjob.3B
│ │ ├── pbs_stagein.3B
│ │ ├── pbs_statfree.3B
│ │ ├── pbs_stathook.3B
│ │ ├── pbs_stathost.3B
│ │ ├── pbs_statjob.3B
│ │ ├── pbs_statnode.3B
│ │ ├── pbs_statque.3B
│ │ ├── pbs_statresv.3B
│ │ ├── pbs_statrsc.3B
│ │ ├── pbs_statsched.3B
│ │ ├── pbs_statserver.3B
│ │ ├── pbs_statvnode.3B
│ │ ├── pbs_submit.3B
│ │ ├── pbs_submit_resv.3B
│ │ ├── pbs_submitresv.3B
│ │ ├── pbs_tclapi.3B
│ │ ├── pbs_terminate.3B
│ │ ├── rm.3B
│ │ └── tm.3
│ └── man8/
│ ├── mpiexec.8B
│ ├── pbs.8B
│ ├── pbs.conf.8B
│ ├── pbs_account.8B
│ ├── pbs_attach.8B
│ ├── pbs_comm.8B
│ ├── pbs_dataservice.8B
│ ├── pbs_ds_password.8B
│ ├── pbs_hostn.8B
│ ├── pbs_idled.8B
│ ├── pbs_iff.8B
│ ├── pbs_interactive.8B
│ ├── pbs_lamboot.8B
│ ├── pbs_mkdirs.8B
│ ├── pbs_mom.8B
│ ├── pbs_mpihp.8B
│ ├── pbs_mpilam.8B
│ ├── pbs_mpirun.8B
│ ├── pbs_probe.8B
│ ├── pbs_sched.8B
│ ├── pbs_server.8B
│ ├── pbs_snapshot.8B
│ ├── pbs_tclsh.8B
│ ├── pbs_tmrsh.8B
│ ├── pbs_topologyinfo.8B
│ ├── pbs_wish.8B
│ ├── pbsfs.8B
│ ├── pbsnodes.8B
│ ├── pbsrun.8B
│ ├── pbsrun_unwrap.8B
│ ├── pbsrun_wrap.8B
│ ├── printjob.8B
│ ├── qdisable.8B
│ ├── qenable.8B
│ ├── qmgr.8B
│ ├── qrun.8B
│ ├── qstart.8B
│ ├── qstop.8B
│ ├── qterm.8B
│ ├── tracejob.8B
│ └── win_postinstall.py.8B
├── m4/
│ ├── disable_shell_pipe.m4
│ ├── disable_syslog.m4
│ ├── enable_alps.m4
│ ├── enable_ptl.m4
│ ├── pbs_decl_epoll.m4
│ ├── pbs_decl_epoll_pwait.m4
│ ├── pbs_decl_h_errno.m4
│ ├── pbs_decl_ppoll.m4
│ ├── pbs_decl_socklen_t.m4
│ ├── pbs_patch_libtool.m4
│ ├── pbs_systemd_unitdir.m4
│ ├── pbs_version.m4
│ ├── security_check.m4
│ ├── with_cjson.m4
│ ├── with_core_limit.m4
│ ├── with_database_dir.m4
│ ├── with_database_port.m4
│ ├── with_database_user.m4
│ ├── with_editline.m4
│ ├── with_expat.m4
│ ├── with_hwloc.m4
│ ├── with_krbauth.m4
│ ├── with_libical.m4
│ ├── with_libz.m4
│ ├── with_min_stack_limit.m4
│ ├── with_pbs_conf_file.m4
│ ├── with_pmix.m4
│ ├── with_python.m4
│ ├── with_sendmail.m4
│ ├── with_server_home.m4
│ ├── with_server_name_file.m4
│ ├── with_swig.m4
│ ├── with_tcl.m4
│ ├── with_tclatrsep.m4
│ ├── with_tmpdir.m4
│ ├── with_unsupported_dir.m4
│ └── with_xauth.m4
├── openpbs-rpmlintrc
├── openpbs.spec.in
├── src/
│ ├── Makefile.am
│ ├── cmds/
│ │ ├── Makefile.am
│ │ ├── mpiexec.in
│ │ ├── pbs_attach.c
│ │ ├── pbs_attach_sup.c
│ │ ├── pbs_dataservice.c
│ │ ├── pbs_demux.c
│ │ ├── pbs_ds_password.c
│ │ ├── pbs_lamboot.in
│ │ ├── pbs_mpihp.in
│ │ ├── pbs_mpilam.in
│ │ ├── pbs_mpirun.in
│ │ ├── pbs_ralter.c
│ │ ├── pbs_rdel.c
│ │ ├── pbs_release_nodes.c
│ │ ├── pbs_remsh.in
│ │ ├── pbs_rstat.c
│ │ ├── pbs_rsub.c
│ │ ├── pbs_tmrsh.c
│ │ ├── pbsdsh.c
│ │ ├── pbsnodes.c
│ │ ├── pbsrun.in
│ │ ├── pbsrun_unwrap.in
│ │ ├── pbsrun_wrap.in
│ │ ├── qalter.c
│ │ ├── qdel.c
│ │ ├── qdisable.c
│ │ ├── qenable.c
│ │ ├── qhold.c
│ │ ├── qmgr.c
│ │ ├── qmgr_sup.c
│ │ ├── qmove.c
│ │ ├── qmsg.c
│ │ ├── qorder.c
│ │ ├── qrerun.c
│ │ ├── qrls.c
│ │ ├── qrun.c
│ │ ├── qselect.c
│ │ ├── qsig.c
│ │ ├── qstart.c
│ │ ├── qstat.c
│ │ ├── qstop.c
│ │ ├── qsub.c
│ │ ├── qsub_sup.c
│ │ ├── qterm.c
│ │ ├── sample.qstatrc
│ │ └── scripts/
│ │ ├── Makefile.am
│ │ ├── limits.pbs_mom.compat
│ │ ├── limits.post_services.compat
│ │ ├── modulefile.in
│ │ ├── pbs.csh
│ │ ├── pbs.service.in
│ │ ├── pbs.sh
│ │ ├── pbs_bootcheck.py
│ │ ├── pbs_dataservice
│ │ ├── pbs_ds_password
│ │ ├── pbs_habitat.in
│ │ ├── pbs_init.d.in
│ │ ├── pbs_poerun.in
│ │ ├── pbs_postinstall.in
│ │ ├── pbs_posttrans
│ │ ├── pbs_preuninstall
│ │ ├── pbs_reload.in
│ │ ├── pbs_server
│ │ ├── pbs_snapshot
│ │ ├── pbs_topologyinfo
│ │ ├── pbs_topologyinfo.py
│ │ ├── pbsrun.ch_gm.init.in
│ │ ├── pbsrun.ch_mx.init.in
│ │ ├── pbsrun.gm_mpd.init.in
│ │ ├── pbsrun.intelmpi.init.in
│ │ ├── pbsrun.mpich2.init.in
│ │ ├── pbsrun.mvapich1.init.in
│ │ ├── pbsrun.mvapich2.init.in
│ │ ├── pbsrun.mx_mpd.init.in
│ │ ├── pbsrun.poe.in
│ │ ├── pbsrun.poe.init.in
│ │ ├── printjob
│ │ └── sgiMPI.awk
│ ├── hooks/
│ │ ├── Makefile.am
│ │ └── cgroups/
│ │ ├── pbs_cgroups.CF
│ │ ├── pbs_cgroups.HK
│ │ └── pbs_cgroups.PY
│ ├── iff/
│ │ ├── Makefile.am
│ │ └── iff2.c
│ ├── include/
│ │ ├── Long.h
│ │ ├── Long_.h
│ │ ├── Makefile.am
│ │ ├── acct.h
│ │ ├── attribute.h
│ │ ├── auth.h
│ │ ├── avltree.h
│ │ ├── basil.h
│ │ ├── batch_request.h
│ │ ├── bitfield.h
│ │ ├── cmds.h
│ │ ├── credential.h
│ │ ├── dedup_jobids.h
│ │ ├── dis.h
│ │ ├── grunt.h
│ │ ├── hook.h
│ │ ├── hook_func.h
│ │ ├── ifl_internal.h
│ │ ├── job.h
│ │ ├── libauth.h
│ │ ├── libpbs.h
│ │ ├── libsec.h
│ │ ├── libutil.h
│ │ ├── list_link.h
│ │ ├── log.h
│ │ ├── mom_func.h
│ │ ├── mom_hook_func.h
│ │ ├── mom_server.h
│ │ ├── mom_vnode.h
│ │ ├── net_connect.h
│ │ ├── pbs_array_list.h
│ │ ├── pbs_assert.h
│ │ ├── pbs_client_thread.h
│ │ ├── pbs_db.h
│ │ ├── pbs_ecl.h
│ │ ├── pbs_entlim.h
│ │ ├── pbs_error.h
│ │ ├── pbs_idx.h
│ │ ├── pbs_ifl.h
│ │ ├── pbs_internal.h
│ │ ├── pbs_json.h
│ │ ├── pbs_license.h
│ │ ├── pbs_mpp.h
│ │ ├── pbs_nodes.h
│ │ ├── pbs_python.h
│ │ ├── pbs_python_private.h
│ │ ├── pbs_reliable.h
│ │ ├── pbs_sched.h
│ │ ├── pbs_share.h
│ │ ├── pbs_v1_module_common.i
│ │ ├── pbs_version.h.in
│ │ ├── placementsets.h
│ │ ├── port_forwarding.h
│ │ ├── portability.h
│ │ ├── provision.h
│ │ ├── qmgr.h
│ │ ├── queue.h
│ │ ├── range.h
│ │ ├── reservation.h
│ │ ├── resmon.h
│ │ ├── resource.h
│ │ ├── resv_node.h
│ │ ├── rm.h
│ │ ├── sched_cmds.h
│ │ ├── server.h
│ │ ├── server_limits.h
│ │ ├── site_job_attr_def.h
│ │ ├── site_job_attr_enum.h
│ │ ├── site_qmgr_node_print.h
│ │ ├── site_qmgr_que_print.h
│ │ ├── site_qmgr_sched_print.h
│ │ ├── site_qmgr_svr_print.h
│ │ ├── site_que_attr_def.h
│ │ ├── site_que_attr_enum.h
│ │ ├── site_queue.h
│ │ ├── site_resc_attr_def.h
│ │ ├── site_resv_attr_def.h
│ │ ├── site_resv_attr_enum.h
│ │ ├── site_sched_attr_def.h
│ │ ├── site_sched_attr_enum.h
│ │ ├── site_svr_attr_def.h
│ │ ├── site_svr_attr_enum.h
│ │ ├── svrfunc.h
│ │ ├── ticket.h
│ │ ├── tm.h
│ │ ├── tm_.h
│ │ ├── tpp.h
│ │ ├── tracking.h
│ │ ├── user.h
│ │ └── work_task.h
│ ├── lib/
│ │ ├── Libattr/
│ │ │ ├── Long_.c
│ │ │ ├── Makefile.am
│ │ │ ├── attr_atomic.c
│ │ │ ├── attr_fn_acl.c
│ │ │ ├── attr_fn_arst.c
│ │ │ ├── attr_fn_b.c
│ │ │ ├── attr_fn_c.c
│ │ │ ├── attr_fn_entlim.c
│ │ │ ├── attr_fn_f.c
│ │ │ ├── attr_fn_hold.c
│ │ │ ├── attr_fn_intr.c
│ │ │ ├── attr_fn_l.c
│ │ │ ├── attr_fn_ll.c
│ │ │ ├── attr_fn_resc.c
│ │ │ ├── attr_fn_size.c
│ │ │ ├── attr_fn_str.c
│ │ │ ├── attr_fn_time.c
│ │ │ ├── attr_fn_unkn.c
│ │ │ ├── attr_func.c
│ │ │ ├── attr_node_func.c
│ │ │ ├── attr_resc_func.c
│ │ │ ├── master_job_attr_def.xml
│ │ │ ├── master_node_attr_def.xml
│ │ │ ├── master_queue_attr_def.xml
│ │ │ ├── master_resc_def_all.xml
│ │ │ ├── master_resv_attr_def.xml
│ │ │ ├── master_sched_attr_def.xml
│ │ │ ├── master_svr_attr_def.xml
│ │ │ ├── resc_map.c
│ │ │ ├── strToL.c
│ │ │ ├── strTouL.c
│ │ │ └── uLTostr.c
│ │ ├── Libauth/
│ │ │ ├── Makefile.am
│ │ │ ├── README.md
│ │ │ ├── gss/
│ │ │ │ ├── Makefile.am
│ │ │ │ └── pbs_gss.c
│ │ │ └── munge/
│ │ │ ├── Makefile.am
│ │ │ └── munge_supp.c
│ │ ├── Libcmds/
│ │ │ ├── batch_status.c
│ │ │ ├── check_job_script.c
│ │ │ ├── chk_Jrange.c
│ │ │ ├── ck_job_name.c
│ │ │ ├── cmds_common.c
│ │ │ ├── cnt2server.c
│ │ │ ├── cs_error.c
│ │ │ ├── cvtdate.c
│ │ │ ├── err_handling.c
│ │ │ ├── get_attr.c
│ │ │ ├── get_dataservice_usr.c
│ │ │ ├── get_server.c
│ │ │ ├── isjobid.c
│ │ │ ├── locate_job.c
│ │ │ ├── parse_at.c
│ │ │ ├── parse_depend.c
│ │ │ ├── parse_destid.c
│ │ │ ├── parse_equal.c
│ │ │ ├── parse_jobid.c
│ │ │ ├── parse_stage.c
│ │ │ ├── prepare_path.c
│ │ │ ├── set_attr.c
│ │ │ └── set_resource.c
│ │ ├── Libdb/
│ │ │ ├── Makefile.am
│ │ │ └── pgsql/
│ │ │ ├── Makefile.am
│ │ │ ├── db_attr.c
│ │ │ ├── db_common.c
│ │ │ ├── db_job.c
│ │ │ ├── db_node.c
│ │ │ ├── db_postgres.h
│ │ │ ├── db_que.c
│ │ │ ├── db_resv.c
│ │ │ ├── db_sched.c
│ │ │ ├── db_svr.c
│ │ │ ├── pbs_db_env
│ │ │ ├── pbs_db_schema.sql
│ │ │ ├── pbs_db_utility
│ │ │ ├── pbs_ds_systemd
│ │ │ └── pbs_schema_upgrade
│ │ ├── Libdis/
│ │ │ ├── dis.c
│ │ │ ├── dis_.h
│ │ │ ├── dis_helpers.c
│ │ │ ├── discui_.c
│ │ │ ├── discul_.c
│ │ │ ├── discull_.c
│ │ │ ├── disi10d_.c
│ │ │ ├── disi10l_.c
│ │ │ ├── disiui_.c
│ │ │ ├── disp10d_.c
│ │ │ ├── disp10l_.c
│ │ │ ├── disrcs.c
│ │ │ ├── disrd.c
│ │ │ ├── disrf.c
│ │ │ ├── disrfcs.c
│ │ │ ├── disrfst.c
│ │ │ ├── disrl.c
│ │ │ ├── disrl_.c
│ │ │ ├── disrsc.c
│ │ │ ├── disrsi.c
│ │ │ ├── disrsi_.c
│ │ │ ├── disrsl.c
│ │ │ ├── disrsl_.c
│ │ │ ├── disrsll_.c
│ │ │ ├── disrss.c
│ │ │ ├── disrst.c
│ │ │ ├── disruc.c
│ │ │ ├── disrui.c
│ │ │ ├── disrul.c
│ │ │ ├── disrull.c
│ │ │ ├── disrus.c
│ │ │ ├── diswcs.c
│ │ │ ├── diswf.c
│ │ │ ├── diswl_.c
│ │ │ ├── diswsi.c
│ │ │ ├── diswsl.c
│ │ │ ├── diswui.c
│ │ │ ├── diswui_.c
│ │ │ ├── diswul.c
│ │ │ ├── diswull.c
│ │ │ └── ps_dis.c
│ │ ├── Libecl/
│ │ │ ├── ecl_verify.c
│ │ │ ├── ecl_verify_datatypes.c
│ │ │ ├── ecl_verify_object_name.c
│ │ │ ├── ecl_verify_values.c
│ │ │ └── pbs_client_thread.c
│ │ ├── Libifl/
│ │ │ ├── DIS_decode.c
│ │ │ ├── DIS_encode.c
│ │ │ ├── Makefile.am
│ │ │ ├── PBS_attr.c
│ │ │ ├── advise.c
│ │ │ ├── auth.c
│ │ │ ├── conn_table.c
│ │ │ ├── dec_DelJobList.c
│ │ │ ├── dec_reply.c
│ │ │ ├── enc_reply.c
│ │ │ ├── entlim_parse.c
│ │ │ ├── get_svrport.c
│ │ │ ├── grunt_parse.c
│ │ │ ├── ifl_impl.c
│ │ │ ├── ifl_pointers.c
│ │ │ ├── ifl_util.c
│ │ │ ├── int_cred.c
│ │ │ ├── int_hook.c
│ │ │ ├── int_jcred.c
│ │ │ ├── int_manage2.c
│ │ │ ├── int_manager.c
│ │ │ ├── int_modify_resv.c
│ │ │ ├── int_msg2.c
│ │ │ ├── int_rdrpy.c
│ │ │ ├── int_sig2.c
│ │ │ ├── int_status.c
│ │ │ ├── int_status2.c
│ │ │ ├── int_submit.c
│ │ │ ├── int_submit_resv.c
│ │ │ ├── int_ucred.c
│ │ │ ├── list_link.c
│ │ │ ├── pbsD_Preempt_Jobs.c
│ │ │ ├── pbsD_alterjob.c
│ │ │ ├── pbsD_confirmresv.c
│ │ │ ├── pbsD_connect.c
│ │ │ ├── pbsD_defschreply.c
│ │ │ ├── pbsD_deljob.c
│ │ │ ├── pbsD_deljoblist.c
│ │ │ ├── pbsD_delresv.c
│ │ │ ├── pbsD_holdjob.c
│ │ │ ├── pbsD_locjob.c
│ │ │ ├── pbsD_manager.c
│ │ │ ├── pbsD_modify_resv.c
│ │ │ ├── pbsD_movejob.c
│ │ │ ├── pbsD_msgjob.c
│ │ │ ├── pbsD_orderjo.c
│ │ │ ├── pbsD_rerunjo.c
│ │ │ ├── pbsD_resc.c
│ │ │ ├── pbsD_rlsjob.c
│ │ │ ├── pbsD_runjob.c
│ │ │ ├── pbsD_selectj.c
│ │ │ ├── pbsD_sigjob.c
│ │ │ ├── pbsD_stagein.c
│ │ │ ├── pbsD_stathook.c
│ │ │ ├── pbsD_stathost.c
│ │ │ ├── pbsD_statjob.c
│ │ │ ├── pbsD_statnode.c
│ │ │ ├── pbsD_statque.c
│ │ │ ├── pbsD_statresv.c
│ │ │ ├── pbsD_statrsc.c
│ │ │ ├── pbsD_statsched.c
│ │ │ ├── pbsD_statsrv.c
│ │ │ ├── pbsD_submit.c
│ │ │ ├── pbsD_submit_resv.c
│ │ │ ├── pbsD_termin.c
│ │ │ ├── pbs_delstatfree.c
│ │ │ ├── pbs_get_attribute_errors.c
│ │ │ ├── pbs_geterrmg.c
│ │ │ ├── pbs_geterrno.c
│ │ │ ├── pbs_ifl.i
│ │ │ ├── pbs_loadconf.c
│ │ │ ├── pbs_quote_parse.c
│ │ │ ├── pbs_statfree.c
│ │ │ ├── rm.c
│ │ │ ├── strsep.c
│ │ │ ├── tcp_dis.c
│ │ │ ├── tm.c
│ │ │ └── xml_encode_decode.c
│ │ ├── Libjson/
│ │ │ ├── Makefile.am
│ │ │ └── cJSON/
│ │ │ ├── Makefile.am
│ │ │ └── pbs_cjson.c
│ │ ├── Liblicensing/
│ │ │ ├── Makefile.am
│ │ │ ├── liblicense.h
│ │ │ └── license_client.c
│ │ ├── Liblog/
│ │ │ ├── Makefile.am
│ │ │ ├── chk_file_sec.c
│ │ │ ├── log_event.c
│ │ │ ├── pbs_log.c
│ │ │ ├── pbs_messages.c
│ │ │ └── setup_env.c
│ │ ├── Libnet/
│ │ │ ├── Makefile.am
│ │ │ ├── get_hostaddr.c
│ │ │ ├── hnls.c
│ │ │ ├── net_client.c
│ │ │ ├── net_server.c
│ │ │ ├── net_set_clse.c
│ │ │ └── port_forwarding.c
│ │ ├── Libpbs/
│ │ │ ├── Makefile.am
│ │ │ └── pbs.pc.in
│ │ ├── Libpython/
│ │ │ ├── Makefile.am
│ │ │ ├── common_python_utils.c
│ │ │ ├── module_pbs_v1.c
│ │ │ ├── pbs_python_external.c
│ │ │ ├── pbs_python_import_types.c
│ │ │ ├── pbs_python_svr_external.c
│ │ │ ├── pbs_python_svr_internal.c
│ │ │ ├── pbs_python_svr_size_type.c
│ │ │ └── shared_python_utils.c
│ │ ├── Libsec/
│ │ │ ├── Makefile.am
│ │ │ └── cs_standard.c
│ │ ├── Libsite/
│ │ │ ├── Makefile.am
│ │ │ ├── site_allow_u.c
│ │ │ ├── site_alt_rte.c
│ │ │ ├── site_check_u.c
│ │ │ ├── site_map_usr.c
│ │ │ ├── site_mom_chu.c
│ │ │ ├── site_mom_ckp.c
│ │ │ └── site_mom_jst.c
│ │ ├── Libtpp/
│ │ │ ├── Makefile.am
│ │ │ ├── tpp_client.c
│ │ │ ├── tpp_em.c
│ │ │ ├── tpp_internal.h
│ │ │ ├── tpp_platform.c
│ │ │ ├── tpp_router.c
│ │ │ ├── tpp_transport.c
│ │ │ └── tpp_util.c
│ │ ├── Libutil/
│ │ │ ├── Makefile.am
│ │ │ ├── avltree.c
│ │ │ ├── daemon_protect.c
│ │ │ ├── dedup_jobids.c
│ │ │ ├── entlim.c
│ │ │ ├── execvnode_seq_util.c
│ │ │ ├── get_hostname.c
│ │ │ ├── hook.c
│ │ │ ├── misc_utils.c
│ │ │ ├── pbs_aes_encrypt.c
│ │ │ ├── pbs_array_list.c
│ │ │ ├── pbs_ical.c
│ │ │ ├── pbs_idx.c
│ │ │ ├── pbs_secrets.c
│ │ │ ├── range.c
│ │ │ ├── thread_utils.c
│ │ │ └── work_task.c
│ │ └── Makefile.am
│ ├── modules/
│ │ ├── Makefile.am
│ │ └── python/
│ │ ├── Makefile.am
│ │ ├── pbs/
│ │ │ ├── __init__.py
│ │ │ └── v1/
│ │ │ ├── __init__.py
│ │ │ ├── _attr_types.py
│ │ │ ├── _base_types.py
│ │ │ ├── _exc_types.py
│ │ │ ├── _export_types.py
│ │ │ ├── _pmi_cray.py
│ │ │ ├── _pmi_none.py
│ │ │ ├── _pmi_sgi.py
│ │ │ ├── _pmi_types.py
│ │ │ ├── _pmi_utils.py
│ │ │ └── _svr_types.py
│ │ ├── pbs_hooks/
│ │ │ ├── PBS_alps_inventory_check.HK
│ │ │ ├── PBS_alps_inventory_check.PY
│ │ │ ├── PBS_cray_atom.CF
│ │ │ ├── PBS_cray_atom.HK
│ │ │ ├── PBS_cray_atom.PY
│ │ │ ├── PBS_power.CF
│ │ │ ├── PBS_power.HK
│ │ │ ├── PBS_power.PY
│ │ │ ├── PBS_xeon_phi_provision.HK
│ │ │ └── PBS_xeon_phi_provision.PY
│ │ ├── pbs_v1_module_init.c
│ │ ├── setup.cfg
│ │ └── setup.py
│ ├── mom_rcp/
│ │ ├── Makefile.am
│ │ ├── README
│ │ ├── extern.h
│ │ ├── pathnames.h
│ │ ├── pbs_stat.h
│ │ ├── rcp.c
│ │ ├── replace.c
│ │ └── util.c
│ ├── resmom/
│ │ ├── Makefile.am
│ │ ├── catch_child.c
│ │ ├── job_recov_fs.c
│ │ ├── linux/
│ │ │ ├── alps.c
│ │ │ ├── mom_func.c
│ │ │ ├── mom_mach.c
│ │ │ ├── mom_mach.h
│ │ │ ├── mom_start.c
│ │ │ └── pe_input.c
│ │ ├── mock_run.c
│ │ ├── mock_run.h
│ │ ├── mom_comm.c
│ │ ├── mom_hook_func.c
│ │ ├── mom_inter.c
│ │ ├── mom_main.c
│ │ ├── mom_pmix.c
│ │ ├── mom_pmix.h
│ │ ├── mom_server.c
│ │ ├── mom_updates_bundle.c
│ │ ├── mom_vnode.c
│ │ ├── mom_walltime.c
│ │ ├── popen.c
│ │ ├── prolog.c
│ │ ├── renew_creds.c
│ │ ├── renew_creds.h
│ │ ├── requests.c
│ │ ├── rm_dep.h
│ │ ├── stage_func.c
│ │ ├── start_exec.c
│ │ └── vnode_storage.c
│ ├── scheduler/
│ │ ├── Makefile.am
│ │ ├── buckets.cpp
│ │ ├── buckets.h
│ │ ├── check.cpp
│ │ ├── check.h
│ │ ├── config.h
│ │ ├── constant.h
│ │ ├── data_types.h
│ │ ├── dedtime.cpp
│ │ ├── dedtime.h
│ │ ├── fairshare.cpp
│ │ ├── fairshare.h
│ │ ├── fifo.cpp
│ │ ├── fifo.h
│ │ ├── get_4byte.cpp
│ │ ├── globals.cpp
│ │ ├── globals.h
│ │ ├── job_info.cpp
│ │ ├── job_info.h
│ │ ├── limits.cpp
│ │ ├── limits_if.h
│ │ ├── list_order.awk
│ │ ├── misc.cpp
│ │ ├── misc.h
│ │ ├── multi_threading.cpp
│ │ ├── multi_threading.h
│ │ ├── node_info.cpp
│ │ ├── node_info.h
│ │ ├── node_partition.cpp
│ │ ├── node_partition.h
│ │ ├── parse.cpp
│ │ ├── parse.h
│ │ ├── pbs_bitmap.cpp
│ │ ├── pbs_bitmap.h
│ │ ├── pbs_dedicated
│ │ ├── pbs_holidays
│ │ ├── pbs_holidays.2017
│ │ ├── pbs_resource_group
│ │ ├── pbs_sched.cpp
│ │ ├── pbs_sched_bare.cpp
│ │ ├── pbs_sched_config
│ │ ├── pbs_sched_utils.cpp
│ │ ├── pbsfs.cpp
│ │ ├── prev_job_info.cpp
│ │ ├── prev_job_info.h
│ │ ├── prime.cpp
│ │ ├── prime.h
│ │ ├── queue.cpp
│ │ ├── queue.h
│ │ ├── queue_info.cpp
│ │ ├── queue_info.h
│ │ ├── resource.cpp
│ │ ├── resource.h
│ │ ├── resource_resv.cpp
│ │ ├── resource_resv.h
│ │ ├── resv_info.cpp
│ │ ├── resv_info.h
│ │ ├── sched_exception.cpp
│ │ ├── sched_ifl_wrappers.cpp
│ │ ├── server_info.cpp
│ │ ├── server_info.h
│ │ ├── simulate.cpp
│ │ ├── simulate.h
│ │ ├── site_code.cpp
│ │ ├── site_code.h
│ │ ├── site_data.h
│ │ ├── sort.cpp
│ │ ├── sort.h
│ │ ├── state_count.cpp
│ │ └── state_count.h
│ ├── server/
│ │ ├── Makefile.am
│ │ ├── accounting.c
│ │ ├── array_func.c
│ │ ├── attr_recov.c
│ │ ├── attr_recov_db.c
│ │ ├── checkkey.c
│ │ ├── daemon_info.c
│ │ ├── dis_read.c
│ │ ├── failover.c
│ │ ├── geteusernam.c
│ │ ├── hook_func.c
│ │ ├── issue_request.c
│ │ ├── jattr_get_set.c
│ │ ├── job_func.c
│ │ ├── job_recov_db.c
│ │ ├── job_route.c
│ │ ├── license_client.c
│ │ ├── licensing_func.c
│ │ ├── mom_info.c
│ │ ├── nattr_get_set.c
│ │ ├── node_func.c
│ │ ├── node_manager.c
│ │ ├── node_recov_db.c
│ │ ├── pbs_comm.c
│ │ ├── pbs_db_func.c
│ │ ├── pbsd_init.c
│ │ ├── pbsd_main.c
│ │ ├── process_request.c
│ │ ├── qattr_get_set.c
│ │ ├── queue_func.c
│ │ ├── queue_recov_db.c
│ │ ├── rattr_get_set.c
│ │ ├── reply_send.c
│ │ ├── req_cred.c
│ │ ├── req_delete.c
│ │ ├── req_getcred.c
│ │ ├── req_holdjob.c
│ │ ├── req_jobobit.c
│ │ ├── req_locate.c
│ │ ├── req_manager.c
│ │ ├── req_message.c
│ │ ├── req_modify.c
│ │ ├── req_movejob.c
│ │ ├── req_preemptjob.c
│ │ ├── req_quejob.c
│ │ ├── req_register.c
│ │ ├── req_rerun.c
│ │ ├── req_rescq.c
│ │ ├── req_runjob.c
│ │ ├── req_select.c
│ │ ├── req_shutdown.c
│ │ ├── req_signal.c
│ │ ├── req_stat.c
│ │ ├── req_track.c
│ │ ├── resc_attr.c
│ │ ├── run_sched.c
│ │ ├── sattr_get_set.c
│ │ ├── sched_attr_get_set.c
│ │ ├── sched_func.c
│ │ ├── setup_resc.c
│ │ ├── stat_job.c
│ │ ├── svr_chk_owner.c
│ │ ├── svr_connect.c
│ │ ├── svr_credfunc.c
│ │ ├── svr_func.c
│ │ ├── svr_jobfunc.c
│ │ ├── svr_mail.c
│ │ ├── svr_movejob.c
│ │ ├── svr_recov_db.c
│ │ ├── svr_resccost.c
│ │ ├── user_func.c
│ │ └── vnparse.c
│ ├── tools/
│ │ ├── Makefile.am
│ │ ├── chk_tree.c
│ │ ├── create_env_file.sh
│ │ ├── hostn.c
│ │ ├── pbsTclInit.c
│ │ ├── pbsTkInit.c
│ │ ├── pbs_ds_monitor.c
│ │ ├── pbs_idled.c
│ │ ├── pbs_probe.c
│ │ ├── pbs_python.c
│ │ ├── pbs_sleep.c
│ │ ├── pbs_tclWrap.c
│ │ ├── pbs_upgrade_job.c
│ │ ├── printjob.c
│ │ ├── rstester.c
│ │ ├── site_tclWrap.c
│ │ ├── tracejob.c
│ │ ├── tracejob.h
│ │ └── wrap_tcl.sh.in
│ └── unsupported/
│ ├── Makefile.am
│ ├── NodeHealthCheck.json
│ ├── NodeHealthCheck.py
│ ├── README
│ ├── ReliableJobStartup.py
│ ├── cray_readme
│ ├── load_balance.py
│ ├── mom_dyn_res.py
│ ├── pbs-mailer/
│ │ ├── README.md
│ │ ├── debian/
│ │ │ ├── changelog
│ │ │ ├── compat
│ │ │ ├── conffiles
│ │ │ ├── control
│ │ │ ├── pbs-mailer.service
│ │ │ └── rules
│ │ ├── pbs_mail.json
│ │ ├── pbs_mail_saver
│ │ ├── pbs_mail_sender
│ │ ├── release-deb.sh
│ │ └── release-rpm.sh
│ ├── pbs_config
│ ├── pbs_jobs_at.8B
│ ├── pbs_loganalyzer
│ ├── pbs_output.py
│ ├── pbs_rescquery.3B
│ ├── pbs_rmget.8B
│ ├── pbs_rmget.c
│ ├── pbs_stat
│ ├── rapid_inter.py
│ ├── renew-test/
│ │ ├── base64.c
│ │ ├── base64.h
│ │ └── renew-test.c
│ ├── run_pelog_shell.ini
│ ├── run_pelog_shell.py
│ ├── sgiICEplacement.sh
│ ├── sgiICEvnode.sh
│ └── sgigenvnodelist.awk
├── test/
│ ├── Makefile.am
│ ├── fw/
│ │ ├── MANIFEST.in
│ │ ├── Makefile.am
│ │ ├── bin/
│ │ │ ├── pbs_as
│ │ │ ├── pbs_benchpress
│ │ │ ├── pbs_compare_results
│ │ │ ├── pbs_config
│ │ │ ├── pbs_cov
│ │ │ ├── pbs_loganalyzer
│ │ │ ├── pbs_py_spawn
│ │ │ ├── pbs_snapshot
│ │ │ ├── pbs_stat
│ │ │ ├── pbs_swigify
│ │ │ └── pbs_sys_report
│ │ ├── doc/
│ │ │ ├── caveats.rst
│ │ │ ├── commands.rst
│ │ │ ├── conf.py
│ │ │ ├── howtotest.rst
│ │ │ ├── index.rst
│ │ │ ├── install.rst
│ │ │ ├── intro.rst
│ │ │ ├── make.bat
│ │ │ ├── ptl.rst
│ │ │ └── tutorial.rst
│ │ ├── ptl/
│ │ │ ├── __init__.py.in
│ │ │ ├── lib/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── pbs_api_to_cli.py
│ │ │ │ ├── pbs_ifl_mock.py
│ │ │ │ ├── pbs_testlib.py
│ │ │ │ ├── ptl_batchutils.py
│ │ │ │ ├── ptl_comm.py
│ │ │ │ ├── ptl_config.py
│ │ │ │ ├── ptl_constants.py
│ │ │ │ ├── ptl_entities.py
│ │ │ │ ├── ptl_error.py
│ │ │ │ ├── ptl_expect_action.py
│ │ │ │ ├── ptl_fairshare.py
│ │ │ │ ├── ptl_mom.py
│ │ │ │ ├── ptl_object.py
│ │ │ │ ├── ptl_resourceresv.py
│ │ │ │ ├── ptl_sched.py
│ │ │ │ ├── ptl_server.py
│ │ │ │ ├── ptl_service.py
│ │ │ │ ├── ptl_types.py
│ │ │ │ └── ptl_wrappers.py
│ │ │ └── utils/
│ │ │ ├── __init__.py
│ │ │ ├── pbs_anonutils.py
│ │ │ ├── pbs_cliutils.py
│ │ │ ├── pbs_covutils.py
│ │ │ ├── pbs_crayutils.py
│ │ │ ├── pbs_dshutils.py
│ │ │ ├── pbs_logutils.py
│ │ │ ├── pbs_procutils.py
│ │ │ ├── pbs_snaputils.py
│ │ │ ├── pbs_testsuite.py
│ │ │ ├── pbs_testusers.py
│ │ │ └── plugins/
│ │ │ ├── __init__.py
│ │ │ ├── ptl_report_json.py
│ │ │ ├── ptl_test_data.py
│ │ │ ├── ptl_test_db.py
│ │ │ ├── ptl_test_info.py
│ │ │ ├── ptl_test_loader.py
│ │ │ ├── ptl_test_runner.py
│ │ │ └── ptl_test_tags.py
│ │ ├── ptl.csh
│ │ ├── ptl.sh
│ │ ├── ptlreport
│ │ ├── requirements.txt
│ │ └── setup.py.in
│ ├── scripts/
│ │ └── qsub_multi.sh
│ └── tests/
│ ├── Makefile.am
│ ├── __init__.py
│ ├── functional/
│ │ ├── __init__.py
│ │ ├── pbs_Rrecord_resources_used.py
│ │ ├── pbs_acct_log.py
│ │ ├── pbs_accumulate_resc_used.py
│ │ ├── pbs_acl_groups.py
│ │ ├── pbs_acl_host_moms.py
│ │ ├── pbs_acl_host_queue.py
│ │ ├── pbs_acl_host_server.py
│ │ ├── pbs_admin_suspend.py
│ │ ├── pbs_allpart.py
│ │ ├── pbs_alps_inventory_check_hook.py
│ │ ├── pbs_alps_release_tunables.py
│ │ ├── pbs_array_job_mail.py
│ │ ├── pbs_basil_parser_err.py
│ │ ├── pbs_basil_support.py
│ │ ├── pbs_calendaring.py
│ │ ├── pbs_cgroups_hook.py
│ │ ├── pbs_check_job_attrib.py
│ │ ├── pbs_checkpoint.py
│ │ ├── pbs_client_response.py
│ │ ├── pbs_complete_running_parent_job.py
│ │ ├── pbs_conf_resv_stale_vnode.py
│ │ ├── pbs_config.py
│ │ ├── pbs_cpuset.py
│ │ ├── pbs_cray_check_node_exclusivity.py
│ │ ├── pbs_cray_hyperthread.py
│ │ ├── pbs_cray_pagg_id.py
│ │ ├── pbs_cray_reliable_job_startup.py
│ │ ├── pbs_cray_smoketest.py
│ │ ├── pbs_cray_suspend_resume.py
│ │ ├── pbs_cray_vnode_per_numa.py
│ │ ├── pbs_cray_vnode_pool.py
│ │ ├── pbs_daemon_service_user.py
│ │ ├── pbs_dup_acc_log_for_resv.py
│ │ ├── pbs_eligible_time.py
│ │ ├── pbs_equiv_classes.py
│ │ ├── pbs_exceeded_resources_notification.py
│ │ ├── pbs_execjob_susp_resume.py
│ │ ├── pbs_fairshare.py
│ │ ├── pbs_gen_nodefile_on_sister_mom.py
│ │ ├── pbs_grunt.py
│ │ ├── pbs_highreslog.py
│ │ ├── pbs_holidays.py
│ │ ├── pbs_hook_config_os_env.py
│ │ ├── pbs_hook_crosslink_mom.py
│ │ ├── pbs_hook_debug_input.py
│ │ ├── pbs_hook_debug_nocrash.py
│ │ ├── pbs_hook_exechost_periodic.py
│ │ ├── pbs_hook_execjob_abort.py
│ │ ├── pbs_hook_execjob_end.py
│ │ ├── pbs_hook_execjob_prologue.py
│ │ ├── pbs_hook_jobobit.py
│ │ ├── pbs_hook_management.py
│ │ ├── pbs_hook_modifyvnode_state_changes.py
│ │ ├── pbs_hook_perf_stat.py
│ │ ├── pbs_hook_postqueuejob.py
│ │ ├── pbs_hook_set_attr.py
│ │ ├── pbs_hook_set_interrupt.py
│ │ ├── pbs_hook_set_jobenv.py
│ │ ├── pbs_hook_set_nonexist.py
│ │ ├── pbs_hook_timeout.py
│ │ ├── pbs_hook_unset_res.py
│ │ ├── pbs_hooksmoketest.py
│ │ ├── pbs_hookswig.py
│ │ ├── pbs_indirect_resources.py
│ │ ├── pbs_init_script.py
│ │ ├── pbs_job_array.py
│ │ ├── pbs_job_array_comment.py
│ │ ├── pbs_job_comment_on_resume.py
│ │ ├── pbs_job_default_group.py
│ │ ├── pbs_job_dependency.py
│ │ ├── pbs_job_purge.py
│ │ ├── pbs_job_requeue_timeout_error.py
│ │ ├── pbs_job_routing.py
│ │ ├── pbs_job_script.py
│ │ ├── pbs_job_sort_formula.py
│ │ ├── pbs_job_status_after_mom_hup.py
│ │ ├── pbs_job_task.py
│ │ ├── pbs_maintenance_reservations.py
│ │ ├── pbs_modifyresv_hook.py
│ │ ├── pbs_mom_hook_sync.py
│ │ ├── pbs_mom_hooks_test.py
│ │ ├── pbs_mom_job_dir.py
│ │ ├── pbs_mom_local_nodename.py
│ │ ├── pbs_mom_mock_run.py
│ │ ├── pbs_mom_walltime.py
│ │ ├── pbs_moved_job.py
│ │ ├── pbs_moved_job_local.py
│ │ ├── pbs_multi_sched.py
│ │ ├── pbs_multiple_execjob_launch_hook.py
│ │ ├── pbs_node_buckets.py
│ │ ├── pbs_node_jobs_restart.py
│ │ ├── pbs_node_jobs_restart_multinode.py
│ │ ├── pbs_node_rampdown.py
│ │ ├── pbs_node_rampdown_keep_select.py
│ │ ├── pbs_node_sleep_state.py
│ │ ├── pbs_nodes_json.py
│ │ ├── pbs_nodes_queues.py
│ │ ├── pbs_nonprint_characters.py
│ │ ├── pbs_offline_vnodes.py
│ │ ├── pbs_one_event_multiple_hooks.py
│ │ ├── pbs_only_explicit_psets.py
│ │ ├── pbs_only_small_files_over_tpp.py
│ │ ├── pbs_passing_environment_variable.py
│ │ ├── pbs_pbsnodes.py
│ │ ├── pbs_pbsnodes_output_trimmed.py
│ │ ├── pbs_peer.py
│ │ ├── pbs_periodic_constant.py
│ │ ├── pbs_power_provisioning_cray.py
│ │ ├── pbs_power_provisioning_sgi.py
│ │ ├── pbs_preemption.py
│ │ ├── pbs_printjob.py
│ │ ├── pbs_provisioning.py
│ │ ├── pbs_provisioning_enhancement.py
│ │ ├── pbs_python_restart_settings.py
│ │ ├── pbs_python_test.py
│ │ ├── pbs_qdel.py
│ │ ├── pbs_qmgr.py
│ │ ├── pbs_qrun.py
│ │ ├── pbs_qselect.py
│ │ ├── pbs_qstat.py
│ │ ├── pbs_qstat_2servers.py
│ │ ├── pbs_qstat_count.py
│ │ ├── pbs_qstat_formats.py
│ │ ├── pbs_qsub_direct_write.py
│ │ ├── pbs_qsub_opts_args.py
│ │ ├── pbs_qsub_remove_files.py
│ │ ├── pbs_qsub_script.py
│ │ ├── pbs_qsub_wblock.py
│ │ ├── pbs_que_resc_usage.py
│ │ ├── pbs_ralter.py
│ │ ├── pbs_release_limited_res_suspend.py
│ │ ├── pbs_reliable_job_startup.py
│ │ ├── pbs_resc_custom_perm.py
│ │ ├── pbs_resc_used_single_node.py
│ │ ├── pbs_reservations.py
│ │ ├── pbs_resource_multichunk.py
│ │ ├── pbs_resource_unset.py
│ │ ├── pbs_resource_usage_log.py
│ │ ├── pbs_resv_begin_hook.py
│ │ ├── pbs_resv_confirm_hook.py
│ │ ├── pbs_resv_end_hook.py
│ │ ├── pbs_resv_start_dur_end.py
│ │ ├── pbs_root_owned_script.py
│ │ ├── pbs_rstat.py
│ │ ├── pbs_runjob_hook.py
│ │ ├── pbs_sched_attr_updates.py
│ │ ├── pbs_sched_badstate.py
│ │ ├── pbs_sched_fifo.py
│ │ ├── pbs_sched_preempt_enforce_resumption.py
│ │ ├── pbs_sched_rerun.py
│ │ ├── pbs_sched_runjobwait.py
│ │ ├── pbs_sched_signal.py
│ │ ├── pbs_schedule_indirect_resources.py
│ │ ├── pbs_server_hook_attr.py
│ │ ├── pbs_server_periodic_hook.py
│ │ ├── pbs_set_enforcement.py
│ │ ├── pbs_sister_mom_crash.py
│ │ ├── pbs_snapshot_unittest.py
│ │ ├── pbs_soft_walltime.py
│ │ ├── pbs_stf.py
│ │ ├── pbs_strict_ordering.py
│ │ ├── pbs_support_linux_hook_event_phase1_2.py
│ │ ├── pbs_suspend_resume_accounting.py
│ │ ├── pbs_svr_dyn_res.py
│ │ ├── pbs_systemd.py
│ │ ├── pbs_test_entity_limits.py
│ │ ├── pbs_test_qorder.py
│ │ ├── pbs_test_run_count.py
│ │ ├── pbs_test_svr_dflt.py
│ │ ├── pbs_test_tpp.py
│ │ ├── pbs_trillion_jobid.py
│ │ ├── pbs_two_mom_hooks_resources_used.py
│ │ ├── pbs_types.py
│ │ ├── pbs_unknown_resource_hook_update.py
│ │ ├── pbs_unset_exectime.py
│ │ ├── pbs_user_reliability.py
│ │ ├── pbs_validate_job_qsub_attributes.py
│ │ └── pbs_verify_log_output.py
│ ├── interfaces/
│ │ ├── __init__.py
│ │ ├── pbs_libpbs_so.py
│ │ ├── pbs_node_partition.py
│ │ ├── pbs_partition.py
│ │ ├── pbs_preempt_params.py
│ │ └── pbs_sched_interface_test.py
│ ├── pbs_smoketest.py
│ ├── performance/
│ │ ├── __init__.py
│ │ ├── pbs_cgroups_stress.py
│ │ ├── pbs_client_nagle_performance.py
│ │ ├── pbs_equiv_classes_perf.py
│ │ ├── pbs_history_cleanup_quasihang.py
│ │ ├── pbs_jobperf.py
│ │ ├── pbs_preemptperformance.py
│ │ ├── pbs_qstat_performance.py
│ │ ├── pbs_qsub_performance.py
│ │ ├── pbs_rerunjob_file_transfer_perf.py
│ │ ├── pbs_runjobwait_perf.py
│ │ ├── pbs_sched_perf.py
│ │ ├── pbs_standing_resv_quasihang.py
│ │ └── test_dependency_perf.py
│ ├── resilience/
│ │ ├── __init__.py
│ │ └── pbs_hook_alarm_large_multinode_job.py
│ ├── security/
│ │ ├── __init__.py
│ │ ├── pbs_command_injection.py
│ │ └── pbs_multiple_auth.py
│ ├── selftest/
│ │ ├── __init__.py
│ │ ├── pbs_config_sched.py
│ │ ├── pbs_cycles_test.py
│ │ ├── pbs_default_timeout.py
│ │ ├── pbs_dshutils_tests.py
│ │ ├── pbs_expect.py
│ │ ├── pbs_initservices.py
│ │ ├── pbs_job_cleanup.py
│ │ ├── pbs_json_test_report.py
│ │ ├── pbs_manager.py
│ │ ├── pbs_managers_operators.py
│ │ ├── pbs_param_dict.py
│ │ ├── pbs_pbstestsuite.py
│ │ ├── pbs_requirements_decorator.py
│ │ ├── pbs_resvid_test.py
│ │ ├── pbs_test_create_vnodes.py
│ │ ├── pbs_test_revert_site_hooks.py
│ │ ├── pbs_test_revert_to_defaults.py
│ │ ├── pbs_testlogutils.py
│ │ └── pbs_testparams_decorator.py
│ └── upgrades/
│ └── __init__.py
└── valgrind.supp
================================================
FILE CONTENTS
================================================
================================================
FILE: .clang-format
================================================
---
Language: Cpp
# BasedOnStyle: LLVM
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Right
AlignOperands: true
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: Never
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine
BinPackArguments: true
BinPackParameters: true
BreakBeforeBraces: Custom
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: true
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 0
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 8
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '[<"]pbs_config.h[>"]'
Priority: -1
- Regex: '.*'
Priority: 3
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
Priority: 4
IncludeIsMainRegex: '(Test)?$'
IndentCaseLabels: true
IndentPPDirectives: None
IndentWidth: 8
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Right
ReflowComments: false
SortIncludes: false
SortUsingDeclarations: true
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp11
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 8
UseTab: Always
AlwaysBreakAfterReturnType: AllDefinitions
SpaceAfterCStyleCast: true
...
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
#### Describe Bug or Feature
#### Describe Your Change
#### Link to Design Doc
#### Attach Test and Valgrind Logs/Output
================================================
FILE: .github/checkclang
================================================
#!/bin/bash
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
export PATH=$PATH:/usr/local/bin/
checkdir="$(readlink -f $(dirname $0))"
which clang-format 1>/dev/null 2>/dev/null
if [ $? -ne 0 ]; then
echo "Could not find clang-format command" 1>&2
exit 1
fi
cd ${checkdir}/..
find . -iname *.h -o -iname *.c -o -iname *.cpp | xargs clang-format --dry-run
exit $?
================================================
FILE: .github/checkpep8
================================================
#!/bin/bash
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
checkdir="$(readlink -f $(dirname $0))"
errors=0
which pep8 1>/dev/null 2>/dev/null
if [ $? -ne 0 ]; then
echo "Could not find pep8 command" 1>&2
exit 1
fi
cd ${checkdir}/..
is_python_file() {
name=$(basename ${1})
# special case
# if .rst file then it will be considered
# as a plain text file
if [ "x${name##*.}" == "xrst" ]; then
return 1
fi
# special case
# if __init__.py does not contain any code then file
# command will consider it as plain text file
if [ "x${name}" == "x__init__.py" ]; then
return 0
fi
if [ "x$(file --mime-type -b ${1})" == "xtext/x-python" ]; then
return 0
fi
return 1
}
check_pep8() {
pep8 --show-source ${1} >out_check_pep8 2>&1
return $?
}
for f in $(find test -type f)
do
if is_python_file ${f}
then
if ! check_pep8 ${f}
then
cat out_check_pep8 1>&2
rm -f out_check_pep8
errors=$((errors + 1))
fi
if [ -x "${f}" ]; then
echo "${f}: executable bit set" 1>&2
errors=$((errors + 1))
fi
fi
done
if [ ${errors} -ne 0 ]; then
exit 1
else
exit 0
fi
================================================
FILE: .github/runchecks
================================================
#!/bin/bash
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
declare -a listofchecks
listofchecks[0]="checkpep8"
listofchecks[1]="checkclang"
checkdir=$(readlink -f $(dirname $0))
errors_fails=0
for check in ${listofchecks[@]}
do
echo -n "Running check: '${check}' ... "
if [ ! -x "${checkdir}/${check}" ]; then
echo "NOTFOUND"
errors_fails=$((errors_fails + 1))
continue
fi
${checkdir}/${check} >out 2>err
if [ $? -ne 0 ]; then
echo "FAILED"
cat err
errors_fails=$((errors_fails + 1))
else
echo "OK"
cat out
fi
done
if [ ${errors_fails} -ne 0 ]; then
exit 1
else
exit 0
fi
================================================
FILE: .gitignore
================================================
# Object files
*.o
*.ko
*.obj
*.elf
*.slo
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.libs
*.a
*.la
*.lo
*.lai
# module files
*.mod
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# Debug files
*.dSYM/
# Eclipse project files
.project
.cproject
.pydevproject
.settings/
.autotools
.csettings/
.devcontainer/
# Files used by ctags
tags
# Files used by cscope
cscope.files
cscope.out
#Visual Studio files
*.user
*.ncb
*.suo
.vscode/
win_configure/.vs/
# Files used by gtags
GPATH
GRTAGS
GTAGS
# Files/Directory generated by PBSTestLab
ptl_test_results.html
ptl_test_results.json
test/fw/build/
test/fw/ptl/__init__.py
test/fw/setup.py
test/tests/ptl_test_results.json
test/tests/*/ptl_test_results.json
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# Python Distribution / packaging
.Python
develop-eggs/
dist/
downloads/
eggs/
.eggs/
sdist/
*.egg-info/
.installed.cfg
*.egg
# pip Installer logs
pip-log.txt
pip-delete-this-directory.txt
*.log
# Build directory
target/
target-*/
#PyCharm project directory
.idea/
# From automake/autoconf
autom4te.cache/
autoscan.log
autoscan-*.log
configure.scan
config.status
aclocal.m4
buildutils/config.guess
buildutils/config.sub
# Libtool
libtool
m4/libtool.m4
m4/ltoptions.m4
m4/ltsugar.m4
m4/ltversion.m4
m4/lt~obsolete.m4
buildutils/ltmain.sh
# Build related files
configure
Makefile.in
Makefile
*.deps
buildutils/pbs_mkdirs
buildutils/ar-lib
buildutils/compile
buildutils/depcomp
buildutils/install-sh
buildutils/missing
buildutils/py-compile
buildutils/exclude_script
buildutils/makedepend-sh
buildutils/ylwrap
# Generated binaries
src/cmds/mpiexec
src/cmds/nqs2pbs
src/cmds/pbs_attach
src/cmds/pbs_demux
src/cmds/pbs_ds_password.bin
src/cmds/pbs_lamboot
src/cmds/pbs_mpihp
src/cmds/pbs_mpilam
src/cmds/pbs_mpirun
src/cmds/pbs_rdel
src/cmds/pbs_remsh
src/cmds/pbs_rstat
src/cmds/pbs_rsub
src/cmds/pbs_ralter
src/cmds/pbs_tmrsh
src/cmds/pbsdsh
src/cmds/pbsnodes
src/cmds/pbs_release_nodes
src/cmds/pbs_dataservice.bin
src/cmds/pbsrun
src/cmds/pbsrun_unwrap
src/cmds/pbsrun_wrap
src/cmds/qalter
src/cmds/qdel
src/cmds/qdisable
src/cmds/qenable
src/cmds/qhold
src/cmds/qmgr
src/cmds/qmove
src/cmds/qmsg
src/cmds/qorder
src/cmds/qrerun
src/cmds/qrls
src/cmds/qrun
src/cmds/qselect
src/cmds/qsig
src/cmds/qstart
src/cmds/qstat
src/cmds/qstop
src/cmds/qsub
src/cmds/qterm
src/cmds/scripts/limits.pbs_mom
src/cmds/scripts/limits.post_services
src/cmds/scripts/pbs_habitat
src/cmds/scripts/pbs_init.d
src/cmds/scripts/pbs_poerun
src/cmds/scripts/pbs_postinstall
src/cmds/scripts/pbsrun.poe
src/cmds/scripts/pbs_reload
src/iff/pbs_iff
src/mom_rcp/pbs_rcp
src/resmom/pbs_mom
src/scheduler/pbs_sched
src/scheduler/pbs_sched_bare
src/scheduler/pbsfs
src/server/pbs_comm
src/server/pbs_server.bin
src/tools/pbs_ds_monitor
src/tools/pbs_hostn
src/tools/pbs_idled
src/tools/pbs_probe
src/tools/pbs_python
src/tools/pbs_tclsh
src/tools/pbs_upgrade_job
src/tools/pbs_wish
src/tools/printjob.bin
src/tools/printjob_svr.bin
src/tools/tracejob
src/tools/wrap_tcl.sh
src/tools/pbs_sleep
src/unsupported/pbs_rmget
src/unsupported/renew-test/renew-test
# Generated source files
src/include/pbs_version.h
src/include/pbs_config.h
src/include/pbs_config.h.in
src/include/pbs_config.h.in~
src/include/job_attr_enum.h
src/include/node_attr_enum.h
src/include/queue_attr_enum.h
src/include/resc_def_enum.h
src/include/resv_attr_enum.h
src/include/sched_attr_enum.h
src/include/svr_attr_enum.h
src/lib/Libattr/queue_attr_def.c
src/lib/Libattr/resc_def_all.c
src/lib/Libattr/resv_attr_def.c
src/lib/Libattr/sched_attr_def.c
src/lib/Libattr/svr_attr_def.c
src/lib/Libattr/job_attr_def.c
src/lib/Libattr/node_attr_def.c
src/lib/Libpbs/ecl_job_attr_def.c
src/lib/Libpbs/ecl_node_attr_def.c
src/lib/Libpbs/ecl_queue_attr_def.c
src/lib/Libpbs/ecl_resc_def_all.c
src/lib/Libpbs/ecl_resv_attr_def.c
src/lib/Libpbs/ecl_sched_attr_def.c
src/lib/Libpbs/ecl_svr_attr_def.c
src/include/stamp-h1
src/lib/Libpython/pbs_ifl.i
src/lib/Libpython/pbs_ifl.py
src/lib/Libpython/pbs_ifl_wrap.c
src/lib/Libifl/pbs_ifl.py
src/lib/Libifl/pbs_ifl_wrap.c
src/include/job_attr_enum.h
src/include/node_attr_enum.h
src/include/queue_attr_enum.h
src/include/resc_def_enum.h
src/include/resv_attr_enum.h
src/include/sched_attr_enum.h
src/include/svr_attr_enum.h
#Generated source files - Windows
src/lib/Libecl/ecl_node_attr_def.c
src/lib/Libecl/ecl_job_attr_def.c
src/lib/Libecl/ecl_queue_attr_def.c
src/lib/Libecl/ecl_resc_def_all.c
src/lib/Libecl/ecl_resv_attr_def.c
src/lib/Libecl/ecl_sched_attr_def.c
src/lib/Libecl/ecl_svr_attr_def.c
win_configure/projects/pbs_ifl.i
win_configure/projects/pbs_ifl.py
win_configure/projects/pbs_ifl_wrap.c
#ci logs
ci/logs/
ci/logs/prev_LOGS/
ci/.*
ci/packages
ci/ptl_ts_tree.json
ci/docker-compose.json
# Generated scripts
src/cmds/scripts/modulefile
src/cmds/scripts/pbs.service
# Generated by make dist
*.tar.gz
src/lib/Libpbs/pbs.pc
# rpm spec file
*.spec
# Other archive file types
*.tar
*.tar.bz
*.tgz
*.zip
*.cpio
*.rpm
*.deb
# Generated directories by autotools
*.libs
================================================
FILE: CODE_OF_CONDUCT.md
================================================
#### OpenPBS Open Source Project
## **Code of Conduct**
This code of conduct is a guide for members of the OpenPBS community. We are committed to providing an open and welcoming environment for the OpenPBS community. We expect that all members of the community will behave according to this code of conduct. This code of conduct is intended to explain the spirit in which we expect to communicate, not to be an exhaustive list. This code of conduct applies to all elements of the OpenPBS community: mailing lists, bug tracking systems, etc. Anyone who violates this code of conduct may be banned from the OpenPBS community. It is unacceptable to follow the letter but not the spirit of this code of conduct.
Guidelines for code of conduct:
* **Be friendly and patient.**
* **Be welcoming:** We strive to be a community that welcomes and supports people of all backgrounds and identities.
* **Be considerate:** Your work will be used by other people, and you in turn will depend on the work of others. Decisions you make affect everyone in the community, so please be mindful of your actions and always choose a non-confrontational approach. Remember: this is a global community and English is not everyone's primary language.
* **Be respectful:** Disagreements may occur, but we cannot abide personal attacks. The health of the community depends on all members feeling comfortable and supported. If you don't agree, use discretion and be polite.
* **Be careful in the words that we choose:** we are a community of professionals, and we conduct ourselves professionally. Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behavior aren’t acceptable.
* **Try to understand why we disagree:** Disagreements, both social and technical, happen all the time. It is important that we resolve disagreements and differing views constructively. Different people have different perspectives on issues. Being unable to understand why someone holds a viewpoint doesn’t mean that they’re wrong. Don’t forget that it is human to err and blaming each other doesn’t get us anywhere. Instead, focus on helping to resolve issues and learning from mistakes.
In addition, our open source community members are expected to abide by the **[OpenPBS Acceptable Use Policy](https://openpbs.atlassian.net/wiki/spaces/PBSPro/pages/5537837/Acceptable+Use+Policy).
### Reporting Issues
If you experience or witness unacceptable behavior — or have any other concerns — please report it by sending e-mail to webmaster@pbspro.org. All reports will be handled with discretion. In your report please include:
* Your contact information.
* Names (real, nicknames, or pseudonyms) of any individuals involved. If there are additional witnesses, please include them as well. Your account of what occurred, and if you believe the incident is ongoing. If there is a publicly available record (e.g. a mailing list archive or a public IRC logger), please include a link.
* Any additional information that may be helpful.
After filing a report, a representative will contact you personally, review the incident, follow up with any additional questions, and make a decision as to how to respond. If the person who is harassing you is part of the response team, they will recuse themselves from handling your incident. If the complaint originates from a member of the response team, it will be handled by a different member of the response team. We will respect confidentiality requests for the purpose of protecting victims of abuse.
### Attribution & Acknowledgements
This code of conduct is based on the **[Open Code of Conduct v1.0](https://github.com/todogroup/opencodeofconduct)** from the **[TODOGroup](http://todogroup.org)**. We are thankful for their work and all the communities who have paved the way with codes of conduct.
### PBS Pro Contributor's Portal
Please see the PBS Pro Contributor's Portal for the PBS Pro **[Code of Conduct](https://openpbs.atlassian.net/wiki/spaces/PBSPro/pages/5537835/Code+of+Conduct)**.
Note: In May 2020, OpenPBS became the new name for the PBS Professional Open Source Project. (PBS Professional will be used to refer to the commercial version; OpenPBS to the Open Source version -- same code, easier naming.) As there are many parts to the project, it will take several weeks to change the name in all places, so you will continue to see references to PBS Pro (as in the above) -- stay tuned.
================================================
FILE: CONTRIBUTING.md
================================================
### Contributing to the OpenPBS Open Source Project
We're so happy that you want to contribute to OpenPBS!
Please see the Contributor's Portal for details, guidelines, and how-to tutorials. Start at **[Becoming a Contributor to OpenPBS](https://pbspro.atlassian.net/wiki/spaces/DG/pages/20414474/Becoming+a+Contributor+to+PBS+Pro)**.
Note: In May 2020, OpenPBS became the new name for the PBS Professional Open Source Project. (PBS Professional will be used to refer to the commercial version; OpenPBS to the Open Source version -- same code, easier naming.) As there are many parts to the project, it will take several weeks to change the name in all places, so you will continue to see references to PBS Pro (as in the above) -- stay tuned.
================================================
FILE: COPYRIGHT
================================================
Copyright (C) 1994-2021 Altair Engineering, Inc.
For more information, contact Altair at www.altair.com.
This file is part of both the OpenPBS software ("OpenPBS")
and the PBS Professional ("PBS Pro") software.
Open Source License Information:
OpenPBS is free software. You can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
OpenPBS is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
Commercial License Information:
PBS Pro is commercially licensed software that shares a common core with
the OpenPBS software. For a copy of the commercial license terms and
conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
Altair Legal Department.
Altair's dual-license business model allows companies, individuals, and
organizations to create proprietary derivative works of OpenPBS and
distribute them - whether embedded or bundled with other software -
under a commercial license agreement.
Use of Altair's trademarks, including but not limited to "PBS™",
"OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
subject to Altair's trademark licensing policies.
================================================
FILE: INSTALL
================================================
--------------------------------------------------------------------
How to install PBS using the configure script.
0. Disable SELinux.
OpenPBS does not support SELinux. With SELinux enabled, initial start fails
with datastore permission error. You can also define proper policy but it is
out of scope of this guide.
1. Install the prerequisite packages for building PBS.
For CentOS-8 systems you should configure and enable powertools
repo for hwloc-devel and libedit-devel packages.
You should run the following commands as root:
dnf install -y dnf-plugins-core
dnf config-manager --set-enabled powertools
dnf install -y gcc make rpm-build libtool hwloc-devel \
libX11-devel libXt-devel libedit-devel libical-devel \
ncurses-devel perl postgresql-devel postgresql-contrib python3-devel tcl-devel \
tk-devel swig expat-devel openssl-devel libXext libXft \
autoconf automake gcc-c++ cjson-devel
For CentOS-7 systems you should run the following command as root:
yum install -y gcc make rpm-build libtool hwloc-devel \
libX11-devel libXt-devel libedit-devel libical-devel \
ncurses-devel perl postgresql-devel postgresql-contrib python3-devel tcl-devel \
tk-devel swig expat-devel openssl-devel libXext libXft \
autoconf automake gcc-c++
For openSUSE systems you should run the following command as root:
zypper install gcc make rpm-build libtool hwloc-devel \
libX11-devel libXt-devel libedit-devel libical-devel \
ncurses-devel perl postgresql-devel postgresql-contrib python3-devel tcl-devel \
tk-devel swig libexpat-devel libopenssl-devel libXext-devel \
libXft-devel fontconfig autoconf automake gcc-c++ cJSON-devel
For Debian systems you should run the following command as root:
apt-get install gcc make libtool libhwloc-dev libx11-dev \
libxt-dev libedit-dev libical-dev ncurses-dev perl \
postgresql-server-dev-all postgresql-contrib python3-dev tcl-dev tk-dev swig \
libexpat-dev libssl-dev libxext-dev libxft-dev autoconf \
automake g++ libcjson-dev
For Ubuntu-18.04 systems you should run the following command as root:
apt install gcc make libtool libhwloc-dev libx11-dev \
libxt-dev libedit-dev libical-dev ncurses-dev perl \
postgresql-server-dev-all postgresql-contrib python3-dev tcl-dev tk-dev swig \
libexpat-dev libssl-dev libxext-dev libxft-dev autoconf \
automake g++
For Ubuntu-24.04 systems you should run the following command as root:
apt install gcc make libtool libhwloc-dev libx11-dev \
libxt-dev libedit-dev libical-dev ncurses-dev perl \
postgresql-server-dev-all postgresql-contrib python3-dev tcl-dev tk-dev swig \
libexpat-dev libssl-dev libxext-dev libxft-dev autoconf \
automake g++ libcjson-dev
For macOS systems using MacPorts you should run the following command as root:
port install autoconf automake libtool pkgconfig \
expat hwloc libedit libical openssl postgresql14 python310 \
swig-python tcl tk xorg-libX11 xorg-libXt
2. Install the prerequisite packages for running PBS. In addition
to the commands below, you should also install a text editor of
your choosing (vim, emacs, gedit, etc.).
For CentOS systems you should run the following command as root:
yum install -y expat libedit postgresql-server postgresql-contrib python3 \
sendmail sudo tcl tk libical chkconfig cjson
For openSUSE systems you should run the following command as root:
zypper install expat libedit postgresql-server postgresql-contrib python3 \
sendmail sudo tcl tk libical1 libcjson1
For Debian (jessie) systems you should run the following command as root:
apt-get install expat libedit2 postgresql python3 postgresql-contrib sendmail-bin \
sudo tcl tk libical1a
For Debian (stretch) systems you should run the following command as root:
apt-get install expat libedit2 postgresql python3 postgresql-contrib sendmail-bin \
sudo tcl tk libical2
For Debian (buster) systems you should run the following command as root:
apt-get install expat libedit2 postgresql python3 postgresql-contrib sendmail-bin \
sudo tcl tk libical3 libcjson1
For Ubuntu-18.04 systems you should run the following command as root:
apt install expat libedit2 postgresql python3 postgresql-contrib sendmail-bin \
sudo tcl tk libical3 postgresql-server-dev-all
For Ubuntu-24.04 systems you should run the following command as root:
apt install expat libedit2 postgresql python3 postgresql-contrib sendmail-bin \
sudo tcl tk libical3 postgresql-server-dev-all
For macOS systems using MacPorts you should run the following command as root:
port install expat libedit libical openssl postgresql14-server python310 \
tcl tk
3. Open a terminal as a normal (non-root) user, unpack the PBS
tarball, and cd to the package directory.
tar -xpvf openpbs-20.0.0.tar.gz
cd openpbs-20.0.0
4. Generate the configure script and Makefiles. (See note 1 below)
./autogen.sh
5. Display the available build parameters.
./configure --help
6. Configure the build for your environment. You may utilize the
parameters displayed in the previous step. (See note 2 below)
For CentOS and Debian systems you should run the following
command:
./configure --prefix=/opt/pbs
For openSUSE systems (see note 3 below) you should run the
following command:
./configure --prefix=/opt/pbs --libexecdir=/opt/pbs/libexec
For macOS systems using MacPorts you should run the following commands:
export CPATH=/opt/local/include/postgresql14:/opt/local/include
export LIBRARY_PATH=/opt/local/lib/postgresql14:/opt/local/lib
./configure --with-swig=/opt/local --with-tcl=/opt/local
If PTL needs to be installed along with PBS use the option
"--enable-ptl" (see note 5 below)
eg ./configure --prefix=/opt/pbs --enable-ptl
7. Build PBS by running "make". (See note 4 below)
make
8. Configure sudo to allow your user account to run commands as
root. Refer to the online manual pages for sudo, sudoers, and
visudo.
9. Install PBS. Use sudo to run the command as root.
sudo make install
10. Configure PBS by executing the post-install script.
sudo /opt/pbs/libexec/pbs_postinstall
11. Edit /etc/pbs.conf to configure the PBS services that
should be started. If you are installing PBS on only
one system, you should change the value of PBS_START_MOM
from zero to one. If you use vi as your editor, you would
run:
sudo vi /etc/pbs.conf
12. Some file permissions must be modified to add SUID privilege.
sudo chmod 4755 /opt/pbs/sbin/pbs_iff /opt/pbs/sbin/pbs_rcp
13. Start the PBS services.
sudo /etc/init.d/pbs start
14. All configured PBS services should now be running. Update
your PATH and MANPATH variables by sourcing the appropriate
PBS profile or logging out and back in.
For Bourne shell (or similar) run the following:
. /etc/profile.d/pbs.sh
For C shell (or similar) run the following:
source /etc/profile.d/pbs.csh
15. You should now be able to run PBS commands to submit
and query jobs. Some examples follow.
bash$ qstat -B
Server Max Tot Que Run Hld Wat Trn Ext Status
---------------- ----- ----- ----- ----- ----- ----- ----- ----- -----------
host1 0 0 0 0 0 0 0 0 Active
bash$ pbsnodes -a
host1
Mom = host1
ntype = PBS
state = free
pcpus = 2
resources_available.arch = linux
resources_available.host = host1
resources_available.mem = 2049248kb
resources_available.ncpus = 2
resources_available.vnode = host1
resources_assigned.accelerator_memory = 0kb
resources_assigned.mem = 0kb
resources_assigned.naccelerators = 0
resources_assigned.ncpus = 0
resources_assigned.vmem = 0kb
resv_enable = True
sharing = default_shared
license = l
bash$ echo "sleep 60" | qsub
0.host1
bash$ qstat -a
host1:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
0.host1 mike workq STDIN 2122 1 1 -- -- R 00:00
bash$
--------------------------------------------------------------------
NOTES:
Note 1: If you modify configure.ac or adjust timestamps on any files
that are automatically generated, you will need to regenerate them
by re-running autogen.sh.
Note 2: It is advisable to create a simple shell script that calls
configure with the appropriate options for your environment. This
ensures configure will be called with the same arguments during
subsequent invocations. If you have already run configure you can
regenerate all of the Makefiles by running "./config.status".
The first few lines of config.status will reveal the options that
were specified when configure was run. If you set envirnment
variables such as CFLAGS it is best to do so as an argument to
configure (e.g. ./configure CFLAGS="-O0 -g" --prefix=/opt/pbs).
This will ensure consistency when config.status regenerates the
Makefiles.
Note 3: The openSUSE rpm package expands %_libexecdir to /opt/pbs/lib
rather than /opt/pbs/libexec which causes problems for the post-
install scripts. Providing the --libexecdir value to configure
overrides this behavior.
Note 4: You need to use a POSIX (or nearly POSIX) make. GNU make
works quite well in this regard; BSD make does not. If you are
having any sort of build problems, your make should be a prime
suspect. Tremendous effort has been expended to provide proper
dependency generation and makefiles without relying on any
non-POSIX features. The build should work fine with a simple call
to make, however, complicating things by using various make flags
is not guaranteed to work. Don't be surprised if the first thing
that make does is call configure again.
Note 5: PTL gets installed in the parent directory of where PBS
is installed. For example if you have given install prefix=/opt/pbs, then
you can find PTL installation in the directory /opt/ptl . You may need to
log out and log in from the terminal for PATH and PYTHONPATH to update.
Using valgrind with PBS.
-------------------------------------
Here is a set of steps to detect memory errors/leaks within PBS code.
1. Install the valgrind development package.
yum install valgrind-devel (zypper for OpenSUSE).
2. Compile Python in a way that valgrind can work with it, as follows:
./configure --prefix= --without-pymalloc --with-pydebug --with-valgrind
make; make install
3. Compile PBS with the special python and in debug mode as follows:
./configure --prefix= --with-python= CFLAGS="-g -DPy_DEBUG -DDEBUG -Wall -Werror"
4. Run pbs daemons under valgrind.
a) To detect memory errors (not leaks) run pbs daemons as follows:
export LD_LIBRARY_PATH=/opt/pbs/pgsql/lib:/opt/pbs/lib:$LD_LIBRARY_PATH
valgrind --tool=memcheck --log-file=/tmp/val.out /opt/pbs/sbin/pbs_server.bin
b) To detect memory leaks use the supplied leaks suppression file valgrind.supp, as follows:
export LD_LIBRARY_PATH=/opt/pbs/pgsql/lib:/opt/pbs/lib:$LD_LIBRARY_PATH
valgrind --tool=memcheck --log-file=/tmp/val.out --suppressions=./valgrind.supp --leak-check=full --track-origins=yes /opt/pbs/sbin/pbs_server.bin
================================================
FILE: LICENSE
================================================
----------------------------------------------------
Open Source License for OpenPBS and PBS Professional
----------------------------------------------------
Copyright (C) 1994-2021 Altair Engineering, Inc.
For more information, contact Altair at www.altair.com.
This file is part of both the OpenPBS software ("OpenPBS")
and the PBS Professional ("PBS Pro") software.
Open Source License Information:
OpenPBS is free software. You can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
OpenPBS is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
Commercial License Information:
PBS Pro is commercially licensed software that shares a common core with
the OpenPBS software. For a copy of the commercial license terms and
conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
Altair Legal Department.
Altair's dual-license business model allows companies, individuals, and
organizations to create proprietary derivative works of OpenPBS and
distribute them - whether embedded or bundled with other software -
under a commercial license agreement.
Use of Altair's trademarks, including but not limited to "PBS™",
"OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
subject to Altair's trademark licensing policies.
==============================================================================
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc.
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
Copyright (C)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
.
==============================================================================
--------------------------------
Third Party Software Information
--------------------------------
PBS Pro includes code created by other parties which is provided under
the open source software license agreements chosen by the authors. All
unmodified files from these and other sources retain their original
copyright and license notices.
_ _ _ _ _ _
src/scheduler/sort.c
Copyright (c) 1992, 1993. Regents of the University of California.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. All advertising materials mentioning features or use of this software
must display the following acknowledgement:
This product includes software developed by the University of
California, Berkeley and its contributors.
4. Neither the name of the University nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
_ _ _ _ _ _
src/lib/Libwin/rcmd.c
Copyright (c) 1983 Regents of the University of California.
All rights reserved.
Redistribution and use in source and binary forms are permitted
provided that the above copyright notice and this paragraph are
duplicated in all such forms and that any documentation,
advertising materials, and other materials related to such
distribution and use acknowledge that the software was developed
by the University of California, Berkeley. The name of the
University may not be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
_ _ _ _ _ _
src/resmom/popen.c
Copyright (c) 1988, 1993
The Regents of the University of California. All rights reserved.
This code is derived from software written by Ken Arnold and
published in UNIX Review, Vol. 6, No. 8.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. All advertising materials mentioning features or use of this software
must display the following acknowledgement:
This product includes software developed by the University of
California, Berkeley and its contributors.
4. Neither the name of the University nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
_ _ _ _ _ _
src/lib/Libutil/avltree.c
Copyright (c) 2000 Gregory Tseytin
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer as
the first lines of this file unmodified.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY Gregory Tseytin ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL Gregory Tseytin BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
_ _ _ _ _ _
buildutils/depcomp
buildutils/compile
Copyright (C) 1999-2013 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
As a special exception to the GNU General Public License, if you
distribute this file as part of a program that contains a
configuration script generated by Autoconf, you may include it under
the same distribution terms that you use for the rest of that program.
_ _ _ _ _ _
buildutils/install-sh
Copyright (C) 1994 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of the X Consortium shall not
be used in advertising or otherwise to promote the sale, use or other deal-
ings in this Software without prior written authorization from the X Consor-
tium.
_ _ _ _ _ _
buildutils/ltmain.sh
m4/libtool.m4
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
2006, 2007, 2008, 2009, 2010, 2011 Free Software
Foundation, Inc.
Written by Gordon Matzigkeit, 1996
This file is part of GNU Libtool.
GNU Libtool is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
As a special exception to the GNU General Public License,
if you distribute this file as part of a program or library that
is built using GNU Libtool, you may include this file under the
same distribution terms that you use for the rest of that program.
GNU Libtool is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Libtool; see the file COPYING. If not, a copy
can be downloaded from http://www.gnu.org/licenses/gpl.html, or
obtained by writing to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
_ _ _ _ _ _
m4/lt~obsolete.m4
Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
Written by Scott James Remnant, 2004. (see license below)
m4/ltoptions.m4
Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
Inc.
Written by Gary V. Vaughan, 2004 (see license below)
m4/ltsugar.m4
Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
Written by Gary V. Vaughan, 2004 (see license below)
m4/ltversion.m4
Copyright (C) 2004 Free Software Foundation, Inc.
Written by Scott James Remnant, 2004. (see license below)
m4 GNU license:
License: GPL-2+ or configure-same-as-package
This file is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
Public License for more details.
The full text of the GNU General Public License version 2 is available on
Debian systems in /usr/share/common-licenses/GPL-2.
As a special exception to the GNU General Public License, if you
distribute this file as part of a program that contains a configuration
script generated by Autoconf, you may include it under the same
distribution terms that you use for the rest of that program.
_ _ _ _ _ _
buildutils/makedepend-sh
Copyright (c) 1996, 1998 The NetBSD Foundation, Inc.
All rights reserved.
This code is derived from software contributed to The NetBSD Foundation
by Lonhyn T. Jasinskyj.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. All advertising materials mentioning features or use of this software
must display the following acknowledgement:
This product includes software developed by the NetBSD
Foundation, Inc. and its contributors.
4. Neither the name of The NetBSD Foundation nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: Makefile.am
================================================
#
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
#
ACLOCAL_AMFLAGS = -I m4
SUBDIRS = buildutils src doc test
EXTRA_DIST = \
COPYRIGHT \
INSTALL \
LICENSE \
README.md \
autogen.sh \
openpbs-rpmlintrc \
openpbs.spec
================================================
FILE: PBS_License.txt
================================================
Copyright (C) 1994-2021 Altair Engineering, Inc.
For more information, contact Altair at www.altair.com.
This file is part of both the OpenPBS software ("OpenPBS")
and the PBS Professional ("PBS Pro") software.
Open Source License Information:
OpenPBS is free software. You can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
OpenPBS is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
Commercial License Information:
PBS Pro is commercially licensed software that shares a common core with
the OpenPBS software. For a copy of the commercial license terms and
conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
Altair Legal Department.
Altair's dual-license business model allows companies, individuals, and
organizations to create proprietary derivative works of OpenPBS and
distribute them - whether embedded or bundled with other software -
under a commercial license agreement.
Use of Altair's trademarks, including but not limited to "PBS™",
"OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
subject to Altair's trademark licensing policies.
================================================
FILE: README.md
================================================
### OpenPBS Open Source Project
If you are new to this project, please start at https://www.openpbs.org/
Note: In May 2020, OpenPBS became the new name for the PBS Professional Open Source Project. (PBS Professional will be used to refer to the commercial version; OpenPBS to the Open Source version -- same code, easier naming.) As there are many parts to the project, it will take several weeks to change the name in all places, so you will continue to see references to PBS Pro -- stay tuned.
### What is OpenPBS?
OpenPBS® software optimizes job scheduling and workload management in high-performance computing (HPC) environments – clusters, clouds, and supercomputers – improving system efficiency and people’s productivity. Built by HPC people for HPC people, OpenPBS is fast, scalable, secure, and resilient, and supports all modern infrastructure, middleware, and applications.
* **Scalability:** supports millions of cores with fast job dispatch and minimal latency; tested beyond 50,000 nodes
* **Policy-Driven Scheduling:** meets unique site goals and SLAs by balancing job turnaround time and utilization with optimal job placement
* **Resiliency:** includes automatic fail-over architecture with no single point of failure – jobs are never lost, and jobs continue to run despite failures
* **Flexible Plugin Framework:** simplifies administration with enhanced visibility and extensibility; customize implementations to meet complex requirements
* **Health Checks:** monitors and automatically mitigates faults with a comprehensive health check framework
* **Voted #1 HPC Software** by HPC Wire readers and proven for over 20 years at thousands of sites around the globe in both the private sector and public sector
### Community and Ways to Participate
OpenPBS is a community effort and there are a variety of ways to engage, from helping answer questions to benchmarking to developing new capabilities and tests. We value being aggressively open and inclusive, but also aggressively respectful and professional. See our [Code of Conduct](https://openpbs.atlassian.net/wiki/display/PBSPro/Code+of+Conduct).
The best place to start is by joining the community forum. You may sign up or view the archives via:
* [Announcements](http://community.openpbs.org/c/announcements) -- important updates relevant to the entire PBS Pro community
* [Users/Site Admins](http://community.openpbs.org/c/users-site-administrators) -- general questions and discussions among end users (system admins, engineers, scientists)
* [Developers](http://community.openpbs.org/c/developers) -- technical discussions among developers
To dive in deeper and learn more about the project and what the community is up to, visit:
* [Contributor’s portal](https://openpbs.atlassian.net/wiki) -- includes roadmaps, processes, how to articles, coding standards, release notes, etc (Uses Confluence)
* [Source code](https://github.com/OpenPBS/openpbs) -- includes full source code and test framework (Uses Github)
* [Issue tracking system](https://github.com/OpenPBS/openpbs/issues) -- includes bugs and feature requests and status (Uses Github). Previously, we used [JIRA](https://pbspro.atlassian.net), which contains older issues.
OpenPBS is also integrated in the OpenHPC software stack. The mission of OpenHPC is to provide an integrated collection of HPC-centric components to provide full-featured HPC software stacks. OpenHPC is a Linux Foundation Collaborative Project. Learn more at:
* [OpenHPC.community](http://openhpc.community)
* [The Linux Foundation](http://thelinuxfoundation.org)
### Our Vision: One Scheduler for the whole HPC World
There is a huge opportunity to advance the state of the art in HPC scheduling by bringing the whole HPC world together, marrying public sector innovations with private sector enterprise know-how, and retargeting the effort wasted re-implementing the same old capabilities again and again towards pushing the outside of the envelope. At the heart of this vision is fostering common standards (at least defacto standards like common software). To this end, Altair has made a big investment by releasing the PBS Professional technology as OpenPBS (under an Open Source license to meet the needs of the public sector), while also continuing to offer PBS Professional (under a commercial license to meet the needs of the private sector). One defacto standard that can work for the whole HPC community.
### Current Build status
[](https://travis-ci.com/OpenPBS/openpbs)
================================================
FILE: autogen.sh
================================================
#!/bin/sh
#
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
if test -d ./src/resmom; then
echo "Generating configure script and Makefile templates."
exec autoreconf --force --install -I m4 $*
else
echo "Execute `basename $0` from the top level distribution directory."
fi
================================================
FILE: azure-pipelines.yml
================================================
trigger:
branches:
include:
- master
- release_*
pr:
branches:
include:
- master
- release_*
pool:
vmImage: 'ubuntu-latest' # Changed from ubuntu-20.04
variables:
- name: DOCKER_BUILDKIT
value: 1
jobs:
- job: runcheck
displayName: 'Code Quality Checks'
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
displayName: 'Checkout code'
- bash: |
sudo apt-get update
sudo apt-get install -y python3-pip
sudo pip3 install --upgrade pip
sudo pip3 install pycodestyle pep8 flake8 clang-format
# Create pep8 symlink if it doesn't exist (for compatibility)
if ! command -v pep8 &> /dev/null; then
sudo ln -sf $(which pycodestyle) /usr/local/bin/pep8
fi
# Verify installations
echo "Checking installed tools:"
python3 --version
pip3 --version
pep8 --version || pycodestyle --version
clang-format --version
# Check if runchecks script exists
if [ -f ".github/runchecks" ]; then
chmod +x .github/runchecks
./.github/runchecks
else
echo "Warning: .github/runchecks script not found"
# Run basic checks if script is missing
echo "Running basic Python style checks..."
find . -name "*.py" -exec pep8 {} \; || true
fi
displayName: 'Run code quality checks'
- job: ubuntu_2004_build
displayName: 'Ubuntu 20.04'
dependsOn: runcheck
pool:
vmImage: 'ubuntu-latest'
variables:
OS_TYPE: "ubuntu:20.04"
PKG_INSTALL_CMD: "apt-get -y update && apt-get -y upgrade && apt-get install -y python3 build-essential"
DOCKER_EXTRA_ARG: "-e DEBIAN_FRONTEND=noninteractive -e LANGUAGE=C.UTF-8 -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8"
CI_CMD: "./ci --local"
CONTAINER_NAME: "ubuntu2004-$(Build.BuildId)"
steps:
- checkout: self
displayName: 'Checkout code'
- script: |
echo "Starting build for Ubuntu 20.04"
echo "OS Type: $(OS_TYPE)"
echo "Package Install: $(PKG_INSTALL_CMD)"
echo "Docker Args: $(DOCKER_EXTRA_ARG)"
echo "CI Command: $(CI_CMD)"
echo "Container Name: $(CONTAINER_NAME)"
displayName: 'Display build configuration'
- script: |
# Pull the Docker image
docker pull $(OS_TYPE)
# Start the container with proper init to handle zombie processes
docker run -d \
$(DOCKER_EXTRA_ARG) \
-h pbs.dev.local \
--name $(CONTAINER_NAME) \
-v $(pwd):$(pwd) \
--privileged \
--init \
-w $(pwd) \
$(OS_TYPE) \
/bin/bash -c "sleep 3600"
# Verify container is running
docker ps | grep $(CONTAINER_NAME)
displayName: 'Start Docker container'
- script: |
# Install packages
docker exec $(CONTAINER_NAME) bash -c "$(PKG_INSTALL_CMD)"
# Install additional tools for process management
docker exec $(CONTAINER_NAME) bash -c "apt-get install -y procps psmisc"
# Verify Python installation
docker exec $(CONTAINER_NAME) python3 --version
displayName: 'Install dependencies'
- script: |
# Monitor processes before running CI
echo "=== Process monitoring before CI ==="
docker exec $(CONTAINER_NAME) bash -c "
echo 'Current processes:'
ps aux | head -20
echo ''
echo 'Checking for zombie/defunct processes:'
ps aux | grep -E 'defunct|' || echo 'No zombie processes found'
echo ''
echo 'PBS-related processes:'
ps aux | grep -E 'pbs_|openpbs' || echo 'No PBS processes found'
"
displayName: 'Monitor processes before CI'
- script: |
# Check if ci directory and script exist
docker exec $(CONTAINER_NAME) bash -c "ls -la"
docker exec $(CONTAINER_NAME) bash -c "if [ -d 'ci' ]; then ls -la ci/; else echo 'ci directory not found'; fi"
# Run CI script if it exists
if docker exec $(CONTAINER_NAME) bash -c "[ -f 'ci/ci' ] || [ -f './ci' ]"; then
docker exec --privileged $(CONTAINER_NAME) bash -c "cd ci && $(CI_CMD)"
else
echo "CI script not found, running basic build test"
docker exec $(CONTAINER_NAME) bash -c "python3 -c 'print(\"Python test successful\")'"
fi
# Check for any PBS processes and stop them properly
echo "Checking for PBS processes..."
docker exec $(CONTAINER_NAME) bash -c "ps aux | grep -E 'pbs_|openpbs' || echo 'No PBS processes found'"
# Stop PBS services properly if they're running
docker exec $(CONTAINER_NAME) bash -c "
if command -v pbs_server &> /dev/null; then
echo 'Stopping PBS services...'
pkill -TERM pbs_server || true
pkill -TERM pbs_sched || true
pkill -TERM pbs_mom || true
pkill -TERM pbs_ds_monitor || true
sleep 2
# Force kill if still running
pkill -KILL pbs_server || true
pkill -KILL pbs_sched || true
pkill -KILL pbs_mom || true
pkill -KILL pbs_ds_monitor || true
fi
" || true
displayName: 'Run CI tests'
- script: |
# Proper PBS cleanup and container shutdown
echo "Cleaning up PBS processes and container..."
# Stop PBS services gracefully first
docker exec $(CONTAINER_NAME) bash -c "
echo 'Stopping PBS services gracefully...'
if command -v qterm &> /dev/null; then
qterm -t quick || true
fi
# Stop individual PBS components
pkill -TERM pbs_server || true
pkill -TERM pbs_sched || true
pkill -TERM pbs_mom || true
pkill -TERM pbs_ds_monitor || true
# Wait a bit for graceful shutdown
sleep 3
# Force kill any remaining PBS processes
pkill -KILL pbs_server || true
pkill -KILL pbs_sched || true
pkill -KILL pbs_mom || true
pkill -KILL pbs_ds_monitor || true
# Clean up any remaining zombie processes
ps aux | grep -E 'defunct|' || echo 'No zombie processes found'
" || true
# Stop and remove container
docker stop $(CONTAINER_NAME) || true
docker rm $(CONTAINER_NAME) || true
displayName: 'Cleanup Docker container'
condition: always()
- job: ubuntu_2404_build
displayName: 'Ubuntu 24.04'
dependsOn: runcheck
pool:
vmImage: 'ubuntu-latest'
variables:
OS_TYPE: "ubuntu:24.04"
PKG_INSTALL_CMD: "apt-get -y update && apt-get -y upgrade && apt-get install -y python3 build-essential"
DOCKER_EXTRA_ARG: "-e DEBIAN_FRONTEND=noninteractive -e LANGUAGE=C.UTF-8 -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8"
CI_CMD: "./ci --local"
CONTAINER_NAME: "ubuntu2404-$(Build.BuildId)"
steps:
- checkout: self
displayName: 'Checkout code'
- script: |
echo "Starting build for Ubuntu 24.04"
echo "OS Type: $(OS_TYPE)"
echo "Package Install: $(PKG_INSTALL_CMD)"
echo "Docker Args: $(DOCKER_EXTRA_ARG)"
echo "CI Command: $(CI_CMD)"
echo "Container Name: $(CONTAINER_NAME)"
displayName: 'Display build configuration'
- script: |
# Pull the Docker image
docker pull $(OS_TYPE)
# Start the container with proper init to handle zombie processes
docker run -d \
$(DOCKER_EXTRA_ARG) \
-h pbs.dev.local \
--name $(CONTAINER_NAME) \
-v $(pwd):$(pwd) \
--privileged \
--init \
-w $(pwd) \
$(OS_TYPE) \
/bin/bash -c "sleep 3600"
# Verify container is running
docker ps | grep $(CONTAINER_NAME)
displayName: 'Start Docker container'
- script: |
# Install packages
docker exec $(CONTAINER_NAME) bash -c "$(PKG_INSTALL_CMD)"
# Install additional tools for process management
docker exec $(CONTAINER_NAME) bash -c "apt-get install -y procps psmisc"
# Verify Python installation
docker exec $(CONTAINER_NAME) python3 --version
displayName: 'Install dependencies'
- script: |
# Monitor processes before running CI
echo "=== Process monitoring before CI ==="
docker exec $(CONTAINER_NAME) bash -c "
echo 'Current processes:'
ps aux | head -20
echo ''
echo 'Checking for zombie/defunct processes:'
ps aux | grep -E 'defunct|' || echo 'No zombie processes found'
echo ''
echo 'PBS-related processes:'
ps aux | grep -E 'pbs_|openpbs' || echo 'No PBS processes found'
"
displayName: 'Monitor processes before CI'
- script: |
# Check if ci directory and script exist
docker exec $(CONTAINER_NAME) bash -c "ls -la"
docker exec $(CONTAINER_NAME) bash -c "if [ -d 'ci' ]; then ls -la ci/; else echo 'ci directory not found'; fi"
# Run CI script if it exists
if docker exec $(CONTAINER_NAME) bash -c "[ -f 'ci/ci' ] || [ -f './ci' ]"; then
docker exec --privileged $(CONTAINER_NAME) bash -c "cd ci && $(CI_CMD)"
else
echo "CI script not found, running basic build test"
docker exec $(CONTAINER_NAME) bash -c "python3 -c 'print(\"Python test successful\")'"
fi
# Check for any PBS processes and stop them properly
echo "Checking for PBS processes..."
docker exec $(CONTAINER_NAME) bash -c "ps aux | grep -E 'pbs_|openpbs' || echo 'No PBS processes found'"
# Stop PBS services properly if they're running
docker exec $(CONTAINER_NAME) bash -c "
if command -v pbs_server &> /dev/null; then
echo 'Stopping PBS services...'
pkill -TERM pbs_server || true
pkill -TERM pbs_sched || true
pkill -TERM pbs_mom || true
pkill -TERM pbs_ds_monitor || true
sleep 2
# Force kill if still running
pkill -KILL pbs_server || true
pkill -KILL pbs_sched || true
pkill -KILL pbs_mom || true
pkill -KILL pbs_ds_monitor || true
fi
" || true
displayName: 'Run CI tests'
- script: |
# Proper PBS cleanup and container shutdown
echo "Cleaning up PBS processes and container..."
# Stop PBS services gracefully first
docker exec $(CONTAINER_NAME) bash -c "
echo 'Stopping PBS services gracefully...'
if command -v qterm &> /dev/null; then
qterm -t quick || true
fi
# Stop individual PBS components
pkill -TERM pbs_server || true
pkill -TERM pbs_sched || true
pkill -TERM pbs_mom || true
pkill -TERM pbs_ds_monitor || true
# Wait a bit for graceful shutdown
sleep 3
# Force kill any remaining PBS processes
pkill -KILL pbs_server || true
pkill -KILL pbs_sched || true
pkill -KILL pbs_mom || true
pkill -KILL pbs_ds_monitor || true
# Clean up any remaining zombie processes
ps aux | grep -E 'defunct|' || echo 'No zombie processes found'
" || true
# Stop and remove container
docker stop $(CONTAINER_NAME) || true
docker rm $(CONTAINER_NAME) || true
displayName: 'Cleanup Docker container'
condition: always()
- job: rocky_sanitize_build
displayName: 'Rocky Linux 9 Sanitize'
dependsOn: runcheck
pool:
vmImage: 'ubuntu-latest'
variables:
OS_TYPE: "rockylinux/rockylinux:9.2"
PKG_INSTALL_CMD: "yum -y update && yum -y install python3 gcc gcc-c++ make"
DOCKER_EXTRA_ARG: "-e BUILD_MODE=sanitize"
CI_CMD: "./ci --local=sanitize"
CONTAINER_NAME: "rocky-sanitize-$(Build.BuildId)"
steps:
- checkout: self
displayName: 'Checkout code'
- script: |
echo "Starting build for Rocky Linux 9 Sanitize"
echo "OS Type: $(OS_TYPE)"
echo "Package Install: $(PKG_INSTALL_CMD)"
echo "Docker Args: $(DOCKER_EXTRA_ARG)"
echo "CI Command: $(CI_CMD)"
echo "Container Name: $(CONTAINER_NAME)"
displayName: 'Display build configuration'
- script: |
# Pull the Docker image
docker pull $(OS_TYPE)
# Start the container with proper init to handle zombie processes
docker run -d \
$(DOCKER_EXTRA_ARG) \
-h pbs.dev.local \
--name $(CONTAINER_NAME) \
-v $(pwd):$(pwd) \
--privileged \
--init \
-w $(pwd) \
$(OS_TYPE) \
/bin/bash -c "sleep 3600"
# Verify container is running
docker ps | grep $(CONTAINER_NAME)
displayName: 'Start Docker container'
- script: |
# Install packages
docker exec $(CONTAINER_NAME) bash -c "$(PKG_INSTALL_CMD)"
# Install additional tools for process management
docker exec $(CONTAINER_NAME) bash -c "yum install -y procps-ng psmisc || dnf install -y procps-ng psmisc"
# Verify Python installation
docker exec $(CONTAINER_NAME) python3 --version
displayName: 'Install dependencies'
- script: |
# Monitor processes before running CI
echo "=== Process monitoring before CI ==="
docker exec $(CONTAINER_NAME) bash -c "
echo 'Current processes:'
ps aux | head -20
echo ''
echo 'Checking for zombie/defunct processes:'
ps aux | grep -E 'defunct|' || echo 'No zombie processes found'
echo ''
echo 'PBS-related processes:'
ps aux | grep -E 'pbs_|openpbs' || echo 'No PBS processes found'
"
displayName: 'Monitor processes before CI'
- script: |
# Check if ci directory and script exist
docker exec $(CONTAINER_NAME) bash -c "ls -la"
docker exec $(CONTAINER_NAME) bash -c "if [ -d 'ci' ]; then ls -la ci/; else echo 'ci directory not found'; fi"
# Run CI script if it exists
if docker exec $(CONTAINER_NAME) bash -c "[ -f 'ci/ci' ] || [ -f './ci' ]"; then
docker exec --privileged $(CONTAINER_NAME) bash -c "cd ci && $(CI_CMD)"
else
echo "CI script not found, running basic build test"
docker exec $(CONTAINER_NAME) bash -c "python3 -c 'print(\"Python test successful\")'"
fi
# Check for any PBS processes and stop them properly
echo "Checking for PBS processes..."
docker exec $(CONTAINER_NAME) bash -c "ps aux | grep -E 'pbs_|openpbs' || echo 'No PBS processes found'"
# Stop PBS services properly if they're running
docker exec $(CONTAINER_NAME) bash -c "
if command -v pbs_server &> /dev/null; then
echo 'Stopping PBS services...'
pkill -TERM pbs_server || true
pkill -TERM pbs_sched || true
pkill -TERM pbs_mom || true
pkill -TERM pbs_ds_monitor || true
sleep 2
# Force kill if still running
pkill -KILL pbs_server || true
pkill -KILL pbs_sched || true
pkill -KILL pbs_mom || true
pkill -KILL pbs_ds_monitor || true
fi
" || true
displayName: 'Run CI tests'
- script: |
# Proper PBS cleanup and container shutdown
echo "Cleaning up PBS processes and container..."
# Stop PBS services gracefully first
docker exec $(CONTAINER_NAME) bash -c "
echo 'Stopping PBS services gracefully...'
if command -v qterm &> /dev/null; then
qterm -t quick || true
fi
# Stop individual PBS components
pkill -TERM pbs_server || true
pkill -TERM pbs_sched || true
pkill -TERM pbs_mom || true
pkill -TERM pbs_ds_monitor || true
# Wait a bit for graceful shutdown
sleep 3
# Force kill any remaining PBS processes
pkill -KILL pbs_server || true
pkill -KILL pbs_sched || true
pkill -KILL pbs_mom || true
pkill -KILL pbs_ds_monitor || true
# Clean up any remaining zombie processes
ps aux | grep -E 'defunct|' || echo 'No zombie processes found'
" || true
# Stop and remove container
docker stop $(CONTAINER_NAME) || true
docker rm $(CONTAINER_NAME) || true
displayName: 'Cleanup Docker container'
condition: always()
- job: rocky_kerberos_build
displayName: 'Rocky Linux 9 Kerberos'
dependsOn: runcheck
pool:
vmImage: 'ubuntu-latest'
variables:
OS_TYPE: "rockylinux/rockylinux:9.2"
PKG_INSTALL_CMD: "yum -y update && yum -y install python3 gcc gcc-c++ make"
DOCKER_EXTRA_ARG: "-e BUILD_MODE=kerberos"
CI_CMD: "./ci --local"
CONTAINER_NAME: "rocky-kerberos-$(Build.BuildId)"
steps:
- checkout: self
displayName: 'Checkout code'
- script: |
echo "Starting build for Rocky Linux 9 Kerberos"
echo "OS Type: $(OS_TYPE)"
echo "Package Install: $(PKG_INSTALL_CMD)"
echo "Docker Args: $(DOCKER_EXTRA_ARG)"
echo "CI Command: $(CI_CMD)"
echo "Container Name: $(CONTAINER_NAME)"
displayName: 'Display build configuration'
- script: |
# Pull the Docker image
docker pull $(OS_TYPE)
# Start the container with proper init to handle zombie processes
docker run -d \
$(DOCKER_EXTRA_ARG) \
-h pbs.dev.local \
--name $(CONTAINER_NAME) \
-v $(pwd):$(pwd) \
--privileged \
--init \
-w $(pwd) \
$(OS_TYPE) \
/bin/bash -c "sleep 3600"
# Verify container is running
docker ps | grep $(CONTAINER_NAME)
displayName: 'Start Docker container'
- script: |
# Install packages
docker exec $(CONTAINER_NAME) bash -c "$(PKG_INSTALL_CMD)"
# Install additional tools for process management
docker exec $(CONTAINER_NAME) bash -c "yum install -y procps-ng psmisc || dnf install -y procps-ng psmisc"
# Verify Python installation
docker exec $(CONTAINER_NAME) python3 --version
displayName: 'Install dependencies'
- script: |
# Monitor processes before running CI
echo "=== Process monitoring before CI ==="
docker exec $(CONTAINER_NAME) bash -c "
echo 'Current processes:'
ps aux | head -20
echo ''
echo 'Checking for zombie/defunct processes:'
ps aux | grep -E 'defunct|' || echo 'No zombie processes found'
echo ''
echo 'PBS-related processes:'
ps aux | grep -E 'pbs_|openpbs' || echo 'No PBS processes found'
"
displayName: 'Monitor processes before CI'
- script: |
# Check if ci directory and script exist
docker exec $(CONTAINER_NAME) bash -c "ls -la"
docker exec $(CONTAINER_NAME) bash -c "if [ -d 'ci' ]; then ls -la ci/; else echo 'ci directory not found'; fi"
# Run CI script if it exists
if docker exec $(CONTAINER_NAME) bash -c "[ -f 'ci/ci' ] || [ -f './ci' ]"; then
docker exec --privileged $(CONTAINER_NAME) bash -c "cd ci && $(CI_CMD)"
else
echo "CI script not found, running basic build test"
docker exec $(CONTAINER_NAME) bash -c "python3 -c 'print(\"Python test successful\")'"
fi
# Check for any PBS processes and stop them properly
echo "Checking for PBS processes..."
docker exec $(CONTAINER_NAME) bash -c "ps aux | grep -E 'pbs_|openpbs' || echo 'No PBS processes found'"
# Stop PBS services properly if they're running
docker exec $(CONTAINER_NAME) bash -c "
if command -v pbs_server &> /dev/null; then
echo 'Stopping PBS services...'
pkill -TERM pbs_server || true
pkill -TERM pbs_sched || true
pkill -TERM pbs_mom || true
pkill -TERM pbs_ds_monitor || true
sleep 2
# Force kill if still running
pkill -KILL pbs_server || true
pkill -KILL pbs_sched || true
pkill -KILL pbs_mom || true
pkill -KILL pbs_ds_monitor || true
fi
" || true
displayName: 'Run CI tests'
- script: |
# Proper PBS cleanup and container shutdown
echo "Cleaning up PBS processes and container..."
# Stop PBS services gracefully first
docker exec $(CONTAINER_NAME) bash -c "
echo 'Stopping PBS services gracefully...'
if command -v qterm &> /dev/null; then
qterm -t quick || true
fi
# Stop individual PBS components
pkill -TERM pbs_server || true
pkill -TERM pbs_sched || true
pkill -TERM pbs_mom || true
pkill -TERM pbs_ds_monitor || true
# Wait a bit for graceful shutdown
sleep 3
# Force kill any remaining PBS processes
pkill -KILL pbs_server || true
pkill -KILL pbs_sched || true
pkill -KILL pbs_mom || true
pkill -KILL pbs_ds_monitor || true
# Clean up any remaining zombie processes
ps aux | grep -E 'defunct|' || echo 'No zombie processes found'
" || true
# Stop and remove container
docker stop $(CONTAINER_NAME) || true
docker rm $(CONTAINER_NAME) || true
displayName: 'Cleanup Docker container'
condition: always()
================================================
FILE: buildutils/Makefile.am
================================================
#
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
#
EXTRA_DIST = \
attr_parser.py
================================================
FILE: buildutils/attr_parser.py
================================================
# coding: utf-8
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
"""
attr_parser.py will parse xml files also called master attribute files
containing all the members of both server and ecl files,and will generate
two corresponding files one for server and one for ecl
"""
import getopt
import os
import pdb
import re
import string
import sys
import enum
import xml.dom.minidom
import xml.parsers.expat
list_ecl = []
list_svr = []
list_defs = []
global attr_type
global newattr
class PropType(enum.Enum):
'''
BOTH - Write information for this tag to all the output files
SERVER - Write information for this tag to the SERVER file only
ECL - Write information for this tag to the ECL file only
'''
BOTH = 0
SERVER = 1
ECL = 2
class switch(object):
"""
This class provides the functionality which is equivalent
to switch/case statements in C. It only needs to be defined
once.
"""
def __init__(self, value):
self.value = value
self.fall = False
def __iter__(self):
"""Return the match method once, then stop"""
yield self.match
def match(self, *args):
"""Indicate whether or not to enter a case suite"""
if self.fall or not args:
return True
elif self.value in args: # changed for v1.5, see below
self.fall = True
return True
else:
return False
def fileappend(prop_type, line):
'''
Selects files to append line to dependig on prop_type
prop_type - BOTH, SERVER, ECL
line - The string line to append to the file(s)
'''
global attr_type
if prop_type == PropType.SERVER:
if attr_type == PropType.SERVER or attr_type == PropType.BOTH:
list_svr.append(line)
elif prop_type == PropType.ECL:
if attr_type == PropType.ECL or attr_type == PropType.BOTH:
list_ecl.append(line)
elif prop_type == PropType.BOTH:
if attr_type == PropType.SERVER or attr_type == PropType.BOTH:
list_svr.append(line)
if attr_type == PropType.ECL or attr_type == PropType.BOTH:
list_ecl.append(line)
return None
def getText(svr_file, ecl_file, defines_file):
'''
getText function - (writes the data stored in lists to file)
svr_file - the server side output file
ecl_file - the output file to be used by the ECL layer
defines_file - the output file containing the macro definitions for the
index positions
'''
buff = "".join(list_svr)
for line in buff:
svr_file.write(line)
buff = "".join(list_ecl)
for line in buff:
ecl_file.write(line)
buff = "".join(list_defs)
for line in buff:
defines_file.write(line)
def do_head(node):
'''
Processes the head element of the node passed
'''
alist = node.getElementsByTagName('head')
for a in alist:
list_svr.append("/*Disclaimer: This is a machine generated file.*/" +
'\n')
list_svr.append("/*For modifying any attribute change corresponding "
"XML file */" + '\n')
list_ecl.append("/*Disclaimer: This is a machine generated file.*/" +
'\n')
list_ecl.append("/*For modifying any attribute change corresponding "
"XML file */" + '\n')
blist = a.getElementsByTagName('SVR')
blist_ecl = a.getElementsByTagName('ECL')
for s in blist:
text1 = s.childNodes[0].nodeValue
text1 = text1.strip(' \t')
list_svr.append(text1)
for e in blist_ecl:
text2 = e.childNodes[0].nodeValue
text2 = text2.strip(' \t')
list_ecl.append(text2)
def do_index(attr):
'''
Processes the member_index attribute attr
'''
li = None
li = attr.getElementsByTagName('member_index')
if li:
for v in li:
buf = v.childNodes[0].nodeValue
list_defs.append("\n\t" + buf + ",")
def do_member(attr, p_flag, tag_name):
'''
Processes the member identified by tage_name
attr - the attribute definition node
p_flag - property flag - SVR, ECL, BOTH
tag_name - the tag_name string to process
'''
global newattr
buf = None
comma = ','
if newattr:
comma = ''
newattr = False
li = attr.getElementsByTagName(tag_name)
if li:
svr = li[0].getElementsByTagName('SVR')
if svr:
value = svr
for v in value:
buf = v.childNodes[0].nodeValue
fileappend(PropType.SERVER, comma + '\n' + '\t' + '\t' + buf)
ecl = li[0].getElementsByTagName('ECL')
if ecl:
value = ecl
for v in value:
buf = v.childNodes[0].nodeValue
fileappend(PropType.ECL, comma + '\n' + '\t' + '\t' + buf)
value = li
for v in value:
buf = v.childNodes[0].nodeValue
if buf:
s = buf.strip('\n \t')
if s:
fileappend(p_flag, comma + '\n' + '\t' + '\t' + buf)
def process(master_file, svr_file, ecl_file, defines_file):
'''
process the master xml file and produce the outputs files as requested
master_file - the Master XML files to process
svr_file - the server side output file
ecl_file - the output file to be used by the ECL layer
defines_file - the output file containing the macro definitions for the
index positions
'''
from xml.dom import minidom
global attr_type
global newattr
newattr = False
doc = minidom.parse(master_file)
nodes = doc.getElementsByTagName('data')
for node in nodes:
do_head(node)
at_list = node.getElementsByTagName('attributes')
for attr in at_list:
attr_type = PropType.BOTH
newattr = True
flag_name = attr.getAttribute('flag')
if flag_name == 'SVR':
attr_type = PropType.SERVER
if flag_name == 'ECL':
attr_type = PropType.ECL
inc_name = attr.getAttribute('include')
if inc_name:
fileappend(PropType.SERVER, '\n' + inc_name)
mem_list = attr.childNodes[0].nodeValue
mem_list = mem_list.strip(' \t')
fileappend(PropType.BOTH, mem_list)
macro_name = attr.getAttribute('macro')
if macro_name:
fileappend(PropType.BOTH, '\n' + macro_name + "\n")
do_index(attr)
fileappend(PropType.BOTH, '\t{')
do_member(attr, PropType.BOTH, 'member_name')
do_member(attr, PropType.SERVER, 'member_at_decode')
do_member(attr, PropType.SERVER, 'member_at_encode')
do_member(attr, PropType.SERVER, 'member_at_set')
do_member(attr, PropType.SERVER, 'member_at_comp')
do_member(attr, PropType.SERVER, 'member_at_free')
do_member(attr, PropType.SERVER, 'member_at_action')
do_member(attr, PropType.BOTH, 'member_at_flags')
do_member(attr, PropType.BOTH, 'member_at_type')
do_member(attr, PropType.SERVER, 'member_at_parent')
do_member(attr, PropType.ECL, 'member_verify_function')
do_member(attr, PropType.SERVER, 'member_at_entlim')
do_member(attr, PropType.SERVER, 'member_at_struct')
fileappend(PropType.BOTH, '\n\t}')
fileappend(PropType.BOTH, ",")
if macro_name:
fileappend(PropType.BOTH, '\n#else')
fileappend(PropType.BOTH, '\n\t{\n\t\t"noop"\n\t},')
fileappend(PropType.BOTH, '\n#endif')
tail_list = node.getElementsByTagName('tail')
for t in tail_list:
tail_value = t.childNodes[0].nodeValue
if tail_value is None:
pass
fileappend(PropType.BOTH, '\n')
tail_both = t.getElementsByTagName('both')
tail_svr = t.getElementsByTagName('SVR')
tail_ecl = t.getElementsByTagName('ECL')
for tb in tail_both:
b = tb.childNodes[0].nodeValue
b = b.strip(' \t')
list_ecl.append(b)
list_svr.append(b)
for ts in tail_svr:
s = ts.childNodes[0].nodeValue
s = s.strip(' \t')
list_svr.append(s)
for te in tail_ecl:
e = te.childNodes[0].nodeValue
e = e.strip(' \t')
list_ecl.append(e)
getText(svr_file, ecl_file, defines_file)
def main(argv):
'''
Opens files,and calls appropriate functions based on Object values.
'''
global SVR_FILENAME
global ECL_FILENAME
global DEFINES_FILENAME
global MASTER_FILENAME
SVR_FILENAME = "/dev/null"
ECL_FILENAME = "/dev/null"
DEFINES_FILENAME = "/dev/null"
MASTER_FILENAME = "/dev/null"
if len(sys.argv) == 2:
usage()
sys.exit(1)
try:
opts, args = getopt.getopt(
argv, "m:s:e:d:h",
["master=", "svr=", "ecl=", "attr=", "help=", "defines="])
except getopt.error as err:
print(str(err))
usage()
sys.exit(1)
for opt, arg in opts:
if opt in ('-h', "--help"):
usage()
sys.exit(1)
elif opt in ("-m", "--master"):
MASTER_FILENAME = arg
elif opt in ("-s", "--svr"):
SVR_FILENAME = arg
elif opt in ("-d", "--defines"):
DEFINES_FILENAME = arg
elif opt in ("-e", "--ecl"):
ECL_FILENAME = arg
else:
print("Invalid Option!")
sys.exit(1)
# Error conditions are checked here.
if (MASTER_FILENAME is None or not os.path.isfile(MASTER_FILENAME) or
not os.path.getsize(MASTER_FILENAME) > 0):
print("Master file not found or data is not present in File")
sys.exit(1)
try:
master_file = open(MASTER_FILENAME, encoding='utf-8')
except IOError as err:
print(str(err))
print('Cannot open master file ' + MASTER_FILENAME)
sys.exit(1)
try:
svr_file = open(SVR_FILENAME, 'w', encoding='utf-8')
except IOError as err:
print(str(err))
print('Cannot open ferver file ' + SVR_FILENAME)
sys.exit(1)
try:
defines_file = open(DEFINES_FILENAME, 'w', encoding='utf-8')
except IOError as err:
print(str(err))
print('Cannot open defines file ' + DEFINES_FILENAME)
sys.exit(1)
try:
ecl_file = open(ECL_FILENAME, 'w', encoding='utf-8')
except IOError as err:
print(str(err))
print('Cannot open ecl file ' + ECL_FILENAME)
sys.exit(1)
process(master_file, svr_file, ecl_file, defines_file)
master_file.close()
svr_file.close()
ecl_file.close()
def usage():
"""
Usage (depicts the usage of the script)
"""
print("usage: prog -m -s "
"-e -d ")
if __name__ == "__main__":
main(sys.argv[1:])
================================================
FILE: ci/README.md
================================================
Instant-CI is a developer tool which aims at providing continous integration to the developers locally on their development systems.
Users can build, install PBS and run PTL tests with a single command. For this, the user need not worry about any underlying dependencies.
It also supports build and test history in the form of logs.
Dependencies for this tool are:
* python3.5 or above
* docker (17.12.0+)
* docker-compose
***How to setup:***
Simply invoke the following command:
` ./ci`
***CLI interface for ci:***
* **./ci :** This is the primary command for ci. It starts the container (if not already running), builds PBS dependencies. Will configure(if required), make and install PBS. If the tests option are given it will run PTL with the same. It does not take any argument.
```bash
./ci
```
* **./ci --params:** The params option can be used to run ci with a custom configuration.
Following parameters can be set.
| os | nodes | configure | tests |
> os: used to set OS platform of the container (single node)
> nodes: used to define multi-node configuration for container
> configure: will hold the value of configure options for PBS
> tests: will hold the value for pbs_benchpress argument for PTL; if set empty will skip PTL tests
```bash
# When the params command is called without any arguments it will display the currently set "configuration" and then proceed to run ci
# as the following example.
./ci --params
# or
./ci -p
# The following command is an example of how to provide a custom configure option for PBS. Everything to the right of the first '=' after configure will
# be taken as it is and given as an argument to the configure file in PBS. The same convention follows for other configuration options as well
./ci --params 'configure=CFLAGS=" -O2 -Wall -Werror" --prefix=/tmp/pbs --enable-ptl'
# You can also pass multiple parameter with this option for example
./ci -p 'configure=--enable-ptl --prefix=/opt/pbs' -p 'tests=-t SmokeTest.test_basic'
# The following are examples how to define a custom test case for pbs_benchpress.
# NOTE: The string is passed to pbs_benchpress command therefore one can use all available options of pbs_benchpress here.
# By default the test option is set to '-t SmokeTest'
./ci --params 'tests=-f pbs_smoketest.py'
./ci --params 'tests=--tags=smoke'
# If you wish to not run any PTL tests then use the below command. This will set tests as empty thus not invoking PTL.
./ci --params 'tests='
# Below is an example of setting the container operating system. This will setup a single container running PBS server.
# NOTE: ci uses cached image to increase performance. These cached images are saved on the local system
# with the suffix '-ci-pbs'. If you do not wish to use the cached image(s) delete them using .
# OS platform can be defined by any image from docker-hub
./ci --params 'os=centos:7'
# Following is an example of how to define multi node setup for PBS.
# You can define multiple 'mom' or 'comm' nodes but only one 'server' node
./ci --params 'nodes=mom=centos:7;server=ubuntu:16.04;comm=ubuntu:18.04;mom=centos:8'
```
* **./ci --build-pkgs:** Invoke this command to build PBS packages. By default it will build packages for the platform ci container is started for.
Optionally accepts argument for other platform. The packages can be found in 'ci/packages' folder.
```bash
# Below command builds package for the platform ci was started/currently running on.
./ci --build-pkgs
# or
./ci -b
```
* **./ci --delete:** This will delete any containers created by this tool and take a backup of logs. The current logs can be found in the "logs" folder in the ci folder. The backup of previous sessions logs can be can be found in the ci/logs/session-{date}-{timestamp} folder.
```bash
# If you want to delete the container simply invoke this command.
./ci --delete
# or
./ci -d
```
* **./ci --local:** This will build, install PBS, and run smoke tests on the local machine. This option can not be combined with other options. It does not take configurations from params but runs with predefined params(as run in travis).
```bash
# The command to run
./ci --local
#or
./ci -l
# Optionally one can run the sanitize version (works only on centos:7) with the following argument
./ci --local sanitize
```
================================================
FILE: ci/ci
================================================
#!/usr/bin/env python3
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
import argparse
import configparser
import copy
import fileinput
import json
import os
import platform
import re
import shlex
import shutil
import subprocess
import sys
import textwrap
import threading
import time
from argparse import RawTextHelpFormatter
from string import Template
ci_dirname = ''
default_platform = ''
MACROS = {}
def read_macros():
for line in open(os.path.join(ci_dirname, 'etc', 'macros')):
var, value = line.split('=')
MACROS[var] = value.replace('\n', '')
requirements_template = Template('''num_servers=${num_servers}
num_moms=${num_moms}
num_comms=${num_comms}
no_mom_on_server=${no_mom_on_server}
no_comm_on_server=${no_comm_on_server}
no_comm_on_mom=${no_comm_on_mom}
''')
service_template_prist = Template('''{
"image": "${image}",
"volumes": [
"../:/pbssrc",
"./:/src",
"./logs:/logs",
"./etc:/workspace/etc"
],
"entrypoint": "/workspace/etc/container-init",
"environment": [
"NODE_TYPE=${node_type}",
"LANG=en_US.utf-8"
],
"networks": {
"ci.local": { }
},
"domainname": "ci.local",
"container_name": "${hostname}",
"hostname": "${hostname}",
"user": "root",
"privileged": true,
"stdin_open": true,
"tty": true
}''')
def log_error(msg):
print("ERROR ::: " + str(msg))
def log_info(msg):
t = time.localtime()
current_time = time.strftime("%H:%M:%S", t)
print(current_time + " ---> " + str(msg))
def log_warning(msg):
print("WARNING ::: " + str(msg))
def get_services_list():
_ps = subprocess.run(
["docker-compose", "-f", "docker-compose.json",
"ps", "--filter", "status=running", "--services"],
stdout=subprocess.PIPE)
_p = str((_ps.stdout).decode('utf-8'))
return [x for x in _p.splitlines() if len(x) > 0]
def get_compose_file_services_list():
compose_file = os.path.join(ci_dirname, 'docker-compose.json')
with open(compose_file) as f:
compose_file = json.loads(f.read())
return list(compose_file['services'].keys())
def run_cmd(cmd, return_output=False):
'''
Run a terminal command, and if needed return output of the command.
'''
cmd = shlex.split(cmd)
try:
a = subprocess.Popen(cmd, stdout=subprocess.PIPE)
out, err = a.communicate()
if a.returncode != 0:
log_error("command failed")
log_error(str(err))
else:
if return_output:
return str(out)
except Exception as e:
log_error("The command failed.")
log_error(e)
def run_docker_cmd(run_cmd, run_on='all'):
'''
Runs a docker command and on failure redirects user to
the container terminal
'''
services = get_services_list()
services.sort(reverse=True) # we want server cmds to run first
for service in services:
cmd = "docker-compose -f docker-compose.json exec "
cmd += service + " bash -c \'" + run_cmd + "\'"
if run_on != 'all' and service.find(run_on) == -1:
log_info('Skipping on ' + service +
' as command only to be run on ' + run_on)
continue
try:
log_info(cmd)
docker_cmd = shlex.split(cmd)
a = subprocess.Popen(docker_cmd)
a.communicate()
if a.returncode != 0:
_msg = "docker cmd returned with non zero exit code,"
_msg += "redirecting you to container terminal"
log_error(_msg)
_docker_cmd = "docker-compose -f docker-compose.json exec "
_docker_cmd += service + " bash -c \'cd /pbssrc && /bin/bash\'"
docker_cmd = shlex.split(_docker_cmd)
subprocess.run(docker_cmd)
os._exit(1)
except Exception as e:
log_error("Failed\n:")
log_error(e)
def write_to_file(file_path, value):
with open(file_path, "w+") as f:
f.write(value)
def read_from_file(file_path):
if not os.path.isfile(file_path):
open(file_path, 'a').close()
with open(file_path, 'r+') as f:
val = f.read()
return val
def commit_docker_image():
'''
Watch for readiness of ci containers to commit a new image
'''
images_to_commit = {}
time_spent = 0
services = get_services_list()
service_count = len(services)
timeout = 1 * 60 * 60
while service_count > 0:
# Do not want to check constantly as it increases cpu load
time.sleep(15)
time_spent = time_spent + 15
if time_spent > timeout:
log_error("build is taking too long, timed out")
sys.exit(1)
status = read_from_file(os.path.join(
ci_dirname, MACROS['CONFIG_DIR'], MACROS['STATUS_FILE']))
for service in services:
if str(status).find(service) != -1:
services.remove(service)
service_count -= 1
image = (service.split('-', 1)[1][:-2]).replace('-', ':')
image = image.replace("_", ".")
images_to_commit[image] = service
for key in images_to_commit:
try:
build_id = 'docker-compose -f docker-compose.json ps -q ' + \
images_to_commit[key]
build_id = run_cmd(build_id, True)
build_id = build_id.split("'")[1]
build_id = build_id[:12]
image_name = (str(key).replace(':', '-')
).replace('.', '_') + '-ci-pbs'
# shortening the build id to 12 characters as is displayed by
# 'docker ps' unlike 'docker-compose ps' which shows full id
cmd = 'docker commit '+build_id+' '+image_name+':latest'
log_info(cmd)
run_cmd(cmd)
except Exception as e:
log_error(e)
try:
bad_images = "docker images -qa -f'dangling=true'"
bad_images = run_cmd(bad_images, True)
if bad_images != "b''":
bad_images = (bad_images.split("'")[1]).replace("\\n", " ")
print("The following untagged images will be removed -> " +
bad_images)
cmd = 'docker rmi ' + bad_images
run_cmd(cmd)
except Exception as e:
log_warning(
"could not remove bad (dangling) images, \
please remove manually")
print(e)
return True
def create_ts_tree_json():
benchpress_opt = os.path.join(
ci_dirname, MACROS['CONFIG_DIR'], MACROS['BENCHPRESS_OPT_FILE'])
benchpress_value = read_from_file(benchpress_opt)
try:
cmd = '/src/etc/gen_ptl_json.sh "' + benchpress_value + '"'
run_docker_cmd(cmd, run_on='server')
except Exception:
log_error('Failed to generate testsuite info json')
sys.exit(1)
def get_node_config(node_image=default_platform):
'''
Calculate the required node configuration for given
requirements decorator and return node config
'''
json_data = {}
max_servers_needed = 1
max_moms_needed = 1
max_comms_needed = 1
no_mom_on_server_flag = False
no_comm_on_mom_flag = True
no_comm_on_server_flag = False
try:
with open(os.path.join(ci_dirname, 'ptl_ts_tree.json')) as f:
json_data = json.load(f)
except Exception:
log_error('Could not find ptl tree json file')
for ts in json_data.values():
for tclist in ts['tclist'].values():
max_moms_needed = max(
tclist['requirements']['num_moms'], max_moms_needed)
max_servers_needed = max(
tclist['requirements']['num_servers'], max_servers_needed)
max_comms_needed = max(
tclist['requirements']['num_comms'], max_comms_needed)
no_mom_on_server_flag = tclist['requirements']['no_mom_on_server']\
or no_mom_on_server_flag
no_comm_on_server_flag = tclist['requirements']['no_comm_on_server']\
or no_comm_on_server_flag
no_comm_on_mom_flag = tclist['requirements']['no_comm_on_mom']\
or no_comm_on_mom_flag
# Create a bash readable requirements decorator file
write_to_file(os.path.join(ci_dirname, MACROS['CONFIG_DIR'],
MACROS['REQUIREMENT_DECORATOR_FILE']),
requirements_template.substitute(num_servers=max_servers_needed,
num_moms=max_moms_needed,
num_comms=max_comms_needed,
no_mom_on_server=no_mom_on_server_flag,
no_comm_on_server=no_comm_on_server_flag,
no_comm_on_mom=no_comm_on_mom_flag))
server_nodes = []
mom_nodes = []
comm_nodes = []
# get required number of servers and moms
for _ in range(max_servers_needed):
server_nodes.append(node_image)
if not no_mom_on_server_flag:
max_moms_needed = max(max_moms_needed, max_servers_needed)
if max_moms_needed > max_servers_needed:
for _ in range(max_moms_needed - max_servers_needed):
mom_nodes.append(node_image)
else:
for _ in range(max_moms_needed):
mom_nodes.append(node_image)
only_moms = len(mom_nodes)
# get required num of comms
if no_comm_on_mom_flag and no_comm_on_server_flag:
for _ in range(max_comms_needed):
comm_nodes.append(node_image)
elif no_comm_on_mom_flag and not no_comm_on_server_flag:
if max_comms_needed > max_servers_needed:
for _ in range(max_comms_needed-max_servers_needed):
comm_nodes.append(node_image)
else:
if max_comms_needed > only_moms:
for _ in range(max_comms_needed - only_moms):
comm_nodes.append(node_image)
# remove the trailing ';' from the node_config string
mom_nodes = ['mom=' + x for x in mom_nodes]
server_nodes = ['server=' + x for x in server_nodes]
comm_nodes = ['comm=' + x for x in comm_nodes]
node_images = ";".join(server_nodes + mom_nodes + comm_nodes)
return node_images
def tail_build_log():
server_name = ''
build_log_path = get_services_list()
for i in build_log_path:
if i.find('server') != -1:
build_log_path = i
server_name = i
build_log_path = os.path.join(
ci_dirname, 'logs', 'build-' + build_log_path)
prev = ''
next = ''
with open(build_log_path, 'rb') as f:
while True:
f.seek(-2, os.SEEK_END)
while f.read(1) != b'\n':
f.seek(-2, os.SEEK_CUR)
next = f.readline().decode()
if next != prev:
print(next, end='')
prev = next
else:
status = os.path.join(
ci_dirname, MACROS['CONFIG_DIR'], MACROS['STATUS_FILE'])
status = read_from_file(status)
if status.find(server_name) != -1:
return
def check_for_existing_image(val=default_platform):
'''
This function will check whether an existing image with the
post-fix of '-ci-pbs' exists or not for the given docker image.
'''
if val.find('-ci-pbs') == -1:
search_str = val.replace(":", "-")
search_str = search_str.replace(".", '_')
search_str += '-ci-pbs'
cmd = 'docker images -q ' + search_str
search_result = run_cmd(cmd, True)
if search_result != "b''":
return True, search_str
else:
return False, val
def get_current_setup():
'''
Returns the node config for currently running ci containers
'''
compose_file = os.path.join(ci_dirname, 'docker-compose.json')
node_config = ''
with open(compose_file) as f:
compose_file = json.loads(f.read())
for service in compose_file['services']:
image = compose_file["services"][service]['image']
if image[-7:] == '-ci-pbs':
image = image[:-7][::-1].replace('-', ':', 1)[::-1]
node_type = compose_file["services"][service]['environment'][0]
node_type = node_type.split('=')[1]
node_config += node_type + '=' + image + ';'
node_config = node_config[:-1]
return node_config
def load_conf():
conf_file = os.path.join(
ci_dirname, MACROS['CONFIG_DIR'], MACROS['CONF_JSON_FILE'])
with open(conf_file) as f:
conf_file = json.loads(f.read())
return conf_file
def show_set_opts():
conf_opts = load_conf()
os_file_list = get_compose_file_services_list()
os_file_list = [(x.split('-', 1)[0] + '=' + x.split('-', 1)[1][:-2]
).replace('-', ':').replace('_', '.')
for x in os_file_list]
os_file_list.sort()
conf_opts['OS'] = os_file_list
print(json.dumps(conf_opts, indent=2, sort_keys=True))
def create_param_file():
'''
Create param file with necessary node configuration for
multi node PTL tests.
'''
moms = []
comms = []
include_server_mom = False
include_server_comm = False
include_mom_comm = False
reqs = read_from_file(os.path.join(
ci_dirname, MACROS['CONFIG_DIR'],
MACROS['REQUIREMENT_DECORATOR_FILE']))
if reqs.find('no_mom_on_server=False') != -1:
include_server_mom = True
if reqs.find('no_comm_on_server=False') != -1:
include_server_comm = True
if reqs.find('no_comm_on_mom=False') != -1:
include_mom_comm = True
for service in get_services_list():
service = service+'.ci.local'
if service.find('server') != -1:
if include_server_mom:
moms.append(service)
if include_server_comm:
comms.append(service)
if service.find('mom') != -1:
moms.append(service)
if include_mom_comm:
comms.append(service)
if service.find('comm') != -1:
comms.append(service)
write_str = ''
if len(moms) != 0:
write_str = 'moms=' + ':'.join(moms) + '\n'
if len(comms) != 0:
write_str += 'comms=' + ':'.join(comms)
param_path = os.path.join(
ci_dirname, MACROS['CONFIG_DIR'], MACROS['PARAM_FILE'])
write_to_file(param_path, write_str)
def unpack_node_string(nodes):
'''
Helper function to expand abbreviated node config
'''
for x in nodes:
if x.find('*') != -1:
num = x.split('*')[0]
try:
num = int(num)
except Exception:
log_error('invalid string provided for "nodes" configuration')
sys.exit(1)
val = x.split('*')[1]
nodes.remove(x)
for _ in range(num):
nodes.append(val)
return ';'.join(nodes)
def build_compose_file(nodes):
'''
Build docker-compose file for given node config in function parameter
'''
compose_template = {
"version": "3.5",
"networks": {
"ci.local": {
"name": "ci.local"
}
},
"services": {}
}
if nodes.find("*") != -1:
nodes = unpack_node_string(nodes.split(';'))
count = 0
server = ''
for n in nodes.split(';'):
count = count + 1
node_key, node_val = n.split('=')
if (node_val not in MACROS['SUPPORTED_PLATFORMS'].split(',')
and ''.join(sys.argv).find(node_val) != -1):
log_warning("Given platform '" + node_val + "' is not supported by" +
" ci, will result in unexpected behaviour")
log_warning("Supported platforms are " +
MACROS['SUPPORTED_PLATFORMS'])
node_name = node_key + '-' + \
(node_val.replace(':', '-')).replace('.', '_') + '-' + str(count)
image_value = node_val
_, image_value = check_for_existing_image(node_val)
service_template = json.loads(service_template_prist.substitute(
image=image_value, node_type=node_key,
hostname=node_name))
if node_key == 'server':
server = node_name
compose_template['services'][node_name] = service_template
for service in compose_template['services']:
compose_template['services'][service]['environment'].append(
"SERVER="+server)
f = open(os.path.join(ci_dirname, 'docker-compose.json'), 'w')
json.dump(compose_template, f, indent=2, sort_keys=True)
f.close()
log_info("Configured nodes for ci")
def ensure_ci_running():
'''
Check for running ci container; if not start ci container.
'''
try:
service_count = len(get_services_list())
if service_count == 0:
log_info("No running service found")
try:
log_info('Attempting to start container')
os.chdir(ci_dirname)
subprocess.run(["docker-compose", "-f",
"docker-compose.json", "down",
"--remove-orphans"],
stdout=subprocess.DEVNULL)
if os.path.exists(os.path.join(ci_dirname,
MACROS['CONFIG_DIR'],
MACROS['STATUS_FILE'])):
os.remove(os.path.join(
ci_dirname, MACROS['CONFIG_DIR'],
MACROS['STATUS_FILE']))
write_to_file(os.path.join(
ci_dirname, MACROS['CONFIG_DIR'],
MACROS['STATUS_FILE']), '')
subprocess.run(
["docker-compose", "-f",
"docker-compose.json", "up", "-d"])
log_info('Waiting for container build to complete ')
build_log_path = os.path.join(ci_dirname, 'logs')
log_info("Build logs can be found in " + build_log_path)
# wait for build to complete and commit newly built container
tail_build_log()
commit_docker_image()
except Exception as e:
log_error(e)
else:
log_info("running container found")
return 0
except Exception:
log_error(e)
def check_prerequisites():
'''
This function will check whether docker docker-compose commands
are available. Also check docker version is minimum required.
'''
cmd = "where" if platform.system() == "Windows" else "which"
try:
subprocess.run([cmd, "docker"], stdout=subprocess.DEVNULL)
except Exception:
log_error("docker not found in PATH")
sys.exit(1)
def version_tuple(s: str):
return tuple(int(x) for x in s.split("."))
try:
version = subprocess.run(
["docker", "--version"], stdout=subprocess.PIPE)
version = re.findall(r'\s*([\d.]+)', version.stdout.decode('utf-8'))
req_version = MACROS['REQ_DOCKER_VERSION']
if version_tuple(version[0]) < version_tuple(req_version):
print(version[0])
print("Docker version less than minimum required " + req_version)
sys.exit(1)
except Exception:
log_error("Failed to get docker version")
sys.exit(1)
try:
subprocess.run([cmd, "docker-compose"], stdout=subprocess.DEVNULL)
except Exception:
log_error("docker-compose not found in PATH")
sys.exit(1)
def is_restart_required():
'''
This function checks if the number of nodes currently running meet
requirement for the given test case. If not builds new docker-compose file
and returns bool value to restart ci.
'''
create_ts_tree_json()
current_file_services_list = get_compose_file_services_list()
current_node_image = current_file_services_list[0].split(
'-', 1)[1][:-2].replace('-', ':')
node_config = get_node_config(node_image=current_node_image)
potential_list = []
for val in node_config.split(';'):
val = val.replace('=', '-')
val = val.replace(':', '-')
potential_list.append(val)
current_file_services_list = [i[:-2] for i in current_file_services_list]
# compare without platform names
current_file_services_list = [
i.split('-', 1)[0] for i in current_file_services_list]
potential_list = [i.split('-', 1)[0] for i in potential_list]
potential_list.sort()
current_file_services_list.sort()
if current_file_services_list != potential_list:
build_compose_file(node_config)
return True
else:
return False
def setup_config_dir():
'''
Initializes config directory and files for ci
'''
command_path = os.path.join(ci_dirname, MACROS['CONFIG_DIR'])
if not os.path.exists(command_path):
os.mkdir(command_path)
target_path = os.path.join(command_path, MACROS['CONF_JSON_FILE'])
if not os.path.exists(target_path):
value = '{ "configure": "--prefix=/opt/pbs '
value += '--enable-ptl", "tests" : "-t SmokeTest" }'
write_to_file(target_path, value)
target_path = os.path.join(command_path, MACROS['CONFIGURE_OPT_FILE'])
if not os.path.exists(target_path):
value = "--prefix=/opt/pbs --enable-ptl"
write_to_file(target_path, value)
target_path = os.path.join(command_path, MACROS['BENCHPRESS_OPT_FILE'])
if not os.path.exists(target_path):
value = "-t SmokeTest"
write_to_file(target_path, value)
target_path = os.path.join(ci_dirname, 'docker-compose.json')
if not os.path.exists(target_path):
build_compose_file('server=' + default_platform)
run_cmd('docker-compose -f docker-compose.json down --remove-orphans')
def delete_ci():
'''
Takes backup of logs and deletes running containers.
'''
services = get_services_list()
if len(services) != 0:
build_compose_file(nodes=get_current_setup())
cmd = '/src/etc/killit.sh backup'
run_docker_cmd(cmd, run_on='server')
log_warning('Removed logs file')
log_info('backup files can be found in ' + build_log_path)
else:
log_info('No running container found, nothing to backup')
try:
os.chdir(ci_dirname)
run_cmd(
"docker-compose -f docker-compose.json down --remove-orphans")
log_info(
"done delete container and services")
except Exception as e:
log_error("Failed to destroy container and services: " + e)
def parse_params(params_list):
'''
Update given params
'''
if params_list[0] != 'called':
container_running = False
conf_opts = load_conf()
for set_opts in params_list:
key, value = (set_opts).split('=', 1)
service_count = len(get_services_list())
if service_count > 0:
container_running = True
if key.lower() == 'nodes':
if container_running:
log_warning(
"Deleting existing containers first,\
find backup in logs folder")
delete_ci()
build_compose_file(value)
elif key.lower() == 'os':
if container_running:
log_warning(
"Deleting existing containers first, \
find backup in logs folder")
delete_ci()
node_string = value.replace('"', '')
node_string = 'server=' + node_string
build_compose_file(node_string)
else:
if key in conf_opts:
conf_opts[key] = value
f = open(os.path.join(
ci_dirname, MACROS['CONFIG_DIR'],
MACROS['CONF_JSON_FILE']), 'w')
json.dump(conf_opts, f, indent=2, sort_keys=True)
f.close()
else:
log_error("Unrecognised key in parameter: '" +
key + "' , nothing updated")
sys.exit(1)
def run_ci_local(local):
'''
Run ci locally on host without spawning containers
'''
os.chdir(ci_dirname)
# using subprocess.run instead of run_cmd function
# so we dont supress stdout and stderr
if local == 'normal':
exit_code = subprocess.run("./etc/do.sh")
sys.exit(exit_code.returncode)
if local == 'sanitize':
exit_code = subprocess.run("./etc/do_sanitize_mode.sh")
sys.exit(exit_code.returncode)
def run_ci(build_pkgs=False):
'''
Run PBS configure, install PBS and run PTL tests, if build_pkgs
is set to True it will instead run package build script only
'''
# Display Current options
log_info("Running ci with the following options")
show_set_opts()
if len(get_services_list()) > 0:
build_compose_file(get_current_setup())
ret = ensure_ci_running()
if ret == 1:
log_error(
"container build failed, build logs can be found in " +
build_log_path)
sys.exit(1)
command_path = os.path.join(ci_dirname, MACROS['CONFIG_DIR'])
conf_opts = load_conf()
if build_pkgs:
build_cmd = '/src/etc/build-pbs-packages.sh'
log_info('The package build logs can be found in logs/pkglogs')
run_docker_cmd(build_cmd + ' | tee /logs/pkglogs',
run_on='server')
sys.exit(0)
if conf_opts['tests'] != '':
target_path = os.path.join(command_path, MACROS['BENCHPRESS_OPT_FILE'])
write_to_file(target_path, conf_opts['tests'])
if is_restart_required():
delete_ci()
ensure_ci_running()
target_path = os.path.join(command_path, MACROS['CONFIGURE_OPT_FILE'])
if conf_opts['configure'] != read_from_file(target_path):
write_to_file(target_path, conf_opts['configure'])
cmd = ' export ONLY_CONFIGURE=1 && /src/etc/do.sh 2>&1 \
| tee -a /logs/build-$(hostname -s) '
run_docker_cmd(cmd)
cmd = ' export ONLY_REBUILD=1 && /src/etc/do.sh 2>&1 \
| tee -a /logs/build-$(hostname -s) '
run_docker_cmd(cmd)
cmd = ' export ONLY_INSTALL=1 && /src/etc/do.sh 2>&1 \
| tee -a /logs/build-$(hostname -s) '
run_docker_cmd(cmd)
target_path = os.path.join(command_path, MACROS['BENCHPRESS_OPT_FILE'])
if conf_opts['tests'] == '':
write_to_file(target_path, conf_opts['tests'])
log_warning("No tests assigned, skipping PTL run")
else:
create_param_file()
write_to_file(target_path, conf_opts['tests'])
cmd = 'export RUN_TESTS=1 && export ONLY_TEST=1 && /src/etc/do.sh '
run_docker_cmd(cmd, run_on='server')
if __name__ == "__main__":
ci_dirname = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
ci_dirname = os.path.join(ci_dirname, 'ci')
os.chdir(ci_dirname)
read_macros()
_help = '''
Examples of using arguments.
./ci -p 'OS=centos:7'
./ci -p 'tests=-t SmokeTest'
./ci -p 'configure=CFLAGS="-g -O2" --enable-ptl'
./ci -p 'nodes=mom=centos:7;server=ubuntu:16.04'
./ci -d or ./ci --delete
./ci -b or ./ci --build
./ci -l or ./ci --local
Note: Set tests as empty if you dont want to run PTL'
'''
_help += 'Supported platforms are ' + MACROS['SUPPORTED_PLATFORMS']
ap = argparse.ArgumentParser(prog='ci',
description='Runs the ci tool for pbs',
formatter_class=argparse.RawTextHelpFormatter,
epilog=textwrap.dedent(_help),
conflict_handler='resolve')
_help = 'set configuration values for os | nodes | configure | tests'
ap.add_argument('-p', '--params', nargs='+',
action='append', help=_help, metavar='param')
_help = 'destroy pbs container'
ap.add_argument('-d', '--delete', action='store_true', help=_help)
_help = 'build packages for the current platform.'
ap.add_argument('-b', '--build-pkgs', nargs='?', const='called',
help=_help)
_help = 'Simply run the tests locally, without spawning any containers.'
_help += '\ntype can be one of normal (default) or sanitize'
ap.add_argument('-l', '--local', nargs='?', const='normal',
help=_help, metavar='type')
args = ap.parse_args()
build_pkgs = False
default_platform = MACROS['DEFAULT_PLATFORM']
build_log_path = os.path.join(ci_dirname, 'logs')
not_local_run = sys.argv.count('-l') == 0 \
and sys.argv.count('--local') == 0 \
and sys.argv.count('-l=sanitize') == 0\
and sys.argv.count('--local=sanitize') == 0 \
and sys.argv.count('-l=normal') == 0 \
and sys.argv.count('--local=normal') == 0
if not_local_run:
setup_config_dir()
check_prerequisites()
if (not args.delete) and not_local_run and (args.params is None):
ret = ensure_ci_running()
if ret == 1:
log_error(
"container build failed, build logs can be found in " +
build_log_path)
sys.exit(1)
try:
if args.params is not None:
for p in args.params:
parse_params(p)
if args.build_pkgs is not None:
build_pkgs = True
if args.delete is True:
confirm = input(
'Are you sure you want to delete containers (Y/N)?: ')
if confirm[0].lower() == 'n':
sys.exit(0)
elif confirm[0].lower() == 'y':
delete_ci()
else:
log_error("Invalid option provided")
sys.exit(0)
if args.local is not None:
run_ci_local(args.local)
except Exception as e:
ap.print_help()
log_error(e)
run_ci(build_pkgs)
================================================
FILE: ci/etc/build-pbs-packages.sh
================================================
#! /bin/bash -xe
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
. /etc/os-release
pbsdir=/pbssrc
rpm_dir=/root/rpmbuild
rm -rf /src/packages
mkdir -p /src/packages
mkdir -p ${rpm_dir}/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
if [ "x${ID}" == "xcentos" -a "x${VERSION_ID}" == "x8" ]; then
export LANG="C.utf8"
swig_opt="--with-swig=/usr/local"
if [ ! -f /tmp/swig/swig/configure ]; then
# source install swig
dnf -y install gcc-c++ byacc pcre-devel
mkdir -p /tmp/swig/
cd /tmp/swig
git clone https://github.com/swig/swig --branch rel-4.0.0 --single-branch
cd swig
./autogen.sh
./configure
make -j8
make install
cd ${PBS_DIR}
fi
fi
cp -r $pbsdir /tmp/pbs
cd /tmp/pbs
./autogen.sh
mkdir -p target
cd target
../configure --prefix=/opt/pbs --enable-ptl ${swig_opt}
make dist
cp *.tar.gz ${rpm_dir}/SOURCES
cp ../*-rpmlintrc ${rpm_dir}/SOURCES
cp *.spec ${rpm_dir}/SPECS
cflags="-g -O2 -Wall -Werror"
cxxflags="-g -O2 -Wall -Werror"
if [ "x${ID}" == "xdebian" -o "x${ID}" == "xubuntu" ]; then
CFLAGS="${cflags} -Wno-unused-result" CXXFLAGS="${cxxflags} -Wno-unused-result" rpmbuild -ba --nodeps *.spec --with ptl
else
if [ "x${ID}" == "xcentos" -a "x${VERSION_ID}" == "x8" ]; then
CFLAGS="${cflags}" CXXFLAGS="${cxxflags}" rpmbuild -ba *.spec --with ptl -D "_with_swig ${swig_opt}"
else
CFLAGS="${cflags}" CXXFLAGS="${cxxflags}" rpmbuild -ba *.spec --with ptl
fi
fi
cp ${pbsdir}/README.md /src/packages/
cp ${pbsdir}/LICENSE /src/packages/
cp ${pbsdir}/COPYRIGHT /src/packages/
mv ${rpm_dir}/RPMS/*/*pbs* /src/packages/
mv ${rpm_dir}/SRPMS/*pbs* /src/packages/
cd /src/packages
rm -rf /tmp/pbs
if [ "x${ID}" == "xdebian" -o "x${ID}" == "xubuntu" ]; then
_target_arch=$(dpkg --print-architecture)
fakeroot alien --to-deb --scripts --target=${_target_arch} *-debuginfo*.rpm -g
_dir=$(/bin/ls -1d *debuginfo* | grep -vE '(rpm|orig)')
mv ${_dir}/opt/pbs/usr/ ${_dir}/
rm -rf ${_dir}/opt
(
cd ${_dir}
dpkg-buildpackage -d -b -us -uc
)
rm -rf ${_dir} ${_dir}.orig *debuginfo*.buildinfo *debuginfo*.changes *debuginfo*.rpm
fakeroot alien --to-deb --scripts --target=${_target_arch} *.rpm
rm -f *.rpm
fi
================================================
FILE: ci/etc/ci-script-wrapper.service
================================================
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
[Unit]
Description=Run ci docker entrypoint script at startup after all systemd services are loaded
After=getty.target
[Service]
Type=forking
RemainAfterExit=yes
EnvironmentFile=/.env-file
ExecStart=/src/etc/docker-entrypoint
TimeoutStartSec=0
[Install]
WantedBy=default.target
================================================
FILE: ci/etc/configure_node.sh
================================================
#! /bin/bash -x
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
. /src/etc/macros
if [ -f /src/${CONFIG_DIR}/${REQUIREMENT_DECORATOR_FILE} ]; then
. /src/${CONFIG_DIR}/${REQUIREMENT_DECORATOR_FILE}
fi
if [ "x${NODE_TYPE}" == "xmom" ]; then
sed -i "s@PBS_SERVER=.*@PBS_SERVER=${SERVER}@" /etc/pbs.conf
sed -i "s@PBS_START_SERVER=.*@PBS_START_SERVER=0@" /etc/pbs.conf
ssh -t root@${SERVER} " /opt/pbs/bin/qmgr -c 'c n $(hostname -s)'"
if [ "x${no_comm_on_mom}" == "xTrue" ]; then
sed -i "s@PBS_START_COMM=.*@PBS_START_COMM=0@" /etc/pbs.conf
else
sed -i "s@PBS_START_COMM=.*@PBS_START_COMM=1@" /etc/pbs.conf
fi
sed -i "s@PBS_START_SCHED=.*@PBS_START_SCHED=0@" /etc/pbs.conf
fi
if [ "x${NODE_TYPE}" == "xserver" ]; then
sed -i "s@PBS_SERVER=.*@PBS_SERVER=$(hostname)@" /etc/pbs.conf
if [ "x${no_comm_on_server}" == "xTrue" ]; then
sed -i "s@PBS_START_COMM=.*@PBS_START_COMM=0@" /etc/pbs.conf
else
sed -i "s@PBS_START_COMM=.*@PBS_START_COMM=1@" /etc/pbs.conf
fi
if [ "x${no_mom_on_server}" == "xTrue" ]; then
sed -i "s@PBS_START_MOM=.*@PBS_START_MOM=0@" /etc/pbs.conf
else
sed -i "s@PBS_START_MOM=.*@PBS_START_MOM=1@" /etc/pbs.conf
fi
sed -i "s@PBS_START_SERVER=.*@PBS_START_SERVER=1@" /etc/pbs.conf
sed -i "s@PBS_START_SCHED=.*@PBS_START_SCHED=1@" /etc/pbs.conf
fi
if [ "x${NODE_TYPE}" == "xcomm" ]; then
sed -i "s@PBS_START_COMM=.*@PBS_START_COMM=1@" /etc/pbs.conf
sed -i "s@PBS_SERVER=.*@PBS_SERVER=${SERVER}@" /etc/pbs.conf
sed -i "s@PBS_START_MOM=.*@PBS_START_MOM=0@" /etc/pbs.conf
sed -i "s@PBS_START_SERVER=.*@PBS_START_SERVER=0@" /etc/pbs.conf
sed -i "s@PBS_START_SCHED=.*@PBS_START_SCHED=0@" /etc/pbs.conf
fi
================================================
FILE: ci/etc/container-env-setup.sh
================================================
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
export container=docker
export TERM=xterm
if [ -e /etc/debian_version ]; then
export DEBIAN_FRONTEND=noninteractive
fi
export LOGNAME=${LOGNAME:-"$(id -un)"}
export USER=${USER:-"$(id -un)"}
export TZ=UTC
export PBS_TZID=UTC
export PATH="$(printf "%s" "/usr/local/bin:/usr/local/sbin:${PATH}" | awk -v RS=: -v ORS=: '!($0 in a) {a[$0]; print}')"
export DOMAIN=$(hostname -d)
export PERL5LIB=${HOME}/AUTO/lib/perl5/site_perl
export PERL5LIB=${PERL5LIB}:${HOME}/AUTO/lib/site_perl
export PERL5LIB=${PERL5LIB}:${HOME}/AUTO/share/perl5
export PERL5LIB=${PERL5LIB}:${HOME}/AUTO/share/perl
export PBS_TEST_DEBUG=1
export PBS_TEST_VERBOSE=1
export PBS_PRINT_STACK_TRACE=1
export MAIL="${MAIL:-"/var/mail/$(id -un)"}"
================================================
FILE: ci/etc/container-init
================================================
#!/bin/bash -x
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
/workspace/etc/install-system-packages 2>&1 | tee -a /logs/build-$(hostname -s)
# set environment var file
touch /.env-file
set >/.env-file
capsh --print | grep -Eq '*cap_sys_admin*'
if [ $? -eq 0 ]; then
if [ -x "/usr/lib/systemd/systemd" ]; then
exec /usr/lib/systemd/systemd --system
elif [ -x "/lib/systemd/systemd" ]; then
exec /lib/systemd/systemd --system
elif [ -x "/usr/sbin/init" ]; then
exec /usr/sbin/init
elif [ -x "/sbin/init" ]; then
exec /sbin/init
else
echo "Couldn't start container in systemd mode, starting in default mode"
fi
fi
================================================
FILE: ci/etc/do.sh
================================================
#!/bin/bash -xe
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
if [ $(id -u) -ne 0 ]; then
echo "This script must be run by root user"
exit 1
fi
if [ -f /src/ci ]; then
IS_CI_BUILD=1
FIRST_TIME_BUILD=$1
. /src/etc/macros
config_dir=/src/${CONFIG_DIR}
chmod -R 755 ${config_dir}
logdir=/logs
chmod -R 755 ${logdir}
PBS_DIR=/pbssrc
else
PBS_DIR=$(readlink -f $0 | awk -F'/ci/' '{print $1}')
fi
cd ${PBS_DIR}
. /etc/os-release
# Extract major version number
MAJOR_VERSION="${VERSION_ID%%.*}"
SPEC_FILE=$(/bin/ls -1 ${PBS_DIR}/*.spec)
REQ_FILE=${PBS_DIR}/test/fw/requirements.txt
if [ ! -r ${SPEC_FILE} -o ! -r ${REQ_FILE} ]; then
echo "Couldn't find pbs spec file or ptl requirements file"
exit 1
fi
if [ "x${IS_CI_BUILD}" != "x1" ] || [ "x${FIRST_TIME_BUILD}" == "x1" -a "x${IS_CI_BUILD}" == "x1" ]; then
if [ "x${ID}" == "xcentos" -a "x${VERSION_ID}" == "x7" ]; then
yum clean all
yum -y install yum-utils epel-release rpmdevtools
yum -y install python3-pip sudo which net-tools man-db time.x86_64 \
expat libedit postgresql-server postgresql-contrib python3 \
sendmail sudo tcl tk libical libasan llvm git
rpmdev-setuptree
yum-builddep -y ${SPEC_FILE}
yum -y install $(rpmspec --requires -q ${SPEC_FILE} | awk '{print $1}' | sort -u | grep -vE '^(/bin/)?(ba)?sh$')
pip3 install --trusted-host pypi.org --trusted-host files.pythonhosted.org -r ${REQ_FILE}
if [ "x${BUILD_MODE}" == "xkerberos" ]; then
yum -y install krb5-libs krb5-devel libcom_err libcom_err-devel
fi
yum -y install cmake3
rm -rf cJSON
git clone https://github.com/DaveGamble/cJSON.git
cd cJSON; mkdir build; cd build; cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr; make; make install; cd ../../
elif [ "x${ID}" == "xcentos" -a "x${VERSION_ID}" == "x8" ]; then
export LANG="C.utf8"
sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*
dnf -y clean all
dnf -y install 'dnf-command(config-manager)'
dnf -y config-manager --set-enabled powertools
dnf -y install epel-release
dnf -y install python3-pip sudo which net-tools man-db time.x86_64 \
expat libedit postgresql-server postgresql-contrib python3 \
sendmail sudo tcl tk libical libasan llvm git
dnf -y builddep ${SPEC_FILE}
dnf -y install $(rpmspec --requires -q ${SPEC_FILE} | awk '{print $1}' | sort -u | grep -vE '^(/bin/)?(ba)?sh$')
pip3 install --trusted-host pypi.org --trusted-host files.pythonhosted.org -r ${REQ_FILE}
if [ "x${BUILD_MODE}" == "xkerberos" ]; then
dnf -y install krb5-libs krb5-devel libcom_err libcom_err-devel
fi
elif [ "x${ID}" == "xrocky" -a "x${MAJOR_VERSION}" == "x9" ]; then
export LANG="C.utf8"
dnf -y clean all
yum -y install yum-utils
dnf -y install 'dnf-command(config-manager)'
dnf config-manager --set-enabled crb
dnf -y install epel-release
dnf -y install python3-pip sudo which net-tools man-db time.x86_64 procps \
expat libedit postgresql-server postgresql-contrib python3 \
sendmail sudo tcl tk libical libasan llvm git chkconfig
dnf -y builddep ${SPEC_FILE}
dnf -y install $(rpmspec --requires -q ${SPEC_FILE} | awk '{print $1}' | sort -u | grep -vE '^(/bin/)?(ba)?sh$')
pip3 install --trusted-host pypi.org --trusted-host files.pythonhosted.org -r ${REQ_FILE}
if [ "x${BUILD_MODE}" == "xkerberos" ]; then
dnf -y install krb5-libs krb5-devel libcom_err libcom_err-devel
fi
elif [ "x${ID}" == "xopensuse" -o "x${ID}" == "xopensuse-leap" ]; then
zypper -n ref
zypper -n install rpmdevtools python3-pip sudo which net-tools man time.x86_64 git
rpmdev-setuptree
zypper -n install --force-resolution $(rpmspec --buildrequires -q ${SPEC_FILE} | sort -u | grep -vE '^(/bin/)?(ba)?sh$')
zypper -n install --force-resolution $(rpmspec --requires -q ${SPEC_FILE} | sort -u | grep -vE '^(/bin/)?(ba)?sh$')
pip3 install --trusted-host pypi.org --trusted-host files.pythonhosted.org -r ${REQ_FILE}
elif [ "x${ID}" == "xdebian" ]; then
if [ "x${DEBIAN_FRONTEND}" == "x" ]; then
export DEBIAN_FRONTEND=noninteractive
fi
apt-get -y update
apt-get install -y build-essential dpkg-dev autoconf libtool rpm alien libssl-dev \
libxt-dev libpq-dev libexpat1-dev libedit-dev libncurses5-dev \
libical-dev libhwloc-dev pkg-config tcl-dev tk-dev python3-dev \
swig expat postgresql postgresql-contrib python3-pip sudo \
man-db git elfutils libcjson-dev
pip3 install --trusted-host pypi.org --trusted-host files.pythonhosted.org -r ${REQ_FILE}
elif [ "x${ID}" == "xubuntu" ]; then
if [ "x${DEBIAN_FRONTEND}" == "x" ]; then
export DEBIAN_FRONTEND=noninteractive
fi
apt-get -y update
apt-get install -y build-essential dpkg-dev autoconf libtool rpm alien libssl-dev \
libxt-dev libpq-dev libexpat1-dev libedit-dev libncurses5-dev \
libical-dev libhwloc-dev pkg-config tcl-dev tk-dev python3-dev \
swig expat postgresql python3-pip sudo man-db git elfutils libcjson-dev
if [[ $(printf '%s\n' "24.04" "$VERSION_ID" | sort -V | head -n1) == "24.04" ]]; then
apt-get -y install python3-nose python3-bs4 python3-defusedxml python3-pexpect
else
pip3 install --trusted-host pypi.org --trusted-host files.pythonhosted.org -r ${REQ_FILE}
fi
else
echo "Unknown platform..."
exit 1
fi
fi
if [ "x${FIRST_TIME_BUILD}" == "x1" -a "x${IS_CI_BUILD}" == "x1" ]; then
echo "### First time build is complete ###"
echo "READY:$(hostname -s)" >>${config_dir}/${STATUS_FILE}
exit 0
fi
if [ "x${ID}" == "xcentos" -a "x${VERSION_ID}" == "x8" ]; then
export LANG="C.utf8"
swig_opt="--with-swig=/usr/local"
if [ ! -f /tmp/swig/swig/configure ]; then
# source install swig
dnf -y install gcc-c++ byacc pcre-devel
mkdir -p /tmp/swig/
cd /tmp/swig
git clone https://github.com/swig/swig --branch rel-4.0.0 --single-branch
cd swig
./autogen.sh
./configure
make -j8
make install
cd ${PBS_DIR}
fi
fi
if [ "x${ONLY_INSTALL_DEPS}" == "x1" ]; then
exit 0
fi
_targetdirname=target-${ID}-$(hostname -s)
if [ "x${ONLY_INSTALL}" != "x1" -a "x${ONLY_REBUILD}" != "x1" -a "x${ONLY_TEST}" != "x1" ]; then
rm -rf ${_targetdirname}
fi
mkdir -p ${_targetdirname}
[[ -f Makefile ]] && make distclean || true
if [ ! -f ./${SPEC_FILE} ]; then
git config --global --add safe.directory ${PBS_DIR}
git checkout ${SPEC_FILE}
fi
if [ ! -f ./configure ]; then
./autogen.sh
fi
if [ "x${ONLY_REBUILD}" != "x1" -a "x${ONLY_INSTALL}" != "x1" -a "x${ONLY_TEST}" != "x1" ]; then
_cflags="-g -O2 -Wall -Werror"
if [ "x${ID}" == "xubuntu" ]; then
_cflags="${_cflags} -Wno-unused-result"
fi
cd ${_targetdirname}
if [ -f /src/ci ]; then
if [ -f ${config_dir}/${CONFIGURE_OPT_FILE} ]; then
PYTHON_CODE=$(cat < 1:
if re.search(r"CFLAGS=(\"|\').*(\"|\')",x) != None:
print(re.search(r"CFLAGS=(\"|\').*(\"|\')",x).group(0).split('\'')[1])
else:
if re.search(r"CFLAGS=(\"|\').*(\"|\')",x) != None:
print(re.search(r"CFLAGS=(\"|\').*(\"|\')",x).group(0).split('"')[1])
END
)
_cflags="$(python3 -c "$PYTHON_CODE")"
PYTHON_CODE=$(cat < 1:
if re.search(r"CFLAGS=(\"|\').*(\"|\')",x) != None:
print(re.search(r"CFLAGS=(\"|\').*(\"|\')",x).group(0).split('\'')[1])
else:
if re.search(r"CFLAGS=(\"|\').*(\"|\')",x) != None:
print(re.search(r"CFLAGS=(\"|\').*(\"|\')",x).group(0).split('"')[1])
END
)
_cflags="$(python3 -c "$PYTHON_CODE")"
PYTHON_CODE=$(cat < 1:
if re.search(r"CFLAGS=(\"|\').*(\"|\')",x) != None:
print(re.search(r"CFLAGS=(\"|\').*(\"|\')",x).group(0).split('\'')[1])
else:
if re.search(r"CFLAGS=(\"|\').*(\"|\')",x) != None:
print(re.search(r"CFLAGS=(\"|\').*(\"|\')",x).group(0).split('"')[1])
END
)
_cflags="$(python3 -c "$PYTHON_CODE")"
PYTHON_CODE=$(cat <.
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
PBS_DIR=$(readlink -f $0 | awk -F'/ci/' '{print $1}')
cd ${PBS_DIR}
[ -f /sys/fs/selinux/enforce ] && echo 0 > /sys/fs/selinux/enforce
yum clean all
yum -y update
yum -y install yum-utils epel-release rpmdevtools libasan llvm
dnf config-manager --set-enabled crb
rpmdev-setuptree
yum -y install python3-pip sudo which net-tools man-db time.x86_64 procps
yum-builddep -y ./*.spec
yum -y install cmake3 git
rm -rf cJSON
git clone https://github.com/DaveGamble/cJSON.git
cd cJSON; mkdir build; cd build; cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr; make; make install; cd ../../
./autogen.sh
rm -rf target-sanitize
mkdir -p target-sanitize
cd target-sanitize
../configure
make dist
cp -fv *.tar.gz /root/rpmbuild/SOURCES/
CFLAGS="-g -O2 -Wall -Werror -fsanitize=address -fno-omit-frame-pointer" CXXFLAGS="-g -O2 -Wall -Werror -fsanitize=address -fno-omit-frame-pointer" rpmbuild -bb --with ptl *.spec
yum -y install /root/rpmbuild/RPMS/x86_64/*-server-??.*.x86_64.rpm
yum -y install /root/rpmbuild/RPMS/x86_64/*-debuginfo-??.*.x86_64.rpm
yum -y install /root/rpmbuild/RPMS/x86_64/*-ptl-??.*.x86_64.rpm
sed -i "s@PBS_START_MOM=0@PBS_START_MOM=1@" /etc/pbs.conf
/etc/init.d/pbs start
set +e
. /etc/profile.d/ptl.sh
set -e
pbs_config --make-ug
cd /opt/ptl/tests/
# Ignore address sanitizer link order because of
# importing pbs python modules (like pbs and pbs_ifl) in ptl.
# The problem is that original Python bin is not compiled with ASAN.
# This will not affect pbs service as it has its own env.
export ASAN_OPTIONS=verify_asan_link_order=0
pbs_benchpress --tags=smoke
================================================
FILE: ci/etc/docker-entrypoint
================================================
#!/bin/bash -ex
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
workdir=/src/etc
logdir=/logs
cd /pbssrc
${workdir}/do.sh 1 2>&1 | tee -a ${logdir}/build-$(hostname -s)
if [ $? -ne 0 ]; then
exit 1
else
exit 0
fi
================================================
FILE: ci/etc/gen_ptl_json.sh
================================================
#!/bin/bash -x
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
cleanup() {
cd ${etcdir}
rm -rf ./tmpptl
}
etcdir=$(dirname $(readlink -f "$0"))
cidir=/pbssrc/ci
cd ${etcdir}
mkdir tmpptl
workdir=${etcdir}/tmpptl
cd ${workdir}
mkdir -p ptlsrc
/bin/cp -rf ${cidir}/../test/* ptlsrc/
if [ -f ptlsrc/fw/setup.py.in ]; then
sed "s;@PBS_VERSION@;1.0.0;g" ptlsrc/fw/setup.py.in >ptlsrc/fw/setup.py
sed "s;@PBS_VERSION@;1.0.0;g" ptlsrc/fw/ptl/__init__.py.in >ptlsrc/fw/ptl/__init__.py
fi
cd ${workdir}/ptlsrc
mkdir ../tp
__python="$(grep -rE '^#!/usr/bin/(python|env python)[23]' fw/bin/pbs_benchpress | awk -F[/" "] '{print $NF}')"
${__python} -m pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org --prefix $(pwd)/tp -r fw/requirements.txt fw/.
cd tests
PYTHONPATH=../tp/lib/$(/bin/ls -1 ../tp/lib)/site-packages ${__python} ../tp/bin/pbs_benchpress $1 --gen-ts-tree
ret=$?
if [ ${ret} -ne 0 ]; then
echo "Failed to generate ptl json"
cleanup
exit $ret
else
mv ptl_ts_tree.json ${cidir}
fi
cleanup
================================================
FILE: ci/etc/id_rsa
================================================
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEAt6kNw0C2ZMybkld0sucLkpaMuwn6SXB6+9scN3ZMTSFRSMxa85MT
ee8sOsiyrkIjv85nAWdYsGjLBKgr43IlV2qBCxZO2YsTryl52E6pVBbVuizBj8m6sO+3hM
hUBEbIrqvplrxf19y2HlNsygSlNFfMb3ptIIvTGGez+o8ZTAI3wXcFqxNxi8flo77yp6UH
x31zIDOJCfN98W1GYXVwXiowfkoKkROvbH9B/HsLTjuxkHzFCGwGNzEClr3ayJSmYyJu0P
nfjBPeZrL7Dxt1RwSfqI8j1kp4VhLCeEyFYS5pi8CypLgtvL37gLdqEGpBjcf4J/AyjDZJ
cDgzTI+ZrTP/ldhnVMy84B8TAC53swauaec1JKDtc+FNSN28GY/0VTcyH7Pwt9gRESWFsV
zrN4lwRWZivwndi3mj3zUcge3LQ6pBpjTEGiYIgNNJd5mjDZM9ieB4lC7+MTmq9Yg0Dzm4
u6uanAP5t2up6F5jck/7sLiAX4+fQ8vLZOAqsZdhAAAFgPS9UiD0vVIgAAAAB3NzaC1yc2
EAAAGBALepDcNAtmTMm5JXdLLnC5KWjLsJ+klwevvbHDd2TE0hUUjMWvOTE3nvLDrIsq5C
I7/OZwFnWLBoywSoK+NyJVdqgQsWTtmLE68pedhOqVQW1boswY/JurDvt4TIVARGyK6r6Z
a8X9fcth5TbMoEpTRXzG96bSCL0xhns/qPGUwCN8F3BasTcYvH5aO+8qelB8d9cyAziQnz
ffFtRmF1cF4qMH5KCpETr2x/Qfx7C047sZB8xQhsBjcxApa92siUpmMibtD534wT3may+w
8bdUcEn6iPI9ZKeFYSwnhMhWEuaYvAsqS4Lby9+4C3ahBqQY3H+CfwMow2SXA4M0yPma0z
/5XYZ1TMvOAfEwAud7MGrmnnNSSg7XPhTUjdvBmP9FU3Mh+z8LfYERElhbFc6zeJcEVmYr
8J3Yt5o981HIHty0OqQaY0xBomCIDTSXeZow2TPYngeJQu/jE5qvWINA85uLurmpwD+bdr
qeheY3JP+7C4gF+Pn0PLy2TgKrGXYQAAAAMBAAEAAAGAJVEQHtATPz/jjESAzajsTQiR55
8LX8ie9HV8sjgzIKjYXzZGdJ85odja38bPp2CA6wQBIePhvVZNidCxujEDLVPSjHIn60O6
6ChBPZYeCZvqKT3WxmRyrmjGnRAnIgdP103O1HXJ845A4sCIpjNzbcM5Ip15dtdyOM85Xn
uc5Di/I2wPlscIlyIyoqa1nyKFBh+TOMO/4Gm8+UT+u+akwj1IRSC+LOQXDLB+s9I8ZdTz
KyxuzFtGmAg5Qm+o+IBbRbvTzpdx2UHkiFw8+VQn8fwHuzfR+Od48D1kFBCk5yGcAMTQP3
g4AV8vp/UAVU3f4stYWh7okxXE7dKY+YTb1qHbjadNp9KqJUY3d+LO2F2vT7QBD4eIDS22
1emtqfaiLXXWDG1vZHXq3wx5MlvnwFE4gSY9yxF0FsSwi3s0j8zEYjszKQBiAoPLkxmqDq
2/WcmT9GhKd5FsMQEy0W8lBePtRYw85BRfhZH7Lzh0gGZ+3ZYss4qQS2vAzqWWiuhRAAAA
wHsVos2ccAcgMeTVYmo3JNgahAF0orP+NPxFLgZrK7Z0nwjICpKfaR6D3lWiFvlhUH33iv
wr3gCAFTNL7zblbJXTebA5dvw8kFmUuXhe7/uRGNjn2l38j0t+aHMXDVafo7Dm1chh6pa8
AyP5/OR9sVXsFVrkQ3+iVQHJBpsXDYlI7q5j51CrNb7wgr8l8HhWyDLDTg0irmzfrvPJ43
H7URIgDIDuX7mbSnYoDDtP2azdpaZyG1IZlbFkCNyaQtjycwAAAMEA8fq3kVuTqntNXqTE
3H7CnKSwR8w7yE/VGaVs7jLRvPyHpC3umUiKWjO/ebLMKBKdS3fQ0I72MB2BdeQbmuYTBY
2FwRQOAopjketAZDrZWhjmzRgSsSRofl3N/cqya6L+0RcAfwR/2OGM9E1QzEIyPcH8khVo
BK2I+xRpU5s1b5SXw5TOge9PXWgEWvRRtFRgbgOJ5WfPiLabKMm9skVx8BiNFzsVJxsEnb
WdwJKwnT+2a7gIOnM+DvFQiLyEr8QTAAAAwQDCTUpPyB8cqP0cCOFFH46im7ryV3ROZLlj
hj5dVKpXPyA5iHEQbPTx+VXOLSM1MysNRFPWlisE2OCES897kPgD5cypatnC1aa+sztOeD
fuuEN4wZXjDo97DhIaO6YtfzhXI5Y/CEOKWQmrWlEQEf4HEGoK2kQka5KeOPKQTACLcLqi
ATLFxSEDr6wyEwHA0EGh7WjH1zEpFDDY9pUCAwmyETD/OriqfCbRPhGrTTQVrcadG/Sc72
V5hjFzgl3J3TsAAAALcm9vdEBwYnMuY2k=
-----END OPENSSH PRIVATE KEY-----
================================================
FILE: ci/etc/id_rsa.pub
================================================
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC3qQ3DQLZkzJuSV3Sy5wuSloy7CfpJcHr72xw3dkxNIVFIzFrzkxN57yw6yLKuQiO/zmcBZ1iwaMsEqCvjciVXaoELFk7ZixOvKXnYTqlUFtW6LMGPybqw77eEyFQERsiuq+mWvF/X3LYeU2zKBKU0V8xvem0gi9MYZ7P6jxlMAjfBdwWrE3GLx+WjvvKnpQfHfXMgM4kJ833xbUZhdXBeKjB+SgqRE69sf0H8ewtOO7GQfMUIbAY3MQKWvdrIlKZjIm7Q+d+ME95msvsPG3VHBJ+ojyPWSnhWEsJ4TIVhLmmLwLKkuC28vfuAt2oQakGNx/gn8DKMNklwODNMj5mtM/+V2GdUzLzgHxMALnezBq5p5zUkoO1z4U1I3bwZj/RVNzIfs/C32BERJYWxXOs3iXBFZmK/Cd2LeaPfNRyB7ctDqkGmNMQaJgiA00l3maMNkz2J4HiULv4xOar1iDQPObi7q5qcA/m3a6noXmNyT/uwuIBfj59Dy8tk4Cqxl2E= root@pbs.ci
================================================
FILE: ci/etc/install-system-packages
================================================
#!/bin/bash -x
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
groupadd -g 1900 tstgrp00
groupadd -g 1901 tstgrp01
groupadd -g 1902 tstgrp02
groupadd -g 1903 tstgrp03
groupadd -g 1904 tstgrp04
groupadd -g 1905 tstgrp05
groupadd -g 1906 tstgrp06
groupadd -g 1907 tstgrp07
groupadd -g 901 pbs
groupadd -g 1146 agt
useradd -m -s /bin/bash -u 4357 -g tstgrp00 -G tstgrp00 pbsadmin
useradd -m -s /bin/bash -u 9000 -g tstgrp00 -G tstgrp00 pbsbuild
useradd -m -s /bin/bash -u 884 -g tstgrp00 -G tstgrp00 pbsdata
useradd -m -s /bin/bash -u 4367 -g tstgrp00 -G tstgrp00 pbsmgr
useradd -m -s /bin/bash -u 4373 -g tstgrp00 -G tstgrp00 pbsnonroot
useradd -m -s /bin/bash -u 4356 -g tstgrp00 -G tstgrp00 pbsoper
useradd -m -s /bin/bash -u 4358 -g tstgrp00 -G tstgrp00 pbsother
useradd -m -s /bin/bash -u 4371 -g tstgrp00 -G tstgrp00 pbsroot
useradd -m -s /bin/bash -u 4355 -g tstgrp00 -G tstgrp02,tstgrp00 pbstest
useradd -m -s /bin/bash -u 4359 -g tstgrp00 -G tstgrp00 pbsuser
useradd -m -s /bin/bash -u 4361 -g tstgrp00 -G tstgrp01,tstgrp02,tstgrp00 pbsuser1
useradd -m -s /bin/bash -u 4362 -g tstgrp00 -G tstgrp01,tstgrp03,tstgrp00 pbsuser2
useradd -m -s /bin/bash -u 4363 -g tstgrp00 -G tstgrp01,tstgrp04,tstgrp00 pbsuser3
useradd -m -s /bin/bash -u 4364 -g tstgrp01 -G tstgrp04,tstgrp05,tstgrp01 pbsuser4
useradd -m -s /bin/bash -u 4365 -g tstgrp02 -G tstgrp04,tstgrp06,tstgrp02 pbsuser5
useradd -m -s /bin/bash -u 4366 -g tstgrp03 -G tstgrp04,tstgrp07,tstgrp03 pbsuser6
useradd -m -s /bin/bash -u 4368 -g tstgrp01 -G tstgrp01 pbsuser7
useradd -m -s /bin/bash -u 11000 -g tstgrp00 -G tstgrp00 tstusr00
useradd -m -s /bin/bash -u 11001 -g tstgrp00 -G tstgrp00 tstusr01
chmod g+x,o+x /home/*
. /etc/os-release
if [ "x${ID}" == "xcentos" -a "x${VERSION_ID}" == "x8" ]; then
sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*
dnf -y clean all
dnf -y install 'dnf-command(config-manager)'
dnf -y config-manager --set-enabled powertools
dnf -y install epel-release
dnf -y update
dnf -y install git gcc make m4 autoconf automake libtool rpm-build rpmdevtools \
hwloc-devel libX11-devel libXt-devel libXext-devel libXft-devel \
libedit-devel libical-devel cmake glibc-common yum-utils \
ncurses-devel postgresql-devel python3-devel tcl-devel tk-devel swig \
expat-devel openssl-devel libXext libXft expat libedit glibc-static \
postgresql-server python3 tcl tk libical perl tar sendmail sudo perl-Env \
perl-Switch gcc-c++ doxygen elfutils bison flex glibc-langpack-en \
which net-tools man-db time csh lsof tzdata file \
expect perl-App-cpanminus cpan initscripts \
systemd systemd-sysv libcap rsyslog \
openssh-clients openssh-server valgrind-devel valgrind libasan \
llvm bc gzip gdb rsync wget curl ccache bind-utils vim iputils pam-devel
dnf -y clean all
rpmdev-setuptree
__systemd_paths='/etc/systemd/system /usr/lib/systemd/system'
elif [ "x${ID}" == "xcentos" -a "x${VERSION_ID}" == "x7" ]; then
yum -y clean all
rpm --import https://package.perforce.com/perforce.pubkey &&
{
echo [perforce]
echo name=Perforce
echo baseurl=http://package.perforce.com/yum/rhel/7/x86_64
echo enabled=1
echo gpgcheck=1
} >/etc/yum.repos.d/perforce.repo
yum -y install epel-release
yum -y update
yum -y install git gcc make m4 autoconf automake libtool rpm-build rpmdevtools \
hwloc-devel libX11-devel libXt-devel libXext-devel libXft-devel \
libedit-devel libical-devel cmake glibc-common yum-utils \
ncurses-devel postgresql-devel python3-devel tcl-devel tk-devel swig \
expat-devel openssl-devel libXext libXft expat libedit glibc-static \
postgresql-server python3 tcl tk libical perl tar sendmail sudo perl-Env \
perl-Switch gcc-c++ doxygen elfutils bison flex postgresql-contrib \
which net-tools man-db time csh lsof tzdata file glibc-langpack-en \
expect perl-App-cpanminus cpan \
systemd systemd-sysv libcap rsyslog \
openssh-clients openssh-server valgrind-devel valgrind libasan pam-devel \
llvm bc gzip gdb rsync wget curl ccache bind-utils vim iputils python2-pip helix-cli
yum -y clean all
rpmdev-setuptree
__systemd_paths='/etc/systemd/system /usr/lib/systemd/system'
elif [ "x${ID}" == "xopensuse" -o "x${ID}" == "xopensuse-leap" ]; then
__on="$(grep -oP '(?<=^NAME=").*(?=")' /etc/os-release)"
__ov="$(grep -oP '(?<=^VERSION=").*(?=")' /etc/os-release)"
zypper -n addrepo -ceKfG "https://download.opensuse.org/repositories/devel:tools/${__on// /_}_${__ov// /_}/devel:tools.repo"
zypper -n addrepo -ceKfG "https://download.opensuse.org/repositories/devel:languages:perl/${__on// /_}_${__ov// /_}/devel:languages:perl.repo"
zypper -n addrepo -ceKfG "http://package.perforce.com/yum/rhel/7/x86_64" p4
zypper -n clean -mMa
zypper -n refresh -fbd
zypper --no-gpg-checks -n update --force-resolution
zypper --no-gpg-checks -n install --force-resolution git m4 \
gcc make autoconf automake libtool rpm-build rpmdevtools helix-cli hwloc-devel \
libX11-devel libXt-devel libedit-devel libical-devel cmake ncurses-devel \
postgresql-devel python3-devel tcl-devel tk-devel swig libexpat-devel \
libopenssl-devel libXext-devel libXft-devel expat libedit fontconfig net-tools-deprecated net-tools \
timezone python3-xml glibc-devel-static postgresql-server python3 python3-pip tcl tk \
perl tar sendmail sudo gcc-c++ doxygen elfutils bison flex \
which net-tools net-tools-deprecated man time tcsh lsof file vim \
expect perl-App-cpanminus perl-Parse-PMFile hostname bind-utils \
systemd systemd-sysvinit libcap-progs iputils rsyslog openssh pam-devel \
valgrind-devel valgrind llvm gdb rsync wget ccache bc gzip python-pip
zypper -n clean -mMa
zypper -n rr devel_tools
rpmdev-setuptree
__systemd_paths='/etc/systemd/system /usr/lib/systemd/system'
elif [ "x${ID}" == "xubuntu" ]; then
if [ "x${DEBIAN_FRONTEND}" == "x" ]; then
export DEBIAN_FRONTEND=noninteractive
fi
apt -y update
apt -y upgrade
apt -y install git build-essential gcc g++ make dpkg-dev m4 \
autoconf automake libtool rpm alien elfutils dh-make \
libhwloc-dev libx11-dev libxt-dev libedit-dev libical-dev cmake \
libncurses-dev libpq-dev python3-dev tcl-dev tk-dev swig libexpat1-dev \
libssl-dev libxext-dev libxft-dev pkg-config expat postgresql perl tar \
sendmail sendmail-bin sudo doxygen bison flex fakeroot libnuma1 \
net-tools man time csh lsof curl gzip iputils-ping \
expect cpanminus locales-all dnsutils tzdata vim bc file \
systemd systemd-sysv sysvinit-utils libcap2-bin rsyslog libpam-dev \
openssh-server openssh-client valgrind llvm gdb rsync wget ccache \
python3 python3-pip cpanminus
if [ "x${ID}" == "xubuntu" -a "x${VERSION_ID}" == "x16.04" ]; then
wget -qO - https://package.perforce.com/perforce.pubkey | apt-key add - &&
echo 'deb http://package.perforce.com/apt/ubuntu/ xenial release' >/etc/apt/sources.list.d/perforce.list
else
wget -qO - https://package.perforce.com/perforce.pubkey | apt-key add - &&
echo 'deb http://package.perforce.com/apt/ubuntu/ bionic release' >/etc/apt/sources.list.d/perforce.list
fi
apt -y update
apt -y install helix-cli
__systemd_paths='/etc/systemd/system /lib/systemd/system'
apt -y autoremove
apt -y clean
rm -rf /var/lib/apt/list/*
mkdir -p /root/rpmbuild/SOURCES
fi
# Install pip, requests and sh python modules
set -ex &&
python -m pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org requests sh &&
rm -rf ~/.cache /tmp/*
# QALib deps modules
cpanm -n --no-wget --no-lwp --curl \
IO::Pty IPC::Run IPC::Cmd Class::Accessor Module::Build Pod::Usage \
Getopt::Long DateTime Date::Parse Proc::ProcessTable Test::More \
Unix::Process Time::HiRes File::FcntlLock File::Remote
find ${__systemd_paths} -path '*.wants/*' \
-not -name '*journald*' \
-not -name '*systemd-tmpfiles*' \
-not -name '*systemd-user-sessions*' \
-not -name '*getty*' \
-not -name '*dbus*' \
-exec rm -fv {} \;
cp /workspace/etc/ci-script-wrapper.service /etc/systemd/system
systemctl set-default multi-user.target
systemctl enable sshd || systemctl enable ssh
systemctl enable sendmail
if [ "x${ID}" != "xubuntu" -a "x${VERSION_ID}" != "x16.04" ]; then
systemctl disable sm-client
systemctl mask sm-client
fi
systemctl enable rsyslog
systemctl disable getty@.service
systemctl unmask getty.target
systemctl unmask console-getty
systemctl enable getty.target
systemctl enable console-getty
systemctl enable ci-script-wrapper
cp /workspace/etc/container-env-setup.sh /etc/profile.d/0container-env-setup.sh
cp /workspace/etc/sudoers-overrides /etc/sudoers.d/container-overrides
echo '' >/etc/security/limits.conf
rm -f /etc/security/limits.d/*.conf
rm -rf ~/.ssh
mkdir --mode=700 ~/.ssh
cp /workspace/etc/id_rsa* ~/.ssh/
chmod 0600 ~/.ssh/id_rsa
chmod 0644 ~/.ssh/id_rsa.pub
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
echo 'root:pbs' | chpasswd
cat /etc/profile.d/0container-env-setup.sh >>/root/.profile
cat /etc/profile.d/0container-env-setup.sh >>/root/.bash_profile
cat /etc/profile.d/0container-env-setup.sh >>/root/.bashrc
for user in $(awk -F: '/^(pbs|tst)/ {print $1}' /etc/passwd); do
rm -rf /home/${user}/.ssh
cp -rfp ~/.ssh /home/${user}/
chown -R ${user}: /home/${user}/.ssh
echo "${user}:pbs" | chpasswd
cat /etc/profile.d/0container-env-setup.sh >>/home/${user}/.profile
cat /etc/profile.d/0container-env-setup.sh >>/home/${user}/.bash_profile
cat /etc/profile.d/0container-env-setup.sh >>/home/${user}/.bashrc
chown ${user}: /home/${user}/.bashrc /home/${user}/.profile /home/${user}/.bash_profile
done
echo 'Host *' >>/etc/ssh/ssh_config
echo ' StrictHostKeyChecking no' >>/etc/ssh/ssh_config
echo ' ConnectionAttempts 3' >>/etc/ssh/ssh_config
echo ' IdentityFile ~/.ssh/id_rsa' >>/etc/ssh/ssh_config
echo ' PreferredAuthentications publickey,password' >>/etc/ssh/ssh_config
echo 'PermitRootLogin yes' >>/etc/ssh/sshd_config
echo 'UseDNS no' >>/etc/ssh/sshd_config
sed -i 's/AcceptEnv/# AcceptEnv/g' /etc/ssh/sshd_config
ssh-keygen -A
rm -f /var/run/*.pid /run/nologin
rm -rf ~/.cache ~/.cpanm /var/{log,cache} /tmp /var/tmp /run/*.pid /var/run/*.pid
mkdir -p --mode=0755 /var/{log,cache}
mkdir -p --mode=1777 /tmp /var/tmp
================================================
FILE: ci/etc/killit.sh
================================================
#!/bin/bash -x
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
killit() {
if [ -z "$1" ]; then
return 0
fi
pid=$(ps -ef 2>/dev/null | grep $1 | grep -v grep | awk '{print $2}')
if [ ! -z "${pid}" ]; then
echo "kill -TERM ${pid}"
kill -TERM ${pid} 2>/dev/null
else
return 0
fi
sleep 10
pid=$(ps -ef 2>/dev/null | grep $1 | grep -v grep | awk '{print $2}')
if [ ! -z "${pid}" ]; then
echo "kill -KILL ${pid}"
kill -KILL ${pid} 2>/dev/null
fi
}
kill_pbs_process() {
ps -eaf 2>/dev/null | grep pbs_ | grep -v grep | wc -l
if [ $ret -gt 0 ]; then
killit pbs_server
killit pbs_mom
killit pbs_comm
killit pbs_sched
killit pbs_ds_monitor
killit /opt/pbs/pgsql/bin/postgres
killit pbs_benchpress
ps_count=$(ps -eaf 2>/dev/null | grep pbs_ | grep -v grep | wc -l)
if [ ${ps_count} -eq 0 ]; then
return 0
else
return 1
fi
fi
}
. /etc/os-release
if [ "x$1" == "xbackup" ]; then
time_stamp=$(date -u "+%Y-%m-%d-%H%M%S")
folder=session-${time_stamp}
mkdir -p /logs/${folder}
cp /logs/build-* /logs/${folder}
cp /logs/logfile* /logs/${folder}
cp /logs/result* /logs/${folder}
cp /src/.config_dir/.conf.json /logs/${folder}/conf.json
cp /src/docker-compose.json /logs/${folder}/
rm -rf /logs/build-*
rm -rf /logs/logfile*
rm -rf /logs/result*
rm -rf /pbssrc/target-*
exit 0
fi
clean=${1}
echo "Trying to stop all process via init.d"
/etc/init.d/pbs stop
ret=$?
if [ ${ret} -ne 0 ]; then
echo "failed graceful stop"
echo "force kill all processes"
kill_pbs_process
else
echo "checking for running ptl"
benchpress_count=$(ps -ef 2>/dev/null | grep $1 | grep -v grep | wc -l)
if [ ${benchpress_count} -gt 0 ]; then
killit pbs_benchpress
else
echo "No running ptl tests found"
fi
fi
if [ "XX${clean}" == "XXclean" ]; then
cd /pbssrc/target-${ID} && make uninstall
rm -rf /etc/init.d/pbs
rm -rf /etc/pbs.conf
rm -rf /var/spool/pbs
rm -rf /opt/ptl
rm -rf /opt/pbs
fi
================================================
FILE: ci/etc/macros
================================================
CONFIG_DIR=.config_dir
STATUS_FILE=status
PARAM_FILE=params
REQUIREMENT_DECORATOR_FILE=requirements_decorator
CONFIGURE_OPT_FILE=configure_opt
BENCHPRESS_OPT_FILE=benchpress_opt
CONF_JSON_FILE=conf.json
REQ_DOCKER_VERSION=17.12.0
DEFAULT_PLATFORM=centos:8
SUPPORTED_PLATFORMS=centos:7,centos:8,ubuntu:16.04,ubuntu:18.04
================================================
FILE: ci/etc/sudoers-overrides
================================================
Defaults syslog = local7
Defaults always_set_home
Defaults !requiretty
Defaults !env_reset
Defaults !secure_path
Defaults env_keep = "*"
ALL ALL=(ALL) NOPASSWD: ALL
================================================
FILE: configure.ac
================================================
#
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
#
AC_PREREQ([2.63])
# Use PBS_VERSION to override the version statically defined here. For example:
# ./configure PBS_VERSION=20.0.0 --prefix=/opt/pbs
AC_INIT([OpenPBS],
[23.06.06],
[pbssupport@altair.com],
[openpbs],
[http://www.openpbs.org/])
AC_CONFIG_HEADERS([src/include/pbs_config.h])
AC_CONFIG_SRCDIR([src/cmds/qmgr.c])
AC_CONFIG_AUX_DIR([buildutils])
AC_CONFIG_MACRO_DIR([m4])
AC_CANONICAL_TARGET([])
os_id=`grep ^ID= /etc/os-release | sed -n 's/.*"\(.*\)"/\1/p'`
AS_CASE([$os_id],
[opensuse-tumbleweed], m4_define([am_init_string], [-Wall foreign subdir-objects]),
[*], m4_define([am_init_string], [-Wall foreign]))
AM_INIT_AUTOMAKE(am_init_string)
AC_USE_SYSTEM_EXTENSIONS
# Checks for programs.
AC_PROG_AWK
AC_PROG_YACC
AC_PROG_SED
AC_PROG_CC
AC_PROG_LEX
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_CXX
AC_SUBST([AM_CXXFLAGS], [--std=c++11])
# Automake macros
#AM_PROG_AR macro is defined with automake version >= 1.12
m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
AM_PROG_CC_C_O
# Initialize libtool
AM_PROG_LIBTOOL
LT_INIT([shared static])
# Checks for libraries.
AC_CHECK_LIB([c], [xdr_int],
[],
AC_CHECK_LIB(nsl, xdr_int)
)
AC_CHECK_LIB([c], [ruserok],
[],
AC_CHECK_LIB(socket, ruserok)
)
AC_CHECK_LIB([c], [crypt],
[],
AC_CHECK_LIB(crypt, crypt)
)
AC_CHECK_LIB([c], [posix_openpt],
AC_DEFINE([HAVE_POSIX_OPENPT], [], [Defined whe posix_openpt is available])
)
AC_CHECK_LIB(dl, dlopen)
AC_CHECK_LIB([kvm], [kvm_open])
AC_CHECK_LIB([socket], [socket],
[socket_lib="-lsocket -lnsl"]
AC_SUBST(socket_lib),
[socket_lib=""]
AC_SUBST(socket_lib),
[-lnsl]
)
AC_CHECK_LIB([c], [malloc_info],
AC_DEFINE([HAVE_MALLOC_INFO], [], [Defined when malloc_info is available])
)
# Check for X Window System
AC_PATH_XTRA
# Checks for optional header files.
AC_CHECK_HEADERS([ \
com_err.h \
gssapi.h \
krb5.h \
libpq-fe.h \
mach/mach.h \
nlist.h \
sys/eventfd.h \
sys/systeminfo.h \
])
# Checks for required header files.
AC_CHECK_HEADERS([ \
stdio.h \
alloca.h \
arpa/inet.h \
assert.h \
ctype.h \
dirent.h \
dlfcn.h \
execinfo.h \
fcntl.h \
float.h \
fstab.h \
ftw.h \
grp.h \
libgen.h \
limits.h \
math.h \
memory.h \
netdb.h \
netinet/in.h \
netinet/in_systm.h \
netinet/ip.h \
netinet/tcp.h \
openssl/aes.h \
openssl/bio.h \
openssl/err.h \
openssl/evp.h \
openssl/ssl.h \
paths.h \
poll.h \
pthread.h \
pwd.h \
regex.h \
signal.h \
stdbool.h \
stddef.h \
stdint.h \
stdio.h \
stdlib.h \
string.h \
strings.h \
syslog.h \
sys/fcntl.h \
sys/file.h \
sys/ioctl.h \
sys/mman.h \
sys/mount.h \
sys/param.h \
sys/poll.h \
sys/quota.h \
sys/resource.h \
sys/select.h \
sys/signal.h \
sys/socket.h \
sys/stat.h \
sys/statvfs.h \
sys/time.h \
sys/timeb.h \
sys/times.h \
sys/types.h \
sys/uio.h \
sys/un.h \
sys/user.h \
sys/utsname.h \
sys/wait.h \
termios.h \
time.h \
unistd.h \
utime.h \
X11/Intrinsic.h \
X11/X.h \
X11/Xlib.h \
zlib.h \
],, AC_MSG_ERROR([Required header file is missing.]) \
)
# Checks for typedefs, structures, and compiler characteristics.
#AC_CHECK_HEADER_STDBOOL macro is defined with autoconf version >= 2.67
m4_ifdef([AC_CHECK_HEADER_STDBOOL], [AC_CHECK_HEADER_STDBOOL])
AC_TYPE_UID_T
AC_TYPE_MODE_T
AC_TYPE_OFF_T
AC_TYPE_PID_T
AC_C_RESTRICT
AC_TYPE_SIZE_T
AC_TYPE_SSIZE_T
AC_CHECK_MEMBERS([struct stat.st_blksize])
AC_TYPE_UINT16_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T
AC_TYPE_UINT8_T
AC_CHECK_TYPES([ptrdiff_t])
# Checks for library functions.
AC_FUNC_ALLOCA
AC_FUNC_CHOWN
AC_FUNC_ERROR_AT_LINE
AC_FUNC_FORK
AC_FUNC_GETGROUPS
AC_FUNC_GETMNTENT
AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
AC_FUNC_MKTIME
AC_FUNC_MMAP
AC_FUNC_STRERROR_R
AC_FUNC_STRTOD
AC_CHECK_FUNCS([ \
alarm \
atexit \
bzero \
dup2 \
endpwent \
floor \
ftruncate \
getcwd \
gethostbyaddr \
gethostbyname \
gethostname \
getmntent \
getpagesize \
gettimeofday \
hasmntopt \
inet_ntoa \
localtime_r \
memchr \
memmove \
memset \
mkdir \
munmap \
pathconf \
poll \
pstat_getdynamic \
putenv \
realpath \
regcomp \
rmdir \
select \
setresuid \
setresgid \
getpwuid \
initgroups \
seteuid \
setegid \
strerror_r \
socket \
strcasecmp \
strchr \
strcspn \
strdup \
strerror \
strncasecmp \
strpbrk \
strrchr \
strspn \
strstr \
strtol \
strtoul \
strtoull \
sysinfo \
uname \
utime \
])
PKG_PROG_PKG_CONFIG
m4_ifdef([PKG_INSTALLDIR],
[PKG_INSTALLDIR],
[
pkgconfigdir=/usr/lib64/pkgconfig
AC_SUBST([pkgconfigdir])
])
# PBS macros (order matters for some of these)
PBS_AC_PBS_VERSION
PBS_AC_DECL_H_ERRNO
PBS_AC_DECL_SOCKLEN_T
PBS_AC_DECL_EPOLL
PBS_AC_DECL_EPOLL_PWAIT
PBS_AC_DECL_PPOLL
PBS_AC_WITH_SERVER_HOME
PBS_AC_WITH_SERVER_NAME_FILE
PBS_AC_WITH_DATABASE_DIR
PBS_AC_WITH_DATABASE_USER
PBS_AC_WITH_DATABASE_PORT
PBS_AC_WITH_PBS_CONF_FILE
PBS_AC_WITH_TMP_DIR
PBS_AC_WITH_UNSUPPORTED_DIR
PBS_AC_WITH_CORE_LIMIT
PBS_AC_WITH_PYTHON
PBS_AC_WITH_EXPAT
PBS_AC_WITH_EDITLINE
PBS_AC_WITH_HWLOC
PBS_AC_WITH_LIBICAL
PBS_AC_WITH_PMIX
PBS_AC_WITH_SENDMAIL
PBS_AC_WITH_SWIG
PBS_AC_WITH_TCL
PBS_AC_WITH_TCLATRSEP
PBS_AC_WITH_XAUTH
PBS_AC_WITH_KRBAUTH
PBS_AC_WITH_MIN_STACK_LIMIT
PBS_AC_DISABLE_SHELL_PIPE
PBS_AC_DISABLE_SYSLOG
PBS_AC_SECURITY
PBS_AC_ENABLE_ALPS
PBS_AC_WITH_LIBZ
PBS_AC_ENABLE_PTL
PBS_AC_SYSTEMD_UNITDIR
PBS_AC_PATCH_LIBTOOL
PBS_AC_WITH_CJSON
AC_CONFIG_FILES([
openpbs.spec
Makefile
buildutils/Makefile
doc/Makefile
test/Makefile
test/fw/Makefile
test/tests/Makefile
test/fw/setup.py
test/fw/ptl/__init__.py
src/Makefile
src/cmds/Makefile
src/cmds/mpiexec
src/cmds/pbs_lamboot
src/cmds/pbs_mpihp
src/cmds/pbs_mpilam
src/cmds/pbs_mpirun
src/cmds/pbs_remsh
src/cmds/pbsrun_unwrap
src/cmds/pbsrun_wrap
src/cmds/pbsrun
src/cmds/scripts/Makefile
src/cmds/scripts/modulefile
src/cmds/scripts/pbs_habitat
src/cmds/scripts/pbs_init.d
src/cmds/scripts/pbs_reload
src/cmds/scripts/pbs_poerun
src/cmds/scripts/pbs_postinstall
src/cmds/scripts/pbs.service
src/cmds/scripts/pbsrun.poe
src/hooks/Makefile
src/iff/Makefile
src/include/Makefile
src/include/pbs_version.h
src/lib/Libattr/Makefile
src/lib/Libdb/Makefile
src/lib/Libdb/pgsql/Makefile
src/lib/Libifl/Makefile
src/lib/Liblog/Makefile
src/lib/Libnet/Makefile
src/lib/Libpbs/Makefile
src/lib/Libpbs/pbs.pc
src/lib/Libpython/Makefile
src/lib/Libsec/Makefile
src/lib/Libsite/Makefile
src/lib/Libtpp/Makefile
src/lib/Libutil/Makefile
src/lib/Libauth/Makefile
src/lib/Libauth/gss/Makefile
src/lib/Libauth/munge/Makefile
src/lib/Liblicensing/Makefile
src/lib/Libjson/Makefile
src/lib/Libjson/cJSON/Makefile
src/lib/Makefile
src/modules/Makefile
src/modules/python/Makefile
src/mom_rcp/Makefile
src/resmom/Makefile
src/scheduler/Makefile
src/server/Makefile
src/tools/Makefile
src/tools/wrap_tcl.sh
src/unsupported/Makefile
])
AC_OUTPUT
================================================
FILE: doc/Makefile.am
================================================
#
# Copyright (C) 1994-2021 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of both the OpenPBS software ("OpenPBS")
# and the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# OpenPBS is free software. You can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# OpenPBS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# PBS Pro is commercially licensed software that shares a common core with
# the OpenPBS software. For a copy of the commercial license terms and
# conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
# Altair Legal Department.
#
# Altair's dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of OpenPBS and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair's trademarks, including but not limited to "PBS™",
# "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
# subject to Altair's trademark licensing policies.
#
notrans_dist_man1_MANS = \
man1/pbsdsh.1B \
man1/pbs_login.1B \
man1/pbs_python.1B \
man1/pbs_ralter.1B \
man1/pbs_rdel.1B \
man1/pbs_release_nodes.1B \
man1/pbs_rstat.1B \
man1/pbs_rsub.1B \
man1/qalter.1B \
man1/qdel.1B \
man1/qhold.1B \
man1/qmove.1B \
man1/qmsg.1B \
man1/qorder.1B \
man1/qrerun.1B \
man1/qrls.1B \
man1/qselect.1B \
man1/qsig.1B \
man1/qstat.1B \
man1/qsub.1B
notrans_dist_man3_MANS = \
man3/pbs_alterjob.3B \
man3/pbs_asyrunjob.3B \
man3/pbs_confirmresv.3B \
man3/pbs_connect.3B \
man3/pbs_default.3B \
man3/pbs_deljob.3B \
man3/pbs_delresv.3B \
man3/pbs_disconnect.3B \
man3/pbs_geterrmsg.3B \
man3/pbs_holdjob.3B \
man3/pbs_locjob.3B \
man3/pbs_manager.3B \
man3/pbs_modify_resv.3B \
man3/pbs_movejob.3B \
man3/pbs_msgjob.3B \
man3/pbs_orderjob.3B \
man3/pbs_preempt_jobs.3B \
man3/pbs_rerunjob.3B \
man3/pbs_rescreserve.3B \
man3/pbs_relnodesjob.3B \
man3/pbs_rlsjob.3B \
man3/pbs_runjob.3B \
man3/pbs_selectjob.3B \
man3/pbs_selstat.3B \
man3/pbs_sigjob.3B \
man3/pbs_stagein.3B \
man3/pbs_statfree.3B \
man3/pbs_stathook.3B \
man3/pbs_stathost.3B \
man3/pbs_statjob.3B \
man3/pbs_statnode.3B \
man3/pbs_statque.3B \
man3/pbs_statresv.3B \
man3/pbs_statrsc.3B \
man3/pbs_statsched.3B \
man3/pbs_statserver.3B \
man3/pbs_statvnode.3B \
man3/pbs_submit.3B \
man3/pbs_submit_resv.3B \
man3/pbs_tclapi.3B \
man3/pbs_terminate.3B \
man3/rm.3B \
man3/tm.3
noinst_man3_MANS = \
man3/pbs_rescquery.3B \
man3/pbs_submitresv.3B
notrans_dist_man7_MANS = \
man1/pbs_hook_attributes.7B \
man1/pbs_job_attributes.7B \
man1/pbs_module.7B \
man1/pbs_node_attributes.7B \
man1/pbs_professional.7B \
man1/pbs_queue_attributes.7B \
man1/pbs_resources.7B \
man1/pbs_resv_attributes.7B \
man1/pbs_sched_attributes.7B \
man1/pbs_server_attributes.7B
notrans_dist_man8_MANS = \
man8/mpiexec.8B \
man8/pbs.8B \
man8/pbs_account.8B \
man8/pbs_attach.8B \
man8/pbs_comm.8B \
man8/pbs.conf.8B \
man8/pbs_dataservice.8B \
man8/pbs_ds_password.8B \
man8/pbsfs.8B \
man8/pbs_hostn.8B \
man8/pbs_idled.8B \
man8/pbs_iff.8B \
man8/pbs_interactive.8B \
man8/pbs_lamboot.8B \
man8/pbs_mkdirs.8B \
man8/pbs_mom.8B \
man8/pbs_mpihp.8B \
man8/pbs_mpilam.8B \
man8/pbs_mpirun.8B \
man8/pbsnodes.8B \
man8/pbs_probe.8B \
man8/pbsrun.8B \
man8/pbsrun_unwrap.8B \
man8/pbsrun_wrap.8B \
man8/pbs_sched.8B \
man8/pbs_server.8B \
man8/pbs_snapshot.8B \
man8/pbs_tclsh.8B \
man8/pbs_tmrsh.8B \
man8/pbs_topologyinfo.8B \
man8/pbs_wish.8B \
man8/printjob.8B \
man8/qdisable.8B \
man8/qenable.8B \
man8/qmgr.8B \
man8/qrun.8B \
man8/qstart.8B \
man8/qstop.8B \
man8/qterm.8B \
man8/tracejob.8B \
man8/win_postinstall.py.8B
================================================
FILE: doc/man1/pbs_hook_attributes.7B
================================================
.\"
.\" Copyright (C) 1994-2021 Altair Engineering, Inc.
.\" For more information, contact Altair at www.altair.com.
.\"
.\" This file is part of both the OpenPBS software ("OpenPBS")
.\" and the PBS Professional ("PBS Pro") software.
.\"
.\" Open Source License Information:
.\"
.\" OpenPBS is free software. You can redistribute it and/or modify it under
.\" the terms of the GNU Affero General Public License as published by the
.\" Free Software Foundation, either version 3 of the License, or (at your
.\" option) any later version.
.\"
.\" OpenPBS is distributed in the hope that it will be useful, but WITHOUT
.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
.\" License for more details.
.\"
.\" You should have received a copy of the GNU Affero General Public License
.\" along with this program. If not, see .
.\"
.\" Commercial License Information:
.\"
.\" PBS Pro is commercially licensed software that shares a common core with
.\" the OpenPBS software. For a copy of the commercial license terms and
.\" conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
.\" Altair Legal Department.
.\"
.\" Altair's dual-license business model allows companies, individuals, and
.\" organizations to create proprietary derivative works of OpenPBS and
.\" distribute them - whether embedded or bundled with other software -
.\" under a commercial license agreement.
.\"
.\" Use of Altair's trademarks, including but not limited to "PBS™",
.\" "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
.\" subject to Altair's trademark licensing policies.
.\"
.TH pbs_hook_attributes 7B "6 May 2020" Local "PBS Professional"
.SH NAME
.B pbs_hook_attributes
\- attributes of PBS hooks
.SH DESCRIPTION
.LP
Hook attributes can be set, unset, and viewed using the
.B qmgr
command.
See the
.B qmgr(1B)
man page.
An unset hook attribute takes the default value for that attribute.
Under UNIX/Linux, root privilege is required in order to operate on
hooks. Under Windows, this must be done from the installation
account. For domained environments, the installation account must be
a lo cal account that is a member of the local Administrators group on
the local computer. For standalone environments, the ins tallation
account must be a local account that is a member of the local
Administrators group on the local computer.
.IP "alarm="
Specifies the number of seconds to allow a hook to run before
the hook times out.
.br
Set by administrator.
.br
Valid values: >0
.br
Format: Integer
.br
Default value: 30
.IP "debug"
Specifies whether or not the hook produces debugging files under
PBS_HOME/server_priv/hooks/tmp or PBS_HOME/mom_priv/hooks/tmp. Files
are named hook___.in, .data, and .out.
When this is set to
.I true,
the hook leaves debugging files.
.br
Set by administrator.
.br
Format: Boolean
.br
Default value: False
.IP "enabled"
Determines whether or not a hook is run when its triggering event occurs.
If a hook's
.I enabled
attribute is
.I True,
the hook is run.
.br
Set by administrator.
.br
Format: Boolean
.br
Default: True
.IP "event"
List of events that trigger the hook. Can be operated on with
the "=", "+=", and "-=" operators. The
.I provision
event cannot be combined with any other events.
.br
Valid events:
.RS 11
.nf
"exechost_periodic"
"exechost_startup"
"execjob_attach"
"execjob_begin"
"execjob_end"
"execjob_epilogue"
"execjob_launch"
"execjob_postsuspend"
"execjob_preresume"
"execjob_preterm"
"execjob_prologue"
"modifyjob"
"movejob"
"periodic"
"provision"
"queuejob"
"resvsub"
"runjob"
"" (meaning no event)
.fi
.RE
.IP
.br
Set by administrator.
.br
Format: string array
.br
Default value: "" (meaning none, i.e. the hook is not triggered)
.IP "fail_action"
Specifies the action to be taken when hook fails due to alarm call or
unhandled exception, or to an internal error such as not enough disk
space or memory. Can also specify a subsequent action to be taken
when hook runs successfully. Value can be either "none" or one or more of
"offline_vnodes", "clear_vnodes_upon_recovery", and "scheduler_restart_cycle".
If this attribute is set to multiple values, scheduler restart happens last.
.br
.I offline_vnodes
.RS 11
After unsuccessful hook execution, offlines the vnodes managed by the MoM
executing the hook. Only available for execjob_prologue, exechost_startup
and execjob_begin hooks.
.RE
.IP
.I clear_vnodes_upon_recovery
.RS 11
After successful hook execution, clears vnodes previously offlined via
offline_vnodes fail action. Only available for exechost_startup hooks.
.RE
.IP
.I scheduler_restart_cycle
.RS 11
After unsuccessful hook execution, restarts scheduling cycle. Only
available for execjob_begin and execjob_prologue hooks.
.RE
.IP
.br
Set by administrator.
.br
Format: string_array
.br
Default value: "none"
.IP "freq"
Number of seconds between periodic or exechost_periodic triggers.
.br
Set by administrator.
.br
Format: integer
.br
Default: 120 seconds
.IP "order"
Indicates relative order of hook execution, for hooks of the same
type sharing a trigger. Hooks with lower
.I order
values execute before those with higher values.
Does not apply to periodic or exechost_periodic hooks.
.br
Set by administrator.
.br
Valid values:
.RS 8
Built-in hooks:
.I [-1000, 2000]
.br
Site hooks:
.I [1, 1000]
.RE
.IP
Format: Integer
.br
Default value: 1
.IP "Type"
The type of the hook. Cannot be set for a built-in hook.
.br
Valid values: "pbs", "site"
.br
.I pbs
.RS 11
Hook is built in.
.RE
.IP
.I site
.RS 11
Hook is custom (site-defined).
.RE
.IP
.br
Set by administrator.
.br
Format: String
.br
Default value: "site"
.IP "user"
Specifies who executes the hook.
.br
Valid values: "pbsadmin", "pbsuser"
.br
.I "pbsadmin"
.RS 11
The hook executes as root.
.RE
.IP
.I "pbsuser"
.RS 11
The hook executes as the triggering job's owner.
.RE
.IP
.br
Set by administrator.
.br
Format: String
.br
Default value: "pbsadmin"
.SH SEE ALSO
qmgr(1B),
pbs_module(7B),
pbs_stathook(3B)
================================================
FILE: doc/man1/pbs_job_attributes.7B
================================================
.\"
.\" Copyright (C) 1994-2021 Altair Engineering, Inc.
.\" For more information, contact Altair at www.altair.com.
.\"
.\" This file is part of both the OpenPBS software ("OpenPBS")
.\" and the PBS Professional ("PBS Pro") software.
.\"
.\" Open Source License Information:
.\"
.\" OpenPBS is free software. You can redistribute it and/or modify it under
.\" the terms of the GNU Affero General Public License as published by the
.\" Free Software Foundation, either version 3 of the License, or (at your
.\" option) any later version.
.\"
.\" OpenPBS is distributed in the hope that it will be useful, but WITHOUT
.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
.\" License for more details.
.\"
.\" You should have received a copy of the GNU Affero General Public License
.\" along with this program. If not, see .
.\"
.\" Commercial License Information:
.\"
.\" PBS Pro is commercially licensed software that shares a common core with
.\" the OpenPBS software. For a copy of the commercial license terms and
.\" conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
.\" Altair Legal Department.
.\"
.\" Altair's dual-license business model allows companies, individuals, and
.\" organizations to create proprietary derivative works of OpenPBS and
.\" distribute them - whether embedded or bundled with other software -
.\" under a commercial license agreement.
.\"
.\" Use of Altair's trademarks, including but not limited to "PBS™",
.\" "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
.\" subject to Altair's trademark licensing policies.
.\"
.TH pbs_job_attributes 7B "4 March 2021" Local "PBS Professional"
.SH NAME
.B pbs_job_attributes
\- attributes of PBS jobs
.SH DESCRIPTION
Each PBS job has attributes that characterize that job.
.IP "Account_Name" 8
String used for accounting purposes. Can be used for fairshare.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String;
can contain any character.
.br
Python type:
.I str
.br
Default: No default
.IP accounting_id 8
Accounting ID for tracking accounting data not produced by PBS.
Readable by all.
.br
Format:
.I String
.br
Python type:
.I str
.IP accrue_type 8
Indicates what kind of time the job is accruing.
.br
Readable by Manager only.
.br
Format:
.I Integer
.br
Python type:
.I int
.br
Valid values:
.RS 11
One of 0 (initial_time), 1 (ineligible_time), 2 (eligible_time), or 3 (run_time).
.RE
.IP
Default:
.I 2 (eligible_time)
.IP alt_id 8
For a few systems, the session ID is insufficient to track which
processes belong to the job. Where a different identifier is
required, it is recorded in this attribute. If set, it will also be
recorded in the end-of-job accounting record.
.br
On Windows, holds PBS home directory.
.br
Readable by all; settable by None.
.br
Format:
.I String;
may contain white spaces.
.br
Python type:
.I str
.br
Default: No default
.IP "argument_list" 8
Job executable's argument list. Shown if job is submitted with
"-- []".
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I JSDL=encoded string
.RS 11
.I <1st arg>
.br
.I <2nd arg>
.br
.I
.RE
.IP
Example:
.RS 11
If arguments are "A B":
A B
.RE
.IP
Python type:
.I str
.br
Default: No default
.IP array 8
Indicates whether this is a job array. Set to
.I True
if this is an array job.
.br
Can be read and set by user. Can be read by Manager and Operator.
.br
Format:
.I Boolean
.br
Python type:
.I bool
.br
Default:
.I False
.IP array_id 8
Applies only to subjobs. Array identifier of subjob.
Readable by all; set by PBS.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default: No default
.IP array_index 8
Applies only to subjobs. Index number of subjob.
Readable by all; set by PBS.
.br
Format:
.I String
.br
Python type:
.I int
.br
Default: No default
.IP array_indices_remaining 8
Applies only to job arrays. List of indices of subjobs still queued.
Readable by all; set by PBS.
.br
Format:
.I String
.br
Syntax: Range or list of ranges, e.g. 500, 552, 596-1000
.br
Python type:
.I str
.br
Default: No default
.IP array_indices_submitted 8
Applies only to job arrays. Complete list of indices of subjobs
given at submission time.
.br
Can be read and set by user. Can be read by Manager and Operator.
.br
Format:
.I String
.br
Syntax:
Given as range, e.g. 1-100
.br
Python type:
.I pbs.range
.br
Default: No default
.IP array_state_count 8
Applies only to job arrays. Lists number of subjobs in each state.
.br
Readable by all; set by PBS.
.br
Format:
.I String
.br
Python type:
.I pbs.state_count
.br
Default: No default
.IP "block" 8
Specifies whether qsub will wait for the job to complete and
return the exit value of the job.
.br
For X11 forwarding jobs, and jobs with
.I interactive
and
.I block
attributes set to
.I True,
the job's exit status is not returned.
.br
When
.I block
is
.I True,
qsub waits for the job to finish.
.br
Can be read and set by user. Can be read by Manager and Operator.
.br
Format:
.I Boolean
.br
Python type:
.I int
.br
Default:
.I False
.IP "Checkpoint" 8
Determines when the job will be checkpointed. An
.I $action
script is required to checkpoint the job. See the
.I pbs_mom(8B)
man page.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String,
containing description of interval at which to checkpoint.
.br
Python type:
.I pbs.checkpoint
.br
Valid values:
.RS
.IP c 3
Checkpoint at intervals, measured in CPU time, set on the job's
execution queue. If no interval set at queue, job is not checkpointed.
.IP "c=" 3
Checkpoint at intervals of the specified number of minutes of job CPU
time. This value must be greater than zero. If the interval
specified is less than that set on the job's execution queue, the
queue's interval is used.
.br
Format:
.I Integer
.IP w 3
Checkpoint at intervals, measured in walltime, set on job's execution
queue. If no interval set at queue, job is not checkpointed.
.IP "w=" 3
Checkpoint at intervals of the specified number of minutes of job
walltime. This value must be greater than zero. If the interval
specified is less that that set on job's execution queue, the
queue's interval is used.
.br
Format:
.I Integer
.IP n 3
No checkpointing.
.IP s 3
Checkpoint only when the server is shut down.
.IP u 3
Unset. Defaults to behavior when
.I interval
argument is set to
.I s.
.LP
Default:
.I u
.RE
.IP comment 8
Comment about job. Informational only.
.br
Can be read by user. Can be read and set by Operator, Manager.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default: No default
.IP create_resv_from_job 8
When this attribute is
.I True,
when this job is run, immediately creates and confirms a job-specific
start reservation on the same resources as the job (including
resources inherited by the job), and places the job in the
job-specific reservation's queue. Sets the job's
.I create_resv_from_job
attribute to
.I True.
Sets the job-specific reservation's
.I reserve_job
attribute to the ID of the job from which the reservation was created.
The new reservation's duration and start time are the same as the
job's walltime and start time. If the job is peer scheduled, the
job-specific reservation is created in the pulling complex.
.br
Readable and settable by all.
.br
Format:
.I Boolean
.br
Python type:
.I bool
.br
Default:
.I False
.IP ctime 8
Timestamp; time at which the job was created.
.br
Readable by all; set by PBS.
.br
Format:
.I Integer
.br
Syntax: Timestamp.
.RS 11
Printed by
.B qstat
in human-readable format. Output by hooks as seconds since epoch.
.RE
.IP
Python type:
.I int
.br
Default: No default
.IP depend 8
Specifies inter-job dependencies.
.br
No limit on number of dependencies.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String
.br
Syntax:
.RS 11
":[, ...][,:[, ...] ...]"
.br
Must be enclosed in double quotes if it contains commas.
.RE
.IP
Example: "before:123,456"
.br
Python type:
.I pbs.depend
.br
Valid values:
.RS
.IP "after:" 3
This job may run at any point after all jobs in
.I job ID list
have started execution.
.IP "afterok:" 3
This job may run only after all jobs in
.I job ID list
have terminated with no errors.
.IP "afternotok:" 3
This job may run only after all jobs in
.I job ID list
have terminated with errors.
.IP "afterany:"
This job can run after all jobs in
.I job ID list
have finished execution, with or without errors. This job will not run
if a job in the
.I job ID list
was deleted without ever having been run.
.IP "before:" 3
Jobs in
.I job ID list
may start once this job has started.
.IP "beforeok:" 3
Jobs in
.I job ID list
may start once this job terminates without errors.
.IP "beforenotok:" 3
If this job terminates execution with errors, jobs in
.I job ID list
may begin.
.IP "beforeany:" 3
Jobs in
.I job ID list
may begin execution once this job terminates execution, with or without errors.
.IP "on:" 3
This job may run after
.I count
dependencies on other jobs have been satisfied. This type is used with one of the
.I before types listed.
.I Count
is an integer greater than
.I 0.
.RE
.IP
Default: No dependencies
.IP egroup 8
If the job is queued, this attribute is set to the
group name under which the job is to be run.
.br
Readable by Manager only.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default: No default
.IP eligible_time 8
The amount of wall clock wait time a job has accrued while the job
is blocked waiting for resources. For a job currently accruing
.I eligible_time,
if we were to add enough of the right type of resources, the job would
start immediately.
.br
Viewable via
.B qstat -f.
.br
Readable by job owner, Manager and Operator. Settable by Operator or Manager.
.br
Format:
.I Duration
.br
Python type:
.I pbs.duration
.br
Default:
.I Zero
.IP "Error_Path" 8
The final path name for the file containing the job's standard error
stream. See the
.B qsub
and
.B qalter
commands.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String
.br
Python type:
.I str
.br
Syntax:
.I [:]
.br
Valid values:
.RS
.IP "" 3
Path is relative to the current working directory of command executing
on current host.
.IP "" 3
Path is absolute path on current host where command is executing.
.IP ":" 3
Path is relative to user's home directory on specified host.
.IP ":" 3
Path is absolute path on named host.
.IP "No path" 3
Path is current working directory where qsub is executed.
.RE
.IP
Default: Default path is current working directory where qsub is run.
If the output path is specified, but does not include a
filename, the default filename is
.I .ER.
If the path name is not specified, the default filename is
.I .e.
.IP estimated 8
List of estimated values for job. Used to report job's
.I exec_vnode, start_time,
and
.I soft_walltime.
Can be set in a hook or via qalter, but PBS will overwrite the values.
.br
Format: Format of reported element
.br
Syntax:
.RS 11
.I estimated.=[, estimated.= ...]
.RE
.IP
Python type:
.I pbs.pbs_resource
.br
Syntax:
.RS 11
estimated.=
.br
where is a resource
.RE
.IP
Reported values:
.RS
.IP "exec_vnode" 3
The estimated vnodes used by this job.
.br
Readable by all; settable by Manager and Operator.
.br
Format:
.I String
.br
Python type:
.I pbs.exec_vnode
.br
Default: Unset
.IP "soft_walltime" 3
The estimated soft walltime for this job. Calculated when a job
exceeds its soft_walltime resource.
.br
Readable by all; settable by Manager.
.br
Format:
.I Duration
.br
Python type:
.I pbs.duration
.br
Default: Unset
.IP "start_time" 3
The estimated start time for this job.
.br
Readable by all; settable by Manager and Operator.
.br
Format:
.I start_time
is printed by qstat
in human-readable format;
.I start_time
output in hooks as seconds since epoch.
.br
Python type:
.I int
.br
Default: Unset
.RE
.IP
.IP etime 8
Timestamp; time when job became eligible to run, i.e. was enqueued in
an execution queue and was in the "Q" state. Reset when a job moves
queues, or is held then released. Not affected by qaltering.
.br
Readable by all; set by PBS.
.br
Format:
.I Integer
.br
Syntax:
.RS 11
Printed by qstat in human-readable format. Output in hooks as seconds since epoch.
.RE
.IP
Python type:
.I int
.br
Default: No default
.IP euser 8
If the job is queued, this attribute is set to the
user name under which the job is to be run.
.br
Readable by Manager only; set by PBS.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default: No default
.IP "executable" 8
JSDL-encoded listing of job's executable.
Shown if job is submitted with "-- []".
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I JSDL-encoded string
.br
Syntax:
.br
Example:
.RS 11
If the executable is ping, the string
is ping
.RE
.IP
Python type:
.I str
.br
Default: No default
.IP "Execution_Time" 8
Timestamp; time after which the job may execute. Before this time,
the job remains queued in the (W)ait state. Can be set when stage-in
fails and PBS moves job start time out 30 minutes to allow user to fix
problem.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I Datetime
.br
Syntax:
.I [[CCwYY]MMDDhhmm[.ss]
.br
Python type:
.I int
.br
Default: Unset (no delay)
.IP exec_host 8
If the job is running, this is set to the name of the host or hosts on which
the job is executing.
.br
Can be read by user, Operator, Manager.
.br
Format:
.I String
.br
Syntax:
.RS 11
.I /N[*C][+...],
.br
where
.I N
is task slot number, starting with 0,
on that vnode, and
.I C
is the number of CPUs allocated to the job.
.I *C
does not appear if
.I C
has a value of
.I 1.
.RE
.IP
Python type:
.I pbs.exec_host
.br
Default: No default
.IP exec_vnode 8
List of chunks for the job. Each chunk shows the name of the vnode(s)
from which it is taken, along with the host-level, consumable resources
allocated from that vnode, and any AOE provisioned on this vnode for this job.
.br
If a vnode is allocated to the job but no resources
from the vnode are used by the job, the vnode
name appears alone.
.br
If a chunk is split across vnodes, the name of
each vnode and its resources appear inside one pair of parentheses,
joined with a plus sign ("+").
.br
Can be read by user. Can be read and set by Manager, Operator.
.br
Format:
.I String
.br
Syntax:
.RS 11
Each chunk is enclosed in parentheses, and
chunks are connected by plus signs.
.RE
.IP
Example:
.RS 11
For a job which requested two chunks
that were satisfied by resources from three vnodes,
.I exec_vnode
is
.br
(vnodeA:ncpus=N:mem=X)+(vnodeB:ncpus=P:mem=Y+vnodeC:mem=Z).
.br
For a job which requested one chunk and exclusive use of a 2-vnode host,
where the chunk was satisfied by resources from one vnode,
.I exec_vnode
is
.br
(vnodeA:ncpus=N:mem=X)+(vnodeB).
.RE
.IP
Python type:
.I pbs.exec_vnode
.br
Default: No default
.IP Exit_status 8
Exit status of job. Set to zero for successful execution. If any
subjob of an array job has non-zero exit status, the array job has
non-zero exit status.
.br
Readable by all; set by PBS.
.br
Format:
.I Integer
.br
Python type:
.I int
.br
Default: No default
.IP "forward_x11_cookie" 8
Contains the X authorization cookie.
.br
Readable by all; set by PBS.
.br
Format:
.I String
.br
Python type:
.I int
.br
Default: No default
.IP "forward_x11_port" 8
Contains the number of the port being listened to by the port
forwarder on the submission host.
.br
Readable by all; set by PBS.
.br
Format:
.I Integer
.br
Python type:
.I int
.br
Default: No default
.IP "group_list" 8
A list of group names used to determine the group under which the job
runs. When a job runs, the server selects a group name from the list
according to the following ordered set of rules:
.RS
.IP "1." 3
Select the group name for which the associated host name matches the
name of the server host.
.IP "2." 3
Select the group name which has no associated host name.
.IP "3." 3
Use the login group for the user name under which the job will be run.
.RE
.IP
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String
.br
Syntax:
.RS 11
.I [@] [,[@] ...]
.br
Must be enclosed in double quotes if it contains commas.
.RE
.IP
Python type:
.I pbs.group_list
.br
Default: No default
.IP hashname 8
No longer used.
.IP "Hold_Types" 8
The set of holds currently applied to the job. If the set is not null,
the job will not be scheduled for execution and is said to be in the
.I held
state. The
.I held
state takes precedence over the
.I wait
state.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String,
made up of the letters
.I 'n', 'o', 'p', 's', 'u'
.br
Hold types:
.RS
.IP n 3
No hold
.IP o 3
Other hold
.IP p 3
Bad password
.IP s 3
System hold
.IP u 3
User hold
.RE
.IP
Python type:
.I pbs.hold_types
.br
Default:
.I n
(no hold)
.RE
.IP "interactive" 8
Specifies whether the job is interactive.
.br
When both this attribute and the
.I block
attribute are
.I True,
no exit status is returned.
For X11 forwarding jobs, the job's exit status is not returned.
.br
Cannot be set using a PBS directive.
.br
Job arrays cannot be interactive.
.br
Can be set, but not altered, by unprivileged user. Can be read by Operator, Manager.
.br
Format:
.I Boolean
.br
Python type:
.I int
.br
Default:
.I False
.IP "jobdir" 8
Path of the job's staging and execution directory on the
primary execution host. Either user's home, or private sandbox.
Depends on value of
.I sandbox
attribute. Viewable via
.B qstat -f.
.br
Readable by all; set by PBS.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default: No default
.IP "Job_Name" 8
The job name. See the
.B qsub
and
.B qalter
commands.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String
up to 236 characters, first character must be alphabetic or numeric
.br
Python type:
.I str
.br
Default: Base name of job script, or STDIN
.IP "Job_Owner" 8
The login name on the submitting host of the user who submitted the batch job.
.br
Readable by all; set by PBS.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default: No default
.IP "job_state" 8
The state of the job.
.br
Readable by all. Can be set indirectly by all.
.br
Format:
.I Character
.br
Job states:
.RS
.IP B 3
.I Begun.
Job arrays only. The job array has begun execution.
.br
Python type: PBS job state constant
.I pbs.JOB_STATE_BEGUN
.IP E 3
.I Exiting.
The job has finished, with or without errors,
and PBS is cleaning up post-execution.
.br
Python type: PBS job state constant
.I pbs.JOB_STATE_EXITING
.IP F 3
.I Finished.
Job is finished. Job has completed execution, job failed during execution,
or job was deleted.
.br
Python type: PBS job state constant
.I pbs.JOB_STATE_FINISHED
.IP H 3
.I Held.
The job is held.
.br
Python type: PBS job state constant
.I pbs.JOB_STATE_HELD
.IP M 3
.I Moved.
Job has been moved to another server.
.br
Python type: PBS job state constant
.I pbs.JOB_STATE_MOVED
.IP Q 3
.I Queued.
The job resides in an execution or routing queue pending
execution or routing. It is not in
.B held
or
.B waiting
state.
.br
Python type: PBS job state constant
.I pbs.JOB_STATE_QUEUED
.IP R 3
.I Running.
The job is in a execution queue and is running.
.br
Python type: PBS job state constant
.I pbs.JOB_STATE_RUNNING
.IP S 3
.I Suspended.
The job was executing and has been suspended.
The job does not use CPU cycles or walltime.
.br
Python type: PBS job state constant
.I pbs.JOB_STATE_SUSPEND
.IP T 3
.I Transiting.
The job is being routed or moved to a new destination.
.br
Python type: PBS job state constant
.I pbs.JOB_STATE_TRANSIT
.IP U 3
.I User suspended.
The job was running on a workstation configured for cycle
harvesting and the keyboard/mouse is currently busy. The job is suspended
until the workstation has been idle for a configured amount of time.
.br
Python type: PBS job state constant
.I pbs.JOB_STATE_SUSPEND_USERACTIVE
.IP W 3
.I Waiting.
The
.I Execution_Time
attribute contains a time in the future. Can be set when
stage-in fails and PBS moves job start time out
30 minutes to allow user to fix problem.
.br
Python type: PBS job state constant
.I pbs.JOB_STATE_WAIITING
.IP X 3
.I Expired.
Subjobs only. Subjob is finished (expired.)
.br
Python type: PBS job state constant
.I pbs.JOB_STATE_EXPIRED
.LP
.RE
.IP "Join_Path" 8
Specifies whether the job's standard error and standard output streams
are to be merged and placed in the file specified in the
.I Output_Path
job attribute.
.br
When set to
.I True,
the job's standard error and standard output streams are merged.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String
.br
Behavior:
.RS
.IP eo 3
Standard output and standard error are merged, intermixed, into a
single stream, which becomes standard error.
.IP oe 3
Standard output and standard error are merged, intermixed, into a single stream, which becomes standard output.
.IP n 3
Standard output and standard error are not merged.
.RE
.IP
Python type:
.I pbs.join_path
.br
Default:
.I False
.IP "Keep_Files" 8
Specifies whether the standard output and/or standard error streams
are retained on the execution host in the job's staging and execution
directory after the job has executed. Otherwise these files are
returned to the submission host.
.I Keep_Files
overrides the
.I Output_Path
and
.I Error_Path
attributes.
.br
Readable and settable by all.
.br
Format:
.I String
.br
Python type:
.I pbs.keep_files
.br
Valid values: Can be one of the following:
.RS
.IP o 3
The standard output stream is retained. The filename is:
.I .o
.IP e 3
The standard error stream is retained. The filename is:
.I .e
.IP "eo, oe" 3
Both standard output and standard error streams are retained.
.IP d 3
Output and error are written directly to their final destination
.IP n 3
Neither stream is retained. Files are returned to submission host.
.RE
.IP
Default:
.I n
.RS 11
(neither stream is retained, and files are returned to submission host.)
.RE
.IP "Mail_Points" 8
Specifies state changes for which the server sends mail about the job.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String
.br
Python type:
.I pbs.mail_points
.br
Valid values: Combination of
.I a, b,
and
.I e,
with optional
.I j,
or
.I n
by itself.
.RS
.IP a 3
Mail is sent when job is aborted
.IP b 3
Mail is sent at beginning of job
.IP e 3
Mail is sent when job ends
.IP j 3
Mail is sent for subjobs. Must be combined with one or more of
.I a, b,
and
.I e
options.
.IP n 3
No mail is sent. Cannot be combined with other options.
.RE
.IP
Default:
.I a
.IP "Mail_Users" 8
The set of users to whom mail is sent when the job makes state changes
specified in the
.I Mail_Points
job attribute.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String
.br
Syntax: "@[,@]"
.br
Python type:
.I pbs.email_list
.br
Default: Job owner only
.IP "max_run_subjobs" 8
Sets a limit on the number of subjobs that can be running at one time.
Can be set using
.B qsub -J [%]
or
.B qalter -Wmax_run_subjobs= .
.IP mtime 8
Timestamp; the time that the job was last modified, changed state, or changed locations.
.br
Format:
.I Integer.
.br
Syntax: Timestamp.
.RS 11
Printed by qstat in human-readable format; output in hooks
as seconds since epoch.
.RE
.IP
Python type:
.I int
.br
Default: No default
.IP "no_stdio_sockets" 8
.B Not used.
.IP "Output_Path" 8
The final path name for the file containing the job's standard output
stream. See the
.B qsub
and
.B qalter
commands.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String
.br
Python type:
.I str
.br
Syntax:
.I [:]
.br
Valid values:
.RS
.IP "" 3
Path is relative to the current working directory of command executing
on current host.
.IP "" 3
Path is absolute path on current host where command is executing.
.IP ":" 3
Path is relative to user's home directory on specified host.
.IP ":" 3
Path is absolute path on named host.
.IP "No path" 3
Path is current working directory where qsub is executed.
.RE
.IP
Default:
.RS 11
Default path is current working directory where qsub is run.
.br
If the output path is specified, but does not include a
filename, the default filename is
.I .OU.
.br
If the path name is not specified, the default filename is
.I .o.
.RE
.IP "pcap_accelerator" 8
Power attribute. Power cap for an accleerator. Corresponds to Cray
.I capmc set_power_cap --accel
setting. See
.I capmc
documentation.
.br
Readable and settable by all.
.br
Format:
.I Integer
.br
Units:
.I Watts
.br
Python type:
.I int
.br
Default: Unset
.IP "pcap_node" 8
Power attribute. Power cap for a node. Corresponds to Cray
.I capmc set_power_cap --node
setting. See
.I capmc
documentation.
.br
Readable and settable by all.
.br
Format:
.I Integer
.br
Units:
.I Watts
.br
Python type:
.I int
.br
Default: Unset
.IP "pgov" 8
Power attribute. Cray ALPS reservation setting for CPU throttling
corresponding to
.I p-governor.
See BASIL 1.4 documentation. We do not recommend using this attribute.
.br
Readable and settable by all.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default: Unset
.IP "Priority" 8
The scheduling priority for the job. Higher value indicates higher priority.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I Integer
.br
Syntax:
.I [+|-]nnnnn
.br
Valid values: [-1024, +1023] inclusive
.br
Python type:
.I int
.br
Default: Unset
.IP "project" 8
The job's project. A project is a way to tag jobs. Each job can belong
to at most one project.
.br
Readable and settable by user, Operator, Manager.
.br
Format:
.I String
.RS 11
Can contain any characters except for the following:
Slash ("/"), left bracket ("["), right bracket ("]"), double quote ("""),
semicolon (";"), colon (":"), vertical bar ("|"), left angle bracket ("<"),
right angle bracket (">"), plus ("+"), comma (","), question mark ("?"),
and asterisk ("*").
.RE
.IP
Python type:
.I str
.br
Default: "_pbs_project_default"
.IP "pset" 8
.B Deprecated.
Name of the placement set used by the job.
.br
Can be read by user, Operator. Can be read and set by Manager.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default: No default
.IP "pstate" 8
Power attribute. Cray ALPS reservation setting for CPU frequency
corresponding to
.I p-state.
See BASIL 1.4 documentation.
.br
Readable and settable by all.
.br
Format:
.I String
.br
Units:
.I Hertz
.br
Python type:
.I str
.br
Default: Unset
.IP qtime 8
Timestamp; the time that the job entered the current queue.
.br
Readable by all; settable only by PBS.
.br
Format:
.I Integer
.br
Syntax: Timestamp.
.RS 11
Printed by qstat in human-readable format; output in hooks
as seconds since epoch.
.RE
.IP
Python type:
.I int
.br
Default: No default
.IP queue 8
The name of the queue in which the job currently resides.
.br
Readable by all; settable only by PBS.
.br
Format:
.I String
.br
Python type:
.I pbs.queue
.br
Default: No default
.IP queue_rank 8
A number indicating the job's position within the
queue. Only used internally by PBS.
.br
Readable by Manager only.
.br
Format:
.I Integer
.br
Python type:
.I int
.br
Default: No default
.IP queue_type 8
The type of queue in which the job is currently residing.
.br
Readable by Manager only.
.br
Format:
.I Character
.br
Valid values: One of
.I E
or
.I R
.RS
.IP E 3
Execution queue
.br
Python type:
.RS 3
PBS job state constant
.I pbs.QUEUE_TYPE_EXECUTION
.RE
.IP R 3
Routing queue
.br
Python type:
.RS 3
PBS job state constant
.I pbs.QUEUE_TYPE_EXECUTION
.RE
.RE
.IP
Default: No default
.IP "release_nodes_on_stageout" 8
Controls whether job vnodes are released when stageout begins.
.br
Cannot be used with vnodes tied to Cray X* series systems.
.br
When cgroups is enabled and this is used with some but not all vnodes
from one MoM, resources on those vnodes that are part of a cgroup are
not released until the entire cgroup is released.
.br
The job's
.I stageout
attribute must be set for the
.I release_nodes_on_stageout
attribute to take effect.
.br
When set to
.I True,
all of the job's vnodes not on the primary execution
host are released when stageout begins.
.br
When set to
.I False,
job's vnodes are released when the job finishes and MoM cleans up the job.
.br
Readable and settable by all.
.br
Format:
.I Boolean
.br
Python type:
.I bool
.br
Default:
.I False
.IP "Remove_Files" 8
Specifies whether standard output and/or standard error files are
automatically removed upon job completion.
.br
Readable and settable by all.
.br
Format:
.I String
.br
Python type:
.I str
.br
Valid values: "e", "o", "eo", "oe", or unset
.RS
.IP e 3
Standard error is removed upon job completion.
.IP o 3
Standard output is removed upon job completion.
.IP "eo, oe" 3
Standard output and standard error are removed upon job completion.
.IP unset 3
Neither is removed.
.RE
.IP
Default: Unset
.IP "Rerunable" 8
Specifies whether the job can be rerun. Does not affect how a job is
treated if the job could not begin execution.
.br
Job arrays are required to be rerunnable and are rerunnable by
default.
.br
Readable and settable by all.
.br
Format:
.I Character
.br
Syntax: One of
.I y
or
.I n
.br
Python type:
.I bool
.br
Default: y (job is rerunnable)
.IP "Resource_List" 8
The list of resources required by the job. List is a set of
.I =
strings. The meaning of name and value is dependent upon
defined resources. Each value establishes the limit of usage of that
resource. If not set, the value for a resource may be determined by a
queue or server default established by the administrator.
.br
Readable and settable by all.
.br
Format:
.I String
.br
Syntax:
.RS 11
.I Resource_List.=[, Resource_List.=, ...]
.RE
.IP
Python type:
.I pbs.pbs_resource
.br
Syntax:
.RS 11
Resource_List[""]=
.br
where is any built-in or custom resource
.RE
.IP
Default: No default
.IP "resources_released" 8
Listed by vnode, consumable resources that were released when the job
was suspended. Populated only when
.I restrict_res_to_release_on_suspend
server attribute is set.
.br
Readable by all. Set by server.
.br
Format:
.I String
.br
Syntax:
.RS 11
.I (:=:
.I =:...)+
.I (:=:...)
.RE
.IP
Python type:
.I str
.br
Default: No default
.IP "resource_release_list" 8
Sum of each consumable resource requested by the job that was released
when the job was suspended. Populated only when
.I restrict_res_to_release_on_suspend
server attribute is set.
.br
Readable by Manager and Operator. Set by server.
.br
Format:
.I String
.br
Syntax:
.RS 11
.I resource_released_list.=,
.I resource_released_list.=, ...
.RE
.IP
Python type:
.I pbs.pbs_resource
.br
Default: No default
.IP "resources_used" 8
The amount of each resource used by the job.
.br
Readable by all; set by PBS.
.br
Format:
.I String
.br
Syntax:
.RS 11
List of
.I resources_used.=,resources_used.=
pairs.
.RE
.IP
Example: resources_used.mem=2mb
.br
Python type:
.I pbs.pbs_resource
.br
Syntax:
.RS 11
resources_used[""]=
.br
where is any built-in or custom resource
.RE
.IP
Default: No default
.IP run_count 8
The number of times the server thinks the job has been executed.
.br
The
.I run_count
attribute starts at zero. Job is held after 21 tries.
.br
Can be set via qsub, qalter, or a hook.
.br
Can be read and set by Manager and Operator.
.br
Format:
.I Integer;
must be greater than or equal to zero.
.br
Python type:
.I int
.br
Default:
.I Zero
.IP "run_version" 8
Used internally by PBS to track the instance of the job.
.br
Set by PBS. Visible to Manager only.
.br
Format:
.I Integer
.br
Python type:
.I int
.br
Default: No default
.IP "sandbox" 8
Specifies type of location PBS uses for job staging and execution.
.br
User-settable via
.B qsub -Wsandbox=
or via a PBS directive.
.br
See the $jobdir_root MoM configuration option in
.B pbs_mom.8B.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String
.br
Valid values:
.I PRIVATE, HOME,
unset
.br
.RS
.IP PRIVATE 3
When set to PRIVATE, PBS creates job-specific staging and
execution directories under the directory specified in
the
.I $jobdir_root
MoM configuration option.
.IP "HOME or unset" 3
PBS uses the job owner's home directory for staging and execution.
.RE
.IP
Python type:
.I str
.br
Default: Unset
.IP schedselect 8
The union of the select specification of the job, and the queue and
server defaults for resources in a chunk.
.br
Can be read by PBS Manager only.
.br
Format:
.I String
.br
Python type:
.I pbs.select
.br
Default: No default
.IP sched_hint 8
.B No longer used.
.IP security_context 8
Contains security context of job submitter. Set by PBS to the
security context of the job submitter at the time of job
submission. If not present when a request is submitted, an error
occurs, a server message is logged, and the request is rejected.
.br
Readable by all; set by PBS.
.br
Format:
.I String in SELinux format
.br
Default: Unset
.IP server 8
The name of the server which is currently managing the job.
When the secondary server is running during failover, shows the name
of the primary server. After a job is moved to another server, either
via qmove or peer scheduling, shows the name of the new server.
.br
Readable by all; set by PBS.
.br
Format:
.I String
.br
Python type:
.I pbs.server
.br
Default: No default
.IP session_id 8
If the job is running, this is set to the session ID of the first
executing task.
.br
Readable by all; set by PBS.
.br
Format:
.I Integer
.br
Python type:
.I int
.br
Default: No default
.IP "Shell_Path_List" 8
One or more absolute paths to the program(s) to process the job's
script file.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String
.br
Syntax:
.RS 11
"[@][,[@]...]"
.br
Must be enclosed in double quotes if it contains commas.
.RE
.IP
Python type:
.I pbs.path_list
.br
Default: User's login shell on execution host
.IP stagein 8
The list of files to be staged in prior to job execution.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String
.br
Syntax:
.RS 11
"@:
[, @:, ...]"
.RE
.IP
Python type:
.I pbs.staging_list
.br
Default: No default
.IP stageout 8
The list of files to be staged out after job execution.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String
.br
Syntax:
.RS 11
"@:
[, @:, ...]"
.RE
.IP
Python type:
.I pbs.staging_list
.br
Default: No default
.IP Stageout_status 8
Status of stageout. If stageout succeeded, this is set to 1.
If stageout failed, this is
set to 0. Displayed only if set.
If stageout fails for any subjob of an array job, the value of
.I Stageout_status
is zero for the array job. Available only for finished jobs.
.br
Readable by all; set by PBS.
.br
Format:
.I Integer
.br
Python type:
.I int
.br
Default: No default
.IP stime 8
Timestamp; time when the job started execution. Changes when job is restarted.
.br
Readable by all; set by PBS.
.br
Format:
.I Integer
.br
Syntax: Timestamp.
.RS 11
Printed by qstat in human-readable format; output in hooks
as seconds since epoch.
.RE
.IP
Python type:
.I int
.br
Default: No default
.IP "Submit_arguments" 8
Job submission arguments given on the
.B qsub
command line. Available for all jobs.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default: No default
.IP "substate" 8
The substate of the job. The substate is used internally by PBS.
.br
Readable by all; set by PBS.
.br
Format:
.I Integer
.br
Python type:
.I int
.br
Default: No default
.IP sw_index 8
.B No longer used.
.IP "tobjob_ineligible" 8
Allows administrators to mark this job as ineligible to be a top job.
.br
When
.I True
, this job is not eligible to be the top job.
.br
Can be read and set by Manager.
.br
Format:
.I Boolean
.br
Python type:
.I bool
.br
Default:
.I False
.IP umask 8
The initial umask of the job is set to the value of this attribute when the
job is created. This may be changed by umask commands in the shell
initialization files such as .profile or .cshrc.
.br
Can be read and set by user, Operator, Manager.
.br
Format:
.I Decimal integer
.br
Python type:
.I int
.br
Default:
.I 077
.IP "User_List" 8
The list of users which determines the user name under which the job
is run on a given host. No length limit.
.br
When a job is to be executed, the server selects a user name from the
list according to the following ordered set of rules:
.RS
.IP 1. 3
Select the user name from the list for which the associated host name
matches the name of the server.
.IP 2. 3
Select the user name which has no associated host name; the wild card name.
.IP 3. 3
Use the value of
.I Job_Owner
as the user name.
.RE
.IP
Readable and settable by all.
.br
Format:
.I String
.br
Syntax:
.RS 11
"@ [,@...]"
.br
Must be enclosed in double quotes if it contains commas. May be up to
256 characters in length.
.RE
.IP
Python type:
.I pbs.user_list
.br
Default: Value of
.I Job_Owner
job attribute
.IP "Variable_List" 8
List of environment variables set in the job's execution environment.
See the qsub(1B) command.
.br
Readable and settable by all.
.br
Format:
.I String
.br
Syntax:
.RS 11
"= [,=...]"
.br
Must be enclosed in double quotes if it contains commas.
.RE
.IP
Python type:
.I pbs.pbs_resource
.br
Syntax:
.RS 11
Variable_List[""]=
.RE
.IP
Default: No default
.SH SEE ALSO
qsub(1B), qalter(1B), qhold(1B), qrls(1B), pbs_resources(7B)
================================================
FILE: doc/man1/pbs_login.1B
================================================
.\"
.\" Copyright (C) 1994-2021 Altair Engineering, Inc.
.\" For more information, contact Altair at www.altair.com.
.\"
.\" This file is part of both the OpenPBS software ("OpenPBS")
.\" and the PBS Professional ("PBS Pro") software.
.\"
.\" Open Source License Information:
.\"
.\" OpenPBS is free software. You can redistribute it and/or modify it under
.\" the terms of the GNU Affero General Public License as published by the
.\" Free Software Foundation, either version 3 of the License, or (at your
.\" option) any later version.
.\"
.\" OpenPBS is distributed in the hope that it will be useful, but WITHOUT
.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
.\" License for more details.
.\"
.\" You should have received a copy of the GNU Affero General Public License
.\" along with this program. If not, see .
.\"
.\" Commercial License Information:
.\"
.\" PBS Pro is commercially licensed software that shares a common core with
.\" the OpenPBS software. For a copy of the commercial license terms and
.\" conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
.\" Altair Legal Department.
.\"
.\" Altair's dual-license business model allows companies, individuals, and
.\" organizations to create proprietary derivative works of OpenPBS and
.\" distribute them - whether embedded or bundled with other software -
.\" under a commercial license agreement.
.\"
.\" Use of Altair's trademarks, including but not limited to "PBS™",
.\" "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
.\" subject to Altair's trademark licensing policies.
.\"
.TH pbs_login 1B "15 July 2020" Local "PBS Professional"
.SH NAME
.B pbs_login
- cache encrypted user password for authentication
.SH Synopsis
.B pbs_login
.br
.B pbs_login
-m
.br
echo |
.B pbs_login
-p
.SH Description
The
.B pbs_login
command encrypts the password and caches it locally where it can be
used by daemons for authorization.
Job submitters must run this command at each submission host each time
their password changes.
On Windows, the
.B win_postinstall
script calls
.B pbs_login
to store the PBS service account password so that the account user can
be authenticated by daemons.
.SH Required Privilege
Can be run by any user.
.SH Options to pbs_login
.IP "(no options)" 8
Queries user for password.
.IP "-m " 8
This option is intended to be used only by the PBS service account,
which is the account that is used to execute
.B pbs_mom
via the Service Control Manager on Windows. This option is used during installation
when invoked by the
.B win_postinstall
script, or by the administrator when the
PBS service account password has changed. Stores PBS service account
password in the mom_priv directory.
.IP "-p" 8
Caches user password on client host. Intended to be run by job
submitter at client host. Allows job submitter to be authenticated
by daemons.
================================================
FILE: doc/man1/pbs_module.7B
================================================
.\"
.\" Copyright (C) 1994-2021 Altair Engineering, Inc.
.\" For more information, contact Altair at www.altair.com.
.\"
.\" This file is part of both the OpenPBS software ("OpenPBS")
.\" and the PBS Professional ("PBS Pro") software.
.\"
.\" Open Source License Information:
.\"
.\" OpenPBS is free software. You can redistribute it and/or modify it under
.\" the terms of the GNU Affero General Public License as published by the
.\" Free Software Foundation, either version 3 of the License, or (at your
.\" option) any later version.
.\"
.\" OpenPBS is distributed in the hope that it will be useful, but WITHOUT
.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
.\" License for more details.
.\"
.\" You should have received a copy of the GNU Affero General Public License
.\" along with this program. If not, see .
.\"
.\" Commercial License Information:
.\"
.\" PBS Pro is commercially licensed software that shares a common core with
.\" the OpenPBS software. For a copy of the commercial license terms and
.\" conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
.\" Altair Legal Department.
.\"
.\" Altair's dual-license business model allows companies, individuals, and
.\" organizations to create proprietary derivative works of OpenPBS and
.\" distribute them - whether embedded or bundled with other software -
.\" under a commercial license agreement.
.\"
.\" Use of Altair's trademarks, including but not limited to "PBS™",
.\" "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
.\" subject to Altair's trademark licensing policies.
.\"
.TH pbs_module 7B "6 April 2020" Local "PBS Professional"
.SH NAME
.B pbs_module
\- Python interface to PBS and PBS hook environment
.SH DESCRIPTION
The
.I pbs module
provides an interface to PBS and the hook environment.
The interface is made up of Python objects, which have attributes and
methods. You can operate on these objects using Python code.
.SH PBS MODULE OBJECTS
.IP pbs.acl
Represents a PBS ACL type.
.IP pbs.args
Represents a space-separated list of PBS arguments to commands like qsub, qdel.
.IP pbs.argv[]
Represents a list of argument strings to be passed to the program
.IP pbs.BadAttributeValueError
Raised when setting the attribute value of a pbs.* object to an invalid value.
.IP pbs.BadAttributeValueTypeError
Raised when setting the attribute value of a pbs.* object to an invalid value type.
.IP pbs.BadResourceValueError
Raised when setting the resource value of a pbs.* object to an invalid value.
.IP pbs.BadResourceValueTypeError
Raised when setting the resource value of a pbs.* object to an invalid value type.
.IP pbs.checkpoint
Represents a job's
.I Checkpoint
attribute.
.IP pbs.depend
Represents a job's
.I depend
attribute.
.IP pbs.duration
Represents a time interval.
.IP pbs.email_list
Represents the set of users to whom mail may be sent.
.IP pbs.env[]
Dictionary of environment variables.
.IP pbs.event
Represents a PBS event.
.IP pbs.EventIncompatibleError
Raised when referencing a non-existent attribute in pbs.event().
.IP pbs.EXECHOST_PERIODIC
The
.I exechost_periodic
event type.
.IP pbs.EXECHOST_STARTUP
The
.I exechost_startup
event type.
.IP pbs.EXECJOB_ATTACH
The
.I execjob_attach
event type.
.IP pbs.EXECJOB_BEGIN
The
.I execjob_begin
event type.
.IP pbs.EXECJOB_END
The
.I execjob_end
event type.
.IP pbs.EXECJOB_EPILOGUE
The
.I execjob_epilogue
event type.
.IP pbs.EXECJOB_LAUNCH
The
.I execjob_launch
event type.
.IP pbs.EXECJOB_PRETERM
The
.I execjob_preterm
event type.
.IP pbs.EXECJOB_PROLOGUE
The
.I execjob_prologue
event type.
.IP pbs.exec_host
Represents a job's
.I exec_host
attribute.
.IP pbs.exec_vnode
Represents a job's
.I exec_vnode
attribute.
.IP pbs.group_list
Represents a list of group names.
.IP pbs.hold_types
Represents a job's
.I Hold_Types
attribute.
.IP pbs.hook_config_filename
Contains path to hook's configuration file.
.IP pbs.job
Represents a PBS job.
.IP pbs.job_list[]
Represents a list of pbs.job objects.
.IP pbs.job_sort_formula
Represents the server's
.I job_sort_formula
attribute.
.IP pbs.JOB_STATE_BEGUN
Represents the job array state of having started.
.IP pbs.JOB_STATE_EXITING
Represents the job state of exiting.
.IP pbs.JOB_STATE_EXPIRED
Represents the subjob state of expiring.
.IP pbs.JOB_STATE_FINISHED
Represents the job state of finished.
.IP pbs.JOB_STATE_HELD
Represents the job state of held.
.IP pbs.JOB_STATE_MOVED
Represents the job state of moved.
.IP pbs.JOB_STATE_QUEUED
Represents the job state of queued.
.IP pbs.JOB_STATE_RUNNING
Represents the job state of running.
.IP pbs.JOB_STATE_SUSPEND
Represents the job state of suspended.
.IP pbs.JOB_STATE_SUSPEND_USERACTIVE
Represents the job state of suspended due to user activity.
.IP pbs.JOB_STATE_TRANSIT
Represents the job state of transiting.
.IP pbs.JOB_STATE_WAITING
Represents the job state of waiting.
.IP pbs.join_path
Represents a job's
.I Join_Path
attribute.
.IP pbs.keep_files
Represents a job's
.I Keep_Files
attribute.
.IP pbs.license_count
Represents a set of licensing-related counters.
.IP pbs.LOG_DEBUG
Log level 004.
.IP pbs.LOG_ERROR
Log level 004.
.IP pbs.LOG_WARNING
Log level 004.
.IP pbs.mail_points
Represents a job's
.I Mail_Points
attribute.
.IP pbs.MODIFYJOB
The
.I modifyjob
event type.
.IP pbs.MOVEJOB
The
.I movejob
event type.
.IP pbs.ND_BUSY
Represents
.I busy
vnode state.
.IP pbs.ND_DEFAULT_EXCL
Represents
.I default_excl sharing
vnode attribute value
.IP pbs.ND_DEFAULT_SHARED
Represents
.I default_shared sharing
vnode attribute value.
.IP pbs.ND_DOWN
Represents
.I down
vnode state
.IP pbs.ND_FORCE_EXCL
Represents
.I force_excl sharing
vnode attribute value.
.IP pbs.ND_FREE
Represents
.I free
vnode state.
.IP pbs.ND_GLOBUS
PBS no longer supports Globus. The Globus functionality has been
.B removed
from PBS.
Represents
.I globus
vnode
.I ntype.
.IP pbs.ND_IGNORE_EXCL
Represents
.I ignore_excl sharing
vnode attribute value.
.IP pbs.ND_JOBBUSY
Represents
.I job-busy
vnode state.
.IP pbs.ND_JOB_EXCLUSIVE
Represents
.I job-exclusive
vnode state.
.IP pbs.ND_OFFLINE
Represents
.I offline
vnode state.
.IP pbs.ND_PBS
Represents
.I pbs
vnode
.I ntype.
.IP pbs.ND_PROV
Represents
.I provisioning
vnode state.
.IP pbs.ND_RESV_EXCLUSIVE
Represents
.I resv-exclusive
vnode state.
.IP pbs.ND_STALE
Represents
.I stale
vnode state.
.IP pbs.ND_STATE_UNKNOWN
Represents
.I state-unknown, down
vnode state.
.IP pbs.ND_UNRESOLVABLE
Represents the
.I unresolvable
vnode state.
.IP pbs.ND_WAIT_PROV
Represents
.I wait-provisioning
vnode state.
.IP pbs.node_group_key
Represents the server or queue
.I node_group_key
attribute.
.IP pbs.path_list
Represents a list of pathnames.
.IP pbs.pbs_conf[]
Dictionary of entries in pbs.conf.
.IP pbs.pid
Represents the process ID of a process belonging to a job.
.IP pbs.place
Represents the
.I place
job submission specification.
.IP pbs.progname
Path of job shell or executable.
.IP pbs.QTYPE_EXECUTION
The
.I execution
queue type.
.IP pbs.QTYPE_ROUTE
The
.I route
queue type.
.IP pbs.queue
Represents a PBS queue.
.IP pbs.QUEUEJOB
The
.I queuejob
event type.
.IP pbs.range
Represents a range of numbers referring to array indices.
.IP pbs.resv
Represents a PBS reservation.
.IP pbs.RESVSUB
The
.I resvsub
event type.
.IP pbs.RESV_STATE_BEING_DELETED
Represents the reservation state RESV_BEING_DELETED.
.IP pbs.RESV_STATE_CONFIRMED
Represents the reservation state RESV_CONFIRMED.
.IP pbs.RESV_STATE_DEGRADED
Represents the reservation state RESV_DEGRADED.
.IP pbs.RESV_STATE_DELETED
Represents the reservation state RESV_DELETED.
.IP pbs.RESV_STATE_DELETING_JOBS
Represents the reservation state RESV_DELETING_JOBS.
.IP pbs.RESV_STATE_FINISHED
Represents the reservation state RESV_FINISHED.
.IP pbs.RESV_STATE_NONE
Represents the reservation state RESV_NONE.
.IP pbs.RESV_STATE_RUNNING
Represents the reservation state RESV_RUNNING.
.IP pbs.RESV_STATE_TIME_TO_RUN
Represents the reservation state RESV_TIME_TO_RUN.
.IP pbs.RESV_STATE_UNCONFIRMED
Represents the reservation state RESV_UNCONFIRMED.
.IP pbs.RESV_STATE_WAIT
Represents the reservation state RESV_WAIT.
.IP pbs.route_destinations
Represents a queue's
.I route_destinations
attribute.
.IP pbs.RUNJOB
The
.I runjob
event type.
.IP pbs.select
Represents the
.I select
job submission specification.
.IP pbs.server
Represents the local PBS server.
.IP pbs.size
Represents a PBS
.I size
type.
.IP pbs.software
Represents a site-dependent software specification resource.
.IP pbs.staging_list
Represents a list of file stagein or stageout parameters.
.IP pbs.state_count
Represents a set of job-related state counters.
.IP pbs.SV_STATE_ACTIVE
Represents the server state "Scheduling".
.IP pbs.SV_STATE_HOT
Represents the server state "Hot_Start".
.IP pbs.SV_STATE_IDLE
Represents the server state "Idle".
.IP pbs.SV_STATE_SHUTDEL
Represents the server state "Terminating, Delayed".
.IP pbs.SV_STATE_SHUTIMM
Represents the server state "Terminating".
.IP pbs.SV_STATE_SHUTSIG
Represents the server state "Terminating", when a signal has been caught.
.IP pbs.UnsetAttributeNameError
Raised when referencing a non-existent name of a pbs.* object.
.IP pbs.UnsetResourceNameError
Raised when referencing a non-existent name of a pbs.* object.
.IP pbs.user_list
Represents a list of user names.
.IP pbs.vchunk
Represents a resource chunk assigned to a job.
.IP pbs.version
Represents PBS version information.
.IP pbs.vnode
Represents a PBS vnode.
.IP pbs.vnode_list[]
Represents a list of PBS vnodes.
.IP SystemExit
Raised when accepting or rejecting an action.
.LP
.SH PBS MODULE GLOBAL METHODS
.IP pbs.acl("[+|-]][,...]")
Creates an object representing a PBS ACL, using the given string parameter.
Instantiation of these objects requires a formatted input string.
.IP pbs.args("")
where
.I
are space-separated arguments to a command such as
.B qsub
or
.B qdel.
Creates an object representing the arguments to the command.
Example:
.RS 10
pbs.args("-Wsuppress_email=N -r y")
.RE
.IP
Instantiation of these objects requires a formatted input string.
.IP pbs.checkpoint("")
where
.I
must be one of "n", "s", "c", "c=mmm", "w", or "w=mmm"
Creates an object representing the job's
.I Checkpoint
attribute, using the given string.
Instantiation of these objects requires a formatted input string.
.IP pbs.depend("")
.I
must be of format ":[,...]", or "on:", and
where
.I
is one of "after", "afterok", "afterany", "before", "beforeok",
and "beforenotok".
Creates a PBS dependency specification object representing the job's
.I depend
attribute, using the given
.I .
Instantiation of these objects requires a formatted input string.
.IP pbs.duration("[[hours:]minutes:]seconds[.milliseconds]")
Creates a time specification duration instance, returning the
equivalent number of seconds from the given time string. Represents an
interval or elapsed time in number of seconds. Duration objects can be
specified using either a time or an integer. See the
"pbs.duration()" creation method.
.IP pbs.duration()
Creates an integer duration instance using the specified number of
seconds. A
.I pbs.duration
instance can be operated on by any of the
Python
.I int
functions. When performing arithmetic operations on a
.I pbs.duration
type, ensure the resulting value is a
.I pbs.duration()
type, before assigning to a job member that expects such a type.
.IP pbs.email_list("[,...]")
Creates an object representing a mail list.
Instantiation of these objects requires a formatted input string.
.IP pbs.exec_host("host/N[*C][+...]")
Create an object representing the
.I exec_host
job attribute, using the
given host and resource specification.
Instantiation of these objects requires a formatted input string.
.IP pbs.exec_vnode("[+...]")
.I
is ()
Creates an object representing the
.I exec_vnode
job attribute, using the
given vnode and resource specification. When the
.B qrun -H
command is used, or when the scheduler runs a job, the
.I pbs.job.exec_vnode
object contains the vnode specification for the job. Instantiation of these
objects requires a formatted input string.
.br
Example:
.br
pbs.exec_vnode("(vnodeA:ncpus=N:mem=X)+(nodeB:ncpus=P:mem=Y+nodeC:mem=Z)")
.br
This object is managed and accessed via the
.I str()
or
.I repr()
functions.
.br
Example:
.br
Python> ev = pbs.server().job("10").exec_vnode
.br
Python> str(ev)
.br
"(vnodeA:ncpus=2:mem=200m)+(vnodeB:ncpus=5:mem=1g)"
.IP pbs.get_hook_config_file()
Returns the path to the hook's configuration file, or None if there is
no configuration file. For example:
.RS 10
configfilepath = pbs.get_hook_config_file()
.RE
.IP pbs.get_local_nodename()
This returns a Python str whose value is the name of the local natural vnode.
If you want to refer to the vnode object representing the current
host, you can pass this vnode name as the key to
.I pbs.event().vnode_list[].
For example:
.RS 10
Vn = pbs.event().vnode_list[pbs.get_local_nodename()]
.RE
.IP pbs.get_pbs_conf()
This method returns a dictionary of values which represent entries in
the pbs.conf file. The method reads the file on the host where a hook
runs, so pre-execution event hooks get the entries on the server host,
and execution event hooks get the entries on the execution host where
the hook runs. The method reads /etc/pbs.conf on the host where
pbs_python runs.
Example:
.RS 10
pbs_conf = pbs.get_pbs_conf()
.br
pbs.logmsg(pbs.LOG_DEBUG, "pbs home is " % (pbs_conf['PBS_HOME]))
.RE
.IP
If you HUP pbs_mom (Linux/UNIX), pbs.get_pbs_conf returns the reloaded
contents of the pbs.conf file.
.IP pbs.group_list("[@][,[@]...]")
Creates an object representing a PBS group list.
To use a group list object:
.br
pbs.job.group_list = pbs.group_list(....)
.br
Instantiation of these objects requires a formatted input string.
.IP pbs.hold_types("")
where
.I
is one of "u", "o", "s", or "n".
Creates an object representing the
.I Hold_Types
job attribute.
Instantiation of these objects requires a formatted input string.
.IP pbs.job_sort_formula("")
where
.I
is a string containing a math formula.
Creates an object representing the
.I job_sort_formula
server attribute.
Instantiation of these objects requires a formatted input string.
.IP pbs.join_path({"oe"|"eo"|"n"})
Creates an object representing the
.I Join_Path
job attribute.
Instantiation of these objects requires a formatted input string.
.IP pbs.keep_files("")
where
.I
is one of "o", "e", "oe", "eo".
Creates an object representing the
.I Keep_Files
job attribute.
Instantiation of these objects requires a formatted input string.
.IP pbs.license_count("Avail_Global:Avail_Local:Used:High_Use:")
Instantiates an object representing a
.I license_count
attribute.
Instantiation of these objects requires a formatted input string.
.IP pbs.logjobmsg(job_ID,message)
where
.I job_ID
must be an existing or previously existing job ID and where
.I message
is an arbitrary string. This puts a custom string in the PBS Server
log. The
.B tracejob
command can be used to print out the job-related
messages logged by a hook script. Messages are logged at log event
class
.I pbs.LOG_DEBUG.
.IP pbs.logmsg(log_event_class,message)
where
.I message
is an arbitrary string, and where
.I log_event_class
can be one of the message log event class constants:
.br
pbs.LOG_WARNING
.br
pbs.LOG_ERROR
.br
pbs.LOG_DEBUG
.br
This puts a custom string in the daemon log.
.IP pbs.mail_points("")
where
.I
is "a", "b", and/or "e", or "n".
Creates an object representing a
.I Mail_Points
attribute.
Instantiation of these objects requires a formatted input string.
.IP pbs.node_group_key("")
Creates an object representing the resource to be used for node
grouping, using the specified resource.
.IP pbs.path_list("[@][,@...]")
Creates an object representing a PBS pathname list.
To use a path list object:
.br
pbs.job.Shell_Path_List = pbs.path_list(....)
.br
Instantiation of these objects requires a formatted input string.
.IP pbs.env()
Creates an empty environment variable list. For example, to create
an empty environment variable list:
.RS 10
pbs.event().env = pbs.pbs_env()
.RE
.IP pbs.place("[arrangement]:[sharing]:[group]")
.I arrangement
can be "pack", "scatter", "free", "vscatter"
.br
.I sharing
can be "shared", "excl", "exclhost"
.br
.I group
can be of the form "group="
.br
.I [arrangement], [sharing],
and
.I [group]
can be given in any order or combination.
.br
Creates a place object representing the job's place specification.
Instantiation of these objects requires a formatted input string.
.br
Example:
.br
pl = pbs.place("pack:excl")
.br
s = repr(pl) (or s = `pl`)
.br
letter = pl[0] (assigns 'p' to letter)
.br
s = s + ":group=host" (append to string)
br
pl = pbs.place(s) (update original pl)
.IP pbs.range("-:")
Creates a PBS object representing a range of values.
.br
Example:
.br
pbs.range("1-30:3")
.br
Instantiation of these objects requires a formatted input string.
.IP pbs.reboot([])
This stops hook execution, so that remaining lines in the hook script
are not executed, and starts the tasks that would normally begin after
the hook is finished, such as flagging the current host to be
rebooted. The MoM logs show the following:
.RS 10
requested for host to be rebooted
.RE
.IP
We recommend that before calling pbs.reboot(), you set any vnodes
managed by this MoM offline, and requeue the current job, if this hook
is not an exechost_periodic hook. For example:
.RS 10
for v in pbs.event().vnode_list.keys():
.br
\ \ \ pbs.event().vnode_list[v].state = pbs.ND_OFFLINE
.br
\ \ \ pbs.event().vnode_list[v].comment = "MoM host rebooting"
.br
pbs.event().job.rerun()
.br
pbs.reboot()
.RE
.IP
The effect of the call to pbs.reboot() is not instantaneous. The
reboot happens after the hook executes, and after any of the other
actions such as pbs.event().job.rerun(), pbs.event().delete(), and
pbs.event().vnode_list[] take effect.
A hook with its user attribute set to pbsuser cannot successfully
invoke pbs.reboot(), even if the owner is a PBS Manager or Operator.
If this is attempted, the host is not rebooted, and the following
message appears at log event class PBSEVENT_DEBUG2 in the MoM logs:
.RS 10
; Not allowed to issue reboot if run as user.
.RE
.IP
The is an optional argument. It is a Python str which is
executed instead of the reboot command that is the default for the
system. For example:
.RS 10
pbs.reboot("/usr/local/bin/my_reboot -s 10 -c 'going down in 10'")
.RE
.IP
The specified is executed in a shell on Linux/UNIX or via cmd on Windows.
.IP pbs.route_destinations("[,,...]")
where
.I
is queue_name[@server_host[:port]]
.br
Creates an object that represents a
.I route_destinations
routing queue attribute.
Instantiation of these objects requires a formatted input string.
.IP pbs.select("[N:]res=val[:res=val][+[N:]res=val[:res=val]...]")
Creates a
.I select
object representing the job's select specification.
Instantiation of these objects requires a formatted input string.
Example:
.br
sel = pbs.select("2:ncpus=1:mem=5gb+3:ncpus=2:mem=5gb")
.br
s = repr(sel) (or s = `sel`)
.br
letter = s[3] (assigns 'c' to letter)
.br
s = s + "+5:scratch=10gb" (append to string)
.br
sel = pbs.select(s) (reset the value of sel)
.br
.IP pbs.size()
Creates a PBS
.I size
object using the given integer value, storing the
value as the number of bytes. Size objects can be specified using
either an integer or a string. See the "pbs.size("")"
creation method.
.IP pbs.size("")
Creates a PBS
.I size
object out of the given string specification.
The size of a word
is the word size on the execution host.
.I Size
objects can be specified
using either an integer or a string. To operate on
.I pbs.size
instances, use the "+" and "-" operators. To compare
.I pbs.size
instances, use the "==", "!=", ">", "<", ">=", and "<=" operators.
Example: the sizes are normalized to the smaller of the 2 suffixes. In
this case, "10gb" becomes "10240mb" and is added to "10mb":
.br
sz = pbs.size("10gb")
.br
sz = sz + 10mb
.br
10250mb
.br
Example: the following returns
.I True
because
.I sz
is greater than 100 bytes:
.br
if sz > 100:
.br
\ \ \ \ gt100 = True
.br
.IP pbs.software("")
Creates an object representing a site-dependent software resource.
Instantiation of these objects requires a formatted input string.
.IP pbs.staging_list("[,,...]")
where
.I
is @:
Creates an object representing a job file staging parameters list.
To use a staging list object:
.br
pbs.job.stagein = pbs.staging_list(....)
.br
Instantiation of these objects requires a formatted input string.
.IP pbs.state_count("Transit:Queued:Held:Running:Exiting:Begun:)
Instantiates an object representing a
.I state_count
attribute.
Instantiation of these objects requires a formatted input string.
.IP pbs.user_list("[@][,@...]")
Creates an object representing a PBS user list.
To use a user list object:
.br
pbs.job.User_List = pbs.user_list(....)
.br
Instantiation of these objects requires a formatted input string.
.IP pbs.version("")
Creates an object representing the PBS version string.
Instantiation of these objects requires a formatted input string.
.SH ATTRIBUTES AND RESOURCES
.br
Hooks can read Server, Queue, or reservation resources.
Hooks can read vnode or job attributes and resources. Hooks can modify
.IP
The resources requested by a job
.br
The resources used by a job
.br
The attributes of a job
.br
The resource arguments to pbs_rsub
.br
Vnode attributes and resources
.br
The shell or program to be executed in a job
.br
The arguments to the shell or program to be executed in a job
.br
The environment of the job
.LP
Custom and built-in PBS resources are represented in Python dictionaries,
where the resource names are the dictionary keys. Built-in resources are
listed in pbs_resources(7B). You reference a resource through a vnode,
the Server, the event that triggered the hook, or the current job, for example:
.IP
pbs.server().resources_available["< resource name>"]
.br
pbs.event().job.Resource_List["< resource name>"]
.br
pbs.event().vnode_list[].resources_available["< resource name >"]
.LP
The resource name must be in quotes.
Example: Get the number of CPUs:
.IP
ncpus = Resource_List["ncpus"]
.LP
An instance R of a job resource can be set as follows:
.IP
R[""] =
.LP
For example:
.IP
pbs.event().job().Resource_List["mem"] = 8gb
.LP
.SH EXCEPTIONS
.IP pbs.BadAttributeValueError
Raised when setting the attribute value of a pbs.* object to an invalid value.
.IP pbs.BadAttributeValueTypeError
Raised when setting the attribute value of a pbs.* object to an invalid value type.
.IP pbs.BadResourceValueError
Raised when setting the resource value of a pbs.* object to an invalid value.
.IP pbs.BadResourceValueTypeError
Raised when setting the resource value of a pbs.* object to an invalid value type.
.IP pbs.EventIncompatibleError
Raised when referencing a non-existent attribute in pbs.event().
.IP pbs.UnsetAttributeNameError
Raised when referencing a non-existent name of an attribute.
.IP pbs.UnsetResourceNameError
Raised when referencing a non-existent name of a resource.
.IP SystemExit
Raised when accepting or rejecting an action.
.LP
If a hook encounters an unhandled exception:
.IP
PBS rejects the corresponding action, and an error message is printed
to stderr.
.br
A message is printed to the daemon log.
.LP
.SH SEE ALSO
pbs_hook_attributes(7B), pbs_resources(7B),
qmgr(1B)
================================================
FILE: doc/man1/pbs_node_attributes.7B
================================================
.\"
.\" Copyright (C) 1994-2021 Altair Engineering, Inc.
.\" For more information, contact Altair at www.altair.com.
.\"
.\" This file is part of both the OpenPBS software ("OpenPBS")
.\" and the PBS Professional ("PBS Pro") software.
.\"
.\" Open Source License Information:
.\"
.\" OpenPBS is free software. You can redistribute it and/or modify it under
.\" the terms of the GNU Affero General Public License as published by the
.\" Free Software Foundation, either version 3 of the License, or (at your
.\" option) any later version.
.\"
.\" OpenPBS is distributed in the hope that it will be useful, but WITHOUT
.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
.\" License for more details.
.\"
.\" You should have received a copy of the GNU Affero General Public License
.\" along with this program. If not, see .
.\"
.\" Commercial License Information:
.\"
.\" PBS Pro is commercially licensed software that shares a common core with
.\" the OpenPBS software. For a copy of the commercial license terms and
.\" conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
.\" Altair Legal Department.
.\"
.\" Altair's dual-license business model allows companies, individuals, and
.\" organizations to create proprietary derivative works of OpenPBS and
.\" distribute them - whether embedded or bundled with other software -
.\" under a commercial license agreement.
.\"
.\" Use of Altair's trademarks, including but not limited to "PBS™",
.\" "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
.\" subject to Altair's trademark licensing policies.
.\"
.TH pbs_node_attributes 7B "17 July 2020" Local "PBS Professional"
.SH NAME
.B pbs_node_attributes
\- attributes of PBS vnodes
.SH DESCRIPTION
Vnodes have the following attributes:
.IP comment 8
Information about this vnode. This attribute may be set by the
manager to any string to inform users of any information relating to
the node. If this attribute is not explicitly set, the PBS server will
use the attribute to pass information about the node status,
specifically why the node is down. If the attribute is explicitly set
by the manager, it will not be modified by the server.
.br
Readable by all; settable by Manager.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default: No default
.IP current_aoe 8
The AOE currently instantiated on this vnode. Cannot be set on
server's host.
.br
Readable by all; settable by Manager.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default:
.I Unset
.IP current_eoe 8
Current value of eoe on this vnode. We do not recommend setting this
attribute manually.
.br
Readable by all; settable by Manager (not recommended).
.br
Format:
.I String
.br
Python type:
.I str
.br
Default:
.I Unset
.IP in_multivnode_host 8
Specifies whether a vnode is part of a multi-vnoded host. Used
internally. Do not set.
.br
Readable and settable by Manager (not recommended).
.br
Format:
.I Integer
.br
Python type:
.I int
.br
Behavior:
.RS
.IP 1 3
Part of a multi-vnode host
.IP Unset 3
Not part of a multi-vnode host
.RE
.IP
Default:
.I Unset
.IP jobs 8
List of jobs running on this vnode.
.br
Readable by all; set by PBS.
.br
Format:
.I String
.br
Syntax:
.I /, ...
.br
Python type:
.I int
.br
.IP last_state_change_time 8
Records the most recent time that this node changed state.
.br
Format:
.RS 11
Timestamp
.br
Printed by qstat in human-readable Date format.
.br
Output in hooks as seconds since epoch.
.RE
.IP
.IP last_used_time 8
Records the most recent time that this node finished being used for a
job or reservation. Set at creation or reboot time. Updated when
node is released early from a running job. Reset when node is ramped
up.
.br
Format:
.RS 11
Timestamp
.br
Printed by qstat in human-readable Date format.
.br
Output in hooks as seconds since epoch.
.RE
.IP license 8
.br
Indicates whether this vnode is licensed.
.br
Readable by all; set by PBS.
.br
Format:
.I Character
.br
Python type:
.I str
.br
Valid values:
.RS
.IP l 3
This vnode is licensed.
.RE
.IP
Default:
.I Unset
.IP license_info 8
Number of licenses assigned to this vnode.
.br
Readable by all; set by PBS.
.br
Format:
.I Integer
.br
Python type:
.I int
.br
Default:
.I Unset
.IP lictype 8
No longer used.
.IP maintenance_jobs 8
List of jobs that were running on this vnode, but have been suspended
via the
.I admin-suspend
signal to qsig.
.br
Readable by Manager; set by PBS.
.br
Format:
.I string_array
.br
Python type:
.I str
.br
Default: No default
.IP Mom
Hostname of host on which MoM daemon runs.
.br
Readable by all. Can be explicitly set by Manager only via
.B qmgr,
and only at vnode creation. The server can set this to the FQDN of the host
on which MoM runs, if the vnode name is the same as the hostname.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default: Value of
.I vnode
resource (vnode name)
.IP name 8
The name of this vnode.
.br
Readable by all; settable by Manager.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default: No default
.IP no_multinode_jobs 8
Controls whether jobs which request more than one chunk are allowed to execute
on this vnode. Used for cycle harvesting.
.br
Readable by all; settable by Manager.
.br
Format:
.I Boolean
.br
Python type:
.I bool
.br
Behavior:
.RS
.IP True 3
Jobs requesting more than one chunk are not allowed to execute on this vnode.
.RE
.IP
Default:
.I False
.IP ntype 8
The type of this vnode.
.br
Readable by all; settable by Manager.
.br
Format:
.I String
.br
Valid values:
.RS
.IP PBS 3
Normal vnode
.br
Python type:
.I pbs.ND_PBS
.br
Default:
.I PBS
.RE
.IP partition 8
Name of partition to which this vnode is assigned. A vnode can be
assigned to at most one partition.
.br
Readable by all; settable by Operator and Manager.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default: No default
.IP pbs_version 8
The version of PBS for this MoM.
.br
Readable by all; set by PBS.
.br
Format:
.I String
.br
Python type:
.I str
.br
Default: No default
.IP pcpus 8
.B Deprecated.
The number of physical CPUs on this vnode. This is set to the number
of CPUs available when MoM starts. For a multiple-vnode MoM, only the
natural vnode has
.I pcpus.
.br
Readable by all; set by PBS.
.br
Format:
.I Integer
.br
Python type:
.I int
.br
Default:
.I Number of CPUs on startup
.IP pnames
The list of resources being used for placement sets.
Not used for scheduling; advisory only.
.br
Readable by all; settable by Manager.
.br
Format:
.I String
.br
Syntax:
.I Comma-separated list of resource names
.br
Python type:
.I str
.br
Default: No default
.IP Port 8
Port number on which MoM daemon listens.
.br
Can be explicitly set only via
.B qmgr,
and only at vnode creation.
Readable and settable by Operator and Manager.
.br
Format:
.I Integer
.br
Python type:
.I int
.br
Default:
.I 15002
.IP poweroff_eligible 8
Enables powering this vnode up and down by PBS.
.br
Readable by all; settable by Manager.
.br
Format:
.I Boolean
.br
Python type:
.I bool
.br
Values:
.RS 11
.IP True
PBS can power this vnode on and off.
.IP False
PBS cannot power this vnode on and off.
.RE
.IP
Default:
.I False
.IP power_provisioning 8
Enables use of power profiles by this vnode.
.br
Readable by all; settable by Manager.
.br
Format:
.I Boolean
.br
Python type:
.I bool
.br
Behavior:
.RS
.IP True 3
Power provisioning is enabled at this vnode.
.IP False 3
Power provisioning is disabled at this vnode.
.RE
.IP
Default:
.I False
.IP Priority 8
The priority of this vnode compared with other vnodes.
.br
Readable by all; settable by Operator and Manager.
.br
Format:
.I Integer
.br
Python type:
.I int
.br
Valid values:
.I -1024 to +1023
.br
Default: No default
.IP provision_enable
Controls whether this vnode can be provisioned.
Cannot be set on server's host.
.br
Format:
.I Boolean
.br
Python type:
.I bool
.br
Behavior:
.RS
.IP True 3
This vnode may be provisioned.
.IP False 3
This vnode may not be provisioned.
.RE
.IP
Default:
.I False
.IP queue 8
.B Deprecated.
The queue with which this vnode is associated. Each vnode can be
associated with at most 1 queue. Queues can be associated with
multiple vnodes. Any jobs in a queue that has associated vnodes can
run only on those vnodes. If a vnode has an associated queue, only
jobs in that queue can run on that vnode.
.br
Readable by all; settable by Manager.
.br
Format:
.I String
.br
Python type:
.I pbs.queue
.br
Behavior:
.RS
.IP "" 3
Only jobs in specified queue may run on this vnode.
.IP Unset 3
Any job in any queue that does not have associated vnodes can run on this vnode.
.RE
.IP
Default: No default
.IP resources_assigned 8
The total amount of each resource allocated to jobs and started
reservations running on this vnode.
.br
Readable by all; set by PBS.
.br
Format: String
.br
Syntax:
.RS 11
.I resources_assigned.=[,resources_assigned.=
.RE
.IP
Python type:
.I pbs.pbs_resource
.br
Syntax:
.RS 11
resources_assigned[''] = < val>
.br
where
.I resource name
is any built-in or custom resource
.RE
.IP
Default: No default
.IP resources_available 8
The list of resource and amounts available on this vnode. If not
explicitly set, the amount shown is that reported by the pbs_mom
running on this vnode. If a resource value is explicitly set, that
value is retained across restarts.
.br
Readable by all; settable by Operator and Manager.
.br
Format:
.I String
.br
Syntax:
.RS 11
.I resources_available.=,
.I resources_available. = , ...
.RE
.IP
Python type:
.I pbs.pbs_resource
.br
Syntax:
.RS 11
resources_available[''] = < val>
.br
where
.I resource name
is any built-in or custom resource
.RE
.IP
Default: No default
.IP resv 8
List of advance and standing reservations pending on this vnode.
.br
Readable by all; set by PBS.
.br
Format:
.I String
.br
Syntax:
.RS 11
.I [, , ...]
.br
(Comma-separated list of reservation IDs)
.RE
.IP
Python type:
.I str
.br
Example: resv = R142.examplemachine, R143.examplemachine
.br
Default: No default
.IP resv_enable 8
Controls whether the vnode can be used for advance and standing
reservations. Reservations are incompatible with cycle harvesting.
.br
Readable by all; settable by Manger.
.br
Format:
.I Boolean
.br
Python type:
.I bool
.br
Behavior:
.RS 11
When set to
.I True,
this vnode can be used for reservations. Existing reservations are
honored when this attribute is changed from
.I True
to
.I False.
.RE
.IP
Default:
.I True
.IP sharing 8
Specifies whether more than one job at a time can use the resources of
the vnode or the vnode's host. Either (1) the vnode or host is
allocated exclusively to one job, or (2) the vnode's or host's unused
resources are available to other jobs.
.br
Can be set using
.I pbs_mom -s insert
only.
.br
Readable by all; settable by Operator and Manager.
.br
Format:
.I String
.br
Python type:
.I int
.br
Valid values:
.RS
.IP default_shared 3
Defaults to
.I shared
.br
Python type:
.I pbs.ND_DEFAULT_SHARED
.IP default_excl 3
Defaults to
.I exclusive
.br
Python type:
.I pbs.ND_DEFAULT_EXCL
.IP default_exclhost 3
Entire host is assigned to the job unless the job's sharing request
specifies otherwise
.br
Python type:
.I pbs.ND_DEFAULT_EXCLHOST
.IP ignore_excl 3
Overrides any job
.I place=excl
setting
.br
Python type:
.I pbs.ND_IGNORE_EXCL
.IP force_excl 3
Overrides any job
.I place=shared
setting
.br
Python type:
.I pbs.ND_FORCE_EXCL
.IP force_exclhost 3
The entire host is assigned to the job, regardless of the job's sharing request
.br
Python type:
.I pbs.ND_FORCE_EXCLHOST
.IP Unset 3
Defaults to
.I shared
.RE
.IP
Behavior of a vnode or host is determined by a combination of the
.I sharing
attribute and a job's placement directive, defined as follows:
.nf
| Vnode Behavior | Host Behavior
| when place= | when place=
| |
sharing value | unset shared excl |exclhost !=exclhost
----------------------------------------------------------------
not set | shared shared excl | excl depends on place
default_shared | shared shared excl | excl depends on place
default_excl | excl shared excl | excl depends on place
default_exclhost | excl shared excl | excl depends on place
ignore_excl | shared shared shared| shared not exclusive
force_excl | excl excl excl | excl not exclusive
force_exclhost | excl excl excl | excl excl
.fi
Example: : sharing=force_excl
.br
Default value:
.I default_shared
.IP state 8
Shows or sets the state of the vnode.
.br
Readable by all. All states are set by PBS; Operator and Manager
can set
.I state
to
.I offline.
.br
Format:
.I String
.br
Syntax:
.I [, , ...]
.br
(Comma-separated list of one or more states)
.br
Python type:
.I int
.br
Valid values:
.RS
.IP busy 3
Vnode is reporting load average greater than allowed max.
Can combine with
.I offline
.IP down 3
Node is not responding to queries from the server.
Cannot be combined with
.I free, provisioning.
.IP free 3
Vnode is up and capable of accepting additional job(s).
Cannot be combined with other states.
.IP job-busy 3
All CPUs on the vnode are allocated to jobs.
Can combine with:
.I offline, resv_exclusive
.IP job-exclusive 3
Entire vnode is exclusively allocated to one job at the job's request.
Can combine:
.I offline, resv_exclusive
.IP offline 3
Jobs are not to be assigned to this vnode.
Can combine:
.I busy, job-busy, job-exclusive, resv_exclusive
.IP provisioning 3
Vnode is in being provisioned. Cannot be combined with other states.
.IP resv-exclusive 3
Running reservation has requested exclusive use of vnode. Can combine
with:
.I job-exclusive, offline
.IP stale 3
Vnode was previously reported to server, but is no longer reported to
server. Cannot combine with
.I free, provisioning.
.IP state-unknown 3
The server has never been able to contact the vnode. Either MoM is
not running on the vnode, the vnode hardware is down, or there is a
network problem.
.IP unresolvable 3
The server cannot resolve the name of the vnode.
.IP wait-provisioning 3
Vnode needs to be provisioned, but can't: limit reached
for concurrently provisioning vnodes. See the
.I max_concurrent_provision
server attribute.
.RE
.IP
Default: No default
.IP topology_info
Contains information intended to be used in hooks.
.br
Visible in and usable by hooks only.
Invisible to Manager, Operator, User.
.br
Format:
.I XML String
.br
Python type:
.I str
.br
Default value:
.I Unset
.IP vnode_pool 8
Cray only. Allows just one MoM, instead of all, to report inventory
upon startup, allowing faster startup and less network communication
between server and non-reporting MoMs. On each Cray, all MoMs must
have same setting for this attribute. Can be set only at vnode
creation; valid only on login nodes running a MoM. Not supported on
non-Cray machines.
.br
Readable by all; settable by Manager.
.br
Format:
.I Integer
.br
Python type:
.I int
.br
Behavior:
.RS
.IP ">0" 3
Only one MoM per Cray reports inventory.
.IP Unset 3
Each MoM reports inventory separately.
.RE
.IP
Default:
.I 0
(Unset)
.SH SEE ALSO
qmgr(1B)
================================================
FILE: doc/man1/pbs_professional.7B
================================================
.\"
.\" Copyright (C) 1994-2021 Altair Engineering, Inc.
.\" For more information, contact Altair at www.altair.com.
.\"
.\" This file is part of both the OpenPBS software ("OpenPBS")
.\" and the PBS Professional ("PBS Pro") software.
.\"
.\" Open Source License Information:
.\"
.\" OpenPBS is free software. You can redistribute it and/or modify it under
.\" the terms of the GNU Affero General Public License as published by the
.\" Free Software Foundation, either version 3 of the License, or (at your
.\" option) any later version.
.\"
.\" OpenPBS is distributed in the hope that it will be useful, but WITHOUT
.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
.\" License for more details.
.\"
.\" You should have received a copy of the GNU Affero General Public License
.\" along with this program. If not, see .
.\"
.\" Commercial License Information:
.\"
.\" PBS Pro is commercially licensed software that shares a common core with
.\" the OpenPBS software. For a copy of the commercial license terms and
.\" conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
.\" Altair Legal Department.
.\"
.\" Altair's dual-license business model allows companies, individuals, and
.\" organizations to create proprietary derivative works of OpenPBS and
.\" distribute them - whether embedded or bundled with other software -
.\" under a commercial license agreement.
.\"
.\" Use of Altair's trademarks, including but not limited to "PBS™",
.\" "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
.\" subject to Altair's trademark licensing policies.
.\"
.TH pbs_professional 7B "6 May 2020" Local "PBS Professional"
.SH NAME
.B PBS Professional
\- The PBS Professional workload management system
.SH DESCRIPTION
PBS Professional is an HPC workload manager and job scheduler.
PBS schedules jobs onto systems with the required resources, according
to specified policy. PBS runs on most major platforms. See
.B www.pbsworks.com
and
.B https://pbspro.atlassian.net/wiki/spaces/PBSPro/overview.
.B Primary Commands
.br
.IP "init.d/pbs" 8
Starts, stops or restarts PBS daemons on the local machine.
This command is typically placed in /etc/init.d so that
PBS starts up automatically. See the
.B pbs.8B
man page.
.br
.IP "qmgr" 8
Administrator's interface for configuring and managing PBS. See the
.B qmgr.8B
man page.
.IP "qstat" 8
Administrator's and job submitter's tool for checking server, queue, and job status.
See the
.B qstat.1B
man page.
.IP "qsub" 8
Job submitter's tool for submitting jobs to PBS. See the
.B qsub.1B
man page.
.LP
.SH SEE ALSO
.br
pbs_mom(8B), pbs_server(8B), pbs_sched(8B), pbs_comm(8B)
================================================
FILE: doc/man1/pbs_python.1B
================================================
.\"
.\" Copyright (C) 1994-2021 Altair Engineering, Inc.
.\" For more information, contact Altair at www.altair.com.
.\"
.\" This file is part of both the OpenPBS software ("OpenPBS")
.\" and the PBS Professional ("PBS Pro") software.
.\"
.\" Open Source License Information:
.\"
.\" OpenPBS is free software. You can redistribute it and/or modify it under
.\" the terms of the GNU Affero General Public License as published by the
.\" Free Software Foundation, either version 3 of the License, or (at your
.\" option) any later version.
.\"
.\" OpenPBS is distributed in the hope that it will be useful, but WITHOUT
.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
.\" License for more details.
.\"
.\" You should have received a copy of the GNU Affero General Public License
.\" along with this program. If not, see .
.\"
.\" Commercial License Information:
.\"
.\" PBS Pro is commercially licensed software that shares a common core with
.\" the OpenPBS software. For a copy of the commercial license terms and
.\" conditions, go to: (http://www.pbspro.com/agreement.html) or contact the
.\" Altair Legal Department.
.\"
.\" Altair's dual-license business model allows companies, individuals, and
.\" organizations to create proprietary derivative works of OpenPBS and
.\" distribute them - whether embedded or bundled with other software -
.\" under a commercial license agreement.
.\"
.\" Use of Altair's trademarks, including but not limited to "PBS™",
.\" "OpenPBS®", "PBS Professional®", and "PBS Pro™" and Altair's logos is
.\" subject to Altair's trademark licensing policies.
.\"
.TH pbs_python 1B "6 May 2020" Local "PBS Professional"
.SH NAME
.B pbs_python
\- Python interpreter for debugging a hook script from the command line
.SH SYNOPSIS
.B pbs_python
--hook [-e ] [-i ]
.RS 11
[-L